{"version":3,"file":"308.74cfff81d857477b13e3.js","mappings":"sVAEA,MAAMA,EAAc,CAChBC,QAAS,YACTC,QAAS,YACTC,MAAO,WAgBI,SAASC,EACpBC,EACAC,EACAC,GAEA,OAAQC,IACJ,MAAOC,EAAYC,IAAiBC,EAAAA,EAAAA,UAAS,IACvCC,GAAYC,EAAAA,EAAAA,QAAO,IAEzBC,EAAAA,EAAAA,YAAU,IACC,KACHJ,EAAc,GAAG,GAEtB,IAYH,MAAMK,EAAeC,IACjBN,EACK,GAAEH,IACCS,EAAWhB,EAAYE,QAAUF,EAAYG,UAMjC,IAApBK,EAAMS,WACFC,YAAW,KAnBfR,EAAc,IACdE,EAAUO,QAAU,CAmBI,GACjBX,EAAMY,cAAgB,IAAK,EAiBtCC,eAAeC,EAAcC,GAjCzBb,EAAe,GAAEH,IAAcP,EAAYC,WAC3CW,EAAUO,QAAUK,KAAKC,OAkB7B,SAAoBT,GAChB,MAAMU,EAAkBF,KAAKC,MAAQb,EAAUO,QACzCQ,EAAqBnB,EAAMmB,oBAAsB,IAGnDD,GAAmBC,EACnBZ,EAAYC,GAEZE,YAAW,KACPH,EAAYC,EAAS,GACtBW,EAAqBD,EAEhC,CAKIE,OADmBtB,EAAQiB,GAE/B,CAEA,OACIM,EAAAA,cAAA,QAAMC,UAAWrB,GACboB,EAAAA,cAACxB,EAAgB0B,EAAA,CACbzB,QAAUiB,GAAWD,EAAcC,IAC/Bf,IAEL,CAGnB,C,wDCxFO,MAAMwB,EAAMX,OAASY,gBAAeC,WAAW,MAClD,IAAKA,GAAYC,MAAMD,IAAaE,WAAWF,IAAa,EACxD,KAAM,mBAOV,aAJuBG,EAAAA,EAAAA,IAAK,gBAAiB,CACzCJ,gBACAC,SAAUE,WAAWF,MAETI,MAAM,EAGbC,EAAUlB,gBACIgB,EAAAA,EAAAA,IAAK,oBAAqB,CAAEG,aACnCF,M,8GCTpB,MAAMG,EAAYA,EACdC,QACAT,gBACAU,kBACAC,OACAC,WACAC,kBACAxC,aAGIuB,EAAAA,cAACkB,EAAAA,SAAQ,KACJd,EACGJ,EAAAA,cAAA,KACIC,UAAWe,EACXvC,QAAU0C,IACNA,EAAEC,iBACF3C,EAAQ,CAAE2B,gBAAeU,mBAAkB,EAE/CC,KAAMA,GAAQ,IACdM,IAAI,YAEHR,GAGLb,EAAAA,cAAA,KAAGC,UAAWe,EAAUD,KAAMA,GAAQ,IAAKM,IAAI,YAC1CR,IA0BrB,EAnBsBlC,IAClB,MAAM2C,GAAWC,EAAAA,EAAAA,MAcXC,GAASjD,EAAAA,EAAAA,GAA2BqC,GAb1BpB,OAASY,gBAAeU,sBACpC,IACI,MAAMT,EAAWS,EACXW,SAASC,eAAeZ,GAAiBa,MACzC,EACAC,QAAaC,EAAAA,EAAAA,GAAiB,CAAEzB,gBAAeC,aAErD,OADAiB,GAASQ,EAAAA,EAAAA,IAAQF,KACV,CACX,CAAE,MAAOG,GAEL,OADAT,GAASU,EAAAA,EAAAA,GAAWD,GAAKE,IAAUC,EAAAA,EAAAA,IAAUD,OACtC,CACX,IAE0D,cAC9D,OAAOjC,EAAAA,cAACwB,EAAW7C,EAAS,C","sources":["webpack:///./Scripts/Components/withReactiveStyleBuyButton.js","webpack:///./Scripts/Services/Cart.service.js","webpack:///./Scripts/_PandoNexis/Components/BuyButton.js"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\n\nconst StateStyles = {\n LOADING: '--loading',\n SUCCESS: '--success',\n ERROR: '--error',\n};\n\n/**\n * Represents a HOC which wraps a BuyButton or ReorderButton and applies diffrent styles to it\n * depending on its click state.\n * @param {*} WrappedComponent The button component.\n * @param {*} onClick The async button's onClick event. It should return true if everything is OK, or false if there is any error.\n * @param {*} stylePrefix The style prefix to append state's modifiers. For\n * example, 'button' will result as 'button--loading'.\n *\n * Some available props that the HOC component supports:\n * autoReset : it is true by default. Not its value, but the behaviour is like that. Unless people set it as false, by default, button is always reset to neutral state after the request is completed.\n * resetTimeout: Number milisecond after the complete state, the style of button will be reset. If don't set, it is 2000\n * minimumLoadingTime: Mininum milisecond to display the loading state. If don't set, it is 1000\n */\nexport default function withReactiveStyleBuyButton(\n WrappedComponent,\n onClick,\n stylePrefix\n) {\n return (props) => {\n const [stateClass, setStateClass] = useState('');\n const startTime = useRef(0);\n\n useEffect(() => {\n return () => {\n setStateClass('');\n };\n }, []);\n\n function onNeutralState() {\n setStateClass('');\n startTime.current = 0;\n }\n\n function onLoadingState() {\n setStateClass(`${stylePrefix}${StateStyles.LOADING}`);\n startTime.current = Date.now();\n }\n\n const changeState = (complete) => {\n setStateClass(\n `${stylePrefix}${\n complete ? StateStyles.SUCCESS : StateStyles.ERROR\n }`\n );\n\n // if `autoReset` is true, which is default, the style will be changed\n // to neutral after a `resetTimeout` amount of time (2 seconds by default).\n props.autoReset !== false &&\n setTimeout(() => {\n onNeutralState();\n }, props.resetTimeout || 2000);\n };\n\n function onComplete(complete) {\n const loadingDuration = Date.now() - startTime.current;\n const minimumLoadingTime = props.minimumLoadingTime || 1000;\n // ensure the loading indicator is displayed at least a `minimumLoadingTime`\n // amount of time before changing it to Success or Error.\n if (loadingDuration >= minimumLoadingTime) {\n changeState(complete);\n } else {\n setTimeout(() => {\n changeState(complete);\n }, minimumLoadingTime - loadingDuration);\n }\n }\n\n async function onButtonClick(params) {\n onLoadingState();\n const data = await onClick(params);\n onComplete(data);\n }\n\n return (\n \n onButtonClick(params)}\n {...props}\n />\n \n );\n };\n}\n","import { post } from './http';\n\nexport const add = async ({ articleNumber, quantity = 1 }) => {\n if (!quantity || isNaN(quantity) || parseFloat(quantity) <= 0) {\n throw 'Invalid quantity';\n }\n\n const response = await post('/api/cart/add', {\n articleNumber,\n quantity: parseFloat(quantity),\n });\n return response.json();\n};\n\nexport const reorder = async (orderId) => {\n const response = await post('/api/cart/reorder', { orderId });\n return response.json();\n};\n","import React, { Fragment } from 'react';\nimport { add as addToCartService } from '../../Services/Cart.service';\nimport withReactiveStyleBuyButton from '../../Components/withReactiveStyleBuyButton';\nimport { receive, loadError } from '../../Actions/Cart.action';\nimport { catchError } from '../../Actions/Error.action';\nimport { useDispatch } from 'react-redux';\n\nconst BuyButton = ({\n label,\n articleNumber,\n quantityFieldId,\n href,\n cssClass,\n gtmTrackingData,\n onClick,\n}) => {\n return (\n \n {articleNumber ? (\n {\n e.preventDefault();\n onClick({ articleNumber, quantityFieldId });\n }}\n href={href || '#'}\n rel=\"nofollow\"\n >\n {label}\n \n ) : (\n \n {label}\n \n )}\n \n );\n};\n\nconst StyledButton = (props) => {\n const dispatch = useDispatch();\n const onClick = async ({ articleNumber, quantityFieldId }) => {\n try {\n const quantity = quantityFieldId\n ? document.getElementById(quantityFieldId).value\n : 1;\n const cart = await addToCartService({ articleNumber, quantity });\n dispatch(receive(cart));\n return true;\n } catch (ex) {\n dispatch(catchError(ex, (error) => loadError(error)));\n return false;\n }\n };\n const Button = withReactiveStyleBuyButton(BuyButton, onClick, 'buy-button');\n return ;\n};\n\nexport default StyledButton;\n"],"names":["StateStyles","LOADING","SUCCESS","ERROR","withReactiveStyleBuyButton","WrappedComponent","onClick","stylePrefix","props","stateClass","setStateClass","useState","startTime","useRef","useEffect","changeState","complete","autoReset","setTimeout","current","resetTimeout","async","onButtonClick","params","Date","now","loadingDuration","minimumLoadingTime","onComplete","React","className","_extends","add","articleNumber","quantity","isNaN","parseFloat","post","json","reorder","orderId","BuyButton","label","quantityFieldId","href","cssClass","gtmTrackingData","Fragment","e","preventDefault","rel","dispatch","useDispatch","Button","document","getElementById","value","cart","addToCartService","receive","ex","catchError","error","loadError"],"sourceRoot":""}