{"version":3,"sources":["index.tsx","types/AppState.ts","types/StaticData.ts","types/DataContext.ts","hooks/useDataContext.ts","controls/preview/Background.tsx","utils.ts","hooks/useTransform.ts","controls/preview/ImageView.tsx","controls/preview/Legend.tsx","controls/preview/Buttons.tsx","controls/preview/MaskImage.tsx","controls/preview/Ruler.tsx","controls/content/FileUploader.tsx","hooks/useAjaxFileUploader.ts","controls/content/SizeSelector.tsx","controls/content/ShapeSelector.tsx","controls/content/Discount.tsx","controls/content/QuantityEdit.tsx","controls/content/PricesView.tsx","controls/content/PriceAndBuy.tsx","controls/content/MaskImageDownloadLink.tsx","controls/App.tsx","controls/Loader.tsx","controls/CanvasMaxSizeProvider.tsx","controls/DataContextProvider.tsx"],"names":["fn","defaultAppState","itemId","canvasMaxSize","canvasHeight","canvasWidth","editable","zoom","transform","x","y","rotate","scale","originX","originY","quantity","shape","size","image","_x","_y","_rect","DOMRect","_angle","_initialized","_imageWidth","_imageHeight","defaultStaticData","vat","shapes","sizes","texts","reduce","p","o","discounts","defaultDataContext","state","setState","http","baseUrl","DataContext","React","useDataContext","useContext","Background","className","style","width","height","toCurrency","value","toLocaleString","currency","maximumFractionDigits","classNames","result","i","length","arg","undefined","Array","isArray","inner","push","key","hasOwnProperty","filter","a","indexOf","sort","join","MathUtils","toRad","deg","Math","PI","toDeg","rad","round","number","decimals","pow","sin","cos","tan","asin","acos","atan","atan2","transformCoords","action","calcAngle","cx","cy","normAngle","angle","reducer","type","rect","trans","origin","between","min","max","applyBoundaries","delta","ImageView","tr","transformOrigin","imageUrl","enabled","containerRef","imageRef","dispatch","s","onImageLoad","container","current","getBoundingClientRect","naturalWidth","naturalHeight","setImage","complete","dispatchPan","event","clientX","clientY","pan","dispatchRotate","onWindowMouseMove","onWindowMouseUp","window","removeEventListener","onContainerMouseDown","button","preventDefault","beginPan","beginRotate","addEventListener","onContainerWheel","deltaY","onContextMenu","onContainerTouchMove","ev","touches","panTouch","onContainerTouchEnd","onContainerTouchStart","beginPanTouch","node","passive","useTransform","ref","src","alt","Legend","Buttons","edit","preview","reset","zoomIn","zoomOut","clickHandler","currentTarget","resetHandler","zoomInHandler","zoomOutHandler","checked","onChange","onClick","MaskImage","maskImage","maskEdit","maskPreview","Ruler","FileUploader","accept","dragText","dropText","orText","selectText","totalSize","setTotalSize","uploaded","setUploaded","loadBlock","file","blockIndex","Promise","resolve","reject","reader","FileReader","onload","Uint8Array","onerror","error","readAsArrayBuffer","slice","uploadBlock","data","fileId","url","post","headers","uploadFile","name","get","loaded","part","getProgressProps","useAjaxFileUploader","isUploadActive","setIsUploadActive","doUploadFile","then","onFileChange","e","files","onDrop","acceptedFiles","useDropzone","getRootProps","getInputProps","isDragActive","click","display","SizeSelector","allSizes","selectSize","onSizeSelected","dataset","identifier","sizesArray","map","isSelected","data-identifier","OptionComponent","props","EwUtils","removeDiagratics","label","Option","children","ShapeSelector","selectShape","selectedOption","list","Object","keys","forEach","item","option","group","options","groups","changeHandler","newValue","actionMeta","isMulti","styles","components","Discount","discount_id","price","discount","pieces","perPiece","quantitativeBenefits","selected","count","replace","toString","QuantityEdit","updateQuantity","exact","isNaN","valueAsNumber","onDownClick","onUpClick","PricesView","withoutVat","unitPrice","closest","acc","obj","totalPrice","unitPriceVat","totalPriceVat","PriceAndBuy","onSubmitClick","response","dataModel","redirect","location","href","afterProductAdded","MaskImageDownloadLink","text","target","rel","download","App","title","Loader","aria-hidden","focusable","data-prefix","data-icon","role","xmlns","viewBox","fill","d","getMaxCanvasSize","scrollBar","outer","document","createElement","visibility","overflow","body","appendChild","scrollbarWidth","offsetWidth","removeChild","getScrollBarWidth","padding","konfigurator","querySelector","getComputedStyle","paddingLeft","getPropertyValue","paddingRight","parseFloat","getKonfiguratorPadding","sizebar","sidebar","clientWidth","getSizebarWidth","CanvasMaxSizeProvider","size_id","onWindowResize","newState","zoomX","maskWidth","zoomY","maskHeight","DataContextProvider","initialState","setError","staticData","setStaticData","setState2","stateAction","element","Provider","root","getElementById","Error","JSON","parse","firstElementChild","innerText","configState","axios","create","baseURL","ReactDOM","render","StrictMode","readyState","setTimeout"],"mappings":"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","file":"js/main.chunk.js","sourcesContent":["import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport axios from \"axios\";\n\nimport { App } from \"src/controls/App\";\nimport { DataContextProvider } from \"src/controls/DataContextProvider\";\n\nimport { AppState, defaultAppState } from \"src/types/AppState\";\n\nconst corsUrl = \"http://192.168.5.6:90/\";\n\ninterface ConfigJson extends AppState {\n baseUrl: string;\n}\n\nconst getBaseUrl = (baseUrl: string) => {\n if (process.env.NODE_ENV === \"production\") {\n return baseUrl;\n }\n\n // http(s)://example.com/path?query=...\n // {corsUrl}/http(s)/example.com/path?query=...\n const match = baseUrl.match(/(https?):\\/\\/(.*)/);\n if (match) {\n return corsUrl + match[1] + \"/\" + match[2];\n }\n\n return baseUrl;\n};\n\nconst main = () => {\n const root = document.getElementById(\"root\");\n if (!root) {\n throw new Error(\"Cannot find root element!\");\n }\n\n const { baseUrl, ...configState } = JSON.parse(\n (root.firstElementChild as HTMLScriptElement).innerText,\n ) as ConfigJson;\n\n const http = axios.create({\n baseURL: getBaseUrl(baseUrl),\n });\n\n const initialState: AppState = {\n ...defaultAppState,\n ...configState,\n transform: {\n ...defaultAppState.transform,\n ...configState.transform,\n },\n _initialized: configState.itemId !== null,\n };\n\n ReactDOM.render(\n \n \n \n \n ,\n root,\n );\n};\n\nconst docReady = (fn: () => void) => {\n if (document.readyState === \"complete\" || document.readyState === \"interactive\") {\n setTimeout(fn, 16);\n } else {\n document.addEventListener(\"DOMContentLoaded\", fn);\n }\n};\n\ndocReady(main);\n","export interface Transform {\r\n x: number;\r\n y: number;\r\n scale: number;\r\n rotate: number;\r\n originX: number;\r\n originY: number;\r\n}\r\n\r\nexport interface AppState {\r\n itemId: number | null;\r\n\r\n canvasMaxSize: number;\r\n canvasHeight: number;\r\n canvasWidth: number;\r\n\r\n editable: boolean;\r\n\r\n zoom: number;\r\n transform: Transform;\r\n\r\n quantity: number;\r\n shape: string;\r\n size: string;\r\n image: string | null;\r\n\r\n _x: number;\r\n _y: number;\r\n _rect: DOMRect;\r\n _angle: number;\r\n _initialized: boolean;\r\n _imageWidth: number;\r\n _imageHeight: number;\r\n}\r\n\r\nexport const defaultAppState: AppState = {\r\n itemId: null,\r\n\r\n canvasMaxSize: 0,\r\n canvasHeight: 0,\r\n canvasWidth: 0,\r\n\r\n editable: true,\r\n\r\n zoom: 1,\r\n transform: {\r\n x: 0,\r\n y: 0,\r\n rotate: 0,\r\n scale: 1,\r\n originX: 0,\r\n originY: 0,\r\n },\r\n\r\n quantity: 1,\r\n shape: \"\",\r\n size: \"\",\r\n image: null,\r\n\r\n _x: 0,\r\n _y: 0,\r\n _rect: new DOMRect(),\r\n _angle: 0,\r\n _initialized: false,\r\n _imageWidth: 0,\r\n _imageHeight: 0,\r\n};\r\n","const texts = [\r\n \"app:Title\",\r\n \"discounts:QuantitativeBenefits\",\r\n \"discounts:Pieces\",\r\n \"discounts:PerPiece\",\r\n \"priceAndBuy:AddToCart\",\r\n \"sizeSelector:SelectSize\",\r\n \"shapeSelector:SelectShape\",\r\n \"fileUploaderControl:HeaderText\",\r\n \"fileUploaderControl:DragText\",\r\n \"fileUploaderControl:DropText\",\r\n \"fileUploaderControl:OrText\",\r\n \"fileUploaderControl:SelectText\",\r\n \"priceView:WithoutVat\",\r\n \"previewLegend:Transform\",\r\n \"previewLegend:Rotate\",\r\n \"previewLegend:Scale\",\r\n \"downloadLink:Text\",\r\n \"buttons:Edit\",\r\n \"buttons:Preview\",\r\n \"buttons:Reset\",\r\n \"buttons:ZoomIn\",\r\n \"buttons:ZoomOut\",\r\n] as const;\r\n\r\ntype Texts = typeof texts[number];\r\n\r\ninterface Shape {\r\n name: string;\r\n group: string;\r\n sizes: string[];\r\n discount_id: string;\r\n}\r\n\r\ninterface Size {\r\n name: string;\r\n price: number;\r\n maskEdit: string;\r\n maskPreview: string;\r\n maskWidth: number;\r\n maskHeight: number;\r\n}\r\n\r\ninterface Discount {\r\n count: number;\r\n discount: number;\r\n}\r\n\r\nexport interface StaticData {\r\n vat: number;\r\n shapes: Record;\r\n sizes: Record;\r\n texts: Record;\r\n discounts: Record;\r\n}\r\n\r\nexport const defaultStaticData: StaticData = {\r\n vat: 0,\r\n shapes: {},\r\n sizes: {},\r\n texts: texts.reduce((p, o) => ({ ...p, [o]: o }), {} as Record),\r\n discounts: {},\r\n};\r\n","import * as React from \"react\";\r\nimport { AxiosInstance } from \"axios\";\r\n\r\nimport { AppState, defaultAppState } from \"src/types/AppState\";\r\nimport { StaticData, defaultStaticData } from \"src/types/StaticData\";\r\n\r\nexport interface DataContextType extends StaticData {\r\n state: AppState;\r\n setState: React.Dispatch>;\r\n http: AxiosInstance;\r\n baseUrl: string;\r\n}\r\n\r\nconst defaultDataContext: DataContextType = {\r\n ...defaultStaticData,\r\n state: defaultAppState,\r\n setState: (o) => o,\r\n http: null as any as AxiosInstance,\r\n baseUrl: \"\",\r\n};\r\n\r\nexport const DataContext = React.createContext(defaultDataContext);\r\n","import React from \"react\";\r\n\r\nimport { DataContext } from \"src/types/DataContext\";\r\n\r\nexport const useDataContext = () => React.useContext(DataContext);\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\nexport const Background: React.FC = () => {\r\n const {\r\n state: { editable, canvasWidth, canvasHeight },\r\n } = useDataContext();\r\n\r\n const className = React.useMemo(() => {\r\n return editable ? \"konfigurator-preview__chess\" : \"konfigurator-preview__background\";\r\n }, [editable]);\r\n\r\n return
;\r\n};\r\n","export const toCurrency = (value: number) => {\r\n return value.toLocaleString(\"cs-CZ\", {\r\n style: \"currency\",\r\n currency: \"CZK\",\r\n maximumFractionDigits: 2,\r\n });\r\n};\r\n\r\nexport type ClassArray = Array;\r\n\r\nexport interface ClassDictionary {\r\n [id: string]: boolean | undefined;\r\n}\r\nexport type ClassValue = string | ClassDictionary | ClassArray | undefined;\r\n\r\nexport const classNames = (...classes: ClassValue[]) => {\r\n const result: string[] = [];\r\n\r\n for (let i = 0; i < classes.length; i++) {\r\n const arg = classes[i];\r\n if (arg === undefined || arg === null) {\r\n continue;\r\n }\r\n\r\n if (typeof arg === \"string\") {\r\n result.push(arg);\r\n continue;\r\n }\r\n\r\n if (Array.isArray(arg)) {\r\n const inner = classNames(...arg);\r\n if (inner) {\r\n result.push(inner);\r\n }\r\n } else {\r\n for (const key in arg) {\r\n if (arg.hasOwnProperty(key) && arg[key]) {\r\n result.push(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result\r\n .filter((o, i, a) => a.indexOf(o) === i)\r\n .sort()\r\n .join(\" \");\r\n};\r\n\r\nexport const MathUtils = {\r\n toRad: (deg: number) => deg * (Math.PI / 180),\r\n toDeg: (rad: number) => rad * (180 / Math.PI),\r\n round: (number: number, decimals: number = 5) => {\r\n const pow = Math.pow(10, decimals);\r\n return Math.round(number * pow) / pow;\r\n },\r\n sin: (x: number) => MathUtils.round(Math.sin(MathUtils.toRad(x))),\r\n cos: (x: number) => MathUtils.round(Math.cos(MathUtils.toRad(x))),\r\n tan: (x: number) => MathUtils.round(Math.tan(MathUtils.toRad(x))),\r\n asin: (x: number) => MathUtils.round(MathUtils.toDeg(Math.asin(x))),\r\n acos: (x: number) => MathUtils.round(MathUtils.toDeg(Math.acos(x))),\r\n atan: (x: number) => MathUtils.round(MathUtils.toDeg(Math.atan(x))),\r\n atan2: (y: number, x: number) => MathUtils.round(MathUtils.toDeg(Math.atan2(y, x))),\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\nimport { AppState } from \"src/types/AppState\";\r\nimport { MathUtils } from \"src/utils\";\r\n\r\nconst ZOOM_DELTA = 0.1;\r\n\r\nconst setImage = (rect: DOMRect, image: HTMLImageElement) => ({\r\n type: \"SET_IMAGE\" as const,\r\n rect,\r\n width: image.naturalWidth,\r\n height: image.naturalHeight,\r\n});\r\nconst beginPan = (event: MouseEvent, container: HTMLDivElement) => {\r\n const { x, y } = container.getBoundingClientRect();\r\n return { type: \"BEGIN_PAN\" as const, x: event.clientX - x, y: event.clientY - y };\r\n};\r\nconst beginPanTouch = (event: TouchEvent, container: HTMLDivElement) => {\r\n const { x, y } = container.getBoundingClientRect();\r\n const ev = event.touches[0];\r\n return { type: \"BEGIN_PAN\" as const, x: ev.clientX - x, y: ev.clientY - y };\r\n};\r\nconst pan = (event: MouseEvent, container: HTMLDivElement) => {\r\n const { x, y } = container.getBoundingClientRect();\r\n return { type: \"PAN\" as const, x: event.clientX - x, y: event.clientY - y };\r\n};\r\nconst panTouch = (event: TouchEvent, container: HTMLDivElement) => {\r\n const { x, y } = container.getBoundingClientRect();\r\n const ev = event.touches[0];\r\n return { type: \"PAN\" as const, x: ev.clientX - x, y: ev.clientY - y };\r\n};\r\nconst beginRotate = (event: MouseEvent, container: HTMLDivElement) => {\r\n const { x, y } = container.getBoundingClientRect();\r\n return { type: \"BEGIN_ROTATE\" as const, x: event.clientX - x, y: event.clientY - y };\r\n};\r\nconst rotate = (event: MouseEvent, container: HTMLDivElement) => {\r\n const { x, y } = container.getBoundingClientRect();\r\n return { type: \"ROTATE\" as const, x: event.clientX - x, y: event.clientY - y };\r\n};\r\nconst zoom = (event: WheelEvent) => ({\r\n type: \"ZOOM\" as const,\r\n x: event.clientX,\r\n y: event.clientY,\r\n delta: event.deltaY < 0 ? ZOOM_DELTA : -ZOOM_DELTA,\r\n});\r\n\r\ntype ActionSetImage = ReturnType;\r\ntype ActionBeginPan = ReturnType;\r\ntype ActionPan = ReturnType;\r\ntype ActionBeginRotate = ReturnType;\r\ntype ActionRotate = ReturnType;\r\ntype ActionZoom = ReturnType;\r\n\r\ntype ActionsTransform = ActionBeginPan | ActionPan | ActionBeginRotate | ActionRotate | ActionZoom;\r\ntype Actions = ActionSetImage | ActionsTransform;\r\n\r\nconst transformCoords = (state: AppState, action: ActionsTransform) => {\r\n const sin = MathUtils.sin(-state.transform.rotate);\r\n const cos = MathUtils.cos(-state.transform.rotate);\r\n const x = action.x * cos - action.y * sin;\r\n const y = action.x * sin + action.y * cos;\r\n return [x / state.transform.scale, y / state.transform.scale] as const;\r\n};\r\n\r\nconst calcAngle = (state: AppState, action: ActionsTransform) => {\r\n const cx = state._rect.width / 2;\r\n const cy = state._rect.height / 2;\r\n return MathUtils.atan2(cy - action.y, cx - action.x);\r\n};\r\n\r\nconst normAngle = (angle: number) => {\r\n return angle > 180 ? angle - 360 : angle < -180 ? angle + 360 : angle;\r\n};\r\n\r\nconst applyBoundaries = (state: AppState, x: number, y: number) => {\r\n const between = (min: number, value: number, max: number) => Math.max(min, Math.min(max, value));\r\n return [\r\n between(-state._imageWidth, x + state.transform.x - state._x, state._rect.width),\r\n between(-state._imageHeight, y + state.transform.y - state._y, state._rect.height),\r\n ] as const;\r\n};\r\n\r\nconst reducer = (state: AppState, action: Actions): AppState => {\r\n switch (action.type) {\r\n case \"SET_IMAGE\": {\r\n const x = (action.rect.width - action.width) / 2;\r\n const y = (action.rect.height - action.height) / 2;\r\n\r\n const trans = state._initialized ? state.transform : { x, y, rotate: 0, scale: 1 };\r\n\r\n const origin = {\r\n originX: action.width / 2 + x,\r\n originY: action.height / 2 + y,\r\n };\r\n\r\n return {\r\n ...state,\r\n transform: { ...trans, ...origin },\r\n _initialized: true,\r\n _rect: action.rect,\r\n _imageWidth: action.width,\r\n _imageHeight: action.height,\r\n _x: 0,\r\n _y: 0,\r\n _angle: 0,\r\n };\r\n }\r\n case \"BEGIN_PAN\": {\r\n const [_x, _y] = transformCoords(state, action);\r\n if (_x === state._x && _y === state._y) {\r\n return state;\r\n }\r\n\r\n return { ...state, _x, _y };\r\n }\r\n case \"PAN\": {\r\n const [_x, _y] = transformCoords(state, action);\r\n const [x, y] = applyBoundaries(state, _x, _y);\r\n\r\n const transform =\r\n x === state.transform.x && y === state.transform.y ? state.transform : { ...state.transform, x, y };\r\n\r\n if (transform === state.transform && _x === state._x && _y === state._y) {\r\n return state;\r\n }\r\n\r\n return { ...state, transform, _x, _y };\r\n }\r\n case \"BEGIN_ROTATE\": {\r\n const angle = normAngle(calcAngle(state, action) - state.transform.rotate);\r\n if (angle === state._angle) {\r\n return state;\r\n }\r\n\r\n return { ...state, _angle: angle };\r\n }\r\n case \"ROTATE\": {\r\n const rotate = normAngle(calcAngle(state, action) - state._angle);\r\n if (rotate === state.transform.rotate) {\r\n return state;\r\n }\r\n\r\n return { ...state, transform: { ...state.transform, rotate } };\r\n }\r\n case \"ZOOM\": {\r\n const scale = MathUtils.round(Math.max(0.1, state.transform.scale + action.delta));\r\n if (scale === state.transform.scale) {\r\n return state;\r\n }\r\n\r\n return { ...state, transform: { ...state.transform, scale } };\r\n }\r\n default: {\r\n return state;\r\n }\r\n }\r\n};\r\n\r\ntype EventListener = (evt: TEvent) => void;\r\n\r\nexport const useTransform = (enabled: boolean) => {\r\n const containerRef = React.useRef(null);\r\n const imageRef = React.useRef(null);\r\n\r\n const { state, setState } = useDataContext();\r\n\r\n const dispatch = React.useCallback(\r\n (action: Actions) => {\r\n setState((s) => reducer(s, action));\r\n },\r\n [setState],\r\n );\r\n\r\n const onImageLoad = React.useCallback(() => {\r\n const container = containerRef.current as HTMLDivElement;\r\n const image = imageRef.current as HTMLImageElement;\r\n const rect = container.getBoundingClientRect();\r\n dispatch(setImage(rect, image));\r\n }, [dispatch]);\r\n\r\n React.useEffect(() => {\r\n const container = containerRef.current;\r\n const image = imageRef.current;\r\n\r\n if (container && image && image.complete && state._initialized === false) {\r\n onImageLoad();\r\n }\r\n }, [dispatch, onImageLoad, state._initialized]);\r\n\r\n const dispatchPan = React.useCallback(\r\n (event: MouseEvent) => dispatch(pan(event, containerRef.current as HTMLDivElement)),\r\n [dispatch],\r\n );\r\n\r\n const dispatchRotate = React.useCallback(\r\n (event: MouseEvent) => dispatch(rotate(event, containerRef.current as HTMLDivElement)),\r\n [dispatch],\r\n );\r\n\r\n const onWindowMouseMove = React.useRef | null>(null);\r\n\r\n const onWindowMouseUp = React.useCallback(() => {\r\n window.removeEventListener(\"mouseup\", onWindowMouseUp);\r\n window.removeEventListener(\"mousemove\", onWindowMouseMove.current as EventListener);\r\n }, [onWindowMouseMove]);\r\n\r\n const onContainerMouseDown = React.useCallback(\r\n (event: MouseEvent) => {\r\n if (event.button !== 0 && event.button !== 2) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n if (event.button === 0) {\r\n onWindowMouseMove.current = dispatchPan;\r\n dispatch(beginPan(event, containerRef.current as HTMLDivElement));\r\n }\r\n\r\n if (event.button === 2) {\r\n onWindowMouseMove.current = dispatchRotate;\r\n dispatch(beginRotate(event, containerRef.current as HTMLDivElement));\r\n }\r\n\r\n window.addEventListener(\"mouseup\", onWindowMouseUp);\r\n window.addEventListener(\"mousemove\", onWindowMouseMove.current as EventListener);\r\n },\r\n [dispatch, dispatchPan, dispatchRotate, onWindowMouseUp],\r\n );\r\n\r\n const onContainerWheel = React.useCallback(\r\n (event: WheelEvent) => {\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n dispatch(zoom(event));\r\n },\r\n [dispatch],\r\n );\r\n\r\n const onContextMenu = React.useCallback((event: Event) => event.preventDefault(), []);\r\n\r\n const onContainerTouchMove = React.useCallback(\r\n (event: TouchEvent) => {\r\n dispatch(panTouch(event, containerRef.current as HTMLDivElement));\r\n },\r\n [dispatch],\r\n );\r\n\r\n const onContainerTouchEnd = React.useCallback(() => {\r\n const container = containerRef.current as HTMLDivElement;\r\n container.removeEventListener(\"touchend\", onContainerTouchEnd);\r\n container.removeEventListener(\"touchmove\", onContainerTouchMove);\r\n }, [onContainerTouchMove]);\r\n\r\n const onContainerTouchStart = React.useCallback(\r\n (event: TouchEvent) => {\r\n event.preventDefault();\r\n\r\n const container = containerRef.current as HTMLDivElement;\r\n\r\n onWindowMouseMove.current = dispatchPan;\r\n dispatch(beginPanTouch(event, containerRef.current as HTMLDivElement));\r\n\r\n container.addEventListener(\"touchend\", onContainerTouchEnd);\r\n container.addEventListener(\"touchmove\", onContainerTouchMove);\r\n },\r\n [dispatch, dispatchPan, onContainerTouchEnd, onContainerTouchMove],\r\n );\r\n\r\n const containerRefCallback = React.useCallback(\r\n (node) => {\r\n if (containerRef.current) {\r\n containerRef.current.removeEventListener(\"mousedown\", onContainerMouseDown);\r\n containerRef.current.removeEventListener(\"wheel\", onContainerWheel);\r\n containerRef.current.removeEventListener(\"contextmenu\", onContextMenu);\r\n containerRef.current.removeEventListener(\"touchstart\", onContainerTouchStart);\r\n }\r\n\r\n if (enabled && state._initialized && node) {\r\n node.addEventListener(\"mousedown\", onContainerMouseDown);\r\n node.addEventListener(\"wheel\", onContainerWheel, { passive: false });\r\n node.addEventListener(\"contextmenu\", onContextMenu, { passive: false });\r\n node.addEventListener(\"touchstart\", onContainerTouchStart);\r\n }\r\n\r\n containerRef.current = node;\r\n },\r\n [enabled, state._initialized, onContainerMouseDown, onContainerWheel, onContextMenu, onContainerTouchStart],\r\n );\r\n\r\n const imageRefCallback = React.useCallback(\r\n (node: HTMLImageElement) => {\r\n if (imageRef.current) {\r\n imageRef.current.removeEventListener(\"load\", onImageLoad);\r\n }\r\n\r\n if (node) {\r\n node.addEventListener(\"load\", onImageLoad);\r\n }\r\n\r\n imageRef.current = node;\r\n },\r\n [onImageLoad],\r\n );\r\n\r\n return [containerRefCallback, imageRefCallback] as const;\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\nimport { useTransform } from \"src/hooks/useTransform\";\r\n\r\nexport const ImageView: React.FC = () => {\r\n const {\r\n baseUrl,\r\n state: { zoom, image, transform: tr, canvasWidth, canvasHeight, editable },\r\n } = useDataContext();\r\n\r\n const style = React.useMemo(\r\n () =>\r\n ({\r\n transform: `rotate(${tr.rotate}deg) scale(${tr.scale}) translate(${tr.x}px, ${tr.y}px)`,\r\n transformOrigin: `${tr.originX}px ${tr.originY}px`,\r\n } as React.CSSProperties),\r\n [tr],\r\n );\r\n\r\n const imageUrl = React.useMemo(() => `${baseUrl}/api/image?id=${image}&zoom=${zoom}`, [baseUrl, image, zoom]);\r\n\r\n const [containerRef, imageRef] = useTransform(editable);\r\n\r\n return (\r\n
\r\n {image && (\r\n <>\r\n
\r\n
\r\n
\r\n \"\"\r\n
\r\n
\r\n {editable && (\r\n
\r\n
\r\n \"\"\r\n
\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\nexport const Legend: React.FC = () => {\r\n const {\r\n texts: { \"previewLegend:Transform\": transform, \"previewLegend:Rotate\": rotate, \"previewLegend:Scale\": scale },\r\n } = useDataContext();\r\n\r\n return (\r\n
\r\n
    \r\n
  • \r\n {transform}\r\n
  • \r\n
  • \r\n {rotate}\r\n
  • \r\n
  • \r\n {scale}\r\n
  • \r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\nexport const Buttons: React.FC = () => {\r\n const {\r\n state: { editable },\r\n texts: {\r\n \"buttons:Edit\": edit,\r\n \"buttons:Preview\": preview,\r\n \"buttons:Reset\": reset,\r\n \"buttons:ZoomIn\": zoomIn,\r\n \"buttons:ZoomOut\": zoomOut,\r\n },\r\n setState,\r\n } = useDataContext();\r\n\r\n const clickHandler = React.useCallback>(\r\n (event) => {\r\n const { value } = event.currentTarget;\r\n setState((state) => ({ ...state, editable: value === \"1\" }));\r\n },\r\n [setState],\r\n );\r\n\r\n const resetHandler = React.useCallback(() => {\r\n setState((state) => ({ ...state, _initialized: false }));\r\n }, [setState]);\r\n\r\n const zoomInHandler = React.useCallback(() => {\r\n setState((state) => {\r\n if (state.transform.scale <= 0.5) {\r\n return state;\r\n }\r\n\r\n return {\r\n ...state,\r\n transform: {\r\n ...state.transform,\r\n scale: state.transform.scale * 0.9,\r\n },\r\n };\r\n });\r\n }, [setState]);\r\n\r\n const zoomOutHandler = React.useCallback(() => {\r\n setState((state) => {\r\n return {\r\n ...state,\r\n transform: {\r\n ...state.transform,\r\n scale: state.transform.scale * 1.1,\r\n },\r\n };\r\n });\r\n }, [setState]);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\nexport const MaskImage: React.FC = () => {\r\n const {\r\n state: { size, editable, canvasWidth, canvasHeight },\r\n sizes,\r\n } = useDataContext();\r\n\r\n const maskImage = React.useMemo(() => {\r\n if (!size) {\r\n return null;\r\n }\r\n\r\n const { maskEdit, maskPreview } = sizes[size];\r\n return editable ? maskEdit : maskPreview;\r\n }, [editable, size, sizes]);\r\n\r\n if (maskImage === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\nexport const Ruler: React.FC = () => {\r\n const {\r\n state: { canvasWidth, canvasHeight },\r\n } = useDataContext();\r\n\r\n return (\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { useDropzone } from \"react-dropzone\";\r\n\r\nimport { useAjaxFileUploader } from \"src/hooks/useAjaxFileUploader\";\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\ninterface FileUploaderProps {\r\n accept?: string;\r\n}\r\n\r\nexport const FileUploader: React.FC = ({ accept }) => {\r\n const {\r\n http,\r\n setState,\r\n texts: {\r\n \"fileUploaderControl:DragText\": dragText,\r\n \"fileUploaderControl:DropText\": dropText,\r\n \"fileUploaderControl:OrText\": orText,\r\n \"fileUploaderControl:SelectText\": selectText,\r\n },\r\n } = useDataContext();\r\n\r\n const { uploadFile, getProgressProps } = useAjaxFileUploader(http);\r\n\r\n const [isUploadActive, setIsUploadActive] = React.useState(false);\r\n\r\n const doUploadFile = React.useCallback(\r\n (file: File) => {\r\n setIsUploadActive(true);\r\n uploadFile(file, file.name).then((fileId) => {\r\n setIsUploadActive(false);\r\n setState((s) => ({ ...s, image: fileId, _initialized: false }));\r\n });\r\n },\r\n [uploadFile, setState],\r\n );\r\n\r\n const onFileChange = React.useCallback(\r\n (e: React.ChangeEvent) => {\r\n const { files } = e.currentTarget;\r\n if (files && files.length) {\r\n doUploadFile(files[0]);\r\n }\r\n },\r\n [doUploadFile],\r\n );\r\n\r\n const onDrop = React.useCallback(\r\n (acceptedFiles: File[]) => {\r\n if (acceptedFiles && acceptedFiles.length) {\r\n doUploadFile(acceptedFiles[0]);\r\n }\r\n },\r\n [doUploadFile],\r\n );\r\n\r\n const { getRootProps, getInputProps, isDragActive } = useDropzone({ accept, onDrop });\r\n\r\n const ref = React.useRef(null);\r\n\r\n const onClick = React.useCallback(() => (ref.current as HTMLInputElement).click(), []);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {isDragActive ? dropText : dragText}\r\n \r\n
\r\n
{orText}
\r\n \r\n
\r\n \r\n
\r\n
\r\n {isUploadActive && (\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { AxiosInstance } from \"axios\";\r\n\r\ninterface AjaxFileUploader {\r\n uploadFile(file: File, name: string): Promise;\r\n getProgressProps(): React.DetailedHTMLProps, HTMLDivElement>;\r\n}\r\ninterface AjaxFileUploaderHook {\r\n (http: AxiosInstance): AjaxFileUploader;\r\n}\r\nexport const useAjaxFileUploader: AjaxFileUploaderHook = (http: AxiosInstance) => {\r\n // must correspond to server block size\r\n const blockSize = 32768;\r\n\r\n const [totalSize, setTotalSize] = React.useState(0);\r\n const [uploaded, setUploaded] = React.useState(0);\r\n\r\n const loadBlock = (file: Blob, blockIndex: number) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(new Uint8Array(reader.result as ArrayBuffer));\r\n reader.onerror = () => reject(reader.error);\r\n reader.readAsArrayBuffer(file.slice(blockSize * blockIndex, blockSize * (blockIndex + 1)));\r\n });\r\n };\r\n\r\n const uploadBlock = async (data: Uint8Array, fileId: string, blockIndex: number) => {\r\n const url = \"/ew/ajax_file_upload/block?fileId=\" + fileId + \"&blockIndex=\" + blockIndex;\r\n await http.post(url, data, { headers: { \"Content-Type\": \"application/x-binary\" } });\r\n };\r\n\r\n const uploadFile = async (file: File, name: string) => {\r\n const url = \"/ew/ajax_file_upload/begin?fileName=\" + name;\r\n const {\r\n data: { fileId },\r\n } = await http.get<{ fileId: string }>(url);\r\n\r\n setTotalSize(file.size);\r\n\r\n let blockIndex = 0;\r\n let loaded = 0;\r\n do {\r\n const part = await loadBlock(file, blockIndex);\r\n await uploadBlock(part, fileId, blockIndex);\r\n\r\n loaded += part.length;\r\n blockIndex++;\r\n\r\n setUploaded(loaded);\r\n } while (loaded < file.size);\r\n\r\n setUploaded(file.size);\r\n return fileId;\r\n };\r\n\r\n const getProgressProps = () => {\r\n const percents = totalSize > 0 ? (uploaded / totalSize) * 100 : 0;\r\n\r\n return {\r\n style: {\r\n width: percents + \"%\",\r\n },\r\n };\r\n };\r\n\r\n return {\r\n uploadFile,\r\n getProgressProps,\r\n };\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\nimport { classNames } from \"src/utils\";\r\n\r\nexport const SizeSelector: React.FC = () => {\r\n const {\r\n sizes: allSizes,\r\n state: { shape, size },\r\n setState,\r\n shapes: {\r\n [shape]: { sizes },\r\n },\r\n texts: { \"sizeSelector:SelectSize\": selectSize },\r\n } = useDataContext();\r\n\r\n const onSizeSelected = React.useCallback>(\r\n (e) => {\r\n const { identifier: size } = e.currentTarget.dataset as { identifier: string };\r\n setState((state) => {\r\n if (state.size === size) {\r\n return state;\r\n }\r\n\r\n return { ...state, size };\r\n });\r\n },\r\n [setState],\r\n );\r\n\r\n const sizesArray = sizes.map((o) => ({ ...allSizes[o], key: o, isSelected: o === size }));\r\n\r\n return (\r\n
\r\n
{selectSize}
\r\n
\r\n {sizesArray.map((o) => (\r\n \r\n {o.name}\r\n \r\n ))}\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport Select, { GroupBase, SingleValue, ActionMeta, OptionProps, components } from \"react-select\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\ninterface Option {\r\n value: string;\r\n label: string;\r\n}\r\ntype Group = GroupBase
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\ninterface QuantityEditProps {\r\n min?: number;\r\n max?: number;\r\n}\r\nexport const QuantityEdit: React.FC = ({ min, max }) => {\r\n const {\r\n state: { quantity },\r\n setState,\r\n } = useDataContext();\r\n\r\n const updateQuantity = React.useCallback(\r\n (value: number, exact: boolean = false) => {\r\n if (!exact) {\r\n value += quantity;\r\n }\r\n\r\n if (min !== undefined && !isNaN(min) && value < min) {\r\n return;\r\n }\r\n\r\n if (max !== undefined && !isNaN(max) && value > max) {\r\n return;\r\n }\r\n\r\n setState((state) => ({ ...state, quantity: value }));\r\n },\r\n [min, max, setState, quantity],\r\n );\r\n\r\n const onChange = React.useCallback>(\r\n (e) => updateQuantity(e.currentTarget.valueAsNumber, true),\r\n [updateQuantity],\r\n );\r\n\r\n const onDownClick = React.useCallback(() => updateQuantity(1), [updateQuantity]);\r\n\r\n const onUpClick = React.useCallback(() => updateQuantity(-1), [updateQuantity]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\nimport { toCurrency } from \"src/utils\";\r\n\r\nexport const PricesView: React.FC = () => {\r\n const {\r\n state: { quantity, shape, size },\r\n shapes: {\r\n [shape]: { discount_id },\r\n },\r\n sizes: {\r\n [size]: { price },\r\n },\r\n vat,\r\n discounts: { [discount_id]: discounts },\r\n texts: { \"priceView:WithoutVat\": withoutVat },\r\n } = useDataContext();\r\n\r\n const unitPrice = React.useMemo(() => {\r\n const closest = discounts.reduce((acc, obj) => (quantity - obj.count >= 0 ? obj : acc));\r\n return price * (1 - closest.discount);\r\n }, [discounts, price, quantity]);\r\n\r\n const totalPrice = React.useMemo(() => unitPrice * quantity, [quantity, unitPrice]);\r\n\r\n const unitPriceVat = React.useMemo(() => unitPrice * (1 - vat), [unitPrice, vat]);\r\n\r\n const totalPriceVat = React.useMemo(() => totalPrice * (1 - vat), [totalPrice, vat]);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
{toCurrency(unitPrice)}
\r\n
\r\n
\r\n
{withoutVat.replace(\"#\", toCurrency(unitPriceVat))}
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
{toCurrency(totalPrice)}
\r\n
\r\n
\r\n
{withoutVat.replace(\"#\", toCurrency(totalPriceVat))}
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\nimport { QuantityEdit } from \"src/controls/content/QuantityEdit\";\r\nimport { PricesView } from \"src/controls/content/PricesView\";\r\n\r\nexport const PriceAndBuy: React.FC = () => {\r\n const {\r\n http,\r\n state: { itemId, image, quantity, shape, size, transform, zoom },\r\n } = useDataContext();\r\n\r\n const onSubmitClick = React.useCallback(() => {\r\n const { x, y, rotate, scale, originX, originY } = transform;\r\n http.post(\"/api/submit\", {\r\n itemId,\r\n image,\r\n quantity,\r\n shape,\r\n size,\r\n transform: { x: x / zoom, y: y / zoom, rotate, scale, originX: originX / zoom, originY: originY / zoom },\r\n }).then((response) => {\r\n const { dataModel, url } = response.data;\r\n const redirect = () => {\r\n window.location.href = url;\r\n };\r\n\r\n if ((window as any).afterProductAdded) {\r\n (window as any).afterProductAdded(dataModel, redirect);\r\n } else {\r\n redirect();\r\n }\r\n });\r\n }, [http, image, itemId, quantity, shape, size, transform, zoom]);\r\n\r\n return (\r\n <>\r\n {shape && size && (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n {image ? (\r\n \r\n ) : (\r\n
Nahrajte obrázek
\r\n )}\r\n
\r\n
\r\n
\r\n )}\r\n \r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\n\r\nexport const MaskImageDownloadLink: React.FC = () => {\r\n const {\r\n state: { size },\r\n sizes,\r\n texts: { \"downloadLink:Text\": text },\r\n } = useDataContext();\r\n\r\n const imageUrl = React.useMemo(() => {\r\n if (!size) {\r\n return null;\r\n }\r\n\r\n return sizes[size].maskEdit;\r\n }, [size, sizes]);\r\n\r\n if (imageUrl === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {text}\r\n \r\n );\r\n};\r\n","import React from \"react\";\n\nimport { useDataContext } from \"src/hooks/useDataContext\";\n\nimport { Background } from \"src/controls/preview/Background\";\nimport { ImageView } from \"src/controls/preview/ImageView\";\nimport { Legend } from \"src/controls/preview/Legend\";\nimport { Buttons } from \"src/controls/preview/Buttons\";\nimport { MaskImage } from \"src/controls/preview/MaskImage\";\nimport { Ruler } from \"src/controls/preview/Ruler\";\n\nimport { FileUploader } from \"src/controls/content/FileUploader\";\nimport { SizeSelector } from \"src/controls/content/SizeSelector\";\nimport { ShapeSelector } from \"src/controls/content/ShapeSelector\";\nimport { Discount } from \"src/controls/content/Discount\";\nimport { PriceAndBuy } from \"src/controls/content/PriceAndBuy\";\nimport { MaskImageDownloadLink } from \"src/controls/content/MaskImageDownloadLink\";\n\nexport const App: React.FC = () => {\n const {\n state: { shape, size, editable, canvasHeight, canvasWidth },\n texts: { \"app:Title\": title },\n } = useDataContext();\n\n const {\n state: {\n transform,\n itemId,\n quantity,\n zoom,\n editable: _,\n _rect,\n _angle,\n _imageHeight,\n _imageWidth,\n _initialized,\n _x,\n _y,\n ...state\n },\n } = useDataContext();\n const state2 = { itemId, quantity, zoom, _angle, _imageHeight, _imageWidth, _initialized, _x, _y };\n\n return (\n
\n
\n \n \n \n \n {editable && }\n
\n {editable && }\n \n
\n\n
\n

{title}

\n
\n \n \n
\n {shape && }\n {size && (\n <>\n \n
\n
\n \n \n
\n
\n \n )}\n
\n\n {/* true: debug display */}\n {false && (\n \n {JSON.stringify(state, null, 1).replace(/\\r|\\n/g, \"\").replace(\"}\", \" }\") + \"\\r\\n\"}\n {JSON.stringify(state2, null, 1).replace(/\\r|\\n/g, \"\").replace(\"}\", \" }\") + \"\\r\\n\"}\n transform: {JSON.stringify(transform, null, 1).replace(/\\r|\\n/g, \"\").replace(\"}\", \" }\") + \"\\r\\n\"}\n _rect: {JSON.stringify(_rect, null, 1).replace(/\\r|\\n/g, \"\").replace(\"}\", \" }\") + \"\\r\\n\"}\n \n )}\n \n );\n};\n","import * as React from \"react\";\r\n\r\nexport const Loader: React.FC = () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { useDataContext } from \"src/hooks/useDataContext\";\r\nimport { AppState } from \"src/types/AppState\";\r\n\r\nconst getScrollBarWidth = () => {\r\n const outer = document.createElement(\"div\");\r\n outer.style.visibility = \"hidden\";\r\n outer.style.overflow = \"scroll\";\r\n document.body.appendChild(outer);\r\n\r\n const inner = document.createElement(\"div\");\r\n outer.appendChild(inner);\r\n\r\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\r\n document.body.removeChild(outer);\r\n\r\n return scrollbarWidth;\r\n};\r\n\r\nconst getSizebarWidth = () => {\r\n const sidebar = document.querySelector(\".sidebar\");\r\n return sidebar ? sidebar.clientWidth : 0;\r\n};\r\n\r\nconst getKonfiguratorPadding = () => {\r\n const konfigurator = document.querySelector(\".konfigurator\");\r\n if (!konfigurator) {\r\n return 0;\r\n }\r\n\r\n const style = window.getComputedStyle(konfigurator, null);\r\n const paddingLeft = style.getPropertyValue(\"padding-left\");\r\n const paddingRight = style.getPropertyValue(\"padding-right\");\r\n return parseFloat(paddingLeft) + parseFloat(paddingRight);\r\n};\r\n\r\nconst getMaxCanvasSize = () => {\r\n const scrollBar = getScrollBarWidth();\r\n const padding = getKonfiguratorPadding();\r\n const sizebar = getSizebarWidth();\r\n\r\n const clientWidth = Math.min(1900, document.body.clientWidth);\r\n\r\n if (clientWidth < 769) {\r\n return clientWidth - padding - scrollBar;\r\n }\r\n\r\n if (clientWidth < 1200) {\r\n return Math.round((clientWidth - padding - scrollBar) / 2);\r\n }\r\n\r\n return Math.round((clientWidth - padding - scrollBar - sizebar) / 2);\r\n};\r\n\r\nexport const CanvasMaxSizeProvider: React.FC = ({ children }) => {\r\n const {\r\n sizes,\r\n state: { size: size_id },\r\n setState,\r\n } = useDataContext();\r\n\r\n const onWindowResize = React.useCallback(() => {\r\n const canvasMaxSize = getMaxCanvasSize();\r\n\r\n const newState: Partial = {\r\n canvasMaxSize,\r\n };\r\n\r\n const size = sizes[size_id];\r\n if (size) {\r\n const zoomX = Math.min(1, canvasMaxSize / size.maskWidth);\r\n const zoomY = Math.min(1, canvasMaxSize / size.maskHeight);\r\n newState.zoom = Math.min(zoomX, zoomY);\r\n newState.canvasWidth = size.maskWidth * newState.zoom;\r\n newState.canvasHeight = size.maskHeight * newState.zoom;\r\n }\r\n\r\n setState((state) => ({ ...state, ...newState }));\r\n }, [setState, size_id, sizes]);\r\n\r\n React.useEffect(() => {\r\n window.addEventListener(\"resize\", onWindowResize);\r\n onWindowResize();\r\n return () => {\r\n window.removeEventListener(\"resize\", onWindowResize);\r\n };\r\n }, [onWindowResize]);\r\n\r\n return <>{children};\r\n};\r\n","import * as React from \"react\";\r\nimport { AxiosInstance } from \"axios\";\r\n\r\nimport { StaticData, defaultStaticData } from \"src/types/StaticData\";\r\nimport { AppState } from \"src/types/AppState\";\r\nimport { DataContext } from \"src/types/DataContext\";\r\nimport { Loader } from \"src/controls/Loader\";\r\nimport { CanvasMaxSizeProvider } from \"src/controls/CanvasMaxSizeProvider\";\r\n\r\ninterface DataContextProviderProps {\r\n initialState: AppState;\r\n http: AxiosInstance;\r\n baseUrl: string;\r\n}\r\n\r\nexport const DataContextProvider: React.FC = ({ initialState, http, baseUrl, children }) => {\r\n const [state, setState] = React.useState(initialState);\r\n const [error, setError] = React.useState(null);\r\n const [staticData, setStaticData] = React.useState(null);\r\n\r\n const setState2 = React.useCallback((stateAction: React.SetStateAction) => {\r\n if (typeof stateAction === \"function\") {\r\n setState((s) => {\r\n const newState = stateAction(s);\r\n return newState;\r\n });\r\n } else {\r\n setState(stateAction);\r\n }\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n http.get(\"/api\").then((o) => {\r\n const data = o && o.data && Object.keys(o.data).length > 0 ? o.data : defaultStaticData;\r\n for (const key in data.sizes) {\r\n const element = data.sizes[key];\r\n element.maskEdit = baseUrl + element.maskEdit;\r\n element.maskPreview = baseUrl + element.maskPreview;\r\n }\r\n\r\n setStaticData((s) => ({ ...s, ...data }));\r\n\r\n setState((s) => {\r\n if (!s.shape) {\r\n const shape = Object.keys(data.shapes)[0];\r\n const size = data.shapes[shape].sizes[0];\r\n return { ...s, shape, size };\r\n } else {\r\n return { ...s, _initialized: true };\r\n }\r\n });\r\n }, setError);\r\n }, [baseUrl, http, state.shape]);\r\n\r\n if (error !== null) {\r\n return
{error}
;\r\n }\r\n\r\n if (staticData === null) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n"],"sourceRoot":""}