{"version":3,"sources":["core/helpers/attributesHelper.js","core/helpers/priceHelper.js","services/OrderUtils.js","components/3d/lib/Environment.js","components/3d/lib/ModelMapping.js","components/3d/View3d.js","core/legacyAPI.js","core/newAPI.js","services/OrderService.js","components/MenuList.js","components/MenuDrawer.js","components/core/Zoom.js","components/AppMenu.js","views/order/Layout.js","components/order/CategoryCard.js","components/order/CategoryCardSkeleton.js","components/order/BanerSlider.js","assets/our-other-products.jpg","components/order/UncategorizedCard.js","views/order/CategoriesView.js","components/core/RoundButton.js","components/order/FileListItem.js","components/order/PriceRangeList.js","components/order/AttributesList.js","core/helpers/guidHelper.js","components/order/BasicDialog.js","components/order/BasicDialogNaturalProduct.js","components/order/CardBadge.js","components/order/ProductBasicCard.js","components/3d/Rectangle.js","components/3d/helpers/canvasPreview.js","components/3d/Cropper.js","assets/cup.obj","assets/sample01.jpg","components/order/Presenter3d.js","components/order/Render3dDialog.js","components/PhotoFrame/Components/Frame.js","components/PhotoFrame/Components/TextLayer.js","components/PhotoFrame/Components/TransformableImage.js","components/PhotoFrame/Atoms/BackBtn.js","components/PhotoFrame/Components/TextTransformer.js","components/PhotoFrame/Atoms/Btn.js","components/PhotoFrame/Components/ScaleAndRotationTransformer.js","components/PhotoFrame/Components/Menu.js","components/PhotoFrame/PhotoFrame.js","assets/share2.jpg","components/order/Render3dWizard/Buttons.js","components/order/Render3dWizard/Render3dWizard.js","components/order/Basic3dDialog.js","assets/placeholder.jpg","components/order/Render3dWizard/RenderAlbumWizard.js","components/order/BasicAlbumDialog.js","components/order/Render3dWizard/RenderCalendarWizard.js","components/order/BasicCalendarDialog.js","components/order/ProductRenderCard.js","components/order/ProductTypeRenderer.js","components/order/ProductFilters.js","views/order/ProductsView.js","core/helpers/formValidationHelper.js","components/order/SendOrderButton.js","components/order/SummaryTab.js","components/order/UserBasicInfo.js","components/order/UserDeliveryInfo.js","components/order/UserPaymentInfo.js","components/order/ThankYouCard.js","views/order/CheckoutView.js","components/order/ContactCard.js","views/order/ContactView.js","components/order/UploadManager.js","views/order/UncategorizedView.js","views/order/index.js"],"names":["getSelectedAttributes","productId","order","photographer","products","product","find","p","id","attributesGroups","calculateAttributeGroups","groupIds","Set","attributes","map","attributesGroupId","productAttributes","filter","a","includes","Id","selectedAttributes","g","_actualConfigs$config","availableAttributes","calculateAttributes","group","sort","b","position","orderItemsConfig","actualConfigs","c","configs","length","configExist","groupId","selectedAttribute","selected","formatPrice","num","result","Math","round","Number","EPSILON","concat","toFixed","priceCalculator","quantity","Error","priceUnitBase","priceUnitModificator","priceUnitPercentModificator","estimatedPrice","estimatedQuantity","productBasePrices","price","productPrices","quantityRangeMin","quantityRangeMax","step","forEach","priceLevelFrom","priceLevelTo","priceCorrectionPercent","pV","priceCorrectionCurrent","calculatedPrice","finalPrice","getLabelPrice","calculation","getPrice","getRangePrice","priceId","priceRange","useGetPhotographer","service","OrderService","success","photographerId","enabledOption","useQuery","async","resp","GetPhotographer","then","res","data","err","enabled","useGetBanners","GetBanners","useGetProducts","GetProducts","THREE","require","OrbitControls","Environment","constructor","place","canvas","parameters","container","this","scene","Scene","width","clientWidth","height","clientHeight","createRenderer","createCamera","createOrbit","createLights","window","addEventListener","windowResize","renderer","WebGLRenderer","antialias","alpha","preserveDrawingBuffer","setCameraSettings","camera","lookAt","Vector3","aspect","setPixelRatio","devicePixelRatio","setSize","fullWidth","fullHeight","setViewOffset","center","updateProjectionMatrix","PerspectiveCamera","set","fog","Fog","add","light","DirectionalLight","theta","PI","phi","x","distance","cos","y","sin","z","lightAmbient","AmbientLight","lightBack","PointLight","controlsEl","controls","enableKeys","autoRotate","enableZoom","rotate","maxPolarAngle","minPolarAngle","target","hpoint","minDistance","maxDistance","enableDamping","dampingFactor","screenSpacePanning","rotateSpeed","panSpeed","autoRotateSpeed","render","cameraDist","distanceTo","update","OBJLoader","ModelLoader","ModelMaping","environment","materials","url","loadingElement","primeryModel","modelUrl","textureLoader","TextureLoader","CubeTextureLoader","loading","setModel","setLoading","state","classList","remove","loadModel","model","Promise","resolve","reject","load","object","children","material","test1","test2","texture","body","inside","handle","xhr","loaded","total","error","setTexture","loadTexture","useStyles","makeStyles","theme","root","View3d","_ref","textureUrl","saveFn","t","useTranslation","useRef","canvasContainer","canvasContainerLoading","curentModel","setCurentModel","useState","useLayoutEffect","_attributes$find","_attributes$find2","_attributes$find3","_attributes$find4","_attributes$find5","_attributes$find6","_attributes$find7","_attributes$find8","bodyColorHex","_a$configuration","configuration","hex","split","_a$configuration2","bodyhex","bodyColor","insideColor","_a$configuration3","insidehex","handleColor","_a$configuration4","handlehex","bodyShininessHex","_a$configuration5","_a$configuration6","bodyShininess","insideShininess","_a$configuration7","handleShininess","_a$configuration8","shadow","MeshBasicMaterial","color","transparent","opacity","lerp","MeshPhongMaterial","shininess","reflectivity","side","DoubleSide","current","myModel","animation","canvasRatio","offsetWidth","offsetHeight","_myModel$primeryModel","_myModel$primeryModel2","scale","requestAnimationFrame","useEffect","fileAsBase64","_jsxs","className","style","minHeight","outline","border","ref","_jsx","axios","create","baseURL","process","endpoint","legacy","get","api","CreateOrder","post","email","firstName","lastName","phone","orderItems","FinalizeOrder","orderId","defaultAttributes","_att","att","Attributes","orderedItems","item","_productInfo$attribut","itemAttributes","productInfo","pa","config","_config$configs","selectedValue","push","defaultSelection","FileName","fileName","FileGuid","imageGuid","FileUrl","fileUrl","ProductId","Quantity","qty","layerIndex","isLayerItem","X","Y","Width","Height","ScaleFactoryUp","Guid","Index","sizes","FirstName","LastName","Phone","Email","StreetAddress","shippingAddress","IsShippingChoosen","shippingSelected","OrderGuid","orderGuid","OrderItems","PaymentMethod","paymentMethod","vivawalletUrl","vivawallet","open","put","MarkOrderAsDone","UploadImage","FileAsBase64","TrackingGuid","fileGuid","gutters","paddingLeft","MenuList","props","classes","categoriesListOpen","setCategoriesListOpen","usePhotographer","List","renderProductsOrCategories","_photographer$product","productCategories","_Fragment","ListItem","button","onClick","ListItemIcon","ArrowRightIcon","ListItemText","primary","ExpandLess","ExpandMore","Collapse","in","timeout","unmountOnExit","component","disablePadding","category","requestClose","Link","to","photographId","Name","AddShoppingCartIcon","ShoppingCartIcon","ContactPhoneIcon","drawer","flexShrink","whiteSpace","drawerOpen","transition","transitions","easing","sharp","duration","enteringScreen","drawerClose","leavingScreen","overflowX","spacing","breakpoints","up","toolbar","display","alignItems","justifyContent","padding","MenuDrawer","Drawer","clsx","draweropen","paper","anchor","onClose","btn_group","marginRight","Zoom","zoom","setZoom","ButtonGroup","variant","Button","rootBtn","borderBtn","paddingsBtn","document","disabled","TextFormatIcon","fontSize","drawerWidth","toolbarIcon","mixins","appBar","backgroundColor","zIndex","appBarShift","marginLeft","menuButton","closeButton","hide","regular","content","flexGrow","title","colorSecondary","link","textDecoration","navButton","textAlign","cursor","categoryDiv","sectionDesktop","sectionMobile","AppMenu","history","useHistory","setDrawerOpen","anchorEl","setAnchorEl","React","Boolean","handleProductMenuClick","event","currentTarget","handleProductMenuClose","redirectToCategoriesList","redirectToUncategorized","renderCategories","Typography","Menu","keepMounted","TransitionComponent","Fade","MenuItem","Divider","redirectToCategory","AppBar","Toolbar","IconButton","edge","MenuIcon","NavLink","activeStyle","fontWeight","Layout","CssBaseline","media","CategoryCard","Card","CardActionArea","handleCardClick","CardMedia","image","CardContent","gutterBottom","Description","marginBottom","short","CategoryCardSkeleton","key","Skeleton","maxWidth","header","img","maxHeight","overflow","objectFit","AutoPlaySwipeableViews","autoPlay","SwipeableViews","BanerSlider","_banners$length","useTheme","activeStep","setActiveStep","banners","setBanners","maxSteps","setMaxSteps","bannersQuery","list","Paper","square","elevation","buttonText","axis","direction","index","onChangeIndex","enableMouseEvents","interval","abs","src","isMobile","mobileImageUrl","imageUrl","alt","externalUrl","handleClickBaner","MobileStepper","steps","nextButton","size","handleNext","prevActiveStep","KeyboardArrowLeft","KeyboardArrowRight","backButton","handleBack","UncategorizedCard","placeholderImg","paddingRight","grid","CategoriesView","_photographer$photogr","dispatch","productsQuery","showOtherCategory","productsList","_p$categories","categories","isAutoGenerated","isLoading","type","Grid","xs","sm","md","lg","xl","borderColor","borderRadius","paddingTop","paddingBottom","RoundButton","aligner","thumbnail","wordWrap","down","centerVertical","failure","FileListItem","file","hideIncrease","hideQuantity","orderDispatch","useOrder","status","CircularProgress","DoneIcon","ErrorOutlineIcon","handleRemoveQuantity","payload","guid","RemoveCircleOutlineIcon","handleAddQuantity","AddCircleOutlineIcon","cardDesc","lineHeight","PriceRangeList","_product$productPrice","calculateRangePrice","isDeleted","Box","groupName","margin","groupSelection","attributeButton","attributeRow","mb16","AttributesList","_product$attributes","pack","useMediaQuery","isAttributeChangeValid","attributeId","newProductCode","shouldCheckDefault","currentConfig","selection","firstAttribute","potentialProduct","autoGeneratedDefinition","isHidden","getButtonVariant","opt","renderAttributes","gIdx","isActive","idx","disableElevation","handleAttributeClick","newConfig","name","createGuid","replace","r","random","toString","actionButtons","right","top","palette","grey","fillWidth","p6","centerContent","flexDirection","spaceBetweenContent","description","mb24","NextButton","withStyles","OptionsButton","RemoveButton","BasicDialog","_product$imageUrl","isOpen","closeFn","fileInput","scrollToRef","scrollOptionsRef","setPack","Dialog","fullScreen","MobileView","sx","BackIcon","DialogContent","DialogContentText","Container","inputprops","accept","multiple","onChange","files","i","trackingGuid","reader","FileReader","readAsDataURL","onloadend","orderItem","maxSize","URL","createObjectURL","scrollIntoView","behavior","block","inline","input","click","AddPhotoAlternateIcon","calculatePrice","reduce","sum","renderFiles","_order$orderItems$fil","DialogActions","handleRemoveAll","Hidden","mdUp","executeOptionsScroll","BasicDialogNaturalProduct","_config$configs$find","_product$attributes$f","join","allreadyOrdered","fetch","blob","onload","handleAddProduct","renderAtributes","left","badge","prints","CardBadge","Chip","label","backgroundSize","cardArea","cardTitle","cardTitleBox","ProductBasicCard","itemId","useLocation","useParams","isDialogOpen","setDialogOpen","handleClose","location","pathname","newUrl","slice","handleOpen","productType","visible","hidden","centerHorizontal","stepperContainer","thumbImage","marginTop","thumbImageSelected","w100","canvasWrapper","Presenter3d","m6","btnContainer","Render3dDialog","Frame","frameUrl","backPhotoLayersConfig","selectedId","hideSelectors","frameImg","useImage","selectedPhoto","iL","Layer","listening","Image","Rect","stroke","strokeWidth","TextLayer","setConfig","onSelect","textRef","offsetX","setOffsetX","offsetY","setOffsetY","textWidth","textHeight","Text","rotation","text","fontFamily","fill","fillColor","strokeColor","draggable","onTap","onDragEnd","e","_lastPos","TransformableImage","shapeProps","imgRef","isSelected","isEditable","indexOf","el","onTransformEnd","node","scaleX","scaleY","max","menuBtn","BackBtn","fun","UndoIcon","oneLineTextPlaceholderSmall","oneLineTextPlaceholderBig","manuPlaceholder","shapeManuPlaceholder","resizeLabel","textTransform","TextTransformer","textSelectedId","setTextSelectedId","textLayers","setTextLayers","sizeRation","menuState","setMenuState","setRotation","setScale","setPosition","selectedText","mainMenu","value","newTextLayers","editedTextLayer","Select","labelId","font","FormatShapesIcon","ColorLensIcon","shapeMenu","min","parseInt","colorsMenu","ColorPicker","defaultValue","console","log","icon","scaleAndRotationPlaceholder","resizeBtn","changeFileBtn","ScaleAndRotationTransformer","initPos","isFrontPhoto","replaceFileBtn","removeFileBtn","setSelectId","showRotationBtn","setShowRotationBtn","showResizeBtn","setShowResizeBtn","s","attrs","setAttrs","rotationBtn","Btn","RotateRightIcon","AspectRatioIcon","buttons","noPhotoSelected","smallLineHeight","addText","addFloatingImageBtn","replaceTemplateBtn","resetImageBtn","WallpaperIcon","PhotoFrame","stepData","photos","setSelectedPhoto","setEditorRef","setEditorRatio","transformerPosition","setTransformerPosition","parentWidth","setParentWidth","frameWidth","setFrameWidth","frameHeight","setFrameHeight","ratio","setRatio","setBackPhotoLayersConfig","backPhotoLayers","setBackPhotoLayers","frontPhotoLayers","setFrontPhotoLayers","trRef","stageRef","parentRef","useImageSize","initialize","newParentWidth","d","productConfig","positionX","positionY","clipX","clipY","clipWidth","clipHeight","newBackPhotoLayers","photo","newBackPhotoLayer","naturalWidth","naturalHeight","newFrontPhotoLayers","regex","photoGuid","matchAll","frontPhotoLayer","fpl","nodes","getLayer","batchDraw","backPhotoSelectedIdx","frontPhotoSelectedIdx","checkDeselect","getStage","newTextLayer","composerView","Stage","onMouseDown","onTouchStart","rect","newAttrs","rects","textLayer","stepSelected","minheight","shareBox","newLines","previewImage","previewLabel","returnToPageBtn","bottom","background","vericalMiddleOnMobile","transform","OtherButton","LinearProgressWithLabel","mr","LinearProgress","minWidth","Render3dWizard","copied","setCopied","finalImage","setFinalImage","refresh","setRefresh","isShareOpen","setIsShareOpen","editorRef","editorRatio","setHideSelectors","drawingCanvasRef","saveTexture","getOrderItem","items","useMemo","images","sizeConfig","getProductConfig","getSteps","last","handleStep","newOrderItem","isShareDisabled","isAcceptUploading","acceptedItem","isThisLastStep","showShareButton","showNextButton","handleUploadClick","fileInputAddHandler","tempImg","fileInputUpateHandler","_files$","_steps$activeStep$dat","newFile","currentItem","oldGuid","newGuid","setTimeout","prev","scroll","Stepper","alternativeLabel","nonLinear","_step$data$","buttonProps","EditIcon","VisibilityIcon","optional","DoneAllIcon","Step","StepButton","stepImages","CachedIcon","DeleteOutlineOutlined","AddPhotoAlternateOutlined","layerImageUrl","uri","toDataURL","pixelRatio","isShareDisabledResult","showAcceptButton","onClickOLD","shareImg","CopyToClipboard","shareUrl","_item$fileUrl","baseUrl","origin","fullGuidUrl","storageUrl","shortGuid","encodedGuid","encodeURIComponent","Basic3dDialog","_order$orderItemsConf","_selectedAttributesFu","_selectedAttributesFu2","_selectedProduct$imag","_selectedProduct$file","open3d","setOpen3d","getMaxFileLimit","_product$sizes$length","_product$sizes","getUploadedFilesCount","_order$orderItems","_uploadedFiles$length","uploadedFiles","orderItemsConfigs","oic","groups","Object","keys","_orderItemsConfigs$fi","selectedAttributesFull","_groups$a$groupId","selectedProduct","mainProductId","every","selectedModel","selectedProductImg","replaceAll","limit","actual","disableUploadButton","isNextDisabled","isUploadingFiles","visibilityChange","msHidden","webkitHidden","RenderAlbumWizard","_steps$activeStep$dat2","_steps$activeStep$dat3","finalImages","setFinalImages","lastActivatedStep","setLastActivatedStep","pausing","setPausing","selectedFrames","setSelectedFrames","placeholderImages","setPlaceholderImages","runSetAllSelectedFrames","setRunSetAllSelectedFrames","enableReturnToPreviewBtn","setEnableReturnToPreviewBtn","allImagesLoaded","oi","maxPerPage","values","page","acc","_groups$a$attributesG","pageCount","saf","extraItem","layerImageUrls","saveImg","mimeType","quality","uriMini","newFinalImages","operation","confirm","newSteps","editSteps","Array","apply","liu","prevPageImages","ii","j","es","flat","getProductConfigForPage","undefined","fi","getUplodingProgress","acceptedItems","ai","isIdle","some","oI","newPlaceholderImages","setOneSelectedFrame","pageNum","templateNum","newSelectedFrames","count","setAllSelectedFrames","coverPagesCount","pageUsage","pageUsageWithNoCover","shift","pages","distributePhotos","nums","schemas","backtrack","remaining","currentCombination","start","pop","schema","curr","match","pageSchema","_sizesForPage$","sizesForPage","images2","imagesCount","_images","idexs","idxs","v","_images2","idex","floor","newSelectedFrame","clearSelectedFrames","DialogTitle","sI","_step$data$i$productC","_d$productConfig","liuIdx","newEditorRef","hadleReturnToPage","visibility","handleReturnToPreview","BasicAlbumDialog","openAlbum","setOpenAlbum","selectedPhotoCount","setSelectedPhotoCount","getMinFileLimit","minPerPage","resizeBase64","newWidth","newHeight","createElement","ctx","getContext","drawImage","maxLimit","minLimit","reload","RenderCalendarWizard","si","isCover","BasicCalendarDialog","_product$sizes$flat$l","ProductRenderCard","is3d","isAlbum","isCalendar","TYPES","ProductTypeRenderer","objUrl","filterButton","dialogTitle","filterSection","filterGroupTitle","formGroup","dialogActions","clearButton","gap","loadingContainer","ProductFilters","availableTagGroups","selectedFilters","onFilterChange","setOpen","tempFilters","setTempFilters","tags","Badge","badgeContent","getTotalFiltersCount","_selectedFilters$tags","anchorOrigin","vertical","horizontal","startIcon","FilterListIcon","disableTypography","CloseIcon","tagGroup","_tagGroup$tags","FormGroup","tag","FormControlLabel","control","Checkbox","checked","handleTempFilterChange","handleClearFilters","ClearAllIcon","handleDone","ProductsView","categoryId","setSelectedFilters","availableTags","setAvailableTags","handleFilterChange","newFilters","renderProducts","catId","prod","fProduct","subProducts","uniqueTags","from","Map","flatMap","tagGroups","_tag","_tag$tagIds","tagIds","_photographer$tags","_product$tags","_product$subProducts","hasMatchingTag","hasMatchingSubProductTag","subProduct","_subProduct$tags","productToChange","pl","isText","RegExp","isEmail","isPhoneGeneral","isNumber","formValidationHelper","validate","minLength","maxLength","test","valueValidationHelper","rules","progress","ActiveButton","DisabledButton","HtmlTooltip","tooltip","typography","pxToRem","Tooltip","SendOrderButton","tooltipOpen","setTooltipOpen","clearMissingValue","RenderButton","errors","validateSendOrder","validateFirstName","validateLastName","validatePhone","ClickAwayListener","onClickAway","arrow","enterDelay","leaveDelay","Fragment","onMouseEnter","gridContainer","mb28","typoCenter","SummaryTab","setTotal","newTotal","sumQty","shippingPrice","renderUploadedFilesinfo","renderPrintsInfo","printsOrdered","textfield","fieldValidation","UserBasicInfo","_props$isFromCheckout","formValues","setFormValues","formErrors","setFormErrors","handleFormChange","TextField","required","helperText","isFromCheckout","shippingName","shippingEmail","IOSSwitch","switchBase","common","white","thumb","track","focusVisible","Switch","focusVisibleClassName","disableRipple","UserDeliveryInfo","setShippingName","setShippingAddress","setShippingEmail","shipping","paymentInfo","gridCard","green","red","cardState","UserPaymentInfo","ChangePaymentMethod","IsBankTransferPossible","IsVivaWalletTransferPossible","IsSelected","_order$paymentMethod","iban","StoreIcon","AccountBalanceIcon","CreditCardIcon","gridConainer","logo","noPadding","ThankYouCard","logoUrl","align","companyName","street","href","website","CheckoutView","showThankYou","ContactCard","ContactView","UploadManager","sending","setSending","setInterval","itemToUpload","ImageUri","ImageGuid","catch","uploadFiles","notDeliveredFiles","tryFinalizeOrder","clearInterval","UncategorizedView","backdrop","spinner","SuspenseContainer","OrderIndex","_match$params$id","_match$params","_match$params$id2","_match$params2","_match$params4","_match$params$id3","_match$params5","endsWith","cleanMatchUrl","alertDispatch","useAlerts","photographerQuery","params","_match$params3","PhotographerId","OrderId","Backdrop","query","isFetching","Suspense","fallback","_query$data","_query$data2","_query$data2$Categori","isSuccess","Categories","redirectCategoriesFlag","Redirect","exact","_query$data3","_query$data4","_query$data4$Categori","redirectProductsFlag","Route","path"],"mappings":"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","file":"static/js/views-photographer.b5b7a093.chunk.js","sourcesContent":["const calculateAttributeGroups = (product, photographer) => {\r\n const groupIds = [\r\n ...new Set(product.attributes.map((p) => p.attributesGroupId)),\r\n ];\r\n return photographer.productAttributes.filter((a) => groupIds.includes(a.Id));\r\n};\r\n\r\nconst calculateAttributes = (group, product) => {\r\n return product.attributes\r\n .filter((a) => a.attributesGroupId === group.Id)\r\n .sort((a, b) => a.position < b.position);\r\n};\r\n\r\nexport function getSelectedAttributes(productId, order, photographer) {\r\n if (!photographer.products) return [];\r\n const product = photographer.products.find((p) => p.id === productId);\r\n if (!product) return [];\r\n if (!order) return [];\r\n\r\n const attributesGroups = calculateAttributeGroups(product, photographer);\r\n\r\n const selectedAttributes = attributesGroups.map((g) => {\r\n const availableAttributes = calculateAttributes(g, product);\r\n\r\n const { orderItemsConfig } = order;\r\n const actualConfigs = orderItemsConfig.find(\r\n (c) => c.productId === productId\r\n );\r\n if (actualConfigs && actualConfigs.configs?.length > 0) {\r\n const configExist = actualConfigs.configs.find((c) => c.groupId === g.Id);\r\n if (configExist) {\r\n const selectedAttribute = availableAttributes.find(\r\n (a) => a.id === configExist.selected\r\n );\r\n if (selectedAttribute) return selectedAttribute;\r\n }\r\n }\r\n\r\n return availableAttributes[0];\r\n });\r\n\r\n return selectedAttributes ?? [];\r\n}\r\n","import { getSelectedAttributes } from './attributesHelper';\r\n\r\nexport function formatPrice(num) {\r\n if (typeof num !== 'number') return null;\r\n const result = Math.round((num + Number.EPSILON) * 100) / 100;\r\n return `${result.toFixed(2)}`;\r\n}\r\n\r\nfunction priceCalculator(productId, quantity, photographer, order) {\r\n const product = photographer.products.find((p) => p.id === productId);\r\n if (!product) throw new Error('Missing product info, cant calculate price');\r\n\r\n let priceUnitBase = 0;\r\n let priceUnitModificator = 0;\r\n let priceUnitPercentModificator = 1;\r\n\r\n let estimatedPrice = 0;\r\n let estimatedQuantity = quantity;\r\n\r\n let productBasePrices = null;\r\n\r\n const { price, productPrices } = product;\r\n if (price) priceUnitBase = price;\r\n\r\n const { quantityRangeMin, quantityRangeMax } = product;\r\n if (\r\n quantityRangeMin &&\r\n quantityRangeMin > 0 &&\r\n quantityRangeMax &&\r\n quantityRangeMax >= quantityRangeMin\r\n ) {\r\n let step = 1;\r\n while(quantity > quantityRangeMax * step){\r\n step++;\r\n }\r\n estimatedQuantity = step;\r\n }else{\r\n estimatedQuantity=quantity;\r\n }\r\n\r\n //calculate base price for given range\r\n if (productPrices && productPrices.length > 0) {\r\n priceUnitBase = productPrices[0].price;\r\n\r\n productPrices.forEach((p) => {\r\n if (p.priceLevelFrom > estimatedQuantity) return;\r\n\r\n if (p.priceLevelTo >= estimatedQuantity || p.priceLevelTo == 0) {\r\n priceUnitBase = p.price;\r\n }\r\n });\r\n estimatedPrice = priceUnitBase;\r\n }\r\n\r\n //calculate by attributes\r\n const attributes = getSelectedAttributes(productId, order, photographer)\r\n .sort((a,b)=>b.priceCorrectionPercent - a.priceCorrectionPercent);\r\n\r\n if (attributes && attributes.length > 0) {\r\n const percentValues = attributes.map(a=>a.priceCorrectionPercent);\r\n\r\n percentValues.forEach(pV =>{\r\n if(pV != 0){\r\n estimatedPrice *= pV / 100;\r\n priceUnitPercentModificator *= pV/100;\r\n }\r\n });\r\n\r\n attributes.forEach(a=>{\r\n if(a.priceCorrectionCurrent != 0){\r\n estimatedPrice += a.priceCorrectionCurrent;\r\n priceUnitModificator += a.priceCorrectionCurrent;\r\n }\r\n })\r\n estimatedPrice = Math.round(estimatedPrice * 100) / 100;\r\n }\r\n\r\n //prepare product base range prices\r\n if (productPrices && productPrices.length > 0) {\r\n productBasePrices = productPrices.map((p) => {\r\n let result = { ...p };\r\n const calculatedPrice = (p.price * priceUnitPercentModificator)+priceUnitModificator;\r\n result.price = Math.round(calculatedPrice * 100) / 100;\r\n return result;\r\n });\r\n }\r\n\r\n const result = {\r\n priceUnitBase,\r\n productBasePrices,\r\n priceUnitModificator,\r\n priceUnitPercentModificator,\r\n estimatedPrice,\r\n estimatedQuantity,\r\n finalPrice: estimatedPrice * estimatedQuantity,\r\n };\r\n\r\n return result;\r\n}\r\n\r\nexport function getLabelPrice(productId, quantity, photographer, order) {\r\n const calculation = priceCalculator(productId, quantity || 1, photographer, order);\r\n if (calculation) return calculation.finalPrice;\r\n\r\n return 0;\r\n}\r\n\r\nexport function getPrice(productId, quantity, photographer, order) {\r\n const calculation = priceCalculator(productId, quantity, photographer, order);\r\n if (calculation) return calculation.finalPrice;\r\n\r\n return 0;\r\n}\r\n\r\nexport function getRangePrice(productId, priceId, photographer, order) {\r\n const calculation = priceCalculator(productId, 1, photographer, order);\r\n if (calculation && calculation.productBasePrices) {\r\n const priceRange = calculation.productBasePrices.find(\r\n (p) => p.id === priceId\r\n );\r\n if (priceRange) return priceRange.price;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nexport function getShare3dPrice(product) {\r\n if (!product) return 0;\r\n var { productPrices } = product;\r\n if (!productPrices || productPrices.length == 0) return 0;\r\n\r\n const lowestPrice = productPrices.reduce((acc, loc) =>\r\n acc.price < loc.price ? acc : loc\r\n );\r\n return lowestPrice.price;\r\n}\r\n","//Core\r\nimport { useQuery, useMutation, useQueryClient } from 'react-query';\r\n\r\n//Components\r\nimport OrderService from './OrderService';\r\n\r\nfunction useGetPhotographer(id) {\r\n const service = OrderService();\r\n let success = true;\r\n const photographerId = Number(id);\r\n const enabledOption = photographerId > 0;\r\n const result = useQuery(\r\n ['photographer-data', photographerId],\r\n async () => {\r\n const resp = await service.GetPhotographer(photographerId).then(\r\n (res) => res.data,\r\n (err) => {\r\n success = false;\r\n return err;\r\n }\r\n );\r\n if (!success) {\r\n throw new Error(resp);\r\n }\r\n\r\n return resp;\r\n },\r\n {\r\n enabled: enabledOption,\r\n }\r\n );\r\n return { ...result };\r\n}\r\n\r\nfunction useGetBanners(id) {\r\n const service = OrderService();\r\n let success = true;\r\n const photographerId = Number(id);\r\n const enabledOption = photographerId > 0;\r\n const result = useQuery(\r\n ['photographer-banners', photographerId],\r\n async () => {\r\n const resp = await service.GetBanners(photographerId).then(\r\n (res) => res.data,\r\n (err) => {\r\n success = false;\r\n return err;\r\n }\r\n );\r\n if (!success) {\r\n throw new Error(resp);\r\n }\r\n\r\n return resp;\r\n },\r\n {\r\n enabled: enabledOption,\r\n }\r\n );\r\n return { ...result };\r\n}\r\n\r\nfunction useGetProducts(id) {\r\n const service = OrderService();\r\n let success = true;\r\n const photographerId = Number(id);\r\n const enabledOption = photographerId > 0;\r\n const result = useQuery(\r\n ['photographer-products', photographerId],\r\n async () => {\r\n const resp = await service.GetProducts(photographerId).then(\r\n (res) => res.data,\r\n (err) => {\r\n success = false;\r\n return err;\r\n }\r\n );\r\n if (!success) {\r\n throw new Error(resp);\r\n }\r\n\r\n return resp;\r\n },\r\n {\r\n enabled: enabledOption,\r\n }\r\n );\r\n return { ...result };\r\n}\r\n\r\nexport { useGetPhotographer, useGetProducts, useGetBanners };\r\n","const THREE = require('three');\r\nconst OrbitControls = require('three-orbitcontrols');\r\n\r\nexport default class Environment {\r\n constructor(place, canvas, parameters) {\r\n const container = place;\r\n this.scene = new THREE.Scene();\r\n\r\n // console.log(container);\r\n this.parameters = parameters;\r\n this.canvas = canvas;\r\n this.width = container.clientWidth;\r\n this.height = container.clientHeight;\r\n this.container = container;\r\n this.createRenderer();\r\n this.createCamera();\r\n this.createOrbit();\r\n this.createLights();\r\n window.addEventListener('resize', () => this.windowResize(), false);\r\n }\r\n\r\n createRenderer() {\r\n const renderer = new THREE.WebGLRenderer({\r\n canvas: this.canvas,\r\n antialias: true,\r\n alpha: true,\r\n preserveDrawingBuffer: true,\r\n });\r\n this.renderer = renderer;\r\n }\r\n\r\n setCameraSettings() {\r\n const { camera, width, height, parameters, renderer } = this;\r\n\r\n camera.lookAt(new THREE.Vector3(0, 0, 0));\r\n\r\n camera.aspect = width / height;\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(width, height);\r\n\r\n const fullWidth = width * 2;\r\n const fullHeight = height * 1;\r\n\r\n camera.setViewOffset(\r\n fullWidth,\r\n fullHeight,\r\n width * (width >= 900 ? parameters.center : 0.5),\r\n height * 0,\r\n width,\r\n height\r\n );\r\n\r\n camera.updateProjectionMatrix();\r\n }\r\n\r\n createCamera() {\r\n const { scene, width, height, parameters } = this;\r\n\r\n const camera = new THREE.PerspectiveCamera(26, width / height, 1, 3500);\r\n camera.position.set(3, 2, -2);\r\n\r\n scene.fog = new THREE.Fog(0xffffff, 1300, 1500);\r\n\r\n this.scene.add(camera);\r\n this.camera = camera;\r\n\r\n this.setCameraSettings();\r\n }\r\n\r\n windowResize() {\r\n // console.log('windowResize', this);\r\n\r\n this.width = this.container.clientWidth;\r\n this.height = this.container.clientHeight;\r\n\r\n const { camera, width, height, parameters } = this;\r\n\r\n this.setCameraSettings();\r\n }\r\n\r\n createLights() {\r\n const { scene, parameters } = this;\r\n const light = new THREE.DirectionalLight(0xffffff, 0.4);\r\n\r\n const theta = Math.PI * (0.26 - 0.5);\r\n const phi = 2 * Math.PI * (0.205 - 0.5);\r\n light.position.x = -parameters.distance * Math.cos(phi * 2);\r\n // light.position.y = parameters.distance * Math.sin(phi) * Math.sin(theta);\r\n light.position.y = parameters.distance * Math.sin(phi) * Math.sin(theta);\r\n light.position.z = parameters.distance * Math.sin(phi) * Math.cos(theta);\r\n this.light = light;\r\n scene.add(light);\r\n\r\n const lightAmbient = new THREE.AmbientLight(0xffffff, 0.6); // soft white light\r\n scene.add(lightAmbient);\r\n this.lightAmbient = lightAmbient;\r\n\r\n const lightBack = new THREE.PointLight(0xffffff, 0.45);\r\n lightBack.position.x = parameters.distance * Math.cos(phi * 2);\r\n lightBack.position.y =\r\n (parameters.distance * Math.sin(phi) * Math.sin(theta)) / 2;\r\n lightBack.position.z =\r\n -parameters.distance * Math.sin(phi) * Math.cos(theta);\r\n this.lightBack = lightBack;\r\n scene.add(lightBack);\r\n }\r\n\r\n createOrbit() {\r\n const controlsEl = this.container;\r\n const controls = new OrbitControls(this.camera, controlsEl);\r\n window.controls = controls;\r\n\r\n controlsEl.addEventListener('focus', () => {\r\n // console.log('controls: ', controls);\r\n this.controls.enableKeys = true;\r\n this.controls.autoRotate = false;\r\n this.controls.enableZoom = true;\r\n });\r\n controlsEl.addEventListener('blur', () => {\r\n // console.log('controls: ', controls);\r\n this.controls.enableKeys = false;\r\n this.controls.enableZoom = false;\r\n this.controls.autoRotate = this.parameters.rotate;\r\n });\r\n controls.maxPolarAngle = Math.PI * 0.8;\r\n controls.minPolarAngle = Math.PI * 0.1;\r\n controls.enableKeys = false;\r\n controls.enableZoom = false;\r\n controls.target.set(0, this.parameters.hpoint, 0);\r\n controls.minDistance = 1.0;\r\n controls.maxDistance = 300.0;\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.1;\r\n controls.screenSpacePanning = true;\r\n controls.rotateSpeed = 0.5;\r\n controls.panSpeed = 1;\r\n controls.autoRotate = this.parameters.rotate;\r\n // controls.autoRotateSpeed = 0.05;\r\n controls.autoRotateSpeed = 0.8;\r\n\r\n this.controls = controls;\r\n this.controlsEl = controlsEl;\r\n }\r\n\r\n render() {\r\n // console.log(\"lol\")\r\n\r\n const { renderer, scene, camera, controls } = this;\r\n const cameraDist = this.camera.position.distanceTo(controls.target) + 20;\r\n scene.fog = new THREE.Fog(0xffffff, cameraDist, cameraDist * 2.8);\r\n controls.update();\r\n renderer.render(scene, camera);\r\n\r\n // requestAnimationFrame(() => this.render());\r\n }\r\n}\r\n","/* eslint-disable */\r\n\r\nconst THREE = require('three');\r\n\r\nconst OBJLoader = require('three-obj-loader');\r\nOBJLoader(THREE);\r\n\r\nconst ModelLoader = new THREE.OBJLoader();\r\n\r\nexport default class ModelMaping {\r\n constructor(environment, materials, url, loadingElement) {\r\n this.primeryModel = {};\r\n this.environment = environment;\r\n this.scene = environment.scene;\r\n this.loadingElement = loadingElement;\r\n this.materials = materials;\r\n this.modelUrl = url;\r\n\r\n this.textureLoader = new THREE.TextureLoader();\r\n this.CubeTextureLoader = new THREE.CubeTextureLoader();\r\n\r\n this.loading = true;\r\n\r\n if (url) this.setModel(url);\r\n }\r\n setLoading(state) {\r\n this.loading = state;\r\n if (this.loadingElement) {\r\n state\r\n ? this.loadingElement.classList.add('canvasContainer-loading--active')\r\n : this.loadingElement.classList.remove(\r\n 'canvasContainer-loading--active'\r\n );\r\n }\r\n }\r\n setModel(url) {\r\n const { scene } = this;\r\n // console.log(scene);\r\n if (this.primeryModel) {\r\n scene.remove(this.primeryModel);\r\n }\r\n this.loadModel(url).then((model) => {\r\n this.primeryModel = model;\r\n scene.add(model);\r\n });\r\n }\r\n loadModel(url) {\r\n const { materials } = this;\r\n return new Promise((resolve, reject) => {\r\n this.setLoading(true);\r\n ModelLoader.load(\r\n url,\r\n (object) => {\r\n object.children.material = [materials.test1, materials.test2];\r\n object.children[0].material = materials.texture;\r\n object.children[1].material = materials.body;\r\n if(object.children[2]){\r\n object.children[2].material = materials.inside;\r\n }\r\n if(object.children[3]){\r\n object.children[3].material = materials.handle;\r\n }\r\n this.setLoading(false);\r\n resolve(object);\r\n },\r\n (xhr) => {\r\n // console.log((xhr.loaded / xhr.total) * 100 + '%');\r\n if (xhr.loaded / xhr.total == 1) this.setLoading(true);\r\n },\r\n (error) => {\r\n // console.log('An error happened');\r\n this.setLoading(false);\r\n reject();\r\n }\r\n );\r\n });\r\n }\r\n setTexture(url) {\r\n const { materials } = this;\r\n if (url) {\r\n materials.texture.map = this.loadTexture(url);\r\n } else {\r\n materials.texture.map = false;\r\n }\r\n }\r\n loadTexture(url) {\r\n this.setLoading(true);\r\n return this.textureLoader.load(\r\n url,\r\n (object) => {\r\n this.setLoading(false);\r\n },\r\n (object) => {\r\n this.setLoading(false);\r\n }\r\n );\r\n }\r\n}\r\n","//Core\r\nimport React, { useLayoutEffect, useEffect, useRef, useState } from 'react';\r\n\r\n//Components\r\nimport Environment from './lib/Environment';\r\nimport ModelMaping from './lib/ModelMapping';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\n// import model3d from '../../assets/mouse pad.obj';\r\n// import model3d from '../../assets/tshirt.obj';\r\n// import model3d from '../../assets/kubek_heart.obj';\r\n// import model3d from '../../assets/kubek_heart_mini.obj';\r\n// import model3d from '../../assets/pillow.obj';\r\n// import model3d from '../../assets/kubek4.obj';\r\n\r\nconst THREE = require('three');\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst View3d = ({ textureUrl, modelUrl, saveFn, attributes }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const canvas = useRef(null);\r\n const canvasContainer = useRef(null);\r\n const canvasContainerLoading = useRef(null);\r\n const [curentModel, setCurentModel] = useState(null);\r\n\r\n useLayoutEffect(() => {\r\n const bodyColorHex = attributes.find(a=>a.configuration?.hex)?.configuration.hex.split(\";\")[0] || attributes.find(a=>a.configuration?.bodyhex)?.configuration.bodyhex.split(\";\")[0];\r\n const bodyColor = Number(\"0x\" + (bodyColorHex || \"ffffff\"));\r\n const insideColor = Number(\"0x\" + (attributes.find(a=>a.configuration?.insidehex)?.configuration.insidehex.split(\";\")[0] || \"ffffff\"));\r\n const handleColor = Number(\"0x\" + (attributes.find(a=>a.configuration?.handlehex)?.configuration.handlehex.split(\";\")[0] || \"ffffff\"));\r\n\r\n const bodyShininessHex = attributes.find(a=>a.configuration?.hex)?.configuration.hex.split(\";\")[1] || attributes.find(a=>a.configuration?.bodyhex)?.configuration.bodyhex.split(\";\")[1];\r\n const bodyShininess = Number(\"0x\" + (bodyShininessHex || \"200\"));\r\n const insideShininess = Number(\"0x\" + (attributes.find(a=>a.configuration?.insidehex)?.configuration.insidehex.split(\";\")[1] || \"200\"));\r\n const handleShininess = Number(\"0x\" + (attributes.find(a=>a.configuration?.handlehex)?.configuration.handlehex.split(\";\")[1] || \"200\"));\r\n\r\n const materials = {\r\n shadow: new THREE.MeshBasicMaterial({\r\n color: '0x000000',\r\n // alphaMap: textureShadow,\r\n transparent: true,\r\n // depthWrite: false,\r\n opacity: THREE.Math.lerp(1, 0.25, 0.5),\r\n }),\r\n texture: new THREE.MeshPhongMaterial({\r\n color: 0xffffff,\r\n shininess: bodyShininess,\r\n reflectivity: 0.8,\r\n side: THREE.DoubleSide\r\n }),\r\n body: new THREE.MeshPhongMaterial({\r\n color: bodyColor,\r\n shininess: bodyShininess,\r\n reflectivity: 0.8,\r\n side: THREE.DoubleSide\r\n }),\r\n inside: new THREE.MeshPhongMaterial({\r\n color: insideColor,\r\n shininess: insideShininess,\r\n reflectivity: 0.8,\r\n side: THREE.DoubleSide\r\n }),\r\n handle: new THREE.MeshPhongMaterial({\r\n color: handleColor,\r\n shininess: handleShininess,\r\n reflectivity: 0.8,\r\n side: THREE.DoubleSide\r\n }),\r\n };\r\n\r\n const parameters = {\r\n distance: 200,\r\n hpoint: 0,\r\n rotate: true,\r\n center: 0.5,\r\n };\r\n\r\n const environment = new Environment(\r\n canvasContainer.current,\r\n canvas.current,\r\n parameters\r\n );\r\n const myModel = new ModelMaping(\r\n environment,\r\n materials,\r\n // model3d,\r\n modelUrl,\r\n canvasContainerLoading.current\r\n );\r\n\r\n setCurentModel(myModel);\r\n\r\n myModel.setTexture(textureUrl);\r\n\r\n const animation = () => {\r\n if (!myModel.loading && canvas.current) {\r\n const canvasRatio = canvas.current.offsetWidth/canvas.current.offsetHeight;\r\n if(canvasRatio < 0.9){\r\n myModel.primeryModel?.scale?.set(canvasRatio, canvasRatio, canvasRatio);\r\n }\r\n environment.render();\r\n }\r\n requestAnimationFrame(animation);\r\n };\r\n animation();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [attributes]);\r\n\r\n useEffect(() => {\r\n if (!textureUrl) return;\r\n if (!curentModel) return;\r\n\r\n curentModel.setTexture(textureUrl);\r\n const model = {\r\n fileAsBase64: textureUrl,\r\n };\r\n saveFn(model);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [textureUrl]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default View3d;\r\n","import axios from 'axios';\r\n\r\nexport default axios.create({\r\n baseURL: `${process.env.REACT_APP_LEGACY_API_PATH}`,\r\n});\r\n","import axios from 'axios';\r\n\r\nexport default axios.create({\r\n baseURL: `${process.env.REACT_APP_NEW_API_PATH}`,\r\n});\r\n","import legacy from '../core/legacyAPI';\r\nimport api from '../core/newAPI';\r\n\r\nconst OrderService = () => {\r\n function GetPhotographer(id) {\r\n const endpoint = `photographer/${id}`;\r\n return legacy.get(endpoint);\r\n }\r\n\r\n function GetProducts(id) {\r\n const endpoint = `products/photographer/${id}`;\r\n return api.get(endpoint);\r\n }\r\n\r\n function GetBanners(photographerId) {\r\n const endpoint = `Advertisement/Photographer/${photographerId}`;\r\n return api.get(endpoint);\r\n }\r\n\r\n function CreateOrder(id) {\r\n const endpoint = `photographer/${id}/order`;\r\n const body = {\r\n email: 'missing',\r\n firstName: 'missing',\r\n lastName: 'missing',\r\n phone: 'missing',\r\n orderItems: [],\r\n };\r\n return legacy.post(endpoint, body);\r\n }\r\n\r\n function FinalizeOrder(order, photographer) {\r\n const endpoint = `photographer/order/${order.orderId}`;\r\n\r\n const { productAttributes } = photographer;\r\n const { orderItemsConfig } = order;\r\n\r\n //get greoups and default values\r\n let defaultAttributes = productAttributes.map((group) => {\r\n let att;\r\n if (group.Attributes.length > 0) {\r\n att = group.Attributes[0];\r\n }\r\n return {\r\n groupId: group.Id,\r\n selected: att?.Id,\r\n };\r\n });\r\n\r\n const orderedItems = order.orderItems.map((item) => {\r\n let itemAttributes = [];\r\n\r\n const productInfo = photographer.products.find(\r\n (pa) => pa.id === item.productId\r\n );\r\n if (productInfo && productInfo.attributes?.length > 0) {\r\n const groupIds = [\r\n ...new Set(productInfo.attributes.map((p) => p.attributesGroupId)),\r\n ];\r\n //get item config from context:\r\n const config = orderItemsConfig.find(\r\n (c) => c.productId === item.productId\r\n );\r\n //read all selected items\r\n groupIds.map((id) => {\r\n const selectedValue = config?.configs?.find((c) => c.groupId === id);\r\n if (selectedValue) itemAttributes.push(selectedValue.selected);\r\n else {\r\n const defaultSelection = defaultAttributes.find(\r\n (a) => a.groupId === id\r\n );\r\n if (defaultSelection)\r\n itemAttributes.push(defaultSelection.selected);\r\n }\r\n });\r\n }\r\n\r\n let result = {\r\n FileName: item.fileName,\r\n FileGuid: item.imageGuid,\r\n FileUrl: item.fileUrl,\r\n ProductId: item.productId,\r\n Quantity: item.qty,\r\n Attributes: itemAttributes,\r\n };\r\n let layerIndex = -1;\r\n if (item.isLayerItem === true) {\r\n layerIndex++;\r\n const config = {\r\n X: 0,\r\n Y: 0,\r\n Width: 0,\r\n Height: 0,\r\n ScaleFactoryUp: 1,\r\n Guid: item.imageGuid,\r\n Index: layerIndex,\r\n };\r\n\r\n result.sizes = config;\r\n }\r\n\r\n return result;\r\n });\r\n\r\n const body = {\r\n FirstName: order.firstName,\r\n LastName: order.lastName,\r\n Phone: order.phone,\r\n Email: order.email,\r\n StreetAddress: order.shippingAddress,\r\n IsShippingChoosen: order.shippingSelected,\r\n OrderGuid: order.orderGuid,\r\n OrderItems: orderedItems,\r\n PaymentMethod: order.paymentMethod,\r\n };\r\n\r\n if (order.paymentMethod == 2) {\r\n var vivawalletUrl = photographer.vivawallet;\r\n\r\n window.open(vivawalletUrl);\r\n }\r\n\r\n return legacy.put(endpoint, body);\r\n }\r\n\r\n function MarkOrderAsDone(order) {\r\n const endpoint = `orders/${order.orderId}/done`;\r\n return legacy.post(endpoint, '');\r\n }\r\n\r\n function UploadImage(model) {\r\n const endpoint = `photographer/order/${model.orderId}/photo`;\r\n const body = {\r\n OrderGuid: model.orderGuid,\r\n ProductId: model.productId,\r\n FileAsBase64: model.fileAsBase64,\r\n FileName: model.fileName,\r\n TrackingGuid: model.fileGuid,\r\n Attributes: model.attributes,\r\n };\r\n return legacy.post(endpoint, body);\r\n }\r\n\r\n return {\r\n GetPhotographer,\r\n GetBanners,\r\n GetProducts,\r\n CreateOrder,\r\n FinalizeOrder,\r\n MarkOrderAsDone,\r\n UploadImage,\r\n };\r\n};\r\n\r\nexport default OrderService;\r\n","//Core\r\nimport React, { useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../contexts/PhotographerContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport AddShoppingCartIcon from '@material-ui/icons/AddShoppingCart';\r\nimport ContactPhoneIcon from '@material-ui/icons/ContactPhone';\r\nimport ShoppingCartIcon from '@material-ui/icons/ShoppingCart';\r\nimport ExpandLess from '@material-ui/icons/ExpandLess';\r\nimport ExpandMore from '@material-ui/icons/ExpandMore';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\r\nimport Divider from '@material-ui/core/Divider';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n gutters: {\r\n paddingLeft: 12,\r\n },\r\n}));\r\n\r\nconst MenuList = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [categoriesListOpen, setCategoriesListOpen] = useState(false);\r\n const [photographer] = usePhotographer();\r\n\r\n const renderProducts = () => {\r\n return (\r\n props.requestClose && props.requestClose()}\r\n component={Link}\r\n to={`/photographer/${props.photographerId}/products`}\r\n >\r\n \r\n \r\n \r\n {t('Products')}\r\n \r\n );\r\n };\r\n\r\n const renderCategories = () => {\r\n return (\r\n <>\r\n {\r\n setCategoriesListOpen(!categoriesListOpen);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {categoriesListOpen ? : }\r\n \r\n \r\n \r\n {photographer.productCategories.map((category) => {\r\n return (\r\n props.requestClose && props.requestClose()}\r\n component={Link}\r\n to={`/photographer/${photographer.photographId}/categories/${category.Id}`}\r\n >\r\n \r\n \r\n \r\n {category.Name}\r\n \r\n );\r\n })}\r\n props.requestClose && props.requestClose()}\r\n component={Link}\r\n to={`/photographer/${photographer.photographId}/uncategorized`}\r\n >\r\n \r\n \r\n \r\n {t('Others')}\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const renderProductsOrCategories = () => {\r\n if (photographer && photographer.productCategories?.length > 0) {\r\n return renderCategories();\r\n } else {\r\n return renderProducts();\r\n }\r\n };\r\n\r\n return (\r\n \r\n {renderProductsOrCategories()}\r\n props.requestClose && props.requestClose()}\r\n component={Link}\r\n to={`/photographer/${props.photographerId}/checkout`}\r\n >\r\n \r\n \r\n \r\n {t('Finish order')}\r\n \r\n props.requestClose && props.requestClose()}\r\n component={Link}\r\n to={`/photographer/${props.photographerId}/contact`}\r\n >\r\n \r\n \r\n \r\n {t('Contact')}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MenuList;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\nimport MenuList from './MenuList';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport Drawer from '@material-ui/core/Drawer';\r\nimport clsx from 'clsx'; // this is for controling dynamic class name assingment\r\n\r\nconst drawerWidth = 260;\r\nconst anchor = 'left';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n },\r\n drawerOpen: {\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerClose: {\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: theme.spacing(5) + 1,\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(6) + 1,\r\n },\r\n },\r\n toolbar: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(0, 1),\r\n minHeight: 48,\r\n // height: 35\r\n },\r\n}));\r\n\r\nconst MenuDrawer = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n return (\r\n props.requestClose && props.requestClose()}\r\n >\r\n props.requestClose && props.requestClose()}\r\n photographerId={props.photographerId}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default MenuDrawer;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\r\nimport TextFormatIcon from '@material-ui/icons/TextFormat';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n btn_group: {\r\n marginRight: '8px',\r\n },\r\n}));\r\n\r\nconst Zoom = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [zoom, setZoom] = useState(100);\r\n\r\n function setZoom100() {\r\n document.body.style.zoom = '100%';\r\n setZoom(100);\r\n }\r\n\r\n function setZoom125() {\r\n document.body.style.zoom = '125%';\r\n setZoom(125);\r\n }\r\n\r\n function setZoom150() {\r\n document.body.style.zoom = '150%';\r\n setZoom(150);\r\n }\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 \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Zoom;\r\n","//Core\r\nimport React, { useState } from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\n\r\n//Components\r\nimport MenuDrawer from './MenuDrawer';\r\nimport Zoom from './core/Zoom';\r\n\r\n//Hooks\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport clsx from 'clsx';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport ExpandMore from '@material-ui/icons/ExpandMore';\r\n\r\nconst drawerWidth = 260;\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n },\r\n toolbarIcon: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: '0 8px',\r\n ...theme.mixins.toolbar,\r\n },\r\n appBar: {\r\n backgroundColor: '#fff',\r\n color: '#8f8f8f',\r\n height: '64px',\r\n justifyContent: 'center',\r\n zIndex: theme.zIndex.drawer + 1,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n appBarShift: {\r\n marginLeft: drawerWidth,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n menuButton: {\r\n marginRight: 36,\r\n height: 20,\r\n width: 20,\r\n },\r\n closeButton: {\r\n height: 20,\r\n width: 20,\r\n },\r\n hide: {\r\n display: 'none',\r\n },\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n },\r\n drawerOpen: {\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerClose: {\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: theme.spacing(5) + 1,\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(6) + 1,\r\n },\r\n },\r\n toolbar: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n //justifyContent: 'flex-end',\r\n padding: theme.spacing(0, 1),\r\n minHeight: 48,\r\n // height: 35\r\n },\r\n regular: {\r\n minHeight: 48,\r\n },\r\n content: {\r\n flexGrow: 1,\r\n padding: theme.spacing(1),\r\n },\r\n gutters: {\r\n paddingLeft: 12,\r\n },\r\n title: {\r\n flexGrow: 1,\r\n },\r\n colorSecondary: {\r\n padding: 6,\r\n },\r\n link: {\r\n color: 'white',\r\n textDecoration: 'none',\r\n '&:focus': {\r\n outline: 0,\r\n border: 0,\r\n },\r\n },\r\n navButton: {\r\n color: '#8f8f8f',\r\n width: '100px',\r\n textAlign: 'center',\r\n marginLeft: '5px',\r\n marginRight: '5px',\r\n textDecoration: 'none',\r\n fontSize: '1rem',\r\n cursor: 'pointer',\r\n },\r\n categoryDiv: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n sectionDesktop: {\r\n display: 'none',\r\n alignItems: 'center',\r\n [theme.breakpoints.up('md')]: {\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'flex-end',\r\n },\r\n },\r\n sectionMobile: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginLeft: '16px',\r\n [theme.breakpoints.up('md')]: {\r\n display: 'none',\r\n },\r\n },\r\n}));\r\n\r\nconst AppMenu = ({ photographerId }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [drawerOpen, setDrawerOpen] = useState(false);\r\n const [photographer] = usePhotographer();\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n\r\n const handleProductMenuClick = (event) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleProductMenuClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const redirectToCategoriesList = () => {\r\n handleProductMenuClose();\r\n history.push(`/photographer/${photographer.photographId}/categories`);\r\n };\r\n\r\n const redirectToCategory = (id) => {\r\n handleProductMenuClose();\r\n history.push(`/photographer/${photographer.photographId}/categories/${id}`);\r\n };\r\n\r\n const redirectToUncategorized = () => {\r\n handleProductMenuClose();\r\n history.push(`/photographer/${photographer.photographId}/uncategorized`);\r\n };\r\n\r\n const renderCategories = () => {\r\n return (\r\n
\r\n \r\n
\r\n {t('Categories')} \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {photographer.productCategories.map((category) => {\r\n return (\r\n redirectToCategory(category.Id)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n };\r\n\r\n const renderProducts = () => {\r\n return (\r\n \r\n {t('Products')}\r\n \r\n );\r\n };\r\n\r\n const renderProductsOrCategories = () => {\r\n if (photographer && photographer.productCategories?.length > 0) {\r\n return renderCategories();\r\n } else {\r\n return renderProducts();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n {\r\n setDrawerOpen(true);\r\n }}\r\n edge='start'\r\n className={clsx(classes.menuButton, {\r\n [classes.hide]: drawerOpen,\r\n })}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n {renderProductsOrCategories()}\r\n \r\n {t('Finish order')}\r\n \r\n \r\n {t('Contact')}\r\n \r\n
\r\n
\r\n \r\n setDrawerOpen(false)}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default AppMenu;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\nimport AppMenu from '../../components/AppMenu';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n backgroundColor: '#f8f8f8',\r\n },\r\n toolbar: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(0, 1),\r\n minHeight: 80,\r\n },\r\n content: {\r\n flexGrow: 1,\r\n padding: theme.spacing(1),\r\n },\r\n}));\r\n\r\nconst Layout = ({ children, photographerId }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Layout;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardActionArea from '@material-ui/core/CardActionArea';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n media: {\r\n height: 340,\r\n },\r\n}));\r\n\r\nconst CategoryCard = ({ category }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [photographer] = usePhotographer();\r\n\r\n const handleCardClick = () => {\r\n history.push(\r\n `/photographer/${photographer.photographId}/categories/${category.Id}`\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {category.Name}\r\n \r\n \r\n {category.Description}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CategoryCard;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Skeleton from '@material-ui/lab/Skeleton';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n media: {\r\n height: 240,\r\n marginBottom: '28px',\r\n },\r\n short: {\r\n width: '35%',\r\n },\r\n}));\r\n\r\nconst CategoryCardSkeleton = ({ key }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\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 \r\n \r\n );\r\n};\r\n\r\nexport default CategoryCardSkeleton;\r\n","//Core\r\nimport React, { useLayoutEffect, useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useGetBanners } from '../../services/OrderUtils';\r\n\r\n//Utils\r\nimport { isMobile } from 'react-device-detect';\r\n\r\n//UI\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport MobileStepper from '@material-ui/core/MobileStepper';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';\r\nimport KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';\r\nimport SwipeableViews from 'react-swipeable-views';\r\nimport { autoPlay } from 'react-swipeable-views-utils';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n maxWidth: '100%',\r\n flexGrow: 1,\r\n marginBottom: '12px',\r\n },\r\n header: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n height: 50,\r\n paddingLeft: '6px',\r\n // backgroundColor: theme.palette.background.default,\r\n },\r\n img: {\r\n maxHeight: '480px',\r\n display: 'block',\r\n overflow: 'hidden',\r\n width: '100%',\r\n objectFit: 'cover !important',\r\n cursor: 'pointer',\r\n },\r\n}));\r\n\r\nconst AutoPlaySwipeableViews = autoPlay(SwipeableViews);\r\n\r\nconst BanerSlider = ({ photographerId }) => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [activeStep, setActiveStep] = React.useState(0);\r\n const [banners, setBanners] = useState([]);\r\n const [maxSteps, setMaxSteps] = useState(banners.length ?? 0);\r\n\r\n const handleNext = () => {\r\n setActiveStep((prevActiveStep) => prevActiveStep + 1);\r\n };\r\n\r\n const handleBack = () => {\r\n setActiveStep((prevActiveStep) => prevActiveStep - 1);\r\n };\r\n\r\n const handleStepChange = (step) => {\r\n setActiveStep(step);\r\n };\r\n\r\n const handleClickBaner = (step) => {\r\n if (!step) return;\r\n\r\n if (step.productId) {\r\n history.push(\r\n `/photographer/${step.photographerId}/products/${step.productId}`\r\n );\r\n } else if (step.externalUrl) {\r\n window.open(step.externalUrl, '_blank', 'noopener,noreferrer');\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const bannersQuery = useGetBanners(photographerId ?? 0);\r\n const { data } = bannersQuery;\r\n\r\n useLayoutEffect(() => {\r\n if (data) {\r\n setBanners(data);\r\n setMaxSteps(data.length);\r\n }\r\n }, [data]);\r\n\r\n function showBanner(list) {\r\n if (!list) return false;\r\n return list.length > 0;\r\n }\r\n\r\n return (\r\n <>\r\n {showBanner(banners) && (\r\n
\r\n \r\n {banners[activeStep].buttonText}\r\n \r\n \r\n {banners.map((step, index) => (\r\n
\r\n {Math.abs(activeStep - index) <= maxSteps ? (\r\n handleClickBaner(step)}\r\n />\r\n ) : null}\r\n
\r\n ))}\r\n \r\n \r\n Next\r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n backButton={\r\n \r\n {theme.direction === 'rtl' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n Back\r\n \r\n }\r\n />\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default BanerSlider;\r\n","export default __webpack_public_path__ + \"static/media/our-other-products.37fd5e6b.jpg\";","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardActionArea from '@material-ui/core/CardActionArea';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\n//Assets\r\nimport placeholderImg from '../../assets/our-other-products.jpg';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n media: {\r\n height: 340,\r\n },\r\n}));\r\n\r\nconst UncategorizedCard = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [photographer] = usePhotographer();\r\n\r\n const handleCardClick = () => {\r\n history.push(`/photographer/${photographer.photographId}/uncategorized`);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {t('Other products')}\r\n \r\n \r\n {t('Our other products, check what else do we have.')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default UncategorizedCard;\r\n","//Core\r\nimport React, { useState, useEffect } from 'react';\r\n\r\n//Components\r\nimport CategoryCard from '../../components/order/CategoryCard';\r\nimport CategoryCardSkeleton from '../../components/order/CategoryCardSkeleton';\r\nimport BanerSlider from '../../components/order/BanerSlider';\r\nimport UncategorizedCard from '../../components/order/UncategorizedCard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useGetProducts } from '../../services/OrderUtils';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n paddingLeft: '60px',\r\n paddingRight: '60px',\r\n },\r\n grid: {\r\n flexGrow: 1,\r\n },\r\n}));\r\n\r\nfunction RenderSkeletonList() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst CategoriesView = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [photographer, dispatch] = usePhotographer();\r\n const productsQuery = useGetProducts(photographer?.photographId ?? 0);\r\n\r\n function showOtherCategory(photographer) {\r\n let productsList = photographer?.products ?? [];\r\n productsList = productsList.filter((p) => {\r\n if (p.categories?.length === 0 && p.isAutoGenerated === 0) return true;\r\n else return false;\r\n });\r\n return productsList > 0;\r\n }\r\n\r\n const renderCategories = () => {\r\n return (\r\n \r\n {photographer.productCategories.map((category) => (\r\n \r\n \r\n \r\n ))}\r\n {showOtherCategory(photographer) && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const isLoading = () => {\r\n if (\r\n photographer.productCategories &&\r\n photographer.productCategories.length > 0\r\n )\r\n return false;\r\n\r\n return true;\r\n };\r\n\r\n const { data } = productsQuery;\r\n useEffect(() => {\r\n if (data) {\r\n dispatch({ type: 'ADD_PRODUCTS', data: data });\r\n }\r\n }, [data, dispatch]);\r\n\r\n return (\r\n
\r\n \r\n {isLoading() && RenderSkeletonList()}\r\n {!isLoading() && renderCategories()}\r\n
\r\n );\r\n};\r\n\r\nexport default CategoriesView;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n rootBtn: {\r\n width: '50%',\r\n color: '#4556ac',\r\n '&:hover': {\r\n color: '#fff',\r\n backgroundColor: '#4556ac',\r\n },\r\n },\r\n borderBtn: {\r\n border: '1px solid',\r\n borderColor: '#4556ac',\r\n borderRadius: '50px',\r\n '&:hover': {\r\n borderColor: '#4556ac',\r\n },\r\n },\r\n paddingsBtn: {\r\n paddingTop: '8px',\r\n paddingBottom: '8px',\r\n paddingLeft: '20px',\r\n paddingRight: '20px',\r\n },\r\n}));\r\n\r\nconst RoundButton = ({ children, onClick, ...props }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default RoundButton;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport RemoveCircleOutlineIcon from '@material-ui/icons/RemoveCircleOutline';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport DoneIcon from '@material-ui/icons/Done';\r\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n marginBottom: '16px',\r\n height: '65px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n aligner: {\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n },\r\n thumbnail: {\r\n height: '65px',\r\n },\r\n fileName: {\r\n width: '100%',\r\n flexGrow: 1,\r\n marginLeft: '8px',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n wordWrap: 'break-word',\r\n [theme.breakpoints.down('sm')]: {\r\n width: '1px',\r\n },\r\n },\r\n centerVertical: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n success: {\r\n color: '#28a745',\r\n },\r\n failure: {\r\n color: '#dc3545',\r\n },\r\n}));\r\n\r\nconst FileListItem = ({ file, key, hideIncrease, hideQuantity }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [, orderDispatch] = useOrder();\r\n\r\n const handleAddQuantity = () => {\r\n orderDispatch({\r\n type: 'INCREASE_ORDER_ITEM_QTY',\r\n payload: { guid: file.guid },\r\n });\r\n };\r\n\r\n const handleRemoveQuantity = () => {\r\n orderDispatch({\r\n type: 'DECRESE_ORDER_ITEM_QTY',\r\n payload: { guid: file.guid },\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n
\r\n {file.fileName}\r\n
\r\n {file.status === 'idle' && }\r\n {file.status === 'success' && (\r\n \r\n )}\r\n {file.status === 'failed' && (\r\n \r\n )}\r\n \r\n \r\n \r\n {!hideQuantity && {file.qty}}\r\n {!hideIncrease && (\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FileListItem;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\nimport { formatPrice, getRangePrice } from '../../core/helpers/priceHelper';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n cardDesc: {\r\n fontSize: '1.1rem',\r\n lineHeight: '1.3rem',\r\n marginBottom: '16px',\r\n },\r\n}));\r\n\r\nconst PriceRangeList = ({ product, photographer, order }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n if (!product) return null;\r\n if (product.productPrices?.length < 1) return null;\r\n\r\n function calculateRangePrice(priceId) {\r\n const result = getRangePrice(product.id, priceId, photographer, order);\r\n return formatPrice(result);\r\n }\r\n\r\n const renderPriceRange = (priceRange) => {\r\n const prices = priceRange\r\n .filter((item) => item.isDeleted === false)\r\n .map((item) => (\r\n \r\n \r\n From {item.priceLevelFrom} to{' '}\r\n {item.priceLevelTo === 0 ? '∞' : item.priceLevelTo} pcs:{' '}\r\n {calculateRangePrice(item.id)} €\r\n \r\n \r\n ));\r\n\r\n return prices;\r\n };\r\n\r\n return (\r\n \r\n {renderPriceRange(product.productPrices)}\r\n \r\n );\r\n};\r\n\r\nexport default PriceRangeList;\r\n","//Core\r\nimport React, { useState, useEffect } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n title: {\r\n width: '100%',\r\n fontSize: '1.3rem',\r\n lineHeight: '1.8rem',\r\n fontWeight: 600,\r\n display: 'inline-block',\r\n textDecoration: 'underline',\r\n },\r\n groupName: {\r\n margin: 0,\r\n },\r\n groupSelection: {\r\n marginBottom: '8px',\r\n },\r\n attributeButton: {\r\n width: '100%',\r\n },\r\n attributeRow: {\r\n padding: '3px !important',\r\n },\r\n mb16: {\r\n marginBottom: '16px',\r\n },\r\n}));\r\n\r\nconst AttributesList = ({ product, pack }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const matches = useMediaQuery('(min-width:600px)');\r\n\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const calculateAttributeGroups = () => {\r\n const groupIds = [\r\n ...new Set(product.attributes.map((p) => p.attributesGroupId)),\r\n ];\r\n return photographer.productAttributes.filter((a) =>\r\n groupIds.includes(a.Id)\r\n );\r\n };\r\n\r\n const attributesGroups = calculateAttributeGroups();\r\n\r\n const calculateAttributes = (group) => {\r\n return product.attributes\r\n .filter((a) => a.attributesGroupId === group.Id)\r\n .filter((a) => a.isActive === true)\r\n .sort((a, b) => a.position - b.position );\r\n };\r\n\r\n const isAttributeChangeValid = (productId, groupId, attributeId) => {\r\n if (!attributesGroups) return false;\r\n\r\n let newProductCode = `p${productId}`;\r\n attributesGroups.forEach((group) => {\r\n if (group.Id == groupId) {\r\n newProductCode = `${newProductCode};a${attributeId}`;\r\n } else {\r\n let shouldCheckDefault = true;\r\n var { orderItemsConfig } = order;\r\n if (orderItemsConfig && orderItemsConfig.length > 0) {\r\n var currentConfig = orderItemsConfig.find(\r\n (c) => c.productId == productId\r\n );\r\n if (\r\n currentConfig &&\r\n currentConfig.configs &&\r\n currentConfig.configs.length > 0\r\n ) {\r\n var selection = currentConfig.configs.find(\r\n (x) => x.groupId == group.Id\r\n );\r\n if (selection) {\r\n shouldCheckDefault = false;\r\n newProductCode = `${newProductCode};a${selection.selected}`;\r\n }\r\n }\r\n }\r\n\r\n if (shouldCheckDefault) {\r\n var { attributes } = product;\r\n if (attributes && attributes.length > 0) {\r\n var sortedAttributes = attributes\r\n .filter((x) => x.attributesGroupId == group.Id)\r\n .sort((a, b) => a.position < b.position);\r\n\r\n var firstAttribute = sortedAttributes[0];\r\n newProductCode = `${newProductCode};a${firstAttribute.id}`;\r\n }\r\n }\r\n }\r\n });\r\n\r\n const { products } = photographer;\r\n if (products && products.length > 0) {\r\n var potentialProduct = products.find(\r\n (x) => x.autoGeneratedDefinition == newProductCode\r\n );\r\n if (!potentialProduct) return false;\r\n\r\n return potentialProduct.isHidden == false;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const handleAttributeClick = (groupId, attributeId) => {\r\n var validChange = isAttributeChangeValid(product.id, groupId, attributeId);\r\n\r\n if (!validChange) return;\r\n\r\n const newConfig = {\r\n productId: product.id,\r\n pack: pack,\r\n groupId: groupId,\r\n selected: attributeId,\r\n };\r\n\r\n orderDispatch({ type: 'ORDER_ITEM_SET_ATTRIBUTES', payload: newConfig });\r\n };\r\n\r\n const getButtonVariant = (groupId, attributeId) => {\r\n const config = order?.orderItemsConfig.find(\r\n (c) => c.productId === product.id && c.pack === pack\r\n );\r\n\r\n if (config) {\r\n const group = config.configs.find((opt) => opt.groupId === groupId);\r\n if (group) {\r\n if (group.selected === attributeId) return 'contained';\r\n else return 'outlined';\r\n }\r\n }\r\n\r\n const attributes = product.attributes.filter(\r\n (a) => a.attributesGroupId === groupId\r\n );\r\n if (attributes) {\r\n if (attributes[0].id === attributeId) return 'contained';\r\n }\r\n\r\n return 'outlined';\r\n };\r\n\r\n const renderAttributes = (group, gIdx) => {\r\n const att = calculateAttributes(group);\r\n\r\n return (\r\n
\r\n \r\n {group.Name}:\r\n \r\n \r\n {att.map((a, idx) => (\r\n \r\n handleAttributeClick(group.Id, a.id)}\r\n className={classes.attributeButton}\r\n disabled={!isAttributeChangeValid(product.id, group.Id, a.id)}\r\n >\r\n {a.name}\r\n \r\n \r\n ))}\r\n \r\n
\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {product && product.attributes?.length > 0 && (\r\n <>\r\n \r\n {t('Options')}:\r\n \r\n {attributesGroups.map((g, idx) => renderAttributes(g, idx))}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default AttributesList;\r\n","export function createGuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n","//Core\r\nimport React, { useState, useRef } from 'react';\r\n\r\n//Components\r\nimport RoundButton from './../core/RoundButton';\r\nimport FileListItem from './FileListItem';\r\nimport PriceRangeList from './PriceRangeList';\r\nimport AttributesList from './AttributesList';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { createGuid } from '../../core/helpers/guidHelper';\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\nimport { MobileView, isBrowser, isMobile } from 'react-device-detect';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Container from '@material-ui/core/Container';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport AddPhotoAlternateIcon from '@material-ui/icons/AddPhotoAlternate';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ShoppingCartIcon from '@material-ui/icons/ShoppingCart';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport BackIcon from '@material-ui/icons/ArrowBack';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n actionButtons: {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fillWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n}));\r\n\r\nconst NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst OptionsButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst RemoveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#dc3545',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #dc3545',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#dc3545',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst BasicDialog = ({ product, isOpen, closeFn }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n\r\n const scrollToRef = useRef(null);\r\n const scrollOptionsRef = useRef(null);\r\n\r\n const [pack, setPack] = useState(1);\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const executeScroll = () =>\r\n scrollToRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const executeOptionsScroll = () =>\r\n scrollOptionsRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n\r\n const fileInputHandler = (event) => {\r\n const { files } = event.target;\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(file),\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n };\r\n\r\n orderDispatch({ type: 'ADD_ORDER_ITEM', payload: orderItem });\r\n executeScroll();\r\n };\r\n }\r\n };\r\n\r\n const handleUploadClick = () => {\r\n fileInput.click();\r\n };\r\n\r\n const renderFiles = () => {\r\n return order.orderItems\r\n .filter((item) => item.productId === product.id)\r\n ?.map((item) => );\r\n };\r\n\r\n const handleRemoveAll = () => {\r\n orderDispatch({\r\n type: 'REMOVE_ORDER_ITEMS_FOR_PRODUCT',\r\n payload: { productId: product.id },\r\n });\r\n };\r\n\r\n const isNextDisabled = () => {\r\n const files = order.orderItems.filter(\r\n (item) => item.productId === product.id\r\n );\r\n return files.length == 0;\r\n };\r\n\r\n const handleNext = () => {\r\n closeFn();\r\n history.push(`/photographer/${product.photographerId}/checkout`);\r\n };\r\n\r\n const calculatePrice = () => {\r\n const quantity = order.orderItems\r\n .filter((item) => item.productId === product.id)\r\n .reduce((sum, item) => sum + item.qty, 0);\r\n return getLabelPrice(product.id, quantity, photographer, order);\r\n };\r\n\r\n const attributesAvailable = () => {\r\n if (!product) return false;\r\n if (!product.attributes) return false;\r\n\r\n return product.attributes.length > 0;\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n theme.palette.grey[500],\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}>\r\n \r\n \r\n {t('Pick files')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n \r\n \r\n {formatPrice(calculatePrice())} €\r\n \r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n {renderFiles()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('REMOVE ALL')}\r\n \r\n \r\n \r\n \r\n {t('Next step')} \r\n \r\n \r\n \r\n {attributesAvailable() && (\r\n \r\n \r\n {t('OPTIONS')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default BasicDialog;\r\n","//Core\r\nimport React, { useState, useRef } from 'react';\r\n\r\n//Components\r\nimport RoundButton from '../core/RoundButton';\r\nimport FileListItem from './FileListItem';\r\nimport PriceRangeList from './PriceRangeList';\r\nimport AttributesList from './AttributesList';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { createGuid } from '../../core/helpers/guidHelper';\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Container from '@material-ui/core/Container';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport AddPhotoAlternateIcon from '@material-ui/icons/AddPhotoAlternate';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ShoppingCartIcon from '@material-ui/icons/ShoppingCart';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { isMobile } from 'react-device-detect';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n actionButtons: {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fillWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n}));\r\n\r\nconst NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst OptionsButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst RemoveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#dc3545',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #dc3545',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#dc3545',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst BasicDialogNaturalProduct = ({ product, isOpen, closeFn }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n\r\n const scrollToRef = useRef(null);\r\n const scrollOptionsRef = useRef(null);\r\n\r\n const [pack, setPack] = useState(1);\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const executeScroll = () =>\r\n scrollToRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const executeOptionsScroll = () =>\r\n scrollOptionsRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n\r\n const handleAddProduct = async() => {\r\n const attributes = [...new Set(product.attributes.map(a=>a.attributesGroupId))].map(a=> {return{groupId: a, selected: null}});\r\n const config = order?.orderItemsConfig.find(\r\n (c) => c.productId === product.id && c.pack === pack\r\n );\r\n attributes.forEach(a=> {\r\n a.selected = config?.configs.find(c=>c.groupId === a.groupId)?.selected ||\r\n product.attributes.find(pa=>pa.attributesGroupId === a.groupId && pa.position === 1)?.id;\r\n })\r\n const fileName = [product.name, ...attributes.map(a=>product.attributes.find(pa=>pa.attributesGroupId === a.groupId && pa.id === a.selected).name)].join(\" \");\r\n\r\n const allreadyOrdered = order.orderItems.find((item) => item.fileName === fileName);\r\n if(!allreadyOrdered){\r\n const data = await fetch(product.imageUrl);\r\n const blob = await data.blob();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = () => {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: createGuid(),\r\n fileAsBase64: reader.result,\r\n fileUrl: product.imageUrl,\r\n fileName: fileName,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n };\r\n orderDispatch({ type: 'ADD_ORDER_ITEM', payload: orderItem });\r\n }\r\n }else{\r\n orderDispatch({\r\n type: 'INCREASE_ORDER_ITEM_QTY',\r\n payload: { guid: allreadyOrdered.guid },\r\n });\r\n }\r\n };\r\n\r\n const renderAtributes = () => {\r\n return order.orderItems\r\n .filter((item) => item.productId === product.id)\r\n ?.map((item) => );\r\n };\r\n\r\n const handleRemoveAll = () => {\r\n orderDispatch({\r\n type: 'REMOVE_ORDER_ITEMS_FOR_PRODUCT',\r\n payload: { productId: product.id },\r\n });\r\n };\r\n\r\n const isNextDisabled = () => {\r\n const files = order.orderItems.filter(\r\n (item) => item.productId === product.id\r\n );\r\n return files.length == 0;\r\n };\r\n\r\n const handleNext = () => {\r\n closeFn();\r\n history.push(`/photographer/${product.photographerId}/checkout`);\r\n };\r\n\r\n const calculatePrice = () => {\r\n const quantity = order.orderItems\r\n .filter((item) => item.productId === product.id)\r\n .reduce((sum, item) => sum + item.qty, 0);\r\n return getLabelPrice(product.id, quantity, photographer, order);\r\n };\r\n\r\n const attributesAvailable = () => {\r\n if (!product) return false;\r\n if (!product.attributes) return false;\r\n\r\n return product.attributes.length > 0;\r\n };\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 handleAddProduct()}>\r\n \r\n \r\n {t('Add product')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n \r\n \r\n {formatPrice(calculatePrice())} €\r\n \r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n {renderAtributes()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('REMOVE ALL')}\r\n \r\n \r\n \r\n \r\n {t('Next step')} \r\n \r\n \r\n \r\n {attributesAvailable() && (\r\n \r\n \r\n {t('OPTIONS')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default BasicDialogNaturalProduct;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Chip from '@material-ui/core/Chip';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n position: 'relative',\r\n top: '20px',\r\n left: '-10px',\r\n zIndex: '100',\r\n height: '0px',\r\n },\r\n badge: {\r\n marginBottom: '12px',\r\n display: 'flex',\r\n maxWidth: '120px',\r\n },\r\n selected: {\r\n backgroundColor: '#3e884f',\r\n color: '#fff',\r\n },\r\n prints: {\r\n backgroundColor: '#4556ac',\r\n color: '#fff',\r\n },\r\n files: {\r\n backgroundColor: '#c43d4b',\r\n color: '#fff',\r\n },\r\n}));\r\n\r\nconst CardBadge = ({ files, prints }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const showComponent = () => {\r\n if (!files || files < 1) return false;\r\n if (!prints || prints < 1) return false;\r\n\r\n return true;\r\n };\r\n\r\n return (\r\n <>\r\n {showComponent() && (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default CardBadge;\r\n","//Core\r\nimport React, { useState, useLayoutEffect } from 'react';\r\nimport { useParams, useHistory, useLocation } from 'react-router-dom';\r\n\r\n//Components\r\nimport BasicDialog from './BasicDialog';\r\nimport BasicDialogNaturalProduct from './BasicDialogNaturalProduct';\r\nimport CardBadge from './CardBadge';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardActionArea from '@material-ui/core/CardActionArea';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n media: {\r\n width: '100%',\r\n height: 340,\r\n backgroundSize: 'contain',\r\n },\r\n cardArea: {\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'flex-start',\r\n },\r\n cardTitle: {\r\n fontSize: '1.3rem',\r\n lineHeight: '1.8rem',\r\n fontWeight: 600,\r\n display: 'inline-block',\r\n },\r\n cardTitleBox: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginBottom: '16px',\r\n },\r\n cardDesc: {\r\n fontSize: '1.1rem',\r\n lineHeight: '1.3rem',\r\n marginBottom: '16px',\r\n },\r\n}));\r\n\r\nconst ProductBasicCard = ({ product }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const location = useLocation();\r\n const { itemId } = useParams();\r\n\r\n const [isDialogOpen, setDialogOpen] = useState(false);\r\n const [photographer] = usePhotographer();\r\n const [order] = useOrder();\r\n\r\n const handleOpen = (itemId) => {\r\n const url = history.location.pathname;\r\n const newUrl = `${url}/${itemId}`;\r\n history.push(newUrl);\r\n };\r\n\r\n const handleClose = (itemId) => {\r\n const url = history.location.pathname;\r\n const newUrl = url\r\n .slice(0, url.length - itemId.toString().length)\r\n .slice(0, -1);\r\n\r\n setDialogOpen(false);\r\n history.push(newUrl);\r\n };\r\n\r\n const getFilesCount = () => {\r\n const orderedItems = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem !== true\r\n );\r\n\r\n return orderedItems.length;\r\n };\r\n\r\n const getPrintsCount = () => {\r\n const orderedItems = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem !== true\r\n );\r\n const orderedPrints = orderedItems.reduce((sum, item) => sum + item.qty, 0);\r\n return orderedPrints;\r\n };\r\n\r\n useLayoutEffect(() => {\r\n if (product.id == itemId) {\r\n setDialogOpen(true);\r\n }\r\n }, [itemId, product]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n handleOpen(product.id)}\r\n >\r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n €{' '}\r\n {formatPrice(getLabelPrice(product.id, 1, photographer, order))}\r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n \r\n \r\n {product.productType !== 4 && handleClose(product.id)}\r\n />}\r\n {product.productType === 4 && handleClose(product.id)}\r\n />}\r\n \r\n );\r\n};\r\n\r\nexport default ProductBasicCard;\r\n","//Core\r\nimport { Rect, Transformer, Image } from 'react-konva';\r\nimport React, { useRef, useEffect } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport useImage from 'use-image';\r\n\r\n//Utils\r\nimport { Portal } from 'react-konva-utils';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst Rectangle = ({ layer, isSelected, onSelect, onChange }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const imgRef = useRef();\r\n const rectRef = useRef();\r\n const trRef = useRef();\r\n\r\n const [image] = useImage(layer.url, 'anonymous');\r\n\r\n useEffect(() => {\r\n if (isSelected) {\r\n // we need to attach transformer manually\r\n trRef.current.nodes([imgRef.current, rectRef.current]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [isSelected]);\r\n\r\n return (\r\n <>\r\n {\r\n \r\n \r\n onChange({\r\n ...layer,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n });\r\n }}\r\n onTransformEnd={(e) => {\r\n const node = imgRef.current;\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n onChange({\r\n ...layer,\r\n x: node.x(),\r\n y: node.y(),\r\n width: Math.max(5, node.width() * scaleX),\r\n height: Math.max(node.height() * scaleY),\r\n });\r\n }}\r\n\r\n />\r\n {isSelected && (\r\n \r\n \r\n {\r\n // limit resize\r\n if (newBox.width < 10 || newBox.height < 10) {\r\n return oldBox;\r\n }\r\n return newBox;\r\n }}\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Rectangle;\r\n","const TO_RADIANS = Math.PI / 180;\r\n\r\nexport async function canvasPreview(\r\n image,\r\n canvas,\r\n crop,\r\n scale = 1,\r\n rotate = 0\r\n) {\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n throw new Error('No 2d context');\r\n }\r\n\r\n const scaleX = image.naturalWidth / image.width;\r\n const scaleY = image.naturalHeight / image.height;\r\n // devicePixelRatio slightly increases sharpness on retina devices\r\n // at the expense of slightly slower render times and needing to\r\n // size the image back down if you want to download/upload and be\r\n // true to the images natural size.\r\n const pixelRatio = window.devicePixelRatio;\r\n // const pixelRatio = 1;\r\n\r\n canvas.width = Math.floor(crop.width * scaleX * pixelRatio);\r\n canvas.height = Math.floor(crop.height * scaleY * pixelRatio);\r\n\r\n ctx.scale(pixelRatio, pixelRatio);\r\n ctx.imageSmoothingQuality = 'high';\r\n\r\n const cropX = crop.x * scaleX;\r\n const cropY = crop.y * scaleY;\r\n\r\n const rotateRads = rotate * TO_RADIANS;\r\n const centerX = image.naturalWidth / 2;\r\n const centerY = image.naturalHeight / 2;\r\n\r\n ctx.save();\r\n\r\n // 5) Move the crop origin to the canvas origin (0,0)\r\n ctx.translate(-cropX, -cropY);\r\n // 4) Move the origin to the center of the original position\r\n ctx.translate(centerX, centerY);\r\n // 3) Rotate around the origin\r\n ctx.rotate(rotateRads);\r\n // 2) Scale the image\r\n ctx.scale(scale, scale);\r\n // 1) Move the center of the image to the origin (0,0)\r\n ctx.translate(-centerX, -centerY);\r\n ctx.drawImage(\r\n image,\r\n 0,\r\n 0,\r\n image.naturalWidth,\r\n image.naturalHeight,\r\n 0,\r\n 0,\r\n image.naturalWidth,\r\n image.naturalHeight\r\n );\r\n\r\n ctx.restore();\r\n}\r\n","//Core\r\nimport React, { useState, useEffect, useLayoutEffect, useRef } from 'react';\r\nimport ReactCrop, {\r\n centerCrop,\r\n makeAspectCrop,\r\n Crop,\r\n PixelCrop,\r\n} from 'react-image-crop';\r\nimport 'react-image-crop/dist/ReactCrop.css';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDebounceEffect } from './helpers/useDebaunceEffect';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { canvasPreview } from './helpers/canvasPreview';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n visible: {\r\n display: 'block',\r\n },\r\n hidden: {\r\n display: 'none',\r\n },\r\n}));\r\n\r\nfunction centerAspectCrop(mediaWidth, mediaHeight, aspect) {\r\n return centerCrop(\r\n makeAspectCrop(\r\n {\r\n unit: '%',\r\n width: 90,\r\n },\r\n aspect,\r\n mediaWidth,\r\n mediaHeight\r\n ),\r\n mediaWidth,\r\n mediaHeight\r\n );\r\n}\r\n\r\nconst Cropper = ({ uniqKey, display, orderItem, cropConfig }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const imgRef = useRef(null);\r\n const previewCanvasRef = useRef(null);\r\n\r\n const [, orderDispatch] = useOrder();\r\n\r\n const [imgSrc, setImgSrc] = useState(null);\r\n const [crop, setCrop] = useState(null);\r\n const [aspect, setAscpect] = useState(4 / 3);\r\n const [completedCrop, setCompletedCrop] = useState();\r\n const [scale, setScale] = useState(1);\r\n const [rotate, setRotate] = useState(0);\r\n\r\n useLayoutEffect(() => {\r\n function reloadImgSrc() {\r\n if (orderItem) {\r\n setImgSrc(orderItem.fileUrl);\r\n }\r\n }\r\n reloadImgSrc();\r\n }, [orderItem]);\r\n\r\n useLayoutEffect(() => {\r\n function calculateAspect() {\r\n if (!cropConfig) return 4 / 3;\r\n\r\n return cropConfig.width / cropConfig.height;\r\n }\r\n\r\n const newAspect = calculateAspect();\r\n\r\n setAscpect(newAspect);\r\n }, [cropConfig]);\r\n\r\n useDebounceEffect(\r\n async () => {\r\n if (\r\n completedCrop?.width &&\r\n completedCrop?.height &&\r\n imgRef.current &&\r\n previewCanvasRef.current\r\n ) {\r\n // We use canvasPreview as it's much faster than imgPreview.\r\n canvasPreview(\r\n imgRef.current,\r\n previewCanvasRef.current,\r\n completedCrop,\r\n scale,\r\n rotate\r\n );\r\n }\r\n },\r\n 200,\r\n [completedCrop, scale, rotate]\r\n );\r\n\r\n useEffect(() => {\r\n function effectWrapper() {\r\n if (aspect) {\r\n const width = 100; //set image width\r\n const height = 100; //set image H\r\n setCrop(centerAspectCrop(width, height, aspect));\r\n }\r\n }\r\n\r\n effectWrapper();\r\n }, [aspect, orderItem]);\r\n\r\n useEffect(() => {\r\n function executeCropUpdate() {\r\n if (!completedCrop) return;\r\n const cropSum =\r\n completedCrop.x +\r\n completedCrop.y +\r\n completedCrop.width +\r\n completedCrop.height;\r\n\r\n if (cropSum == 0) return;\r\n\r\n const changedX = completedCrop.x != orderItem?.completedCropObj?.x;\r\n const changedY = completedCrop.y != orderItem?.completedCropObj?.y;\r\n const changedW =\r\n completedCrop.width != orderItem?.completedCropObj?.width;\r\n const changedH =\r\n completedCrop.height != orderItem?.completedCropObj?.height;\r\n const updated = changedX + changedY + changedW + changedH;\r\n\r\n if (updated == 0) return;\r\n\r\n const editorW = imgRef?.current?.width ?? 0;\r\n const editorH = imgRef?.current?.height ?? 0;\r\n\r\n const model = {\r\n guid: orderItem.guid,\r\n crop: { ...completedCrop, editorWidth: editorW, editorHeight: editorH },\r\n };\r\n orderDispatch({\r\n type: 'UPDATE_ORDER_ITEM_CROP_COMPLETE',\r\n payload: model,\r\n });\r\n }\r\n\r\n executeCropUpdate();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [completedCrop]);\r\n\r\n function onImageLoad(e) {\r\n if (aspect) {\r\n const { width, height } = e.currentTarget;\r\n if (orderItem.cropObj) {\r\n setCrop(orderItem.cropObj);\r\n } else {\r\n const centerCrop = centerAspectCrop(width, height, aspect);\r\n setCrop(centerCrop);\r\n const model = { guid: orderItem.guid, crop: centerCrop };\r\n orderDispatch({ type: 'UPDATE_ORDER_ITEM_CROP', payload: model });\r\n }\r\n }\r\n }\r\n\r\n if (!imgSrc) return <>;\r\n\r\n function handleSetCrop(percentCrop) {\r\n setCrop(percentCrop);\r\n }\r\n\r\n return (\r\n
\r\n handleSetCrop(percentCrop)}\r\n onComplete={(c) => setCompletedCrop(c)}\r\n aspect={aspect}\r\n keepSelection={true}\r\n >\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Cropper;\r\n","export default __webpack_public_path__ + \"static/media/cup.f88caa74.obj\";","export default __webpack_public_path__ + \"static/media/sample01.9f39a18a.jpg\";","//Core\r\nimport React, { useRef, useState, useLayoutEffect, useEffect } from 'react';\r\nimport { Image, Layer, Stage } from 'react-konva';\r\n\r\n//Components\r\nimport View3d from '../3d/View3d';\r\nimport Rectangle from '../3d/Rectangle';\r\nimport Cropper from '../3d/Cropper';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport useImage from 'use-image';\r\nimport { createGuid } from '../../core/helpers/guidHelper';\r\nimport {\r\n getScaleDownFactor,\r\n getScaleUpFactor,\r\n getPointTransformation,\r\n getRectTransformation,\r\n getRectOrientTransformation,\r\n} from '../../core/helpers/imageTransformationHelper';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline';\r\nimport RemoveCircleOutlineIcon from '@material-ui/icons/RemoveCircleOutline';\r\nimport Stepper from '@material-ui/core/Stepper';\r\nimport Step from '@material-ui/core/Step';\r\nimport StepButton from '@material-ui/core/StepButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\n//Assets\r\nimport defaultObj from '../../assets/cup.obj';\r\nimport sampleImg from '../../assets/sample01.jpg';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n minHeight: '80px',\r\n },\r\n centerVertical: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n centerHorizontal: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n },\r\n stepperContainer: {\r\n display: 'flex',\r\n },\r\n thumbImage: {\r\n width: '100%',\r\n maxWidth: '100px',\r\n height: '100%',\r\n maxHeight: '60px',\r\n marginTop: '4px',\r\n },\r\n thumbImageSelected: {\r\n width: '100%',\r\n maxWidth: '100px',\r\n height: '100%',\r\n maxHeight: '60px',\r\n marginTop: '4px',\r\n border: 'solid 2px blue',\r\n },\r\n}));\r\n\r\nconst OtherButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n marginBottom: '12px',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n w100: {\r\n width: '100%',\r\n },\r\n canvasWrapper: {\r\n width: '100% !important',\r\n height: '200px !important',\r\n minHeight: '160px',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst Presenter3d = ({ product, pack }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const stageLayerRef = useRef(null);\r\n\r\n const [order, orderDispatch] = useOrder();\r\n const [textureUrl, setTextureUrl] = useState(null);\r\n const [showEditor, setShowEditr] = useState(false);\r\n const [selectedMode, setSelectedMode] = useState(true);\r\n const [rectangles, setRectangles] = useState([]);\r\n\r\n const [activeStep, setActiveStep] = React.useState(0);\r\n\r\n const [image, status] = useImage(product.layerImageUrl, 'anonymous');\r\n\r\n function getSteps() {\r\n const images = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem === true\r\n );\r\n\r\n return [...images];\r\n }\r\n\r\n function getSelectedOrderItem() {\r\n const steps = getSteps();\r\n return steps[activeStep];\r\n }\r\n\r\n function getSelectedCropConfig() {\r\n if (!product) return null;\r\n const { sizes } = product;\r\n if (!sizes) return null;\r\n\r\n return product.sizes[activeStep];\r\n }\r\n\r\n const handleStep = (step) => () => {\r\n setActiveStep(step);\r\n };\r\n\r\n const steps = getSteps();\r\n\r\n const scale = 0.4215686275;\r\n var container = document.querySelector('#js-stage-root');\r\n let widthValue = container?.offsetWidth ?? 1122;\r\n\r\n if (widthValue > 561) widthValue = 561;\r\n const heightValue = widthValue * scale;\r\n\r\n const getModelUrl = () => {\r\n if (!product.objUrl) return defaultObj;\r\n\r\n //hack: for sake of development\r\n if (product.objUrl?.length < 10) return defaultObj;\r\n\r\n return product.objUrl;\r\n };\r\n\r\n function saveTexture(model) {\r\n const trackingGuid = createGuid();\r\n const newOrderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: model.fileAsBase64,\r\n fileUrl: '',\r\n fileName: trackingGuid,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n };\r\n\r\n orderDispatch({ type: 'ADD_ORDER_ITEM_TEXTURE_3D', payload: newOrderItem });\r\n }\r\n\r\n useLayoutEffect(() => {\r\n const { sizes } = product;\r\n\r\n //scale factor section:\r\n let scaleFactorDown = 1;\r\n let scaleFactorUp = 1;\r\n\r\n function calculateScaleFactors() {\r\n if (status !== 'loaded') return;\r\n\r\n var downFactor = getScaleDownFactor(image.width, widthValue);\r\n if (downFactor > 0) scaleFactorDown = downFactor;\r\n\r\n var upFactor = getScaleUpFactor(image.width, widthValue);\r\n if (upFactor > 0) scaleFactorUp = upFactor;\r\n }\r\n calculateScaleFactors();\r\n\r\n const images = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem === true\r\n );\r\n const layers = images.map((img, index) => {\r\n let tempLayer;\r\n\r\n if (!img.layerConfig) {\r\n var windowScaled = getRectTransformation(\r\n sizes[index].positionX,\r\n sizes[index].positionY,\r\n sizes[index].width,\r\n sizes[index].height,\r\n scaleFactorDown\r\n );\r\n var rect_scaled = getRectOrientTransformation(\r\n {\r\n x: windowScaled.x,\r\n y: windowScaled.y,\r\n width: img.width,\r\n height: img.height,\r\n },\r\n {\r\n x: windowScaled.x,\r\n y: windowScaled.y,\r\n width: windowScaled.w,\r\n height: windowScaled.h,\r\n }\r\n );\r\n\r\n const newConfig = {\r\n guid: img.guid,\r\n index: index,\r\n x: rect_scaled.x,\r\n y: rect_scaled.y,\r\n width: rect_scaled.w,\r\n height: rect_scaled.h,\r\n scaled: scaleFactorDown !== 1 ? true : false,\r\n };\r\n tempLayer = { ...newConfig };\r\n\r\n orderDispatch({\r\n type: 'UPDATE_ORDER_ITEM_TEXTURE_CONFIG',\r\n payload: newConfig,\r\n });\r\n } else if (img.layerConfig.scaled === false && status == 'loaded') {\r\n var windowRescaled = getRectTransformation(\r\n sizes[index].positionX,\r\n sizes[index].positionY,\r\n sizes[index].width,\r\n sizes[index].height,\r\n scaleFactorDown\r\n );\r\n\r\n var rect_rescaled = getRectOrientTransformation(\r\n {\r\n x: windowRescaled.x,\r\n y: windowRescaled.y,\r\n width: img.width,\r\n height: img.height,\r\n },\r\n {\r\n x: windowRescaled.x,\r\n y: windowRescaled.y,\r\n width: windowRescaled.w,\r\n height: windowRescaled.h,\r\n }\r\n );\r\n\r\n const newConfig = {\r\n guid: img.guid,\r\n index: index,\r\n x: rect_rescaled.x,\r\n y: rect_rescaled.y,\r\n width: rect_rescaled.w,\r\n height: rect_rescaled.h,\r\n scaled: true,\r\n scaleFactorDown: scaleFactorDown,\r\n scaleFactorUp: scaleFactorUp,\r\n };\r\n tempLayer = { ...newConfig };\r\n\r\n orderDispatch({\r\n type: 'UPDATE_ORDER_ITEM_TEXTURE_CONFIG',\r\n payload: newConfig,\r\n });\r\n } else {\r\n tempLayer = { ...img.layerConfig };\r\n }\r\n tempLayer.url = img.fileUrl;\r\n\r\n return tempLayer;\r\n });\r\n\r\n setRectangles([...layers]);\r\n const uri = stageLayerRef.current.toDataURL();\r\n setTextureUrl(uri);\r\n }, [image, order.orderItems, orderDispatch, product, status, widthValue]);\r\n\r\n useEffect(() => {\r\n const uri = stageLayerRef.current.toDataURL();\r\n setTextureUrl(uri);\r\n }, []);\r\n\r\n function getOrderItem() {\r\n if (!order) return null;\r\n const { orderItems } = order;\r\n if (!orderItems) return null;\r\n\r\n const item = orderItems.find(\r\n (x) => x.productId == product.id && !x.isLayerItem\r\n );\r\n return item;\r\n }\r\n\r\n const handleAddQuantity = () => {\r\n const item = getOrderItem();\r\n if (!item) return;\r\n\r\n orderDispatch({\r\n type: 'INCREASE_ORDER_ITEM_QTY',\r\n payload: { guid: item.guid },\r\n });\r\n };\r\n\r\n const handleRemoveQuantity = () => {\r\n const item = getOrderItem();\r\n if (!item) return;\r\n orderDispatch({\r\n type: 'DECRESE_ORDER_ITEM_QTY',\r\n payload: { guid: item.guid },\r\n });\r\n };\r\n\r\n function getQuantity() {\r\n const item = getOrderItem();\r\n if (!item) return 0;\r\n\r\n return item.qty;\r\n }\r\n\r\n return (\r\n <>\r\n {!showEditor && (\r\n \r\n )}\r\n\r\n \r\n {showEditor && (\r\n <>\r\n
\r\n
\r\n \r\n {t('Select file to CROP')}\r\n \r\n
\r\n \r\n {steps.map((step, index) => {\r\n const stepProps = {};\r\n const buttonProps = {};\r\n if (step.fileUrl) {\r\n buttonProps.optional = (\r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n {/* {label} */}\r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n {steps.map((step, index) => {\r\n const key = step.guid;\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n \r\n )}\r\n
\r\n setSelectedMode(true)}\r\n onTouchStart={() => setSelectedMode(true)}\r\n style={{\r\n border: '5px solid #ccc',\r\n margin: '10px auto',\r\n width: '100%',\r\n maxWidth: widthValue,\r\n height: '100%',\r\n maxHeight: heightValue,\r\n // display: 'none',\r\n }}\r\n >\r\n \r\n {rectangles.map((rect, i) => {\r\n return (\r\n {\r\n const rects = rectangles.slice();\r\n rects[i] = newAttrs;\r\n\r\n orderDispatch({\r\n type: 'UPDATE_ORDER_ITEM_TEXTURE_CONFIG_MULTI',\r\n payload: rects,\r\n });\r\n\r\n setRectangles(rects);\r\n const uri = stageLayerRef.current.toDataURL();\r\n setTextureUrl(uri);\r\n }}\r\n />\r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {showEditor && (\r\n
\r\n {t('Quantity')}:\r\n \r\n \r\n \r\n {getQuantity()}\r\n \r\n \r\n \r\n
\r\n )}\r\n {!showEditor && (\r\n setShowEditr(true)} color='primary'>\r\n {t('Adjustment')}\r\n \r\n )}\r\n {showEditor && (\r\n setShowEditr(false)} color='primary'>\r\n {t('Preview')}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Presenter3d;\r\n","//Core\r\nimport React, { useState, useEffect } from 'react';\r\n\r\n//Components\r\nimport Presenter3d from './Presenter3d';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fillWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n m6: {\r\n margin: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n btnContainer: {\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n}));\r\n\r\nconst NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst OtherButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst Render3dDialog = ({ product, isOpen, closeFn, pack }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const [order] = useOrder();\r\n const [copied, setCopied] = useState(false);\r\n\r\n const [isLoading, setIsLoading] = useState(true);\r\n\r\n const handleNext = () => {\r\n closeFn();\r\n history.push(`/photographer/${product.photographerId}/checkout`);\r\n };\r\n\r\n const cacheImages = async (srcArray) => {\r\n const promises = await srcArray.map((src) => {\r\n return new Promise(function (resolve, reject) {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = resolve();\r\n img.onerror = reject();\r\n });\r\n });\r\n\r\n await Promise.all(promises);\r\n\r\n setIsLoading(false);\r\n };\r\n\r\n useEffect(() => {\r\n const layerImg = product.layerImageUrl;\r\n const objUrl = product.objUrl;\r\n const imgs = [layerImg, objUrl];\r\n\r\n cacheImages(imgs);\r\n }, [product.layerImageUrl, product.objUrl]);\r\n\r\n function getOrderItem(items) {\r\n if (!items || items.length == 0) return null;\r\n\r\n const result = items.find(\r\n (i) =>\r\n i.productId == product.id && !i.isLayerItem && i.status == 'success'\r\n );\r\n\r\n return result;\r\n }\r\n\r\n function isShareDisabled() {\r\n if (!order) return true;\r\n\r\n const { orderItems } = order;\r\n\r\n const item = getOrderItem(orderItems);\r\n if (!item) return true;\r\n\r\n return false;\r\n }\r\n\r\n function handleCopy() {\r\n setCopied(true);\r\n }\r\n\r\n const shareUrl = () => {\r\n const baseUrl = window.location.origin;\r\n const { photographerId } = product;\r\n const { id } = product;\r\n\r\n const item = getOrderItem(order.orderItems);\r\n const fullGuidUrl = item?.fileUrl ?? '';\r\n const storageUrl = `${process.env.REACT_APP_STORAGE_PATH}/customerorderphoto`;\r\n const shortGuid = fullGuidUrl.replace(`${storageUrl}/`, '');\r\n const encodedGuid = encodeURIComponent(shortGuid);\r\n\r\n return `${baseUrl}/share3d/${photographerId}/${id}/${encodedGuid}`;\r\n };\r\n\r\n return (\r\n \r\n \r\n {isLoading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n \r\n
\r\n \r\n
\r\n \r\n {t('Back')}\r\n \r\n \r\n \r\n {copied ? t('Copied') : t('Share')}\r\n \r\n \r\n \r\n {t('Next step')}\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Render3dDialog;\r\n","import React from 'react';\r\nimport useImage from 'use-image';\r\nimport { Image, Layer, Rect } from 'react-konva';\r\n\r\nconst Frame = ({frameUrl, width, height, backPhotoLayersConfig, selectedId, hideSelectors}) =>{\r\n const [frameImg] = useImage(frameUrl, 'Anonymous');\r\n const selectedPhoto = backPhotoLayersConfig.find(iL=>iL.id === selectedId);\r\n\r\n return(\r\n \r\n \r\n {selectedPhoto && !hideSelectors && }\r\n \r\n )\r\n}\r\n\r\nexport default Frame;\r\n","import React, {useEffect, useState, useRef} from 'react';\r\nimport { Image, Layer, Text, TextPath } from 'react-konva';\r\n\r\n\r\nconst TextLayer = ({config, setConfig, onSelect}) =>{\r\n const textRef = useRef();\r\n const [offsetX, setOffsetX] = useState(0);\r\n const [offsetY, setOffsetY] = useState(0);\r\n\r\n useEffect(()=>{\r\n setOffsetX(textRef.current.textWidth/2)\r\n setOffsetY(textRef.current.textHeight/2)\r\n }, [config])\r\n\r\n\r\n return(\r\n \r\n {\r\n setConfig({...config, ...e.target._lastPos});\r\n }}\r\n />\r\n \r\n )\r\n}\r\n\r\nexport default TextLayer;\r\n","import React from 'react';\r\nimport { Image, Transformer } from 'react-konva';\r\nimport useImage from 'use-image';\r\n\r\nconst TransformableImage = ({ shapeProps, imgRef, isSelected, onSelect, onChange }) => {\r\n const [image] = useImage(shapeProps.img.props.src, 'Anonymous');\r\n const isEditable = image ? image.src.indexOf(\"https\")>=0 || image.src.indexOf(\"data:image\")>=0 || image.src.indexOf(\"placeholder\")>=0 : false;\r\n \r\n return (\r\n imgRef.current[shapeProps.id] = el}\r\n {...shapeProps}\r\n draggable={isEditable}\r\n onDragEnd={(e) => {\r\n onChange({\r\n ...shapeProps,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n });\r\n }}\r\n onTransformEnd={(e) => {\r\n // transformer is changing scale of the node\r\n // and NOT its width or height\r\n // but in the store we have only width and height\r\n // to match the data better we will reset scale on transform end\r\n const node = imgRef.current[shapeProps.id];\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n\r\n // we will reset it back\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n onChange({\r\n ...shapeProps,\r\n x: node.x(),\r\n y: node.y(),\r\n // set minimal value\r\n width: Math.max(0, node.width() * scaleX),\r\n height: Math.max(node.height() * scaleY),\r\n });\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default TransformableImage;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport UndoIcon from '@material-ui/icons/Undo';\r\nimport RoundButton from './../../core/RoundButton';\r\nimport Box from '@material-ui/core/Box';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n menuBtn: {\r\n display: \"inline-grid\",\r\n margin: \"0px 5px\"\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }\r\n}));\r\n\r\nconst BackBtn = ({fun}) =>{\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {t('Back')}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default BackBtn;\r\n","import React, {useEffect, useState} from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport RoundButton from './../../core/RoundButton';\r\nimport Box from '@material-ui/core/Box';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Select from '@material-ui/core/Select';\r\nimport ColorPicker from 'material-ui-color-picker'\r\nimport Typography from '@material-ui/core/Typography';\r\nimport FormatShapesIcon from '@material-ui/icons/FormatShapes';\r\nimport ColorLensIcon from '@material-ui/icons/ColorLens';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport '../PhotoFrame.css'\r\nimport BackBtn from '../Atoms/BackBtn';\r\n\r\n // {[\"Arial\", \"Courier New\", \"Times New Roman\"].map((font,i)=>\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n oneLineTextPlaceholderSmall: {\r\n marginTop:\"10px\",\r\n width: \"100%\",\r\n height: \"55px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n display: \"none\",\r\n [theme.breakpoints.down(500)]: {\r\n display: \"flex\"\r\n },\r\n },\r\n oneLineTextPlaceholderBig: {\r\n display: \"inline-grid\",\r\n margin: \"0px 5px\",\r\n [theme.breakpoints.down(500)]: {\r\n display: \"none\"\r\n },\r\n },\r\n manuPlaceholder: {\r\n marginTop:\"10px\",\r\n width: \"100%\",\r\n height: \"55px\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(500)]: {\r\n height: \"110px\"\r\n },\r\n [theme.breakpoints.down(350)]: {\r\n height: \"130px\"\r\n }\r\n },\r\n shapeManuPlaceholder:{\r\n marginTop:\"10px\",\r\n width: \"100%\",\r\n height: \"55px\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(500)]: {\r\n display:\"grid\",\r\n height: \"200px\"\r\n },\r\n [theme.breakpoints.down(350)]: {\r\n height: \"130px\"\r\n }\r\n },\r\n resizeLabel:{\r\n margin: \"auto\",\r\n textTransform: \"uppercase\",\r\n fontSize: \"0.8125rem\",\r\n color: \"rgba(0, 0, 0, 0.87)\",\r\n fontFamily: \"Nunito,sans-serif\",\r\n fontWeight: \"500\",\r\n lineHeight: \"1.75\"\r\n },\r\n menuBtn: {\r\n display: \"inline-grid\",\r\n margin: \"0px 5px\"\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }\r\n}));\r\n\r\nconst TextTransformer = ({textSelectedId, setTextSelectedId, textLayers, setTextLayers, sizeRation}) =>{\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const [menuState, setMenuState] = useState(null)\r\n const [rotation, setRotation] = useState(0);\r\n const [scale, setScale] = useState(1);\r\n const [position, setPosition] = useState(null);\r\n\r\n const selectedText = textLayers[textSelectedId];\r\n\r\n const mainMenu = (\r\n <>\r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.text = e.target.value;\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }}\r\n />\r\n \r\n {t('Text')}\r\n \r\n
\r\n
\r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.text = e.target.value;\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }}\r\n />\r\n \r\n {t('Text')}\r\n \r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.fontFamily = e.target.value;\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }}\r\n label=\"Age\"\r\n >\r\n {[\"Arial\", \"Verdana\", \"Tahoma\", \"Trebuchet MS\", \"Times New Roman\", \"Georgia\", \"Garamond\", \"Courier New\", \"Brush Script MT\"].map((font,i)=>\r\n {font}\r\n )}\r\n \r\n \r\n {t('Font')}\r\n \r\n
\r\n
\r\n setMenuState('shape')}\r\n disabled={false}\r\n className={\r\n true ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Shape')}\r\n \r\n \r\n
\r\n
\r\n setMenuState('colors')}\r\n disabled={false}\r\n className={\r\n true ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Colors')}\r\n \r\n \r\n
\r\n setTextSelectedId(null)} />\r\n
\r\n \r\n );\r\n\r\n\r\n\r\n const shapeMenu = (\r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.rotation = parseInt(e.target.value);\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }} />\r\n \r\n {t('Rotation')}\r\n \r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.fontSize = parseInt(e.target.value);\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }} />\r\n \r\n {t('Font size')}\r\n \r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.strokeWidth = parseInt(e.target.value);\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }} />\r\n \r\n {t('Stroke Width')}\r\n \r\n
\r\n setMenuState(null)} />\r\n
\r\n );\r\n\r\n const colorsMenu = (\r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.fillColor = color;\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n console.log(color)\r\n }} />\r\n \r\n {t('Fill')}\r\n \r\n
\r\n
\r\n {\r\n const newTextLayers = [...textLayers];\r\n const editedTextLayer = {...selectedText}\r\n editedTextLayer.strokeColor = color;\r\n newTextLayers[textSelectedId] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }} />\r\n \r\n {t('Stroke')}\r\n \r\n
\r\n setMenuState(null)} />\r\n
\r\n )\r\n\r\n return(\r\n <>\r\n {!menuState && mainMenu}\r\n {menuState === 'shape' && shapeMenu}\r\n {menuState === 'colors' && colorsMenu}\r\n \r\n )\r\n}\r\n\r\n\r\nexport default TextTransformer;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport RoundButton from './../../core/RoundButton';\r\nimport Box from '@material-ui/core/Box';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n menuBtn: {\r\n display: \"inline-grid\",\r\n margin: \"0px 5px\"\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }\r\n}));\r\n\r\nconst BackBtn = ({icon, text, fun}) =>{\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n \r\n \r\n {icon}\r\n {text}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default BackBtn;\r\n","import React, {useEffect, useState} from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Btn from '../Atoms/Btn';\r\nimport UndoIcon from '@material-ui/icons/Undo';\r\nimport AspectRatioIcon from '@material-ui/icons/AspectRatio';\r\nimport RotateRightIcon from '@material-ui/icons/RotateRight';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n scaleAndRotationPlaceholder: {\r\n marginTop:\"10px\",\r\n width: \"100%\",\r\n height: \"55px\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(500)]: {\r\n height: \"110px\"\r\n },\r\n [theme.breakpoints.down(400)]: {\r\n height: \"150px\"\r\n }\r\n },\r\n resizeLabel:{\r\n margin: \"auto\",\r\n textTransform: \"uppercase\",\r\n fontSize: \"0.8125rem\",\r\n color: \"rgba(0, 0, 0, 0.87)\",\r\n fontFamily: \"Nunito,sans-serif\",\r\n fontWeight: \"500\",\r\n lineHeight: \"1.75\"\r\n },\r\n resizeBtn: {\r\n display: \"inline-grid\"\r\n },\r\n changeFileBtn: {\r\n display: \"inline-grid\"\r\n }\r\n}));\r\n\r\nconst ScaleAndRotationTransformer = ({initPos, imgRef, isFrontPhoto, replaceFileBtn, removeFileBtn, setSelectId}) =>{\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n const [rotation, setRotation] = useState(0);\r\n const [scale, setScale] = useState(1);\r\n const [position, setPosition] = useState(null);\r\n const [showRotationBtn, setShowRotationBtn] = useState(false);\r\n const [showResizeBtn, setShowResizeBtn] = useState(false);\r\n\r\n useEffect(()=>{\r\n if(initPos){\r\n const x = initPos.x + initPos.width/2;\r\n const y = initPos.y + initPos.height/2;\r\n setPosition({\r\n x: x + 'px',\r\n y: y + 'px'\r\n })\r\n }\r\n if(imgRef){\r\n const s = imgRef.attrs.scaleX || 1;\r\n const r = imgRef.attrs.rotation || 0;\r\n setScale((s-1)*10);\r\n setRotation(r);\r\n }\r\n },[position])\r\n\r\n useEffect(()=>{\r\n if(imgRef){\r\n imgRef.setAttrs({\r\n scaleX: 1 + scale/10,\r\n scaleY: 1 + scale/10,\r\n rotation: rotation\r\n })\r\n }\r\n },[scale,rotation])\r\n\r\n useEffect(()=>{\r\n if(imgRef){\r\n setScale((imgRef.attrs.scaleX-1)*10 || 0);\r\n setRotation(imgRef.attrs.rotation || 0);\r\n }\r\n },[imgRef])\r\n\r\n\r\n const rotationBtn = (\r\n <>\r\n { !showRotationBtn ?\r\n } text ={t('Rotation')} fun={()=>{setShowRotationBtn(true); setShowResizeBtn(false)}} />:\r\n
\r\n {\r\n const s = parseInt(e.target.value);\r\n setRotation(s)\r\n }} />\r\n \r\n {t('Rotation')}\r\n \r\n
\r\n }\r\n \r\n )\r\n\r\n const resizeBtn = (\r\n <>\r\n { !showResizeBtn ?\r\n } text ={t('Resize')} fun={()=>{setShowRotationBtn(false); setShowResizeBtn(true)}} />:\r\n
\r\n {\r\n const s = parseInt(e.target.value);\r\n setScale(s)\r\n }} />\r\n \r\n {t('Resize')}\r\n \r\n
\r\n }\r\n \r\n )\r\n\r\n const buttons=(\r\n <>\r\n {!showResizeBtn && rotationBtn}\r\n {!showRotationBtn && resizeBtn}\r\n {!showRotationBtn && !showResizeBtn &&\r\n
\r\n {replaceFileBtn}\r\n
\r\n }\r\n {!showRotationBtn && !showResizeBtn && isFrontPhoto &&
\r\n {removeFileBtn}\r\n
}\r\n {(showRotationBtn || showResizeBtn) && } text ={t('Back')} fun={()=>{setShowRotationBtn(false); setShowResizeBtn(false)}} />}\r\n \r\n )\r\n\r\n const noPhotoSelected=(\r\n
\r\n \r\n {t('Select image by clicking it')}\r\n \r\n
\r\n )\r\n\r\n return(\r\n
\r\n
\r\n {imgRef && buttons}\r\n {!imgRef && noPhotoSelected}\r\n {!showRotationBtn && !showResizeBtn && } text ={t('Back')} fun={()=>setSelectId(null)} />}\r\n
\r\n
\r\n )\r\n}\r\n\r\n\r\nexport default ScaleAndRotationTransformer;\r\n","import React, {useEffect, useState} from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n// UI\r\nimport RoundButton from './../../core/RoundButton';\r\nimport Box from '@material-ui/core/Box';\r\nimport WallpaperIcon from '@material-ui/icons/Wallpaper';\r\nimport FormatShapesIcon from '@material-ui/icons/FormatShapes';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n scaleAndRotationPlaceholder: {\r\n marginTop:\"10px\",\r\n width: \"100%\",\r\n height: \"55px\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(500)]: {\r\n height: \"110px\"\r\n },\r\n [theme.breakpoints.down(350)]: {\r\n height: \"130px\"\r\n }\r\n },\r\n resizeLabel:{\r\n margin: \"auto\",\r\n textTransform: \"uppercase\",\r\n fontSize: \"0.8125rem\",\r\n color: \"rgba(0, 0, 0, 0.87)\",\r\n fontFamily: \"Nunito,sans-serif\",\r\n fontWeight: \"500\",\r\n lineHeight: \"1.75\"\r\n },\r\n menuBtn: {\r\n display: \"inline-grid\"\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n smallLineHeight:{\r\n lineHeight: \"15px\"\r\n }\r\n}));\r\n\r\nconst Menu = ({setSelectId, addText, addFloatingImageBtn, replaceTemplateBtn, resetImageBtn}) =>{\r\n const { t } = useTranslation();\r\n const classes = useStyles();\r\n\r\n return(\r\n
\r\n
\r\n
\r\n {resetImageBtn}\r\n
\r\n
\r\n {replaceTemplateBtn && replaceTemplateBtn}\r\n
\r\n
\r\n {addFloatingImageBtn}\r\n
\r\n
\r\n setSelectId(-1)}\r\n disabled={false}\r\n className={\r\n true ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Edit')}
{t('Photo')}
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n {t('Add')}
{t('Text')}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\n//
\r\n// {}}\r\n// disabled={true}\r\n// className={\r\n// true ? classes.visible : classes.hidden\r\n// }\r\n// >\r\n// \r\n// \r\n// {t('Add Shape')}\r\n// \r\n// \r\n//
\r\n\r\nexport default Menu;\r\n","import React, {useEffect, useState} from 'react';\r\nimport { useImageSize } from 'react-image-size';\r\nimport { Stage, Layer } from 'react-konva';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\n\r\nimport Frame from './Components/Frame';\r\nimport TextLayer from './Components/TextLayer';\r\nimport TransformableImage from './Components/TransformableImage';\r\nimport TextTransformer from './Components/TextTransformer';\r\nimport ScaleAndRotationTransformer from './Components/ScaleAndRotationTransformer';\r\nimport Menu from './Components/Menu';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n minHeight: \"300px\",\r\n maxHeight: '700px',\r\n}}));\r\n\r\nconst PhotoFrame = ({ stepData, frameUrl, photos, hideSelectors, setSelectedPhoto, setEditorRef, setEditorRatio, replaceFileBtn, removeFileBtn, addFloatingImageBtn, replaceTemplateBtn, resetImageBtn }) => {\r\n\r\n const initialize = () =>{\r\n let ratio = data.width/parentWidth;\r\n let frameWidth = data.width/ratio;\r\n let frameHeight = data.height/ratio;\r\n\r\n if(frameHeight > 500){\r\n const newParentWidth = parentWidth*500/frameHeight;\r\n ratio = data.width/newParentWidth;\r\n frameWidth = data.width/ratio;\r\n frameHeight = data.height/ratio;\r\n setParentWidth(newParentWidth)\r\n }\r\n\r\n const backPhotoLayersConfig = stepData.filter(d=>d.productConfig).map((d,i)=>{return{\r\n id: \"photo\"+i,\r\n x:d.productConfig.positionX/ratio,\r\n y:d.productConfig.positionY/ratio,\r\n width:d.productConfig.width/ratio,\r\n height:d.productConfig.height/ratio,\r\n clipX: 0,\r\n clipY: 0,\r\n clipWidth: d.productConfig.width/ratio,\r\n clipHeight: d.productConfig.height/ratio\r\n }});\r\n const newBackPhotoLayers = [];\r\n backPhotoLayersConfig.forEach((iL,i)=>{\r\n const photo = photos[i];\r\n if(photo){\r\n let newBackPhotoLayer = {};\r\n if(backPhotoLayers[i] && backPhotoLayers[i].img.props.src === photo.props.src){\r\n newBackPhotoLayer = backPhotoLayers[i];\r\n }else{\r\n const layerRatio = iL.width / iL.height;\r\n const photoRatio = photo.props.naturalWidth / photo.props.naturalHeight;\r\n\r\n let width = 0;\r\n let height = 0;\r\n\r\n if(layerRatio > photoRatio){\r\n width = iL.width;\r\n height = photo.props.naturalHeight * (iL.width / photo.props.naturalWidth );\r\n }else{\r\n width = photo.props.naturalWidth * (iL.height / photo.props.naturalHeight );\r\n height = iL.height;\r\n }\r\n newBackPhotoLayer.x = iL.width/2;\r\n newBackPhotoLayer.y = iL.height/2;\r\n newBackPhotoLayer.offsetX = width/2;\r\n newBackPhotoLayer.offsetY = height/2;\r\n newBackPhotoLayer.width = width;\r\n newBackPhotoLayer.height = height;\r\n newBackPhotoLayer.id = \"photo\"+i;\r\n newBackPhotoLayer.img = photo;\r\n }\r\n newBackPhotoLayers.push(newBackPhotoLayer);\r\n }\r\n })\r\n\r\n const newFrontPhotoLayers = stepData.filter(d=>!d.productConfig).map((d,i)=>{\r\n const photo = photos[newBackPhotoLayers.length+i];\r\n const regex = \"[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\"\r\n const photoGuid = [...photo.props.src.matchAll(regex)].slice(-1)[0][0];\r\n if(frontPhotoLayers[i]){\r\n const frontPhotoLayer = frontPhotoLayers.find(fpl=>[...fpl.img.props.src.matchAll(regex)].slice(-1)[0][0] === photoGuid);\r\n if(frontPhotoLayer){\r\n return frontPhotoLayer;\r\n }\r\n }\r\n\r\n const frameRatio = frameWidth / frameHeight;\r\n const photoRatio = photo.props.naturalWidth / photo.props.naturalHeight;\r\n\r\n let width = 0;\r\n let height = 0;\r\n\r\n if(frameRatio > photoRatio){\r\n width = frameWidth;\r\n height = photo.props.naturalHeight * (frameWidth / photo.props.naturalWidth );\r\n }else{\r\n width = photo.props.naturalWidth * (frameHeight / photo.props.naturalHeight );\r\n height = frameHeight;\r\n }\r\n width = width/4;\r\n height = height/4;\r\n\r\n return{\r\n x: frameWidth/2,\r\n y: frameHeight/2,\r\n offsetX: width/2,\r\n offsetY: height/2,\r\n width: width,\r\n height: height,\r\n id: \"frontPhoto\"+photoGuid,\r\n img: photo,\r\n }\r\n });\r\n\r\n setFrameWidth(frameWidth);\r\n setFrameHeight(frameHeight);\r\n setRatio(ratio);\r\n setEditorRatio(ratio);\r\n setBackPhotoLayersConfig(backPhotoLayersConfig);\r\n setFrontPhotoLayers(newFrontPhotoLayers);\r\n setBackPhotoLayers(newBackPhotoLayers);\r\n }\r\n\r\n const [selectedId, setSelectId] = useState(null);\r\n const [textSelectedId, setTextSelectedId] = useState(null);\r\n const [transformerPosition, setTransformerPosition] = useState(null);\r\n const [parentWidth, setParentWidth] = useState(0);\r\n const [frameWidth, setFrameWidth] = useState();\r\n const [frameHeight, setFrameHeight] = useState();\r\n const [ratio, setRatio] = useState(0);\r\n const [backPhotoLayersConfig, setBackPhotoLayersConfig] = useState();\r\n const [backPhotoLayers, setBackPhotoLayers] = useState([]);\r\n const [frontPhotoLayers, setFrontPhotoLayers] = useState([]);\r\n const [textLayers, setTextLayers] = useState([]);\r\n const classes = useStyles();\r\n const imgRef = React.useRef([]);\r\n const trRef = React.useRef();\r\n const stageRef = React.useRef(null);\r\n const parentRef = React.useRef(null);\r\n const [data, { loading, error }] = useImageSize(frameUrl);\r\n\r\n useEffect(()=>{\r\n setParentWidth(parentRef.current.offsetWidth);\r\n },[parentRef]);\r\n\r\n useEffect(()=>{\r\n if(data && !loading && !error){\r\n initialize();\r\n }\r\n },[data, loading, error, parentWidth, photos]);\r\n\r\n useEffect(() => {\r\n setEditorRef(stageRef);\r\n },[stageRef])\r\n\r\n useEffect(() => {\r\n const ref = imgRef.current[selectedId];\r\n if (ref && trRef.current) {\r\n trRef.current.nodes([ref]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [selectedId, trRef]);\r\n\r\n useEffect(() =>{\r\n const backPhotoSelectedIdx = backPhotoLayers.indexOf(backPhotoLayers.find((img,i)=>img.id === selectedId));\r\n const frontPhotoSelectedIdx = frontPhotoLayers.indexOf(frontPhotoLayers.find((img,i)=>img.id === selectedId));\r\nconsole.log(selectedId, backPhotoSelectedIdx, frontPhotoSelectedIdx, backPhotoLayers.length)\r\n if(backPhotoSelectedIdx>=0){\r\n setTransformerPosition(backPhotoLayersConfig[backPhotoSelectedIdx]);\r\n setSelectedPhoto(backPhotoSelectedIdx);\r\n }else if(frontPhotoSelectedIdx>=0){\r\n setTransformerPosition(null);\r\n setSelectedPhoto(backPhotoLayers.length + frontPhotoSelectedIdx);\r\n }else{\r\n setTransformerPosition(null);\r\n setSelectedPhoto(-1);\r\n }\r\n }, [selectedId, frontPhotoLayers]);\r\n\r\n const checkDeselect = (e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty) {\r\n setSelectId(null);\r\n setTextSelectedId(null);\r\n }\r\n };\r\n\r\n const addText = () =>{\r\n console.log(frameHeight)\r\n const newTextLayer = {\r\n x:100,\r\n y:100,\r\n rotation:0,\r\n text: \"test\",\r\n fontFamily: \"Arial\",\r\n fontSize: (100*frameHeight)/500,\r\n fillColor: \"#000000\",\r\n strokeColor: \"#ff0000\"\r\n }\r\n setTextLayers([...textLayers, newTextLayer]);\r\n setTextSelectedId(textLayers.length);\r\n }\r\n\r\n let composerView = (
);\r\n if(!!data && !loading && !error && !!backPhotoLayersConfig){\r\n composerView = (\r\n <>\r\n \r\n {backPhotoLayers.map((rect, i) =>\r\n \r\n {\r\n setSelectId(rect.id);\r\n setTextSelectedId(null);\r\n }}\r\n onChange={(newAttrs) => {\r\n const rects = backPhotoLayers.slice();\r\n rects[i] = newAttrs;\r\n setBackPhotoLayers(rects);\r\n }}\r\n />\r\n \r\n )}\r\n {frameUrl && }\r\n {frontPhotoLayers.map((rect, i) =>\r\n \r\n {\r\n setSelectId(rect.id);\r\n setTextSelectedId(null);\r\n }}\r\n onChange={(newAttrs) => {\r\n const rects = frontPhotoLayers.slice();\r\n rects[i] = newAttrs;\r\n setFrontPhotoLayers(rects);\r\n }}\r\n />\r\n \r\n )}\r\n {textLayers.map((textLayer, i) =>\r\n {\r\n const newTextLayers = [...textLayers];\r\n newTextLayers[i] = editedTextLayer;\r\n setTextLayers(newTextLayers);\r\n }}\r\n onSelect={() => {\r\n setSelectId(null);\r\n setTextSelectedId(i);\r\n }}\r\n />\r\n )}\r\n \r\n {selectedId && textSelectedId===null && =0:false} replaceFileBtn={replaceFileBtn} removeFileBtn={removeFileBtn} setSelectId={setSelectId}/>}\r\n {!selectedId && textSelectedId!==null && }\r\n {!selectedId && textSelectedId===null && }\r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n {composerView}\r\n
\r\n );\r\n};\r\n\r\nexport default PhotoFrame;\r\n","export default __webpack_public_path__ + \"static/media/share2.20901366.jpg\";","import { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\n\r\nexport const useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n m6: {\r\n margin: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n centerHorizontal: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n },\r\n visible: {\r\n display: 'block',\r\n width: '100%',\r\n },\r\n hidden: {\r\n display: 'none',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n btnContainer: {\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n thumbImage: {\r\n width: '100%',\r\n maxWidth: '100px',\r\n height: '100%',\r\n maxHeight: '60px',\r\n marginTop: '4px',\r\n },\r\n thumbImageSelected: {\r\n width: '100%',\r\n maxWidth: '100px',\r\n height: '100%',\r\n maxHeight: '60px',\r\n marginTop: '4px',\r\n border: 'solid 2px blue',\r\n color: 'red'\r\n },\r\n stepSelected: {\r\n color: 'red'\r\n },\r\n minheight: {\r\n minHeight: '150px',\r\n },\r\n shareBox: {\r\n padding: '10px',\r\n },\r\n newLines: {\r\n whiteSpace: 'pre-line',\r\n textAlign: 'center',\r\n },\r\n previewImage:{\r\n padding: '0px 5px',\r\n width: '100%',\r\n [theme.breakpoints.down('md')]: {\r\n width: '100%',\r\n },\r\n },\r\n previewLabel:{\r\n position: 'relative',\r\n top: '20px'\r\n },\r\n returnToPageBtn:{\r\n position: 'relative',\r\n left: '20px',\r\n bottom: '80px',\r\n background: '#fff',\r\n [theme.breakpoints.down('md')]: {\r\n left: '10px',\r\n bottom: '60px',\r\n },\r\n },\r\n vericalMiddleOnMobile:{ \r\n overflow: 'hidden',\r\n position: 'relative',\r\n left: '0px',\r\n right: '0px',\r\n padding: '0px 5px',\r\n [theme.breakpoints.down('md')]: {\r\n position: 'absolute',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n }\r\n },\r\n smallLineHeight:{\r\n lineHeight: \"15px\"\r\n }\r\n}));\r\n\r\nexport const NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nexport const OtherButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\n\r\nexport const CircularProgressWithLabel = (props ) =>{\r\n return (\r\n \r\n \r\n \r\n {`${Math.round(props.value)}%`}\r\n \r\n \r\n );\r\n}\r\n\r\nexport const LinearProgressWithLabel = (props) =>{\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {`${Math.round(\r\n props.value,\r\n )}%`}\r\n \r\n \r\n );\r\n}","//Core\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n//Components\r\nimport View3d from '../../3d/View3d';\r\nimport RoundButton from './../../core/RoundButton';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\nimport { createGuid } from '../../../core/helpers/guidHelper';\r\n\r\n//UI\r\nimport AddPhotoAlternateOutlined from '@material-ui/icons/AddPhotoAlternateOutlined';\r\nimport Box from '@material-ui/core/Box';\r\nimport CachedIcon from '@material-ui/icons/Cached';\r\nimport DeleteOutlineOutlined from'@material-ui/icons/DeleteOutlineOutlined';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport DoneAllIcon from '@material-ui/icons/DoneAll';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Stepper from '@material-ui/core/Stepper';\r\nimport Step from '@material-ui/core/Step';\r\nimport StepButton from '@material-ui/core/StepButton';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport VisibilityIcon from '@material-ui/icons/Visibility';\r\n\r\nimport PhotoFrame from '../../PhotoFrame/PhotoFrame';\r\n\r\n//Assets\r\nimport shareImg from '../../../assets/share2.jpg';\r\nimport { useStyles, NextButton, OtherButton} from './Buttons';\r\nimport { isMobile } from 'react-device-detect';\r\n\r\n\r\nconst Render3dWizard = ({ product, isOpen, closeFn, pack, modelUrl, selectedAttributes }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n\r\n const [copied, setCopied] = useState(false);\r\n const [activeStep, setActiveStep] = React.useState(0);\r\n const [finalImage, setFinalImage] = useState(null);\r\n const [refresh, setRefresh] = useState(0);\r\n const [isShareOpen, setIsShareOpen] = useState(false);\r\n const [editorRef, setEditorRef] = useState();\r\n const [editorRatio, setEditorRatio] = useState(0);\r\n const [hideSelectors, setHideSelectors] = useState(false);\r\n const [selectedPhoto, setSelectedPhoto] = useState(-1);\r\n\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const drawingCanvasRef = useRef(null);\r\n\r\n const handleNext = () => {\r\n closeFn();\r\n saveTexture(finalImage);\r\n history.push(`/photographer/${product.photographerId}/checkout`);\r\n };\r\n\r\n const handleClose = () => {\r\n setIsShareOpen(false);\r\n closeFn();\r\n };\r\n\r\n function getOrderItem(items) {\r\n if (!items || items.length == 0) return null;\r\n\r\n const result = items.find(\r\n (i) =>\r\n i.productId == product.id && !i.isLayerItem && i.status == 'success'\r\n );\r\n\r\n return result;\r\n }\r\n\r\n function getProductConfig(i) {\r\n if (!product) return null;\r\n const { sizes } = product;\r\n if (!sizes) return null;\r\n\r\n return product.sizes[i];\r\n }\r\n\r\n const steps = React.useMemo(() => {\r\n function getSteps() {\r\n const images = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem === true\r\n );\r\n images.forEach((s, index) => {\r\n const sizeConfig = getProductConfig(index);\r\n if (sizeConfig) s.productConfig = sizeConfig;\r\n });\r\n\r\n const editStep = {\r\n type: 'edit',\r\n data: images,\r\n };\r\n\r\n const previewStep = {\r\n type: 'preview',\r\n data: {},\r\n };\r\n\r\n return [editStep, previewStep];\r\n }\r\n\r\n const newSteps = getSteps();\r\n return newSteps;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [order.orderItems]);\r\n\r\n useEffect(() => {\r\n let last = steps.length - 1;\r\n if (last < 0) last = 0;\r\n setActiveStep(0);\r\n }, [steps.length]);\r\n\r\n const handleStep = (step) => () => {\r\n setActiveStep(step);\r\n };\r\n\r\n function saveTexture(model) {\r\n console.log(\"jest\")\r\n const trackingGuid = createGuid();\r\n const newOrderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: model,\r\n fileUrl: '',\r\n fileName: `${trackingGuid}.jpg`,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n };\r\n\r\n orderDispatch({ type: 'ADD_ORDER_ITEM_TEXTURE_3D', payload: newOrderItem });\r\n setIsShareOpen(true);\r\n }\r\n\r\n function handleCopy() {\r\n setCopied(true);\r\n }\r\n\r\n function isShareDisabled() {\r\n if (!order) return true;\r\n\r\n const { orderItems } = order;\r\n\r\n const item = getOrderItem(orderItems);\r\n if (!item) return true;\r\n\r\n return false;\r\n }\r\n\r\n function isAcceptUploading() {\r\n const { orderItems } = order;\r\n const acceptedItem = orderItems.find(\r\n (i) => i.productId == product.id && !i.isLayerItem\r\n );\r\n\r\n if (!acceptedItem) return false;\r\n\r\n if (acceptedItem.status == 'processing') return true;\r\n\r\n return false;\r\n }\r\n isAcceptUploading();\r\n function isThisLastStep() {\r\n if (steps.length == activeStep + 1) return true;\r\n\r\n return false;\r\n }\r\n\r\n function showAcceptButton() {\r\n const isShareDisabledResult = isShareDisabled();\r\n const last = activeStep + 1 >= steps.length;\r\n const result = last && isShareDisabledResult;\r\n\r\n return result;\r\n }\r\n\r\n const showShareButton = isThisLastStep();\r\n const showNextButton = isThisLastStep();\r\n\r\n const shareUrl = () => {\r\n const baseUrl = window.location.origin;\r\n const { photographerId } = product;\r\n const { id } = product;\r\n\r\n const item = getOrderItem(order.orderItems);\r\n const fullGuidUrl = item?.fileUrl ?? '';\r\n const storageUrl = `${process.env.REACT_APP_STORAGE_PATH}/customerorderphoto`;\r\n const shortGuid = fullGuidUrl.replace(`${storageUrl}/`, '');\r\n const encodedGuid = encodeURIComponent(shortGuid);\r\n\r\n return `${baseUrl}/share3d/${photographerId}/${id}/${encodedGuid}`;\r\n };\r\n\r\n const handleUploadClick = () => {\r\n fileInput.click();\r\n };\r\n const fileInputAddHandler = (event) => {\r\n // const limit = getMaxFileLimit();\r\n // const actual = getUploadedFilesCount();\r\n //\r\n // if (limit <= actual) return;\r\n\r\n const { files } = event.target;\r\n for (let i = 0; i < files.length; i++) {\r\n // if (actual + 1 + i > limit) return;\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(file),\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n };\r\n orderDispatch({ type: 'ADD_ORDER_ITEM_AT_END', payload: orderItem });\r\n // executeScroll();\r\n };\r\n };\r\n }\r\n };\r\n const fileInputUpateHandler = (e) => {\r\n const { files } = e.target;\r\n const newFile = files[0] ?? null;\r\n if (!newFile) return;\r\n\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(newFile);\r\n const currentItem = steps[activeStep].data[selectedPhoto] ?? null;\r\n\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n oldGuid: currentItem.guid,\r\n newGuid: trackingGuid,\r\n maxSize: product.size,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(newFile),\r\n fileName: newFile.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n };\r\n orderDispatch({ type: 'REPLACE_ORDER_ITEM', payload: orderItem });\r\n };\r\n };\r\n };\r\n\r\n useEffect(() => {\r\n const last = activeStep + 1 == steps.length;\r\n if (isOpen && last) {\r\n setTimeout(() => {\r\n setRefresh((prev) => prev + 1);\r\n }, 5000);\r\n }\r\n }, [steps.length, refresh, activeStep, isOpen]);\r\n\r\n const removeSelectedPhoto = () =>{\r\n setSelectedPhoto(null);\r\n orderDispatch({\r\n type: 'DECRESE_ORDER_ITEM_QTY',\r\n payload: { guid: steps[0].data[selectedPhoto].guid },\r\n });\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {steps.map((step, index) => {\r\n const stepProps = {};\r\n const buttonProps = {};\r\n if (step.type == 'edit' && step.data[0]?.fileUrl) {\r\n buttonProps.icon=();\r\n }\r\n if (step.type == 'preview' && product.imageUrl) {\r\n buttonProps.icon=;\r\n }\r\n if (step.type == 'share') {\r\n buttonProps.optional = (\r\n
\r\n \r\n
\r\n );\r\n }\r\n return (\r\n \r\n \r\n {/* {label} */}\r\n \r\n \r\n );\r\n })}\r\n
\r\n\r\n {steps.map((step, index) => {\r\n if (step.type == 'edit') {\r\n if(index === activeStep && finalImage){\r\n setHideSelectors(false);\r\n setFinalImage(null);\r\n }\r\n const stepImages = step.data.map((d,i)=>());\r\n const replaceFileBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={selectedPhoto<0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Replace')}\r\n \r\n \r\n
\r\n );\r\n const removeFileBtn = (\r\n
\r\n removeSelectedPhoto()}\r\n disabled={selectedPhoto<0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Remove')}\r\n \r\n \r\n
\r\n )\r\n const addFloatingImageBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={false}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Add photo')}\r\n \r\n \r\n
\r\n );\r\n return (\r\n
\r\n\r\n \r\n
\r\n )\r\n }\r\n if (step.type == 'preview') {\r\n if(index === activeStep && !finalImage){\r\n if(!hideSelectors){\r\n setHideSelectors(true);\r\n }else{\r\n\r\n setTimeout(()=>{\r\n const uri = editorRef.current.toDataURL({\r\n pixelRatio: editorRatio\r\n });\r\n setFinalImage(uri);\r\n }, 500);\r\n }\r\n }\r\n return (\r\n
\r\n \r\n {finalImage && (\r\n {}}\r\n attributes={selectedAttributes}\r\n />\r\n )}\r\n {!finalImage && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n
\r\n
\r\n );\r\n }\r\n if (step.type == 'share') {\r\n return (\r\n
\r\n \r\n

share page step

\r\n
\r\n
\r\n );\r\n }\r\n })}\r\n\r\n \r\n
\r\n \r\n
\r\n {showAcceptButton() ? (\r\n <>\r\n setActiveStep(0)}\r\n color='primary'\r\n className={classes.m6}\r\n >\r\n {t('Back')}\r\n \r\n saveTexture(finalImage)}\r\n color='primary'\r\n className={classes.m6}\r\n disabled={isAcceptUploading()}\r\n >\r\n {isAcceptUploading() ? : t('Accept')}\r\n \r\n \r\n ):(\r\n <>\r\n \r\n {t('Back')}\r\n \r\n setActiveStep(1)}\r\n color='primary'\r\n className={classes.m6}\r\n disabled={isAcceptUploading()}\r\n >\r\n {isAcceptUploading() ? : t('Next')}\r\n \r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
{t('ShareCTA')}
\r\n
\r\n \r\n \r\n
\r\n {showShareButton && (\r\n \r\n \r\n {copied ? t('Copied') : t('Share')}\r\n \r\n \r\n )}\r\n {showNextButton && (\r\n \r\n {t('Next step')}\r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Render3dWizard;\r\n","//Core\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n//Components\r\nimport RoundButton from '../core/RoundButton';\r\nimport FileListItem from './FileListItem';\r\nimport PriceRangeList from './PriceRangeList';\r\nimport AttributesList from './AttributesList';\r\nimport Render3dDialog from './Render3dDialog';\r\nimport Render3dWizard from './Render3dWizard/Render3dWizard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { createGuid } from '../../core/helpers/guidHelper';\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\nimport { MobileView, isBrowser, isMobile } from 'react-device-detect';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Container from '@material-ui/core/Container';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport AddPhotoAlternateIcon from '@material-ui/icons/AddPhotoAlternate';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ShoppingCartIcon from '@material-ui/icons/ShoppingCart';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport BackIcon from '@material-ui/icons/ArrowBack';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fillWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n}));\r\n\r\nconst NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst OptionsButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst RemoveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#dc3545',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #dc3545',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#dc3545',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst Basic3dDialog = ({ product, isOpen, closeFn }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n const scrollToRef = useRef(null);\r\n const scrollOptionsRef = useRef(null);\r\n\r\n const [pack, setPack] = useState(1);\r\n const [open3d, setOpen3d] = useState(false);\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const getMaxFileLimit = () => {\r\n const max = product?.sizes?.length ?? 1;\r\n return max;\r\n };\r\n\r\n const getUploadedFilesCount = () => {\r\n if (!order || order.orderItems?.length === 0) return 0;\r\n\r\n const uploadedFiles = order.orderItems.filter(\r\n (i) => i.productId === product.id\r\n );\r\n return uploadedFiles?.length ?? 0;\r\n };\r\n\r\n const disableUploadButton = () => {\r\n const limit = getMaxFileLimit();\r\n const current = getUploadedFilesCount();\r\n\r\n return current >= limit;\r\n };\r\n\r\n const executeScroll = () =>\r\n scrollToRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const executeOptionsScroll = () =>\r\n scrollOptionsRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const fileInputHandler = (event) => {\r\n const limit = getMaxFileLimit();\r\n const actual = getUploadedFilesCount();\r\n\r\n if (limit <= actual) return;\r\n\r\n const { files } = event.target;\r\n for (let i = 0; i < files.length; i++) {\r\n if (actual + 1 + i > limit) return;\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(file),\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n };\r\n\r\n orderDispatch({ type: 'ADD_ORDER_ITEM', payload: orderItem });\r\n executeScroll();\r\n };\r\n };\r\n }\r\n };\r\n\r\n const handleUploadClick = () => {\r\n fileInput.click();\r\n };\r\n\r\n const renderFiles = () => {\r\n return order.orderItems\r\n .filter(\r\n (item) => item.productId === product.id && item.isLayerItem === true\r\n )\r\n ?.map((item) => (\r\n \r\n ));\r\n };\r\n\r\n const handleRemoveAll = () => {\r\n orderDispatch({\r\n type: 'REMOVE_ORDER_ITEMS_FOR_PRODUCT',\r\n payload: { productId: product.id },\r\n });\r\n };\r\n\r\n const isNextDisabled = () => {\r\n const files = order.orderItems.filter(\r\n (item) =>\r\n item.productId === product.id &&\r\n item.isLayerItem === true &&\r\n item.status === 'success'\r\n );\r\n\r\n const limit = getMaxFileLimit();\r\n\r\n return files.length !== limit;\r\n };\r\n\r\n const calculatePrice = () => {\r\n // const quantity = order.orderItems\r\n // .filter((item) => item.productId === product.id)\r\n // .reduce((sum, item) => sum + item.qty, 0);\r\n return getLabelPrice(product.id, 1, photographer, order);\r\n };\r\n\r\n const attributesAvailable = () => {\r\n if (!product) return false;\r\n if (!product.attributes) return false;\r\n\r\n return product.attributes.length > 0;\r\n };\r\n\r\n function isUploadingFiles() {\r\n const { orderItems } = order;\r\n\r\n const items = orderItems.filter(\r\n (i) => i.productId == product.id && i.status != 'success'\r\n );\r\n\r\n if (!items || items.length == 0) return false;\r\n\r\n return true;\r\n }\r\n\r\n const orderItemsConfigs = order.orderItemsConfig.find(oic=>oic.productId === product.id)?.configs;\r\n const groups = {}\r\n product.attributes.forEach(a=>{\r\n if(!groups[a.attributesGroupId]){\r\n groups[a.attributesGroupId] = [{...a}]\r\n }else{\r\n groups[a.attributesGroupId].push({...a})\r\n }\r\n })\r\n const selectedAttributes = Object.keys(groups).map((g)=>{\r\n const selected = orderItemsConfigs?.find(c=>c.groupId === Number(g))?.selected;\r\n return {groupId: Number(g), selected: selected || groups[g].sort((a, b) => a.position < b.position)[0].id }\r\n })\r\n const selectedAttributesFull = selectedAttributes.map(a=>groups[a.groupId]?.find(g=>g.id===a.selected));\r\n const selectedProduct = photographer.products.find(p=>p.mainProductId ===product.id && selectedAttributes.every(g=>p.autoGeneratedDefinition.includes(\"a\"+g.selected)))\r\n const selectedModel = selectedAttributesFull.find(a=>a.configuration?.modelUrl)?.configuration?.modelUrl || \"https://oistigmesstorage.blob.core.windows.net/models3d/kubek4.obj\";\r\n\r\n// TODO: remove after fixing images\r\n const selectedProductImg = selectedProduct?.imageUrl?.replaceAll(\" \", \"%20\") ||\r\n selectedProduct?.fileName ? `${process.env.REACT_APP_STORAGE_PATH}/mobile/${photographer.photographId}/Product/${selectedProduct?.fileGuid}_${selectedProduct?.fileName?.replaceAll(\" \", \"%20\")}`:null;\r\n\r\n return (\r\n <>\r\n \r\n\r\n\r\n \r\n \r\n theme.palette.grey[500],\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('filesLimit', { limit: getMaxFileLimit() })}\r\n \r\n \r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={disableUploadButton()}\r\n >\r\n \r\n \r\n {t('Pick files')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n \r\n \r\n {formatPrice(calculatePrice())} €\r\n \r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n {renderFiles()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('REMOVE ALL')}\r\n \r\n \r\n \r\n setOpen3d(true)}\r\n color='primary'\r\n disabled={isNextDisabled()}\r\n >\r\n {isUploadingFiles() ? (\r\n \r\n ) : (\r\n t('Next step')\r\n )}\r\n \r\n \r\n \r\n {attributesAvailable() && (\r\n \r\n \r\n {t('OPTIONS')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n setOpen3d(false)}\r\n product={product}\r\n modelUrl={selectedModel}\r\n selectedAttributes={selectedAttributesFull}\r\n pack={pack}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default Basic3dDialog;\r\n","export default __webpack_public_path__ + \"static/media/placeholder.1cf4d4d9.jpg\";","//Core\r\nimport React, { useState, useEffect, useRef, useMemo } from 'react';\r\n\r\n//Components\r\nimport View3d from '../../3d/View3d';\r\nimport RoundButton from './../../core/RoundButton';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\nimport { createGuid } from '../../../core/helpers/guidHelper';\r\n\r\n//UI\r\nimport AddPhotoAlternateOutlined from '@material-ui/icons/AddPhotoAlternateOutlined';\r\nimport Box from '@material-ui/core/Box';\r\nimport CachedIcon from '@material-ui/icons/Cached';\r\nimport DeleteOutlineOutlined from'@material-ui/icons/DeleteOutlineOutlined';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport DoneAllIcon from '@material-ui/icons/DoneAll';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Stepper from '@material-ui/core/Stepper';\r\nimport Step from '@material-ui/core/Step';\r\nimport StepButton from '@material-ui/core/StepButton';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport VisibilityIcon from '@material-ui/icons/Visibility';\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday';\r\nimport ImageIcon from '@material-ui/icons/Image';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\n\r\n\r\nimport PhotoFrame from '../../PhotoFrame/PhotoFrame';\r\n\r\n//Assets\r\nimport shareImg from '../../../assets/share2.jpg';\r\nimport placeholderImg from '../../../assets/placeholder.jpg';\r\nimport { useStyles, NextButton, OtherButton, CircularProgressWithLabel, LinearProgressWithLabel} from './Buttons';\r\nimport { isMobile } from 'react-device-detect';\r\nimport { DialogTitle } from '@material-ui/core';\r\n\r\nlet hidden = null;\r\nlet visibilityChange = null;\r\nif (typeof document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support \r\n hidden = 'hidden';\r\n visibilityChange = 'visibilitychange';\r\n} else if (typeof document.msHidden !== 'undefined') {\r\n hidden = 'msHidden';\r\n visibilityChange = 'msvisibilitychange';\r\n} else if (typeof document.webkitHidden !== 'undefined') {\r\n hidden = 'webkitHidden';\r\n visibilityChange = 'webkitvisibilitychange';\r\n}\r\n\r\nconst RenderAlbumWizard = ({ product, isOpen, closeFn, pack, modelUrl, selectedAttributes }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n\r\n const [copied, setCopied] = useState(false);\r\n const [activeStep, setActiveStep] = React.useState(0);\r\n const [finalImages, setFinalImages] = useState([]);\r\n const [refresh, setRefresh] = useState(0);\r\n const [isShareOpen, setIsShareOpen] = useState(false);\r\n const [editorRef, setEditorRef] = useState([]);\r\n const [editorRatio, setEditorRatio] = useState(0);\r\n const [hideSelectors, setHideSelectors] = useState(false);\r\n const [selectedPhoto, setSelectedPhoto] = useState(-1);\r\n const [lastActivatedStep, setLastActivatedStep] = useState(-1)\r\n const [pausing, setPausing] = useState(false);\r\n const [selectedFrames, setSelectedFrames] = useState([]);\r\n const [placeholderImages, setPlaceholderImages] = useState([]);\r\n const [runSetAllSelectedFrames, setRunSetAllSelectedFrames] = useState(false);\r\n const [enableReturnToPreviewBtn, setEnableReturnToPreviewBtn] = useState(false);\r\n\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const drawingCanvasRef = useRef(null);\r\n\r\n const allImagesLoaded = useMemo(()=> order.orderItems.every(oi=>oi.status===\"success\"));\r\n\r\n // useEffect(() => {\r\n // const onBeforeUnload = (e) => {\r\n // e.preventDefault();\r\n // e.returnValue = \"\";\r\n // };\r\n // window.addEventListener(\"beforeunload\", onBeforeUnload);\r\n // window.addEventListener(\"pagehide\", onBeforeUnload); \r\n // window.addEventListener(visibilityChange, onBeforeUnload, false); \r\n // return () => {\r\n // window.removeEventListener(\"beforeunload\", onBeforeUnload);\r\n // window.removeEventListener(\"pagehide\", onBeforeUnload);\r\n // window.removeEventListener(visibilityChange, onBeforeUnload, ); \r\n // };\r\n // }, []);\r\n\r\n const maxPerPage = useMemo(()=>\r\n Math.max(\r\n ...Object.values(\r\n product.sizes\r\n .filter(s=>s.page!==0)\r\n .map(s=>s.page)\r\n .reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {})\r\n ))\r\n , [product.sizes]);\r\n\r\n const selectedAttributesFull = useMemo(()=>{\r\n const groups = {}\r\n product.attributes.forEach(a=>{\r\n if(!groups[a.attributesGroupId]){\r\n groups[a.attributesGroupId] = [{...a}]\r\n }else{\r\n groups[a.attributesGroupId].push({...a})\r\n }\r\n })\r\n return selectedAttributes.map(a=>groups[a.attributesGroupId]?.find(g=>g.id===a.id));\r\n },[selectedAttributes]);\r\n\r\n const pageCount = useMemo(()=>{\r\n return selectedAttributesFull.find(saf=>saf.configuration && saf.configuration.pageCount).configuration.pageCount + 1;\r\n }, [product.attributes, selectedAttributesFull]);\r\n\r\n useEffect(()=>{\r\n // if(isOpen){\r\n const extraItem = {\r\n fileName: \"placeholder.jpg\",\r\n fileUrl: placeholderImg,\r\n guid: createGuid(),\r\n imageGuid: \"\",\r\n isLayerItem: true,\r\n maxSize: null,\r\n productId: 'placeholder',\r\n set: pack,\r\n qty: 1/product.layerImageUrls.length,\r\n status: 'success',\r\n width: 800,\r\n height: 600\r\n }\r\n const orderItems = [];\r\n for(let i=0; i {\r\n if(activeStep<(steps.length-1)){\r\n setLastActivatedStep(activeStep+1);\r\n setActiveStep(activeStep+1);\r\n setPausing(true);\r\n setTimeout(()=>{\r\n saveImg()\r\n }, 1); \r\n setTimeout(()=>{\r\n setPausing(false);\r\n }, 100)\r\n if(steps[activeStep+1].type == 'preview'){\r\n setEnableReturnToPreviewBtn(true)\r\n }\r\n }else{\r\n history.push(`/photographer/${product.photographerId}/checkout`);\r\n }\r\n };\r\n\r\n const handleReturnToPreview = () =>{\r\n setLastActivatedStep(activeStep+1);\r\n setActiveStep(steps.length-1);\r\n setPausing(true);\r\n setTimeout(()=>{\r\n saveImg()\r\n }, 1); \r\n setTimeout(()=>{\r\n setPausing(false);\r\n }, 100)\r\n }\r\n\r\n const handleBack = () => {\r\n if(activeStep>0){\r\n if(activeStep<(steps.length-1)){\r\n saveImg();\r\n }\r\n setActiveStep(activeStep-1);\r\n }else{\r\n handleClose();\r\n }\r\n };\r\n\r\n const hadleReturnToPage = (i) =>{\r\n setActiveStep(i);\r\n }\r\n\r\n const saveImg = () =>{\r\n setHideSelectors(true)\r\n // setTimeout(()=>{\r\n const uri = editorRef[activeStep].current.toDataURL({\r\n pixelRatio: editorRatio,\r\n mimeType: \"image/jpeg\",\r\n quality: 0.9\r\n });\r\n const uriMini = editorRef[activeStep].current.toDataURL({\r\n pixelRatio: editorRatio/10,\r\n mimeType: \"image/jpeg\",\r\n quality: 0.8\r\n });\r\n const newFinalImages = [...finalImages];\r\n let operation = 'ADD_ORDER_ITEM'\r\n let guid = createGuid();\r\n if(!newFinalImages[activeStep]){\r\n newFinalImages[activeStep] = {uriMini, guid};\r\n operation = 'ADD_ORDER_ITEM';\r\n }else{\r\n guid = newFinalImages[activeStep].guid;\r\n newFinalImages[activeStep].uriMini = uriMini;\r\n operation = 'REPLACE_ORDER_ITEM';\r\n } \r\n const newOrderItem = {\r\n maxSize: product.size,\r\n guid: guid,\r\n fileAsBase64: uri,\r\n fileUrl: '',\r\n fileName: `${guid}.jpg`,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1/product.layerImageUrls.length,\r\n status: 'idle',\r\n };\r\n orderDispatch({ type: operation, payload: newOrderItem });\r\n setFinalImages(newFinalImages);\r\n setHideSelectors(false)\r\n // }, 500);\r\n\r\n }\r\n\r\n const handleClose = () => {\r\n if(window.confirm(\"You changes will be lost\")){ \r\n setIsShareOpen(false);\r\n closeFn();\r\n }\r\n };\r\n\r\n function getOrderItem(items) {\r\n if (!items || items.length == 0) return null;\r\n\r\n const result = items.find(\r\n (i) =>\r\n i.productId == product.id && !i.isLayerItem && i.status == 'success'\r\n );\r\n\r\n return result;\r\n }\r\n\r\n function getProductConfig(i) {\r\n if (!product) return null;\r\n const { sizes } = product;\r\n if (!sizes) return null;\r\n\r\n return product.sizes.flat()[i];\r\n }\r\n\r\n function getProductConfigForPage(p) {\r\n if (!product) return null;\r\n const { sizes } = product;\r\n if (!sizes) return null;\r\n\r\n return product.sizes.flat().filter(s=>s.page === p);\r\n }\r\n\r\n const steps = React.useMemo(() => {\r\n function getSteps() {\r\n const images = [...order.orderItems].filter(\r\n (i) => (i.productId === product.id || i.productId === 'placeholder') && i.isLayerItem === true\r\n );\r\n \r\n const editSteps = Array.apply(null, Array(pageCount)).map(function () {}).map((liu, i)=>{\r\n const prevPageImages = i * maxPerPage;\r\n const data = images.filter((img,ii)=>\r\n img.productConfig &&\r\n img.productConfig.page === i)\r\n // ii>=prevPageImages &&\r\n // ii{\r\n if(es.data.length>0){\r\n const sizes = getProductConfigForPage(i)\r\n sizes.forEach((s,ii)=>{\r\n // if(es.data[ii] && !es.data[ii].productConfig && es.data[ii].page===undefined){\r\n if(es.data[ii] && !es.data[ii].productConfig){\r\n es.data[ii].productConfig = {};\r\n } \r\n })\r\n }\r\n })\r\n \r\n const floatingImages = images.filter(i=>i.page!==undefined);\r\n floatingImages.forEach(fi=>editSteps[fi.page].data.push(fi));\r\n\r\n const previewStep = {\r\n type: 'preview',\r\n data: {},\r\n };\r\n // setPlaceholderImages(placeholderImages);\r\n return [...editSteps, previewStep ];\r\n }\r\n\r\n const newSteps = getSteps();\r\n return newSteps;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [placeholderImages, selectedFrames, order.orderItems, allImagesLoaded]);\r\n\r\n useEffect(() => {\r\n let last = steps.length - 1;\r\n if (last < 0) last = 0;\r\n setActiveStep(0);\r\n }, [steps.length]);\r\n\r\n const handleStep = (step) => () => {\r\n setActiveStep(step);\r\n };\r\n\r\n function handleCopy() {\r\n setCopied(true);\r\n }\r\n\r\n function isShareDisabled() {\r\n if (!order) return true;\r\n\r\n const { orderItems } = order;\r\n\r\n const item = getOrderItem(orderItems);\r\n if (!item) return true;\r\n\r\n return false;\r\n }\r\n\r\n const getOrderItemsCompletegCount = () =>{\r\n const { orderItems } = order;\r\n return orderItems.filter(\r\n (i) => i.productId == product.id && !i.isLayerItem\r\n ).filter(\r\n ai=>ai.status !== 'processing' && ai.status !== 'idle'\r\n ).length;\r\n }\r\n\r\n const getOrderItemsCount = () =>{\r\n const { orderItems } = order;\r\n return orderItems.filter(\r\n (i) => i.productId == product.id && !i.isLayerItem\r\n ).length;\r\n }\r\n\r\n const getUplodingProgress = () =>{\r\n const { orderItems } = order;\r\n const acceptedItems = orderItems.filter(\r\n (i) => i.productId == product.id && !i.isLayerItem\r\n );\r\n const completedItems = acceptedItems.filter(\r\n ai=>ai.status !== 'processing' && ai.status !== 'idle'\r\n ).length;\r\n return 100 * completedItems / acceptedItems.length;\r\n }\r\n\r\n function isAcceptUploading() {\r\n let isIdle = false;\r\n const { orderItems } = order;\r\n const acceptedItems = orderItems.filter(\r\n (i) => i.productId == product.id && !i.isLayerItem\r\n );\r\n\r\n if (acceptedItems.some(ai=>!ai)){\r\n isIdle = false;\r\n }\r\n else if (acceptedItems.some(ai=>ai.status == 'processing' || ai.status == 'idle') ){\r\n isIdle = true;\r\n }else{\r\n isIdle = false;\r\n }\r\n\r\n return (isIdle && activeStep===(steps.length-1)) || pausing;\r\n }\r\n isAcceptUploading();\r\n\r\n function isThisLastStep() {\r\n if (steps.length == activeStep + 1) return true;\r\n\r\n return false;\r\n }\r\n\r\n function showAcceptButton() {\r\n const isShareDisabledResult = isShareDisabled();\r\n const last = activeStep + 1 >= steps.length;\r\n const result = last && isShareDisabledResult;\r\n\r\n return result;\r\n }\r\n\r\n // const showShareButton = isThisLastStep();\r\n // const showNextButton = isThisLastStep();\r\n\r\n const shareUrl = () => {\r\n const baseUrl = window.location.origin;\r\n const { photographerId } = product;\r\n const { id } = product;\r\n\r\n const item = getOrderItem(order.orderItems);\r\n const fullGuidUrl = item?.fileUrl ?? '';\r\n const storageUrl = `${process.env.REACT_APP_STORAGE_PATH}/customerorderphoto`;\r\n const shortGuid = fullGuidUrl.replace(`${storageUrl}/`, '');\r\n const encodedGuid = encodeURIComponent(shortGuid);\r\n\r\n return `${baseUrl}/share3d/${photographerId}/${id}/${encodedGuid}`;\r\n };\r\n\r\n const handleUploadClick = (replace) => {\r\n if(!replace) {\r\n setSelectedPhoto(-1)\r\n }\r\n fileInput.click();\r\n };\r\n\r\n const fileInputAddHandler = (event) => {\r\n const { files } = event.target;\r\n for (let i = 0; i < files.length; i++) {\r\n // if (actual + 1 + i > limit) return;\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(file),\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n page: activeStep\r\n };\r\n orderDispatch({ type: 'ADD_ORDER_ITEM_AT_END', payload: orderItem });\r\n // executeScroll();\r\n };\r\n };\r\n }\r\n };\r\n\r\n const fileInputUpateHandler = (e) => {\r\n const { files } = e.target;\r\n const newFile = files[0] ?? null;\r\n if (!newFile) return;\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(newFile);\r\n const currentItem = steps[activeStep].data[selectedPhoto] ?? null;\r\n \r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n oldGuid: currentItem.guid,\r\n newGuid: trackingGuid,\r\n maxSize: product.size,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(newFile),\r\n fileName: newFile.name,\r\n productId: product.id,\r\n productConfig: {...currentItem.productConfig},\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n page: currentItem.page\r\n };\r\n const fileToReplace = order.orderItems.find(oI=>oI.guid === orderItem.oldGuid);\r\n if(fileToReplace){ \r\n orderDispatch({ type: 'REPLACE_ORDER_ITEM', payload: orderItem });\r\n }else{\r\n const newPlaceholderImages = [...placeholderImages];\r\n newPlaceholderImages[activeStep*maxPerPage+selectedPhoto].productConfig=undefined;\r\n setPlaceholderImages(newPlaceholderImages);\r\n orderItem.guid=trackingGuid; \r\n orderDispatch({ type: 'ADD_ORDER_ITEM_AT_END', payload: orderItem });\r\n }\r\n };\r\n };\r\n };\r\n\r\n useEffect(() => {\r\n const last = activeStep + 1 == steps.length;\r\n if (isOpen && last) {\r\n setTimeout(() => {\r\n setRefresh((prev) => prev + 1);\r\n }, 5000);\r\n }\r\n }, [steps.length, refresh, activeStep, isOpen]);\r\n\r\n const removeSelectedPhoto = () =>{\r\n setSelectedPhoto(null);\r\n orderDispatch({\r\n type: 'DECRESE_ORDER_ITEM_QTY',\r\n payload: { guid: steps[activeStep].data.filter(d=>d.fileName!==\"placeholder.jpg\")[selectedPhoto].guid },\r\n });\r\n }\r\n\r\n const setOneSelectedFrame = (liu, pageNum, templateNum) =>{\r\n const newSelectedFrames = [...selectedFrames];\r\n const newPlaceholderImages = [...placeholderImages];\r\n const count = product.sizes.filter(s=>s.page===templateNum).length;\r\n\r\n const prevPageImages = pageNum * maxPerPage;\r\n const images = [...order.orderItems]\r\n .filter(\r\n (i) => (i.productId === product.id || i.productId === 'placeholder') && i.isLayerItem === true\r\n ).filter((img,ii)=>\r\n img.productConfig &&\r\n img.productConfig.page === pageNum\r\n );\r\n\r\n for(let j=0; js.page===templateNum).forEach((s,ii)=>{\r\n if(images[ii]){\r\n images[ii].productConfig = {...s, page:pageNum};\r\n }\r\n })\r\n \r\n newSelectedFrames[pageNum] = {fileUrl: liu.fileUrl, count, images };\r\n setSelectedFrames(newSelectedFrames)\r\n setPlaceholderImages(newPlaceholderImages)\r\n }\r\n\r\n const distributePhotos = (photos, nums, target, size) =>{\r\n const schemas = [];\r\n const backtrack = (remaining, currentCombination, start) =>{\r\n if (remaining === 0 && currentCombination.length === size) {\r\n schemas.push([...currentCombination]);\r\n return;\r\n }\r\n\r\n if (remaining < 0 || currentCombination.length === size) {\r\n return;\r\n }\r\n\r\n for (let i = start; i < nums.length; i++) {\r\n currentCombination.push(nums[i]);\r\n backtrack(remaining - nums[i], currentCombination, i); // Allow reusing the same number\r\n currentCombination.pop();\r\n }\r\n }\r\n // if(schemas.length===0) return[];\r\n backtrack(target, [], 0);\r\n let schema = schemas.reduce((prev, curr) =>\r\n Math.max(...(curr.join('').match(/(.)\\1*/g).map(s => s.length))) <\r\n Math.max(...(prev.join('').match(/(.)\\1*/g).map(s => s.length))) ? curr : prev\r\n ).sort(() => Math.random() - 0.5);\r\n\r\n let idx = photos.length - target;\r\n const result = [];\r\n if(schema){\r\n schema.forEach(s=>{\r\n const pageSchema = []\r\n for(let i=0; i{\r\n const newSelectedFrames = [];\r\n\r\n if (product.sizes.length === 0 || order.orderItems.length===0 ){\r\n return ;\r\n }\r\n\r\n const images = [...order.orderItems]\r\n .filter( (i) => (i.productId === product.id || i.productId === 'placeholder') && i.isLayerItem === true )\r\n\r\n const coverPagesCount = product.sizes.filter(s=>s.page===0).length;\r\n const pageUsage = Object.values(product.sizes.map(s=>s.page).reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {}));\r\n const pageUsageWithNoCover = [...pageUsage];\r\n pageUsageWithNoCover.shift();\r\n const pages = distributePhotos(images, pageUsageWithNoCover, images.length-coverPagesCount, pageCount-1,);\r\n\r\n for(let i=0; is.page===0)\r\n images2 = [...images.filter((img, idx)=>idx < coverPagesCount)];\r\n imagesCount = images2.length;\r\n }else{//rest of pages \r\n images2 = pages[i-1];\r\n imagesCount = images2?.length;\r\n const idexs = pageUsage.reduce((idxs, v, idx) => { if (v === images2?.length) { idxs.push(idx); } return idxs; }, []).filter(i=>i!==0);\r\n const idex = idexs[Math.floor(Math.random()*idexs.length)]\r\n sizesForPage = product.sizes.filter(s=>s.page===idex)\r\n }\r\n\r\n const prevPageImages = i * maxPerPage;\r\n for(let ii=0; ii{\r\n const newSelectedFrames = [...selectedFrames];\r\n newSelectedFrames[index] = null;\r\n setSelectedFrames(newSelectedFrames)\r\n }\r\n\r\n useEffect(()=>{ \r\n setAllSelectedFrames();\r\n },[pageCount, isOpen]);\r\n\r\n \r\n return (\r\n <>\r\n \r\n \r\n

\r\n {steps[activeStep].type == 'coverEdit' && steps[activeStep].data[0]?.fileUrl && <>Cover}\r\n {steps[activeStep].type == 'calendarEdit' && steps[activeStep].data[0]?.fileUrl && <>Page {activeStep}}\r\n {steps[activeStep].type == 'preview' && steps[activeStep].imageUrl && <>Preview}\r\n

\r\n\r\n
\r\n \r\n
\r\n {steps.map((step, index) => {\r\n if (step.type == 'coverEdit' || step.type == 'calendarEdit') {\r\n\r\n const stepImages = step.data\r\n .filter((sI, i)=>step.data[i].productConfig?.page>=0 || step.data[i].page>=0)\r\n .map((d,i)=>());\r\n \r\n const stepData = step.data.filter(d=>d.productConfig?.page>=0 || d.page>=0) \r\n const replaceFileBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick(true)}\r\n disabled={selectedPhoto<0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Replace')}\r\n \r\n \r\n
\r\n );\r\n const replaceTemplateBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n clearSelectedFrames(activeStep)}\r\n disabled={index===0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Replace')}
{t('Template')}
\r\n
\r\n \r\n
\r\n );\r\n const removeFileBtn = (\r\n
\r\n removeSelectedPhoto()}\r\n disabled={selectedPhoto<0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Remove')}\r\n \r\n \r\n
\r\n )\r\n const addFloatingImageBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick(false)}\r\n disabled={false}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Add')}
{t('photo')}
\r\n
\r\n \r\n
\r\n );\r\n\r\n const resetImageBtn = (\r\n
\r\n {\r\n const liu = product.layerImageUrls.find(liu=>liu.fileUrl===selectedFrames[activeStep].fileUrl);\r\n const liuIdx = product.layerImageUrls.indexOf(liu);\r\n clearSelectedFrames(activeStep);\r\n setTimeout(()=>{\r\n setOneSelectedFrame({...liu}, activeStep, liuIdx);\r\n },1);\r\n }}\r\n disabled={false}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('reset')}
{t('photos')}
\r\n
\r\n \r\n
\r\n );\r\n if(index == activeStep || index<=lastActivatedStep){\r\n if(selectedFrames[index]){\r\n return (\r\n
\r\n {if(index==activeStep){setSelectedPhoto(v)}}}\r\n setEditorRef={(ref)=>{\r\n const newEditorRef = [...editorRef];\r\n newEditorRef[activeStep] = ref;\r\n setEditorRef(newEditorRef);\r\n }}\r\n setEditorRatio={setEditorRatio}\r\n replaceFileBtn={replaceFileBtn}\r\n removeFileBtn={removeFileBtn}\r\n addFloatingImageBtn={addFloatingImageBtn}\r\n resetImageBtn={resetImageBtn}\r\n replaceTemplateBtn={replaceTemplateBtn}/>\r\n
\r\n )\r\n }else{\r\n return(\r\n
\r\n
\r\n \r\n {product.layerImageUrls\r\n .filter((liu,i)=>i>0)\r\n .map((liu,i)=>( \r\n \r\n setOneSelectedFrame(liu, index, i+1)}/>\r\n \r\n ))\r\n }\r\n \r\n
\r\n
\r\n )\r\n }\r\n }\r\n }\r\n if (step.type == 'preview') {\r\n return(\r\n
\r\n
\r\n \r\n {finalImages?.map((fi,i)=>\r\n \r\n \r\n
{i==0?t('Cover'):t('Page ')+i}
\r\n hadleReturnToPage(i)}>\r\n \r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n )\r\n }\r\n if (step.type == 'share') {\r\n return (\r\n
\r\n \r\n

share page stepdfdfd

\r\n
\r\n
\r\n );\r\n }\r\n })}\r\n\r\n \r\n
\r\n \r\n \r\n
\r\n {!(steps[activeStep].type == 'preview' && getUplodingProgress()<100) && !enableReturnToPreviewBtn && \r\n \r\n {isAcceptUploading() ? : t('Back')}\r\n \r\n }\r\n {steps[activeStep].type == 'preview' && getUplodingProgress()<100 && \r\n
\r\n
{t('Please wait')}
\r\n
\r\n
\r\n }\r\n {!(steps[activeStep].type == 'preview' && getUplodingProgress()<100) && (steps[activeStep].type == 'preview' || !enableReturnToPreviewBtn) && \r\n <>\r\n {steps[activeStep].type == 'preview' && \r\n {isAcceptUploading() ? : t('Nexts')}\r\n }\r\n \r\n {isAcceptUploading() ? : t('Next')}\r\n \r\n \r\n }\r\n {steps[activeStep].type != 'preview' && enableReturnToPreviewBtn &&\r\n \r\n {t('Go to preview')}\r\n \r\n }\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
{t('ShareCTA')}
\r\n
\r\n
\r\n \r\n
\r\n \r\n {t('Next step')}\r\n \r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default RenderAlbumWizard;\r\n","//Core\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n//Components\r\nimport RoundButton from '../core/RoundButton';\r\nimport FileListItem from './FileListItem';\r\nimport PriceRangeList from './PriceRangeList';\r\nimport AttributesList from './AttributesList';\r\nimport RenderAlbumWizard from './Render3dWizard/RenderAlbumWizard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { createGuid } from '../../core/helpers/guidHelper';\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\nimport { MobileView, isBrowser, isMobile } from 'react-device-detect';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Container from '@material-ui/core/Container';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport AddPhotoAlternateIcon from '@material-ui/icons/AddPhotoAlternate';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ShoppingCartIcon from '@material-ui/icons/ShoppingCart';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport BackIcon from '@material-ui/icons/ArrowBack';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fillWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n}));\r\n\r\nconst NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst OptionsButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst RemoveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#dc3545',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #dc3545',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#dc3545',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst BasicAlbumDialog = ({ product, isOpen, closeFn }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n const scrollToRef = useRef(null);\r\n const scrollOptionsRef = useRef(null);\r\n\r\n const [pack, setPack] = useState(1);\r\n const [openAlbum, setOpenAlbum] = useState(false);\r\n const [selectedPhotoCount, setSelectedPhotoCount] = useState(0)\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const getMinFileLimit = () => {\r\n const minPerPage = \r\n Math.min(\r\n ...Object.values(\r\n product.sizes\r\n .filter(s=>s.page!==0)\r\n .map(s=>s.page)\r\n .reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {})\r\n ));\r\n const coverPageCount = product.sizes.filter(s=>s.page===0).length;\r\n const pageCount = selectedAttributesFull.find(saf=>saf.configuration && saf.configuration.pageCount).configuration.pageCount;\r\n return coverPageCount + (pageCount * minPerPage);\r\n };\r\n\r\n const getMaxFileLimit = () => {\r\n const maxPerPage = \r\n Math.max(\r\n ...Object.values(\r\n product.sizes\r\n .filter(s=>s.page!==0)\r\n .map(s=>s.page)\r\n .reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {})\r\n ));\r\n const coverPageCount = product.sizes.filter(s=>s.page===0).length;\r\n const pageCount = selectedAttributesFull.find(saf=>saf.configuration && saf.configuration.pageCount).configuration.pageCount;\r\n return coverPageCount + (pageCount * maxPerPage);\r\n };\r\n\r\n const getUploadedFilesCount = () => {\r\n if (!order || order.orderItems?.length === 0) return 0;\r\n\r\n const uploadedFiles = order.orderItems.filter(\r\n (i) => i.productId === product.id\r\n );\r\n return uploadedFiles?.length ?? 0;\r\n };\r\n\r\n const disableUploadButton = () => {\r\n const maxLimit = getMaxFileLimit();\r\n const current = getUploadedFilesCount();\r\n\r\n return current >= maxLimit;\r\n };\r\n\r\n const executeScroll = () =>\r\n scrollToRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const executeOptionsScroll = () =>\r\n scrollOptionsRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const fileInputHandler = (event) => {\r\n const limit = getMaxFileLimit();\r\n const actual = getUploadedFilesCount();\r\n\r\n if (limit <= actual) return;\r\n\r\n const { files } = event.target;\r\n setSelectedPhotoCount(limit > selectedPhotoCount + files.length ? \r\n selectedPhotoCount + files.length : \r\n limit\r\n );\r\n for (let i = 0; i < files.length; i++) {\r\n if (actual + 1 + i > limit) return;\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const fileAsBase64 = resizeBase64(tempImg);\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: null,\r\n fileUrl: fileAsBase64,\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'success',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n };\r\n\r\n orderDispatch({ type: 'ADD_ORDER_ITEM', payload: orderItem });\r\n executeScroll();\r\n };\r\n };\r\n }\r\n };\r\n\r\n const resizeBase64 = (img) =>{\r\n let newWidth;\r\n let newHeight;\r\n const naturalWidth = img.naturalWidth;\r\n const naturalHeight = img.naturalHeight;\r\n\r\n if(naturalHeight<1920 && naturalWidth<1920){\r\n newWidth = naturalWidth\r\n newHeight = naturalHeight;\r\n }else if(naturalHeight>naturalWidth){\r\n newHeight = 1920;\r\n newWidth = 1920 * naturalWidth / naturalHeight;\r\n }else{\r\n newHeight = 1920 * naturalWidth / naturalHeight;\r\n newWidth = 1920;\r\n }\r\n\r\n var canvas = document.createElement('canvas'),\r\n ctx = canvas.getContext('2d');\r\n\r\n canvas.width = newWidth;\r\n canvas.height = newHeight;\r\n ctx.drawImage(img, 0, 0, newWidth, newHeight);\r\n return canvas.toDataURL('image/jpeg', 0.9);\r\n}\r\n \r\n const handleUploadClick = () => {\r\n fileInput.click();\r\n };\r\n\r\n const renderFiles = () => {\r\n return order.orderItems\r\n .filter(\r\n (item) => item.productId === product.id && item.isLayerItem === true\r\n )\r\n ?.map((item) => (\r\n \r\n ));\r\n };\r\n\r\n const handleRemoveAll = () => {\r\n orderDispatch({\r\n type: 'REMOVE_ORDER_ITEMS_FOR_PRODUCT',\r\n payload: { productId: product.id },\r\n });\r\n };\r\n\r\n const isNextDisabled = () => {\r\n const files = order.orderItems.filter(\r\n (item) =>\r\n item.productId === product.id &&\r\n item.isLayerItem === true &&\r\n item.status === 'success'\r\n );\r\n\r\n const maxLimit = getMaxFileLimit();\r\n const minLimit = getMinFileLimit();\r\n\r\n return files.length > maxLimit || files.length < minLimit;\r\n };\r\n\r\n const calculatePrice = () => {\r\n // const quantity = order.orderItems\r\n // .filter((item) => item.productId === product.id)\r\n // .reduce((sum, item) => sum + item.qty, 0);\r\n return getLabelPrice(product.id, 1, photographer, order);\r\n };\r\n\r\n const attributesAvailable = () => {\r\n if (!product) return false;\r\n if (!product.attributes) return false;\r\n\r\n return product.attributes.length > 0;\r\n };\r\n\r\n function isUploadingFiles() {\r\n const { orderItems } = order;\r\n\r\n const items = orderItems.filter(\r\n (i) => i.productId == product.id && i.status != 'success'\r\n );\r\n \r\n if (orderItems.length !== selectedPhotoCount) return true;\r\n if (!items || items.length == 0) return false;\r\n\r\n return true;\r\n }\r\n\r\n const orderItemsConfigs = order.orderItemsConfig.find(oic=>oic.productId === product.id)?.configs;\r\n const groups = {}\r\n product.attributes.forEach(a=>{\r\n if(!groups[a.attributesGroupId]){\r\n groups[a.attributesGroupId] = [{...a}]\r\n }else{\r\n groups[a.attributesGroupId].push({...a})\r\n }\r\n })\r\n const selectedAttributes = Object.keys(groups).map((g)=>{\r\n const selected = orderItemsConfigs?.find(c=>c.groupId === Number(g))?.selected;\r\n return {groupId: Number(g), selected: selected || groups[g].sort((a, b) => a.position < b.position)[0].id }\r\n })\r\n const selectedAttributesFull = selectedAttributes.map(a=>groups[a.groupId]?.find(g=>g.id===a.selected));\r\n const selectedProduct = photographer.products.find(p=>p.mainProductId ===product.id && selectedAttributes.every(g=>p.autoGeneratedDefinition.includes(\"a\"+g.selected)))\r\n const selectedModel = selectedAttributesFull.find(a=>a.configuration?.modelUrl)?.configuration?.modelUrl || \"https://oistigmesstorage.blob.core.windows.net/models3d/kubek4.obj\";\r\n\r\n// TODO: remove after fixing images\r\n const selectedProductImg = selectedProduct?.imageUrl?.replaceAll(\" \", \"%20\") ||\r\n selectedProduct?.fileName ? `${process.env.REACT_APP_STORAGE_PATH}/mobile/${photographer.photographId}/Product/${selectedProduct?.fileGuid}_${selectedProduct?.fileName?.replaceAll(\" \", \"%20\")}`:null;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n theme.palette.grey[500],\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('filesLimitMin', { limit:getMinFileLimit() })}
\r\n {t('filesLimit', { limit: order.orderItems.length + '/' + getMaxFileLimit() })}\r\n
\r\n \r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={disableUploadButton()}\r\n >\r\n \r\n \r\n {t('Pick files')}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n \r\n \r\n {formatPrice(calculatePrice())} €\r\n \r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n {renderFiles()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('REMOVE ALL')}\r\n \r\n \r\n \r\n setOpenAlbum(true)}\r\n color='primary'\r\n disabled={isNextDisabled()}\r\n >\r\n {isUploadingFiles() ? (\r\n \r\n ) : (\r\n t('Next step')\r\n )}\r\n \r\n \r\n \r\n {attributesAvailable() && (\r\n \r\n \r\n {t('OPTIONS')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {setOpenAlbum(false); window.location.reload() }}\r\n product={product}\r\n modelUrl={selectedModel}\r\n selectedAttributes={selectedAttributesFull}\r\n pack={pack}\r\n />\r\n \r\n );\r\n};\r\n\r\n// closeFn={() => {setOpenAlbum(false); setTimeout(()=>handleRemoveAll(),1000); }}\r\nexport default BasicAlbumDialog;\r\n","//Core\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n//Components\r\nimport View3d from '../../3d/View3d';\r\nimport RoundButton from '../../core/RoundButton';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\nimport { createGuid } from '../../../core/helpers/guidHelper';\r\n\r\n//UI\r\nimport AddPhotoAlternateOutlined from '@material-ui/icons/AddPhotoAlternateOutlined';\r\nimport Box from '@material-ui/core/Box';\r\nimport CachedIcon from '@material-ui/icons/Cached';\r\nimport DeleteOutlineOutlined from'@material-ui/icons/DeleteOutlineOutlined';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport DoneAllIcon from '@material-ui/icons/DoneAll';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Stepper from '@material-ui/core/Stepper';\r\nimport Step from '@material-ui/core/Step';\r\nimport StepButton from '@material-ui/core/StepButton';\r\nimport VisibilityIcon from '@material-ui/icons/Visibility';\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday';\r\nimport ImageIcon from '@material-ui/icons/Image';\r\n\r\nimport PhotoFrame from '../../PhotoFrame/PhotoFrame';\r\n\r\n//Assets\r\nimport shareImg from '../../../assets/share2.jpg';\r\nimport { useStyles, NextButton, OtherButton} from './Buttons';\r\nimport { isMobile } from 'react-device-detect';\r\n\r\n\r\nconst RenderCalendarWizard = ({ product, isOpen, closeFn, pack, modelUrl, selectedAttributes }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n\r\n const [copied, setCopied] = useState(false);\r\n const [activeStep, setActiveStep] = React.useState(0);\r\n const [finalImages, setFinalImages] = useState([]);\r\n const [refresh, setRefresh] = useState(0);\r\n const [isShareOpen, setIsShareOpen] = useState(false);\r\n const [editorRef, setEditorRef] = useState([]);\r\n const [editorRatio, setEditorRatio] = useState(0);\r\n const [hideSelectors, setHideSelectors] = useState(false);\r\n const [selectedPhoto, setSelectedPhoto] = useState(-1);\r\n const [lastActivatedStep, setLastActivatedStep] = useState(-1)\r\n const [pausing, setPausing] = useState(false);\r\n\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const drawingCanvasRef = useRef(null);\r\n\r\n const handleNext = () => {\r\n if(activeStep<(steps.length-1)){\r\n saveImg()\r\n setLastActivatedStep(activeStep+1);\r\n setActiveStep(activeStep+1);\r\n setPausing(true);\r\n setTimeout(()=>{\r\n setPausing(false);\r\n }, 500)\r\n }else{\r\n history.push(`/photographer/${product.photographerId}/checkout`);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if(activeStep>0){\r\n if(activeStep<(steps.length-1)){\r\n saveImg();\r\n }\r\n setActiveStep(activeStep-1);\r\n }else{\r\n handleClose();\r\n }\r\n };\r\n\r\n const saveImg = () =>{\r\n setHideSelectors(true)\r\n setTimeout(()=>{\r\n const uri = editorRef[activeStep].current.toDataURL({\r\n pixelRatio: editorRatio\r\n });\r\n const newFinalImages = [...finalImages];\r\n let operation = 'ADD_ORDER_ITEM'\r\n let guid = createGuid();\r\n if(!newFinalImages[activeStep]){\r\n newFinalImages[activeStep] = {uri, guid};\r\n operation = 'ADD_ORDER_ITEM';\r\n }else{\r\n guid = newFinalImages[activeStep].guid;\r\n newFinalImages[activeStep].uri = uri;\r\n operation = 'REPLACE_ORDER_ITEM';\r\n }\r\n const newOrderItem = {\r\n maxSize: product.size,\r\n guid: guid,\r\n fileAsBase64: uri,\r\n fileUrl: '',\r\n fileName: `${guid}.jpg`,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1/product.layerImageUrls.length,\r\n status: 'idle',\r\n };\r\n orderDispatch({ type: operation, payload: newOrderItem });\r\n setFinalImages(newFinalImages);\r\n setHideSelectors(false)\r\n }, 500);\r\n\r\n }\r\n\r\n const handleClose = () => {\r\n setIsShareOpen(false);\r\n closeFn();\r\n };\r\n\r\n function getOrderItem(items) {\r\n if (!items || items.length == 0) return null;\r\n\r\n const result = items.find(\r\n (i) =>\r\n i.productId == product.id && !i.isLayerItem && i.status == 'success'\r\n );\r\n\r\n return result;\r\n }\r\n\r\n function getProductConfig(i) {\r\n if (!product) return null;\r\n const { sizes } = product;\r\n if (!sizes) return null;\r\n\r\n return product.sizes.flat()[i];\r\n }\r\n\r\n const steps = React.useMemo(() => {\r\n function getSteps() {\r\n const images = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem === true\r\n );\r\n images.forEach((s, index) => {\r\n const sizeConfig = getProductConfig(index);\r\n if (sizeConfig) s.productConfig = sizeConfig;\r\n });\r\n\r\n const editSteps = product.layerImageUrls.map((liu, i)=>{\r\n const prevPageImages = product.sizes.filter((s,si)=>s.page\r\n ii>=prevPageImages &&\r\n iis.page===i).length)\r\n }\r\n })\r\n \r\n const floatingImages = images.filter(i=>i.page!==undefined);\r\n floatingImages.forEach(fi=>editSteps[fi.page].data.push(fi));\r\n\r\n const previewStep = {\r\n type: 'preview',\r\n data: {},\r\n };\r\n\r\n return [...editSteps, previewStep ];\r\n }\r\n\r\n const newSteps = getSteps();\r\n return newSteps;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [order.orderItems]);\r\n\r\n useEffect(() => {\r\n let last = steps.length - 1;\r\n if (last < 0) last = 0;\r\n setActiveStep(0);\r\n }, [steps.length]);\r\n\r\n const handleStep = (step) => () => {\r\n setActiveStep(step);\r\n };\r\n\r\n function handleCopy() {\r\n setCopied(true);\r\n }\r\n\r\n function isShareDisabled() {\r\n if (!order) return true;\r\n\r\n const { orderItems } = order;\r\n\r\n const item = getOrderItem(orderItems);\r\n if (!item) return true;\r\n\r\n return false;\r\n }\r\n\r\n function isAcceptUploading() {\r\n let isIdle = false;\r\n const { orderItems } = order;\r\n const acceptedItems = orderItems.filter(\r\n (i) => i.productId == product.id && !i.isLayerItem\r\n );\r\n\r\n if (acceptedItems.some(ai=>!ai)){\r\n isIdle = false;\r\n }\r\n else if (acceptedItems.some(ai=>ai.status == 'processing' || ai.status == 'idle') ){\r\n isIdle = true;\r\n }else{\r\n isIdle = false;\r\n }\r\n\r\n return (isIdle && activeStep===(steps.length-1)) || pausing;\r\n }\r\n isAcceptUploading();\r\n\r\n function isThisLastStep() {\r\n if (steps.length == activeStep + 1) return true;\r\n\r\n return false;\r\n }\r\n\r\n function showAcceptButton() {\r\n const isShareDisabledResult = isShareDisabled();\r\n const last = activeStep + 1 >= steps.length;\r\n const result = last && isShareDisabledResult;\r\n\r\n return result;\r\n }\r\n\r\n // const showShareButton = isThisLastStep();\r\n // const showNextButton = isThisLastStep();\r\n\r\n const shareUrl = () => {\r\n const baseUrl = window.location.origin;\r\n const { photographerId } = product;\r\n const { id } = product;\r\n\r\n const item = getOrderItem(order.orderItems);\r\n const fullGuidUrl = item?.fileUrl ?? '';\r\n const storageUrl = `${process.env.REACT_APP_STORAGE_PATH}/customerorderphoto`;\r\n const shortGuid = fullGuidUrl.replace(`${storageUrl}/`, '');\r\n const encodedGuid = encodeURIComponent(shortGuid);\r\n\r\n return `${baseUrl}/share3d/${photographerId}/${id}/${encodedGuid}`;\r\n };\r\n\r\n const handleUploadClick = () => {\r\n fileInput.click();\r\n };\r\n const fileInputAddHandler = (event) => {\r\n // const limit = getMaxFileLimit();\r\n // const actual = getUploadedFilesCount();\r\n //\r\n // if (limit <= actual) return;\r\n\r\n const { files } = event.target;\r\n for (let i = 0; i < files.length; i++) {\r\n // if (actual + 1 + i > limit) return;\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(file),\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n page: activeStep\r\n };\r\n orderDispatch({ type: 'ADD_ORDER_ITEM_AT_END', payload: orderItem });\r\n // executeScroll();\r\n };\r\n };\r\n }\r\n };\r\n const fileInputUpateHandler = (e) => {\r\n const { files } = e.target;\r\n const newFile = files[0] ?? null;\r\n if (!newFile) return;\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(newFile);\r\n const currentItem = steps[activeStep].data[selectedPhoto] ?? null;\r\n\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n oldGuid: currentItem.guid,\r\n newGuid: trackingGuid,\r\n maxSize: product.size,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(newFile),\r\n fileName: newFile.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n page: currentItem.page\r\n };\r\n orderDispatch({ type: 'REPLACE_ORDER_ITEM', payload: orderItem });\r\n };\r\n };\r\n };\r\n\r\n useEffect(() => {\r\n const last = activeStep + 1 == steps.length;\r\n if (isOpen && last) {\r\n setTimeout(() => {\r\n setRefresh((prev) => prev + 1);\r\n }, 5000);\r\n }\r\n }, [steps.length, refresh, activeStep, isOpen]);\r\n\r\n const removeSelectedPhoto = () =>{\r\n setSelectedPhoto(null);\r\n orderDispatch({\r\n type: 'DECRESE_ORDER_ITEM_QTY',\r\n payload: { guid: steps[activeStep].data[selectedPhoto].guid },\r\n });\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n

