{"version":3,"sources":["components/modules/serviceWorker.ts","components/modules/AttrType.ts","components/modules/Attr.ts","components/modules/OutfitItem.ts","components/modules/Fabrics.ts","components/Swatches/SwatchItem.tsx","components/Swatches/SearchBox.tsx","components/modules/SizeAndPositioning.ts","components/modules/PerOutfitItemData.ts","components/modules/PerOutfitItemFabrics.ts","components/previews/OutfitPreview.tsx","components/previews/RecommendationCarousel.tsx","components/AlertModal.tsx","components/ConfirmModal.tsx","components/modules/Rules.ts","components/fabrics/AttributeDropdownEditor.tsx","components/fabrics/EditFabricForm.tsx","components/AddEditModal.tsx","components/LoginModal.tsx","App.tsx","index.tsx","assets/images/watermark.png"],"names":["Boolean","window","location","hostname","match","AttrType","props","type","displayName","camelCaseName","toLowerCase","replace","primaryColor","secondaryColor","primaryPattern","secondaryPattern","material","fabricLine","Object","AttrTypeSerializer","model","Error","i","Attr","Field","Type","Number","String","id","this","attributeId","name","disabled","getAllAttributes","fetch","process","method","attrsResponse","json","attrsJson","map","jAttr","deserialize","OutfitItem","AttrConsts","attr","allAttributes","find","a","filter","getAttributes","toTag","allFabricLines","console","error","outfitItems","Jacket","Pants","Shirt","Shoes","ShoesImage","TieImage","WatchImage","BagImage","AccessoriesImage1","AccessoriesImage2","AccessoriesImage3","lowInfoFabricItems","materialItems","imageItems","getName","item","getKeyName","storedFabrics","Fabric","primaryColorId","primaryPatternId","secondaryColorId","secondaryPatternId","materialId","fabricLineId","other","number","None","refreshFabrics","body","JSON","stringify","headers","fabricResponses","jsonFabrics","jf","getStoredFabrics","SwatchItem","state","hover","className","selected","key","onMouseOver","setState","onMouseLeave","onClick","style","backgroundSize","includes","appliesTo","zoom","backgroundImage","React","Component","SearchBox","tagSearchBox","SearchBoxState","initialSelection","fetchNextItems","bind","refilterFabrics","fabric","selection","onSelectionChanged","searchTags","splice","tag","push","nextProps","includeSoldOut","allowedFabricLines","waitingForPreload","matchesSearchTags","f","filterByFabricNumber","length","some","t","fabricAttrIds","getAttributeIds","filteredFabrics","isTemp","soldOut","outfitItem","selectedItem","page","displayedFabrics","newResultsStart","itemsPerPage","newResultsEnd","Math","min","forItem","defaultValue","onChange","e","target","value","ref","tags","suggestions","getAttributeTags","handleDelete","handleAddition","placeholder","allowNew","autoresize","height","overflowY","overflowX","border","loadMore","hasMore","loader","useWindow","initialLoad","threshold","url","scale","equals","setSelectedSwatch","defaultProps","reduce","prev","cur","accessoryIndex","PinnedXPosition","PinnedYPosition","SizeStrategy","PerOutfitItemData","entries","checkDataEqualityFunction","me","oi","has","set","undefined","get","Map","PerOutfitItemFabrics","obj","SizeAndPositionInfo","xPin","yPin","sizePreserved","size","x","y","sizeStrategy","sizeAndPositionInfo","Center","Top","PreserveWidth","PreserveHeight","Bottom","Square","createSizedImagePlane","beforeRender","info","mesh","THREE","PlaneGeometry","MeshBasicMaterial","color","onBeforeRender","frustumCulled","OutfitPreview","viewPortCanvas","viewPort","camera","renderer","scene","clothesObjFileName","clothesObj","controls","planeObjDict","prevCameraPos","prevCameraRotation","OutfitPreviewState","render","recenterCamera","handleResize","onInterval","getTextureFromRecommendation","setRecommendation","updateFabrics","saveScreenshot","toggleImageVisibility","getTextureFromUrl","imageExists","beforePlaneRender","getTextDescriptionElements","getPlaneHidden","dispose","clothesObjs","Promise","resolve","reject","OBJLoader","load","ex","clone","background","bodyObj","add","getClothesObj","allImageOutfitItems","planeMesh","light","position","canvas","antialias","precision","powerPreference","preserveDrawingBuffer","setPixelRatio","devicePixelRatio","TrackballControls","domElement","rotateSpeed","zoomSpeed","panSpeed","staticMoving","dynamicDampingFactor","keys","addEventListener","enabled","update","resetCamera","setInterval","recommendation","getId","plane","hasImage","originalWidth","image","width","originalHeight","sizeAndPosInfo","originalDimsProvided","scaleX","scaleY","prevAccessories","minX","oi2","getPlaneX","getPlaneScale","opacity","transparent","quaternion","copy","updateMatrix","translateZ","translateX","translateY","setX","setY","reset","aspect","clientWidth","clientHeight","bb","setFromObject","getCenter","updateProjectionMatrix","setSize","fileContent","toDataURL","fileContentPrefix","substr","indexOf","jacket","pants","shirt","shoes","belt","bagImage","shoesImage","tieImage","watchImage","accessoriesImage1","accessoriesImage2","accessoriesImage3","imageBase64","resp","text","respText","ok","respBlob","saveAs","err","TextureLoader","anisotropy","capabilities","getMaxAnisotropy","er","materialsChanged","changedImages","loading","fabricId","log","alphaMap","side","blending","texture","traverse","child","values","visible","components","marginTop","marginLeft","marginRight","marginBottom","display","showingText","bottom","top","left","right","backgroundColor","textAlign","justifyContent","alignContent","flexDirection","margin","borderRadius","minWidth","minHeight","visibility","showSaveScreenshot","showFabricNames","showToggleImages","_bodyObj","bodyMat","metalness","concat","RecommendationCarousel","recommendationPreviews","recommendations","forEach","preview","index","hasValidRec","previews","parseInt","getPreviewDiv","AlertModal","Modal","isOpen","policyAlertModal","toggle","modalText","modalType","Button","ConfirmModal","decision","onDecision","isVisible","closeWithDecision","Rule","conditionAttribute","recommendedAttribute","storedRules","refreshRules","ruleResponses","jsonRules","jsonRule","rule","AttributeDropdownEditor","State","selectedAttrId","getAttribute","forceUpdate","isValid","onValueChanged","attribute","EditFabricForm","modalMannequin","EditFabricFormState","fabricNumberIsValid","previewIsRenderable","https","fabricUrl","response","on","chunk","read","imageType","minimumBytes","destroy","fabricUrlIsValid","updateModelOutfit","then","viewLoading","matchingFabrics","fabricAppliesTo","fabricScale","toggleAlertModal","showMannequin","createInstanceForSingleItemPreview","getFabric","fabricScaleIsValid","fabricNumber","collisionFabrics","children","checked","stringIsUrl","onKeyDown","keyCode","refreshPreview","onBlur","previousFabricUrl","onFocus","required","getFabricNumberPhrasing","valueAsNumber","onMouseUp","max","step","str","regexResults","urlRegex","exec","r","AddEditType","AddEditModal","editFabricSearchBox","editFabricControl","addFabricControl","AddEditModalState","deleteFabric","deleteRule","saveFabric","addRecommendationRule","confirmation","selectedRuleId","conditionAttributeType","consequenceAttribute","consequenceAttributeType","negativeRule","mustBe","conditionOutfitParts","recommendedOutfitParts","ModalHeader","ModalBody","addType","addFabric","addRule","editFabrics","editRules","renderVariableUiParts","selectedFabric","onFabricChanges","control","fabricIsValid","msg","ListGroup","ListGroupItem","action","allowedAttributeTypes","primaryButtons","renderPrimaryButton","getConfirmation","buttonText","LoginModal","LoginModalState","username","password","confirmCredentials","onLogin","finalizeLogin","App","largeMannequinViewRef","recommendationsRef","PantsSearchBox","ShoesSearchBox","ShirtSearchBox","JacketSearchBox","AppState","getRecommendations","handlePantsMustMatchJacket","setViewModeToLarge","toggleAddModal","handlefabricLineChange","componentDidMount","alertModalType","alertModalIsOpen","msgString","toString","all","refreshConsts","isPreloading","enabledFabricLines","loginState","addModalIsOpen","loginModalIsOpen","viewMode","recommendationLoading","attrs","selectedFabrics","FilterOutfitItem","Fabrics","pantsMustMatchJacket","allowedFabricIds","viewFabrics","Part","requiredAttributeIds","noRecommendationsMessage","recJson","rec","hasOwnProperty","setRecommendations","lineId","newLines","path","si","cb","confirmationCallback","confirmModalIsOpen","getAllSearchBoxes","s","src","WaterMark","alt","fabricLineAttr","aa","swatchChange","event","fabricTags","withDefaultValue","isRecommendationOpen","ReactDOM","document","getElementById","navigator","serviceWorker","ready","registration","unregister","module","exports"],"mappings":"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","file":"static/js/main.c29024b8.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [ key: string ]: string; }; }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${ process.env.PUBLIC_URL }/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (!!installingWorker)\r\n return;\r\n\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (!!contentType && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => console.log('No internet connection found. App is running in offline mode.'));\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import { Serializer } from 'serialize-ts';\r\n\r\nexport default class AttrType extends Object {\r\n type: string;\r\n displayName: string;\r\n camelCaseName: string;\r\n\r\n static primaryColor = new AttrType({\r\n type: \"PrimaryColor\",\r\n displayName: \"Primary Color\",\r\n camelCaseName: \"primaryColor\",\r\n });\r\n static secondaryColor = new AttrType({\r\n type: \"SecondaryColor\",\r\n displayName: \"Secondary Color\",\r\n camelCaseName: \"secondaryColor\",\r\n });\r\n static primaryPattern = new AttrType({\r\n type: \"PrimaryPattern\",\r\n displayName: \"Primary Pattern\",\r\n camelCaseName: \"primaryPattern\",\r\n });\r\n static secondaryPattern = new AttrType({\r\n type: \"SecondaryPattern\",\r\n displayName: \"Secondary Pattern\",\r\n camelCaseName: \"secondaryPattern\",\r\n });\r\n static material = new AttrType({\r\n type: \"Material\",\r\n displayName: \"Material\",\r\n camelCaseName: \"material\",\r\n });\r\n static fabricLine = new AttrType({\r\n type: \"FabricLine\",\r\n displayName: \"fabricLine\",\r\n camelCaseName: \"fabricLine\",\r\n });\r\n constructor(props: Partial | string) {\r\n super(typeof props === 'string' ? null : props);\r\n if (typeof props !== 'string') {\r\n this.camelCaseName = props.camelCaseName;\r\n this.displayName = props.displayName;\r\n this.type = props.type;\r\n return;\r\n }\r\n\r\n // var type: AttrType;\r\n switch (props.toLowerCase().replace(' ', '')) {\r\n case 'primarycolor':\r\n return AttrType.primaryColor;\r\n case 'secondarycolor':\r\n return AttrType.secondaryColor;\r\n case 'primarypattern':\r\n return AttrType.primaryPattern;\r\n case 'secondarypattern':\r\n return AttrType.secondaryPattern;\r\n case 'material':\r\n return AttrType.material;\r\n case 'farbicline':\r\n return AttrType.fabricLine;\r\n default:\r\n throw props;\r\n }\r\n }\r\n}\r\n\r\nexport class AttrTypeSerializer implements Serializer {\r\n serialize(model: AttrType): string {\r\n return model.type;\r\n }\r\n\r\n deserialize(type: string): AttrType {\r\n switch (type.toLowerCase().replace(' ', '')) {\r\n case 'primarycolor':\r\n return AttrType.primaryColor;\r\n case 'secondarycolor':\r\n return AttrType.secondaryColor;\r\n case 'primarypattern':\r\n return AttrType.primaryPattern;\r\n case 'secondarypattern':\r\n return AttrType.secondaryPattern;\r\n case 'material':\r\n return AttrType.material;\r\n case 'fabricline':\r\n return AttrType.fabricLine;\r\n default:\r\n throw new Error(`${ type } not regonized as attr type`);\r\n }\r\n }\r\n}","import { Field, Type, deserialize } from 'serialize-ts';\r\nimport { Tag } from 'react-tag-autocomplete';\r\nimport AttrType, { AttrTypeSerializer } from './AttrType';\r\n\r\nexport default class Attr {\r\n @Field()\r\n @Type(Number)\r\n attributeId: number = 0;\r\n\r\n @Field()\r\n @Type(String)\r\n name: string;\r\n\r\n @Field()\r\n @Type(new AttrTypeSerializer())\r\n type: AttrType;\r\n\r\n toTag(): Tag {\r\n return {\r\n id: this.attributeId,\r\n name: `${ this.type.displayName }: ${ this.name }`,\r\n disabled: false\r\n };\r\n }\r\n}\r\n\r\nasync function getAllAttributes(): Promise {\r\n var attrsResponse = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/attributes`, { method: \"GET\" });\r\n var attrsJson = await attrsResponse.json();\r\n return attrsJson.map(jAttr => deserialize(jAttr, Attr));\r\n}\r\n\r\nexport class AttrConsts {\r\n public static allAttributes: Attr[] = [];\r\n public static allFabricLines: Attr[] = [];\r\n\r\n static getAttribute(id: number) {\r\n var attr = this.allAttributes.find(a => a.attributeId === id);\r\n return (!attr ? null : attr) as Attr;\r\n }\r\n\r\n static getAttributes(type: AttrType = null) {\r\n return !type ? this.allAttributes : this.allAttributes.filter(a => a.type === type);\r\n }\r\n\r\n static getAttributeTags(type: AttrType = null) {\r\n return AttrConsts.getAttributes(type).map(a => a.toTag());\r\n }\r\n\r\n static async refreshConsts(): Promise {\r\n try {\r\n AttrConsts.allAttributes = await getAllAttributes();\r\n AttrConsts.allFabricLines = AttrConsts.allAttributes.filter(a => a.type === AttrType.fabricLine);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n}","enum OutfitItem {\r\n None = 0,\r\n Jacket = 1,\r\n Pants = 2,\r\n Shirt = 4,\r\n Shoes = 8,\r\n ShoesImage = 32,\r\n TieImage = 64,\r\n WatchImage = 128,\r\n BagImage = 256,\r\n AccessoriesImage1 = 512,\r\n AccessoriesImage2 = 1024,\r\n AccessoriesImage3 = 2048\r\n}\r\nexport default OutfitItem;\r\n\r\nexport const outfitItems: OutfitItem[] = [\r\n OutfitItem.Jacket,\r\n OutfitItem.Pants,\r\n OutfitItem.Shirt,\r\n OutfitItem.Shoes,\r\n OutfitItem.ShoesImage,\r\n OutfitItem.TieImage,\r\n OutfitItem.WatchImage,\r\n OutfitItem.BagImage,\r\n OutfitItem.AccessoriesImage1,\r\n OutfitItem.AccessoriesImage2,\r\n OutfitItem.AccessoriesImage3\r\n];\r\n\r\nexport const lowInfoFabricItems = [\r\n OutfitItem.Shoes,\r\n OutfitItem.ShoesImage,\r\n OutfitItem.TieImage,\r\n OutfitItem.WatchImage,\r\n OutfitItem.BagImage,\r\n OutfitItem.AccessoriesImage1,\r\n OutfitItem.AccessoriesImage2,\r\n OutfitItem.AccessoriesImage3\r\n];\r\n\r\nexport const materialItems = [\r\n OutfitItem.Jacket,\r\n OutfitItem.Pants,\r\n OutfitItem.Shirt,\r\n OutfitItem.Shoes\r\n];\r\n\r\nexport const imageItems = [\r\n OutfitItem.ShoesImage,\r\n OutfitItem.TieImage,\r\n OutfitItem.WatchImage,\r\n OutfitItem.BagImage,\r\n OutfitItem.AccessoriesImage1,\r\n OutfitItem.AccessoriesImage2,\r\n OutfitItem.AccessoriesImage3\r\n];\r\n\r\nexport function getName(item: OutfitItem): string {\r\n switch (item) {\r\n case OutfitItem.Jacket:\r\n return \"Jacket\";\r\n case OutfitItem.Pants:\r\n return \"Pants\";\r\n case OutfitItem.Shirt:\r\n return \"Shirt\";\r\n case OutfitItem.Shoes:\r\n return \"Shoes\";\r\n case OutfitItem.ShoesImage:\r\n return \"Shoes (Preview)\";\r\n case OutfitItem.TieImage:\r\n return \"Tie\";\r\n case OutfitItem.WatchImage:\r\n return \"Watch\";\r\n case OutfitItem.BagImage:\r\n return \"Bag\";\r\n case OutfitItem.AccessoriesImage1:\r\n return \"Accessory 1\";\r\n case OutfitItem.AccessoriesImage2:\r\n return \"Accessory 2\";\r\n case OutfitItem.AccessoriesImage3:\r\n return \"Accessory 3\";\r\n }\r\n}\r\n\r\nexport function getKeyName(item: OutfitItem): string {\r\n switch (item) {\r\n case OutfitItem.Jacket:\r\n return \"jacket\";\r\n case OutfitItem.Pants:\r\n return \"pants\";\r\n case OutfitItem.Shirt:\r\n return \"shirt\";\r\n case OutfitItem.Shoes:\r\n return \"shoes\";\r\n case OutfitItem.ShoesImage:\r\n return \"shoesImage\";\r\n case OutfitItem.TieImage:\r\n return \"tieImage\";\r\n case OutfitItem.WatchImage:\r\n return \"watchImage\";\r\n case OutfitItem.BagImage:\r\n return \"bagImage\";\r\n case OutfitItem.AccessoriesImage1:\r\n return \"accessoriesImage1\";\r\n case OutfitItem.AccessoriesImage2:\r\n return \"accessoriesImage2\";\r\n case OutfitItem.AccessoriesImage3:\r\n return \"accessoriesImage3\";\r\n }\r\n}\r\n\r\nexport function getFabricNumberPhrasing(item: OutfitItem): string {\r\n switch (item) {\r\n case OutfitItem.Shoes:\r\n return \"Fabric Name\";\r\n case OutfitItem.WatchImage:\r\n case OutfitItem.BagImage:\r\n case OutfitItem.AccessoriesImage1:\r\n case OutfitItem.AccessoriesImage2:\r\n case OutfitItem.AccessoriesImage3:\r\n return \"Name\";\r\n case OutfitItem.Jacket:\r\n case OutfitItem.Pants:\r\n case OutfitItem.Shirt:\r\n case OutfitItem.ShoesImage:\r\n case OutfitItem.TieImage:\r\n default:\r\n return \"Fabric Number\";\r\n }\r\n}","import { Field, Type, deserialize } from 'serialize-ts';\r\nimport OutfitItem from './OutfitItem';\r\nimport { Tag } from 'react-tag-autocomplete';\r\n\r\nexport default class Fabric {\r\n @Field()\r\n @Type(Number)\r\n id: number = 0;\r\n\r\n @Field()\r\n @Type(String)\r\n number: string = '';\r\n\r\n @Field()\r\n @Type(Boolean)\r\n soldOut: boolean = false;\r\n\r\n @Field()\r\n @Type(String)\r\n url: string = '';\r\n\r\n @Field()\r\n @Type(Number)\r\n scale: number = 0.3;\r\n\r\n @Field()\r\n @Type(Boolean)\r\n isTemp: boolean = false;\r\n\r\n @Field()\r\n @Type(Number)\r\n appliesTo?: OutfitItem = OutfitItem.None;\r\n\r\n @Field()\r\n @Type(Number)\r\n fabricLineId?: number = null;\r\n\r\n @Field()\r\n @Type(Number)\r\n primaryColorId?: number = null;\r\n\r\n @Field()\r\n @Type(Number)\r\n primaryPatternId?: number = null;\r\n\r\n @Field()\r\n @Type(Number)\r\n secondaryColorId?: number = null;\r\n\r\n @Field()\r\n @Type(Number)\r\n secondaryPatternId?: number = null;\r\n\r\n @Field()\r\n @Type(Number)\r\n materialId?: number = null;\r\n\r\n getAttributeIds(): number[] {\r\n return [ this.primaryColorId, this.primaryPatternId, this.secondaryColorId, this.secondaryPatternId, this.materialId, this.fabricLineId ].filter(id => !!id);\r\n }\r\n\r\n equals(other: Fabric): boolean {\r\n return !!other && this.id === other.id;\r\n }\r\n\r\n toTag(): Tag {\r\n return {\r\n id: this.id,\r\n name: `Fabric Number: ${ this.number }`,\r\n disabled: false\r\n };\r\n }\r\n}\r\n\r\nlet storedFabrics: Fabric[];\r\nexport async function refreshFabrics(): Promise {\r\n var fabricResponses = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/fabrics`, {\r\n method: \"PUT\",\r\n body: JSON.stringify([]),\r\n headers: [ [ \"accept\", \"text/plain\" ], [ \"Content-Type\", \"application/json\" ] ]\r\n });\r\n const jsonFabrics = await fabricResponses.json();\r\n storedFabrics = jsonFabrics.map(jf => deserialize(jf, Fabric));\r\n}\r\n\r\nexport function getStoredFabricTags(forItem: OutfitItem): Tag[] {\r\n return storedFabrics\r\n .filter(f => (f.appliesTo & forItem) !== 0)\r\n .map(function (f: Fabric): Tag {\r\n return {\r\n name: f.number,\r\n id: f.id,\r\n disabled: false\r\n };\r\n });\r\n}\r\n\r\nexport function getStoredFabrics(): Fabric[] {\r\n return storedFabrics;\r\n}","import React from 'react';\r\nimport { imageItems } from '../modules/OutfitItem';\r\n\r\nexport default class SwatchItem extends React.Component {\r\n constructor(props: SwatchItemProps, state: SwatchItemState) {\r\n super(props, state);\r\n this.state = { hover: false };\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n
this.setState({ hover: true })}\r\n onMouseLeave={() => this.setState({ hover: false })}\r\n onClick={this.props.onClick}>\r\n
\r\n
\r\n
{this.props.name}
\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\nclass SwatchItemState {\r\n hover: boolean;\r\n}\r\n\r\nclass SwatchItemProps {\r\n id: number;\r\n soldOut: boolean;\r\n name: string;\r\n url: string;\r\n appliesTo: number;\r\n scale: number;\r\n onClick: () => void;\r\n selected: boolean;\r\n zoom?: number;\r\n}","import React from 'react';\r\nimport Attr, { AttrConsts } from '../modules/Attr';\r\nimport Fabric, { getStoredFabrics, getStoredFabricTags } from '../modules/Fabrics';\r\nimport OutfitItem, { getName, lowInfoFabricItems, outfitItems } from '../modules/OutfitItem';\r\nimport ReactTags, { Tag } from 'react-tag-autocomplete';\r\nimport SwatchItem from './SwatchItem';\r\nimport InfiniteScroll from 'react-infinite-scroller';\r\nimport '../../assets/css/SearchBox.css';\r\n\r\nexport default class SearchBox extends React.Component\r\n{\r\n constructor(props: SearchBoxProps) {\r\n super(props);\r\n this.state = new SearchBoxState(props.initialSelection);\r\n this.fetchNextItems = this.fetchNextItems.bind(this);\r\n }\r\n\r\n static defaultProps = {\r\n allowedFabricLines: null,\r\n outfitItem: outfitItems.reduce((prev, cur) => prev + cur, OutfitItem.None),\r\n initialSelection: null,\r\n accessoryIndex: null\r\n };\r\n\r\n tagSearchBox: ReactTags;\r\n\r\n componentDidMount() {\r\n this.refilterFabrics();\r\n }\r\n\r\n setSelectedSwatch(fabric: Fabric) {\r\n this.setState({ selection: fabric });\r\n this.props.onSelectionChanged(fabric);\r\n }\r\n\r\n handleDelete(i: number) {\r\n if (i === -1)\r\n return false;\r\n\r\n const searchTags = [ ...this.state.searchTags ];\r\n searchTags.splice(i, 1);\r\n this.setState({ searchTags }, this.refilterFabrics);\r\n }\r\n\r\n handleAddition(tag: Tag) {\r\n const searchTags = [ ...this.state.searchTags ];\r\n searchTags.push(tag);\r\n this.setState({ searchTags }, this.refilterFabrics);\r\n }\r\n\r\n componentWillReceiveProps(nextProps: SearchBoxProps) {\r\n if ((nextProps.includeSoldOut !== this.props.includeSoldOut) || (nextProps.allowedFabricLines !== this.props.allowedFabricLines) || (nextProps.waitingForPreload !== this.props.waitingForPreload))\r\n this.refilterFabrics(nextProps);\r\n }\r\n\r\n refilterFabrics(nextProps: SearchBoxProps = null) {\r\n const matchesSearchTags = (f: Fabric): boolean => {\r\n // If we're searching by number, filter out none matches, or nothing if there's no search tags yet\r\n if (this.state.filterByFabricNumber)\r\n return this.state.searchTags.length === 0 || this.state.searchTags.some(t => t.id === f.id);\r\n\r\n // If we're filtering by attributes, ensure that every search tag has a corresponding attribute in the fabric\r\n var fabricAttrIds = f.getAttributeIds();\r\n return !this.state.searchTags.some(t => !fabricAttrIds.some(id => id === t.id));\r\n };\r\n\r\n if (!nextProps)\r\n nextProps = this.props;\r\n\r\n const filteredFabrics = getStoredFabrics().filter(f =>\r\n !f.isTemp\r\n && (nextProps.includeSoldOut || !f.soldOut)\r\n && ((f.appliesTo & this.props.outfitItem) !== 0)// || (f.appliesTo === OutfitItem.AccessoriesImage1 && (this.props.outfitItem === OutfitItem.AccessoriesImage2 || this.props.outfitItem === OutfitItem.AccessoriesImage3)))\r\n && (!nextProps.allowedFabricLines || lowInfoFabricItems.includes(this.props.outfitItem) || nextProps.allowedFabricLines.some(a => a.attributeId === f.fabricLineId))\r\n && matchesSearchTags(f)\r\n );\r\n\r\n var selectedItem = filteredFabrics.some(f => f === this.state.selection) ? this.state.selection : null;\r\n this.setState({ page: 0, selection: selectedItem, filteredFabrics, displayedFabrics: [] }, this.fetchNextItems);\r\n }\r\n\r\n fetchNextItems() {\r\n var displayedFabrics = this.state.displayedFabrics;\r\n var newResultsStart = this.state.page * this.props.itemsPerPage;\r\n var newResultsEnd = Math.min(newResultsStart + 1 + this.props.itemsPerPage, this.state.filteredFabrics.length - 1);\r\n for (var i = newResultsStart; i <= newResultsEnd; i++)\r\n displayedFabrics.push(this.state.filteredFabrics[ i ]);\r\n this.setState({ displayedFabrics, page: this.state.page + 1 });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n
\r\n
{getName(this.props.outfitItem)}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n this.tagSearchBox = ref}\r\n tags={this.state.searchTags}\r\n suggestions={this.state.filterByFabricNumber ? getStoredFabricTags(this.props.outfitItem) : AttrConsts.getAttributeTags()}\r\n handleDelete={this.handleDelete.bind(this)}\r\n handleAddition={this.handleAddition.bind(this)}\r\n placeholder={this.state.filterByFabricNumber ? \"Fabric number\" : \"Attributes\"}\r\n allowNew={false}\r\n autoresize={false} />
\r\n
\r\n
\r\n\r\n
\r\n
Loading ...
}\r\n useWindow={false}\r\n className=\"swatchBox row\"\r\n initialLoad={false}\r\n threshold={250}>\r\n {\r\n this.state.filteredFabrics.map(fabric =>\r\n this.setSelectedSwatch(this.state.selection === fabric ? null : fabric)} />)\r\n }\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass SearchBoxProps {\r\n waitingForPreload: boolean;\r\n includeSoldOut: boolean;\r\n onSelectionChanged: (fabric: Fabric) => void;\r\n allowedFabricLines: Attr[] = null;\r\n outfitItem: OutfitItem;\r\n zoom: number;\r\n itemsPerPage: number;\r\n initialSelection: Fabric = null;\r\n}\r\n\r\nclass SearchBoxState {\r\n searchTags: Tag[] = [];\r\n selection: Fabric = null;\r\n filterByFabricNumber: boolean = false;\r\n filteredFabrics: Fabric[] = [];\r\n displayedFabrics: Fabric[] = [];\r\n page: number = 0;\r\n\r\n constructor(initialSelection: Fabric) {\r\n this.selection = initialSelection;\r\n }\r\n}\r\n\r\nexport { SearchBox };","import OutfitItem from './OutfitItem';\r\nimport * as THREE from 'three';\r\nimport { MeshBasicMaterial, PlaneGeometry } from 'three';\r\n\r\nexport enum PinnedXPosition {\r\n Left,\r\n Center,\r\n Right\r\n}\r\n\r\nexport enum PinnedYPosition {\r\n Top,\r\n Center,\r\n Bottom\r\n}\r\n\r\nexport enum SizeStrategy {\r\n PreserveHeight,\r\n PreserveWidth,\r\n Square\r\n}\r\n\r\nexport default class SizeAndPositionInfo {\r\n xPin: PinnedXPosition;\r\n yPin: PinnedYPosition;\r\n sizeStrategy: SizeStrategy;\r\n size: number;\r\n x: number;\r\n y: number;\r\n\r\n constructor(xPin: PinnedXPosition, yPin: PinnedYPosition, sizePreserved: SizeStrategy, size: number, x: number, y: number) {\r\n this.xPin = xPin;\r\n this.yPin = yPin;\r\n this.sizeStrategy = sizePreserved;\r\n this.size = size;\r\n this.x = x;\r\n this.y = y;\r\n }\r\n}\r\n\r\nexport const sizeAndPositionInfo: Map = new Map([\r\n [ OutfitItem.WatchImage,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Top, SizeStrategy.PreserveWidth, 1.0, 2.2, 1.5) ], //\r\n [ OutfitItem.TieImage,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Top, SizeStrategy.PreserveHeight, 1.2, 1.6, -0.1) ], //\r\n [ OutfitItem.ShoesImage,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Bottom, SizeStrategy.PreserveWidth, 1.2, 1.6, -1.8) ], //\r\n [ OutfitItem.BagImage,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Top, SizeStrategy.PreserveHeight, 1.2, -1.6, 0.3) ], //\r\n [ OutfitItem.Jacket,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Center, SizeStrategy.Square, 0.7, -2.3, 1.8) ], //\r\n [ OutfitItem.Pants,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Center, SizeStrategy.Square, 0.7, 1.2, -1.1) ], //\r\n [ OutfitItem.Shirt,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Center, SizeStrategy.Square, 0.7, -1.6, 1.8) ], //\r\n [ OutfitItem.AccessoriesImage1,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Bottom, SizeStrategy.PreserveWidth, 1.4, -1.25, -0.8) ], //\r\n [ OutfitItem.AccessoriesImage2,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Bottom, SizeStrategy.PreserveWidth, 0.8, -1.25, -1.45) ], //\r\n [ OutfitItem.AccessoriesImage3,\r\n new SizeAndPositionInfo(PinnedXPosition.Center, PinnedYPosition.Bottom, SizeStrategy.PreserveWidth, 0.8, -1.25, -2.0) ] //\r\n]);\r\n\r\nexport function createSizedImagePlane(oi: OutfitItem, beforeRender: (oi: OutfitItem) => void): THREE.Mesh {\r\n var info = sizeAndPositionInfo.get(oi);\r\n var mesh = new THREE.Mesh(new PlaneGeometry(info.size, info.size), new MeshBasicMaterial({color: \"white\"}));\r\n mesh.onBeforeRender = () => beforeRender(oi);\r\n mesh.frustumCulled = false;\r\n return mesh;\r\n}","import OutfitItem, { outfitItems } from './OutfitItem';\r\n\r\nexport default class PerOutfitItemData extends Map {\r\n constructor(entries?: readonly (readonly [ OutfitItem, T ])[] | null) {\r\n super(entries);\r\n\r\n for (let oi of outfitItems)\r\n if (!this.has(oi))\r\n this.set(oi, undefined);\r\n }\r\n\r\n static withDefaultValue(defaultValue: T): PerOutfitItemData {\r\n return new PerOutfitItemData(outfitItems.map(oi => [ oi, defaultValue ]));\r\n }\r\n\r\n checkDataEqualityFunction: (me: T, other: T) => boolean = (me, other) => me === other;\r\n equals(other: PerOutfitItemData) {\r\n if (!other)\r\n return false;\r\n for (var [ key, value ] of this)\r\n if (!this.checkDataEqualityFunction(value, other.get(key)))\r\n return false;\r\n return true;\r\n }\r\n}\r\n","import PerOutfitItemData from \"./PerOutfitItemData\";\r\nimport Fabric from './Fabrics';\r\nimport OutfitItem, { outfitItems } from './OutfitItem';\r\n\r\nexport default class PerOutfitItemFabrics extends PerOutfitItemData {\r\n constructor() {\r\n super(null);\r\n this.checkDataEqualityFunction = (me, other) => !!me && me.equals(other);\r\n }\r\n\r\n static createInstanceForSingleItemPreview(oi: OutfitItem, fabric: Fabric): PerOutfitItemFabrics {\r\n var obj = new PerOutfitItemFabrics();\r\n for (var i of outfitItems)\r\n if ((oi & i) !== 0)\r\n obj.set(i, fabric);\r\n return obj;\r\n }\r\n\r\n getId(oi: OutfitItem) {\r\n return this.has(oi) && !!this.get(oi) ? this.get(oi).id : -1;\r\n }\r\n}\r\n","import React from 'react';\r\nimport * as THREE from 'three';\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';\r\nimport { TrackballControls } from \"three/examples/jsm/controls/TrackballControls\";\r\nimport PerOutfitItemFabrics from \"../modules/PerOutfitItemFabrics\";\r\nimport OutfitItem, { outfitItems, imageItems, materialItems, getName } from '../modules/OutfitItem';\r\nimport '../../assets/css/OutfitPreview.css';\r\nimport { TextureLoader, MeshBasicMaterial } from 'three';\r\nimport Fabric from '../modules/Fabrics';\r\nimport { saveAs } from 'file-saver';\r\nimport { SizeStrategy, createSizedImagePlane, sizeAndPositionInfo } from '../modules/SizeAndPositioning';\r\n\r\nexport default class OutfitPreview extends React.Component {\r\n constructor(props: OutfitPreviewProps, state: OutfitPreviewState) {\r\n super(props, state);\r\n this.state = new OutfitPreviewState();\r\n\r\n this.render = this.render.bind(this);\r\n this.recenterCamera = this.recenterCamera.bind(this);\r\n this.handleResize = this.handleResize.bind(this);\r\n this.onInterval = this.onInterval.bind(this);\r\n this.getTextureFromRecommendation = this.getTextureFromRecommendation.bind(this);\r\n this.setRecommendation = this.setRecommendation.bind(this);\r\n this.updateFabrics = this.updateFabrics.bind(this);\r\n this.saveScreenshot = this.saveScreenshot.bind(this);\r\n this.toggleImageVisibility = this.toggleImageVisibility.bind(this);\r\n this.getTextureFromUrl = this.getTextureFromUrl.bind(this);\r\n this.imageExists = this.imageExists.bind(this);\r\n this.beforePlaneRender = this.beforePlaneRender.bind(this);\r\n this.getTextDescriptionElements = this.getTextDescriptionElements.bind(this);\r\n this.getPlaneHidden = this.getPlaneHidden.bind(this);\r\n }\r\n\r\n static defaultProps = {\r\n style: {}\r\n };\r\n\r\n viewPortCanvas: HTMLCanvasElement;\r\n viewPort: HTMLDivElement;\r\n camera: THREE.PerspectiveCamera;\r\n renderer: THREE.WebGLRenderer;\r\n scene: THREE.Scene;\r\n clothesObjFileName: string = \"clothes_smoothed.aaf\";\r\n clothesObj: THREE.Object3D;\r\n controls: TrackballControls;\r\n planeObjDict: Map = new Map();\r\n\r\n private static clothesObjs: Map = new Map();\r\n private static _bodyObj: THREE.Object3D = null;\r\n static get bodyObj(): Promise {\r\n return new Promise(async (resolve, reject) => {\r\n if (!!OutfitPreview._bodyObj)\r\n resolve(OutfitPreview._bodyObj.clone(true));\r\n\r\n try {\r\n new OBJLoader()\r\n .load('smoothed_headless_man_no_low_half.aaf', (obj) => {\r\n // Load the body mat onto the body\r\n var bodyMat = new THREE.MeshPhysicalMaterial({ color: new THREE.Color(\"white\"), metalness: 0.3 });\r\n obj.traverse(child => {\r\n if (child instanceof THREE.Mesh)\r\n child.material = bodyMat;\r\n });\r\n\r\n OutfitPreview._bodyObj = obj;\r\n resolve(obj.clone(true));\r\n });\r\n } catch (ex) {\r\n reject(ex);\r\n }\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.scene.dispose();\r\n this.controls.dispose();\r\n this.renderer.dispose();\r\n }\r\n\r\n // Load the body object (if necessary)\r\n private async getClothesObj(): Promise {\r\n // Load the body object itself, if it's not already been loaded\r\n if (!OutfitPreview.clothesObjs.has(this.clothesObjFileName))\r\n OutfitPreview.clothesObjs.set(this.clothesObjFileName, await new Promise(async (resolve, reject) => {\r\n try {\r\n new OBJLoader().load(this.clothesObjFileName, obj => resolve(obj));\r\n } catch (ex) {\r\n reject(ex);\r\n }\r\n }));\r\n\r\n return OutfitPreview.clothesObjs.get(this.clothesObjFileName).clone(true);\r\n }\r\n\r\n async componentDidMount() {\r\n // Set up the camera\r\n this.camera = new THREE.PerspectiveCamera(50, 1, 1, 10000);\r\n\r\n // Set up the scene\r\n this.scene = new THREE.Scene();\r\n this.scene.background = new THREE.Color(0xffffff);\r\n\r\n // Add the body into the scene\r\n this.scene.add(await OutfitPreview.bodyObj);\r\n\r\n // Load the clothes object\r\n this.clothesObj = await this.getClothesObj();\r\n\r\n // Load a material onto the body\r\n this.scene.add(this.clothesObj);\r\n\r\n // Setup the planes we'll render our images onto\r\n for (let oi of OutfitPreview.allImageOutfitItems) {\r\n var planeMesh = createSizedImagePlane(oi, this.beforePlaneRender);\r\n this.scene.add(planeMesh);\r\n this.planeObjDict.set(oi, planeMesh);\r\n }\r\n\r\n // Set up the lighting of the scene\r\n this.scene.add(new THREE.AmbientLight(0x9b9b9b));\r\n const light = new THREE.DirectionalLight(0x9b9b9b);\r\n light.position.set(300, 300, 300);\r\n this.scene.add(light);\r\n\r\n // Set up the render\r\n this.renderer = new THREE.WebGLRenderer({\r\n canvas: this.viewPortCanvas,\r\n antialias: true,\r\n precision: \"lowp\",\r\n powerPreference: \"high-performance\",\r\n preserveDrawingBuffer: true\r\n });\r\n\r\n this.renderer.setPixelRatio(window.devicePixelRatio);\r\n // this.renderer.setSize(400, 800, true);\r\n\r\n // Set up the controls to center the camera on the target object\r\n this.controls = new TrackballControls(this.camera, this.renderer.domElement);\r\n this.controls.rotateSpeed = 5.0;\r\n this.controls.zoomSpeed = 4;\r\n this.controls.panSpeed = 0.8;\r\n this.controls.staticMoving = true;\r\n this.controls.dynamicDampingFactor = 0.3;\r\n this.controls.keys = [ 65, 83, 68 ];\r\n this.controls.addEventListener('change', () => this.renderer.render(this.scene, this.camera));\r\n this.controls.enabled = true;\r\n this.controls.update();\r\n this.resetCamera();\r\n setInterval(this.onInterval, 10);\r\n }\r\n\r\n private imageExists(oi: OutfitItem): boolean {\r\n if (!this.state.recommendation)\r\n return false;\r\n const fabric = this.state.recommendation.get(oi);\r\n if (!fabric || !fabric.url)\r\n return false;\r\n return true;\r\n }\r\n\r\n private getPlaneHidden(oi: OutfitItem): boolean {\r\n return !this.state.recommendation || (this.state.recommendation.getId(oi) === -1);\r\n }\r\n\r\n private getPlaneScale(oi: OutfitItem): number[] {\r\n let plane = this.planeObjDict.get(oi);\r\n \r\n var hasImage = !!(plane.material as MeshBasicMaterial) && !!(plane.material as MeshBasicMaterial).map;\r\n var originalWidth = hasImage ? (plane.material as MeshBasicMaterial).map.image.width : 0;\r\n var originalHeight = hasImage ? (plane.material as MeshBasicMaterial).map.image.height : 0;\r\n\r\n let sizeAndPosInfo = sizeAndPositionInfo.get(oi);\r\n const originalDimsProvided = !!originalWidth && !!originalHeight && originalHeight > 0 && originalWidth > 0;\r\n var scaleX = sizeAndPosInfo.size;\r\n var scaleY = sizeAndPosInfo.size;\r\n if (sizeAndPosInfo.sizeStrategy === SizeStrategy.PreserveHeight && originalDimsProvided)\r\n scaleY = scaleX * originalHeight / originalWidth;\r\n else if (sizeAndPosInfo.sizeStrategy === SizeStrategy.PreserveWidth && originalDimsProvided)\r\n scaleX = scaleY * originalWidth / originalHeight;\r\n\r\n if (!materialItems.includes(oi) && !!this.state.recommendation && this.state.recommendation.getId(oi) !== -1) {\r\n scaleX *= this.state.recommendation.get(oi).scale;\r\n scaleY *= this.state.recommendation.get(oi).scale;\r\n }\r\n\r\n return [scaleX, scaleY];\r\n }\r\n\r\n private getPlaneX(oi: OutfitItem): number {\r\n let sizeAndPosInfo = sizeAndPositionInfo.get(oi);\r\n const offsetAccessoryParts = [OutfitItem.AccessoriesImage2, OutfitItem.AccessoriesImage3];\r\n if (!offsetAccessoryParts.includes(oi))\r\n return sizeAndPosInfo.x;\r\n\r\n var prevAccessories: OutfitItem[] = [];\r\n if ((oi === OutfitItem.AccessoriesImage2 || oi === OutfitItem.AccessoriesImage3) && !this.getPlaneHidden(OutfitItem.AccessoriesImage1))\r\n prevAccessories.push(OutfitItem.AccessoriesImage1);\r\n if (oi === OutfitItem.AccessoriesImage3 && !this.getPlaneHidden(OutfitItem.AccessoriesImage2))\r\n prevAccessories.push(OutfitItem.AccessoriesImage2);\r\n\r\n if (prevAccessories.length === 0)\r\n return sizeAndPosInfo.x;\r\n\r\n let minX: number = 1000000;\r\n for (let oi2 of prevAccessories) {\r\n let x = this.getPlaneX(oi2);\r\n x -= (this.getPlaneScale(oi2)[0] * sizeAndPositionInfo.get(oi2).size) / 2;\r\n minX = Math.min(minX, x);\r\n }\r\n return minX - (this.getPlaneScale(oi)[0] * sizeAndPositionInfo.get(oi).size) / 2;\r\n }\r\n\r\n private beforePlaneRender(oi: OutfitItem) {\r\n if (!this.planeObjDict.has(oi))\r\n return;\r\n\r\n let plane = this.planeObjDict.get(oi);\r\n if (this.getPlaneHidden(oi)) {\r\n (plane.material as MeshBasicMaterial).opacity = 0;\r\n (plane.material as MeshBasicMaterial).transparent = true;\r\n return;\r\n } else {\r\n (plane.material as MeshBasicMaterial).opacity = 1;\r\n (plane.material as MeshBasicMaterial).transparent = true;\r\n }\r\n\r\n plane.quaternion.copy(this.camera.quaternion);\r\n plane.position.copy(this.camera.position);\r\n plane.updateMatrix();\r\n\r\n let sizeAndPosInfo = sizeAndPositionInfo.get(oi);\r\n\r\n // Position\r\n let x = this.getPlaneX(oi);\r\n \r\n // Size\r\n var [scaleX, scaleY] = this.getPlaneScale(oi);\r\n\r\n // Application\r\n plane\r\n .translateZ(-10)\r\n .translateX(x)\r\n .translateY(sizeAndPosInfo.y)\r\n .scale.setX(scaleX).setY(scaleY);\r\n }\r\n\r\n resetCamera() {\r\n this.prevCameraPos = null;\r\n this.controls.update();\r\n this.controls.reset();\r\n this.handleResize();\r\n\r\n // Set up the camera\r\n const scaleFactor = 1000 / 500;\r\n this.camera.position.set(300 / scaleFactor, 300 / scaleFactor, 500 / scaleFactor);\r\n this.camera.zoom = this.props.type === \"Recommendation\" ? 1.5 : 1.8;\r\n this.camera.aspect = this.viewPort.clientWidth / this.viewPort.clientHeight;\r\n this.recenterCamera();\r\n }\r\n\r\n private recenterCamera() {\r\n var bb = new THREE.Box3();\r\n bb.setFromObject(this.clothesObj);\r\n bb.getCenter(this.controls.target);\r\n this.prevCameraPos = null;\r\n this.prevCameraRotation = null;\r\n }\r\n\r\n prevCameraPos: THREE.Vector3 = null;\r\n prevCameraRotation: THREE.Euler = null;\r\n private onInterval() {\r\n this.controls.update();\r\n this.camera.updateProjectionMatrix();\r\n this.renderer.render(this.scene, this.camera);\r\n if (!this.state.recommendation && this.props.type === \"Recommendation\")\r\n this.renderer.setSize(0, 0, true);\r\n else\r\n this.handleResize();\r\n }\r\n\r\n private async saveScreenshot() {\r\n try {\r\n if (!this.state.recommendation)\r\n return;\r\n var fileContent = this.renderer.domElement.toDataURL(\"image/jpg\", 90);\r\n var fileContentPrefix = fileContent.substr(0, fileContent.indexOf('base64,') + 'base64,'.length);\r\n fileContent = fileContent.replace(fileContentPrefix, \"\");\r\n var body = {\r\n jacket: this.state.recommendation.getId(OutfitItem.Jacket),\r\n pants: this.state.recommendation.getId(OutfitItem.Pants),\r\n shirt: this.state.recommendation.getId(OutfitItem.Shirt),\r\n shoes: this.state.recommendation.getId(OutfitItem.Shoes),\r\n belt: this.state.recommendation.getId(OutfitItem.Shoes),\r\n bagImage: this.state.recommendation.getId(OutfitItem.BagImage),\r\n shoesImage: this.state.recommendation.getId(OutfitItem.ShoesImage),\r\n tieImage: this.state.recommendation.getId(OutfitItem.TieImage),\r\n watchImage: this.state.recommendation.getId(OutfitItem.WatchImage),\r\n accessoriesImage1: this.state.recommendation.getId(OutfitItem.AccessoriesImage1),\r\n accessoriesImage2: this.state.recommendation.getId(OutfitItem.AccessoriesImage2),\r\n accessoriesImage3: this.state.recommendation.getId(OutfitItem.AccessoriesImage3),\r\n imageBase64: fileContent\r\n };\r\n var resp = await fetch(`${process.env.REACT_APP_END_POINT_URL}/image/finish`, {\r\n method: \"POST\",\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(body)\r\n });\r\n\r\n var respText = await resp.text();\r\n if (!resp.ok) {\r\n console.error(\"Bad watermark request\");\r\n console.error(\"request: \", body);\r\n console.error(\"response: \", respText);\r\n return;\r\n }\r\n\r\n var respBlob = fileContentPrefix + respText;\r\n // console.log(respBlob);\r\n saveAs(respBlob, \"Outfit.jpg\");\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n private handleResize() {\r\n if (!this.viewPort)\r\n return;\r\n\r\n try {\r\n this.renderer.setSize(this.viewPort.clientWidth, this.viewPort.clientHeight);\r\n this.camera.aspect = this.viewPort.clientWidth / this.viewPort.clientHeight;\r\n this.controls.handleResize();\r\n this.camera.updateProjectionMatrix();\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n private async getTextureFromRecommendation(): Promise {\r\n return await this.getTextureFromUrl(`${ process.env.REACT_APP_END_POINT_URL }`\r\n + \"/image\"\r\n + \"/\" + (this.state.recommendation.get(OutfitItem.Jacket) ? this.state.recommendation.get(OutfitItem.Jacket).id : -1)\r\n + \"/\" + (this.state.recommendation.get(OutfitItem.Shirt) ? this.state.recommendation.get(OutfitItem.Shirt).id : -1)\r\n + \"/\" + (this.state.recommendation.get(OutfitItem.Pants) ? this.state.recommendation.get(OutfitItem.Pants).id : -1)\r\n + \"/\" + (this.state.recommendation.get(OutfitItem.Shoes) ? this.state.recommendation.get(OutfitItem.Shoes).id : -1));\r\n }\r\n\r\n private async getTextureFromUrl(url: string): Promise {\r\n const loader = new TextureLoader();\r\n // loader.crossOrigin = \"\";\r\n\r\n return await new Promise((resolve, reject) => loader.load(url, image => {\r\n try {\r\n image.anisotropy = this.renderer.capabilities.getMaxAnisotropy();\r\n resolve(image);\r\n } catch(er) {\r\n reject(er);\r\n }\r\n }, null, e => {\r\n console.error(`Failed to load image from ${url}`);\r\n reject(e)\r\n }));\r\n }\r\n\r\n private static allImageOutfitItems = materialItems.concat(imageItems).filter(oi => oi !== OutfitItem.Shoes);\r\n setRecommendation(recommendation: PerOutfitItemFabrics) {\r\n if (!recommendation)\r\n recommendation = new PerOutfitItemFabrics();\r\n\r\n for (var oi of outfitItems)\r\n if (!recommendation.get(oi)) {\r\n var fabric = new Fabric();\r\n fabric.id = -1;\r\n recommendation.set(oi, fabric);\r\n }\r\n\r\n var materialsChanged = ((!!this.state.recommendation) !== (!!recommendation)) || materialItems.some(oi => recommendation.get(oi).id !== this.state.recommendation.get(oi).id);\r\n \r\n var changedImages = new Map();\r\n for (oi of OutfitPreview.allImageOutfitItems)\r\n changedImages.set(oi, (!!this.state.recommendation) !== (!!recommendation) || recommendation.get(oi).id !== this.state.recommendation.get(oi).id);\r\n\r\n this.setState({ recommendation }, async () => await this.updateFabrics(materialsChanged, changedImages));\r\n }\r\n\r\n private async updateFabrics(materialsChanged: boolean, changedImages: Map) {\r\n // Start loading\r\n this.setState({ loading: true });\r\n\r\n if (!this.clothesObj)\r\n return;\r\n\r\n // Load images\r\n for (let oi of OutfitPreview.allImageOutfitItems) {\r\n if (!changedImages.get(oi) \r\n || !this.state.recommendation || this.state.recommendation.getId(oi) === -1\r\n || !this.planeObjDict.has(oi)\r\n || !this.planeObjDict.get(oi))\r\n continue;\r\n try {\r\n let fabricId = this.state.recommendation.getId(oi);\r\n let plane = this.planeObjDict.get(oi);\r\n\r\n console.log(\"loading texture\");\r\n try {\r\n var map = await this.getTextureFromUrl(process.env.REACT_APP_END_POINT_URL + '/fabrics/' + fabricId + '/image');\r\n } catch(err) {\r\n console.error(`Failed to load texture for ${getName(oi)}:`, err);\r\n continue;\r\n }\r\n\r\n console.log(\"loading alpha map\");\r\n try {\r\n var alphaMap = await this.getTextureFromUrl(process.env.REACT_APP_END_POINT_URL + '/fabrics/' + fabricId + '/bordermask');\r\n } catch(err) {\r\n console.error(`Failed to load alpha texture ${getName(oi)}:`, err);\r\n }\r\n\r\n try {\r\n if ((plane.material instanceof THREE.MeshBasicMaterial) && !!plane.material && !!plane.material.map) {\r\n // plane.material.transparent = true;\r\n // plane.\r\n plane.material.map.dispose();\r\n if (!!map)\r\n plane.material.map = map;\r\n plane.material.alphaMap.dispose();\r\n if (!!alphaMap)\r\n plane.material.alphaMap = alphaMap;\r\n } else {\r\n plane.material = new THREE.MeshBasicMaterial({ map: map, alphaMap: alphaMap, transparent: true, side: THREE.FrontSide, color: new THREE.Color(\"white\"), blending: THREE.NormalBlending });\r\n }\r\n } catch(e) {\r\n console.error(`Error applying texture ${getName(oi)}:`, e)\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n // Load texture itself\r\n if (materialsChanged) {\r\n var texture = await this.getTextureFromRecommendation();\r\n await new Promise((resolve, reject) => {\r\n this.clothesObj.traverse(child => {\r\n if (child instanceof THREE.Mesh && child.name !== \"man_body\") {\r\n if (child.material instanceof THREE.MeshLambertMaterial) {\r\n child.material.map.dispose();\r\n child.material.map = texture;\r\n } else {\r\n child.material = new THREE.MeshLambertMaterial({ map: texture });\r\n }\r\n\r\n resolve();\r\n return;\r\n }\r\n });\r\n\r\n reject();\r\n });\r\n }\r\n\r\n // End loading\r\n this.setState({ loading: false });\r\n }\r\n\r\n toggleImageVisibility() {\r\n for (var plane of this.planeObjDict.values())\r\n plane.visible = !plane.visible;\r\n }\r\n\r\n getTextDescriptionElements() {\r\n var components = [];\r\n for (var oi of outfitItems.filter(oi => oi !== OutfitItem.Shoes && this.state.recommendation.getId(oi) !== -1)) {\r\n components.push(\r\n
\r\n {getName(oi)}:{' '} {this.state.recommendation.get(oi).number}\r\n
);\r\n }\r\n return components;\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n
this.viewPort = ref} style={this.state.loading || !this.state.recommendation ? { display: \"none\" } : {}}>\r\n this.viewPortCanvas = ref} />\r\n {!this.state.showingText || !this.state.recommendation ? null : \r\n
this.setState({showingText: !this.state.showingText})} style={{position: \"absolute\", bottom: \"0px\", top: \"0px\", left: \"0px\", right: \"0px\", backgroundColor: \"rgba(169, 169, 169, 0.7)\", textAlign: \"center\", justifyContent: \"center\", alignContent: \"center\", display: \"flex\"}}>\r\n
\r\n { this.getTextDescriptionElements() }\r\n
\r\n
\r\n }\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
this.setState({showingText: !this.state.showingText})} style={{ visibility: this.props.showFabricNames ? \"visible\" : \"collapse\" }} />\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass OutfitPreviewProps {\r\n style: React.CSSProperties;\r\n type: \"Recommendation\" | \"View\";\r\n showFabricNames: boolean;\r\n showSaveScreenshot: boolean;\r\n showToggleImages: boolean;\r\n}\r\n\r\nclass OutfitPreviewState {\r\n loading: boolean = false;\r\n showingText: boolean = false;\r\n recommendation: PerOutfitItemFabrics = null;\r\n}","import React from 'react';\r\nimport PerOutfitItemFabrics from \"../modules/PerOutfitItemFabrics\";\r\nimport OutfitPreview from './OutfitPreview';\r\nimport '../../assets/css/RecommendationPreviewer.css';\r\n\r\nexport default class RecommendationCarousel extends React.Component {\r\n constructor(props, state) {\r\n super(props, state);\r\n this.state = {\r\n selection: null,\r\n recommendations: []\r\n };\r\n }\r\n recommendationPreviews: OutfitPreview[] = [];\r\n\r\n static defaultProps = {\r\n style: {}\r\n };\r\n\r\n resetCamera() {\r\n for (var preview of this.recommendationPreviews)\r\n preview.resetCamera();\r\n }\r\n\r\n setRecommendations(recommendations: PerOutfitItemFabrics[]) {\r\n // this.setState({recommendations});\r\n this.recommendationPreviews.forEach((preview, index) => {\r\n var hasValidRec = !!recommendations && recommendations.length > index;\r\n preview.setRecommendation(hasValidRec ? recommendations[index] : null);\r\n if (hasValidRec)\r\n preview.resetCamera();\r\n });\r\n }\r\n\r\n getPreviewDiv(index: number) {\r\n return this.recommendationPreviews[index] = ref} showFabricNames={true} showSaveScreenshot={true} showToggleImages={true} />\r\n }\r\n\r\n render() {\r\n var previews: JSX.Element[] = [];\r\n for (var i = 0; i < parseInt(process.env.REACT_APP_RECOMMENDATION_COUNT); i++)\r\n previews.push(this.getPreviewDiv(i));\r\n\r\n if (previews.length === 1)\r\n return previews[0];\r\n\r\n return(\r\n
\r\n
\r\n {previews}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass RecommendationCarouselProps {\r\n style: React.CSSProperties;\r\n}\r\n\r\nclass RecommendationCarouselState {\r\n selection: PerOutfitItemFabrics;\r\n recommendations: PerOutfitItemFabrics[];\r\n}","import React from 'react';\r\nimport { Modal, Button } from \"reactstrap\";\r\n\r\nexport default class AlertModal extends React.Component {\r\n render() {\r\n return (\r\n this.props.toggle()}>\r\n
\r\n
\r\n

{this.props.modalText}

\r\n {this.props.modalType !== \"Alert\" ?\r\n
\r\n \r\n \r\n \r\n
\r\n : null}\r\n
\r\n
\r\n {this.props.modalType === \"Alert\" ?\r\n
\r\n \r\n
\r\n : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass AlertModalProps {\r\n policyAlertModal: boolean;\r\n modalText: string;\r\n modalType: String;\r\n toggle: (msg?: string) => void;\r\n}","import React from 'react';\r\nimport { Modal, Button } from \"reactstrap\";\r\n\r\nexport default class ConfirmModal extends React.Component {\r\n closeWithDecision(decision: boolean) {\r\n this.props.onDecision(decision);\r\n this.props.toggle();\r\n }\r\n\r\n render() {\r\n return (\r\n this.closeWithDecision(false)}>\r\n
\r\n
\r\n

Are you sure?

\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\nclass ConfirmModalProps {\r\n isVisible: boolean;\r\n onDecision: (confirm: boolean) => void;\r\n toggle: () => void;\r\n}","import { Field, Type, deserialize } from 'serialize-ts';\r\nimport Attr from './Attr';\r\n\r\nclass Rule {\r\n @Field()\r\n @Type(Number)\r\n id: number = 0;\r\n\r\n @Field()\r\n @Type(Boolean)\r\n negativeRule = false;\r\n\r\n @Field()\r\n @Type(Number)\r\n conditionOutfitParts = 0;\r\n\r\n @Field()\r\n @Type(Number)\r\n recommendedOutfitParts = 0;\r\n\r\n conditionAttribute: Attr;\r\n\r\n recommendedAttribute: Attr;\r\n}\r\n\r\nvar storedRules: Rule[] = [];\r\nasync function refreshRules(): Promise {\r\n //Get all rules\r\n var ruleResponses = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/rules`, { method: \"GET\" });\r\n var jsonRules = await ruleResponses.json();\r\n storedRules = [];\r\n for (var jsonRule of jsonRules) {\r\n const rule = deserialize(jsonRule, Rule);\r\n rule.conditionAttribute = deserialize(jsonRule.conditionAttribute, Attr);\r\n rule.recommendedAttribute = deserialize(jsonRule.recommendedAttribute, Attr);\r\n storedRules.push(rule);\r\n }\r\n}\r\n\r\nfunction getStoredRules(): Rule[] {\r\n return storedRules;\r\n}\r\n\r\nexport { Rule, getStoredRules, refreshRules };","import AttrType from '../modules/AttrType';\r\nimport React from 'react';\r\nimport Attr, { AttrConsts } from '../modules/Attr';\r\n\r\nexport default class AttributeDropdownEditor extends React.Component {\r\n constructor(props: Props, state: State) {\r\n super(props, state);\r\n this.state = new State();\r\n }\r\n\r\n static defaultProps = {\r\n isValid: true,\r\n defaultValue: null\r\n };\r\n\r\n onValueChanged(id: number) {\r\n this.setState({ selectedAttrId: id }, () => this.props.onChange(AttrConsts.getAttribute(id)));\r\n }\r\n\r\n componentWillReceiveProps(nextProps: Props) {\r\n if (nextProps.waitingForPreload !== this.props.waitingForPreload)\r\n this.forceUpdate();\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.props.type.displayName}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nclass Props {\r\n type: AttrType;\r\n isValid: boolean;\r\n onChange: (a: Attr) => void;\r\n waitingForPreload: boolean;\r\n defaultValue: Attr;\r\n}\r\n\r\nclass State {\r\n selectedAttrId: number = 0;\r\n}","import React from 'react';\r\nimport OutfitPreview from '../previews/OutfitPreview';\r\nimport Attr, { AttrConsts } from '../modules/Attr';\r\nimport AttrType from \"../modules/AttrType\";\r\nimport Fabric, { getStoredFabrics, refreshFabrics } from '../modules/Fabrics';\r\nimport { Button } from \"reactstrap\";\r\nimport AttributeDropdownEditor from './AttributeDropdownEditor';\r\nimport OutfitItem, { getFabricNumberPhrasing, lowInfoFabricItems } from '../modules/OutfitItem';\r\nimport imageType from 'image-type';\r\nimport https from 'https';\r\nimport { IncomingMessage } from 'http';\r\nimport PerOutfitItemFabrics from '../modules/PerOutfitItemFabrics';\r\n\r\nexport default class EditFabricForm extends React.Component {\r\n constructor(props: EditFabricFormProps, state: EditFabricFormState) {\r\n super(props, state);\r\n this.state = new EditFabricFormState(props.fabric);\r\n this.fabricNumberIsValid = this.fabricNumberIsValid.bind(this);\r\n }\r\n\r\n static defaultProps = { fabric: null };\r\n modalMannequin: OutfitPreview;\r\n\r\n componentWillReceiveProps(nextProps: EditFabricFormProps) {\r\n if (nextProps.fabric && (!this.props.fabric || nextProps.fabric.id !== this.props.fabric.id))\r\n this.setState(new EditFabricFormState(nextProps.fabric));\r\n }\r\n\r\n async refreshPreview(): Promise {\r\n if (!this.previewIsRenderable())\r\n return;\r\n\r\n const proxyurl = \"https://cors-anywhere.herokuapp.com/\";\r\n var response = await new Promise((resolve, reject) =>\r\n https.get(proxyurl + this.state.fabricUrl, response => {\r\n response.on('readable', () => resolve(response));\r\n response.on(\"error\", () => reject());\r\n })\r\n );\r\n\r\n try {\r\n const chunk = response.read(imageType.minimumBytes);\r\n response.destroy();\r\n try {\r\n var fabricUrlIsValid = !!imageType(chunk);\r\n } catch (err) {\r\n throw err;\r\n }\r\n if (fabricUrlIsValid)\r\n this.updateModelOutfit().then(() => this.modalMannequin.resetCamera());\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n async updateModelOutfit() {\r\n this.setState({ viewLoading: true });\r\n await refreshFabrics();\r\n const matchingFabrics = getStoredFabrics().filter(f => f.isTemp && (f.url === this.state.fabricUrl || f.appliesTo === this.state.fabricAppliesTo || f.scale === this.state.fabricScale));\r\n var response = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/fabrics` + (matchingFabrics.length === 0 ? \"\" : `/${ matchingFabrics[ 0 ].id }`),\r\n {\r\n method: matchingFabrics.length === 0 ? \"POST\" : \"PATCH\",\r\n body: JSON.stringify({\r\n \"id\": 0,\r\n \"soldOut\": false,\r\n \"url\": this.state.fabricUrl,\r\n \"number\": \"TEMP\",\r\n \"appliesTo\": this.state.fabricAppliesTo,\r\n \"scale\": this.state.fabricScale,\r\n \"isTemp\": true\r\n }),\r\n headers: [ [ \"accept\", \"text/plain\" ], [ \"Content-Type\", \"application/json\" ] ]\r\n });\r\n\r\n if (!response.ok) {\r\n this.props.toggleAlertModal(\"Check Again.\");\r\n this.setState({ viewLoading: false });\r\n return;\r\n }\r\n\r\n var fabricId = matchingFabrics.length === 0 ? await response.json() : matchingFabrics[ 0 ].id;\r\n this.showMannequin(fabricId);\r\n this.setState({ viewLoading: false });\r\n }\r\n\r\n async showMannequin(fabricId: number) {\r\n this.setState({ viewLoading: true });\r\n try {\r\n var recommendation = PerOutfitItemFabrics.createInstanceForSingleItemPreview(this.state.fabricAppliesTo, this.getFabric(fabricId));\r\n this.modalMannequin.setRecommendation(recommendation);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n this.setState({ viewLoading: false });\r\n }\r\n\r\n fabricScaleIsValid(): boolean {\r\n return this.state.fabricScale > 0.001 && this.state.fabricScale <= 5;\r\n }\r\n\r\n previewIsRenderable(): boolean {\r\n return this.fabricScaleIsValid() && this.fabricScaleIsValid() && this.state.fabricAppliesTo !== OutfitItem.None;\r\n }\r\n\r\n fabricIsValid(): boolean {\r\n return this.fabricNumberIsValid()\r\n && this.fabricScaleIsValid()\r\n && this.state.fabricAppliesTo !== OutfitItem.None\r\n && (!!this.state.material || lowInfoFabricItems.includes(this.state.fabricAppliesTo))\r\n && (!!this.state.fabricLine || lowInfoFabricItems.includes(this.state.fabricAppliesTo))\r\n && (!!this.state.primaryColor || lowInfoFabricItems.includes(this.state.fabricAppliesTo) || this.state.primaryPattern.name.toLowerCase() === \"fancy\")\r\n && (!!this.state.primaryPattern || lowInfoFabricItems.includes(this.state.fabricAppliesTo));\r\n }\r\n\r\n getFabric(id: number = -1): Fabric {\r\n var f = new Fabric();\r\n if (!!this.props.fabric && id === -1)\r\n f.id = this.props.fabric.id;\r\n if (id !== -1)\r\n f.id = id;\r\n f.number = this.state.fabricNumber;\r\n f.isTemp = false;\r\n f.url = this.state.fabricUrl;\r\n f.appliesTo = this.state.fabricAppliesTo;\r\n f.scale = this.state.fabricScale;\r\n f.soldOut = this.state.soldOut;\r\n if (!!this.state.material)\r\n f.materialId = this.state.material.attributeId;\r\n if (!!this.state.fabricLine)\r\n f.fabricLineId = this.state.fabricLine.attributeId;\r\n if (!!this.state.primaryColor)\r\n f.primaryColorId = this.state.primaryColor.attributeId;\r\n if (!!this.state.primaryPattern)\r\n f.primaryPatternId = this.state.primaryPattern.attributeId;\r\n if (!!this.state.secondaryColor)\r\n f.secondaryColorId = this.state.secondaryColor.attributeId;\r\n if (!!this.state.secondaryPattern)\r\n f.secondaryPatternId = this.state.secondaryPattern.attributeId;\r\n return f;\r\n }\r\n\r\n fabricNumberIsValid(): boolean {\r\n if (!this.state.fabricNumber || this.state.fabricNumber.length === 0)\r\n return false;\r\n var collisionFabrics = getStoredFabrics().filter(f => !f.isTemp && (f.number === this.state.fabricNumber));\r\n return this.props.fabric ? !collisionFabrics.some(f => f.id !== this.props.fabric.id) : collisionFabrics.length === 0;\r\n }\r\n\r\n static urlRegex: RegExp = /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www\\.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[+~%/.\\w\\-_]*)?\\??(?:[-+=&;%@.\\w_]*)#?(?:[.!/\\\\\\w]*))?)/;\r\n\r\n static stringIsUrl(str: string) {\r\n if (!str || str.length === 0)\r\n return false;\r\n\r\n const regexResults = EditFabricForm.urlRegex.exec(str);\r\n return !!regexResults && regexResults.some(r => !!r && r.length === str.length);\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.props.children}\r\n
\r\n
\r\n this.setState({ soldOut: e.target.checked })} /> Sold out\r\n
\r\n
\r\n Image URL\r\n { if (e.keyCode === 13 || e.keyCode === 9 || e.keyCode === 27) this.refreshPreview(); }}\r\n onChange={e => this.setState({ fabricUrl: e.target.value })}\r\n onBlur={() => { if (this.state.fabricUrl !== this.state.previousFabricUrl) this.setState({ previousFabricUrl: this.state.fabricUrl }, this.refreshPreview); }}\r\n onFocus={() => this.setState({ previousFabricUrl: this.state.fabricUrl })} required />\r\n
\r\n
\r\n {getFabricNumberPhrasing(this.state.fabricAppliesTo)}\r\n this.setState({ fabricNumber: e.target.value })} required />\r\n
\r\n
\r\n Applies To\r\n \r\n
\r\n
\r\n Fabric Scale\r\n
\r\n
\r\n this.setState({ fabricScale: e.target.valueAsNumber })} onMouseUp={e => this.refreshPreview()} className=\"custom-range\" value={this.state.fabricScale} min={0.01} max={3} step={0.025} />\r\n
\r\n this.setState({ primaryColor: a })}\r\n waitingForPreload={this.props.waitingForPreload}\r\n defaultValue={this.state.primaryColor}\r\n isValid={(this.state.primaryPattern && this.state.primaryPattern.name.toLowerCase() === \"fancy\") || lowInfoFabricItems.includes(this.state.fabricAppliesTo) || !!this.state.primaryColor} />\r\n this.setState({ primaryPattern: a })}\r\n waitingForPreload={this.props.waitingForPreload}\r\n defaultValue={this.state.primaryPattern}\r\n isValid={!!this.state.primaryPattern || lowInfoFabricItems.includes(this.state.fabricAppliesTo)} />\r\n this.setState({ secondaryColor: a })}\r\n defaultValue={this.state.secondaryColor}\r\n waitingForPreload={this.props.waitingForPreload} />\r\n this.setState({ secondaryPattern: a })}\r\n defaultValue={this.state.secondaryPattern}\r\n waitingForPreload={this.props.waitingForPreload} />\r\n this.setState({ material: a })}\r\n waitingForPreload={this.props.waitingForPreload}\r\n defaultValue={this.state.material}\r\n isValid={!!this.state.material || lowInfoFabricItems.includes(this.state.fabricAppliesTo)} />\r\n this.setState({ fabricLine: a })}\r\n waitingForPreload={this.props.waitingForPreload}\r\n defaultValue={this.state.fabricLine}\r\n isValid={!!this.state.fabricLine || lowInfoFabricItems.includes(this.state.fabricAppliesTo)} />\r\n
\r\n
\r\n Material Preview\r\n \r\n
\r\n
\r\n this.modalMannequin = ref} showFabricNames={false} showSaveScreenshot={false} showToggleImages={false} />\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass EditFabricFormState {\r\n fabricUrl: string = \"\";\r\n fabricNumber: string = \"\";\r\n fabricAppliesTo: OutfitItem = OutfitItem.None;\r\n fabricScale: number = 0.3;\r\n soldOut: boolean = false;\r\n viewLoading: boolean = false;\r\n primaryColor: Attr = null;\r\n primaryPattern: Attr = null;\r\n secondaryColor: Attr = null;\r\n secondaryPattern: Attr = null;\r\n material: Attr = null;\r\n fabricLine: Attr = null;\r\n previousFabricUrl: string = null;\r\n\r\n constructor(f: Fabric = null) {\r\n if (!f)\r\n return;\r\n\r\n this.previousFabricUrl = f.url;\r\n this.fabricUrl = f.url;\r\n this.fabricNumber = f.number;\r\n this.fabricAppliesTo = f.appliesTo;\r\n this.fabricScale = f.scale;\r\n this.soldOut = f.soldOut;\r\n this.primaryColor = AttrConsts.getAttribute(f.primaryColorId);\r\n this.primaryPattern = AttrConsts.getAttribute(f.primaryPatternId);\r\n this.secondaryColor = AttrConsts.getAttribute(f.secondaryColorId);\r\n this.secondaryPattern = AttrConsts.getAttribute(f.secondaryPatternId);\r\n this.material = AttrConsts.getAttribute(f.materialId);\r\n this.fabricLine = AttrConsts.getAttribute(f.fabricLineId);\r\n }\r\n}\r\n\r\nclass EditFabricFormProps {\r\n fabric: Fabric;\r\n toggleAlertModal: (msg: string, type?: string) => void;\r\n waitingForPreload: boolean;\r\n}","import React from 'react';\r\nimport { Modal, ModalHeader, ModalBody, Button, ListGroup, ListGroupItem } from \"reactstrap\";\r\nimport OutfitItem from './modules/OutfitItem';\r\nimport Attr, { AttrConsts } from './modules/Attr';\r\nimport Fabric, { refreshFabrics, getStoredFabrics } from './modules/Fabrics';\r\nimport { refreshRules, getStoredRules } from './modules/Rules';\r\nimport AttrType from './modules/AttrType';\r\nimport EditFabricForm from './fabrics/EditFabricForm';\r\nimport SearchBox from './Swatches/SearchBox';\r\n\r\nenum AddEditType {\r\n addFabric,\r\n editRules,\r\n editFabrics,\r\n addRule\r\n}\r\n\r\nexport default class AddEditModal extends React.Component {\r\n constructor(props: AddEditModalProps, state: AddEditModalState) {\r\n super(props, state);\r\n this.state = new AddEditModalState();\r\n\r\n this.deleteFabric = this.deleteFabric.bind(this);\r\n this.deleteRule = this.deleteRule.bind(this);\r\n this.saveFabric = this.saveFabric.bind(this);\r\n this.addRecommendationRule = this.addRecommendationRule.bind(this);\r\n }\r\n\r\n editFabricSearchBox: SearchBox;\r\n editFabricControl: EditFabricForm;\r\n addFabricControl: EditFabricForm;\r\n\r\n async deleteRule(confirmation: boolean) {\r\n if (!confirmation)\r\n return;\r\n\r\n this.props.toggleAlertModal(\"Deleting\", \"loader\");\r\n try {\r\n var response = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/rules/${ this.state.selectedRuleId }`, {\r\n method: \"DELETE\"\r\n });\r\n if (!response.ok)\r\n throw new Error(\"\");\r\n\r\n await refreshRules();\r\n this.props.toggleAlertModal(\"Success\");\r\n this.setState({ selectedRuleId: -1 });\r\n } catch (err) {\r\n this.props.toggleAlertModal(\"failure\");\r\n }\r\n }\r\n\r\n async addRecommendationRule() {\r\n this.props.toggleAlertModal(\"Saving\", \"loader\");\r\n\r\n var conditionAttribute = this.state.conditionAttribute;\r\n if (!conditionAttribute)\r\n conditionAttribute = AttrConsts.getAttributes(this.state.conditionAttributeType)[ 0 ];\r\n\r\n var consequenceAttribute = this.state.consequenceAttribute;\r\n if (!consequenceAttribute)\r\n consequenceAttribute = AttrConsts.getAttributes(this.state.consequenceAttributeType)[ 0 ];\r\n\r\n var body =\r\n {\r\n id: 0,\r\n negativeRule: !this.state.mustBe,\r\n conditionOutfitParts: OutfitItem.Jacket + OutfitItem.Pants + OutfitItem.Shirt,\r\n conditionAttribute: {\r\n id: conditionAttribute.attributeId,\r\n type: this.state.conditionAttributeType.type,\r\n name: conditionAttribute.name\r\n },\r\n recommendedOutfitParts: OutfitItem.Jacket + OutfitItem.Pants + OutfitItem.Shirt,\r\n recommendedAttribute: {\r\n id: consequenceAttribute.attributeId,\r\n type: this.state.consequenceAttributeType.type,\r\n name: consequenceAttribute.name\r\n }\r\n };\r\n\r\n try {\r\n var response = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/rules`, {\r\n method: \"POST\",\r\n body: JSON.stringify(body),\r\n headers: [ [ \"accept\", \"text/plain\" ], [ \"Content-Type\", \"application/json\" ] ]\r\n });\r\n\r\n if (!response.ok)\r\n throw new Error(\"Response invalid\");\r\n\r\n refreshRules();\r\n this.props.toggleAlertModal(\"Success\");\r\n } catch (err) {\r\n this.props.toggleAlertModal(\"failure\");\r\n return;\r\n }\r\n\r\n this.setState({ mustBe: false, conditionAttributeType: AttrType.primaryColor, consequenceAttributeType: AttrType.secondaryColor });\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n Add / Edit\r\n \r\n
\r\n
\r\n
\r\n Select Type\r\n\t\t\t\t \r\n
\r\n
\r\n
\r\n {this.renderVariableUiParts()}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n async deleteFabric() {\r\n if (!this.state.selectedFabric) {\r\n this.props.toggleAlertModal(\"Select fabric\");\r\n return;\r\n }\r\n\r\n this.props.toggleAlertModal(\"Deleting\", \"loader\");\r\n try {\r\n var response = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/fabrics/${ this.state.selectedFabric.id }`, {\r\n method: \"DELETE\"\r\n });\r\n if (!response.ok)\r\n throw new Error();\r\n\r\n await refreshFabrics();\r\n this.setState({ selectedFabric: null });\r\n this.editFabricSearchBox.refilterFabrics();\r\n this.props.onFabricChanges();\r\n this.props.toggleAlertModal(\"Success\");\r\n } catch (err) {\r\n this.props.toggleAlertModal(\"Failure\");\r\n }\r\n }\r\n\r\n async saveFabric() {\r\n var control = this.state.addType === AddEditType.addFabric ? this.addFabricControl : this.editFabricControl;\r\n if (!control) {\r\n console.error(\"No handle to edit fabric control\");\r\n return;\r\n }\r\n\r\n if (!control.fabricIsValid()) {\r\n this.props.toggleAlertModal(\"Fabric invalid, correct errors before proceeding\");\r\n return;\r\n }\r\n\r\n var fabric = control.getFabric();\r\n try {\r\n if (this.state.addType === AddEditType.addFabric) {\r\n var resp = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/fabrics`,\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n id: 0,\r\n soldOut: fabric.soldOut,\r\n number: fabric.number,\r\n appliesTo: fabric.appliesTo,\r\n scale: fabric.scale,\r\n isTemp: false\r\n }),\r\n headers: [ [ \"accept\", \"text/plain\" ], [ \"Content-Type\", \"application/json\" ] ]\r\n });\r\n if (!resp.ok)\r\n throw new Error();\r\n fabric.id = await resp.json();\r\n }\r\n\r\n var response = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/fabrics/${ fabric.id }`,\r\n {\r\n method: \"PATCH\",\r\n body: JSON.stringify(fabric),\r\n headers: [ [ \"accept\", \"text/plain\" ], [ \"Content-Type\", \"application/json\" ] ]\r\n });\r\n if (!response.ok)\r\n throw new Error();\r\n\r\n await refreshFabrics();\r\n\r\n // Refresh our search box swatches\r\n if (!!this.editFabricSearchBox)\r\n this.editFabricSearchBox.refilterFabrics();\r\n\r\n // Notify the parent of the changes to fabrics\r\n this.props.onFabricChanges();\r\n\r\n // Select the newly created fabric, if we're creating a new one\r\n if (this.state.addType === AddEditType.addFabric) {\r\n var matchingFabrics = getStoredFabrics().filter(f => f.number === fabric.number);\r\n if (matchingFabrics.length > 0)\r\n this.setState({ addType: AddEditType.editFabrics, selectedFabric: matchingFabrics[ 0 ] });\r\n }\r\n this.props.toggleAlertModal(\"Saved successfully\");\r\n } catch {\r\n this.props.toggleAlertModal(\"Issue saving fabric\");\r\n }\r\n }\r\n\r\n renderVariableUiParts() {\r\n var components = [];\r\n if (this.state.addType === AddEditType.editFabrics) {\r\n components.push(\r\n this.editFabricControl = ref} toggleAlertModal={(msg, type = \"Alert\") => this.props.toggleAlertModal(msg, type)} waitingForPreload={this.props.waitingForPreload} fabric={this.state.selectedFabric}>\r\n this.editFabricSearchBox = ref} onSelectionChanged={f => this.setState({ selectedFabric: f }, () => this.editFabricControl.updateModelOutfit())} includeSoldOut={true} waitingForPreload={this.props.waitingForPreload} zoom={this.props.zoom} itemsPerPage={this.props.itemsPerPage} initialSelection={this.state.selectedFabric} />\r\n \r\n );\r\n } else if (this.state.addType === AddEditType.addFabric) {\r\n components.push(\r\n this.addFabricControl = ref} toggleAlertModal={(msg, type = \"Alert\") => this.props.toggleAlertModal(msg, type)} waitingForPreload={this.props.waitingForPreload} />\r\n );\r\n } else if (this.state.addType === AddEditType.editRules) {\r\n components.push(\r\n
\r\n
\r\n \r\n {\r\n getStoredRules().map(rule =>\r\n this.setState({ selectedRuleId: rule.id })} value={rule.id} key={rule.id}>\r\n {`If a fabric ${ rule.conditionAttribute.type.displayName.toLowerCase() } is ${ rule.conditionAttribute.name.toLowerCase() }, `\r\n + `then all other fabrics ${ rule.recommendedAttribute.type.displayName.toLowerCase() } ${ rule.negativeRule ? \"must not be \" : \"must be \" }`\r\n + `${ rule.recommendedAttribute.name.toLowerCase() }`}\r\n \r\n )\r\n }\r\n \r\n
\r\n
);\r\n } else if (this.state.addType === AddEditType.addRule) {\r\n var allowedAttributeTypes = [ AttrType.primaryColor, AttrType.primaryPattern, AttrType.secondaryColor, AttrType.secondaryPattern, AttrType.material ];\r\n components.push(\r\n
\r\n
\r\n If fabric\r\n
\r\n
\r\n \r\n
\r\n
\r\n is\r\n
\r\n
\r\n \r\n
\r\n
then other
\r\n
fabric
\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 var primaryButtons = [];\r\n switch (this.state.addType) {\r\n case AddEditType.addRule:\r\n primaryButtons.push(this.renderPrimaryButton(this.addRecommendationRule, \"Add Recommendation Rule\"));\r\n break;\r\n case AddEditType.editRules:\r\n primaryButtons.push(this.renderPrimaryButton(() => this.props.getConfirmation(this.deleteRule), \"Delete\"));\r\n break;\r\n case AddEditType.editFabrics:\r\n primaryButtons.push(this.renderPrimaryButton(this.saveFabric, \"Save\"));\r\n primaryButtons.push(this.renderPrimaryButton(() => this.props.getConfirmation(this.deleteFabric), \"Delete\"));\r\n break;\r\n }\r\n\r\n components.push(\r\n
\r\n
{primaryButtons}
\r\n
\r\n {this.state.addType === AddEditType.addFabric ? this.renderPrimaryButton(this.saveFabric, \"Add\") : null}\r\n \r\n
\r\n
\r\n );\r\n\r\n return components;\r\n }\r\n\r\n renderPrimaryButton(onClick, buttonText: string): JSX.Element {\r\n return ();\r\n }\r\n}\r\n\r\nclass AddEditModalState {\r\n addType: AddEditType = AddEditType.addFabric;\r\n conditionAttributeType: AttrType = AttrType.primaryColor;\r\n conditionAttribute: Attr = null;\r\n consequenceAttributeType: AttrType = AttrType.primaryColor;\r\n consequenceAttribute: Attr = null;\r\n selectedFabric: Fabric = null;\r\n mustBe: boolean = true;\r\n selectedRuleId: number = -1;\r\n}\r\n\r\nclass AddEditModalProps {\r\n isOpen: boolean;\r\n toggle: () => void;\r\n toggleAlertModal: (msg: string, type?: string) => void;\r\n getConfirmation: (callback: (confirmation: boolean) => void) => void;\r\n zoom: number;\r\n waitingForPreload: boolean;\r\n itemsPerPage: number;\r\n onFabricChanges: () => void;\r\n}","import React from 'react';\r\nimport { Modal, Button } from \"reactstrap\";\r\n\r\nexport default class LoginModal extends React.Component {\r\n constructor(props: LoginModalProps, state: LoginModalState) {\r\n super(props, state);\r\n this.state = new LoginModalState();\r\n }\r\n\r\n async confirmCredentials(): Promise {\r\n var resp = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/user/${ this.state.username }/${ this.state.password }`, { method: \"GET\" });\r\n return resp.ok;\r\n }\r\n\r\n async finalizeLogin() {\r\n if (!await this.confirmCredentials()) {\r\n this.props.toggleAlertModal(\"Login Failed!\");\r\n return;\r\n }\r\n\r\n this.props.onLogin();\r\n this.props.toggle();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
\r\n
\r\n

Username

\r\n this.setState({ username: e.target.value })} required />\r\n

Password

\r\n this.setState({ password: e.target.value })} required />\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\nclass LoginModalProps {\r\n isVisible: boolean;\r\n onLogin: () => void;\r\n toggle: () => void;\r\n toggleAlertModal: (msg: string, type?: string) => void;\r\n}\r\n\r\nclass LoginModalState {\r\n username: string ;//= \"admin\";\r\n password: string ;//= \"VerySecure089704\";\r\n}","import React from 'react';\r\nimport SearchBox from './components/Swatches/SearchBox';\r\nimport RecommendationCarousel from './components/previews/RecommendationCarousel';\r\nimport OutfitPreview from './components/previews/OutfitPreview';\r\nimport Fabric, { refreshFabrics } from './components/modules/Fabrics';\r\nimport PerOutfitItemFabrics from \"./components/modules/PerOutfitItemFabrics\";\r\nimport Attr, { AttrConsts } from './components/modules/Attr';\r\nimport OutfitItem, { outfitItems, getName, getKeyName } from './components/modules/OutfitItem';\r\nimport PerOutfitItemData from \"./components/modules/PerOutfitItemData\";\r\nimport { deserialize } from 'serialize-ts';\r\nimport { TextureLoader } from 'three';\r\nimport { Button } from \"reactstrap\";\r\nimport AlertModal from './components/AlertModal';\r\nimport ConfirmModal from './components/ConfirmModal';\r\nimport WaterMark from './assets/images/watermark.png';\r\nimport 'bootstrap/dist/css/bootstrap.css';\r\nimport './assets/css/App.css';\r\nimport { Tag } from 'react-tag-autocomplete';\r\nimport AddEditModal from './components/AddEditModal';\r\nimport { refreshRules } from './components/modules/Rules';\r\nimport LoginModal from './components/LoginModal';\r\n\r\nclass App extends React.Component<{}, AppState> {\r\n constructor(props: {}, state: AppState) {\r\n super(props, state);\r\n\r\n this.state = new AppState();\r\n this.getRecommendations = this.getRecommendations.bind(this);\r\n this.handlePantsMustMatchJacket = this.handlePantsMustMatchJacket.bind(this);\r\n this.setViewModeToLarge = this.setViewModeToLarge.bind(this);\r\n this.resetCamera = this.resetCamera.bind(this);\r\n this.toggleAddModal = this.toggleAddModal.bind(this);\r\n this.toggleAlertModal = this.toggleAlertModal.bind(this);\r\n this.handlefabricLineChange = this.handlefabricLineChange.bind(this);\r\n this.componentDidMount = this.componentDidMount.bind(this);\r\n }\r\n\r\n largeMannequinViewRef: OutfitPreview;\r\n recommendationsRef: RecommendationCarousel;\r\n\r\n toggleAlertModal(msg: string | Error | null = null, type: string = \"Alert\") {\r\n if (this.state.alertModalType !== \"Alert\")\r\n this.setState({ alertModalIsOpen: false });\r\n\r\n var msgString = \"\";\r\n if (!!msg)\r\n msgString = typeof msg == 'string' ? msg : msg.toString();\r\n this.setState({ modalText: msgString, alertModalType: type });\r\n\r\n if (this.state.alertModalType === \"Alert\")\r\n this.setState({ alertModalIsOpen: !this.state.alertModalIsOpen });\r\n };\r\n\r\n async componentDidMount() {\r\n Promise.all([ AttrConsts.refreshConsts(), refreshFabrics(), refreshRules() ])\r\n .then(() => this.setState({ isPreloading: false, enabledFabricLines: [ AttrConsts.allFabricLines[ AttrConsts.allFabricLines.length - 1 ] ] }));\r\n }\r\n\r\n toggleAddModal() {\r\n if (!this.state.loginState) {\r\n this.setState({ loginModalIsOpen: true });\r\n return;\r\n }\r\n this.setState({ addModalIsOpen: !this.state.addModalIsOpen });\r\n }\r\n\r\n async getRecommendations() {\r\n this.setState({ viewMode: \"Recommendation\", recommendationLoading: true });\r\n this.resetCamera();\r\n\r\n // Build the body for the new reccomendation request\r\n var attrs: any[] = [];\r\n for (var [ FilterOutfitItem, Fabrics ] of this.state.selectedFabrics) {\r\n if (this.state.pantsMustMatchJacket && FilterOutfitItem === OutfitItem.Pants)\r\n continue;\r\n\r\n var allowedFabricIds = [];\r\n if (this.state.viewFabrics.get(FilterOutfitItem)) //selected fabrics exist\r\n allowedFabricIds = [ this.state.viewFabrics.get(FilterOutfitItem).id ];\r\n else if (Fabrics.length !== 0) //Selected fabrics doesn't exist, but fabrics do\r\n allowedFabricIds = Fabrics.map(f => f.id);\r\n\r\n attrs.push({ Part: FilterOutfitItem, allowedFabricIds, requiredAttributeIds: this.state.enabledFabricLines.map(a => a.attributeId) });\r\n }\r\n\r\n const noRecommendationsMessage = \"Recommendation rules did not find any outfits given the selected fabric line, and fabrics. Try selecting other fabrics if any are selected, changing the fabric lines allowed, or allowing sold out fabrics.\";\r\n try {\r\n var response = await fetch(`${ process.env.REACT_APP_END_POINT_URL }/recommendations/${ process.env.REACT_APP_RECOMMENDATION_COUNT }?includeSoldOut=${ this.state.includeSoldOut }&pantsMustMatchJacket=${ this.state.pantsMustMatchJacket }`, {\r\n method: \"POST\",\r\n body: JSON.stringify(attrs),\r\n headers: [ [ \"accept\", \"text/plain\" ], [ \"Content-Type\", \"application/json\" ] ]\r\n });\r\n var json = await response.json();\r\n } catch (err) {\r\n this.toggleAlertModal(JSON.stringify(err).indexOf(\"Unexpected end of JSON input\") === -1 || JSON.stringify(err).indexOf(\"JSON.parse\") === -1 ? noRecommendationsMessage : err.toString());\r\n this.setState({ recommendationLoading: false });\r\n return;\r\n }\r\n\r\n // Get all recommendation image\r\n try {\r\n var recommendations: PerOutfitItemFabrics[] = [];\r\n for (let recJson of json) {\r\n var rec = new PerOutfitItemFabrics();\r\n for (var oi of outfitItems) {\r\n if (!recJson.hasOwnProperty(getKeyName(oi))) {\r\n console.error(`No ${ getName(oi) } in reccomendation`);\r\n continue;\r\n }\r\n rec.set(oi, !!recJson[ getKeyName(oi) ] ? deserialize(recJson[ getKeyName(oi) ], Fabric) : null);\r\n }\r\n recommendations.push(rec);\r\n };\r\n\r\n if (!this.recommendationsRef)\r\n return;\r\n\r\n try {\r\n this.recommendationsRef.setRecommendations(recommendations);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n this.toggleAlertModal(noRecommendationsMessage);\r\n } finally {\r\n this.setState({ recommendationLoading: false });\r\n }\r\n }\r\n\r\n async setViewModeToLarge() {\r\n this.setState({ viewMode: \"Large\", viewLoading: true });\r\n try {\r\n var recommendation = new PerOutfitItemFabrics();\r\n for (var oi of outfitItems)\r\n recommendation.set(oi, this.state.viewFabrics.get(oi));\r\n if (this.state.pantsMustMatchJacket && this.state.viewFabrics.get(OutfitItem.Jacket))\r\n recommendation.set(OutfitItem.Pants, this.state.viewFabrics.get(OutfitItem.Jacket));\r\n else if (this.state.viewFabrics.get(OutfitItem.Pants))\r\n recommendation.set(OutfitItem.Pants, this.state.viewFabrics.get(OutfitItem.Pants));\r\n\r\n this.largeMannequinViewRef.setRecommendation(recommendation);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n this.setState({ viewLoading: false });\r\n }\r\n\r\n resetCamera() {\r\n var ref = null;\r\n if (this.largeMannequinViewRef && this.state.viewMode === \"Large\")\r\n ref = this.largeMannequinViewRef;\r\n else if (this.recommendationsRef && this.state.viewMode === \"Recommendation\")\r\n ref = this.recommendationsRef;\r\n else\r\n return;\r\n\r\n try {\r\n ref.resetCamera();\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n handlefabricLineChange(lineId: number, enabled: boolean) {\r\n var newLines = this.state.enabledFabricLines.filter(a => a.attributeId !== lineId);\r\n if (enabled)\r\n newLines.push(AttrConsts.allFabricLines.find(a => a.attributeId === lineId));\r\n this.setState({ enabledFabricLines: newLines });\r\n }\r\n\r\n async promisifyLoadTexture(path: string): Promise {\r\n var loader = new TextureLoader();\r\n return new Promise((resolve, reject) =>\r\n loader.load(path, texture => {\r\n try {\r\n resolve(texture);\r\n } catch (ex) {\r\n reject(ex);\r\n }\r\n })\r\n );\r\n }\r\n\r\n swatchChange(si: OutfitItem, fabric: Fabric) {\r\n const viewFabrics = this.state.viewFabrics;\r\n viewFabrics.set(si, fabric);\r\n this.setState({ viewFabrics });\r\n }\r\n\r\n // Force jacket fabric to match pants fabric\r\n handlePantsMustMatchJacket(toggle: boolean) {\r\n this.setState({ pantsMustMatchJacket: toggle });\r\n }\r\n\r\n PantsSearchBox: SearchBox;\r\n ShoesSearchBox: SearchBox;\r\n ShirtSearchBox: SearchBox;\r\n JacketSearchBox: SearchBox;\r\n\r\n getAllSearchBoxes(): SearchBox[] {\r\n return outfitItems.map(oi => this[ `${ oi }SearchBox` ]).filter(oi => !!oi);\r\n }\r\n\r\n render() {\r\n if (this.state.isPreloading)\r\n return

LOADING...

;\r\n\r\n return (\r\n
\r\n this.toggleAlertModal(msg, type)}\r\n getConfirmation={cb => this.setState({ confirmationCallback: cb, confirmModalIsOpen: true })}\r\n zoom={this.state.zoom}\r\n itemsPerPage={100}\r\n waitingForPreload={this.state.isPreloading}\r\n onFabricChanges={() => this.getAllSearchBoxes().forEach(s => s.refilterFabrics())} />\r\n\r\n \r\n\r\n this.setState({ confirmModalIsOpen: !this.state.confirmModalIsOpen })}\r\n onDecision={this.state.confirmationCallback} />\r\n\r\n this.setState({ loginModalIsOpen: !this.state.loginModalIsOpen })}\r\n onLogin={() => this.setState({ loginState: true }, () => this.setState({ addModalIsOpen: true }))} />\r\n\r\n
\r\n
\r\n
\r\n this.largeMannequinViewRef = ref} showFabricNames={true} showSaveScreenshot={true} showToggleImages={true} />\r\n this.recommendationsRef = ref} style={this.state.viewMode !== \"Recommendation\" ? { display: \"none\" } : {}}/>\r\n \"LGFG\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Fabric Lines
\r\n
\r\n {\r\n AttrConsts.allFabricLines.map(fabricLineAttr =>\r\n
\r\n aa.attributeId === fabricLineAttr.attributeId)}\r\n onChange={e => this.handlefabricLineChange(fabricLineAttr.attributeId, e.target.checked)} /> {fabricLineAttr.name}\r\n
)\r\n }\r\n
\r\n
Outfit Type
\r\n
\r\n
\r\n this.handlePantsMustMatchJacket(!e.target.checked)} />{' '}\r\n Jacket / Pants Combo\r\n
\r\n
\r\n this.handlePantsMustMatchJacket(e.target.checked)} />{' '}\r\n Suit\r\n
\r\n
\r\n
\r\n this.setState({ includeSoldOut: e.target.checked })} />\r\n Include Sold out\r\n
\r\n {\r\n outfitItems\r\n .filter(oi => !this.state.pantsMustMatchJacket || oi !== OutfitItem.Pants)\r\n .map(oi =>\r\n this[ `${ oi }SearchBox` ] = ref}\r\n includeSoldOut={this.state.includeSoldOut}\r\n allowedFabricLines={this.state.enabledFabricLines}\r\n onSelectionChanged={fabric => this.swatchChange(oi, fabric)}\r\n outfitItem={oi}\r\n zoom={this.state.zoom}\r\n waitingForPreload={this.state.isPreloading}\r\n itemsPerPage={100} />)\r\n }\r\n
Tile zoom
\r\n
\r\n this.setState({ zoom: +event.target.value })}\r\n className={\"custom-range d-inline-block w-60 pl-3\"}\r\n value={this.state.zoom} min={100} max={1000} step={5} />\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\nclass AppState {\r\n enabledFabricLines: Attr[] = [];\r\n fabricTags: Tag[] = [];\r\n selectedFabrics: PerOutfitItemData = PerOutfitItemData.withDefaultValue([] as Fabric[]);\r\n pantsMustMatchJacket: boolean = false;\r\n includeSoldOut: boolean = false;\r\n zoom: number = 100;\r\n isPreloading: boolean = true;\r\n\r\n addModalIsOpen: boolean = false; // TODO Change back to false\r\n alertModalIsOpen: boolean = false;\r\n confirmModalIsOpen: boolean = false;\r\n\r\n isRecommendationOpen: boolean = true;\r\n recommendationLoading: boolean = false;\r\n viewLoading: boolean = false;\r\n viewMode: \"Large\" | \"Recommendation\" = \"Large\";\r\n viewFabrics: PerOutfitItemFabrics = new PerOutfitItemFabrics();\r\n modalText: string = \"\";\r\n alertModalType: string = \"Alert\";\r\n confirmationCallback: (decision: boolean) => void;\r\n loginState: boolean = false; // TODO Change back to false\r\n loginModalIsOpen: boolean = false;\r\n}\r\n\r\nexport default App;","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./assets/css/index.css\";\r\nimport * as serviceWorker from \"./components/modules/serviceWorker\";\r\nimport App from \"./App\";\r\n\r\nReactDOM.render(, document.getElementById(\"root\"));\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();","module.exports = __webpack_public_path__ + \"static/media/watermark.c69f867c.png\";"],"sourceRoot":""}