\r\n {steps[activeStep].type == 'coverEdit' && steps[activeStep].data[0]?.fileUrl && <>Cover}\r\n {steps[activeStep].type == 'calendarEdit' && steps[activeStep].data[0]?.fileUrl && <>Page {product.layerImageUrls[0].isCover ? activeStep : activeStep+1}}\r\n {steps[activeStep].type == 'preview' && steps[activeStep].imageUrl && <>Preview}\r\n

\r\n\r\n {steps.map((step, index) => {\r\n if (step.type == 'coverEdit' || step.type == 'calendarEdit') {\r\n\r\n const stepImages = step.data.map((d,i)=>());\r\n const replaceFileBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={selectedPhoto<0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Replace')}\r\n \r\n \r\n
\r\n );\r\n const removeFileBtn = (\r\n
\r\n removeSelectedPhoto()}\r\n disabled={selectedPhoto<0}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Remove')}\r\n \r\n \r\n
\r\n )\r\n const addFloatingImageBtn = (\r\n
\r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={false}\r\n className={\r\n index == activeStep ? classes.visible : classes.hidden\r\n }\r\n >\r\n \r\n \r\n {t('Add photo')}\r\n \r\n \r\n
\r\n );\r\n if(index == activeStep || index<=lastActivatedStep){\r\n return (\r\n
\r\n\r\n {\r\n const newEditorRef = [...editorRef];\r\n newEditorRef[activeStep] = ref;\r\n setEditorRef(newEditorRef);\r\n }}\r\n setEditorRatio={setEditorRatio}\r\n replaceFileBtn={replaceFileBtn}\r\n removeFileBtn={removeFileBtn}\r\n addFloatingImageBtn={addFloatingImageBtn}/>\r\n
\r\n )\r\n }\r\n }\r\n if (step.type == 'preview') {\r\n return(\r\n
\r\n
\r\n {finalImages?.map(fi=> )}\r\n
\r\n
\r\n )\r\n }\r\n if (step.type == 'share') {\r\n return (\r\n
\r\n \r\n

share page stepdfdfd

\r\n
\r\n
\r\n );\r\n }\r\n })}\r\n\r\n \r\n \r\n \r\n
\r\n \r\n {isAcceptUploading() ? : t('Back')}\r\n \r\n \r\n {isAcceptUploading() ? : t('Next')}\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
{t('ShareCTA')}
\r\n
\r\n
\r\n \r\n
\r\n \r\n {t('Next step')}\r\n \r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default RenderCalendarWizard;\r\n","//Core\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n//Components\r\nimport RoundButton from '../core/RoundButton';\r\nimport FileListItem from './FileListItem';\r\nimport PriceRangeList from './PriceRangeList';\r\nimport AttributesList from './AttributesList';\r\nimport RenderCalendarWizard from './Render3dWizard/RenderCalendarWizard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { createGuid } from '../../core/helpers/guidHelper';\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\nimport { MobileView, isBrowser, isMobile } from 'react-device-detect';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Container from '@material-ui/core/Container';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport AddPhotoAlternateIcon from '@material-ui/icons/AddPhotoAlternate';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ShoppingCartIcon from '@material-ui/icons/ShoppingCart';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport BackIcon from '@material-ui/icons/ArrowBack';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n fillWidth: {\r\n width: '100%',\r\n },\r\n p6: {\r\n padding: '6px',\r\n },\r\n centerContent: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n spaceBetweenContent: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n title: {\r\n color: '#3A3A3A',\r\n fontWeight: 600,\r\n marginBottom: '20px',\r\n },\r\n description: {\r\n marginBottom: '20px',\r\n },\r\n mb24: {\r\n marginBottom: '24px',\r\n },\r\n}));\r\n\r\nconst NextButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst OptionsButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#28a745',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #28a745',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#28a745',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst RemoveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n color: '#dc3545',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n border: '1px solid #dc3545',\r\n '&:hover': {\r\n color: 'white',\r\n backgroundColor: '#dc3545',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst BasicCalendarDialog = ({ product, isOpen, closeFn }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n let fileInput = null;\r\n const scrollToRef = useRef(null);\r\n const scrollOptionsRef = useRef(null);\r\n\r\n const [pack, setPack] = useState(1);\r\n const [openAlbum, setOpenAlbum] = useState(false);\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const getMaxFileLimit = () => {\r\n const max = product?.sizes?.flat().length ?? 1;\r\n return max;\r\n };\r\n\r\n const getUploadedFilesCount = () => {\r\n if (!order || order.orderItems?.length === 0) return 0;\r\n\r\n const uploadedFiles = order.orderItems.filter(\r\n (i) => i.productId === product.id\r\n );\r\n return uploadedFiles?.length ?? 0;\r\n };\r\n\r\n const disableUploadButton = () => {\r\n const limit = getMaxFileLimit();\r\n const current = getUploadedFilesCount();\r\n\r\n return current >= limit;\r\n };\r\n\r\n const executeScroll = () =>\r\n scrollToRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const executeOptionsScroll = () =>\r\n scrollOptionsRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n const fileInputHandler = (event) => {\r\n const limit = getMaxFileLimit();\r\n const actual = getUploadedFilesCount();\r\n\r\n if (limit <= actual) return;\r\n\r\n const { files } = event.target;\r\n for (let i = 0; i < files.length; i++) {\r\n if (actual + 1 + i > limit) return;\r\n const file = files[i];\r\n const trackingGuid = createGuid();\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onloadend = () => {\r\n var tempImg = new Image();\r\n tempImg.src = reader.result;\r\n tempImg.onload = function () {\r\n const orderItem = {\r\n maxSize: product.size,\r\n guid: trackingGuid,\r\n fileAsBase64: reader.result,\r\n fileUrl: URL.createObjectURL(file),\r\n fileName: file.name,\r\n productId: product.id,\r\n set: pack,\r\n qty: 1,\r\n status: 'idle',\r\n isLayerItem: true,\r\n width: tempImg.width,\r\n height: tempImg.height,\r\n };\r\n\r\n orderDispatch({ type: 'ADD_ORDER_ITEM', payload: orderItem });\r\n executeScroll();\r\n };\r\n };\r\n }\r\n };\r\n\r\n const handleUploadClick = () => {\r\n fileInput.click();\r\n };\r\n\r\n const renderFiles = () => {\r\n return order.orderItems\r\n .filter(\r\n (item) => item.productId === product.id && item.isLayerItem === true\r\n )\r\n ?.map((item) => (\r\n \r\n ));\r\n };\r\n\r\n const handleRemoveAll = () => {\r\n orderDispatch({\r\n type: 'REMOVE_ORDER_ITEMS_FOR_PRODUCT',\r\n payload: { productId: product.id },\r\n });\r\n };\r\n\r\n const isNextDisabled = () => {\r\n const files = order.orderItems.filter(\r\n (item) =>\r\n item.productId === product.id &&\r\n item.isLayerItem === true &&\r\n item.status === 'success'\r\n );\r\n\r\n const limit = getMaxFileLimit();\r\n\r\n return files.length !== limit;\r\n };\r\n\r\n const calculatePrice = () => {\r\n // const quantity = order.orderItems\r\n // .filter((item) => item.productId === product.id)\r\n // .reduce((sum, item) => sum + item.qty, 0);\r\n return getLabelPrice(product.id, 1, photographer, order);\r\n };\r\n\r\n const attributesAvailable = () => {\r\n if (!product) return false;\r\n if (!product.attributes) return false;\r\n\r\n return product.attributes.length > 0;\r\n };\r\n\r\n function isUploadingFiles() {\r\n const { orderItems } = order;\r\n\r\n const items = orderItems.filter(\r\n (i) => i.productId == product.id && i.status != 'success'\r\n );\r\n\r\n if (!items || items.length == 0) return false;\r\n\r\n return true;\r\n }\r\n\r\n const orderItemsConfigs = order.orderItemsConfig.find(oic=>oic.productId === product.id)?.configs;\r\n const groups = {}\r\n product.attributes.forEach(a=>{\r\n if(!groups[a.attributesGroupId]){\r\n groups[a.attributesGroupId] = [{...a}]\r\n }else{\r\n groups[a.attributesGroupId].push({...a})\r\n }\r\n })\r\n const selectedAttributes = Object.keys(groups).map((g)=>{\r\n const selected = orderItemsConfigs?.find(c=>c.groupId === Number(g))?.selected;\r\n return {groupId: Number(g), selected: selected || groups[g].sort((a, b) => a.position < b.position)[0].id }\r\n })\r\n const selectedAttributesFull = selectedAttributes.map(a=>groups[a.groupId]?.find(g=>g.id===a.selected));\r\n const selectedProduct = photographer.products.find(p=>p.mainProductId ===product.id && selectedAttributes.every(g=>p.autoGeneratedDefinition.includes(\"a\"+g.selected)))\r\n const selectedModel = selectedAttributesFull.find(a=>a.configuration?.modelUrl)?.configuration?.modelUrl || \"https://oistigmesstorage.blob.core.windows.net/models3d/kubek4.obj\";\r\n\r\n// TODO: remove after fixing images\r\n const selectedProductImg = selectedProduct?.imageUrl?.replaceAll(\" \", \"%20\") ||\r\n selectedProduct?.fileName ? `${process.env.REACT_APP_STORAGE_PATH}/mobile/${photographer.photographId}/Product/${selectedProduct?.fileGuid}_${selectedProduct?.fileName?.replaceAll(\" \", \"%20\")}`:null;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n theme.palette.grey[500],\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('filesLimit', { limit: getMaxFileLimit() })}\r\n \r\n \r\n {\r\n fileInput = input;\r\n }}\r\n />\r\n handleUploadClick()}\r\n disabled={disableUploadButton()}\r\n >\r\n \r\n \r\n {t('Pick files')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n \r\n \r\n {formatPrice(calculatePrice())} €\r\n \r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n {renderFiles()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('REMOVE ALL')}\r\n \r\n \r\n \r\n setOpenAlbum(true)}\r\n color='primary'\r\n disabled={isNextDisabled()}\r\n >\r\n {isUploadingFiles() ? (\r\n \r\n ) : (\r\n t('Next step')\r\n )}\r\n \r\n \r\n \r\n {attributesAvailable() && (\r\n \r\n \r\n {t('OPTIONS')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n setOpenAlbum(false)}\r\n product={product}\r\n modelUrl={selectedModel}\r\n selectedAttributes={selectedAttributesFull}\r\n pack={pack}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default BasicCalendarDialog;\r\n","//Core\r\nimport React, { useState, useLayoutEffect } from 'react';\r\nimport { useParams, useHistory, useLocation } from 'react-router-dom';\r\n\r\n//Components\r\nimport Basic3dDialog from './Basic3dDialog';\r\nimport BasicAlbumDialog from './BasicAlbumDialog';\r\nimport BasicCalendarDialog from './BasicCalendarDialog';\r\nimport CardBadge from './CardBadge';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { formatPrice, getLabelPrice } from '../../core/helpers/priceHelper';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardActionArea from '@material-ui/core/CardActionArea';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst placeholderImg = 'https://via.placeholder.com/400?text=No%20image';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n media: {\r\n width: '100%',\r\n height: 340,\r\n backgroundSize: 'contain',\r\n },\r\n cardArea: {\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'flex-start',\r\n },\r\n cardTitle: {\r\n fontSize: '1.3rem',\r\n lineHeight: '1.8rem',\r\n fontWeight: 600,\r\n display: 'inline-block',\r\n },\r\n cardTitleBox: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginBottom: '16px',\r\n },\r\n cardDesc: {\r\n fontSize: '1.1rem',\r\n lineHeight: '1.3rem',\r\n marginBottom: '16px',\r\n },\r\n}));\r\n\r\nconst ProductRenderCard = ({ product, is3d, isAlbum, isCalendar }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const location = useLocation();\r\n const { itemId } = useParams();\r\n\r\n const [isDialogOpen, setDialogOpen] = useState(false);\r\n const [photographer] = usePhotographer();\r\n const [order] = useOrder();\r\n const handleOpen = (itemId) => {\r\n const url = history.location.pathname;\r\n const newUrl = `${url}/${itemId}`;\r\n history.push(newUrl);\r\n };\r\n\r\n const handleClose = (itemId) => {\r\n const url = history.location.pathname;\r\n const newUrl = url\r\n .slice(0, url.length - itemId.toString().length)\r\n .slice(0, -1);\r\n\r\n setDialogOpen(false);\r\n history.push(newUrl);\r\n };\r\n\r\n const getFilesCount = () => {\r\n const orderedItems = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem !== true\r\n );\r\n\r\n return orderedItems.length;\r\n };\r\n\r\n const getPrintsCount = () => {\r\n const orderedItems = order.orderItems.filter(\r\n (i) => i.productId === product.id && i.isLayerItem !== true\r\n );\r\n const orderedPrints = orderedItems.reduce((sum, item) => sum + item.qty, 0);\r\n return orderedPrints;\r\n };\r\n\r\n useLayoutEffect(() => {\r\n if (product.id == itemId) {\r\n setDialogOpen(true);\r\n }\r\n }, [itemId, product]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n handleOpen(product.id)}\r\n >\r\n \r\n \r\n \r\n \r\n {product.name}\r\n \r\n \r\n €{' '}\r\n {formatPrice(getLabelPrice(product.id, 1, photographer, order))}\r\n \r\n \r\n \r\n {product.description}\r\n \r\n \r\n \r\n \r\n {is3d && handleClose(product.id)}\r\n />}\r\n {isAlbum && handleClose(product.id)}\r\n />}\r\n {isCalendar && handleClose(product.id)}\r\n />}\r\n \r\n );\r\n};\r\n\r\nexport default ProductRenderCard;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\nimport ProductBasicCard from './ProductBasicCard';\r\nimport ProductRenderCard from './ProductRenderCard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst TYPES = {\r\n BASIC: 0,\r\n RENDER_CUP: 1,\r\n ALBUM: 2,\r\n CALENDAR: 3\r\n};\r\n\r\nconst ProductTypeRenderer = ({ product }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const calculateProductType = () => {\r\n if(product.productType===6){\r\n return TYPES.ALBUM;\r\n }\r\n if(product.productType===5){\r\n return TYPES.CALENDAR;\r\n }\r\n if (product.objUrl) {\r\n return TYPES.RENDER_CUP;\r\n }\r\n\r\n return TYPES.BASIC;\r\n };\r\n\r\n const productType = calculateProductType();\r\n return (\r\n <>\r\n {productType === TYPES.BASIC && }\r\n {productType === TYPES.RENDER_CUP && }\r\n {productType === TYPES.ALBUM && }\r\n {productType === TYPES.CALENDAR && }\r\n \r\n );\r\n};\r\n\r\nexport default ProductTypeRenderer;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n Typography,\r\n FormGroup,\r\n FormControlLabel,\r\n Checkbox,\r\n Divider,\r\n IconButton,\r\n Badge,\r\n Box,\r\n} from '@material-ui/core';\r\nimport FilterListIcon from '@material-ui/icons/FilterList';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport ClearAllIcon from '@material-ui/icons/ClearAll';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n filterButton: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n dialogTitle: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: theme.spacing(2),\r\n },\r\n filterSection: {\r\n marginBottom: theme.spacing(3),\r\n },\r\n filterGroupTitle: {\r\n fontWeight: 500,\r\n marginBottom: theme.spacing(1),\r\n },\r\n formGroup: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n },\r\n dialogActions: {\r\n padding: theme.spacing(2),\r\n },\r\n clearButton: {\r\n marginRight: 'auto',\r\n },\r\n actionButtons: {\r\n display: 'flex',\r\n gap: theme.spacing(1),\r\n },\r\n loadingContainer: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n padding: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst ProductFilters = ({ attributes,availableTagGroups, selectedFilters, onFilterChange }) => {\r\n const classes = useStyles();\r\n const [open, setOpen] = useState(false);\r\n const [tempFilters, setTempFilters] = useState({\r\n // attributes: [],\r\n tags: [],\r\n });\r\n const [photographer] = usePhotographer();\r\n\r\n // Initialize temp filters when modal opens\r\n useEffect(() => {\r\n setTempFilters({\r\n // attributes: [...(selectedFilters.attributes || [])],\r\n tags: [...(selectedFilters.tags || [])],\r\n });\r\n }, [open, selectedFilters]);\r\n\r\n // Group attributes by attributesGroupId\r\n // const groupedAttributes = attributes.reduce((acc, attr) => {\r\n // if (!acc[attr.attributesGroupId]) {\r\n // acc[attr.attributesGroupId] = [];\r\n // }\r\n // acc[attr.attributesGroupId].push(attr);\r\n // return acc;\r\n // }, {});\r\n\r\n const handleTempFilterChange = (type, id) => (event) => {\r\n setTempFilters(prev => ({\r\n ...prev,\r\n [type]: event.target.checked\r\n ? [...prev[type], id]\r\n : prev[type].filter(item => item !== id)\r\n }));\r\n };\r\n\r\n const handleOpen = () => setOpen(true);\r\n \r\n const handleClose = () => {\r\n setOpen(false);\r\n setTempFilters({\r\n // attributes: [...(selectedFilters.attributes || [])],\r\n tags: [...(selectedFilters.tags || [])],\r\n });\r\n };\r\n\r\n const handleDone = () => {\r\n onFilterChange(tempFilters);\r\n setOpen(false);\r\n };\r\n\r\n const handleClearFilters = () => {\r\n setTempFilters({\r\n // attributes: [],\r\n tags: [],\r\n });\r\n };\r\n\r\n // const getFilterGroupName = (groupId) => {\r\n // switch (Number(groupId)) {\r\n // case 11:\r\n // return 'Surface Type';\r\n // case 12:\r\n // return 'Border Options';\r\n // default:\r\n // return 'Other Options';\r\n // }\r\n // };\r\n\r\n const getTotalFiltersCount = () => {\r\n // return (selectedFilters.attributes?.length || 0) + (selectedFilters.tags?.length || 0);\r\n return (selectedFilters.tags?.length || 0);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n }\r\n className={classes.filterButton}\r\n >\r\n Filters\r\n \r\n \r\n\r\n \r\n \r\n Filters\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* Attributes Section */}\r\n {/* {Object.entries(groupedAttributes).map(([groupId, attrs]) => (\r\n
\r\n \r\n {getFilterGroupName(groupId)}\r\n \r\n \r\n {attrs.map((attr) => (\r\n \r\n }\r\n label={attr.name}\r\n />\r\n ))}\r\n \r\n
\r\n ))} */}\r\n\r\n {/* Tags Section */}\r\n {availableTagGroups.map((tagGroup) => (\r\n
\r\n \r\n {tagGroup?.name}\r\n \r\n \r\n {tagGroup?.tags?.map((tag) => (\r\n \r\n }\r\n label={tag?.name}\r\n />\r\n ))}\r\n \r\n
\r\n ))}\r\n
\r\n \r\n \r\n }\r\n color=\"secondary\"\r\n className={classes.clearButton}\r\n disabled={!tempFilters.tags.length}\r\n >\r\n Clear Filters\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductFilters;\r\n","//Core\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport _ from 'lodash';\r\n\r\n//Components\r\nimport CategoryCardSkeleton from '../../components/order/CategoryCardSkeleton';\r\nimport ProductTypeRenderer from '../../components/order/ProductTypeRenderer';\r\nimport BanerSlider from '../../components/order/BanerSlider';\r\nimport ProductFilters from '../../components/order/ProductFilters';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useGetProducts } from '../../services/OrderUtils';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n paddingLeft: '60px',\r\n paddingRight: '60px',\r\n },\r\n grid: {\r\n flexGrow: 1,\r\n },\r\n}));\r\n\r\nfunction RenderSkeletonList() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst ProductsView = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const { categoryId } = useParams();\r\n const [photographer, dispatch] = usePhotographer();\r\n const productsQuery = useGetProducts(photographer?.photographId ?? 0);\r\n const [selectedFilters, setSelectedFilters] = useState({\r\n attributes: [],\r\n tags: [],\r\n });\r\n const [availableTags, setAvailableTags] = useState([]);\r\n\r\n const isLoading = () => {\r\n if (\r\n photographer &&\r\n photographer.products &&\r\n photographer.products.length > 0\r\n )\r\n return false;\r\n\r\n return true;\r\n };\r\n\r\n const handleFilterChange = (newFilters) => {\r\n setSelectedFilters(newFilters);\r\n };\r\n\r\n const renderProducts = () => {\r\n let productsList = photographer?.products ?? [];\r\n \r\n let availableTagGroups = [];\r\n \r\n if (categoryId) {\r\n const catId = Number(categoryId);\r\n productsList = productsList.filter((p) => {\r\n const cat = p.categories?.find((c) => c.id === catId);\r\n if (cat) return true;\r\n else return false;\r\n });\r\n\r\n productsList = productsList.map(prod => {\r\n const fProduct = photographer.products.filter(p => p.mainProductId === prod.id);\r\n return {...prod, subProducts: fProduct};\r\n });\r\n\r\n const uniqueTags = Array.from(new Map(\r\n productsList.flatMap(p => p.tagGroups)\r\n .map(item => [item?.id, item])\r\n ).values());\r\n if(uniqueTags.length > 0) {\r\n uniqueTags.forEach(tag => {\r\n if(!tag) {\r\n tag = {id: null, name: '', tagIds: [], tags: []};\r\n }\r\n tag['tags'] = tag?.tagIds?.map(id => {\r\n const find = photographer?.tags?.find(t => t.Id === id);\r\n if(!find) return null;\r\n return {id: find?.Id, name: find?.Name};\r\n })\r\n .filter(tag => tag);\r\n });\r\n console.log('uniqueTags',uniqueTags);\r\n availableTagGroups = uniqueTags;\r\n }\r\n }\r\n\r\n // Apply attribute filters\r\n // if (selectedFilters.attributes.length > 0) {\r\n // productsList = productsList.filter(product => {\r\n // return product.attributes.some(attr => selectedFilters.attributes.includes(attr.id));\r\n // });\r\n // }\r\n\r\n // Apply tag filters\r\n if (selectedFilters.tags.length > 0) {\r\n productsList = productsList.filter(product => {\r\n const hasMatchingTag = product.tags?.some(tag => selectedFilters.tags.includes(tag.id));\r\n const hasMatchingSubProductTag = product.subProducts?.some(subProduct => \r\n subProduct.tags?.some(tag => selectedFilters.tags.includes(tag.id))\r\n );\r\n return hasMatchingTag || hasMatchingSubProductTag;\r\n });\r\n }\r\n\r\n const productToChange = productsList.find(pl=>pl.id==8236);\r\n\r\n if(productToChange ){\r\n // productToChange.sizes = [\r\n // {\r\n // \"positionX\": 451,\r\n // \"positionY\": 749,\r\n // \"width\": 1052,\r\n // \"height\": 1193,\r\n // \"page\": 0,\r\n // \"isCover\": true,\r\n // \"fileUrl\": \"https://oistigmesstoragestaging.blob.core.windows.net/product/2320/8077/template/0.png\"\r\n // },\r\n // {\r\n // \"positionX\": 170,\r\n // \"positionY\": 211,\r\n // \"width\": 2175,\r\n // \"height\": 1988,\r\n // \"page\": 1,\r\n // \"isCover\": false,\r\n // \"fileUrl\": \"https://oistigmesstoragestaging.blob.core.windows.net/product/2320/8077/template/1.png\"\r\n // },\r\n // {\r\n // \"positionX\": 217,\r\n // \"positionY\": 106,\r\n // \"width\": 2093,\r\n // \"height\": 1894,\r\n // \"page\": 2,\r\n // \"isCover\": false,\r\n // \"fileUrl\": \"https://oistigmesstoragestaging.blob.core.windows.net/product/2320/8077/template/2.png\"\r\n // }\r\n // ]\r\n// // productToChange.layerImageUrls = productToChange.sizes.map(s=>({fileUrl:s.fileUrl, page: s.page, isCover: s.isCover}));\r\n// // productToChange.sizes = productToChange.sizes.map(s=>({positionX:s.positionX, positionY:s.positionY, width:s.width, height:s.height, page: s.page}));\r\n// // productToChange.sizes = productToChange.sizes.filter(s=>s.page!==0);\r\n\r\n productToChange.layerImageUrls[0].isCover = true;\r\n productToChange.sizes[0].isCover = true;\r\n // productToChange.sizes[0].page = 0;\r\n // productToChange.sizes[1].page = 1;\r\n // productToChange.sizes[2].page = 2;\r\n // productToChange.sizes[3].page = 2;\r\n }\r\n\r\n return (\r\n \r\n {availableTagGroups.length > 0 && \r\n \r\n }\r\n \r\n \r\n {productsList.map((product) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const { data } = productsQuery;\r\n useEffect(() => {\r\n if (data) {\r\n dispatch({ type: 'ADD_PRODUCTS', data: data });\r\n }\r\n }, [data, dispatch]);\r\n\r\n return (\r\n
\r\n \r\n {isLoading() && RenderSkeletonList()}\r\n {!isLoading() && renderProducts()}\r\n
\r\n );\r\n};\r\n\r\nexport default ProductsView;\r\n","const isText = RegExp(/^[A-Z ]+$/i);\r\nconst isEmail = RegExp(\r\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\n);\r\nconst isPhoneGeneral = RegExp(/^[\\d ()+]+$/);\r\nconst isNumber = RegExp(/^\\d+$/);\r\n\r\nexport function formValidationHelper(name, value, schema) {\r\n const { validate, minLength, maxLength } = schema[name];\r\n let error = '';\r\n\r\n if (minLength && value.length < minLength)\r\n error = `Minimum ${minLength} characters is required.`;\r\n else if (maxLength && value.length > maxLength)\r\n error = `Maximum length of ${maxLength} exceeded!`;\r\n if (!validate) return error;\r\n\r\n switch (validate) {\r\n case 'text':\r\n if (!isText.test(value)) error = 'This field accept text only.';\r\n break;\r\n\r\n case 'number':\r\n if (!isNumber.test(value)) error = 'This field accept numbers only.';\r\n break;\r\n\r\n case 'email':\r\n if (!isEmail.test(value)) error = 'Please enter a valid email';\r\n break;\r\n\r\n case 'phone':\r\n if (!isPhoneGeneral.test(value))\r\n error = 'Please enter a valid phone number. i.e: +XXXXXXXXXX';\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return error;\r\n}\r\n\r\nexport function valueValidationHelper(name, value, rules) {\r\n const { validate, minLength, maxLength } = rules;\r\n let error = undefined;\r\n\r\n if (minLength && value === undefined) return `${name}: Value not provided`;\r\n\r\n if (minLength && value.length < minLength)\r\n error = `${name}: Minimum ${minLength} characters is required.`;\r\n else if (maxLength && value.length > maxLength)\r\n error = `${name}: Maximum length of ${maxLength} exceeded!`;\r\n if (!validate) return error;\r\n\r\n switch (validate) {\r\n case 'text':\r\n if (!isText.test(value)) error = `${name}: This field accept text only.`;\r\n break;\r\n\r\n case 'number':\r\n if (!isNumber.test(value))\r\n error = `${name}: This field accept numbers only.`;\r\n break;\r\n\r\n case 'email':\r\n if (!isEmail.test(value)) error = `${name}: Please enter a valid email`;\r\n break;\r\n\r\n case 'phone':\r\n if (!isPhoneGeneral.test(value))\r\n error = `${name}: Please enter a valid phone number. i.e: +XXXXXXXXXX`;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return error;\r\n}\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { valueValidationHelper } from '../../core/helpers/formValidationHelper';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n error: {\r\n color: '#dc3545',\r\n },\r\n progress: {\r\n marginLeft: '8px',\r\n },\r\n}));\r\n\r\nconst ActiveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '320px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst DisabledButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '320px',\r\n color: '#d4d4d4',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n cursor: 'not-allowed',\r\n backgroundColor: '#343a40',\r\n '&:hover': {\r\n backgroundColor: '#4a444a',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst HtmlTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n maxWidth: 420,\r\n fontSize: theme.typography.pxToRem(12),\r\n border: '1px solid #dadde9',\r\n },\r\n}))(Tooltip);\r\n\r\nconst SendOrderButton = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [tooltipOpen, setTooltipOpen] = useState(false);\r\n\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const clearMissingValue = (value) => {\r\n if (value === undefined) return '';\r\n if (value === 'missing') return '';\r\n\r\n return value;\r\n };\r\n\r\n const validateSendOrder = () => {\r\n let errors = [];\r\n\r\n const validateFirstName = valueValidationHelper(\r\n t('First name'),\r\n clearMissingValue(order.firstName),\r\n {\r\n minLength: 2,\r\n maxLength: 50,\r\n }\r\n );\r\n if (validateFirstName) {\r\n errors.push(validateFirstName);\r\n }\r\n\r\n const validateLastName = valueValidationHelper(\r\n t('Last name'),\r\n clearMissingValue(order.lastName),\r\n {\r\n minLength: 2,\r\n maxLength: 50,\r\n }\r\n );\r\n if (validateLastName) {\r\n errors.push(validateLastName);\r\n }\r\n\r\n // const validateEmail = valueValidationHelper(\r\n // t('Email'),\r\n // clearMissingValue(order.email),\r\n // {\r\n // validate: 'email',\r\n // }\r\n // );\r\n // if (validateEmail) {\r\n // errors.push(validateEmail);\r\n // }\r\n\r\n const validatePhone = valueValidationHelper(\r\n t('Phone'),\r\n clearMissingValue(order.phone),\r\n {\r\n validate: 'phone',\r\n }\r\n );\r\n if (validatePhone) {\r\n errors.push(validatePhone);\r\n }\r\n\r\n const orderedItems =\r\n order.orderItems.reduce((sum, item) => sum + item.qty, 0) > 0;\r\n if (!orderedItems) {\r\n errors.push(t('No products in the cart'));\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n function RenderButton({ children }) {\r\n const errors = validateSendOrder();\r\n\r\n const renderChildren = () => {\r\n if (order.status === 'FINALIZING')\r\n return (\r\n <>\r\n {t('Sending')}{' '}\r\n \r\n \r\n );\r\n\r\n if (order.status === 'SUCCESS') return <>{t('SUCCESS')};\r\n\r\n return children;\r\n };\r\n\r\n if (errors.length === 0)\r\n return (\r\n orderDispatch({ type: 'FINALIZE' })}\r\n disabled={order.status !== 'INITIALIZED'}\r\n >\r\n {renderChildren()}\r\n \r\n );\r\n\r\n return (\r\n setTooltipOpen(false)}>\r\n \r\n Cant continue\r\n {errors.map((e, i) => (\r\n
  • {e}
  • \r\n ))}\r\n \r\n }\r\n >\r\n setTooltipOpen(true)}\r\n onMouseEnter={() => setTooltipOpen(true)}\r\n >\r\n {children}\r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n return {t('Send order')};\r\n};\r\n\r\nexport default SendOrderButton;\r\n","//Core\r\nimport React, { useState, useEffect } from 'react';\r\n\r\n//Components\r\nimport SendOrderButton from './SendOrderButton';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport { getPrice, formatPrice } from '../../core/helpers/priceHelper';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Box } from '@material-ui/core';\r\nimport Container from '@material-ui/core/Container';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Paper from '@material-ui/core/Paper';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n padding: '28px',\r\n },\r\n gridContainer: {\r\n alignItems: 'space-between',\r\n justifyContent: 'center',\r\n [theme.breakpoints.down('sm')]: {\r\n alignItems: 'center',\r\n },\r\n },\r\n mb28: {\r\n marginBottom: '28px',\r\n },\r\n typoCenter: {\r\n flexGrow: 1,\r\n textAlign: 'center',\r\n },\r\n}));\r\n\r\nconst SummaryTab = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [total, setTotal] = useState(0);\r\n\r\n const [photographer] = usePhotographer();\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const renderUploadedFilesinfo = () => {\r\n const uploadedFiles = order.orderItems.filter((i) => !i.isLayerItem).length;\r\n return (\r\n \r\n Uploaded {uploadedFiles} photos\r\n \r\n );\r\n };\r\n\r\n const renderPrintsInfo = () => {\r\n const filesToCount = order.orderItems.filter((i) => !i.isLayerItem);\r\n const printsOrdered = filesToCount.reduce((sum, item) => sum + item.qty, 0);\r\n return (\r\n \r\n Ordered {Math.round(printsOrdered)} prints\r\n \r\n );\r\n };\r\n\r\n const renderTotalCost = () => {\r\n return (\r\n \r\n Total cost {formatPrice(total)} €\r\n \r\n );\r\n };\r\n\r\n useEffect(() => {\r\n\r\n const productIdsList = [\r\n ...new Set(order.orderItems.map((i) => i.productId)),\r\n ];\r\n\r\n const bill = productIdsList.map((id) => {\r\n const items = order.orderItems.filter(\r\n (x) => x.isLayerItem !== true && x.productId == id\r\n );\r\n\r\n const sumQty = items.reduce((sum, item) => sum + item.qty, 0);\r\n\r\n return getPrice(id, sumQty, photographer, order);\r\n });\r\n\r\n let newTotal = bill.reduce((sum, item) => sum + item, 0);\r\n if (order.shippingSelected) {\r\n newTotal += photographer.shippingPrice;\r\n }\r\n\r\n setTotal(newTotal);\r\n }, [order, photographer]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {renderUploadedFilesinfo()}\r\n \r\n \r\n {renderPrintsInfo()}\r\n \r\n \r\n {renderTotalCost()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SummaryTab;\r\n","//Core\r\nimport React, { useState, useLayoutEffect } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { formValidationHelper } from '../../core/helpers/formValidationHelper';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport TextField from '@material-ui/core/TextField';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n padding: '28px',\r\n },\r\n textfield: {\r\n width: '100%',\r\n marginBottom: '28px',\r\n },\r\n}));\r\n\r\nconst fieldValidation = {\r\n firstName: {\r\n error: '',\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n lastName: {\r\n error: '',\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n email: {\r\n error: '',\r\n validate: 'email',\r\n },\r\n phone: {\r\n error: '',\r\n validate: 'phone',\r\n maxLength: 14,\r\n },\r\n};\r\n\r\nconst UserBasicInfo = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const [formValues, setFormValues] = useState({});\r\n const [formErrors, setFormErrors] = useState({});\r\n\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const handleFormChange = (e) => {\r\n let { name, value } = e.target;\r\n\r\n const error = formValidationHelper(name, value, fieldValidation);\r\n\r\n setFormErrors((prev) => ({\r\n ...prev,\r\n [name]: error,\r\n }));\r\n };\r\n\r\n const setFirstName = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n firstName: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_FIRST_NAME',\r\n payload: { firstName: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n const setLastName = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n lastName: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_LAST_NAME',\r\n payload: { lastName: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n const setEmail = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n email: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_EMAIL',\r\n payload: { email: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n const setPhone = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n phone: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_PHONE',\r\n payload: { phone: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n useLayoutEffect(() => {\r\n setFormValues({\r\n firstName: order.firstName === 'missing' ? '' : order.firstName,\r\n lastName: order.lastName === 'missing' ? '' : order.lastName,\r\n email: order.email === 'missing' ? '' : order.email,\r\n phone: order.phone === 'missing' ? '' : order.phone,\r\n });\r\n }, [order.email, order.firstName, order.lastName, order.phone]);\r\n\r\n return (\r\n \r\n

    Basic informations

    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default UserBasicInfo;\r\n","//Core\r\nimport React, { useState, useLayoutEffect } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\nimport { formValidationHelper } from '../../core/helpers/formValidationHelper';\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Switch from '@material-ui/core/Switch';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n padding: '28px',\r\n },\r\n textfield: {\r\n width: '100%',\r\n marginBottom: '28px',\r\n },\r\n title: {\r\n marginBottom: 0,\r\n },\r\n}));\r\n\r\nconst fieldValidation = {\r\n shippingName: {\r\n error: '',\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n shippingAddress: {\r\n error: '',\r\n minLength: 2,\r\n maxLength: 150,\r\n },\r\n shippingEmail: {\r\n error: '',\r\n validate: 'email',\r\n },\r\n};\r\n\r\nconst IOSSwitch = withStyles((theme) => ({\r\n root: {\r\n width: 42,\r\n height: 26,\r\n padding: 0,\r\n margin: theme.spacing(1),\r\n },\r\n switchBase: {\r\n padding: 1,\r\n '&$checked': {\r\n transform: 'translateX(16px)',\r\n color: theme.palette.common.white,\r\n '& + $track': {\r\n backgroundColor: '#52d869',\r\n opacity: 1,\r\n border: 'none',\r\n },\r\n },\r\n '&$focusVisible $thumb': {\r\n color: '#52d869',\r\n border: '6px solid #fff',\r\n },\r\n },\r\n thumb: {\r\n width: 24,\r\n height: 24,\r\n },\r\n track: {\r\n borderRadius: 26 / 2,\r\n border: `1px solid ${theme.palette.grey[400]}`,\r\n backgroundColor: theme.palette.grey[400],\r\n opacity: 1,\r\n transition: theme.transitions.create(['background-color', 'border']),\r\n },\r\n checked: {},\r\n focusVisible: {},\r\n}))(({ classes, ...props }) => {\r\n return (\r\n \r\n );\r\n});\r\n\r\nconst UserDeliveryInfo = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [formValues, setFormValues] = useState({});\r\n const [formErrors, setFormErrors] = useState({});\r\n\r\n const [photographer] = usePhotographer();\r\n const [order, orderDispatch] = useOrder();\r\n\r\n const handleFormChange = (e) => {\r\n let { name, value } = e.target;\r\n\r\n const error = formValidationHelper(name, value, fieldValidation);\r\n\r\n setFormErrors((prev) => ({\r\n ...prev,\r\n [name]: error,\r\n }));\r\n };\r\n\r\n const setShippingSelection = (e) => {\r\n const { checked } = e.target;\r\n\r\n orderDispatch({\r\n type: 'ORDER_SET_SHIPPING',\r\n payload: {\r\n shipping: checked,\r\n },\r\n });\r\n };\r\n\r\n const setShippingName = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n shippingName: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_SHIPPING_NAME',\r\n payload: { shippingName: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n const setShippingAddress = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n shippingAddress: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_SHIPPING_ADDRESS',\r\n payload: { shippingAddress: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n const setShippingEmail = (e) => {\r\n const { value } = e.target;\r\n setFormValues((prev) => ({\r\n ...prev,\r\n shippingEmail: value,\r\n }));\r\n orderDispatch({\r\n type: 'ORDER_SET_SHIPPING_EMAIL',\r\n payload: { shippingEmail: value },\r\n });\r\n handleFormChange(e);\r\n };\r\n\r\n const renderDeliveryForm = () => {\r\n if (order.shippingSelected) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return <>;\r\n };\r\n\r\n useLayoutEffect(() => {\r\n setFormValues({\r\n shippingName: order.shippingName,\r\n shippingAddress: order.shippingAddress,\r\n shippingEmail: order.shippingEmail,\r\n });\r\n }, [order.shippingAddress, order.shippingEmail, order.shippingName]);\r\n\r\n return (\r\n \r\n

    \r\n {t('Add delivery')} (+{photographer.shippingPrice} €)\r\n

    \r\n \r\n {renderDeliveryForm()}\r\n
    \r\n );\r\n};\r\n\r\nexport default UserDeliveryInfo;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport StoreIcon from '@material-ui/icons/Store';\r\nimport AccountBalanceIcon from '@material-ui/icons/AccountBalance';\r\nimport CreditCardIcon from '@material-ui/icons/CreditCard';\r\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n marginTop: '28px',\r\n },\r\n paymentInfo: {\r\n padding: '28px',\r\n marginBottom: '18px',\r\n },\r\n paper: {\r\n padding: '28px',\r\n height: '100%',\r\n cursor: 'pointer',\r\n width: '100%',\r\n maxWidth: '200px',\r\n },\r\n gridCard: {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n green: {\r\n color: '#6fb327',\r\n },\r\n red: {\r\n color: '#f44336',\r\n },\r\n grey: {\r\n color: '#8f8f8f',\r\n },\r\n cardState: {\r\n fontSize: '26px',\r\n textAlign: 'center',\r\n },\r\n}));\r\n\r\nconst UserPaymentInfo = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n function ChangePaymentMethod(type) {\r\n if (type == 1 && !IsBankTransferPossible()) return;\r\n if (type == 2 && !IsVivaWalletTransferPossible()) return;\r\n orderDispatch({\r\n type: 'ORDER_SET_PAYMENT_METHOD',\r\n payload: {\r\n paymentMethod: type,\r\n },\r\n });\r\n }\r\n\r\n function IsSelected(type) {\r\n const orderType = order?.paymentMethod ?? 0;\r\n return type === orderType;\r\n }\r\n\r\n function IsBankTransferPossible() {\r\n var iban = photographer.iban;\r\n\r\n if (iban == undefined) return false;\r\n\r\n return true;\r\n }\r\n\r\n function IsVivaWalletTransferPossible() {\r\n var vivaWallet = photographer.vivawallet;\r\n if (!vivaWallet) return false;\r\n\r\n return true;\r\n }\r\n\r\n return (\r\n \r\n {IsSelected(1) && (\r\n \r\n \r\n {' '}\r\n {t('Payment informations')}:\r\n \r\n\r\n \r\n {t('Please make a payment to this account')}:{' '}\r\n {photographer.iban}\r\n
    \r\n {t(\"and don't forget to add this text in the comment\")}:\r\n
    \r\n \r\n {t('Order no')}: {order.orderId}\r\n \r\n
    \r\n
    \r\n )}\r\n {IsSelected(2) && (\r\n \r\n \r\n {' '}\r\n {t('Payment informations')}:\r\n \r\n\r\n \r\n {t('Please paste this text in Viva Wallet dialog window')}:\r\n
    \r\n \r\n {t('Order no')}: {order.orderId}\r\n \r\n
    \r\n
    \r\n )}\r\n \r\n \r\n ChangePaymentMethod(0)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {t('On Shop')}\r\n \r\n \r\n {IsSelected(0) && (\r\n \r\n {t('SELECTED')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n ChangePaymentMethod(1)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {t('Bank Transfer')}\r\n \r\n \r\n {IsSelected(1) && (\r\n \r\n {t('SELECTED')}\r\n \r\n )}\r\n {!IsBankTransferPossible() && (\r\n \r\n {t('DISABLED')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n ChangePaymentMethod(2)}\r\n >\r\n \r\n \r\n \r\n \r\n {t('Card')}\r\n \r\n {IsSelected(2) && (\r\n \r\n {t('SELECTED')}\r\n \r\n )}\r\n {!IsVivaWalletTransferPossible() && (\r\n \r\n {t('DISABLED')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default UserPaymentInfo;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\nimport Container from '@material-ui/core/Container';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Paper from '@material-ui/core/Paper';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n padding: '28px',\r\n },\r\n gridConainer: {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n logo: {\r\n width: '100%',\r\n maxWidth: '200px',\r\n },\r\n noPadding: {\r\n padding: '0 !important',\r\n },\r\n link: {\r\n textDecoration: 'none',\r\n color: '#3a3a3a',\r\n },\r\n}));\r\n\r\nconst ActiveButton = withStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n maxWidth: '320px',\r\n color: 'white',\r\n borderRadius: '50px',\r\n padding: '12px 28px',\r\n backgroundColor: '#28a745',\r\n '&:hover': {\r\n backgroundColor: '#218838',\r\n },\r\n },\r\n}))(Button);\r\n\r\nconst ThankYouCard = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [photographer] = usePhotographer();\r\n const [order, orderDispatch] = useOrder();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Order no:\r\n \r\n \r\n {order.orderId}\r\n \r\n \r\n has been accepted\r\n \r\n \r\n \r\n \r\n {photographer.companyName}\r\n \r\n \r\n \r\n {photographer.street}\r\n \r\n \r\n {photographer.phone}\r\n \r\n \r\n \r\n \r\n {photographer.email}\r\n \r\n \r\n \r\n \r\n orderDispatch({ type: 'NEW' })}\r\n >\r\n {t('Order more photos')}\r\n \r\n \r\n {photographer.website && (\r\n \r\n \r\n {t('thankyou-exit')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ThankYouCard;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\nimport SummaryTab from '../../components/order/SummaryTab';\r\nimport UserBasicInfo from '../../components/order/UserBasicInfo';\r\nimport UserDeliveryInfo from '../../components/order/UserDeliveryInfo';\r\nimport UserPaymentInfo from '../../components/order/UserPaymentInfo';\r\nimport ThankYouCard from '../../components/order/ThankYouCard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst CheckoutView = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [order] = useOrder();\r\n\r\n const showThankYou = order.status === 'SUCCESS';\r\n\r\n return (\r\n <>\r\n {showThankYou && }\r\n {!showThankYou && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n padding: '28px',\r\n },\r\n gridConainer: {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n logo: {\r\n width: '100%',\r\n maxWidth: '200px',\r\n },\r\n noPadding: {\r\n padding: '0 !important',\r\n },\r\n link: {\r\n textDecoration: 'none',\r\n color: '#3a3a3a',\r\n },\r\n}));\r\n\r\nconst ContactCard = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const [photographer] = usePhotographer();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {photographer.companyName}\r\n \r\n \r\n \r\n {photographer.street}\r\n \r\n \r\n {photographer.phone}\r\n \r\n \r\n \r\n \r\n {photographer.email}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ContactCard;\r\n","//Core\r\nimport React, { useState } from 'react';\r\n\r\n//Components\r\nimport ContactCard from '../../components/order/ContactCard';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst ContactView = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n return ;\r\n};\r\n\r\nexport default ContactView;\r\n","//Core\r\nimport React, { useEffect, useState } from 'react';\r\n\r\n//Components\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\n\r\n//Utils\r\nimport OrderService from '../../services/OrderService';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst UPLOAD_INTERVAL_DELAY_MS = 1000;\r\n\r\nconst UploadManager = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [sending, setSending] = useState(false);\r\n const [order, orderDispatch] = useOrder();\r\n const [photographer] = usePhotographer();\r\n\r\n const uploadFiles = async () => {\r\n if (!order.status) return;\r\n if (order.status === '') return;\r\n if (order.status === 'SUCCESS') return;\r\n if (order.status === 'FAILED') return;\r\n\r\n const uploadInProcess = order.orderItems.find(\r\n (item) => item.status === 'processing'\r\n );\r\n if (uploadInProcess) return;\r\n\r\n const itemToUpload = order.orderItems.find(\r\n (item) => item.status === 'idle'\r\n );\r\n if (!itemToUpload) return;\r\n\r\n orderDispatch({\r\n type: 'ORDER_ITEM_SET_STATE_PROCESSING',\r\n payload: { guid: itemToUpload.guid },\r\n });\r\n\r\n const service = OrderService();\r\n await service\r\n .UploadImage({\r\n orderId: order.orderId,\r\n orderGuid: order.orderGuid,\r\n productId: itemToUpload.productId,\r\n fileAsBase64: itemToUpload.fileAsBase64,\r\n fileName: itemToUpload.fileName,\r\n fileGuid: itemToUpload.guid,\r\n attributes: itemToUpload.attributes,\r\n })\r\n .then(\r\n (res) => {\r\n\r\n orderDispatch({\r\n type: 'ORDER_ITEM_SET_STATE_SUCCESS',\r\n payload: {\r\n guid: res.data.TrackingGuid,\r\n url: res.data.ImageUri,\r\n fileGuid: res.data.ImageGuid,\r\n },\r\n });\r\n },\r\n (err) => {\r\n orderDispatch({\r\n type: 'ORDER_ITEM_SET_STATE_FAILED',\r\n payload: { guid: itemToUpload.fileGuid },\r\n });\r\n }\r\n )\r\n .catch((err) => {\r\n orderDispatch({\r\n type: 'ORDER_ITEM_SET_STATE_FAILED',\r\n payload: { guid: itemToUpload.fileGuid },\r\n });\r\n });\r\n };\r\n\r\n const tryFinalizeOrder = async () => {\r\n if (order.status !== 'FINALIZING') return;\r\n\r\n const notDeliveredFiles = order.orderItems.filter(\r\n (item) => item.status !== 'success'\r\n );\r\n if (!notDeliveredFiles) return;\r\n if (notDeliveredFiles.length > 0) return;\r\n\r\n orderDispatch({ type: 'FINALIZE_REQUESTED' });\r\n\r\n const service = OrderService();\r\n await service\r\n .FinalizeOrder(order, photographer)\r\n .then(\r\n (res) => {\r\n service.MarkOrderAsDone(order);\r\n orderDispatch({ type: 'SUCCESS' });\r\n },\r\n (err) => {\r\n orderDispatch({ type: 'FAILED' });\r\n }\r\n )\r\n .catch((err) => {\r\n orderDispatch({ type: 'FAILED' });\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n uploadFiles();\r\n tryFinalizeOrder();\r\n }, UPLOAD_INTERVAL_DELAY_MS);\r\n return () => clearInterval(interval);\r\n });\r\n\r\n return <>;\r\n};\r\n\r\nexport default UploadManager;\r\n","//Core\r\nimport React, { useState, useEffect } from 'react';\r\n\r\n//Components\r\nimport ProductTypeRenderer from '../../components/order/ProductTypeRenderer';\r\nimport CategoryCardSkeleton from '../../components/order/CategoryCardSkeleton';\r\nimport BanerSlider from '../../components/order/BanerSlider';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useGetProducts } from '../../services/OrderUtils';\r\n\r\n//Utils\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n paddingLeft: '60px',\r\n paddingRight: '60px',\r\n },\r\n grid: {\r\n flexGrow: 1,\r\n },\r\n}));\r\n\r\n//TODO: this should be independent component/ same code in ProductsView\r\nfunction RenderSkeletonList() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst UncategorizedView = (props) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n\r\n const [photographer, dispatch] = usePhotographer();\r\n const productsQuery = useGetProducts(photographer?.photographId ?? 0);\r\n\r\n const isLoading = () => {\r\n if (\r\n photographer &&\r\n photographer.products &&\r\n photographer.products.length > 0\r\n )\r\n return false;\r\n\r\n return true;\r\n };\r\n\r\n const renderProducts = () => {\r\n let productsList = photographer?.products ?? [];\r\n \r\n productsList = productsList.filter((p) => {\r\n if (p.categories?.length === 0 && p.isAutoGenerated === 0) return true;\r\n else return false;\r\n });\r\n\r\n return (\r\n \r\n {productsList.map((product) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n };\r\n\r\n const { data } = productsQuery;\r\n useEffect(() => {\r\n if (data) {\r\n dispatch({ type: 'ADD_PRODUCTS', data: data });\r\n }\r\n }, [data, dispatch]);\r\n\r\n return (\r\n
    \r\n {isLoading() && RenderSkeletonList()}\r\n \r\n {!isLoading() && renderProducts()}\r\n
    \r\n );\r\n};\r\n\r\nexport default UncategorizedView;\r\n","//Core\r\nimport React, { Suspense, useEffect } from 'react';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\n\r\n//Components\r\nimport Layout from './Layout';\r\nimport CategoriesView from './CategoriesView';\r\nimport ProductsView from './ProductsView';\r\nimport CheckoutView from './CheckoutView';\r\nimport ContactView from './ContactView';\r\nimport UploadManager from '../../components/order/UploadManager';\r\nimport UncategorizedView from './UncategorizedView';\r\n\r\n//Hooks\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useGetPhotographer, useGetBanners } from '../../services/OrderUtils';\r\nimport { usePhotographer } from '../../contexts/PhotographerContext';\r\nimport { useOrder } from '../../contexts/OrderContext';\r\nimport { useAlerts } from '../../contexts/AlertContext';\r\n\r\n//Utils\r\nimport OrderService from '../../services/OrderService';\r\nimport { ADD } from '../../reducers/alert/reducer';\r\n\r\n//UI\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Backdrop from '@material-ui/core/Backdrop';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Container from '@material-ui/core/Container';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#fff',\r\n },\r\n spinner: {\r\n color: '#743c6e',\r\n },\r\n}));\r\n\r\nconst cleanMatchUrl = (match) => {\r\n if (match.url.endsWith('/')) {\r\n return match.url.slice(0, -1);\r\n }\r\n\r\n return match.url;\r\n};\r\n\r\nconst SuspenseContainer = () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst OrderIndex = ({ match }) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const url = cleanMatchUrl(match);\r\n const [, dispatch] = usePhotographer();\r\n const [order, orderDispatch] = useOrder();\r\n const [, alertDispatch] = useAlerts();\r\n\r\n const photographerQuery = useGetPhotographer(match?.params?.id ?? 0);\r\n const bannersQuery = useGetBanners(match?.params?.id ?? 0);\r\n\r\n function redirectCategoriesFlag(query) {\r\n if (!query) {\r\n return false;\r\n }\r\n if (!query.isSuccess) {\r\n return false;\r\n }\r\n if (!query.data?.Categories) {\r\n return false;\r\n }\r\n if (query.data?.Categories?.length < 1) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function redirectProductsFlag(query) {\r\n if (!query) {\r\n return false;\r\n }\r\n if (!query.isSuccess) {\r\n return false;\r\n }\r\n if (!query.data?.Categories || query.data?.Categories?.length < 1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function isLoading(query) {\r\n if (query.isLoading) return true;\r\n if (query.isFetching) return true;\r\n\r\n return false;\r\n }\r\n\r\n const { data } = photographerQuery;\r\n useEffect(() => {\r\n if (data) {\r\n dispatch({ type: 'SET_INFO', data: data });\r\n }\r\n }, [data, dispatch]);\r\n\r\n //create new order in shop, need that for file upload\r\n useEffect(() => {\r\n function initOrder(photographerId) {\r\n if (order.status !== 'NEW') return;\r\n\r\n OrderService()\r\n .CreateOrder(photographerId)\r\n .then((resp) => {\r\n orderDispatch({\r\n type: 'CREATE',\r\n payload: {\r\n PhotographerId: photographerId,\r\n OrderId: resp.data.Id,\r\n OrderGuid: resp.data.OrderGuid,\r\n Phone: resp.data.Phone,\r\n Email: resp.data.Email,\r\n FirstName: resp.data.FirstName,\r\n LastName: resp.data.LastName,\r\n IsShippingChoosen: resp.data.IsShippingChoosen,\r\n },\r\n });\r\n })\r\n .catch((err) => {\r\n orderDispatch({ type: 'ERROR' });\r\n });\r\n\r\n return;\r\n }\r\n initOrder(match?.params?.id);\r\n }, [match?.params?.id, order.status, orderDispatch]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }>\r\n \r\n {redirectCategoriesFlag(photographerQuery) && (\r\n \r\n )}\r\n {redirectProductsFlag(photographerQuery) && (\r\n \r\n )}\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n }\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default OrderIndex;\r\n"],"sourceRoot":""}