{"version":3,"file":"792.geobundle.js","mappings":"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","sources":["webpack:///./src/Renderer/SceneUtils.ts","webpack:///./src/Renderer/WallSnap.js","webpack:///./src/Renderer/CompositeBackground.js","webpack:///./src/utils/getHardwareInfo.js","webpack:///./src/Renderer/WallspiceWebgl.js","webpack:///./src/Renderer/constants.js","webpack:///./src/utils/timeMetric.js","webpack:///./src/Renderer/GlMemoryRecorder.js","webpack:///./src/Renderer/TextureHelper.js","webpack:///./src/Renderer/CustomGLTFLoader.js","webpack:///./src/Renderer/CustomDracoLoader.js","webpack:///./src/Renderer/FurnitureLoader.js","webpack:///./src/Renderer/FurnitureManager.ts","webpack:///./src/Renderer/CustomRenderPass.js","webpack:///./src/Renderer/CustomOutlinePass.js","webpack:///./src/Renderer/FootprintMaterial.js","webpack:///./src/Renderer/CustomTAARenderPass.ts","webpack:///./src/Renderer/index.js","webpack:///./src/Renderer/MagicEraserUtils.ts","webpack:///./src/Renderer/manifestImageLoader.js","webpack:///./src/utils/lodepng.wrapper.js","webpack:///./src/apps/SugarcubeContext.jsx","webpack:///./src/apps/helpers.js","webpack:///./src/components/AppDescriptionForScreenReader/index.tsx","webpack:///./src/components/ErrorMessage.jsx","webpack:///./src/components/FormElements.jsx","webpack:///./src/components/SkipLinks/constants.ts","webpack:///./src/components/SkipLinks/helpers.ts","webpack:///./src/components/SkipLinks/index.tsx","webpack:///./src/components/Tooltip.jsx","webpack:///./src/components/dashboard/Thumbnail.jsx","webpack:///./src/components/designSidepanel/ProductItemDetail.jsx","webpack:///./src/components/formElements/Range.jsx","webpack:///./src/components/uiElements/BouncingBallLoader.jsx","webpack:///./src/components/uiElements/Icon.jsx","webpack:///./src/components/uiElements/TheaterModal.tsx","webpack:///./src/models/compositions/middleware.js","webpack:///./src/models/location/middleware.js","webpack:///./src/models/location/helpers.ts","webpack:///./src/services/rating.js","webpack:///./src/models/ratings/middleware.js","webpack:///./src/models/tracking/selectors.js","webpack:///./src/services/upload.js","webpack:///./src/services/screenshot.js","webpack:///./src/utils/uploadPreviewScreenshot.js","webpack:///./src/models/tracking/middleware.js","webpack:///./src/services/support.js","webpack:///./src/models/user/middleware.js","webpack:///./src/models/furniture/middleware.js","webpack:///./src/models/iFrame/middleware.js","webpack:///./src/models/preview/middleware.js","webpack:///./src/models/localStorage/constants.ts","webpack:///./src/models/localStorage/middleware.ts","webpack:///./src/models/localStorage/selectors.ts","webpack:///./src/models/admin/reducers.js","webpack:///./src/models/bag/reducers.js","webpack:///./src/models/compositions/reducers.js","webpack:///./src/models/favorites/reducers.js","webpack:///./src/utils/stackables.js","webpack:///./src/constants/categories.js","webpack:///./src/services/mockdata.js","webpack:///./src/models/furniture/reducers.js","webpack:///./src/models/kiosk/reducers.ts","webpack:///./src/models/preview/reducers.js","webpack:///./src/models/ratings/reducers.js","webpack:///./src/models/renderer/reducers.js","webpack:///./src/models/scenes/constants.ts","webpack:///./src/models/scenes/reducers.js","webpack:///./src/models/support/reducers.js","webpack:///./src/models/toasts/reducers.js","webpack:///./src/models/tracking/reducers.js","webpack:///./src/models/ui/reducers.js","webpack:///./src/models/user/reducers.js","webpack:///./src/models/bag/sagas.js","webpack:///./src/models/compositions/sagas.js","webpack:///./src/models/favorites/sagas.js","webpack:///./src/services/furniture.js","webpack:///./src/models/furniture/sagas.js","webpack:///./src/models/support/sagas.js","webpack:///./src/models/tracking/sagas.js","webpack:///./src/models/sagas.ts","webpack:///./src/configureStore.ts","webpack:///./src/models/reducers.ts","webpack:///./src/constants/renderItemTypes.ts","webpack:///./src/constants/stateTypes.ts","webpack:///./src/components/DesignSummaryModalMobile.jsx","webpack:///./src/components/DesignSummaryModal.jsx","webpack:///./src/containers/DesignSummaryModalContainer.jsx","webpack:///./src/components/OpenCompositionModal.jsx","webpack:///./src/containers/OpenCompositionModalContainer.jsx","webpack:///./src/containers/OptimizelyProviderContainer.jsx","webpack:///./src/models/renderer/actions.js","webpack:///./src/Renderer/RenderItem.js","webpack:///./src/Renderer/ArtItem.js","webpack:///./src/constants/artTypes.js","webpack:///./src/utils/events.ts","webpack:///./src/components/CompositionItemDraggable.jsx","webpack:///./src/utils/convertRotation.ts","webpack:///./src/components/design/ActionPanel/helpers.js","webpack:///./src/components/design/ActionPanel/index.jsx","webpack:///./src/containers/design/ActionPanelContainer.jsx","webpack:///./src/components/CompositionArtItem.jsx","webpack:///./src/Renderer/FurnitureItem.js","webpack:///./src/components/CompositionFurnitureItem.jsx","webpack:///./src/containers/CompositionRenderItemContainer.jsx","webpack:///./src/constants/contexts.js","webpack:///./src/Renderer/GhostItem.js","webpack:///./src/Renderer/StackableSurfaceItem.js","webpack:///./src/components/CompositionStackableSurfaceItem.jsx","webpack:///./src/containers/CompositionStackableSurfaceItemContainer.jsx","webpack:///./src/components/WallPaintPin.jsx","webpack:///./src/containers/WallPaintPinContainer.jsx","webpack:///./src/components/MissingFeatureModal.jsx","webpack:///./src/components/design/DirectInteractionLayer.jsx","webpack:///./src/utils/memoryTracker.js","webpack:///./src/components/MemoryCharts.jsx","webpack:///./src/components/Sweep.jsx","webpack:///./src/components/Preview.jsx","webpack:///./src/containers/PreviewContainer.jsx","webpack:///./src/components/PreviewHeader.jsx","webpack:///./src/containers/PreviewHeaderContainer.jsx","webpack:///./src/components/designSidepanel/ProductItemImage.jsx","webpack:///./src/components/designSidepanel/ProductItem.jsx","webpack:///./src/components/designSidepanel/ProductItemWide.jsx","webpack:///./src/components/designSidepanel/ProductItemInSwap.jsx","webpack:///./src/containers/designSidepanel/ProductItemContainer.jsx","webpack:///./src/components/designSidepanel/SidepanelMenu.jsx","webpack:///./src/containers/designSidepanel/SidepanelMenuContainer.jsx","webpack:///./src/components/designSidepanel/RelatedProducts.jsx","webpack:///./src/containers/designSidepanel/RelatedProductsContainer.jsx","webpack:///./src/components/designSidepanel/BackNavigationHeader.jsx","webpack:///./src/components/formElements/Dropdown.jsx","webpack:///./src/components/designSidepanel/OptionSelectorView.jsx","webpack:///./src/containers/designSidepanel/OptionSelectorViewContainer.jsx","webpack:///./src/components/admin/AdminProductDetails.tsx","webpack:///./src/containers/admin/AdminProductDetailsContainer.tsx","webpack:///./src/components/uiElements/StarRatings.jsx","webpack:///./src/components/designSidepanel/ProductSummary.tsx","webpack:///./src/components/designSidepanel/ImagePicker.jsx","webpack:///./src/components/designSidepanel/ItemDetailsView.jsx","webpack:///./src/models/tracking/actions.js","webpack:///./src/containers/designSidepanel/ItemDetailsViewContainer.jsx","webpack:///./src/components/designSidepanel/Products.jsx","webpack:///./src/components/designSidepanel/MyItemsBrowseView.jsx","webpack:///./src/containers/designSidepanel/MyItemsBrowseViewContainer.jsx","webpack:///./src/containers/designSidepanel/ProductsContainer.jsx","webpack:///./src/components/uiElements/SheetModal.jsx","webpack:///./src/components/designSidepanel/ProductFilter/CategoryFilters/index.tsx","webpack:///./src/containers/designSidepanel/ProductFilter/CategoryFiltersContainer.tsx","webpack:///./src/services/searchCompletions.ts","webpack:///./src/components/designSidepanel/ProductFilter/useSearchCompletions.ts","webpack:///./src/components/designSidepanel/ProductFilter/index.jsx","webpack:///./src/containers/designSidepanel/ProductFilterContainer.jsx","webpack:///./src/components/designSidepanel/ProductDetailsView.jsx","webpack:///./src/containers/designSidepanel/ProductDetailsViewContainer.jsx","webpack:///./src/components/designSidepanel/ProductBrowseView.jsx","webpack:///./src/containers/designSidepanel/ProductBrowseViewContainer.jsx","webpack:///./src/components/designSidepanel/FavoritesBrowseView.jsx","webpack:///./src/containers/designSidepanel/FavoritesBrowseViewContainer.jsx","webpack:///./src/components/admin/Debug.jsx","webpack:///./src/containers/admin/DebugViewContainer.jsx","webpack:///./src/models/ratings/selectors.js","webpack:///./src/components/formElements/StarRating.jsx","webpack:///./src/hooks/useDebounce.js","webpack:///./src/components/formElements/Textarea.jsx","webpack:///./src/components/designSidepanel/RatingPanelView.jsx","webpack:///./src/containers/designSidepanel/RatingPanelViewContainer.jsx","webpack:///./src/components/designSidepanel/SwapView.jsx","webpack:///./src/containers/designSidepanel/SwapViewContainer.jsx","webpack:///./src/components/designSidepanel/SidepanelBody.jsx","webpack:///./src/components/designSidepanel/Sidepanel.jsx","webpack:///./src/containers/designSidepanel/SidepanelContainer.jsx","webpack:///./src/components/uiElements/FavoriteButton.jsx","webpack:///./src/containers/uiElements/FavoriteButtonContainer.jsx","webpack:///./src/hooks/useOutsideAlerter.js","webpack:///./src/hooks/usePrevious.js","webpack:///./src/i18n.js","webpack:///./src/models/admin/actions.js","webpack:///./src/models/admin/selectors.js","webpack:///./src/models/bag/actions.js","webpack:///./src/models/bag/selectors.js","webpack:///./src/models/compositions/constants.ts","webpack:///./src/models/favorites/actions.js","webpack:///./src/models/favorites/selectors.js","webpack:///./src/models/furniture/actions.js","webpack:///./src/models/furniture/artConstants.js","webpack:///./src/models/furniture/constants.js","webpack:///./src/models/furniture/selectors.js","webpack:///./src/models/localStorage/actions.ts","webpack:///./src/models/preview/actions.js","webpack:///./src/models/preview/selectors.js","webpack:///./src/models/ratings/actions.js","webpack:///./src/models/ratings/constants.js","webpack:///./src/models/refStore/selectors.js","webpack:///./src/models/support/actions.js","webpack:///./src/models/support/selectors.js","webpack:///./src/models/toasts/actions.js","webpack:///./src/models/tracking/constants.js","webpack:///./src/models/tracking/utils.ts","webpack:///./src/models/ui/constants.js","webpack:///./src/services/index.js","webpack:///./src/services/spiderpigs.js","webpack:///./src/store.ts","webpack:///./src/models/toasts/selectors.js","webpack:///./src/hooks/useDelay.js","webpack:///./src/toasts/AddedToBagToast.jsx","webpack:///./src/toasts/RotatePhoneToast.jsx","webpack:///./src/toasts/ToastDisplay.jsx","webpack:///./src/toasts/toastTypes.js","webpack:///./src/utils/browser.js","webpack:///./src/utils/buildInfo.ts","webpack:///./src/utils/buildUrls.js","webpack:///./src/utils/convertCurrency.js","webpack:///./src/utils/convertDimensions.js","webpack:///./src/utils/environment.js","webpack:///./src/utils/fading.js","webpack:///./src/utils/generateThumbnailFromPreview.js","webpack:///./src/utils/getMaxWindowSize.js","webpack:///./src/utils/isMobile.js","webpack:///./src/utils/optimizely.js","webpack:///./src/utils/sortByArray.js"],"sourcesContent":["\ntype PlaneType = {\n d: number,\n class: string,\n rot: Array>,\n}\n\nexport function getFloorPlane (planes: Array): PlaneType {\n // Returns the ground floor plane\n return planes.filter(p => p.class === \"floor\").reduce((a, b) => a.d < b.d ? a : b)\n}\n\nexport function getFloorIndex (planes: Array): number {\n // Returns the index of the ground floor plane\n const floor = getFloorPlane(planes)\n return planes.indexOf(floor) \n}\n","/* vim :set sw=2: */\n\n/* eslint-disable no-plusplus */\n/* eslint-disable no-continue */\n/* eslint-disable no-console */\n/* eslint-disable space-infix-ops */\n/* eslint-disable no-constant-condition */\n/* eslint-disable no-else-return */\n/* eslint-disable arrow-body-style */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-loop-func */\n\nimport WallspiceWebgl from \"Renderer/WallspiceWebgl\"\nimport { getFloorPlane } from \"Renderer/SceneUtils\"\nimport { WALL_SHIFT } from \"Renderer/constants\"\n\nconst useDebugView = false\n\nfunction\nrotMat(a)\n{\n return [\n [ +Math.cos(a), -Math.sin(a) ],\n [ +Math.sin(a), +Math.cos(a) ]\n ]\n}\n\nfunction\ndebugConnect()\n{\n if( ! useDebugView )\n return\n\n if( ! window.wallSnapDebugWS )\n {\n window.wallSnapDebugWSConnected = false\n window.wallSnapDebugWSQueue = []\n\n window.wallSnapDebugWS = new WebSocket(\"ws://localhost:8080\")\n\n window.wallSnapDebugWS.onerror = (\n err =>\n {\n console.log(\"WS ERROR --------------\")\n console.log(err)\n window.wallSnapDebugWS = new WebSocket(\"ws://localhost:8080\")\n }\n )\n\n window.wallSnapDebugWS.onopen = (\n () =>\n {\n console.log(\"WS OPEN --------------\")\n\n window.wallSnapDebugWSConnected = true\n\n window.wallSnapDebugWSQueue.forEach(msg => {\n window.wallSnapDebugWS.send(msg)\n })\n\n window.wallSnapDebugWSQueue = null\n }\n )\n }\n}\n\nfunction\ndebugSend(msg)\n{\n if( ! useDebugView )\n return\n\n debugConnect()\n\n const msgJSON = JSON.stringify(msg)\n\n if( window.wallSnapDebugWSConnected )\n window.wallSnapDebugWS.send(msgJSON)\n else\n window.wallSnapDebugWSQueue.push(msgJSON)\n}\n\nfunction\nsendFloorLines(lines)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"lines\",\n lines\n })\n}\n\nfunction\ndebugFrame()\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"frame\"\n })\n}\n\nfunction\ndebugIter()\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"iter\"\n })\n}\n\nfunction\ndebugContactsOrig(csOrig)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"contactsOrig\",\n contactsOrig: csOrig\n })\n}\n\nfunction\ndebugContacts(cs)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"contacts\",\n contacts: cs\n })\n}\n\nfunction\ndebugNormalShifts(shifts)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"normalShifts\",\n shifts\n })\n}\n\nfunction\ndebugGood(good)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"good\",\n good\n })\n}\n\nfunction\ndebugBody(body)\n{\n if( ! useDebugView )\n return\n\n const pos = [\n body.pos[0],\n body.pos[1]\n ]\n\n const m = rotMat(body.rot)\n\n const corners = []\n\n for(let i = 0; i < body.corners.length; i++)\n {\n let q = body.corners[i]\n\n q = [\n pos[0] + m[0][0] * q[0] + m[0][1] * q[1],\n pos[1] + m[1][0] * q[0] + m[1][1] * q[1]\n ]\n\n corners.push(q)\n }\n\n debugSend({\n type: \"body\",\n corners\n })\n}\n\nfunction\ndebugMouseForce(mf)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"mouseForce\",\n mouseForce: mf\n })\n}\n\nfunction\ndebugForceIter(cs, fs)\n{\n if( ! useDebugView )\n return\n\n debugSend({\n type: \"forceIter\",\n contacts: cs,\n forces: fs\n })\n}\n\nfunction\nbake(renderItem, xy, orientation)\n{\n const ri = renderItem\n const renderer = ri.Renderer\n const intrinsics = renderer.intrinsics\n const planes = renderer.manifest.plane_orientation_0.planeData\n const floor = getFloorPlane(planes)\n\n const floorPoint = WallspiceWebgl.screenToPlaneWorld(\n ri.position, floor, intrinsics\n )\n\n ri.position = xy\n ri.orientation = orientation\n\n ri.pose = {\n pos: floorPoint,\n rot: floor.rot\n }\n}\n\nfunction\nintersectLines(a0, a1, b0, b1)\n{\n const na = [\n -(a1[1] - a0[1]),\n +(a1[0] - a0[0])\n ]\n\n const nb = [\n -(b1[1] - b0[1]),\n +(b1[0] - b0[0])\n ]\n\n const a = na[0]\n const b = na[1]\n const c = -(a0[0] * na[0] + a0[1] * na[1])\n\n const d = nb[0]\n const e = nb[1]\n const f = -(b0[0] * nb[0] + b0[1] * nb[1])\n\n const det = a * e - b * d\n\n if( det === 0 )\n return null\n\n const x = (b * f - c * e) / det\n const y = (c * d - a * f) / det\n\n let dot0\n let dot1\n\n const a0Len2 = a0[0] * a0[0] + a0[1] * a0[1]\n dot0 = x * a0[0] + y * a0[1]\n dot1 = a1[0] * a0[0] + a1[1] * a0[1]\n if( dot1 - a0Len2 === 0) return null\n const t = (dot0 - a0Len2) / (dot1 - a0Len2)\n\n const b0Len2 = b0[0] * b0[0] + b0[1] * b0[1]\n dot0 = x * b0[0] + y * b0[1]\n dot1 = b1[0] * b0[0] + b1[1] * b0[1]\n if( dot1 - b0Len2 === 0 ) return null\n const s = (dot0 - b0Len2) / (dot1 - b0Len2)\n\n if( t >= 0 && t <= 1 && s >= 0 && s <= 1 )\n {\n return [\n a0[0] + t * (a1[0] - a0[0]),\n a0[1] + t * (a1[1] - a0[1])\n ]\n }\n\n return null\n}\n\nexport\nfunction\ninitBody(ri, w, h)\n{\n const body = {}\n\n body.rot = 0\n body.pos = [ 0, 0 ]\n body.lines = []\n body.normals = []\n body.corners = []\n body.mass = 20\n\n body.lines = [\n [ [ +w/2, +h/2 ], [ -w/2, +h/2 ] ],\n [ [ -w/2, +h/2 ], [ -w/2, -h/2 ] ],\n [ [ -w/2, -h/2 ], [ +w/2, -h/2 ] ],\n [ [ +w/2, -h/2 ], [ +w/2, +h/2 ] ],\n ]\n\n for(let i = 0; i < body.lines.length; i++)\n {\n const [ q0, q1 ] = body.lines[i]\n\n const n = [\n (q0[0] + q1[0]) / 2,\n (q0[1] + q1[1]) / 2\n ]\n\n const nLen = Math.sqrt(\n + n[0] * n[0]\n + n[1] * n[1]\n )\n\n n[0] /= nLen\n n[1] /= nLen\n\n body.normals.push(n)\n }\n\n body.area = w * h\n body.density = body.mass / body.area\n body.i = body.mass * (w * w + h * h) / 12\n\n body.corners = [\n [ +w/2, +h/2 ],\n [ -w/2, +h/2 ],\n [ -w/2, -h/2 ],\n [ +w/2, -h/2 ]\n ]\n\n body.radius = 0.5 * Math.sqrt(w * w + h * h)\n\n const renderer = ri.Renderer\n const planes = renderer.manifest.plane_orientation_0.planeData\n const floor = getFloorPlane(planes)\n\n const floorPoint = WallspiceWebgl.screenToPlaneWorld(\n ri.position, floor, ri.Renderer.intrinsics\n )\n\n body.rot = ri.orientation\n body.pos = WallspiceWebgl.worldToPlane(floor, floorPoint)\n\n return body\n}\n\n//\n// fb: base force (from mouse)\n// tb: base torque (from mouse)\n// cs: contact points\n// fs: forces on contact points\n// dt: target timestep\n// ds: maximum spatial jump\n//\n\nfunction\npositionalOffsets(renderer, body, fb, tb, cs, fs, dt, ds)\n{\n const fn = [ fb[0], fb[1] ]\n let tau = tb\n\n for(let i = 0; i < fs.length; i += 1)\n {\n const [ c, n ] = cs[i]\n const f = Math.abs(fs[i])\n\n const fx = f * n[0]\n const fy = f * n[1]\n\n fn[0] += fx\n fn[1] += fy\n\n const rho0 = [\n c[0] - body.pos[0],\n c[1] - body.pos[1]\n ]\n\n tau += rho0[0] * fy - rho0[1] * fx\n }\n\n const m = body.mass\n const ti = body.i\n\n const fMag = Math.sqrt(fn[0] * fn[0] + fn[1] * fn[1])\n const dtf = Math.sqrt(2 * m * ds / fMag)\n const dta = Math.sqrt(Math.abs(2 * ds / body.radius * ti / tau))\n\n let dts\n\n if( fMag === 0 && tau === 0 )\n dts = 0\n else if( fMag === 0 )\n dts = dta\n else if( tau === 0 )\n dts = dtf\n else\n dts = (dtf < dta) ? dtf : dta\n\n const dtr = Math.min(dt, dts)\n\n const dx = 0.5 * (fn[0] / m) * dtr * dtr\n const dy = 0.5 * (fn[1] / m) * dtr * dtr\n const da = 0.5 * (tau / ti) * dtr * dtr\n\n return [ dx, dy, da, dtr ]\n}\n\nfunction\nfloorLineSegs(floorLine)\n{\n return [\n {\n points: [\n floorLine.points[0],\n floorLine.points[1]\n ],\n normal: floorLine.n2\n },\n {\n points: [\n floorLine.points[0],\n [\n floorLine.points[0][0] - 10000 * floorLine.n2[0],\n floorLine.points[0][1] - 10000 * floorLine.n2[1]\n ]\n ],\n normal: [\n -floorLine.t2[0],\n -floorLine.t2[1]\n ]\n },\n {\n points: [\n floorLine.points[1],\n [\n floorLine.points[1][0] - 10000 * floorLine.n2[0],\n floorLine.points[1][1] - 10000 * floorLine.n2[1]\n ]\n ],\n normal: [\n +floorLine.t2[0],\n +floorLine.t2[1]\n ]\n }\n ]\n}\n\nfunction\ncontactPoints(renderer, body, ds)\n{\n const pos = [\n body.pos[0],\n body.pos[1]\n ]\n\n const m = rotMat(body.rot)\n\n const contacts = []\n\n for(let i = 0; i < body.corners.length; i++)\n {\n let q = body.corners[i]\n\n q = [\n pos[0] + m[0][0] * q[0] + m[0][1] * q[1],\n pos[1] + m[1][0] * q[0] + m[1][1] * q[1]\n ]\n\n let minDQY\n let jmin\n\n for(let j = 0; j < renderer.floorLines.length; j++)\n {\n const floorLine = renderer.floorLines[j]\n const segs = floorLineSegs(floorLine)\n\n for(let k = 0; k < segs.length; k++)\n {\n const ki = segs.length - k - 1\n const [ q0 ] = segs[ki].points\n const n = segs[ki].normal\n\n const dq = [\n q[0] - q0[0],\n q[1] - q0[1]\n ]\n\n const dqy = -(n[0] * dq[0] + n[1] * dq[1])\n\n if( dqy < 0 )\n break\n\n if( ki === 0 )\n {\n const i0 = (i > 0) ? (i - 1) : (body.corners.length - 1)\n const i1 = (i + 1) % body.corners.length\n\n let c0 = body.corners[i0]\n let c1 = body.corners[i1]\n\n c0 = [\n pos[0] + m[0][0] * c0[0] + m[0][1] * c0[1],\n pos[1] + m[1][0] * c0[0] + m[1][1] * c0[1]\n ]\n\n c1 = [\n pos[0] + m[0][0] * c1[0] + m[0][1] * c1[1],\n pos[1] + m[1][0] * c1[0] + m[1][1] * c1[1]\n ]\n\n const cp0 = intersectLines(q, c0, floorLine.points[0], floorLine.points[1])\n const cp1 = intersectLines(q, c1, floorLine.points[0], floorLine.points[1])\n\n if( ! cp0 && ! cp1 )\n break\n\n if( minDQY === undefined || dqy < minDQY )\n {\n minDQY = dqy\n jmin = j\n }\n }\n }\n }\n\n if( minDQY !== undefined )\n {\n contacts.push([\n q,\n [\n +renderer.floorLines[jmin].n2[0],\n +renderer.floorLines[jmin].n2[1]\n ],\n [\n 0, jmin, i\n ]\n ])\n }\n }\n\n for(let k = 0; k < renderer.floorLines.length; k++)\n {\n const endpointContacts = []\n\n const floorLine = renderer.floorLines[k]\n\n for(let i = 0; i < floorLine.points.length; i++)\n {\n const q = floorLine.points[i]\n\n let t2\n if( i === 0 )\n t2 = [ -floorLine.t2[0], -floorLine.t2[1] ]\n else\n t2 = [ +floorLine.t2[0], +floorLine.t2[1] ]\n\n let dqys = []\n\n for(let j = 0; j < body.lines.length; j++)\n {\n const bn = body.normals[j]\n\n const n = [\n m[0][0] * bn[0] + m[0][1] * bn[1],\n m[1][0] * bn[0] + m[1][1] * bn[1]\n ]\n\n n[0] = -n[0]\n n[1] = -n[1]\n\n const bodyLine = body.lines[j]\n\n let a = bodyLine[0]\n\n a = [\n pos[0] + m[0][0] * a[0] + m[0][1] * a[1],\n pos[1] + m[1][0] * a[0] + m[1][1] * a[1]\n ]\n\n const dq = [\n q[0] - a[0],\n q[1] - a[1]\n ]\n\n const dqy = dq[0] * n[0] + dq[1] * n[1]\n\n dqys.push([j, dqy, n])\n }\n\n let isInside = true\n\n for(let z = 0; z < dqys.length; z++)\n {\n const dqy = dqys[z][1]\n\n if( dqy < 0 )\n {\n isInside = false\n break\n }\n }\n\n if( ! isInside )\n continue\n\n dqys = dqys.sort((a, b) => a[1] - b[1])\n\n let found = false\n\n for(let di = 0; di < dqys.length; di++)\n {\n const dqy = dqys[di][1]\n const n = dqys[di][2]\n\n if( dqy > 10 * ds )\n continue\n\n const nDotN2 = (\n + n[0] * floorLine.n2[0]\n + n[1] * floorLine.n2[1]\n )\n\n const nDotT2 = (\n + n[0] * t2[0]\n + n[1] * t2[1]\n )\n\n if( nDotN2 >= 0 && nDotT2 >= 0 )\n {\n endpointContacts.push([ q, n, [ 1, k, i, dqys[di][0] ]])\n found = true\n break\n }\n }\n\n if( ! found )\n {\n endpointContacts.push([\n q,\n dqys[0][2],\n [ 1, k, i, dqys[0][0] ]\n ])\n }\n }\n\n if( endpointContacts.length === 2 )\n {\n contacts.push([\n floorLine.points[0],\n [...floorLine.n2],\n [ 4, k, 0 ]\n ])\n\n contacts.push([\n floorLine.points[1],\n [...floorLine.n2],\n [ 4, k, 1 ]\n ])\n }\n else if( endpointContacts.length === 1 )\n {\n contacts.push(endpointContacts[0])\n }\n }\n\n return contacts\n}\n\nfunction\nrotateAndShift(r, m, p)\n{\n return [\n r[0] + m[0][0] * p[0] + m[0][1] * p[1],\n r[1] + m[1][0] * p[0] + m[1][1] * p[1]\n ]\n}\n\nfunction\nrotate(m, p)\n{\n return [\n m[0][0] * p[0] + m[0][1] * p[1],\n m[1][0] * p[0] + m[1][1] * p[1]\n ]\n}\n\nfunction\ngetIntersection(body, floorLine)\n{\n const m = rotMat(body.rot)\n\n const bodyLines = [ 0, 1, 2, 3 ].map(\n i =>\n {\n const line = [\n rotateAndShift(body.pos, m, body.lines[i][0]),\n rotateAndShift(body.pos, m, body.lines[i][1])\n ]\n\n const normal = rotate(m, body.normals[i])\n\n return {\n line,\n normal,\n mid: [\n (line[0][0] + line[1][0]) / 2,\n (line[0][1] + line[1][1]) / 2\n ]\n }\n }\n )\n\n const floorLinePointsInside =\n (\n floorLine.points.filter(\n point =>\n {\n return bodyLines.every(\n ({ mid, normal }) =>\n {\n const dot = (\n + normal[0] * (point[0] - mid[0])\n + normal[1] * (point[1] - mid[1])\n )\n\n return dot < 0\n }\n )\n }\n )\n )\n\n const cps = bodyLines.map(\n ({ line }) =>\n {\n return intersectLines(\n line[0],\n line[1],\n floorLine.points[0],\n floorLine.points[1])\n }\n ).filter( x => !! x )\n\n if( cps.length > 2 )\n return { length: 0 }\n\n const points = cps.concat(floorLinePointsInside)\n\n if( points.length !== 2 )\n return { length: 0 }\n\n const dx = points[0][0] - points[1][0]\n const dy = points[0][1] - points[1][1]\n\n return { \n length: Math.sqrt(dx * dx + dy * dy),\n points,\n }\n}\n\nfunction\ndeterminant(m)\n{\n if( m.length === 1 )\n {\n return m[0][0]\n }\n else if( m.length === 2 )\n {\n return m[0][0] * m[1][1] - m[0][1] * m[1][0]\n }\n else\n {\n return m[0].reduce(\n (r, e, i) =>\n {\n return r + (-1)**(i + 2) * e * determinant(\n m.slice(1).map(c => c.filter((_, j) => i !== j))\n )\n },\n 0\n )\n }\n}\n\n//\n// Solve a system of linear equations using Cramer's Rule.\n//\n\nfunction\ncramer(A, x)\n{\n const ret = []\n\n if( x.length === 0 )\n return ret\n\n const d0 = determinant(A)\n\n for(let i = 0; i < x.length; i++)\n {\n const AC = []\n for(let j = 0; j < A.length; j++)\n AC.push([...A[j]])\n\n for(let j = 0; j < A.length; j++)\n AC[j][i] = x[j]\n\n const d = determinant(AC)\n\n ret.push(d / d0)\n }\n\n return ret\n}\n\nexport\nfunction\npopulatefs(renderer, body, fb, tb, fs, cs)\n{\n const mat = []\n\n for(let i = 0; i < cs.length; i++)\n {\n const row = []\n mat.push(row)\n\n row.push(0)\n for(let j = 0; j < cs.length; j++)\n row.push(0)\n }\n\n for(let i = 0; i < cs.length; i++)\n {\n const row = mat[i]\n\n const [ c, n ] = cs[i]\n\n const nx = n[0]\n const ny = n[1]\n\n const rho0 = [\n c[0] - body.pos[0],\n c[1] - body.pos[1]\n ]\n\n const thetaHatRho0 = [\n - rho0[1],\n + rho0[0]\n ]\n\n row[0] = (\n (\n fb[0] * nx + fb[1] * ny\n ) / body.mass\n +\n (\n tb * (thetaHatRho0[0] * nx + thetaHatRho0[1] * ny)\n ) / body.i\n )\n\n const z = (\n + thetaHatRho0[0] * nx\n + thetaHatRho0[1] * ny\n ) / body.i\n\n for(let j = 0; j < cs.length; j++)\n {\n const je = j + 1\n\n const [ cj, nj ] = cs[j]\n\n const rhoJ = [\n cj[0] - body.pos[0],\n cj[1] - body.pos[1]\n ]\n\n const niDotNJ = nx * nj[0] + ny * nj[1]\n\n const q = rhoJ[0] * nj[1] - rhoJ[1] * nj[0]\n\n row[je] = niDotNJ / body.mass + z * q\n }\n }\n\n const x = []\n for(let i = 0; i < mat.length; i++)\n x.push(-mat[i].shift())\n\n const res = cramer(mat, x)\n\n for(let i = 0; i < res.length; i++)\n fs[i] = res[i]\n}\n\nfunction\naccels(renderer, body, fb, tb, fs, cs, mps)\n{\n const ret = []\n\n const fn = [ fb[0], fb[1] ]\n let tau = tb\n\n for(let i = 0; i < fs.length; i++)\n {\n const [ c, n ] = cs[i]\n const f = Math.abs(fs[i])\n\n const fx = f * n[0]\n const fy = f * n[1]\n\n fn[0] += fx\n fn[1] += fy\n\n const rho0 = [\n c[0] - body.pos[0],\n c[1] - body.pos[1]\n ]\n\n tau += rho0[0] * fy - rho0[1] * fx\n }\n\n for(let i = 0; i < mps.length; i += 1)\n {\n const [ c, n ] = mps[i]\n\n const rho0 = [\n c[0] - body.pos[0],\n c[1] - body.pos[1]\n ]\n\n const thetaHatRho0 = [\n -rho0[1],\n +rho0[0]\n ]\n\n const a = [\n fn[0] / body.mass + thetaHatRho0[0] * tau / body.i,\n fn[1] / body.mass + thetaHatRho0[1] * tau / body.i\n ]\n\n const aOnN = a[0] * n[0] + a[1] * n[1]\n\n ret[i] = aOnN\n }\n\n return ret\n}\n\nfunction\nnormalShifts(renderer, body, fb, tb, fs, cs, mps, dt)\n{\n const acs = accels(renderer, body, fb, tb, fs, cs, mps)\n const ret = []\n\n for(let i = 0; i < acs.length; i++)\n ret.push(0.5 * acs[i] * dt * dt)\n\n return ret\n}\n\nfunction\nsetPositionals(renderItem, xy, orientation)\n{\n const ri = renderItem\n const renderer = ri.Renderer\n const intrinsics = renderer.intrinsics\n const planes = renderer.manifest.plane_orientation_0.planeData\n const floor = getFloorPlane(planes)\n\n if( xy )\n {\n const mWorld = WallspiceWebgl.screenToPlaneWorld(xy, floor, intrinsics)\n\n if( mWorld[2] >= 0 )\n return false\n }\n\n if( ! ri.body || ! renderer.floorLines )\n {\n let bxy = xy\n let borientation = orientation\n\n if( bxy === undefined || bxy === null )\n bxy = ri.position\n\n if( borientation === undefined || borientation === null )\n borientation = ri.orientation\n\n bake(ri, bxy, borientation)\n\n return true\n }\n\n if( xy )\n {\n const floorPoint = WallspiceWebgl.screenToPlaneWorld(\n xy, floor, ri.Renderer.intrinsics\n )\n\n ri.body.targetPos = WallspiceWebgl.worldToPlane(floor, floorPoint)\n }\n\n let targetPos = ri.body.targetPos\n if( ! targetPos )\n targetPos = ri.body.pos\n\n const targetOrientation = orientation\n\n debugFrame()\n\n const ds = 0.01\n const dtn = 1\n\n const hist = []\n\n for(let loopi = 0; loopi < 1000; loopi++)\n {\n debugIter()\n\n debugBody(ri.body)\n\n const dp = [\n targetPos[0] - ri.body.pos[0],\n targetPos[1] - ri.body.pos[1]\n ]\n\n const dpLen = Math.sqrt(\n + dp[0] * dp[0]\n + dp[1] * dp[1]\n )\n\n if( dpLen > 0 )\n {\n dp[0] /= dpLen\n dp[1] /= dpLen\n }\n\n const fbMag = ri.body.mass * dpLen / (0.5 * dtn * dtn)\n\n const fb = [\n fbMag * dp[0],\n fbMag * dp[1]\n ]\n\n debugMouseForce(fb)\n\n let tb = 0\n\n if( targetOrientation )\n {\n const v0 = [\n Math.cos(ri.body.rot),\n Math.sin(ri.body.rot)\n ]\n\n const v1 = [\n Math.cos(targetOrientation),\n Math.sin(targetOrientation)\n ]\n\n const xHat = [ +v0[0], +v0[1] ]\n const yHat = [ -v0[1], +v0[0] ]\n\n const vx = v1[0] * xHat[0] + v1[1] * xHat[1]\n const vy = v1[0] * yHat[0] + v1[1] * yHat[1]\n\n const drot = Math.atan2(vy, vx)\n\n tb = ri.body.i * drot / (0.5 * dtn * dtn)\n\n fb[0] /= 10\n fb[1] /= 10\n }\n\n let cs = contactPoints(renderer, ri.body, ds)\n const csOrig = cs\n let fs = []\n\n for(let j = 0; j < cs.length; j++)\n fs.push(0)\n\n while(true)\n {\n populatefs(renderer, ri.body, fb, tb, fs, cs)\n\n debugForceIter(cs, fs)\n\n let remove\n let removeForce\n\n for(let i = 0; i < fs.length; i++)\n {\n if( fs[i] < 0 )\n {\n if( remove === undefined || fs[i] < removeForce )\n {\n remove = i\n removeForce = fs[i]\n }\n }\n }\n\n if( remove === undefined )\n break\n\n const newcs = []\n const newfs = []\n\n for(let i = 0; i < fs.length; i++)\n {\n if( i !== remove )\n {\n newcs.push(cs[i])\n newfs.push(0)\n }\n }\n\n cs = newcs\n fs = newfs\n }\n\n debugContactsOrig(csOrig)\n debugContacts(cs)\n\n const [ dx, dy, da, dt ] = positionalOffsets(\n renderer, ri.body, fb, tb, cs, fs, dtn, ds\n )\n\n const ns = normalShifts(\n renderer, ri.body, fb, tb, fs, cs, csOrig, dt\n )\n\n debugNormalShifts(ns)\n\n let good = true\n for(let nsi = 0; nsi < ns.length; nsi++)\n {\n if( ns[nsi] <= - ds * ds ) {\n good = false\n break\n }\n }\n\n debugGood(good)\n\n if( true\n && good\n && Number.isFinite(dx)\n && Number.isFinite(dy)\n && Number.isFinite(da) )\n {\n const d0 = Math.sqrt(dx * dx + dy * dy)\n const d1 = Math.abs(da) * ri.body.radius\n const d = (d0 > d1) ? d0 : d1\n\n if( d < 0.5 * ds * ds )\n break\n\n hist.push([\n ri.body.pos[0],\n ri.body.pos[1],\n ri.body.rot,\n da\n ])\n\n ri.body.pos[0] += dx\n ri.body.pos[1] += dy\n ri.body.rot += da\n\n const jitterThreshold = 10\n\n if( hist.length >= 2 * jitterThreshold )\n {\n let pos = 0\n let neg = 0\n\n for(let i = 0; i < 2 * jitterThreshold; i ++)\n {\n const v = hist[hist.length - 1 - i][3]\n\n if( v > 0 )\n pos += 1\n else if( v < 0 )\n neg += 1\n }\n\n if( pos === jitterThreshold && neg === jitterThreshold )\n {\n ri.body.pos[0] = hist[hist.length - 2 * jitterThreshold][0]\n ri.body.pos[1] = hist[hist.length - 2 * jitterThreshold][1]\n ri.body.rot = hist[hist.length - 2 * jitterThreshold][2]\n break\n }\n }\n }\n else\n {\n break\n }\n\n const screenPos = WallspiceWebgl.proj(\n WallspiceWebgl.planeToWorld(floor, ri.body.pos),\n intrinsics[0],\n intrinsics[1],\n intrinsics[2],\n intrinsics[3]\n )\n\n bake(ri, screenPos, ri.body.rot)\n }\n\n return true\n}\n\n\n//\n// Pushes a renderItem away from any intersecting walls in the direction of a vector\n// pointing from the intersection midpoint towards the item's center.\n//\n\nexport\nfunction\npushOut(ri)\n{\n const ds = 0.01\n\n if( ! ri.body || ! ri.Renderer.floorLines )\n return\n\n let lines = [ ...ri.Renderer.floorLines ]\n\n let totalDist = 0\n while( lines.length > 0 && totalDist < 250 )\n {\n const linesAndIntersections = lines.map(\n line =>\n {\n return {\n line,\n intersection: getIntersection(ri.body, line)\n }\n }\n ).sort(\n (a, b) => b.intersection.length - a.intersection.length\n )\n\n if( linesAndIntersections[0].intersection.length <= 0 )\n break\n\n const { line, intersection } = linesAndIntersections.shift()\n\n const midp = [\n (intersection.points[0][0] + intersection.points[1][0]) / 2,\n (intersection.points[0][1] + intersection.points[1][1]) / 2,\n ]\n \n const dir = [\n ri.body.pos[0] - midp[0],\n ri.body.pos[1] - midp[1]\n ]\n\n const dot = line.n2[0] * dir[0] + line.n2[1] * dir[1]\n const sign = Math.sign(dot)\n\n let dist = 0\n const maxDist = 20\n\n while( dist < maxDist )\n {\n const { length } = getIntersection(ri.body, line)\n\n if( length <= 0 )\n break\n\n ri.body.pos[0] += ds * line.n2[0] * sign\n ri.body.pos[1] += ds * line.n2[1] * sign\n\n dist += ds\n totalDist += ds\n }\n\n lines = linesAndIntersections.map(\n lineAndIntersection => lineAndIntersection.line\n )\n }\n\n const renderer = ri.Renderer\n const intrinsics = renderer.intrinsics\n const planes = renderer.manifest.plane_orientation_0.planeData\n const floor = getFloorPlane(planes)\n\n const screenPos = WallspiceWebgl.proj(\n WallspiceWebgl.planeToWorld(floor, ri.body.pos),\n intrinsics[0],\n intrinsics[1],\n intrinsics[2],\n intrinsics[3]\n )\n\n bake(ri, screenPos, ri.body.rot)\n}\n\nexport\nfunction\nsetPosition(renderItem, xy)\n{\n return setPositionals(renderItem, xy, null)\n}\n\nexport\nfunction\nsetOrientation(renderItem, newOrientation)\n{\n return setPositionals(renderItem, null, newOrientation)\n}\n\nexport\nfunction\nmakeFloorLines(planes, maskData, intrinsics)\n{\n const planePoints = []\n while( planePoints.length < planes.length )\n planePoints.push([])\n\n const extControlPoints = []\n while( extControlPoints.length < planes.length )\n extControlPoints.push([])\n\n const centroids = []\n while( centroids.length < planes.length )\n centroids.push([ 0, 0, 0 ])\n\n for(let y = 0; y < maskData.height; y += 1)\n {\n for(let x = 0; x < maskData.width; x += 1)\n {\n const idx = 4 * (y * maskData.width + x)\n\n const pixel = [\n maskData.data[idx + 0],\n maskData.data[idx + 1],\n maskData.data[idx + 2],\n maskData.data[idx + 3]\n ]\n\n const planeIndex = pixel[2] - 1\n\n if( planeIndex < 0 )\n continue\n\n const plane = planes[planeIndex]\n\n const worldPos = WallspiceWebgl.screenToPlaneWorld(\n [x, y],\n plane,\n intrinsics\n )\n\n planePoints[planeIndex].push(worldPos)\n\n if( x === 0 || x === maskData.width - 1 )\n extControlPoints[planeIndex].push(worldPos)\n }\n }\n\n const floor = getFloorPlane(planes)\n\n const fd = floor.d\n const fxh = floor.rot[0]\n const fyh = floor.rot[1]\n const fzh = floor.rot[2]\n\n const fcenter = [\n -fd * fzh[0],\n -fd * fzh[1],\n -fd * fzh[2]\n ]\n\n for(let i = 0; i < planePoints.length; i += 1)\n {\n const wall = planes[i]\n if( wall.class !== \"wall\" )\n continue\n\n const wallPoints = planePoints[i]\n if( wallPoints.length === 0 )\n continue\n\n const centroid = centroids[i]\n\n for(let j = 0; j < wallPoints.length; j += 1)\n {\n const p = wallPoints[j]\n\n centroid[0] += p[0] / wallPoints.length\n centroid[1] += p[1] / wallPoints.length\n centroid[2] += p[2] / wallPoints.length\n }\n }\n\n const lines = []\n\n for(let i = 0; i < planePoints.length; i += 1)\n {\n const wall = planes[i]\n if( wall.class !== \"wall\" )\n continue\n\n const wallPoints = planePoints[i]\n if( wallPoints.length === 0 )\n continue\n\n const wallExtControlPoints = extControlPoints[i]\n\n const wd = wall.d\n\n const wxh = wall.rot[0]\n const wyh = wall.rot[1]\n const wzh = wall.rot[2]\n\n const wcenter = [\n -wd * wzh[0],\n -wd * wzh[1],\n -wd * wzh[2]\n ]\n\n let right\n let left\n\n for(let j = 0; j < wallPoints.length; j += 1)\n {\n let p = wallPoints[j]\n\n p = [\n p[0] - wcenter[0],\n p[1] - wcenter[1],\n p[2] - wcenter[2]\n ]\n\n const px = (\n + p[0] * wxh[0]\n + p[1] * wxh[1]\n + p[2] * wxh[2]\n )\n\n left = Math.min(left || px, px)\n right = Math.max(right || px, px)\n }\n\n for(let j = 0; j < wallExtControlPoints.length; j += 1)\n {\n const ep = wallExtControlPoints[j]\n\n let dp = [\n ep[0] - centroids[i][0],\n ep[1] - centroids[i][1],\n ep[2] - centroids[i][2]\n ]\n\n const dpLen = Math.sqrt(\n + dp[0] * dp[0]\n + dp[1] * dp[1]\n + dp[2] * dp[2]\n )\n\n if( dpLen === 0 )\n continue\n\n dp[0] *= 1000 / dpLen\n dp[1] *= 1000 / dpLen\n dp[2] *= 1000 / dpLen\n\n dp = [\n dp[0] - wcenter[0],\n dp[1] - wcenter[1],\n dp[2] - wcenter[2]\n ]\n\n const px = (\n + dp[0] * wxh[0]\n + dp[1] * wxh[1]\n + dp[2] * wxh[2]\n )\n\n left = Math.min(left || px, px)\n right = Math.max(right || px, px)\n }\n\n const taus = []\n for(let j = 0; j < 2; j += 1)\n {\n const lambda = [left, right][j]\n\n const xip = [\n wcenter[0] + lambda * wxh[0],\n wcenter[1] + lambda * wxh[1],\n wcenter[2] + lambda * wxh[2]\n ]\n\n const nDotXIP = (\n + fzh[0] * xip[0]\n + fzh[1] * xip[1]\n + fzh[2] * xip[2]\n )\n\n const nDotYH = (\n + fzh[0] * wyh[0]\n + fzh[1] * wyh[1]\n + fzh[2] * wyh[2]\n )\n\n const tau = -(nDotXIP + fd) / nDotYH\n\n taus.push(tau)\n }\n\n const line = []\n for(let j = 0; j < 2; j += 1)\n {\n const tau = taus[j]\n const lambda = [left, right][j]\n\n let p = [\n wcenter[0] + lambda * wxh[0] + tau * wyh[0],\n wcenter[1] + lambda * wxh[1] + tau * wyh[1],\n wcenter[2] + lambda * wxh[2] + tau * wyh[2]\n ]\n\n p = [\n p[0] - fcenter[0],\n p[1] - fcenter[1],\n p[2] - fcenter[2]\n ]\n\n p = [\n fxh[0] * p[0] + fxh[1] * p[1] + fxh[2] * p[2],\n fyh[0] * p[0] + fyh[1] * p[1] + fyh[2] * p[2]\n ]\n\n line.push(p)\n }\n\n const dp = [\n line[1][0] - line[0][0],\n line[1][1] - line[0][1]\n ]\n\n const dpLen = Math.sqrt(\n + dp[0] * dp[0]\n + dp[1] * dp[1]\n )\n\n const tangent2D = [\n dp[0], dp[1]\n ]\n\n const normal2D = [\n dp[1], -dp[0]\n ]\n\n normal2D[0] /= dpLen\n normal2D[1] /= dpLen\n\n tangent2D[0] /= dpLen\n tangent2D[1] /= dpLen\n\n line[0][0] += WALL_SHIFT * normal2D[0]\n line[0][1] += WALL_SHIFT * normal2D[1]\n\n line[1][0] += WALL_SHIFT * normal2D[0]\n line[1][1] += WALL_SHIFT * normal2D[1]\n\n lines.push({\n points: line,\n n: wzh,\n n2: normal2D,\n t2: tangent2D,\n len: dpLen\n })\n }\n\n sendFloorLines(lines)\n\n return lines\n}\n","import * as THREE from 'three'\nimport Fading from 'utils/fading'\n\nimport isMobile from 'utils/isMobile'\n\nimport { DEFAULT_MOBILE_TEXTURE_SIZE } from 'Renderer/constants'\nimport {\n loadManifestTexture,\n} from 'Renderer/manifestImageLoader'\n\nconst fadingTime = 0.25 // seconds\nconst maxWallsCount = 16\n\nclass CompositeBackground {\n constructor(renderer, intrinsics, width, height, manifest, panoTexture) {\n this.renderer = renderer\n this.fullscreenQuad = null\n this.material = null\n this.colorFading = []\n this.fadingStartColor = null\n this.fadingTargetColor = null\n\n this.createFullscreenQuad(intrinsics, width, height, manifest, panoTexture)\n }\n\n static intrinsicsRectGeo(intrinsics, width, height, d = 1) {\n const fx = intrinsics[0]\n const fy = intrinsics[1]\n const px = intrinsics[2]\n const py = intrinsics[3]\n\n const intrinsicRect = new THREE.PlaneGeometry(\n (width / fx) * d, (-height / fy) * d)\n intrinsicRect.translate(\n d * 0.5 * ((width - px) - px) / fx,\n d * -0.5 * ((height - py) - py) / fy, -1.0 * d)\n\n return intrinsicRect\n }\n \n createFullscreenQuad(intrinsics, width, height, manifest, panoTexture) {\n const rangeArray = [...Array(maxWallsCount).keys()]\n\n const defaultUniforms = {\n shadingMap: { value: null },\n residualMap: { value: null },\n segmentationMap: { value: null },\n panoMap: { value: null },\n\n customColors: { value: rangeArray.map(() => new THREE.Color(0xffffff)) },\n prevColors: { value: rangeArray.map(() => new THREE.Color(0xffffff)) },\n\n colorsAssigned: { value: rangeArray.map(() => 0.0) },\n colorLerp: { value: rangeArray.map(() => 0.0) },\n colorsHasPrev: { value: rangeArray.map(() => 0.0) },\n }\n const defines = {\n MAX_WALLS_COUNT: maxWallsCount,\n }\n\n if (!manifest.segmentation_0) {\n defines.USE_OLD_SEGMENTATION = ''\n }\n\n this.material = new THREE.ShaderMaterial({\n uniforms: defaultUniforms,\n defines,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n }\n `,\n fragmentShader: `\n uniform sampler2D shadingMap;\n uniform sampler2D panoMap;\n uniform sampler2D residualMap;\n uniform sampler2D segmentationMap;\n\n uniform vec4 customColors[MAX_WALLS_COUNT];\n uniform vec4 prevColors[MAX_WALLS_COUNT];\n\n uniform float colorLerp[MAX_WALLS_COUNT];\n uniform float colorsHasPrev[MAX_WALLS_COUNT];\n uniform float colorsAssigned[MAX_WALLS_COUNT];\n\n varying vec2 vUv;\n\n // Dynamic indices are not supported in webgl1, i.e. Safari\n vec4 getCustomColor(int index) {\n #pragma unroll_loop_start\n for (int i = 0; i < MAX_WALLS_COUNT; i++) {\n if (i == index) {\n return customColors[i];\n }\n }\n #pragma unroll_loop_end\n return vec4(0.0);\n }\n\n vec4 getPrevColor(int index) {\n #pragma unroll_loop_start\n for (int i = 0; i < MAX_WALLS_COUNT; i++) {\n if (i == index) {\n return prevColors[i];\n }\n }\n #pragma unroll_loop_end\n return vec4(0.0);\n }\n\n float getColorAssigned(int index) {\n #pragma unroll_loop_start\n for (int i = 0; i < MAX_WALLS_COUNT; i++) {\n if (i == index) {\n return colorsAssigned[i];\n }\n }\n #pragma unroll_loop_end\n return 0.0;\n }\n\n float getColorLerp(int index) {\n #pragma unroll_loop_start\n for (int i = 0; i < MAX_WALLS_COUNT; i++) {\n if (i == index) {\n return colorLerp[i];\n }\n }\n #pragma unroll_loop_end\n return 0.0;\n }\n\n float getColorHasPrev(int index) {\n #pragma unroll_loop_start\n for (int i = 0; i < MAX_WALLS_COUNT; i++) {\n if (i == index) {\n return colorsHasPrev[i];\n }\n }\n #pragma unroll_loop_end\n return 0.0;\n }\n\n void main() {\n vec4 shading = texture2D(shadingMap, vUv);\n vec4 residual = texture2D(residualMap, vUv);\n vec4 segmentation = texture2D(segmentationMap, vUv);\n vec4 panoColor = texture2D(panoMap, vUv);\n\n vec4 wallColor = vec4(0.0);\n vec4 finalColor = vec4(0.0);\n #ifdef USE_OLD_SEGMENTATION\n float segmentationValue = segmentation.b;\n #else\n float segmentationValue = segmentation.g;\n #endif\n int planeIdx = int((segmentationValue * 255.0) + 0.5);\n float lerp = getColorLerp(planeIdx);\n if (getColorAssigned(planeIdx) > 0.0) {\n vec4 customColor = getCustomColor(planeIdx);\n if (lerp >= 1.0) {\n wallColor = customColor;\n finalColor = wallColor * shading + residual;\n } else if (getColorHasPrev(planeIdx) > 0.0) {\n wallColor = mix(getPrevColor(planeIdx), customColor, lerp);\n finalColor = wallColor * shading + residual;\n } else {\n wallColor = customColor;\n finalColor = wallColor * shading + residual;\n finalColor = mix(panoColor, finalColor, lerp);\n }\n } else if (getColorHasPrev(planeIdx) > 0.0) {\n vec4 prevFinalColor = getPrevColor(planeIdx) * shading + residual;\n finalColor = mix(prevFinalColor, panoColor, lerp);\n } else {\n finalColor = panoColor;\n }\n\n gl_FragColor = finalColor;\n }\n `,\n transparent: false,\n depthTest: false,\n depthWrite: false,\n side: THREE.DoubleSide,\n })\n\n const rect = CompositeBackground.intrinsicsRectGeo(intrinsics, width, height)\n this.fullscreenQuad = new THREE.Mesh(rect, this.material)\n\n const onMapLoad = (texture, uniformName) => {\n // eslint-disable-next-line no-param-reassign\n texture.flipY = false\n // eslint-disable-next-line no-param-reassign\n texture.encoding = THREE.sRGBEncoding\n // eslint-disable-next-line no-param-reassign\n texture.needsUpdate = true\n\n let resultTex = texture\n const resizeTexture = isMobile()\n if (resizeTexture) {\n const newWidth = (Math.round(0.5 * (texture.image && texture.image.width))) || DEFAULT_MOBILE_TEXTURE_SIZE\n const newHeight = (Math.round(0.5 * (texture.image && texture.image.height))) || DEFAULT_MOBILE_TEXTURE_SIZE\n const resized = this.renderer.textureHelper.getResizedCopy(texture, newWidth, newHeight)\n if (resized) {\n resultTex = resized\n texture.dispose()\n }\n }\n this.material.uniforms[uniformName].value = resultTex\n this.material.needsUpdate = true\n }\n\n Promise.all([\n loadManifestTexture(manifest, 'shading_0', this.renderer.defaultDownloadOptions),\n loadManifestTexture(manifest, 'residual_0', this.renderer.defaultDownloadOptions),\n loadManifestTexture(manifest, 'normals_segmentation_0', this.renderer.defaultDownloadOptions)\n ])\n .then(([\n { texture: shadingMap },\n { texture: residualMap},\n { texture: segmentationMap}\n ]) => {\n onMapLoad(shadingMap, 'shadingMap')\n onMapLoad(residualMap, 'residualMap')\n onMapLoad(segmentationMap, 'segmentationMap')\n })\n\n this.material.uniforms.panoMap.value = panoTexture\n this.fullscreenQuad.name = 'background image'\n }\n\n startInterpolation(planeIdx, targetColor) {\n if (planeIdx < 0 || planeIdx >= maxWallsCount) {\n return\n }\n\n if (this.colorFading[planeIdx]) {\n this.colorFading[planeIdx].stop()\n }\n\n // indices in the segmenation are 1 based\n const unifromIdx = planeIdx + 1\n\n if (this.material.uniforms.colorsAssigned.value[unifromIdx] > 0.0) {\n this.material.uniforms.prevColors.value[unifromIdx]\n .copy(this.material.uniforms.customColors.value[unifromIdx])\n this.material.uniforms.colorsHasPrev.value[unifromIdx] = 1.0\n } else {\n this.material.uniforms.colorsHasPrev.value[unifromIdx] = 0.0\n }\n\n if (targetColor) {\n this.material.uniforms.customColors.value[unifromIdx].copy(targetColor)\n this.material.uniforms.colorsAssigned.value[unifromIdx] = 1.0\n } else {\n this.material.uniforms.colorsAssigned.value[unifromIdx] = 0.0\n }\n this.material.uniforms.colorLerp.value[unifromIdx] = 0.0\n\n this.colorFading[planeIdx] = new Fading(fadingTime, (t) => {\n this.material.uniforms.colorLerp.value[unifromIdx] = t\n if (this.renderer) {\n this.renderer.setRenderIsDirty()\n }\n }, () => {\n this.colorFading[planeIdx] = null\n })\n\n if (this.renderer) {\n this.renderer.setRenderIsDirty()\n }\n }\n\n setPlaneColor(planeIdx, color, interpolate = false) {\n if (planeIdx < 0 || planeIdx >= maxWallsCount) {\n return\n }\n if (!color) {\n this.unsetPlaneColor(planeIdx, interpolate)\n return\n }\n const targetColor = new THREE.Color()\n if ((typeof color === 'string' || color instanceof String)) {\n targetColor.set(color)\n } else if (Array.isArray(color)) {\n const r = color[0] > 1.0 ? color[0] / 255.0 : color[0]\n const g = color[1] > 1.0 ? color[1] / 255.0 : color[1]\n const b = color[2] > 1.0 ? color[2] / 255.0 : color[2]\n targetColor.setRGB(r, g, b)\n } else {\n targetColor.copy(color)\n }\n\n if (interpolate) {\n this.startInterpolation(planeIdx, targetColor)\n } else {\n // indices in the segmenation are 1 based\n this.material.uniforms.colorsAssigned.value[planeIdx + 1] = 1.0\n this.material.uniforms.customColors.value[planeIdx + 1].copy(targetColor)\n this.material.uniforms.colorLerp.value[planeIdx + 1] = 1.0\n if (this.renderer) {\n this.renderer.setRenderIsDirty()\n }\n }\n }\n\n unsetPlaneColor(planeIdx, interpolate) {\n if (planeIdx < 0 || planeIdx >= maxWallsCount) {\n return\n }\n if (interpolate) {\n this.startInterpolation(planeIdx, null)\n } else {\n this.material.uniforms.customColors.value[planeIdx].set(0xffffff);\n this.material.uniforms.colorsAssigned.value[planeIdx] = 0.0;\n if (this.renderer) {\n this.renderer.setRenderIsDirty()\n }\n }\n }\n}\n\nexport default CompositeBackground","import UAParser from 'ua-parser-js'\n\nconst parser = new UAParser()\n\nexport const getHardwareInfo = () => ({\n model: parser.getDevice().model,\n type: parser.getDevice().type,\n vendor: parser.getDevice().vendor,\n os: parser.getOS(),\n cpu: parser.getCPU(),\n})\n\nexport default getHardwareInfo\n","/* eslint no-mixed-operators: 0 */\n/* eslint camelcase: 0 */\n/* eslint @typescript-eslint/naming-convention: 0 */\n\n// This class handles all of the webGL rendering\n\nimport numeric from 'numeric'\n// import array2mat from 'array2mat'\n// import transposeMatrix from 'transposeMatrix'\n// import svd from 'svd'\nimport * as THREE from 'three'\nimport isMobile from 'utils/isMobile'\n\nimport CompositeBackground from 'Renderer/CompositeBackground.js'\nimport { RUG_SUB_LAYER_DELTA } from 'Renderer/constants'\nimport { getHardwareInfo } from 'utils/getHardwareInfo'\n\nimport { getFloorPlane, getFloorIndex } from \"Renderer/SceneUtils\"\n\nconst tmpMat4 = new THREE.Matrix4()\nconst tmpXAxis = new THREE.Vector3()\nconst tmpYAxis = new THREE.Vector3()\nconst tmpZAxis = new THREE.Vector3()\n\nclass WallspiceWebgl {\n static createRenderer(canvas) {\n let downrez = 1\n let antialias = true\n let software = false\n let ext_depth = null\n let canvas_width = null\n let canvas_height = null\n\n const query_canvas = document.createElement('canvas', { width: 4, height: 4 })\n let ctx = query_canvas.getContext('webgl', { failIfMajorPerformanceCaveat: true })\n if (!ctx) {\n software = true\n ctx = query_canvas.getContext('webgl')\n\n if (!ctx) {\n // failed to find a context, THREE.js fails here too\n return null\n }\n }\n const debugInfo = ctx.getExtension('WEBGL_debug_renderer_info')\n const rendy = ctx.getParameter(ctx.RENDERER)\n const underlyingVendor = ctx.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)\n const underlyingRenderer = ctx.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)\n ext_depth = ctx.getExtension('EXT_frag_depth')\n const wgl2QueryTimerExt = ctx.getExtension('EXT_disjoint_timer_query_webgl2')\n const wgl1QueryTimerExt = ctx.getExtension('EXT_disjoint_timer_query')\n\n if (rendy === 'WebKit WebGL'\n && underlyingVendor === 'Intel Inc.'\n && underlyingRenderer.indexOf('Iris(TM)') >= 0\n && underlyingRenderer.indexOf('No Disable AA as bug has gone for now') >= 0\n && navigator.platform === 'MacIntel'\n && navigator.userAgent.indexOf('Chrome') >= 0) {\n antialias = false\n }\n\n // Disabling GPU acceleration in chrome results in usage of SwiftShader implementation of WebGL. \n // However, context creation with 'failIfMajorPerformanceCaveat' produces a valid context and does not let us know it is software.\n if (rendy === 'WebKit WebGL'\n && underlyingVendor === 'Google Inc. (Google)'\n && underlyingRenderer.indexOf('SwiftShader Device') >= 0\n && underlyingRenderer.indexOf('SwiftShader driver') >= 0\n && navigator.userAgent.indexOf('Chrome') >= 0) {\n software = true\n }\n\n if (software) {\n downrez = 2\n antialias = false\n }\n\n canvas_width = canvas.width / downrez\n canvas_height = canvas.height / downrez\n\n WallspiceWebgl.applyCustomShaderChunks()\n const renderer = new THREE.WebGLRenderer({\n canvas,\n alpha: true,\n preserveDrawingBuffer: true,\n powerPreference: 'high-performance',\n antialias,\n })\n renderer.shadowMap.enabled = !software\n renderer.shadowMap.type = isMobile() ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap\n renderer.setSize(canvas.width / downrez, canvas.height / downrez)\n renderer.setClearAlpha(0)\n renderer.autoClear = false\n renderer.outputEncoding = THREE.sRGBEncoding\n renderer.localClippingEnabled = true\n renderer.toneMappingExposure = 1.0\n const hwinfo = getHardwareInfo()\n renderer.wallspiceContextInfo = {\n hasFragmentDepth: !!ext_depth,\n antialias,\n software,\n canvas_height,\n canvas_width,\n hasWGL1QueryTimer: !!wgl1QueryTimerExt,\n hasWGL2QueryTimer: !!wgl2QueryTimerExt,\n hwinfo\n }\n return renderer\n }\n\n static applyCustomShaderChunks() {\n if (!THREE.ShaderChunk.envmap_physical_pars_fragment_patched) {\n THREE.ShaderChunk.envmap_physical_pars_fragment = THREE.ShaderChunk.envmap_physical_pars_fragment.replace(\n 'vec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );',\n \n `\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n `\n );\n THREE.ShaderChunk.envmap_physical_pars_fragment = THREE.ShaderChunk.envmap_physical_pars_fragment.replace(\n 'vec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );',\n \n `\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, roughness );\n `\n );\n THREE.ShaderChunk.envmap_common_pars_fragment = THREE.ShaderChunk.envmap_common_pars_fragment.replace(\n 'uniform float envMapIntensity;',\n\n `\n uniform mat3 envMapRotation;\n uniform float envMapIntensity;\n `\n )\n THREE.ShaderLib.physical.uniforms = THREE.UniformsUtils.merge([\n THREE.ShaderLib.physical.uniforms,\n { envMapRotation: { value: new THREE.Matrix3().set(0, 0, 1, 0, 1, 0, -1, 0, 0).transpose() } }, // -Z\n ]);\n THREE.ShaderChunk.envmap_physical_pars_fragment_patched = true\n }\n }\n\n static queryContextInfo(wglrend) {\n if (!wglrend) { return null }\n const ctx = wglrend.getContext()\n const debugInfo = ctx.getExtension('WEBGL_debug_renderer_info')\n const version = ctx.getParameter(ctx.VERSION)\n const GLSLversion = ctx.getParameter(ctx.SHADING_LANGUAGE_VERSION)\n const vendor = ctx.getParameter(ctx.VENDOR)\n const renderer = ctx.getParameter(ctx.RENDERER)\n const underlyingVendor = ctx.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)\n const underlyingRenderer = ctx.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)\n\n return {\n ...wglrend.wallspiceContextInfo,\n version,\n GLSLversion,\n vendor,\n renderer,\n underlyingVendor,\n underlyingRenderer,\n devicePixelRatio: window.devicePixelRatio,\n }\n }\n\n static createScene() {\n return new THREE.Scene()\n }\n\n static createCamera(intrinsics, width, height) {\n const camera = new THREE.PerspectiveCamera()\n const n = 0.2 // Near\n const f = 30 // Far\n\n const fx = intrinsics[0]\n const fy = intrinsics[1]\n const px = intrinsics[2]\n const py = intrinsics[3]\n\n camera.left = (-px / fx) * n\n camera.right = ((width - px) / fx) * n\n camera.top = (py / fy) * n\n camera.bottom = ((-height + py) / fy) * n\n\n camera.near = n\n camera.far = f\n\n // eslint-disable-next-line func-names\n camera.updateProjectionMatrix = (function() {\n let { left, right, top, bottom } = this\n\n // support threejs' view offsets used for TAA:\n if ( this.view !== null && this.view.enabled ) {\n left += this.view.offsetX * (right - left) / this.view.fullWidth;\n right += this.view.offsetX * (right - left) / this.view.fullWidth;\n top -= this.view.offsetY * (top - bottom) / this.view.fullHeight;\n bottom -= this.view.offsetY * (top - bottom) / this.view.fullHeight;\n }\n\n const A = (right + left) / (right - left)\n const B = (top + bottom) / (top - bottom)\n const C = -(this.far + this.near) / (this.far - this.near)\n const D = -(2 * this.far * this.near) / (this.far - this.near)\n\n this.projectionMatrix.set(\n 2 * n / (this.right - this.left), 0, A, 0,\n 0, 2 * n / (this.top - this.bottom), B, 0,\n 0, 0, C, D,\n 0, 0, -1, 0,\n )\n }).bind(camera)\n camera.updateProjectionMatrix()\n\n return camera\n }\n\n static hexgammacol(color) {\n const gamma = 1.0\n const r = 255.0 * ((color[0] / 255.0) ** (1.0 / gamma))\n const g = 255.0 * ((color[1] / 255.0) ** (1.0 / gamma))\n const b = 255.0 * ((color[2] / 255.0) ** (1.0 / gamma))\n\n // eslint-disable-next-line no-bitwise\n return ((r << 16) + (g << 8) + b)\n }\n\n static createAmbientColoredLight(amb) {\n // eslint-disable-next-line no-bitwise\n const light = new THREE.AmbientLight(new THREE.Color(0.0, 0.0, 0.0), amb.intensity)\n light.originalColor = new THREE.Color(WallspiceWebgl.hexgammacol(amb.color))\n light.originalIntensity = light.intensity\n light.layers.enableAll()\n return light\n }\n\n static createReducedAmbientColoredLight(amb) {\n // eslint-disable-next-line no-bitwise\n const light = new THREE.AmbientLight(new THREE.Color(0.0, 0.0, 0.0), amb.intensity * 0.1)\n light.originalColor = new THREE.Color(WallspiceWebgl.hexgammacol(amb.color))\n light.originalIntensity = light.intensity\n light.layers.enableAll()\n return light\n }\n\n static createPointColoredLight(light, shadow, mobileTextureSize) {\n const pLight = new THREE.PointLight(new THREE.Color(0.0, 0.0, 0.0), light.intensity)\n pLight.originalColor = new THREE.Color(WallspiceWebgl.hexgammacol(light.color))\n pLight.originalIntensity = light.intensity\n pLight.frustumCulled = false\n pLight.position.set(light.position[0], -light.position[1], light.position[2])\n pLight.layers.enableAll()\n\n pLight.shadow.bias = -0.00014\n pLight.shadow.mapSize.width = isMobile() ? mobileTextureSize : 2048\n pLight.shadow.mapSize.height = isMobile() ? mobileTextureSize : 2048\n pLight.shadow.radius = 2.0\n pLight.shadow.camera.near = 0.1\n pLight.shadow.camera.far = 50.0\n pLight.shadow.camera.frustumCulled = false\n if (shadow) {\n pLight.castShadow = true\n }\n return pLight\n }\n\n static createDirectionalColoredLight(light, shadow, mobileTextureSize) {\n const dirLight = new THREE.DirectionalLight(new THREE.Color(0.0, 0.0, 0.0), light.intensity)\n dirLight.originalColor = new THREE.Color(WallspiceWebgl.hexgammacol(light.color))\n dirLight.originalIntensity = light.intensity\n dirLight.frustumCulled = false\n dirLight.position.set(light.direction[0] * 5.0, -light.direction[1] * 5.0, light.direction[2] * 5.0)\n dirLight.layers.enableAll()\n\n dirLight.shadow.bias = -0.00002\n dirLight.shadow.normalBias = 0.04\n dirLight.shadow.mapSize.width = isMobile() ? mobileTextureSize : 2048\n dirLight.shadow.mapSize.height = isMobile() ? mobileTextureSize : 2048\n dirLight.shadow.radius = 3.0\n dirLight.shadow.camera.near = -10.0\n dirLight.shadow.camera.far = 100\n dirLight.shadow.camera.left = -10\n dirLight.shadow.camera.right = 10\n dirLight.shadow.camera.bottom = -10\n dirLight.shadow.camera.top = 10\n dirLight.shadow.camera.frustumCulled = false\n if (shadow) {\n dirLight.castShadow = true\n }\n return dirLight\n }\n\n static createAmbientLight(brightness) {\n const light = new THREE.AmbientLight(0xffffff, brightness)\n light.originalIntensity = light.intensity\n light.layers.enableAll()\n return light\n }\n\n static createPointLight(vector, brightness) {\n // eslint-disable-next-line no-bitwise\n const pLight = new THREE.PointLight((243 << 16) + (241 << 8) + 234, brightness)\n pLight.originalIntensity = brightness\n const { x, y, z } = vector\n pLight.frustumCulled = false\n pLight.position.set(x, -y, z)\n pLight.layers.enableAll()\n return pLight\n }\n\n static createDirectionalLight(vector, brightness, shadow, mobileTextureSize) {\n const dirLight = new THREE.DirectionalLight(0xffffff, brightness)\n dirLight.originalIntensity = brightness\n const { x, y, z } = vector\n dirLight.frustumCulled = false\n dirLight.position.set(x, -y, z)\n dirLight.layers.enableAll()\n\n dirLight.shadow.bias = -0.00002\n dirLight.shadow.normalBias = 0.02\n dirLight.shadow.mapSize.width = isMobile() ? mobileTextureSize : 2048\n dirLight.shadow.mapSize.height = isMobile() ? mobileTextureSize : 2048\n dirLight.shadow.radius = 3.0\n dirLight.shadow.camera.near = -10.0\n dirLight.shadow.camera.far = 1000\n dirLight.shadow.camera.left = -10\n dirLight.shadow.camera.right = 10\n dirLight.shadow.camera.bottom = -10\n dirLight.shadow.camera.top = 10\n dirLight.shadow.camera.frustumCulled = false\n if (shadow) {\n dirLight.castShadow = true\n }\n return dirLight\n }\n\n static fitShadowMap(light, sceneCam, depth_occlusion_meta_0) {\n // Only fit directional light shadow maps\n if (!(light instanceof THREE.DirectionalLight))\n return\n\n // Calculate the shadow camera parameters for improved utilization of the shadow map\n const cameraPos = sceneCam.position\n const cameraFront = sceneCam.getWorldDirection(new THREE.Vector3())\n const lightRotMat = new THREE.Matrix4().lookAt(light.position, new THREE.Vector3(), new THREE.Vector3(0, 1, 0))\n const lightTransMat = new THREE.Matrix4().setPosition(light.position)\n const lightModelMatInv = new THREE.Matrix4().multiplyMatrices(lightTransMat, lightRotMat).invert()\n const currentWidthUnits = light.shadow.camera.right - light.shadow.camera.left\n const currentHeightUnits = light.shadow.camera.top - light.shadow.camera.bottom\n const currentCenter = new THREE.Vector2(\n (light.shadow.camera.right + light.shadow.camera.left) / 2,\n (light.shadow.camera.top + light.shadow.camera.bottom) / 2,\n )\n const lightSpaceNDCProject = v => v.clone().applyMatrix4(lightModelMatInv)\n .applyMatrix4(light.shadow.camera.projectionMatrix)\n light.shadow.camera.updateProjectionMatrix()\n if (depth_occlusion_meta_0) {\n // Use the room's max/min depth values to fit the shadow map\n const p1NDC = lightSpaceNDCProject(cameraPos.clone())\n const p2NDC = lightSpaceNDCProject(cameraPos.clone().add(cameraFront).multiplyScalar(depth_occlusion_meta_0.max))\n const minWidth = Math.abs(p2NDC.x - p1NDC.x)\n const minHeight = Math.abs(p2NDC.y - p1NDC.y)\n const dimensionRatio = light.shadow.mapSize.width / light.shadow.mapSize.height\n const widthNDC = Math.max(minWidth, dimensionRatio * minHeight) * (1.2 + Math.sqrt(2) / 2) // Worst case diagonal padding\n const heightNDC = Math.max(minHeight, (1 / dimensionRatio) * minWidth) * (1.2 + Math.sqrt(2) / 2) // Worst case diagonal padding\n const newRelativeCenterNDC = new THREE.Vector2((p1NDC.x + p2NDC.x) / 2, (p1NDC.y + p2NDC.y) / 2)\n /* eslint-disable no-param-reassign */\n light.shadow.camera.left = (newRelativeCenterNDC.x - widthNDC / 2) * (currentWidthUnits / 2) + currentCenter.x \n light.shadow.camera.right = (newRelativeCenterNDC.x + widthNDC / 2) * (currentWidthUnits / 2) + currentCenter.x\n light.shadow.camera.bottom = (newRelativeCenterNDC.y - heightNDC / 2) * (currentHeightUnits / 2) + currentCenter.y\n light.shadow.camera.top = (newRelativeCenterNDC.y + heightNDC / 2) * (currentHeightUnits / 2) + currentCenter.y\n /* eslint-enable no-param-reassign */\n } else {\n // Guess the scene's approximate center point using the camera's focal length\n const sceneCenterViewSpace = 0.0008436 * sceneCam.projectionMatrix.elements[0] + 1.501\n const sceneCenter = cameraPos.clone().add(cameraFront).multiplyScalar(sceneCenterViewSpace)\n const sceneCenterLightSpaceNDC = lightSpaceNDCProject(sceneCenter)\n /* eslint-disable no-param-reassign */\n light.shadow.camera.left = sceneCenterLightSpaceNDC.x * (currentWidthUnits / 2) + currentCenter.x - 3.5 \n light.shadow.camera.right = sceneCenterLightSpaceNDC.x * (currentWidthUnits / 2) + currentCenter.x + 3.5\n light.shadow.camera.bottom = sceneCenterLightSpaceNDC.y * (currentHeightUnits / 2) + currentCenter.y - 3.5\n light.shadow.camera.top = sceneCenterLightSpaceNDC.y * (currentHeightUnits / 2) + currentCenter.y + 3.5\n /* eslint-enable no-param-reassign */\n }\n light.shadow.camera.updateProjectionMatrix()\n }\n\n static createFrameMaterial(fname = `${CDN_BUCKET}/testAssets/frames/textures/test.png`,\n albedo = 0xFFFFFF) {\n return new Promise((resolve) => {\n const loader = new THREE.TextureLoader()\n loader.load(fname, (texture) => {\n const map = texture\n map.anisotropy = 8\n map.needsUpdate = true\n map.wrapS = THREE.RepeatWrapping\n map.wrapT = THREE.RepeatWrapping\n\n const frameMaterial = new THREE.MeshStandardMaterial({ map, color: albedo })\n // frameMaterial.side = THREE.SingleSide\n\n resolve(frameMaterial)\n })\n })\n }\n\n static createArtMaterial(artImage) {\n const map = new THREE.DataTexture(\n new Uint8Array(artImage.data),\n artImage.width,\n artImage.height,\n THREE.RGBAFormat,\n THREE.UnsignedByteType,\n THREE.UVMapping,\n THREE.ClampToEdgeWrapping,\n THREE.ClampToEdgeWrapping,\n THREE.LinearFilter,\n THREE.LinearFilter,\n 8,\n )\n map.flipY = true\n map.needsUpdate = true\n\n const artMaterial = new THREE.MeshStandardMaterial({ map, side: THREE.DoubleSide })\n\n return artMaterial\n }\n\n static createDebugSphere(pos, radius, col) {\n const bgM = new THREE.MeshBasicMaterial({ color: col, side: THREE.DoubleSide })\n bgM.transparent = false\n bgM.depthTest = false\n bgM.depthWrite = true\n\n const sphereGeo = new THREE.SphereGeometry(radius, 12, 12)\n // sphereGeo.translate(pos.x, pos.y, pos.z)\n const intrinsicMesh = new THREE.Mesh(sphereGeo, bgM)\n intrinsicMesh.position.set(pos.x, pos.y, pos.z)\n\n intrinsicMesh.name = 'debugLight'\n return intrinsicMesh\n }\n\n static createLightHelper(light, size, col) {\n let Type = null\n if (light instanceof THREE.PointLight) {\n Type = THREE.PointLightHelper\n } else if (light instanceof THREE.DirectionalLight) {\n Type = THREE.DirectionalLightHelper\n }\n return Type\n ? new Type(light, size, col)\n : WallspiceWebgl.createDebugSphere(light.position, size, col);\n }\n\n static createAppMesh(fd, debug, software) {\n let shadowfloor = null\n if (fd) {\n if (debug === 1) {\n const horizongeo = new THREE.PlaneGeometry(2, 2, 2, 2)\n const material = new THREE.MeshBasicMaterial({ color: 0x00FF00, wireframe: true })\n shadowfloor = new THREE.Mesh(horizongeo, material)\n shadowfloor.name = 'horizon'\n } else if (debug === 2) {\n const geometry = new THREE.BufferGeometry()\n // eslint-disable-next-line no-array-constructor\n const pos = new Array()\n let flip = 1\n const radius = 2.0\n for (let f = 0.0; f <= 2.0 * Math.PI + 0.04; f += Math.PI / 100.0) {\n pos.push(Math.cos(f) * radius, Math.sin(f) * radius, -10.0 * flip)\n pos.push(Math.cos(f) * radius, Math.sin(f) * radius, 10.0 * flip)\n flip *= -1.0\n }\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n // geometry.setDrawRange(0, pos.length / 3)\n\n const material = new THREE.LineBasicMaterial({ color: 0xFF00FF })\n\n shadowfloor = new THREE.Line(geometry, material)\n shadowfloor.name = 'vertical vanishing lines'\n } else if (debug === 3) {\n const geometry = new THREE.BufferGeometry()\n // eslint-disable-next-line no-array-constructor\n const pos = new Array()\n const radius = 0.25\n for (let f = 0.0; f <= 2.0 * Math.PI + 0.04; f += Math.PI / 50.0) {\n pos.push(Math.cos(f) * radius, Math.sin(f) * radius, -1.0)\n }\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n // geometry.setDrawRange(0, pos.length / 3)\n\n const material = new THREE.LineBasicMaterial({ color: 0x000000 })\n\n shadowfloor = new THREE.Line(geometry, material)\n\n shadowfloor.name = 'principal point ring'\n } else if (debug === 4) {\n const floorgeo = new THREE.PlaneGeometry(50, 50)\n\n const material = new THREE.MeshBasicMaterial({ color: 0x000000 }) // \"none more black\"\n material.depthWrite = false\n\n shadowfloor = new THREE.Mesh(floorgeo, material)\n\n floorgeo.translate(0, 0, -fd.d)\n shadowfloor.receiveShadow = false\n\n shadowfloor.name = 'shadow floor black'\n } else if (!software) {\n const floorgeo = new THREE.PlaneGeometry(50, 50)\n\n const material = new THREE.ShadowMaterial()\n material.opacity = 0.3\n material.depthWrite = false\n material.stencilWrite = true\n material.stencilFunc = THREE.NotEqualStencilFunc\n material.stencilRef = 3\n\n shadowfloor = new THREE.Mesh(floorgeo, material)\n\n floorgeo.translate(0, 0, -(fd.d - RUG_SUB_LAYER_DELTA))\n shadowfloor.receiveShadow = true\n\n shadowfloor.name = 'shadow floor receiver'\n\n shadowfloor.material.needsUpdate = true\n }\n if (shadowfloor) {\n const shadmat = new THREE.Matrix4()\n WallspiceWebgl.createMat4(fd.rot, [0, 0, 0], shadmat)\n\n shadowfloor.matrixAutoUpdate = false\n\n if (debug !== 3) {\n shadowfloor.matrix.copy(shadmat)\n }\n shadowfloor.needsUpdate = true\n }\n }\n return shadowfloor\n }\n\n static createTextHelper(string, size, position) {\n const fontSize = size * 10\n const canvas = document.createElement('canvas', { width: string.length * fontSize / 2, height: fontSize })\n const ctx = canvas.getContext('2d')\n ctx.font = `${fontSize}px Monospace`\n ctx.fillText(string, 0, fontSize)\n\n const textTexture = new THREE.CanvasTexture(canvas)\n\n const geometry = new THREE.PlaneGeometry(0.2, 0.1)\n const material = new THREE.MeshBasicMaterial({ \n map: textTexture, \n side: THREE.DoubleSide, \n transparent: true,\n depthTest: false,\n })\n const plane = new THREE.Mesh(geometry, material)\n plane.position.copy(position)\n return plane\n }\n\n static setOpacity(shadowfloor, opacity) {\n if (shadowfloor && shadowfloor.material) {\n // eslint-disable-next-line no-param-reassign\n shadowfloor.material.opacity = opacity;\n }\n }\n\n static intrinsicsRectGeo(intrinsics, width, height, d = 1) {\n const fx = intrinsics[0]\n const fy = intrinsics[1]\n const px = intrinsics[2]\n const py = intrinsics[3]\n\n const intrinsicRect = new THREE.PlaneGeometry(\n (width / fx) * d, (-height / fy) * d)\n intrinsicRect.translate(\n d * 0.5 * ((width - px) - px) / fx,\n d * -0.5 * ((height - py) - py) / fy, -1.0 * d)\n\n return intrinsicRect\n }\n\n static createBackground(intrinsics, width, height, bgTex) {\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height)\n\n const bgM = new THREE.ShaderMaterial({\n side: THREE.DoubleSide,\n uniforms: THREE.ShaderLib.basic.uniforms,\n vertexShader: THREE.ShaderLib.basic.vertexShader,\n fragmentShader: THREE.ShaderLib.basic.fragmentShader.replace('#include ', ''),\n })\n bgM.map = bgTex\n bgM.uniforms.map.value = bgTex\n bgM.uniforms.diffuse.value = new THREE.Color(0xFFFFFF)\n bgM.transparent = false\n bgM.depthTest = false\n bgM.depthWrite = false\n\n const intrinsicMesh = new THREE.Mesh(intrinsicRect, bgM)\n\n intrinsicMesh.name = 'background image'\n return intrinsicMesh\n }\n\n static createBackgroundFromURL(intrinsics, width, height, fgUrl) {\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height)\n\n const bgM = new THREE.MeshBasicMaterial({ color: 0xFFFFFF, side: THREE.DoubleSide })\n bgM.transparent = false\n bgM.depthTest = false\n bgM.depthWrite = false\n\n const intrinsicMesh = new THREE.Mesh(intrinsicRect, bgM)\n\n const tloader = new THREE.TextureLoader()\n // tloader.setPath(this.furnitureData.pathUrl);\n tloader.load(fgUrl, (bgTex) => {\n // eslint-disable-next-line no-param-reassign\n bgTex.flipY = false\n // eslint-disable-next-line no-param-reassign\n bgTex.encoding = THREE.sRGBEncoding\n // eslint-disable-next-line no-param-reassign\n bgTex.needsUpdate = true\n bgM.map = bgTex\n bgM.opacity = 1.0;\n bgM.needsUpdate = true\n })\n\n intrinsicMesh.name = 'background image'\n return intrinsicMesh\n }\n\n static createCompositeBackground(renderer, intrinsics, width, height, manifest, panoTexture) {\n return new CompositeBackground(renderer, intrinsics, width, height, manifest, panoTexture)\n }\n\n static applyMaskTexToMat(tgtmat, tex) {\n // eslint-disable-next-line no-param-reassign\n tgtmat.opacity = 1.0\n // eslint-disable-next-line no-param-reassign\n tgtmat.alphaTest = 0.5\n // eslint-disable-next-line no-param-reassign\n tgtmat.alphaMap = tex\n // eslint-disable-next-line no-param-reassign\n tgtmat.needsUpdate = true\n }\n\n static createImgPaste(intrinsics, width, height) {\n let intrinsicMesh = null\n const iM = new THREE.MeshBasicMaterial({ color: 0xFFFFFF, side: THREE.DoubleSide })\n iM.transparent = false\n iM.opacity = 1.0; // keep invisible until texload lmbda completes\n iM.depthTest = false\n iM.depthWrite = false\n\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, iM)\n\n const pixels = new Uint8Array([255, 0, 0, 0, 255, 0, 0, 0, 0, 255, 255, 255])\n\n iM.map = new THREE.DataTexture(pixels,\n 2,\n 2,\n THREE.RGBFormat,\n THREE.UnsignedByteType,\n THREE.UVMapping,\n THREE.ClampToEdgeWrapping,\n THREE.ClampToEdgeWrapping,\n THREE.LinearFilter,\n THREE.LinearFilter,\n 2,\n )\n\n intrinsicMesh.name = 'over image'\n return intrinsicMesh\n }\n\n static createForeground(intrinsics, width, height, fgUrl) {\n let intrinsicMesh = null\n const fgM = new THREE.MeshBasicMaterial({ color: 0xFFFFFF, side: THREE.DoubleSide })\n fgM.transparent = true\n fgM.alphaTest = 0.75\n fgM.opacity = 0.0; // keep invisible until texload lmbda completes\n fgM.depthTest = false\n fgM.depthWrite = false\n\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, fgM)\n\n const tloader = new THREE.TextureLoader()\n // tloader.setPath(this.furnitureData.pathUrl);\n tloader.load(fgUrl, (fgTex) => {\n // eslint-disable-next-line no-param-reassign\n fgTex.flipY = false\n // eslint-disable-next-line no-param-reassign\n fgTex.encoding = THREE.sRGBEncoding\n // eslint-disable-next-line no-param-reassign\n fgTex.needsUpdate = true\n fgM.map = fgTex\n fgM.opacity = 1.0;\n fgM.needsUpdate = true\n })\n\n intrinsicMesh.name = 'foreground image'\n return intrinsicMesh\n }\n\n static createPlaceableOverlay(intrinsics, width, height, maskData, planes, depth) {\n let intrinsicMesh = null\n const depthUniform = {\n factoralpha: { value: new Float32Array([1.0, 0.125]) },\n };\n const material = new THREE.ShaderMaterial({\n uniforms: depthUniform,\n vertexShader: 'varying vec2 vUv;'\n + 'void main() {'\n + ' vUv = uv;'\n + ' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );'\n + ' gl_Position = projectionMatrix * mvPosition;'\n + '}',\n fragmentShader: 'uniform vec2 factoralpha;'\n + 'uniform sampler2D map;'\n + 'varying vec2 vUv;'\n + 'void main() {'\n + ' vec4 fetch = texture2D( map, vUv);'\n + ' if(fetch.b < 0.001) discard;'\n + ' if((fetch.b - 0.75) * factoralpha[0] < 0.0) discard;'\n + ' gl_FragColor = vec4(0.0, 1.0, 0.0, factoralpha[1]);'\n + '}',\n transparent: true,\n depthTest: false,\n depthWrite: false,\n side: THREE.DoubleSide,\n });\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height, depth)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, material)\n\n const pixels = new Uint8Array(maskData.width * maskData.height)\n for (let i = 0; i < maskData.height; i += 1) {\n for (let j = 0; j < maskData.width; j += 1) {\n const index = maskData.data[(i * maskData.width + j) * 4 + 2]\n pixels[i * maskData.width + j] = 0\n if (index > 0) {\n if (planes[index - 1] && planes[index - 1].class === 'floor') {\n pixels[i * maskData.width + j] = 128\n } else {\n pixels[i * maskData.width + j] = 255\n }\n }\n }\n }\n\n const map = new THREE.DataTexture(\n pixels,\n maskData.width,\n maskData.height,\n THREE.LuminanceFormat,\n THREE.UnsignedByteType,\n THREE.UVMapping,\n THREE.ClampToEdgeWrapping,\n THREE.ClampToEdgeWrapping,\n THREE.NearestFilter,\n THREE.NearestFilter,\n 8,\n )\n map.flipY = false\n map.needsUpdate = true\n material.uniforms.map = map\n material.uniforms.map.value = map\n material.opacity = 1.0\n material.needsUpdate = true\n\n return intrinsicMesh\n }\n\n static setPlaceableAdjust(placeMesh, factor, alpha) {\n if (placeMesh) {\n // eslint-disable-next-line no-param-reassign\n placeMesh.material.uniforms.factoralpha.value = new Float32Array([factor, alpha])\n }\n }\n\n static isolateChannelDataFromImage(idata, pos) {\n const w = idata.width\n const h = idata.height\n const pixels = new Uint8Array( idata.width * idata.height )\n\n let segment\n const segments = new Set()\n\n for(let i = 0; i < w * h; i += 1) {\n segment = idata.data[i * 4 + pos]\n pixels[i] = segment\n if (segment)\n segments.add(segment)\n }\n return {\n w,\n h,\n pixels,\n numSegments: segments.size - 1,\n segments,\n }\n }\n\n static generateMask(w, h, val) {\n const pixels = new Uint8Array( w * h )\n\n for(let x = 0; x < w; x += 1) {\n for(let y = 0; y < h; y += 1) {\n pixels[x + y * w] = val\n }\n }\n\n return {\n w,\n h,\n pixels,\n }\n }\n\n static keyMask(mask, segments, index, val) {\n for(let x = 0; x < mask.w; x += 1) {\n for(let y = 0; y < mask.h; y += 1) {\n if(segments.pixels[x + y * segments.w] === index)\n // eslint-disable-next-line no-param-reassign\n mask.pixels[x + y * mask.w] = val\n }\n }\n }\n\n static getValueAtPos(segments, pos) {\n const x = Math.floor((segments.w - 1) * pos[0])\n const y = Math.floor((segments.h - 1) * pos[1])\n const value = segments.pixels[segments.w * y + x]\n return value\n }\n\n static createLuminanceTextureFromData(maskData) {\n const lTex = new THREE.DataTexture(\n // new Uint8Array(maskData.pixels),\n maskData.pixels,\n maskData.w,\n maskData.h,\n THREE.LuminanceFormat,\n THREE.UnsignedByteType,\n THREE.UVMapping,\n THREE.ClampToEdgeWrapping,\n THREE.ClampToEdgeWrapping,\n THREE.NearestFilter,\n THREE.NearestFilter,\n 0,\n )\n lTex.flipY = false\n lTex.needsUpdate = true\n\n return lTex\n }\n\n static setSegmentsHighlightIndex(segMesh, index) {\n if (segMesh && segMesh.material) {\n // eslint-disable-next-line no-param-reassign\n segMesh.material.uniforms.idhighlight.value = index / 255.0\n }\n }\n\n static createSegmentsMesh(intrinsics, width, height, segsTex, depth, isVisible) {\n let intrinsicMesh = null\n\n const material = new THREE.ShaderMaterial({\n uniforms: {\n idhighlight: { value: 512 / 255.0 }, // out of range (disable)\n },\n vertexShader: 'varying vec2 vUv;'\n + 'void main() {'\n + ' vUv = uv;'\n + ' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );'\n + ' gl_Position = projectionMatrix * mvPosition;'\n + '}',\n fragmentShader: 'uniform sampler2D segs;'\n + 'uniform sampler2D mux;'\n + 'uniform float idhighlight;'\n + 'varying vec2 vUv;'\n + 'precision lowp float;'\n + 'void main() {'\n + ' float inc = 1.0/255.0;'\n + ' float alpha = 0.0;'\n + ' float w = 0.0010;'\n + ' float h = 0.0015;'\n + ' vec3 yellow = vec3(1.0, 0.857, 0.003);'\n + ' vec3 blue = vec3(0.0, 0.341, 0.643);'\n + ' vec4 m1 = texture2D( mux, vUv + vec2(-w, -h));'\n + ' vec4 m2 = texture2D( mux, vUv + vec2(w, -h));'\n + ' vec4 m3 = texture2D( mux, vUv + vec2(-w, h));'\n + ' vec4 m4 = texture2D( mux, vUv + vec2(w, h));'\n + ' float mix = max(max(m1.r, m2.r), max(m3.r, m4.r));'\n + ' vec4 p = texture2D( segs, vUv );'\n + ' vec4 p0 = texture2D( segs, vUv + vec2(-w, -h));'\n + ' vec4 p1 = texture2D( segs, vUv + vec2(w, -h));'\n + ' vec4 p2 = texture2D( segs, vUv + vec2(-w, h));'\n + ' vec4 p3 = texture2D( segs, vUv + vec2(w, h));'\n + ' float delta = 100.0 * (abs(p0.r-p1.r) + abs(p0.r-p2.r) + abs(p0.r-p3.r) + abs(p1.r-p2.r));'\n + ' if(p.r == idhighlight) alpha = 0.5;'\n + ' if(delta > 0.1) alpha = 1.0;'\n + ' if(alpha < 0.1) discard;'\n + ' gl_FragColor = vec4(blue*mix+yellow*(1.0-mix), alpha);'\n + '}',\n depthWrite: false,\n transparent: true,\n colorWrite: true,\n side: THREE.DoubleSide,\n });\n\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height, depth)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, material)\n\n material.uniforms.segs = segsTex\n material.uniforms.segs.value = segsTex\n material.opacity = 1.0\n material.needsUpdate = true\n material.depthFunc = THREE.AlwaysDepth\n\n intrinsicMesh.visible = isVisible\n intrinsicMesh.name = 'segments outline and highlight'\n return intrinsicMesh\n }\n\n static createDebugSegmentsMesh(intrinsics, width, height, segsTex, depth, isVisible) {\n let intrinsicMesh = null\n\n const material = new THREE.ShaderMaterial({\n vertexShader: 'varying vec2 vUv;' \n + 'void main() {'\n + ' vUv = uv;'\n + ' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );'\n + ' gl_Position = projectionMatrix * mvPosition;'\n + '}',\n fragmentShader: 'uniform sampler2D segs;'\n + 'varying vec2 vUv;'\n + 'precision lowp float;'\n + 'void main() {'\n + ' vec4 normalsSegmenation = texture2D( segs, vUv );'\n + ' float wallIndex = 5.0 + floor((normalsSegmenation.b * 255.0) + 0.5);'\n + ' float r = (mod(wallIndex, 2.0) * 40.0) + (mod(wallIndex, 8.0) * 20.0);'\n + ' float g = (mod(wallIndex, 3.0) * 40.0) + (mod(wallIndex, 7.0) * 20.0);'\n + ' float b = (mod(wallIndex, 4.0) * 40.0) + (mod(wallIndex, 6.0) * 20.0);'\n + ' gl_FragColor = vec4(r / 255.0, g / 255.0, b / 255.0, 0.5);'\n + '}',\n depthWrite: false,\n transparent: true,\n colorWrite: true,\n side: THREE.DoubleSide,\n });\n\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height, depth)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, material)\n\n material.uniforms.segs = segsTex\n material.uniforms.segs.value = segsTex\n material.opacity = 1.0\n material.needsUpdate = true\n material.depthFunc = THREE.AlwaysDepth\n\n intrinsicMesh.visible = isVisible\n intrinsicMesh.name = 'nomrals segmentation visualizer'\n return intrinsicMesh\n }\n\n static createDepthOcclusionFromImage(intrinsics, width, height, itex, depth, isVisible) {\n let intrinsicMesh = null\n const depthUniform = {\n nearfar: { value: new Float32Array([0.2, 30.0]) },\n };\n const material = new THREE.ShaderMaterial({\n uniforms: depthUniform,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n }\n `,\n fragmentShader: `\n uniform vec2 nearfar;\n uniform sampler2D map;\n varying vec2 vUv;\n void main() {\n vec4 fetch = texture2D( map, vUv);\n if(fetch.a < 0.5) discard; // reject floor fragments\n // float z = 0.01 * (fetch.r * 255.0 * 256.0 + fetch.g * 255.0); // 16 bit\n float z = 0.0099609375 * (fetch.r * 65536.0 + fetch.g * 256.0 + fetch.b);\n float a = nearfar[1] / ( nearfar[1] - nearfar[0] );\n float b = nearfar[1] * nearfar[0] / ( nearfar[0] - nearfar[1] );\n gl_FragDepthEXT = ( a + b / z);\n z = (z - nearfar[0])*0.1;\n gl_FragColor = vec4(z, z, z, 1.0);\n }\n `,\n depthWrite: true,\n colorWrite: true,\n side: THREE.DoubleSide,\n stencilWrite: true,\n stencilFunc: THREE.NotEqualStencilFunc,\n stencilRef: 2,\n });\n material.extensions.fragDepth = true\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height, depth)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, material)\n\n const dTex = itex.clone()\n dTex.mapping = THREE.UVMapping\n dTex.wrapS = THREE.ClampToEdgeWrapping\n dTex.wrapT = THREE.ClampToEdgeWrapping\n dTex.magFilter = THREE.NearestFilter\n dTex.minFilter = THREE.NearestFilter\n dTex.anisotropy = 0\n\n dTex.flipY = false\n dTex.needsUpdate = true\n material.uniforms.map = dTex\n material.uniforms.map.value = dTex\n material.opacity = 1.0\n material.needsUpdate = true\n\n const depthPackMaterial = new THREE.ShaderMaterial({\n uniforms: depthUniform,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n }\n `,\n fragmentShader: `\n #include \n uniform vec2 nearfar;\n uniform sampler2D map;\n varying vec2 vUv;\n void main() {\n vec4 fetch = texture2D( map, vUv);\n if(fetch.a < 0.5) discard; // reject floor fragments\n float z = 0.0099609375 * (fetch.r * 65536.0 + fetch.g * 256.0 + fetch.b);\n float a = nearfar[1] / ( nearfar[1] - nearfar[0] );\n float b = nearfar[1] * nearfar[0] / ( nearfar[0] - nearfar[1] );\n gl_FragColor = packDepthToRGBA(a + b / z);\n }\n `,\n depthWrite: true,\n side: THREE.DoubleSide,\n })\n depthPackMaterial.uniforms.map = dTex\n depthPackMaterial.uniforms.map.value = dTex\n depthPackMaterial.opacity = 1.0\n depthPackMaterial.needsUpdate = true\n intrinsicMesh.depthPackMaterial = depthPackMaterial\n\n intrinsicMesh.visible = isVisible\n intrinsicMesh.name = 'depth occlusion modifier'\n return intrinsicMesh\n }\n \n static createDepthMuxOcclusionFromImages(intrinsics, width, height, itex1, itex2, depth, isVisible) {\n let intrinsicMesh = null\n const depthUniform = {\n nearfar: { value: new Float32Array([0.2, 30.0]) },\n };\n const material = new THREE.ShaderMaterial({\n uniforms: depthUniform,\n vertexShader: 'varying vec2 vUv;'\n + 'void main() {'\n + ' vUv = uv;'\n + ' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );'\n + ' gl_Position = projectionMatrix * mvPosition;'\n + '}',\n fragmentShader: 'uniform vec2 nearfar;'\n + 'uniform sampler2D mux;'\n + 'uniform sampler2D map1;'\n + 'uniform sampler2D map2;'\n + 'varying vec2 vUv;'\n + 'void main() {'\n + ' vec4 fetch;'\n + ' vec4 fetchmask = texture2D( mux, vUv );'\n // + ' if(vUv[0] < 0.5) {'\n + ' if(fetchmask.r < 0.5) {'\n + ' fetch = texture2D( map1, vUv);'\n + ' } else {'\n + ' fetch = texture2D( map2, vUv);'\n + ' }'\n + ' if(fetch.a < 0.5) discard;' // reject floor fragments\n // + ' float z = 0.01 * (fetch.r * 255.0 * 256.0 + fetch.g * 255.0);' // 16 bit\n + ' float z = 0.0099609375 * (fetch.r * 65536.0 + fetch.g * 256.0 + fetch.b);'\n + ' float a = nearfar[1] / ( nearfar[1] - nearfar[0] );'\n + ' float b = nearfar[1] * nearfar[0] / ( nearfar[0] - nearfar[1] );'\n + ' gl_FragDepthEXT = ( a + b / z);'\n // + ' z = (z - nearfar[0])*0.1;'\n + ' gl_FragColor = vec4(z, z, z, 1.0);'\n // + ' gl_FragColor = vec4(fetchmask.r, fetchmask.g, fetchmask.b, 1.0);'\n + '}',\n depthTest: true,\n depthWrite: true,\n colorWrite: false,\n side: THREE.DoubleSide,\n });\n material.extensions.fragDepth = true\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height, depth)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, material)\n\n const depthPackMaterial = new THREE.ShaderMaterial({\n uniforms: depthUniform,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n }\n `,\n fragmentShader: `\n #include \n uniform vec2 nearfar;\n uniform sampler2D mux;\n uniform sampler2D map1;\n uniform sampler2D map2;\n varying vec2 vUv;\n void main() {\n vec4 fetch;\n vec4 fetchmask = texture2D( mux, vUv );\n if(fetchmask.r < 0.5) {\n fetch = texture2D( map1, vUv);\n } else {\n fetch = texture2D( map2, vUv);\n }\n if(fetch.a < 0.5) discard; // reject floor fragments\n float z = 0.0099609375 * (fetch.r * 65536.0 + fetch.g * 256.0 + fetch.b);\n float a = nearfar[1] / ( nearfar[1] - nearfar[0] );\n float b = nearfar[1] * nearfar[0] / ( nearfar[0] - nearfar[1] );\n gl_FragColor = packDepthToRGBA(a + b / z);\n }\n `,\n depthTest: true,\n depthWrite: false,\n side: THREE.FrontSide,\n });\n\n const dTex1 = itex1.clone()\n dTex1.mapping = THREE.UVMapping\n dTex1.wrapS = THREE.ClampToEdgeWrapping\n dTex1.wrapT = THREE.ClampToEdgeWrapping\n dTex1.magFilter = THREE.NearestFilter\n dTex1.minFilter = THREE.NearestFilter\n dTex1.anisotropy = 0\n\n dTex1.flipY = false\n dTex1.needsUpdate = true\n material.uniforms.map1 = dTex1\n material.uniforms.map1.value = dTex1\n\n const dTex2 = itex2.clone()\n dTex2.mapping = THREE.UVMapping\n dTex2.wrapS = THREE.ClampToEdgeWrapping\n dTex2.wrapT = THREE.ClampToEdgeWrapping\n dTex2.magFilter = THREE.NearestFilter\n dTex2.minFilter = THREE.NearestFilter\n dTex2.anisotropy = 0\n\n dTex2.flipY = false\n dTex2.needsUpdate = true\n material.uniforms.map2 = dTex2\n material.uniforms.map2.value = dTex2\n\n material.opacity = 1.0\n material.needsUpdate = true\n\n intrinsicMesh.visible = isVisible\n intrinsicMesh.name = 'depth occlusion modifiermux'\n\n depthPackMaterial.uniforms.map1 = dTex1\n depthPackMaterial.uniforms.map1.value = dTex1\n depthPackMaterial.uniforms.map2 = dTex2\n depthPackMaterial.uniforms.map2.value = dTex2\n depthPackMaterial.opacity = 1.0\n depthPackMaterial.needsUpdate = true\n intrinsicMesh.depthPackMaterial = depthPackMaterial\n\n return intrinsicMesh\n }\n\n static applyMaskTexToShader(tgtmat, tex) {\n // eslint-disable-next-line no-param-reassign\n tgtmat.uniforms.mux = tex\n // eslint-disable-next-line no-param-reassign\n tgtmat.uniforms.mux.value = tex\n // eslint-disable-next-line no-param-reassign\n tgtmat.needsUpdate = true\n }\n\n static setOcclusionNearFar(depthMesh, near, far) {\n if (depthMesh) {\n // eslint-disable-next-line no-param-reassign\n depthMesh.material.uniforms.nearfar.value = new Float32Array([near, far])\n }\n }\n\n static createIntrinsicDepthGeom(intrinsics, width, height, idata, floor, textured, offset) {\n const xsize = width / intrinsics[0]\n const ysize = height / intrinsics[1]\n\n const xoffset = -xsize / 2 + (width * 0.5 - intrinsics[2]) / intrinsics[0]\n const yoffset = -ysize / 2 + (height * 0.5 - intrinsics[3]) / intrinsics[1]\n\n const vert = []\n const tex = []\n const index = []\n const divx = 600\n const divy = 300\n const incx = 1.0 / divx\n const incy = 1.0 / divy\n let pos = 0\n // let max = 0\n for (let y = 0.0; y <= 1.0001; y += incy) {\n for (let x = 0.0; x <= 1.00001; x += incx) {\n const ypos = Math.floor(y * (idata.height - 1))\n const xpos = Math.floor(x * (idata.width - 1))\n const dpix = (xpos + (ypos * idata.width)) * 4\n const depthi = idata.data[dpix] * 256 * 256 + idata.data[dpix + 1] * 256 + idata.data[dpix + 2]\n const depthm = depthi * 0.0000390625 - offset\n\n // eslint-disable-next-line no-restricted-globals\n // if (isNaN(depthm)) {\n // console.log('NaN')\n // }\n vert.push((xoffset + xsize * x) * depthm)\n vert.push(-(yoffset + ysize * y) * depthm)\n vert.push(-depthm)\n tex.push(x)\n tex.push(y)\n if (x < 0.9999 && y < 0.9999 && (floor || idata.data[dpix + 3] > 127)) {\n index.push(pos, pos + 1, pos + divx + 1)\n index.push(pos + 1, pos + divx + 2, pos + divx + 1)\n\n // const tmp = (pos + 1, pos + divx + 2, pos + divx + 1)\n // if (tmp > max) {\n // max = tmp\n // }\n }\n pos += 1\n }\n }\n\n const intrinsicGeom = new THREE.BufferGeometry()\n intrinsicGeom.setAttribute('position', new THREE.Float32BufferAttribute(vert, 3))\n if (textured) {\n intrinsicGeom.setAttribute('uv', new THREE.Float32BufferAttribute(tex, 2))\n }\n intrinsicGeom.setIndex(index)\n\n return intrinsicGeom\n }\n\n static createMeshOcclusionFromImage(intrinsics, width, height, idata, isVisible) {\n const material = new THREE.MeshBasicMaterial({ color: 0x000000, side: THREE.DoubleSide })\n material.colorWrite = false\n\n const intrinsicRect = WallspiceWebgl.createIntrinsicDepthGeom(\n intrinsics, width, height, idata, false, false, 0.01)\n const intrinsicMesh = new THREE.Mesh(intrinsicRect, material)\n\n intrinsicMesh.name = 'depth occlusion modifier'\n intrinsicMesh.visible = isVisible\n material.needsUpdate = true\n\n return intrinsicMesh\n }\n\n static createWall(intrinsics, width, height, fgUrl, depth) {\n let intrinsicMesh = null\n\n const fgM = new THREE.MeshBasicMaterial({ color: 0xFFFFFF, side: THREE.DoubleSide })\n fgM.transparent = true\n fgM.alphaTest = 0.5\n fgM.opacity = 0.0 // keep invisible until texload lmbda completes\n fgM.depthTest = true\n fgM.depthWrite = true\n\n // add background to scene\n const intrinsicRect = WallspiceWebgl.intrinsicsRectGeo(intrinsics, width, height, depth)\n intrinsicMesh = new THREE.Mesh(intrinsicRect, fgM)\n\n const tloader = new THREE.TextureLoader()\n // tloader.setPath(this.furnitureData.pathUrl);\n tloader.load(fgUrl, (fgTex) => {\n // eslint-disable-next-line no-param-reassign\n fgTex.flipY = false\n // eslint-disable-next-line no-param-reassign\n fgTex.needsUpdate = true\n fgM.map = fgTex\n fgM.opacity = 1.0;\n fgM.needsUpdate = true\n })\n\n intrinsicMesh.name = 'occlusion image'\n return intrinsicMesh\n }\n\n static createMat4(rotation, position, outMat) {\n tmpXAxis.set(rotation[0][0], rotation[0][1], rotation[0][2])\n tmpYAxis.set(rotation[1][0], rotation[1][1], rotation[1][2])\n tmpZAxis.set(rotation[2][0], rotation[2][1], rotation[2][2])\n tmpMat4.makeBasis(tmpXAxis, tmpYAxis, tmpZAxis)\n tmpMat4.setPosition(new THREE.Vector3(position[0], position[1], position[2]))\n outMat.copy(tmpMat4)\n }\n\n static unproj(p2, d, fx, fy, cx, cy) {\n return [(p2[0] - cx) / fx * d, -(p2[1] - cy) / fy * d, -d]\n }\n\n static proj(p3, fx, fy, cx, cy) {\n return [-p3[0] * fx / p3[2] + cx, p3[1] * fy / p3[2] + cy]\n }\n\n static projBoundBox(objMat, bbox, projMat) {\n const boxCorners = [\n new THREE.Vector3(bbox.min.x, bbox.max.y, bbox.max.z),\n new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.max.z),\n new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.min.z),\n new THREE.Vector3(bbox.min.x, bbox.max.y, bbox.min.z),\n new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.max.z),\n new THREE.Vector3(bbox.max.x, bbox.min.y, bbox.max.z),\n new THREE.Vector3(bbox.max.x, bbox.min.y, bbox.min.z),\n new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.min.z),\n ]\n\n const screenbox = new THREE.Box3();\n\n boxCorners.forEach((point) => {\n point.applyMatrix4(objMat)\n point.applyMatrix4(projMat)\n screenbox.expandByPoint(point)\n })\n\n return [\n [0.5 * (screenbox.min.x + 1), 1.0 - 0.5 * (screenbox.max.y + 1)],\n [0.5 * (screenbox.max.x + 1), 1.0 - 0.5 * (screenbox.max.y + 1)],\n [0.5 * (screenbox.max.x + 1), 1.0 - 0.5 * (screenbox.min.y + 1)],\n [0.5 * (screenbox.min.x + 1), 1.0 - 0.5 * (screenbox.min.y + 1)]]\n }\n\n static projArtCorners(pose, artSize) {\n const x_axis = pose.rot[0]\n const y_axis = pose.rot[1]\n const P = pose.pos\n\n const { scale } = pose\n\n const depth_fx = pose.depth[0]\n const depth_fy = pose.depth[1]\n const depth_cx = pose.depth[2]\n const depth_cy = pose.depth[3]\n\n const x_step = [0.5 * artSize[0] * x_axis[0], 0.5 * artSize[0] * x_axis[1], 0.5 * artSize[0] * x_axis[2]]\n const y_step = [0.5 * artSize[1] * y_axis[0], 0.5 * artSize[1] * y_axis[1], 0.5 * artSize[1] * y_axis[2]]\n const Q1 = numeric.add(numeric.sub(P, x_step), y_step)\n const Q2 = numeric.add(numeric.add(P, x_step), y_step)\n const Q3 = numeric.sub(numeric.add(P, x_step), y_step)\n const Q4 = numeric.sub(numeric.sub(P, x_step), y_step)\n\n const q1 = numeric.div(WallspiceWebgl.proj(Q1, depth_fx, depth_fy, depth_cx, depth_cy), scale)\n const q2 = numeric.div(WallspiceWebgl.proj(Q2, depth_fx, depth_fy, depth_cx, depth_cy), scale)\n const q3 = numeric.div(WallspiceWebgl.proj(Q3, depth_fx, depth_fy, depth_cx, depth_cy), scale)\n const q4 = numeric.div(WallspiceWebgl.proj(Q4, depth_fx, depth_fy, depth_cx, depth_cy), scale)\n\n return [q1, q2, q3, q4]\n }\n\n static generatePose(intrinsics, wallDimensions, depthImage, mousePosition) {\n const radius = 5\n const depth_fx = intrinsics[0]\n const depth_fy = intrinsics[1]\n const depth_cx = intrinsics[2]\n const depth_cy = intrinsics[3]\n\n const scale = depthImage.width / wallDimensions[0]\n const pixPos = [Math.floor(mousePosition[0] * scale), Math.floor(mousePosition[1] * scale)]\n\n const P3 = [[]]\n let count = 0\n let idx = 0\n let mu = [0, 0, 0]\n for (let i = -radius; i <= radius; i += 1) {\n for (let j = -radius; j <= radius; j += 1) {\n const r = i + pixPos[1]\n const c = j + pixPos[0]\n if (i === 0 && j === 0) {\n idx = count\n }\n if (r >= 0 && r < depthImage.height && c >= 0 && c < depthImage.width) {\n const pixel_index = r * depthImage.width + c\n const d = depthImage.data[pixel_index]\n P3[count] = WallspiceWebgl.unproj([c, r], d, depth_fx, depth_fy, depth_cx, depth_cy)\n mu = numeric.add(mu, P3[idx])\n count += 1\n }\n }\n }\n mu = numeric.div(mu, count)\n for (let i = 0; i < count; i += 1) {\n P3[i] = numeric.sub(P3[i], mu)\n }\n // TODO: replace these functions\n // const cov = numeric.dotMMsmall(numeric.transpose(P3), P3)\n // const svdP3 = svd(array2mat(cov), 'full')\n // const vt = transposeMatrix(svdP3.V)\n const vt = null\n\n if (!vt) {\n return null\n }\n\n const pos = numeric.add(P3[idx], mu)\n\n let z = [vt.val[6], vt.val[7], vt.val[8]]\n if (numeric.dotVV(z, pos) > 0) {\n z = [-z[0], -z[1], -z[2]]\n }\n\n let x = [1, 0, 0]\n let y = [0, 1, 0]\n let normz;\n if (Math.abs(z[0]) > Math.abs(z[1])) {\n z = [z[0], 0, z[2]]\n normz = numeric.norm2(z)\n z = [z[0] / normz, 0, z[2] / normz]\n x = [z[2], 0, -z[0]]\n } else {\n z = [0, z[1], z[2]]\n normz = numeric.norm2(z)\n z = [0, z[1] / normz, z[2] / normz]\n y = [0, z[2], -z[1]]\n }\n\n const rot = [x, y, z]\n\n const depth = [\n depth_fx,\n depth_fy,\n depth_cx,\n depth_cy,\n ]\n\n return {\n rot,\n pos,\n scale,\n depth,\n planeIndex: 0,\n }\n }\n\n static generatePose24bitCM(intrinsics, planes) {\n const depth_fx = intrinsics[0]\n const depth_fy = intrinsics[1]\n const depth_cx = intrinsics[2]\n const depth_cy = intrinsics[3]\n\n const pos = [0, -1.1, -1.6]\n // const rot = [[1.0, 0.0, 0.0], [0.0, 0.0, -1.0], [0.0, 1.0, 0.0]]\n const scale = 1.0\n\n const floor = getFloorPlane(planes)\n const rot = floor.rot\n const depth = [\n depth_fx,\n depth_fy,\n depth_cx,\n depth_cy,\n ]\n\n return {\n rot,\n pos,\n scale,\n depth,\n planeIndex: 1,\n }\n }\n\n static generatePoseFromPlanes(intrinsics, planes, maskImage, position, isFurniture, defaultToFloor, isRug, halfHeight = 0.4) {\n if (!maskImage || !maskImage.data) {\n return null\n }\n // planes is the result from the plane equation calc\n // maskImage is in RGBA format\n // example: a 1 in the blue channel indicate wall index 0\n\n const pixPos = [Math.floor(position[0]), Math.floor(position[1])]\n let plane_index = maskImage.data[pixPos[1] * maskImage.width * 4 + pixPos[0] * 4 + 2]\n // If we're dragging furniture and don't find a plane\n // conditionally use the first floor plane we can find\n if (!plane_index && defaultToFloor && isFurniture) {\n plane_index = getFloorIndex(planes) + 1\n }\n if (!plane_index) {\n return null\n }\n\n const plane = planes[plane_index - 1]\n if (!plane) {\n return null\n }\n if (isFurniture !== (plane.class === 'floor')) {\n return null\n }\n const ret = WallspiceWebgl.generatePoseFromPlane(plane, position, intrinsics, isRug)\n ret.planeIndex = plane_index - 1\n\n if(!isFurniture) {\n const floor_index = getFloorIndex(planes)\n const narr = planes[floor_index].rot[2]\n const n = new THREE.Vector3(narr[0], narr[1], narr[2])\n const p = new THREE.Vector3(ret.pos[0], ret.pos[1], ret.pos[2])\n const d = n.dot(p) + planes[floor_index].d\n if(d < halfHeight) return null\n }\n return ret\n }\n\n static generatePoseFromPlane(plane, position, intrinsics, isRug) {\n const depth_fx = intrinsics[0]\n const depth_fy = intrinsics[1]\n const depth_cx = intrinsics[2]\n const depth_cy = intrinsics[3]\n\n const z = plane.rot[2]\n const { d } = plane\n const delta = isRug ? 0.0 : RUG_SUB_LAYER_DELTA\n // if (z[2] < 0) {\n // z = [-z[0], -z[1], -z[2]]\n // }\n\n let line = WallspiceWebgl.unproj(position, 1.0, depth_fx, depth_fy, depth_cx, depth_cy)\n line = numeric.mul(line, 1.0 / numeric.norm2(line))\n const t = -(d - delta) / numeric.dotVV(z, line)\n const pos = numeric.mul(line, t)\n\n const x = plane.rot[0]\n const y = plane.rot[1]\n // if (y[1] > 0) {\n // x = [-x[0], -x[1], -x[2]]\n // } else {\n // y = [-y[0], -y[1], -y[2]]\n // }\n\n const rot = [x, y, z];\n\n const depth = [\n depth_fx,\n depth_fy,\n depth_cx,\n depth_cy,\n ]\n\n const scale = 1.0\n\n return {\n rot,\n pos,\n scale,\n depth,\n }\n }\n\n static findPlaceableWallPositions(wallData, width, height, wallIDs) {\n if (wallData && wallIDs && wallIDs.length > 0) {\n const poss = []\n const midx = Math.floor(wallData.width / 2)\n const midy = Math.floor(wallData.height / 2)\n const starty = midy - 75\n for (let x = midx; x < wallData.width - 100 && x > 100;) {\n for (let y = starty; y < wallData.height - 150 && y > 150;) {\n const id = wallData.data[(y * wallData.width + x) * 4 + 2]\n const idoffset = wallData.data[((y + 150) * wallData.width + x) * 4 + 2]\n if (wallIDs.includes(id) && wallIDs.includes(idoffset)) {\n poss.push([width * (x / wallData.width), height * (y / wallData.height)])\n }\n y = starty - (y - starty)\n if (y <= starty) {\n y -= 150\n }\n }\n x = midx - (x - midx)\n if (x >= midx) {\n x += 150\n }\n }\n return poss\n }\n return null\n }\n\n static findPlaceableFloorPositions(occlusionData, width, height) {\n const poss = []\n\n if (occlusionData) {\n const midx = Math.floor(occlusionData.width / 2)\n const midy = Math.floor(occlusionData.height / 2)\n for (let x = midx; x < occlusionData.width - 100 && x > 100;) {\n for (let y = occlusionData.height - 50; y > midy; y -= 50) {\n if (occlusionData.data[(y * occlusionData.width + x) * 4 + 3] < 128) {\n poss.push([width * (x / occlusionData.width), height * (y / occlusionData.height)])\n }\n }\n x = midx - (x - midx)\n if (x >= midx) {\n x += 100\n }\n }\n }\n if (poss.length > 1) {\n return poss\n }\n return [[width / 2.0, height - 100.0]]\n }\n\n static generateLightUvs(wallSize, corners) {\n const uvs = [[], [], [], []]\n for (let i = 0; i < 4; i += 1) {\n uvs[i] = [corners[i][0] / wallSize[0], 1.0 - corners[i][1] / wallSize[1]];\n }\n const lightUvs = new Float32Array([\n uvs[2][0], uvs[2][1],\n uvs[1][0], uvs[1][1],\n uvs[3][0], uvs[3][1],\n uvs[3][0], uvs[3][1],\n uvs[1][0], uvs[1][1],\n uvs[0][0], uvs[0][1],\n ])\n return lightUvs\n }\n\n static setShadowMeshDirection(shadowMesh, dirVec2) {\n if (shadowMesh) {\n // eslint-disable-next-line no-param-reassign\n shadowMesh.material.uniforms.shadow.value = new Float32Array([dirVec2[0], dirVec2[1]])\n }\n }\n\n static makeFrameShadow(L, R, B, T, iL, iR, iB, iT, iD, inL, outL) {\n const shadowUniform = {\n shadow: { value: new Float32Array([1, -1.0]) },\n };\n const material = new THREE.ShaderMaterial({\n uniforms: shadowUniform,\n vertexShader: 'uniform vec2 shadow;'\n + 'attribute float alpha;'\n + 'attribute float distance;'\n + 'attribute float spread;'\n + 'varying float vAlpha;'\n + 'void main() {'\n + ' vAlpha = alpha;'\n + ' vec2 offset = vec2(-shadow[1], shadow[0]) * spread;'\n + ' vec3 displaced = position + vec3(offset + shadow * distance, 0.0);'\n + ' vec4 mvPosition = modelViewMatrix * vec4( displaced, 1.0 );'\n + ' gl_PointSize = 8.0;'\n + ' gl_Position = projectionMatrix * mvPosition;'\n + '}',\n fragmentShader: 'varying float vAlpha;'\n + 'void main() {'\n + 'gl_FragColor = vec4( 0.0, 0.0, 0.0, vAlpha );'\n + '}',\n transparent: true,\n depthWrite: false,\n side: THREE.FrontSide,\n });\n const geometry = WallspiceWebgl.makeFrameShadowGeo(L, R, B, T, iL, iR, iB, iT, iD, inL, outL)\n return new THREE.Mesh(geometry, material)\n }\n\n static makeFrameShadowGeo(L, R, B, T, iL, iR, iB, iT, iD, inL, outL) {\n const distance = 0.02 // AO distance\n const density1 = 0.05 // AO density\n const density2 = 0.3 * 0.2 // shadow density 1/5th there are multiple copies to soften\n const density3 = 0.15 // shadow density inner frame\n const slen = outL // shadow length outer\n const spr = 0.5 // shadow spread factor (corner edge softness with distance)\n const slengthI = inL // shadow length inner\n const offset = 0.001 // zfight offset for inner frame\n const walloffset = 0.007 // zfight offset for wall\n const geo = new THREE.BufferGeometry();\n const vpos = []\n const transp = []\n const extrusion = []\n const ortho = []\n const indices = []\n\n // ## Positions ##\n // AO halo\n vpos.push(L, T, walloffset)\n vpos.push(L - distance, T + distance, walloffset)\n vpos.push(L, B, 0)\n vpos.push(L - distance, B - distance, walloffset)\n vpos.push(R, B, 0)\n vpos.push(R + distance, B - distance, walloffset)\n vpos.push(R, T, 0)\n vpos.push(R + distance, T + distance, walloffset)\n\n // 5x Outer shadow\n for (let i = 0; i < 5; i += 1) {\n vpos.push(L, T, walloffset)\n vpos.push(L, T, walloffset)\n vpos.push(L, B, walloffset)\n vpos.push(L, B, walloffset)\n vpos.push(R, B, walloffset)\n vpos.push(R, B, walloffset)\n vpos.push(R, T, walloffset)\n vpos.push(R, T, walloffset)\n }\n\n // Inner shadow\n vpos.push(iL, iT, iD + offset)\n vpos.push(iL, iT, iD + offset)\n vpos.push(iL, iB, iD + offset)\n vpos.push(iL, iB, iD + offset)\n vpos.push(iR, iB, iD + offset)\n vpos.push(iR, iB, iD + offset)\n vpos.push(iR, iT, iD + offset)\n vpos.push(iR, iT, iD + offset)\n\n // ## per vertex alpha (darkness) **\n transp.push(density1, 0, density1, 0, density1, 0, density1, 0) // AO\n transp.push(density2, 0, density2, 0, density2, 0, density2, 0) // 5x outer shadow\n transp.push(density2, 0, density2, 0, density2, 0, density2, 0)\n transp.push(density2, 0, density2, 0, density2, 0, density2, 0)\n transp.push(density2, 0, density2, 0, density2, 0, density2, 0)\n transp.push(density2, 0, density2, 0, density2, 0, density2, 0)\n transp.push(0, density3, 0, density3, 0, density3, 0, density3) // Inner Shadow\n\n // ## degenerate extrusion magnitude ##\n extrusion.push(0, 0, 0, 0, 0, 0, 0, 0) // AO\n extrusion.push(0, slen, 0, slen, 0, slen, 0, slen) // 5x outer shadow\n extrusion.push(0, slen, 0, slen, 0, slen, 0, slen)\n extrusion.push(0, slen, 0, slen, 0, slen, 0, slen)\n extrusion.push(0, slen, 0, slen, 0, slen, 0, slen)\n extrusion.push(0, slen, 0, slen, 0, slen, 0, slen)\n extrusion.push(slengthI, 0, slengthI, 0, slengthI, 0, slengthI, 0) // Inner Shadow\n\n // ## degenerate orthogonal magnitude ##\n ortho.push(0, 0, 0, 0, 0, 0, 0, 0) // AO\n ortho.push(0, slen * spr, 0, slen * spr, 0, slen * spr, 0, slen * spr) // 5x outer shadow\n ortho.push(0, slen * spr * 0.5, 0, slen * spr * 0.5, 0, slen * spr * 0.5, 0, slen * spr * 0.5)\n ortho.push(0, 0, 0, 0, 0, 0, 0, 0)\n ortho.push(0, slen * -spr * 0.5, 0, slen * -spr * 0.5, 0, slen * -spr * 0.5, 0, slen * -spr * 0.5)\n ortho.push(0, slen * -spr, 0, slen * -spr, 0, slen * -spr, 0, slen * -spr)\n ortho.push(0, 0, 0, 0, 0, 0, 0, 0) // Inner Shadow\n\n // ## indices ##\n let count = 0;\n for (let i = 0; i < 7; i += 1) {\n indices.push(count + 0, count + 1, count + 2)\n indices.push(count + 2, count + 1, count + 3)\n indices.push(count + 2, count + 3, count + 4)\n indices.push(count + 4, count + 3, count + 5)\n indices.push(count + 4, count + 5, count + 6)\n indices.push(count + 6, count + 5, count + 7)\n indices.push(count + 6, count + 7, count + 0)\n indices.push(count + 0, count + 7, count + 1)\n count += 8\n }\n\n geo.setAttribute('position', new THREE.Float32BufferAttribute(vpos, 3));\n geo.setAttribute('alpha', new THREE.Float32BufferAttribute(transp, 1));\n geo.setAttribute('distance', new THREE.Float32BufferAttribute(extrusion, 1));\n geo.setAttribute('spread', new THREE.Float32BufferAttribute(ortho, 1));\n geo.setIndex(indices);\n\n return geo\n }\n\n static extrudeFrame(L, R, B, T, depth, uscale, vscale, xSect) {\n const geo = new THREE.BufferGeometry();\n\n if (xSect.length < 2) {\n return null\n }\n\n let length = 0;\n let trueLength = 0;\n for (let i = 0; i < xSect.length - 1; i += 1) {\n const v1 = xSect[i]\n const v2 = xSect[i + 1]\n const delta = [v2[0] - v1[0], v2[1] - v1[1]];\n trueLength += Math.sqrt(delta[0] * delta[0] + delta[1] * delta[1])\n length += delta[0];\n }\n\n const Xlength = (R - L) + length + length\n const Ylength = (T - B) + length + length\n const Xchamf = length / Xlength;\n const Ychamf = length / Ylength;\n\n let innerV = 0;\n let outerV = 0;\n let innerU = 0;\n let outerU = 0;\n\n // eslint-disable-next-line no-array-constructor\n const pos = new Array()\n // eslint-disable-next-line no-array-constructor\n const ind = new Array()\n // eslint-disable-next-line no-array-constructor\n const uv = new Array()\n for (let i = 0; i < xSect.length - 1; i += 1) {\n const indexBase = i * 8\n const v1 = xSect[i]\n const v2 = xSect[i + 1]\n innerV = outerV\n innerU = outerU\n const delta = [v2[0] - v1[0], v2[1] - v1[1]]\n outerV += Math.sqrt(delta[0] * delta[0] + delta[1] * delta[1]) / trueLength\n outerU += delta[0] / length\n\n pos.push(\n L - v1[0], T + v1[0], v1[1] + depth,\n L - v2[0], T + v2[0], v2[1] + depth,\n L - v1[0], B - v1[0], v1[1] + depth,\n L - v2[0], B - v2[0], v2[1] + depth,\n R + v1[0], B - v1[0], v1[1] + depth,\n R + v2[0], B - v2[0], v2[1] + depth,\n R + v1[0], T + v1[0], v1[1] + depth,\n R + v2[0], T + v2[0], v2[1] + depth\n );\n // left\n let voffset = 0\n ind.push(indexBase + 0, indexBase + 1, indexBase + 2)\n ind.push(indexBase + 2, indexBase + 1, indexBase + 3)\n uv.push(\n (1 - Ychamf + innerU * Ychamf) * uscale, innerV * vscale + voffset,\n (1 - Ychamf + outerU * Ychamf) * uscale, outerV * vscale + voffset,\n (Ychamf - Ychamf * innerU) * uscale, innerV * vscale + voffset,\n )\n uv.push(\n (Ychamf - Ychamf * innerU) * uscale, innerV * vscale + voffset,\n (1 - Ychamf + outerU * Ychamf) * uscale, outerV * vscale + voffset,\n (Ychamf - Ychamf * outerU) * uscale, outerV * vscale + voffset,\n )\n // bottom\n voffset += vscale\n while (voffset > 0.99) voffset -= 1.0\n ind.push(indexBase + 2, indexBase + 3, indexBase + 4)\n ind.push(indexBase + 4, indexBase + 3, indexBase + 5)\n uv.push(\n (1 - Xchamf + innerU * Xchamf) * uscale, innerV * vscale + voffset,\n (1 - Xchamf + outerU * Xchamf) * uscale, outerV * vscale + voffset,\n (Xchamf - Xchamf * innerU) * uscale, innerV * vscale + voffset,\n )\n uv.push(\n (Xchamf - Xchamf * innerU) * uscale, innerV * vscale + voffset,\n (1 - Xchamf + outerU * Xchamf) * uscale, outerV * vscale + voffset,\n (Xchamf - Xchamf * outerU) * uscale, outerV * vscale + voffset,\n )\n // right\n voffset += vscale\n while (voffset > 0.99) voffset -= 1.0\n ind.push(indexBase + 4, indexBase + 5, indexBase + 6)\n ind.push(indexBase + 6, indexBase + 5, indexBase + 7)\n uv.push(\n (1 - Ychamf + innerU * Ychamf) * uscale, innerV * vscale + voffset,\n (1 - Ychamf + outerU * Ychamf) * uscale, outerV * vscale + voffset,\n (Ychamf - Ychamf * innerU) * uscale, innerV * vscale + voffset,\n )\n uv.push(\n (Ychamf - Ychamf * innerU) * uscale, innerV * vscale + voffset,\n (1 - Ychamf + outerU * Ychamf) * uscale, outerV * vscale + voffset,\n (Ychamf - Ychamf * outerU) * uscale, outerV * vscale + voffset,\n )\n // top\n voffset += vscale\n while (voffset > 0.99) voffset -= 1.0\n ind.push(indexBase + 6, indexBase + 7, indexBase + 0)\n ind.push(indexBase + 0, indexBase + 7, indexBase + 1)\n uv.push(\n (1 - Xchamf + innerU * Xchamf) * uscale, innerV * vscale + voffset,\n (1 - Xchamf + outerU * Xchamf) * uscale, outerV * vscale + voffset,\n (Xchamf - Xchamf * innerU) * uscale, innerV * vscale + voffset,\n )\n uv.push(\n (Xchamf - Xchamf * innerU) * uscale, innerV * vscale + voffset,\n (1 - Xchamf + outerU * Xchamf) * uscale, outerV * vscale + voffset,\n (Xchamf - Xchamf * outerU) * uscale, outerV * vscale + voffset,\n )\n }\n\n // eslint-disable-next-line no-array-constructor\n const pos2 = new Array()\n ind.forEach((index) => {\n pos2.push(pos[index * 3])\n pos2.push(pos[index * 3 + 1])\n pos2.push(pos[index * 3 + 2])\n })\n\n geo.setAttribute('position', new THREE.Float32BufferAttribute(pos2, 3))\n geo.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2))\n // geo.setIndex(ind)\n geo.computeVertexNormals()\n geo.verticesNeedUpdate = true\n geo.uvsNeedUpdate = true\n geo.computeBoundingSphere()\n\n return geo\n }\n\n // create canvas of stated width, height, depth and wrap uv around edge depth if wrap is true\n static makeCanvasGeometry(width, height, depth, wrap) {\n const geo = new THREE.BufferGeometry();\n let uL = 0;\n let uR = 1;\n let vB = 0;\n let vT = 1;\n\n if (wrap) {\n uL = depth / (width + depth * 2);\n uR = 1 - uL;\n vB = depth / (height + depth * 2);\n vT = 1 - vB;\n }\n\n // eslint-disable-next-line no-array-constructor\n const pos = new Array()\n // eslint-disable-next-line no-array-constructor\n const ind = new Array()\n // eslint-disable-next-line no-array-constructor\n const uv = new Array()\n\n pos.push(-width * 0.5, height * 0.5, depth)\n pos.push(-width * 0.5, -height * 0.5, depth)\n pos.push(width * 0.5, height * 0.5, depth)\n pos.push(width * 0.5, -height * 0.5, depth)\n pos.push(-width * 0.5, height * 0.5, 0.0)\n pos.push(-width * 0.5, -height * 0.5, 0.0)\n pos.push(width * 0.5, height * 0.5, 0.0)\n pos.push(width * 0.5, -height * 0.5, 0.0)\n\n uv.push(uL, vT)\n uv.push(uL, vB)\n uv.push(uR, vT)\n uv.push(uR, vB)\n uv.push(0.0, 1.0)\n uv.push(0.0, 0.0)\n uv.push(1.0, 1.0)\n uv.push(1.0, 0.0)\n\n ind.push(0, 1, 2)\n ind.push(2, 1, 3)\n // left\n ind.push(0, 4, 1)\n ind.push(1, 4, 5)\n // right\n ind.push(3, 7, 2)\n ind.push(2, 7, 6)\n // bottom\n ind.push(1, 5, 3)\n ind.push(3, 5, 7)\n // top\n ind.push(2, 6, 0)\n ind.push(0, 6, 4)\n\n // must deindex for flat shading normals\n // eslint-disable-next-line no-array-constructor\n const pos2 = new Array()\n // eslint-disable-next-line no-array-constructor\n const uv2 = new Array()\n ind.forEach((index) => {\n pos2.push(pos[index * 3])\n pos2.push(pos[index * 3 + 1])\n pos2.push(pos[index * 3 + 2])\n uv2.push(uv[index * 2])\n uv2.push(uv[index * 2 + 1])\n })\n\n geo.setAttribute('position', new THREE.Float32BufferAttribute(pos2, 3))\n geo.setAttribute('uv', new THREE.Float32BufferAttribute(uv2, 2))\n geo.computeVertexNormals()\n geo.verticesNeedUpdate = true\n geo.uvsNeedUpdate = true\n geo.computeBoundingSphere()\n\n return geo\n }\n\n static createBoundingBox(bbox) {\n const geometry = new THREE.BoxBufferGeometry(\n bbox.max.x - bbox.min.x,\n bbox.max.y - bbox.min.y,\n bbox.max.z - bbox.min.z,\n )\n geometry.translate(\n (bbox.max.x - bbox.min.x) * -0.5 + bbox.max.x,\n (bbox.max.y - bbox.min.y) * -0.5 + bbox.max.y,\n (bbox.max.z - bbox.min.z) * -0.5 + bbox.max.z,\n )\n\n const edges = new THREE.EdgesGeometry(geometry)\n const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({\n color: 0xffdb00,\n transparent: true,\n depthFunc: THREE.AlwaysDepth,\n }))\n return line\n }\n\n static createBoundingBoxMesh(bbox, scalefactor = 1.0) {\n const shape = new THREE.Shape()\n\n const r = scalefactor / 2.0\n shape.moveTo(-r, -r)\n shape.lineTo(r, -r)\n shape.lineTo(r, r)\n shape.lineTo(-r, r)\n shape.lineTo(-r, -r)\n\n const d = scalefactor / 4.0\n\n const curve = new THREE.CatmullRomCurve3([\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.min.z + d),\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.min.z + d),\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.min.z + d),\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.max.z - d),\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.max.z - d),\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.max.z - d),\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.max.z - d),\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.min.z + d),\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.min.z + d),\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.min.z + d),\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.max.z - d),\n new THREE.Vector3(bbox.max.x - d, bbox.min.y + d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.max.z - d),\n new THREE.Vector3(bbox.max.x - d, bbox.max.y - d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.max.z - d),\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.max.z - d),\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.max.z - d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.min.z + d),\n new THREE.Vector3(bbox.min.x + d, bbox.min.y + d, bbox.min.z + d),\n\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.min.z + d),\n new THREE.Vector3(bbox.min.x + d, bbox.max.y - d, bbox.min.z + d),\n ])\n curve.curveType = 'catmullrom'\n curve.tension = 0.01\n const extrudeSettings = {\n steps: 300, // needs excessive subdivision to reasonably approximate the corners\n extrudePath: curve,\n };\n\n const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings)\n\n const wirecolor = 0x3bc1c8\n const mat = new THREE.MeshBasicMaterial({\n color: wirecolor, wireframe: false, transparent: true, depthFunc: THREE.AlwaysDepth,\n })\n const mesh = new THREE.Mesh(geometry, mat)\n return mesh\n }\n\n static cardinalToVector(lightDirection) {\n let xcast;\n let ycast;\n switch (lightDirection) { // convert cardinal direction to shadow displacement\n case 0: // S\n xcast = 0;\n ycast = -1;\n break;\n case 1: // SW\n xcast = -1;\n ycast = -1;\n break;\n case 2: // W\n xcast = -1;\n ycast = 0;\n break;\n case 3: // NW\n xcast = -1;\n ycast = 1;\n break;\n case 4: // N\n xcast = 0;\n ycast = 1;\n break;\n case 5: // NE\n xcast = 1;\n ycast = 1;\n break;\n case 6: // E\n xcast = 1;\n ycast = 0;\n break;\n case 7: // SE\n xcast = 1;\n ycast = -1;\n break;\n default:\n xcast = 1\n ycast = -1\n }\n return [xcast, ycast]\n }\n\n static screenToPlaneWorld(screenPos, plane, intrinsics) {\n\n const fx = intrinsics[0]\n const fy = intrinsics[1]\n const cx = intrinsics[2]\n const cy = intrinsics[3]\n\n const d = plane.d\n const zhat = plane.rot[2]\n\n const line = WallspiceWebgl.unproj(\n screenPos, 1, fx, fy, cx, cy\n )\n\n const t = -d / (\n + zhat[0] * line[0]\n + zhat[1] * line[1]\n + zhat[2] * line[2]\n )\n\n return [\n t * line[0],\n t * line[1],\n t * line[2]\n ]\n }\n\n static worldToPlane(plane, pos) {\n\n const d = plane.d\n\n const xh = plane.rot[0]\n const yh = plane.rot[1]\n const zh = plane.rot[2]\n\n const p0 = [\n -d * zh[0],\n -d * zh[1],\n -d * zh[2]\n ]\n\n const p = [\n pos[0] - p0[0],\n pos[1] - p0[1],\n pos[2] - p0[2]\n ]\n\n const px = p[0] * xh[0] + p[1] * xh[1] + p[2] * xh[2]\n const py = p[0] * yh[0] + p[1] * yh[1] + p[2] * yh[2]\n const pz = p[0] * zh[0] + p[1] * zh[1] + p[2] * zh[2]\n\n return [px, py, pz]\n }\n\n static planeToWorld(plane, pos) {\n\n const p = [\n pos[0],\n pos[1],\n 0\n ]\n\n if( pos.length === 3 ) {\n p[2] = pos[2]\n }\n \n const d = plane.d\n\n const xh = plane.rot[0]\n const yh = plane.rot[1]\n const zh = plane.rot[2]\n\n const p0 = [\n -d * zh[0],\n -d * zh[1],\n -d * zh[2]\n ]\n\n return [\n p0[0] + xh[0] * p[0] + yh[0] * p[1] + zh[0] * p[2],\n p0[1] + xh[1] * p[0] + yh[1] * p[1] + zh[1] * p[2],\n p0[2] + xh[2] * p[0] + yh[2] * p[1] + zh[2] * p[2]\n ]\n }\n}\n\n// These directions are 'where the light is shining'\nexport const DirectionVectorMap = {\n NORTH: 4,\n NORTHEAST: 5,\n EAST: 6,\n SOUTHEAST: 7,\n SOUTH: 0,\n SOUTHWEST: 1,\n WEST: 2,\n NORTHWEST: 3,\n}\n\nexport default WallspiceWebgl\n","export const RUG_SUB_LAYER_DELTA = 0.0075\nexport const RUG_THICKNESS = 0.0235\n\nexport const DEFAULT_MOBILE_TEXTURE_SIZE = 1024\n\nexport const SENTRY_BREADCRUMB_CATEGORY = 'graphics'\n\nexport const AA_FXAA = 1\nexport const AA_TAA = 2\n//\n// Certain furniture can behave badly when pressed flush\n// against a wall. The backboard of something like\n// a bookshelf can appear to embed itself inside of the\n// wall, causing the user to see wall where they would\n// expect to see the shelf's backboard. This is due to the\n// wall's floor lines not being perfectly aligned with the\n// its depth data. The cause is different but the effect\n// looks something like z-fighting. See the JIRA entry\n// here for an example:\n//\n// https://geomagical.atlassian.net/browse/GFX-500\n//\n// The following 5 lines of code shift walls outward by\n// 0.02125 along their normals. This shift makes it so that\n// you can't push a furniture item through the wall's depth\n// barrier. The value 0.02125 was determined expirmentally,\n// and is roughly the diameter of a penny.\n//\n\nexport const WALL_SHIFT = 0.02125\nexport const DEFAULT_THREE_NATIVE_LAYER = 0\nexport const STATIC_STACKABLES_THREE_NATIVE_LAYER = 1\n\nexport const DOWNLOAD_RETRIES_COUNT = 3\nexport const DOWNLOAD_RETRY_DELAY_MS = 1000","class TimeMetric {\n constructor(bins) {\n this.data = []\n this.lastFrame = null\n\n this.intervalStartTime = null\n this.bins = bins\n\n this.histogram = null\n if (Array.isArray(this.bins)) {\n this.histogram = this.bins.map(() => 0.0)\n }\n this.valuesCount = 0\n }\n\n intervalStart() {\n this.intervalStartTime = performance.now()\n }\n\n intervalStop() {\n const timeNow = performance.now()\n const interval = timeNow - this.intervalStartTime\n this.addValue(interval)\n }\n\n addValue(value) {\n if (!Array.isArray(this.bins)) {\n return\n }\n this.valuesCount += 1\n for (let i = 0; i < this.bins.length; i += 1) {\n const lowerLimit = i > 0 ? this.bins[i - 1].value : 0.0\n const upperLimit = this.bins[i].value !== null ? this.bins[i].value : Infinity\n if (value > lowerLimit && value <= upperLimit) {\n this.histogram[i] += 1\n break\n }\n }\n }\n}\n\nexport default TimeMetric\n","// YP: based on SpectorJS: https://github.com/BabylonJS/Spector.js\n\nconst webglConstants = {\n R8: 33321,\n R16F: 33325,\n R32F: 33326,\n R8UI: 33330,\n RG8: 33335,\n RG16F: 33327,\n RG32F: 33328,\n ALPHA: 6406,\n RGB: 6407,\n RGBA: 6408,\n LUMINANCE: 6409,\n LUMINANCE_ALPHA: 6410,\n DEPTH_COMPONENT: 6402,\n DEPTH_STENCIL: 34041,\n SRGB_EXT: 35904,\n SRGB_ALPHA_EXT: 35906,\n RGB8: 32849,\n SRGB8: 35905,\n RGB565: 36194,\n R11F_G11F_B10F: 35898,\n RGB9_E5: 35901,\n RGB16F: 34843,\n RGB32F: 34837,\n RGB8UI: 36221,\n RGBA8: 32856,\n RGB5_A1: 32855,\n RGBA16F: 34842,\n RGBA32F: 34836,\n RGBA8UI: 36220,\n COMPRESSED_R11_EAC: 37488,\n COMPRESSED_SIGNED_R11_EAC: 37489,\n COMPRESSED_RG11_EAC: 37490,\n COMPRESSED_SIGNED_RG11_EAC: 37491,\n COMPRESSED_RGB8_ETC2: 37492,\n COMPRESSED_RGBA8_ETC2_EAC: 37493,\n COMPRESSED_SRGB8_ETC2: 37494,\n COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 37495,\n COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37496,\n COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37497,\n COMPRESSED_RGB_S3TC_DXT1_EXT: 33776,\n COMPRESSED_RGBA_S3TC_DXT3_EXT: 33778,\n COMPRESSED_RGBA_S3TC_DXT5_EXT: 33779,\n COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 35840,\n COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 35842,\n COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 35841,\n COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 35843,\n COMPRESSED_RGB_ETC1_WEBGL: 36196,\n COMPRESSED_RGB_ATC_WEBGL: 35986,\n COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: 35986,\n COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: 34798,\n\n FLOAT: 5126,\n HALF_FLOAT_OES: 36193,\n TEXTURE_2D: 3553,\n TEXTURE_BINDING_2D: 32873,\n TEXTURE_CUBE_MAP_POSITIVE_X: 34069,\n TEXTURE_CUBE_MAP_POSITIVE_Y: 34071,\n TEXTURE_CUBE_MAP_POSITIVE_Z: 34073,\n TEXTURE_CUBE_MAP_NEGATIVE_X: 34070,\n TEXTURE_CUBE_MAP_NEGATIVE_Y: 34072,\n TEXTURE_CUBE_MAP_NEGATIVE_Z: 34074,\n TEXTURE_BINDING_CUBE_MAP: 34068,\n\n TEXTURE_2D_ARRAY: 35866,\n TEXTURE_3D: 32879,\n\n ARRAY_BUFFER: 34962,\n ARRAY_BUFFER_BINDING: 34964,\n ELEMENT_ARRAY_BUFFER: 34963,\n ELEMENT_ARRAY_BUFFER_BINDING: 34965,\n COPY_READ_BUFFER: 36662,\n COPY_READ_BUFFER_BINDING: 36662,\n COPY_WRITE_BUFFER: 36663,\n COPY_WRITE_BUFFER_BINDING: 36663,\n TRANSFORM_FEEDBACK_BUFFER: 35982,\n TRANSFORM_FEEDBACK_BUFFER_BINDING: 35983,\n UNIFORM_BUFFER: 35345,\n UNIFORM_BUFFER_BINDING: 35368,\n PIXEL_PACK_BUFFER: 35051,\n PIXEL_PACK_BUFFER_BINDING: 35053,\n PIXEL_UNPACK_BUFFER: 35052,\n PIXEL_UNPACK_BUFFER_BINDING: 35055,\n}\n\nconst byteSizePerInternalFormat = {\n [webglConstants.R8]: 1,\n [webglConstants.R16F]: 2,\n [webglConstants.R32F]: 4,\n [webglConstants.R8UI]: 1,\n [webglConstants.RG8]: 2,\n [webglConstants.RG16F]: 4,\n [webglConstants.RG32F]: 8,\n [webglConstants.ALPHA]: 1,\n [webglConstants.RGB]: 3,\n [webglConstants.RGBA]: 4,\n [webglConstants.LUMINANCE]: 1,\n [webglConstants.LUMINANCE_ALPHA]: 2,\n [webglConstants.DEPTH_COMPONENT]: 1,\n [webglConstants.DEPTH_STENCIL]: 2,\n [webglConstants.SRGB_EXT]: 3,\n [webglConstants.SRGB_ALPHA_EXT]: 4,\n // [webglConstants.RGUI]: 2,\n [webglConstants.RGB8]: 3,\n [webglConstants.SRGB8]: 3,\n [webglConstants.RGB565]: 2,\n [webglConstants.R11F_G11F_B10F]: 4,\n [webglConstants.RGB9_E5]: 2,\n [webglConstants.RGB16F]: 6,\n [webglConstants.RGB32F]: 12,\n [webglConstants.RGB8UI]: 3,\n [webglConstants.RGBA8]: 4,\n // [webglConstants.SRGB_APLHA8]: 4,\n [webglConstants.RGB5_A1]: 2,\n // [webglConstants.RGBA4444]: 2,\n [webglConstants.RGBA16F]: 8,\n [webglConstants.RGBA32F]: 16,\n [webglConstants.RGBA8UI]: 4,\n [webglConstants.COMPRESSED_R11_EAC]: 4,\n [webglConstants.COMPRESSED_SIGNED_R11_EAC]: 4,\n [webglConstants.COMPRESSED_RG11_EAC]: 4,\n [webglConstants.COMPRESSED_SIGNED_RG11_EAC]: 4,\n [webglConstants.COMPRESSED_RGB8_ETC2]: 4,\n [webglConstants.COMPRESSED_RGBA8_ETC2_EAC]: 4,\n [webglConstants.COMPRESSED_SRGB8_ETC2]: 4,\n [webglConstants.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC]: 4,\n [webglConstants.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2]: 4,\n [webglConstants.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2]: 4,\n [webglConstants.COMPRESSED_RGB_S3TC_DXT1_EXT]: 0.5,\n [webglConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT]: 1,\n [webglConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT]: 1,\n [webglConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG]: 0.5,\n [webglConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG]: 0.5,\n [webglConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG]: 0.25,\n [webglConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG]: 0.25,\n [webglConstants.COMPRESSED_RGB_ETC1_WEBGL]: 0.5,\n [webglConstants.COMPRESSED_RGB_ATC_WEBGL]: 0.5,\n [webglConstants.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL]: 1,\n [webglConstants.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL]: 1,\n}\n\nconst originalPrefix = '__gpumemoryrecorderoriginal_'\nconst dataPrefix = '__gpumemoryrecorderdata_'\n\n// const textureCreateFuncs = ['createTexture'] // no creation tracking needed for now\nconst textureUpdateFuncs = ['texImage2D', 'compressedTexImage2D', 'texStorage2D']\nconst textureDeleteFuncs = ['deleteTexture']\n\nconst bufferUpdateFuncs = ['bufferData']\nconst bufferDeleteFuncs = ['deleteBuffer']\n\nclass GlMemoryRecorder {\n constructor(context) {\n this.gl = context\n\n this.currentTextureMemory = 0\n this.currentBufferMemory = 0\n\n this.trackUpdate = this.trackUpdate.bind(this)\n this.trackDelete = this.trackDelete.bind(this)\n }\n\n start() {\n // textureCreateFuncs.forEach(functionName => this.applyOverride(functionName)) // no creation tracking needed for now\n textureUpdateFuncs.forEach(functionName => this.applyOverride(functionName,\n (...args) => this.trackUpdate(functionName, ...args)))\n textureDeleteFuncs.forEach(functionName => this.applyOverride(functionName,\n this.trackDelete))\n\n bufferUpdateFuncs.forEach(functionName => this.applyOverride(functionName,\n (...args) => this.trackUpdate(functionName, ...args)))\n bufferDeleteFuncs.forEach(functionName => this.applyOverride(functionName,\n this.trackDelete))\n }\n\n stop() {\n // textureCreateFuncs.forEach(functionName => this.unapplyOverride(functionName)) // no creation tracking needed for now\n textureUpdateFuncs.forEach(functionName => this.unapplyOverride(functionName))\n textureDeleteFuncs.forEach(functionName => this.unapplyOverride(functionName))\n bufferUpdateFuncs.forEach(functionName => this.unapplyOverride(functionName))\n bufferDeleteFuncs.forEach(functionName => this.unapplyOverride(functionName))\n }\n\n applyOverride(functionName, trackingFunction) {\n if (!this.gl) {\n return\n }\n if (!this.gl[functionName]) {\n return\n }\n const storedOriginalName = originalPrefix + functionName\n if (this.gl[storedOriginalName]) {\n return\n }\n this.gl[storedOriginalName] = this.gl[functionName]\n this.gl[functionName] = (...args) => {\n const targetOrInstance = args[0]\n trackingFunction(targetOrInstance, args)\n return this.gl[storedOriginalName](...args)\n }\n }\n\n unapplyOverride(functionName) {\n if (!this.gl) {\n return\n }\n const storedOriginalName = originalPrefix + functionName\n if (this.gl[storedOriginalName]) {\n this.gl[functionName] = this.gl[storedOriginalName]\n delete this.gl[storedOriginalName]\n }\n }\n\n trackUpdate(functionName, target, args) {\n const boundInstance = this.getBoundInstance(target)\n if (!boundInstance) {\n return\n }\n\n const customInfo = GlMemoryRecorder.getCustomInfo(functionName, target, args)\n if (!customInfo) {\n return\n }\n\n if (GlMemoryRecorder.isTargetTexture(target)) {\n const { type } = customInfo\n let { internalFormat } = customInfo\n\n // YP: SpectorJS comment:\n // @ivanpopelyshev: this hack is made according to tests on PixiJS applications\n // Float textures is not a rare case\n // WebGL1 does not have RGBA32F, RGBA16F, we need to look in `type` field\n if (internalFormat === webglConstants.RGBA) {\n if (type === webglConstants.FLOAT) {\n internalFormat = webglConstants.RGBA32F\n }\n if (type === webglConstants.HALF_FLOAT_OES) {\n internalFormat = webglConstants.RGBA16F\n }\n }\n\n const previousMemorySize = boundInstance[dataPrefix] ? boundInstance[dataPrefix].memorySize : 0\n const cubeMapMultiplier = target === webglConstants.TEXTURE_2D ? 1 : 6\n \n customInfo.memorySize = (customInfo.width * customInfo.height * cubeMapMultiplier\n * GlMemoryRecorder.getByteSizeForInternalFormat(internalFormat)) || 0\n boundInstance[dataPrefix] = customInfo\n\n this.currentTextureMemory += customInfo.memorySize - previousMemorySize\n } else { // Buffer\n const previousLength = boundInstance[dataPrefix] ? boundInstance[dataPrefix].length : 0\n boundInstance[dataPrefix] = customInfo\n this.currentBufferMemory += customInfo.length - previousLength\n }\n }\n\n trackDelete(boundInstance) {\n if (!boundInstance) {\n return\n }\n const customInfo = boundInstance[dataPrefix]\n if (!customInfo) {\n return\n }\n if (customInfo.target === webglConstants.TEXTURE_2D_ARRAY || customInfo.target === webglConstants.TEXTURE_3D) {\n return\n }\n\n if (GlMemoryRecorder.isTargetTexture(customInfo.target)) {\n this.currentTextureMemory -= customInfo.memorySize\n } else {\n this.currentBufferMemory -= customInfo.length\n }\n }\n\n getBoundInstance(target) {\n if (target === webglConstants.TEXTURE_2D) {\n return this.gl.getParameter(webglConstants.TEXTURE_BINDING_2D)\n }\n if (target === webglConstants.TEXTURE_CUBE_MAP_POSITIVE_X ||\n target === webglConstants.TEXTURE_CUBE_MAP_POSITIVE_Y ||\n target === webglConstants.TEXTURE_CUBE_MAP_POSITIVE_Z ||\n target === webglConstants.TEXTURE_CUBE_MAP_NEGATIVE_X ||\n target === webglConstants.TEXTURE_CUBE_MAP_NEGATIVE_Y ||\n target === webglConstants.TEXTURE_CUBE_MAP_NEGATIVE_Z) {\n return this.gl.getParameter(webglConstants.TEXTURE_BINDING_CUBE_MAP)\n }\n if (target === webglConstants.ARRAY_BUFFER) {\n return this.gl.getParameter(webglConstants.ARRAY_BUFFER_BINDING)\n }\n if (target === webglConstants.ELEMENT_ARRAY_BUFFER) {\n return this.gl.getParameter(webglConstants.ELEMENT_ARRAY_BUFFER_BINDING)\n }\n if (target === webglConstants.COPY_READ_BUFFER) {\n return this.gl.getParameter(webglConstants.COPY_READ_BUFFER_BINDING)\n }\n if (target === webglConstants.COPY_WRITE_BUFFER) {\n return this.gl.getParameter(webglConstants.COPY_WRITE_BUFFER_BINDING)\n }\n if (target === webglConstants.TRANSFORM_FEEDBACK_BUFFER) {\n return this.gl.getParameter(webglConstants.TRANSFORM_FEEDBACK_BUFFER_BINDING)\n }\n if (target === webglConstants.UNIFORM_BUFFER) {\n return this.gl.getParameter(webglConstants.UNIFORM_BUFFER_BINDING)\n }\n if (target === webglConstants.PIXEL_PACK_BUFFER) {\n return this.gl.getParameter(webglConstants.PIXEL_PACK_BUFFER_BINDING)\n }\n if (target === webglConstants.PIXEL_UNPACK_BUFFER) {\n return this.gl.getParameter(webglConstants.PIXEL_UNPACK_BUFFER_BINDING)\n }\n return null\n }\n\n static getCustomInfo(functionName, target, args) {\n if (functionName === \"texImage2D\") {\n return GlMemoryRecorder.getTexImage2DTextureInfo(args, target)\n }\n if (functionName === \"compressedTexImage2D\") {\n return GlMemoryRecorder.getCompressedTexImage2DTextureInfo(args, target)\n }\n if (functionName === \"texStorage2D\") {\n return GlMemoryRecorder.getTexStorage2DTextureInfo(args, target)\n }\n if (functionName === \"bufferData\") {\n return GlMemoryRecorder.getBufferCustomInfo(args, target)\n }\n return null\n }\n\n static getTexImage2DTextureInfo(args, target) {\n if (args[1] !== 0) {\n return null // Only manage main lod... so far.\n }\n\n let textureInfo = null\n if (args.length >= 8) {\n textureInfo = {\n target,\n // level: functionInformation.arguments[1],\n internalFormat: args[2],\n width: args[3],\n height: args[4],\n format: args[6],\n type: args[7],\n length: 0,\n }\n }\n else if (args.length === 6) {\n textureInfo = {\n target,\n // level: functionInformation.arguments[1],\n internalFormat: args[2],\n width: args[5].width,\n height: args[5].height,\n format: args[3],\n type: args[4],\n length: 0,\n }\n }\n return textureInfo\n }\n\n static getCompressedTexImage2DTextureInfo(args, target) {\n if (args[1] !== 0) {\n return null // Only manage main lod... so far.\n }\n\n let textureInfo = null\n if (args.length >= 7) {\n textureInfo = {\n target,\n // level: functionInformation.arguments[1],\n internalFormat: args[2],\n width: args[3],\n height: args[4],\n length: 0,\n };\n }\n return textureInfo\n }\n\n static getTexStorage2DTextureInfo(args, target) {\n let textureInfo = null\n if (args.length === 5) {\n // Custom data required to display the texture.\n textureInfo = {\n target,\n // level: functionInformation.arguments[1],\n internalFormat: args[2],\n width: args[3],\n height: args[4],\n length: 0,\n }\n }\n return textureInfo\n }\n\n static getBufferCustomInfo(args, target) {\n const length = GlMemoryRecorder.getBufferLength(args)\n return {\n target,\n length,\n }\n }\n\n static getByteSizeForInternalFormat(internalFormat) {\n return byteSizePerInternalFormat[internalFormat] || 4\n }\n\n static getBufferLength(args) {\n let length = -1\n let offset = 0\n if (args.length === 5) {\n length = args[4]\n offset = args[3]\n }\n\n if (length <= 0) {\n if (typeof args[1] === \"number\") {\n length = args[1]\n }\n else if (args[1]) {\n length = args[1].byteLength || args[1].length || 0\n }\n else {\n length = 0\n }\n }\n\n return length - offset;\n }\n\n static isTargetTexture(target) {\n return target === webglConstants.TEXTURE_2D ||\n target === webglConstants.TEXTURE_CUBE_MAP_POSITIVE_X ||\n target === webglConstants.TEXTURE_CUBE_MAP_POSITIVE_Y ||\n target === webglConstants.TEXTURE_CUBE_MAP_POSITIVE_Z ||\n target === webglConstants.TEXTURE_CUBE_MAP_NEGATIVE_X ||\n target === webglConstants.TEXTURE_CUBE_MAP_NEGATIVE_Y ||\n target === webglConstants.TEXTURE_CUBE_MAP_NEGATIVE_Z\n }\n}\n\nexport default GlMemoryRecorder","import * as THREE from 'three'\nimport * as Sentry from '@sentry/react'\nimport { SENTRY_BREADCRUMB_CATEGORY } from 'Renderer/constants'\n\nexport default class TextureHelper {\n constructor(renderer) {\n this.renderer = renderer\n this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.0, 1000)\n this.scene = new THREE.Scene()\n this.material = new THREE.ShaderMaterial({\n uniforms: {\n map: { value: null },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n `,\n fragmentShader: `\n uniform sampler2D map;\n varying vec2 vUv;\n void main() {\n gl_FragColor = texture2D(map, vUv);\n // gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n }\n `,\n side: THREE.DoubleSide,\n })\n\n this.planeMesh = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), this.material)\n this.scene.add(this.planeMesh)\n\n this.renderTargets = new Map()\n this.disposeCallback = this.disposeCallback.bind(this)\n }\n\n getResizedCopy(texture, width, height) {\n if (!texture) {\n return null\n }\n if (!this.renderer) {\n return null\n }\n const threeRenderer = this.renderer.ThreeWGLrenderer\n if (!threeRenderer) {\n return null\n }\n\n this.material.uniforms.map.value = texture\n this.material.map = texture\n\n const renderTarget = new THREE.WebGLRenderTarget(width, height)\n renderTarget.texture.name = `${texture.name}-resized`\n renderTarget.texture.encoding = texture.encoding\n\n const currentRenderTarget = threeRenderer.getRenderTarget()\n\n threeRenderer.setRenderTarget(renderTarget)\n threeRenderer.clear()\n\n threeRenderer.render(this.scene, this.camera)\n\n threeRenderer.setRenderTarget(currentRenderTarget)\n\n this.material.uniforms.map.value = null\n this.material.map = null\n\n renderTarget.texture.addEventListener('dispose', this.disposeCallback)\n\n this.renderTargets.set(renderTarget.texture.uuid, renderTarget)\n\n return renderTarget.texture\n }\n\n disposeCallback(event) {\n const texture = event.target\n const renderTarget = this.renderTargets.get(texture.uuid)\n if (renderTarget) {\n this.renderTargets.delete(texture.uuid)\n renderTarget.dispose()\n }\n texture.removeEventListener('dispose', this.disposeCallback)\n }\n\n readPixels(texture) {\n if (!texture || !texture.image) {\n return null\n }\n if (!this.renderer) {\n return null\n }\n const threeRenderer = this.renderer.ThreeWGLrenderer\n if (!threeRenderer) {\n return null\n }\n\n this.material.uniforms.map.value = texture\n this.material.map = texture\n\n const { width, height } = texture.image\n\n const retBuffer = new Uint8Array(width * height * 4)\n\n const renderTarget = new THREE.WebGLRenderTarget(width, height)\n renderTarget.texture.name = `${texture.name}-resized`\n renderTarget.texture.encoding = texture.encoding\n\n const currentRenderTarget = threeRenderer.getRenderTarget()\n\n threeRenderer.setRenderTarget(renderTarget)\n threeRenderer.clear()\n\n threeRenderer.render(this.scene, this.camera)\n\n threeRenderer.setRenderTarget(currentRenderTarget)\n\n this.material.uniforms.map.value = null\n this.material.map = null\n\n threeRenderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, retBuffer)\n renderTarget.dispose()\n\n return { data: retBuffer, width, height }\n }\n\n testFloatRT() {\n if (!this.renderer) {\n return false\n }\n const threeRenderer = this.renderer.ThreeWGLrenderer\n if (!threeRenderer) {\n return false\n }\n\n const context = threeRenderer.getContext()\n if (!context) {\n return false\n }\n\n const size = 2\n const renderTarget = new THREE.WebGLRenderTarget(size, size, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n format: THREE.RGBAFormat,\n type: THREE.FloatType,\n })\n\n const material = new THREE.ShaderMaterial({\n vertexShader: `\n void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n `,\n fragmentShader: `\n void main() {\n gl_FragColor = vec4(1.0, 0.5, 0.25, 1.0);\n }\n `,\n side: THREE.DoubleSide,\n })\n\n const currentRenderTarget = threeRenderer.getRenderTarget()\n const currentMaterial = this.planeMesh.material\n this.planeMesh.material = material\n\n const checkError = (where) => {\n const glError = context.getError()\n if (glError !== 0) {\n material.dispose()\n renderTarget.dispose()\n Sentry.captureEvent({\n message: 'GL Error in TAA check',\n breadcrumbs: [\n {\n type: 'GL error data',\n category: SENTRY_BREADCRUMB_CATEGORY,\n data: {\n errorCode: glError,\n where,\n }\n },\n ]\n })\n return true\n }\n return false\n }\n\n threeRenderer.setRenderTarget(renderTarget)\n if (checkError('setRenderTarget')) {\n return false\n }\n\n threeRenderer.clear()\n threeRenderer.render(this.scene, this.camera)\n if (checkError('render')) {\n return false\n }\n\n threeRenderer.setRenderTarget(currentRenderTarget)\n this.planeMesh.material = currentMaterial\n\n const bufferSize = size * size * 4\n const buffer = new Float32Array(bufferSize)\n threeRenderer.readRenderTargetPixels(renderTarget, 0, 0, size, size, buffer)\n if (checkError('readRenderTargetPixels')) {\n return false\n }\n\n let result = true\n for (let i = 0; i < bufferSize; i += 4) {\n if (buffer[i + 0] !== 1 ||\n buffer[i + 1] !== 0.5 ||\n buffer[i + 2] !== 0.25 ||\n buffer[i + 3] !== 1) {\n result = false\n break\n }\n }\n\n material.dispose()\n renderTarget.dispose()\n\n return result\n }\n}","/* eslint-disable max-classes-per-file */\n\nimport * as THREE from 'three'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF'\nconst BINARY_EXTENSION_HEADER_LENGTH = 12\nconst BINARY_EXTENSION_CHUNK_JSON = 0x4E4F534A\n\nconst meshCompressionNone = 'none'\nconst meshCompressionDraco = 'draco'\nconst textureCompressionNone = 'none'\nconst textureCompressionBasisU = 'basisU'\n\nexport const errorDuringFileLoad = 'errorDuringFileLoad'\nexport const errorDuringGltfJsonAnalyze = 'errorDuringGltfJsonAnalyze'\nexport const errorDuringGltfInit = 'errorDuringGltfInit'\n\nclass GLTFTextureBasisUExtension {\n constructor(parser, metrics) {\n this.parser = parser\n this.name = 'KHR_texture_basisu'\n this.metrics = metrics\n }\n\n loadTexture (textureIndex) {\n const parser = this.parser\n const json = parser.json\n\n const textureDef = json.textures[textureIndex]\n\n if ( ! textureDef.extensions || !textureDef.extensions[this.name]) {\n return null\n }\n\n const extension = textureDef.extensions[this.name]\n const source = json.images[extension.source]\n const loader = parser.options.ktx2Loader\n\n if (!loader) {\n if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) {\n throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' )\n } else {\n // Assumes that the extension is optional and that a fallback texture is present\n return null\n }\n }\n\n if (this.metrics) {\n this.metrics.TextureCompression = textureCompressionBasisU\n }\n return parser.loadTextureImage(textureIndex, source, loader)\n .then((texture) => {\n /* eslint-disable no-param-reassign */\n texture.magFilter = THREE.LinearFilter\n texture.minFilter = THREE.LinearFilter\n /* eslint-enable no-param-reassign */\n if (loader.transcodingTimes.has(texture.uuid) && this.metrics) {\n this.metrics.msBasisUniversalTextureTranscodingTime += loader.transcodingTimes.get(texture.uuid)\n }\n return texture\n })\n }\n}\n\nclass CustomGLTFLoader extends GLTFLoader {\n load (url, onLoad, onProgress, onError, metrics) {\n let resourcePath = null\n\n if (this.resourcePath !== '') {\n resourcePath = this.resourcePath\n } else if (this.path !== '') {\n resourcePath = this.path\n } else {\n resourcePath = THREE.LoaderUtils.extractUrlBase(url)\n }\n \n // Tells the LoadingManager to track an extra item, which resolves after\n // the model is fully loaded. This means the count of items loaded will\n // be incorrect, but ensures manager.onLoad() does not fire early.\n this.manager.itemStart(url)\n const onErrorWrapped = (e) => {\n if (onError) {\n onError(e)\n } else {\n // console.error(e)\n }\n this.manager.itemError(url)\n this.manager.itemEnd(url)\n }\n \n const loader = new THREE.FileLoader(this.manager)\n \n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n \n const downloadStart = window.performance.now()\n loader.load( url, (data) => {\n if (metrics) {\n /* eslint-disable no-param-reassign */\n metrics.sFileDownloadTime = (window.performance.now() - downloadStart) / 1000\n metrics.TextureCompression = textureCompressionNone\n metrics.MbFileSizeTransferred = data.byteLength / 1024 / 1024\n /* eslint-enable no-param-reassign */\n }\n\n try {\n const gltfInfo = CustomGLTFLoader.analyzeJson(data)\n\n // this function will be called in the beginning of this.parse, synchronously,before\n // starting any async operation, i.e. metrics variable will stay unchanged until then\n const khrTextureBasisuIdx = 2\n this.pluginCallbacks[khrTextureBasisuIdx] = (parser) =>\n new GLTFTextureBasisUExtension(parser, metrics)\n\n this.parse(data, resourcePath, (gltf) => {\n if (metrics) {\n /* eslint-disable-next-line no-param-reassign */\n metrics.MeshCompression = gltfInfo.extensionsUsed.has('KHR_draco_mesh_compression') ?\n meshCompressionDraco :\n meshCompressionNone\n }\n onLoad(gltf)\n this.manager.itemEnd(url)\n }, (event) => onErrorWrapped({\n type: errorDuringGltfInit,\n event,\n }), metrics )\n } catch (e) {\n onErrorWrapped({\n type: errorDuringGltfJsonAnalyze,\n event: e\n })\n }\n }, onProgress, (e) => onErrorWrapped({\n type: errorDuringFileLoad,\n event: e\n }))\n }\n\n static analyzeJson (data) {\n const gltfInfo = {\n extensionsUsed: new Set()\n }\n\n let content\n\n if (typeof data === 'string') {\n content = data\n } else {\n const magic = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 4))\n if (magic === BINARY_EXTENSION_HEADER_MAGIC) {\n const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH)\n const header = {\n magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))),\n version: headerView.getUint32(4, true),\n length: headerView.getUint32(8, true)\n }\n if (header.magic !== BINARY_EXTENSION_HEADER_MAGIC) {\n throw new Error('Unsupported glTF-Binary header.')\n } else if (header.version < 2.0) {\n throw new Error( 'Legacy binary file detected.')\n }\n const chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH)\n let chunkIndex = 0\n while (chunkIndex < chunkView.byteLength) {\n const chunkLength = chunkView.getUint32(chunkIndex, true)\n chunkIndex += 4\n const chunkType = chunkView.getUint32(chunkIndex, true)\n chunkIndex += 4\n if (chunkType === BINARY_EXTENSION_CHUNK_JSON) {\n const contentArray = new Uint8Array(data,\n BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength)\n content = THREE.LoaderUtils.decodeText(contentArray)\n }\n // Clients must ignore chunks with unknown types.\n chunkIndex += chunkLength\n }\n if (content === null) {\n throw new Error( 'THREE.GLTFLoader: JSON content not found.')\n }\n } else {\n content = THREE.LoaderUtils.decodeText(new Uint8Array(data))\n }\n }\n const json = JSON.parse(content)\n if (json.extensionsUsed) {\n json.extensionsUsed.forEach(extensionName => gltfInfo.extensionsUsed.add(extensionName))\n }\n return gltfInfo\n }\n}\n\n// const gltfLoader = new CustomGLTFLoader()\n// gltfLoader.setKTX2Loader(new CustomKTX2Loader())\n\nexport default CustomGLTFLoader\n","import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nclass CustomDRACOLoader extends DRACOLoader {\n decodeGeometry(buffer, taskConfig) {\n const startTime = window.performance.now()\n const geometryPromise = super.decodeGeometry(buffer, taskConfig)\n return geometryPromise.then((geometry) => {\n const elapsed = window.performance.now() - startTime\n // eslint-disable-next-line no-param-reassign\n geometry.dracoDecompressTime = elapsed\n return geometry\n })\n }\n}\n\nexport default CustomDRACOLoader","import * as THREE from 'three'\n\n// import CustomKTX2Loader from 'Renderer/CustomKTX2Loader'\nimport CustomGLTFLoader from 'Renderer/CustomGLTFLoader'\nimport CustomDRACOLoader from 'Renderer/CustomDracoLoader'\n\nclass FurnitureLoader {\n constructor() {\n this.gltfLoader = new CustomGLTFLoader()\n // this.ktx2Loader = new CustomKTX2Loader().setTranscoderPath(`${CDN_BUCKET}/lib/basis/`)\n // this.gltfLoader.setKTX2Loader(this.ktx2Loader)\n\n this.dracoLoader = new CustomDRACOLoader()\n this.dracoLoader.setDecoderPath('//www.gstatic.com/draco/versioned/decoders/1.4.3/')\n this.dracoLoader.preload()\n\n this.gltfLoader.setDRACOLoader(this.dracoLoader)\n\n this.ktx2CheckPromise = Promise.resolve(false)\n // this.startKtx2Check()\n }\n\n async testKtx2Support () {\n // test 4x4 ktx image:\n // eslint-disable-next-line max-len\n const bytes = atob('q0tUWCAyMLsNChoKAAAAAAEAAAAEAAAABAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAaAAAACwAAACUAAAAfAAAABABAAAAAAAAgwAAAAAAAACTAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAIAKACjAQIAAwMAAAAAAAAAAAAAAAA/AAAAAAAAAAAA/////xIAAABLVFhvcmllbnRhdGlvbgByZAAAADgAAABLVFh3cml0ZXIAdG9rdHggdjQuMC4wLWJldGE1fjEyIC8gbGlia3R4IHY0LjAuMC1iZXRhNX4zACQAAABLVFh3cml0ZXJTY1BhcmFtcwAtLWJjbXAgLS1jbGV2ZWwgNQABAAEAKwAAAAUAAAArAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAcAEAAAAAAAA4gOYEyAAAAAAwlr4CAsAJgAAAAAAABABwAQAAAAAAACCBgSICIkCAMFEAAAAAAAA8l8tAJgAAAAAAABACAATAAIAAAAAiAHABAAAAAAAAAIIAAA=')\n const buffer = new ArrayBuffer(bytes.length)\n const bufferView = new Uint8Array(buffer)\n\n for (let i = 0; i < bytes.length; i += 1) {\n bufferView[i] = bytes.charCodeAt(i)\n }\n\n const blob = new Blob( [ buffer ], { type: 'image/ktx2' } )\n const objectUrl = URL.createObjectURL(blob)\n\n return new Promise( ( resolve ) => {\n const onLoad = (texture) => {\n resolve(texture && texture.image && texture.image.width === 4 && texture.image.height === 4)\n }\n const onError = () => {\n resolve(false)\n }\n this.gltfLoader.ktx2Loader.load(objectUrl, onLoad, undefined, onError)\n } )\n }\n\n startKtx2Check() {\n let tryKtx2 = false\n if (this.gltfLoader.ktx2Loader) {\n const canvas = document.createElement('canvas')\n const webglContext = canvas.getContext('webgl')\n if (webglContext) {\n this.gltfLoader.ktx2Loader.workerConfig = {\n astcSupported: webglContext.getExtension('WEBGL_compressed_texture_astc') !== null,\n etc1Supported: webglContext.getExtension('WEBGL_compressed_texture_etc1') !== null,\n etc2Supported: webglContext.getExtension('WEBGL_compressed_texture_etc') !== null,\n dxtSupported: webglContext.getExtension('WEBGL_compressed_texture_s3tc') !== null\n || webglContext.getExtension('MOZ_WEBGL_compressed_texture_s3tc') !== null\n || webglContext.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc') !== null,\n bptcSupported: webglContext.getExtension('EXT_texture_compression_bptc') !== null,\n pvrtcSupported: webglContext.getExtension('WEBGL_compressed_texture_pvrtc') !== null\n || webglContext.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc' ) !== null\n }\n }\n tryKtx2 = !!webglContext\n }\n if (tryKtx2) {\n this.ktx2CheckPromise = this.testKtx2Support()\n }\n }\n\n loadFurniture(url, onProgress, onUpdate, renderer, metrics) {\n renderer.incrementLoadingItems()\n\n return this.ktx2CheckPromise.then((/* ktx2Supported */) => new Promise((resolve, reject) => {\n const cubeTex = renderer && renderer.cubeTex\n\n this.gltfLoader.load(url, (gltfstuff) => {\n const furnishing = gltfstuff.scene\n\n furnishing.traverse((child) => {\n /* eslint-disable no-param-reassign */\n if (child instanceof THREE.Mesh) {\n // this could be used for future material texture overrides\n if (child.material.transparent /* && child.material.opacity < 0.4 */) {\n child.castShadow = false\n child.material.depthWrite = false\n } else {\n child.castShadow = true\n }\n child.receiveShadow = true\n\n // This was introduced as a fix for the simplified items with no hidden faces\n child.material.shadowSide = renderer.debugSettings.frontSideShadows ? THREE.FrontSide : null\n\n if (child.material.map) {\n // child.material.map.encoding = THREE.LinearEncoding\n child.material.map.anisotropy = 8\n }\n if (child.material.emissiveMap) {\n // child.material.emissiveMap.encoding = THREE.LinearEncoding\n child.material.emissiveMap.anisotropy = 8\n }\n if (child.material.normalMap) {\n child.material.normalMap.anisotropy = 8\n }\n if (child.material.metalnessMap) {\n child.material.metalnessMap.anisotropy = 8\n }\n if (child.material.aoMap) {\n child.material.aoMap.anisotropy = 8\n }\n if (child.material.alphaMap) {\n child.material.alphaMap.anisotropy = 8\n }\n child.material.needsUpdate = true\n\n if (cubeTex) {\n cubeTex.then((cubetexmap) => {\n const envMapIntensity = 1.0\n child.material.envMapIntensity = envMapIntensity\n child.material.originalEnvMapIntensity = envMapIntensity\n child.material.envMap = cubetexmap\n child.material.envMap.isCubeTexture = true\n child.material.needsUpdate = true\n child.material.onBeforeCompile = (shader) => { \n Object.defineProperty(child.material, 'envMapRotation',\n { \n get: () => shader.uniforms.envMapRotation.value,\n set: (val) => { shader.uniforms.envMapRotation.value = val },\n configurable: true,\n }\n )\n } \n onUpdate()\n })\n }\n if (child.geometry) {\n child.geometry.computeBoundingBox()\n if (child.geometry.dracoDecompressTime) {\n metrics.msDracoDecompress += child.geometry.dracoDecompressTime\n }\n }\n child.geometry.computeBoundingBox()\n }\n })\n\n furnishing.matrixAutoUpdate = false\n furnishing.castShadow = true\n furnishing.receiveShadow = true\n\n resolve(furnishing)\n },\n onProgress,\n reject,\n metrics\n )\n }))\n .then((furnishing) => {\n renderer.decrementLoadingItems()\n return furnishing\n })\n .catch((error) => {\n renderer.decrementLoadingItems()\n throw(error)\n })\n }\n\n dispose() {\n if (this.ktx2Loader && this.ktx2Loader.dispose) {\n this.ktx2Loader.dispose()\n }\n if (this.dracoLoader && this.dracoLoader.dispose) {\n this.dracoLoader.dispose()\n }\n }\n}\n\nexport default FurnitureLoader\n","/* eslint-disable max-classes-per-file */\n\nimport * as THREE from 'three'\n\nimport type Renderer from 'Renderer'\n\nimport FurnitureLoader, { ProgressCallback, OnUpdateCallback } from 'Renderer/FurnitureLoader'\nimport { Metrics } from 'Renderer/FurnitureItem'\n\nclass PendingDownload {\n promise: Promise\n\n progressCallbacks: Array\n\n onUpdateCallbacks: Array\n\n constructor(furnitureLoader: FurnitureLoader, url: string, onProgress: ProgressCallback, onUpdate: OnUpdateCallback,\n renderer: Renderer, metrics: Metrics) {\n this.progressCallbacks = [onProgress]\n this.onUpdateCallbacks = [onUpdate]\n\n const rootOnProgress = (event: ProgressEvent) => this.progressCallbacks.forEach(cb => cb && cb(event))\n const rootOnUpdate = () => this.onUpdateCallbacks.forEach(cb => cb && cb())\n\n this.promise = furnitureLoader.loadFurniture(url, rootOnProgress, rootOnUpdate, renderer, metrics)\n }\n}\nclass FurnitureManager {\n private furnitureLoader: FurnitureLoader\n\n private glbs: Map\n\n private pendingDownloads: Map\n\n private referenceCounts: Map\n\n constructor() {\n this.furnitureLoader = new FurnitureLoader()\n this.glbs = new Map()\n this.pendingDownloads = new Map()\n this.referenceCounts = new Map()\n }\n\n getGlb(url: string, onProgress: ProgressCallback, onUpdate: OnUpdateCallback,\n renderer: Renderer, metrics: Metrics) : Promise {\n const count = this.referenceCounts.get(url)\n if (count === undefined) {\n this.referenceCounts.set(url, 1)\n } else {\n this.referenceCounts.set(url, count + 1)\n }\n\n const retFurnitureItem = this.glbs.get(url)\n if (retFurnitureItem) {\n const cloned = FurnitureManager.clone(retFurnitureItem)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n cloned.glbUrl = retFurnitureItem.glbUrl\n const disassembled = FurnitureManager.disassembleGLb(cloned)\n return Promise.resolve(disassembled[0])\n }\n\n let pendingDownload = this.pendingDownloads.get(url)\n if (pendingDownload) {\n pendingDownload.progressCallbacks.push(onProgress)\n pendingDownload.onUpdateCallbacks.push(onUpdate)\n return pendingDownload.promise.then((furniture) => {\n const cloned = FurnitureManager.clone(furniture)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n cloned.glbUrl = furniture.glbUrl\n const disassembled = FurnitureManager.disassembleGLb(cloned)\n return disassembled[0]\n })\n }\n\n pendingDownload = new PendingDownload(this.furnitureLoader, url, onProgress, onUpdate,\n renderer, metrics)\n this.pendingDownloads.set(url, pendingDownload)\n pendingDownload.promise = pendingDownload.promise.then((furniture) => {\n this.pendingDownloads.delete(url)\n this.glbs.set(url, furniture)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line no-param-reassign\n furniture.glbUrl = url\n\n // The `furniture` object is a THREE.Group containing whatever was\n // loaded from the GLTF file. Sugarcube's application code will add\n // new things to this THREE.Group later on, like stackable regions\n // and bbox lines. The FurnitureManager#clone() method in this file\n // will recursively clones this THREE.Group when Sugarcube requests\n // a duplicate furniture item. However, FurnitureManager#clone()\n // should not clone things like stackables or bbox lines. Each\n // cloned THREE.Group needs to have to have its own stackable\n // regions, with different plane IDs and unique properties. The only\n // objects clone() should duplicate are objects that were originally\n // present in the GLTF file. To coordinate proper cloning we mark\n // all the objects here with `obj.geomagicalShouldClone = true`.\n // Things like stackable regions will not have this property, and so\n // will not be cloned.\n\n furniture.traverse(obj => {\n obj.userData.gltfDataShouldClone = true // eslint-disable-line no-param-reassign\n })\n\n return furniture\n })\n\n return pendingDownload.promise\n }\n\n releaseGlb(renderObject: THREE.Object3D) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const url = renderObject.glbUrl\n if (!url) {\n FurnitureManager.disposeResources(renderObject)\n return\n }\n\n // YP: about the filtering below: before, the combinable children weren't deleted \n // in the redux code when the parent was deleted, and children glbs were released here.\n // Fixing the deletion in the redux state management did lead to double release,\n // hence we need to filter out the children now.\n // https://geomagical.atlassian.net/browse/GFX-661\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const glbs = FurnitureManager.disassembleGLb(renderObject).filter(glb => glb.glbUrl === url)\n\n glbs.forEach((glb) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const childUrl = glb.glbUrl\n const count = this.referenceCounts.get(childUrl)\n if (count === undefined || count === 1) {\n this.referenceCounts.delete(childUrl)\n this.glbs.delete(childUrl)\n FurnitureManager.disposeResources(renderObject)\n } else {\n this.referenceCounts.set(childUrl, count - 1)\n }\n })\n }\n\n static clone(object: THREE.Object3D): THREE.Object3D {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const ret = new object.constructor()\n ret.copy(object, false)\n /* eslint-disable @typescript-eslint/ban-ts-comment */\n // @ts-ignore\n ret.glbUrl = object.glbUrl\n // @ts-ignore\n ret.isFurniture = object.isFurniture\n /* eslint-enable @typescript-eslint/ban-ts-comment */\n\n for (let i = 0; i < object.children.length; i += 1) {\n const child = object.children[i]\n\n if( child.userData.gltfDataShouldClone )\n ret.add(FurnitureManager.clone(child))\n }\n\n return ret\n }\n\n static disassembleGLb(rootObject: THREE.Object3D): THREE.Object3D[] {\n const childrenGlbs: THREE.Object3D[] = []\n rootObject.traverse((obj: THREE.Object3D) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (obj.glbUrl) {\n childrenGlbs.push(obj)\n }\n })\n childrenGlbs.forEach((obj: THREE.Object3D) => {\n rootObject.remove(obj)\n })\n return childrenGlbs\n }\n\n static disposeResources(renderObject: THREE.Object3D) {\n if (!renderObject) {\n return\n }\n renderObject.traverse((obj: THREE.Object3D) => {\n const mesh = obj as THREE.Mesh\n const material = mesh.material as THREE.MeshStandardMaterial\n if (material) {\n FurnitureManager.disposeMap(material.normalMap)\n FurnitureManager.disposeMap(material.map)\n FurnitureManager.disposeMap(material.aoMap)\n FurnitureManager.disposeMap(material.metalnessMap)\n FurnitureManager.disposeMap(material.roughnessMap)\n material.dispose()\n }\n if (mesh.geometry) {\n mesh.geometry.dispose()\n }\n })\n }\n\n static disposeMap(map: THREE.Texture | null) {\n if (!map) {\n return\n }\n map.dispose()\n if (map.image && map.image.close) {\n map.image.close()\n }\n }\n\n dispose() {\n if (this.furnitureLoader) {\n this.furnitureLoader.dispose()\n }\n }\n}\n export default FurnitureManager\n","import { Color } from 'three'\nimport { Pass } from 'three/examples/jsm/postprocessing/Pass.js'\n\n// YP: Based on RenderPass\nclass CustomRenderPass extends Pass {\n constructor(renderFunc, clearColor = false, clearAlpha = false) {\n super()\n\n this.renderFunc = renderFunc\n\n this.clearColor = clearColor\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0\n\n this.clear = true\n this.clearDepth = false\n this.needsSwap = false\n this.oldClearColor = new Color()\n }\n\n /* eslint-disable no-param-reassign */\n render( renderer, writeBuffer, readBuffer /* , deltaTime, maskActive */ ) {\n const oldAutoClear = renderer.autoClear\n renderer.autoClear = false\n\n let oldClearAlpha\n\n if ( this.clearColor ) {\n renderer.getClearColor(this.oldClearColor)\n oldClearAlpha = renderer.getClearAlpha()\n\n renderer.setClearColor(this.clearColor, this.clearAlpha)\n }\n\n if ( this.clearDepth ) {\n renderer.clearDepth()\n }\n\n renderer.setRenderTarget(this.renderToScreen ? null : readBuffer)\n\n // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n if (this.clear) {\n renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil)\n }\n\n if (this.renderFunc) {\n this.renderFunc()\n }\n\n if (this.clearColor) {\n renderer.setClearColor(this.oldClearColor, oldClearAlpha)\n }\n\n renderer.autoClear = oldAutoClear\n }\n /* eslint-enable no-param-reassign */\n}\n\nexport default CustomRenderPass\n","/* eslint-disable no-underscore-dangle */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable no-param-reassign */\n\nimport * as THREE from 'three'\n\nimport { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js'\nimport { DEFAULT_THREE_NATIVE_LAYER } from 'Renderer/constants'\n\nclass CustomOutlinePass extends OutlinePass {\n\n constructor(resolution, scene, camera, selectedObjects, occlusionScene) {\n super(resolution, scene, camera, selectedObjects)\n this.occlusionScene = occlusionScene\n\n this.selectedEdgeColor = new THREE.Color(0.0, 1.0, 1.0)\n this.selectedEdgeStrength = 3.0\n\n this.sceneOriginalVisibility = new Map()\n }\n\n render( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n if (this.selectedObjects.length > 0) {\n // this.saveSceneVisibility()\n\n // Enable all camera layers as static stackables are on a different layer\n this.renderCamera.layers.enableAll()\n\n // eslint-disable-next-line no-underscore-dangle\n renderer.getClearColor(this._oldClearColor)\n this.oldClearAlpha = renderer.getClearAlpha()\n const oldAutoClear = renderer.autoClear\n\n renderer.autoClear = false\n\n if ( maskActive ) renderer.state.buffers.stencil.setTest( false )\n\n renderer.setClearColor( 0xffff00, 1 )\n\n // Make selected objects invisible\n this.changeVisibilityOfSelectedObjects( false )\n\n renderer.setRenderTarget( this.renderTargetDepthBuffer )\n renderer.clear()\n\n if (this.occlusionScene) {\n this.occlusionScene.traverse((object) => {\n if (object.isMesh && object.depthPackMaterial) {\n object.originalMaterial = object.material\n object.material = object.depthPackMaterial\n }\n })\n renderer.render(this.occlusionScene, this.renderCamera)\n this.occlusionScene.traverse((object) => {\n if (object.isMesh && object.depthPackMaterial && object.originalMaterial) {\n object.material = object.originalMaterial\n delete(object.originalMaterial)\n }\n })\n }\n\n const currentBackground = this.renderScene.background\n this.renderScene.background = null\n\n // 1. Draw Non Selected objects in the depth buffer\n this.renderScene.overrideMaterial = this.depthMaterial\n renderer.render( this.renderScene, this.renderCamera )\n\n\n // Make selected objects visible\n this.changeVisibilityOfSelectedObjects( true )\n // eslint-disable-next-line no-underscore-dangle\n this._visibilityCache.clear()\n\n // Update Texture Matrix for Depth compare\n this.updateTextureMatrix()\n\n // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n this.changeVisibilityOfNonSelectedObjects( false )\n this.renderScene.overrideMaterial = null\n\n// this.renderScene.overrideMaterial = this.prepareMaskMaterial\n this.prepareMaskMaterial.uniforms.cameraNearFar.value.set( this.renderCamera.near, this.renderCamera.far )\n this.prepareMaskMaterial.uniforms.depthTexture.value = this.renderTargetDepthBuffer.texture\n this.prepareMaskMaterial.uniforms.textureMatrix.value = this.textureMatrix\n this.setupObjectMaskPass()\n\n renderer.setRenderTarget( this.renderTargetMaskBuffer )\n renderer.clear()\n renderer.render( this.renderScene, this.renderCamera )\n// this.renderScene.overrideMaterial = null\n\n this.clearObjectMaskPass()\n this.changeVisibilityOfNonSelectedObjects( true )\n // eslint-disable-next-line no-underscore-dangle\n this._visibilityCache.clear()\n\n this.renderScene.background = currentBackground\n\n // 2. Downsample to Half resolution\n this.fsQuad.material = this.materialCopy\n this.copyUniforms.tDiffuse.value = this.renderTargetMaskBuffer.texture\n renderer.setRenderTarget( this.renderTargetMaskDownSampleBuffer )\n renderer.clear()\n this.fsQuad.render( renderer )\n\n this.tempPulseColor1.copy( this.visibleEdgeColor )\n this.tempPulseColor2.copy( this.hiddenEdgeColor )\n\n if ( this.pulsePeriod > 0 ) {\n\n const scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01 / this.pulsePeriod ) * ( 1.0 - 0.25 ) / 2\n this.tempPulseColor1.multiplyScalar( scalar )\n this.tempPulseColor2.multiplyScalar( scalar )\n\n }\n\n // 3. Apply Edge Detection Pass\n this.fsQuad.material = this.edgeDetectionMaterial\n this.edgeDetectionMaterial.uniforms.maskTexture.value = this.renderTargetMaskDownSampleBuffer.texture\n this.edgeDetectionMaterial.uniforms.texSize.value.set( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height )\n this.edgeDetectionMaterial.uniforms.visibleEdgeColor.value = this.tempPulseColor1\n this.edgeDetectionMaterial.uniforms.hiddenEdgeColor.value = this.tempPulseColor2\n this.edgeDetectionMaterial.uniforms.selectedEdgeColor.value = this.selectedEdgeColor\n renderer.setRenderTarget( this.renderTargetEdgeBuffer1 )\n renderer.clear()\n this.fsQuad.render( renderer )\n\n // 4. Apply Blur on Half res\n this.fsQuad.material = this.separableBlurMaterial1\n this.separableBlurMaterial1.uniforms.colorTexture.value = this.renderTargetEdgeBuffer1.texture\n this.separableBlurMaterial1.uniforms.direction.value = OutlinePass.BlurDirectionX\n this.separableBlurMaterial1.uniforms.kernelRadius.value = this.edgeThickness\n renderer.setRenderTarget( this.renderTargetBlurBuffer1 )\n renderer.clear()\n this.fsQuad.render( renderer )\n this.separableBlurMaterial1.uniforms.colorTexture.value = this.renderTargetBlurBuffer1.texture\n this.separableBlurMaterial1.uniforms.direction.value = OutlinePass.BlurDirectionY\n renderer.setRenderTarget( this.renderTargetEdgeBuffer1 )\n renderer.clear()\n this.fsQuad.render( renderer )\n\n // Apply Blur on quarter res\n this.fsQuad.material = this.separableBlurMaterial2\n this.separableBlurMaterial2.uniforms.colorTexture.value = this.renderTargetEdgeBuffer1.texture\n this.separableBlurMaterial2.uniforms.direction.value = OutlinePass.BlurDirectionX\n renderer.setRenderTarget( this.renderTargetBlurBuffer2 )\n renderer.clear()\n this.fsQuad.render( renderer )\n this.separableBlurMaterial2.uniforms.colorTexture.value = this.renderTargetBlurBuffer2.texture\n this.separableBlurMaterial2.uniforms.direction.value = OutlinePass.BlurDirectionY\n renderer.setRenderTarget( this.renderTargetEdgeBuffer2 )\n renderer.clear()\n this.fsQuad.render( renderer )\n\n // Blend it additively over the input texture\n this.fsQuad.material = this.overlayMaterial\n this.overlayMaterial.uniforms.maskTexture.value = this.renderTargetMaskBuffer.texture\n this.overlayMaterial.uniforms.edgeTexture1.value = this.renderTargetEdgeBuffer1.texture\n this.overlayMaterial.uniforms.edgeTexture2.value = this.renderTargetEdgeBuffer2.texture\n this.overlayMaterial.uniforms.patternTexture.value = this.patternTexture\n this.overlayMaterial.uniforms.edgeStrength.value = this.edgeStrength\n this.overlayMaterial.uniforms.selectedEdgeStrength.value = this.selectedEdgeStrength\n this.overlayMaterial.uniforms.edgeGlow.value = this.edgeGlow\n this.overlayMaterial.uniforms.usePatternTexture.value = this.usePatternTexture\n\n if ( maskActive ) renderer.state.buffers.stencil.setTest( true )\n\n renderer.setRenderTarget( readBuffer )\n this.fsQuad.render( renderer )\n\n // eslint-disable-next-line no-underscore-dangle\n renderer.setClearColor( this._oldClearColor, this.oldClearAlpha )\n renderer.autoClear = oldAutoClear\n\n // Restore default camera state \n this.renderCamera.layers.set(DEFAULT_THREE_NATIVE_LAYER)\n \n // this.restoreSceneVisibility()\n }\n\n if ( this.renderToScreen ) {\n this.fsQuad.material = this.materialCopy\n this.copyUniforms.tDiffuse.value = readBuffer.texture\n renderer.setRenderTarget( null )\n this.fsQuad.render( renderer )\n }\n }\n\n getPrepareMaskMaterial() {\n\n return new THREE.ShaderMaterial( {\n\n uniforms: {\n 'depthTexture': { value: null },\n 'cameraNearFar': { value: new THREE.Vector2( 0.5, 0.5 ) },\n 'textureMatrix': { value: null },\n 'selected': { value: 0 }\n },\n\n vertexShader:\n `#include \n #include \n\n varying vec4 projTexCoord;\n varying vec4 vPosition;\n uniform mat4 textureMatrix;\n\n void main() {\n\n #include \n #include \n #include \n #include \n #include \n\n vPosition = mvPosition;\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n projTexCoord = textureMatrix * worldPosition;\n\n }`,\n\n fragmentShader:\n `#include \n varying vec4 vPosition;\n varying vec4 projTexCoord;\n uniform sampler2D depthTexture;\n uniform vec2 cameraNearFar;\n uniform int selected;\n\n void main() {\n float depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n float viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n float depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n float selectedFlag = selected > 0 ? 1.0 : 0.0;\n gl_FragColor = vec4(0.0, depthTest, selectedFlag, 1.0);\n }`\n\n } )\n\n }\n\n getEdgeDetectionMaterial() {\n\n return new THREE.ShaderMaterial( {\n\n uniforms: {\n 'maskTexture': { value: null },\n 'texSize': { value: new THREE.Vector2( 0.5, 0.5 ) },\n 'visibleEdgeColor': { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },\n 'hiddenEdgeColor': { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },\n 'selectedEdgeColor': { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },\n },\n\n vertexShader:\n `varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }`,\n\n fragmentShader:\n `varying vec2 vUv;\n\n uniform sampler2D maskTexture;\n uniform vec2 texSize;\n uniform vec3 visibleEdgeColor;\n uniform vec3 hiddenEdgeColor;\n uniform vec3 selectedEdgeColor;\n\n void main() {\n vec2 invSize = 1.0 / texSize;\n vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\n vec3 diff1 = (c1.rgb - c2.rgb)*0.5;\n vec3 diff2 = (c3.rgb - c4.rgb)*0.5;\n float d = length(vec2(diff1.r, diff2.r));\n\n// bool anyOne = any(bvec4(c1.r > 0.0, c2.r > 0.0, c3.r > 0.0, c4.r > 0.0));\n bool notAll = !all(bvec4(c1.r > 0.0, c2.r > 0.0, c3.r > 0.0, c4.r > 0.0));\n// float d = anyOne && notAll ? 1.0 : 0.0;\n\n bool anySelected = any(bvec4(c1.b > 0.0, c2.b > 0.0, c3.b > 0.0, c4.b > 0.0));\n float s = anySelected && notAll ? 1.0 : 0.0;\n\n float a1 = min(c1.g, c2.g);\n float a2 = min(c3.g, c4.g);\n float visibilityFactor = min(a1, a2);\n\n vec3 visibleColor = s > 0.5 ? selectedEdgeColor : visibleEdgeColor;\n vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleColor : hiddenEdgeColor;\n\n gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n }`\n } )\n }\n\n getOverlayMaterial() {\n\n return new THREE.ShaderMaterial( {\n\n uniforms: {\n 'maskTexture': { value: null },\n 'edgeTexture1': { value: null },\n 'edgeTexture2': { value: null },\n 'patternTexture': { value: null },\n 'edgeStrength': { value: 1.0 },\n 'selectedEdgeStrength': { value: 1.0 },\n 'edgeGlow': { value: 1.0 },\n 'usePatternTexture': { value: 0.0 }\n },\n\n vertexShader:\n `varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }`,\n\n fragmentShader:\n `varying vec2 vUv;\n\n uniform sampler2D maskTexture;\n uniform sampler2D edgeTexture1;\n uniform sampler2D edgeTexture2;\n uniform sampler2D patternTexture;\n uniform float edgeStrength;\n uniform float selectedEdgeStrength;\n uniform float edgeGlow;\n uniform bool usePatternTexture;\n\n void main() {\n vec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n vec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n vec4 maskColor = texture2D(maskTexture, vUv);\n vec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n float visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n vec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n float selectedFlag = maskColor.b;\n selectedFlag = 0.0;\n float strength = selectedFlag > 0.5 ? selectedEdgeStrength : edgeStrength;\n vec4 finalColor = strength * maskColor.r * edgeValue;\n if(usePatternTexture)\n finalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n gl_FragColor = finalColor;\n }`,\n blending: THREE.NormalBlending,\n depthTest: false,\n depthWrite: false,\n transparent: true\n } )\n\n }\n\n setupObjectMaskPass() {\n for (let i = 0; i < this.selectedObjects.length; i += 1) {\n const selectedObject = this.selectedObjects[i]\n if (selectedObject) {\n const isSelected = selectedObject.isSelected\n selectedObject.traverse((object) => {\n if (object.material && !object.originalMaterial) {\n object.originalMaterial = object.material\n object.material = this.prepareMaskMaterial.clone()\n object.material.uniforms.selected.value = isSelected ? 1 : 0\n // threejs clones the texture, we need to reuse the existing one\n object.material.uniforms.depthTexture.value = this.prepareMaskMaterial.uniforms.depthTexture.value\n }\n })\n }\n }\n }\n\n clearObjectMaskPass() {\n for (let i = 0; i < this.selectedObjects.length; i += 1) {\n const selectedObject = this.selectedObjects[i]\n if (selectedObject) {\n selectedObject.traverse((object) => {\n if (object.originalMaterial) {\n object.material = object.originalMaterial\n delete(object.originalMaterial)\n }\n })\n }\n }\n }\n\n changeVisibilityOfSelectedObjects(bVisible) {\n const cache = this._visibilityCache\n\n for (let i = 0; i < this.selectedObjects.length; i += 1) {\n const selectedObject = this.selectedObjects[i]\n if (selectedObject) {\n selectedObject.traverse((object) => {\n if (!object.isMesh) {\n return\n }\n if (!bVisible) {\n if (!cache.has(object)) {\n cache.set(object, object.visible)\n }\n object.visible = bVisible\n } else {\n object.visible = cache.get(object)\n }\n })\n }\n }\n }\n\n changeVisibilityOfNonSelectedObjects( bVisible ) {\n const cache = this._visibilityCache\n const selectedMeshes = []\n\n for (let i = 0; i < this.selectedObjects.length; i += 1) {\n const selectedObject = this.selectedObjects[i]\n if (selectedObject) {\n selectedObject.traverse((object) => {\n if (object.isMesh && !selectedMeshes.includes(object)) {\n selectedMeshes.push(object)\n }\n })\n }\n }\n\n this.renderScene.traverse((object) => {\n if (object.isMesh || object.isSprite) {\n // only meshes and sprites are supported by OutlinePass\n if (!selectedMeshes.includes(object)) {\n if (!bVisible) {\n if (!cache.has(object)) {\n cache.set(object, object.visible)\n }\n object.visible = bVisible\n } else if (cache.has(object)) {\n object.visible = cache.get(object)\n }\n }\n } else if (object.isPoints || object.isLine) {\n // the visibilty of points and lines is always set to false in order to\n // not affect the outline computation\n if (bVisible) {\n object.visible = cache.get(object) // restore\n } else {\n cache.set(object, object.visible)\n object.visible = bVisible\n }\n }\n })\n }\n\n saveSceneVisibility() {\n this.sceneOriginalVisibility.clear()\n this.renderScene.traverse((object) => {\n if (!object.isMesh) {\n return\n }\n this.sceneOriginalVisibility.set(object, object.visible)\n })\n }\n\n restoreSceneVisibility() {\n this.renderScene.traverse((object) => {\n if (!object.isMesh) {\n return\n }\n if (this.sceneOriginalVisibility.has(object)) {\n const prevVisible = this.sceneOriginalVisibility.get(object)\n if (prevVisible !== object.visible) {\n object.visible = prevVisible\n }\n }\n })\n }\n}\n\nexport default CustomOutlinePass\n\n/* eslint-enable no-param-reassign */\n/* eslint-enable class-methods-use-this */\n/* eslint-enable no-underscore-dangle */\n","import * as THREE from 'three'\n\nimport { RUG_THICKNESS } from 'Renderer/constants'\n\nclass FootprintMaterial extends THREE.ShaderMaterial {\n\n constructor(floorPlane, occlusionTexture, resolution) {\n super()\n\n this.isFootprintMaterial = true\n\n this.depthWrite = false\n this.depthTest = false\n this.colorWrite = false\n this.stencilWrite = true\n this.stencilFunc = THREE.AlwaysStencilFunc\n this.stencilRef = 2\n this.stencilFail = THREE.ReplaceStencilOp\n this.stencilZFail = THREE.ReplaceStencilOp\n this.stencilZPass = THREE.ReplaceStencilOp\n\n this.rugSurfacePlane = new THREE.Plane().copy(floorPlane)\n this.rugSurfacePlane.constant -= RUG_THICKNESS\n\n this.clipping = true\n this.clipIntersection = true\n this.clippingPlanes = [\n this.rugSurfacePlane\n ]\n\n this.uniforms = {\n invModelMatrix: { value: new THREE.Matrix4() },\n occlusionMap: { value: occlusionTexture },\n resolution: { value: resolution },\n }\n\n this.vertexShader = `\n #include \n\n #include \n #include \n #include \n #if NUM_CLIPPING_PLANES > 0\n uniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n #endif\n\n varying vec4 projTexCoord;\n varying vec4 vPosition;\n uniform mat4 textureMatrix;\n\n uniform mat4 invModelMatrix;\n\n void main() {\n vec4 transformed = vec4(position.xyz, 1.0);\n\n #if NUM_CLIPPING_PLANES > 0\n vClipPosition = -(modelViewMatrix * transformed).xyz;\n #endif \n\n vec4 worldPosition = modelMatrix * transformed;\n\n #if NUM_CLIPPING_PLANES > 0\n // project on the rug plane\n vec4 plane = clippingPlanes[0];\n worldPosition.xyz = worldPosition.xyz + plane.xyz * -(dot(plane.xyz, worldPosition.xyz) + plane.w);\n #endif\n\n transformed = invModelMatrix * worldPosition;\n\n vec4 mvPosition = modelViewMatrix * transformed;\n gl_Position = projectionMatrix * mvPosition;\n vPosition = mvPosition;\n\n projTexCoord = textureMatrix * worldPosition;\n }\n `\n\n this.fragmentShader = `\n #include \n #include \n\n uniform sampler2D occlusionMap;\n uniform vec2 resolution;\n\n void main() {\n #if NUM_CLIPPING_PLANES > 0\n vec4 plane;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\n plane = clippingPlanes[ i ];\n if ( dot( vClipPosition, plane.xyz ) < plane.w ) discard;\n\n }\n #pragma unroll_loop_end\n\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = ( dot( vClipPosition, plane.xyz ) < plane.w ) && clipped;\n }\n #pragma unroll_loop_end\n\n if ( clipped ) discard;\n #endif\n #endif\n\n // Salma Jiddi: depth_occlusion_0: The ALPHA channel's most significant bit \n // contains the inverse floor mask where:\n // False: Areas that were segmented as floor.\n // True: All other regions.\n float occlusionAlpha = texture2D(occlusionMap, (gl_FragCoord.xy) / resolution).a;\n if (occlusionAlpha > 0.0) {\n //gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n discard;\n } else {\n gl_FragColor = vec4(0.0, 0.5, 0.5, 1.0);\n }\n }\n `\n }\n\n /* eslint-disable no-param-reassign */\n static refreshUniforms(renderer, scene, camera, geometry, material, group, mesh) {\n if (!material.isFootprintMaterial) {\n return\n }\n material.uniforms.invModelMatrix.value.copy(mesh.matrixWorld)\n material.uniforms.invModelMatrix.value.invert()\n material.uniformsNeedUpdate = true\n }\n /* eslint-enable no-param-reassign */\n}\n\nexport default FootprintMaterial","import * as THREE from 'three'\nimport { IUniform } from 'three'\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass'\nimport { CopyShader } from 'three/examples/jsm/shaders/CopyShader'\n\n// YP: Based three's TAARenderPass, which in turn is based on SSAARenderPass, with customization required for\n// SugarCube (e.g. multiple scenes rendering):\n// three/examples/jsm/postprocessing/TAARenderPass.js\n// three/examples/jsm?postprocessing/SSAARenderPass.js\n// https://en.wikipedia.org/wiki/Supersampling\n\n\nconst jitterVectors = [\n [\n [0, 0]\n ],\n [\n [4, 4], [-4, -4]\n ],\n [\n [-2, -6], [6, -2], [-6, 2], [2, 6]\n ],\n [\n [1, -3], [-1, 3], [5, 1], [-3, -5],\n [-5, 5], [-7, -1], [3, 7], [7, -7],\n ],\n [\n [1, 1], [-1, -3], [-3, 2], [4, -1],\n [-5, -2], [2, 5], [5, 3], [3, -5],\n [-2, 6], [0, -7], [-4, -6], [-6, 4],\n [-8, 0], [7, -4], [6, 7], [-7, -8],\n ],\n [\n [-4, -7], [-7, -5], [-3, -5], [-5, -4],\n [-1, -4], [-2, -2], [-6, -1], [-4, 0],\n [-7, 1], [-1, 2], [-6, 3], [-3, 3],\n [-7, 6], [-3, 6], [-5, 7], [-1, 7],\n [5, -7], [1, -6], [6, -5], [4, -4],\n [2, -3], [7, -2], [1, -1], [4, -1],\n [2, 1], [6, 2], [0, 4], [4, 4],\n [2, 5], [7, 5], [5, 6], [3, 7],\n ]\n]\ninterface ExtendedCamera extends THREE.Camera {\n setViewOffset(fullWidth: number, fullHeight: number, x: number,\n y: number, width: number, height: number): void\n clearViewOffset() : void\n view: {\n enabled: boolean\n fullWidth: number\n fullHeight: number\n offsetX: number\n offsetY: number\n width: number\n height: number\n }\n}\n\ntype RenderFunction = (renderer: THREE.WebGLRenderer, writeBuffer: THREE.WebGLRenderTarget,\n readBuffer: THREE.WebGLRenderTarget) => void\nclass CustomTAARenderPass extends Pass {\n camera: ExtendedCamera\n\n sampleLevel: number\n\n accumulate: boolean\n\n accumulateIndex: number\n\n holdRenderTarget: THREE.WebGLRenderTarget | null\n\n sampleRenderTarget: THREE.WebGLRenderTarget | null\n\n copyUniforms: { [uniform: string]: IUniform }\n\n fsQuad: FullScreenQuad\n\n renderFunction: RenderFunction\n\n unbiased: boolean\n\n clearColor: THREE.ColorRepresentation\n\n clearAlpha: number\n\n oldClearColor: THREE.Color\n\n copyMaterial: THREE.ShaderMaterial\n\n isCustomTAARenderPass: boolean\n\n constructor(camera: ExtendedCamera, renderFunction: RenderFunction) {\n\n super()\n\n this.isCustomTAARenderPass = true\n\n this.camera = camera\n\n this.accumulateIndex = -1\n this.sampleLevel = 0\n this.accumulate = false\n\n this.holdRenderTarget = null\n this.sampleRenderTarget = null\n\n this.renderFunction = renderFunction\n\n this.unbiased = true\n\n // as we need to clear the buffer in this pass, clearColor must be set to something, defaults to black.\n this.clearColor = 0x000000\n this.clearAlpha = 0\n this.oldClearColor = new THREE.Color()\n\n const copyShader = CopyShader\n this.copyUniforms = THREE.UniformsUtils.clone(copyShader.uniforms)\n\n this.copyMaterial = new THREE.ShaderMaterial({\n uniforms: this.copyUniforms,\n vertexShader: copyShader.vertexShader,\n fragmentShader: copyShader.fragmentShader,\n premultipliedAlpha: true,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false\n })\n\n this.fsQuad = new FullScreenQuad(this.copyMaterial)\n }\n\n render(renderer: THREE.WebGLRenderer, writeBuffer: THREE.WebGLRenderTarget,\n readBuffer: THREE.WebGLRenderTarget) {\n\n if (!this.sampleRenderTarget) {\n this.sampleRenderTarget = new THREE.WebGLRenderTarget(readBuffer.width, readBuffer.height, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n format: THREE.RGBAFormat,\n type: THREE.FloatType,\n })\n this.sampleRenderTarget.texture.name = `SSAARenderPass.sample`\n }\n\n if (!this.accumulate) {\n this.renderInternal(renderer, writeBuffer, readBuffer)\n this.accumulateIndex = - 1\n return\n }\n\n const jitterOffsets = jitterVectors[5]\n\n if (!this.holdRenderTarget) {\n this.holdRenderTarget = new THREE.WebGLRenderTarget(readBuffer.width, readBuffer.height, {\n encoding: THREE.sRGBEncoding,\n stencilBuffer: true,\n })\n this.holdRenderTarget.texture.name = `TAARenderPass.hold`\n }\n\n if (this.accumulate && this.accumulateIndex === - 1) {\n this.renderInternal(renderer, this.holdRenderTarget, readBuffer)\n this.accumulateIndex = 0\n }\n\n const oldRT = renderer.getRenderTarget()\n const autoClear = renderer.autoClear\n // eslint-disable-next-line no-param-reassign\n renderer.autoClear = false\n\n const sampleWeight = 1.0 / (jitterOffsets.length)\n\n if (this.accumulateIndex >= 0 && this.accumulateIndex < jitterOffsets.length) {\n\n this.copyUniforms.opacity.value = sampleWeight\n this.copyUniforms.tDiffuse.value = writeBuffer.texture\n\n // render the scene multiple times, each slightly jitter offset from the last and accumulate the results.\n const numSamplesPerFrame = 2 ** this.sampleLevel\n for (let i = 0; i < numSamplesPerFrame; i += 1) {\n const j = this.accumulateIndex\n const jitterOffset = jitterOffsets[j]\n\n if (this.camera.setViewOffset) {\n this.camera.setViewOffset( readBuffer.width, readBuffer.height,\n jitterOffset[0] * 0.0625, jitterOffset[1] * 0.0625, // 0.0625 = 1 / 16\n readBuffer.width, readBuffer.height )\n }\n\n renderer.setRenderTarget(writeBuffer)\n renderer.clear()\n // renderer.render(this.scene, this.camera)\n this.renderFunction(renderer, readBuffer, writeBuffer)\n\n renderer.setRenderTarget(this.sampleRenderTarget)\n if (this.accumulateIndex === 0) {\n renderer.clear()\n }\n\n this.fsQuad.render(renderer)\n\n this.accumulateIndex += 1\n\n if (this.accumulateIndex >= jitterOffsets.length) {\n break;\n }\n }\n\n if (this.camera.clearViewOffset) {\n this.camera.clearViewOffset()\n }\n }\n const accumulationWeight = this.accumulateIndex * sampleWeight\n if (accumulationWeight > 0) {\n this.copyUniforms.opacity.value = 1.0\n this.copyUniforms.tDiffuse.value = this.sampleRenderTarget.texture\n renderer.setRenderTarget(writeBuffer)\n renderer.clear()\n this.fsQuad.render(renderer)\n }\n if ( accumulationWeight < 1.0 ) {\n this.copyUniforms.opacity.value = 1.0 - accumulationWeight\n this.copyUniforms.tDiffuse.value = this.holdRenderTarget.texture\n renderer.setRenderTarget(writeBuffer)\n if (accumulationWeight === 0) {\n renderer.clear()\n }\n this.fsQuad.render(renderer)\n }\n\n // eslint-disable-next-line no-param-reassign\n renderer.autoClear = autoClear\n renderer.setRenderTarget(oldRT)\n }\n\n renderInternal(renderer: THREE.WebGLRenderer, writeBuffer: THREE.WebGLRenderTarget, \n readBuffer: THREE.WebGLRenderTarget) {\n if (!this.sampleRenderTarget) {\n return\n }\n\n const jitterOffsets = jitterVectors[Math.max(0, Math.min(this.sampleLevel, 5))]\n\n const oldRT = renderer.getRenderTarget()\n const autoClear = renderer.autoClear\n // eslint-disable-next-line no-param-reassign\n renderer.autoClear = false\n\n renderer.getClearColor(this.oldClearColor)\n const oldClearAlpha = renderer.getClearAlpha()\n\n const baseSampleWeight = 1.0 / jitterOffsets.length\n const roundingRange = 1 / 32\n this.copyUniforms.tDiffuse.value = this.sampleRenderTarget.texture\n\n const viewOffset = {\n fullWidth: readBuffer.width,\n fullHeight: readBuffer.height,\n offsetX: 0,\n offsetY: 0,\n width: readBuffer.width,\n height: readBuffer.height\n }\n\n const originalViewOffset = { ...this.camera.view }\n\n if (originalViewOffset.enabled) {\n Object.assign(viewOffset, originalViewOffset)\n }\n\n // render the scene multiple times, each slightly jitter offset from the last and accumulate the results.\n for (let i = 0; i < jitterOffsets.length; i += 1) {\n const jitterOffset = jitterOffsets[i]\n if (this.camera.setViewOffset) {\n this.camera.setViewOffset(\n viewOffset.fullWidth, viewOffset.fullHeight,\n viewOffset.offsetX + jitterOffset[ 0 ] * 0.0625, viewOffset.offsetY + jitterOffset[ 1 ] * 0.0625, // 0.0625 = 1 / 16\n viewOffset.width, viewOffset.height\n )\n }\n\n let sampleWeight = baseSampleWeight\n\n if (this.unbiased) {\n // the theory is that equal weights for each sample lead to an accumulation of rounding errors.\n // The following equation varies the sampleWeight per sample so that it is uniformly distributed\n // across a range of values whose rounding errors cancel each other out.\n const uniformCenteredDistribution = (-0.5 + (i + 0.5) / jitterOffsets.length)\n sampleWeight += roundingRange * uniformCenteredDistribution\n }\n\n this.copyUniforms.opacity.value = sampleWeight\n renderer.setClearColor(this.clearColor, this.clearAlpha)\n renderer.setRenderTarget(writeBuffer)\n renderer.clear()\n // renderer.render(this.scene, this.camera)\n this.renderFunction(renderer, readBuffer, writeBuffer)\n\n // renderer.setRenderTarget(this.renderToScreen ? null : writeBuffer)\n\n // if (i === 0) {\n // renderer.setClearColor(0x000000, 0.0)\n // renderer.clear()\n // }\n\n // this.fsQuad.render(renderer)\n }\n\n if (this.camera.setViewOffset && originalViewOffset.enabled) {\n this.camera.setViewOffset(\n originalViewOffset.fullWidth, originalViewOffset.fullHeight,\n originalViewOffset.offsetX, originalViewOffset.offsetY,\n originalViewOffset.width, originalViewOffset.height\n )\n } else if ( this.camera.clearViewOffset ) {\n this.camera.clearViewOffset()\n }\n\n renderer.setRenderTarget(oldRT)\n // eslint-disable-next-line no-param-reassign\n renderer.autoClear = autoClear\n renderer.setClearColor(this.oldClearColor, oldClearAlpha)\n }\n\n dispose() {\n if (this.holdRenderTarget) {\n this.holdRenderTarget.dispose()\n }\n if (this.sampleRenderTarget) {\n this.sampleRenderTarget.dispose()\n }\n }\n}\n\nexport default CustomTAARenderPass","/* eslint-disable no-plusplus */\n\nimport * as Sentry from '@sentry/react'\nimport WallspiceWebgl, { DirectionVectorMap } from 'Renderer/WallspiceWebgl'\nimport TimeMetric from 'utils/timeMetric'\nimport GlMemoryRecorder from 'Renderer/GlMemoryRecorder'\nimport TextureHelper from 'Renderer/TextureHelper'\n\nimport * as THREE from 'three'\n\nimport {\n loadManifestTexture,\n loadManifestImagePixels,\n} from 'Renderer/manifestImageLoader'\n\nimport * as WallSnap from 'Renderer/WallSnap'\n// import { EXRLoader } from 'three/examples/jsm/loaders/EXRLoader.js'\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'\n\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'\nimport { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js'\nimport { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js'\n\nimport FurnitureManager from 'Renderer/FurnitureManager'\nimport CustomRenderPass from 'Renderer/CustomRenderPass'\nimport CustomOutlinePass from 'Renderer/CustomOutlinePass'\nimport FootprintMaterial from 'Renderer/FootprintMaterial'\nimport CustomTAARenderPass from 'Renderer/CustomTAARenderPass'\n\nimport { computeEraseRegionGridPoints } from 'Renderer/MagicEraserUtils'\n\nimport {\n DEFAULT_MOBILE_TEXTURE_SIZE,\n DEFAULT_THREE_NATIVE_LAYER,\n SENTRY_BREADCRUMB_CATEGORY,\n STATIC_STACKABLES_THREE_NATIVE_LAYER,\n AA_FXAA,\n AA_TAA,\n} from 'Renderer/constants'\n\nimport isMobile from 'utils/isMobile'\nimport getMaxWindowSize from 'utils/getMaxWindowSize'\nimport generateThumbnailFromPreview from 'utils/generateThumbnailFromPreview'\n\nimport Stats from 'stats.js'\nimport './style.scss'\n\nconst EDGE_THICKNESS_THICK = 0.25\nconst EDGE_THICKNESS_THIN = 0.25\n\nconst EDGE_STRENGTH_THICK = 2.65\nconst EDGE_STRENGTH_THIN = 2.25\n\nconst WGL_GPU_FRAME_TIME_EXT_NAME = 'EXT_disjoint_timer_query_webgl2'\n\nlet rendererInstance = null\nclass Renderer {\n constructor({\n canvas,\n scene: sceneData,\n debugSettings,\n previewSettings: settings,\n onFirstRender,\n onReady,\n saveData,\n onUpdateSaveData,\n onWallDataReady,\n maxTextureSize,\n updateHiddenSurfaces,\n onInitializationFailure,\n }) {\n if (rendererInstance) {\n // eslint-disable-next-line no-console\n console.error('Renderer instance already present.')\n rendererInstance.activeRenderer = false\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n rendererInstance = this\n\n this.showOutlines = true\n\n this.furnitureManager = new FurnitureManager()\n\n // The renderer might get disposed and recreated; so the current active instance is tracked to avoid race conditions\n this.activeRenderer = true\n\n this.onInitializationFailure = onInitializationFailure\n this.defaultDownloadOptions = { onFail: this.onInitializationFailure }\n\n this.sceneData = sceneData\n this.manifest = sceneData.manifest\n this.onFirstRender = onFirstRender\n this.onReady = onReady\n this.onUpdateSaveData = onUpdateSaveData\n this.intrinsics = [\n this.manifest.intrinsics_0.m11,\n this.manifest.intrinsics_0.m22,\n this.manifest.intrinsics_0.m31,\n this.manifest.intrinsics_0.m32,\n ]\n this.pointLights = []\n this.directionalLights = []\n this.ambientLight = null\n\n // eslint-disable-next-line no-constant-condition\n if (this.sceneData.manifest.segmentation_inpainting_0) {\n this.maskDataURL = \"segmentation_inpainting_0\"\n this.planeOrientation = this.sceneData.manifest.plane_orientation_inpaint_0\n this.maskG = true\n } else if (this.sceneData.manifest.normals_segmentation_inpaint_0) {\n this.maskDataURL = \"normals_segmentation_inpaint_0\"\n this.planeOrientation = this.sceneData.manifest.plane_orientation_inpaint_0\n } else {\n this.maskDataURL = \"normals_segmentation_0\"\n this.planeOrientation = this.sceneData.manifest.plane_orientation_0\n }\n\n this.loadedItems = 0\n this.loadedTotalSize = 0\n this.loadingItems = 0\n this.onWallDataReady = onWallDataReady\n this.doUpdateHiddenSurfaces = updateHiddenSurfaces\n\n this.additionalDataLoadSize = 0.0\n\n // Cache reflections for furniture\n this.cubeTex = null\n\n this.canvas = canvas\n this.wallWidth = 1\n this.wallHeight = 1\n this.camera = WallspiceWebgl.createCamera(this.intrinsics, this.wallWidth, this.wallHeight)\n\n this.hasWebPSupport = Renderer.checkWebPSupport()\n\n this.ThreeWGLrenderer = WallspiceWebgl.createRenderer(canvas)\n if (!this.ThreeWGLrenderer) {\n this.onInitializationFailure({ description: `Failed to initialize WebGl context.`, webglfailure: true})\n }\n this.contextInfo = WallspiceWebgl.queryContextInfo(this.ThreeWGLrenderer)\n this.hasRendered = false\n\n this.glMemoryRecorder = null\n if (this.ThreeWGLrenderer) {\n this.glMemoryRecorder = new GlMemoryRecorder(this.ThreeWGLrenderer.getContext())\n this.glMemoryRecorder.start()\n }\n\n this.wallTexture = null\n\n this.settings = settings\n\n /* webgl has support for meassuring elapsed time for execution of wegl commands via an extension.\n Note that all webgl commands are invoked asynchroneously. This extension injects a marker into \n the command stream and valid query results is readback a few frames later. \n For further details, please take a look at:\n https://www.khronos.org/registry/webgl/extensions/EXT_disjoint_timer_query_webgl2/ \n */\n this.gpuFrametime = {\n enable: false,\n enableQuery: true,\n enableStats: false,\n lastQueryResultMS: 0,\n mintime: Infinity,\n maxtime: -Infinity,\n cumulativeAvg: 0,\n numSamples: 0,\n ext: this.ThreeWGLrenderer && this.ThreeWGLrenderer.getContext().getExtension(WGL_GPU_FRAME_TIME_EXT_NAME)\n }\n\n this.maxTextureSize = maxTextureSize || DEFAULT_MOBILE_TEXTURE_SIZE\n this.textureHelper = new TextureHelper(this)\n\n this.debugSettings = debugSettings\n this.debugVizObjects = []\n this.debugLightHelpers = []\n this.updateDebugSettings(this.debugSettings)\n\n this.shadowfloor = null\n this.shadowfloorBlack = null\n this.highlightMesh = null\n this.occlusionMesh = null\n this.segmentsMesh = null\n this.emptyOcclusionMesh = null\n this.occlusionImage = null\n this.foregroundMesh = null\n this.emptyRGB = null\n this.unemptyRGB = null\n this.segsData = null\n this.segsDataFeather = null\n this.segsTex = null\n this.paintData = null\n this.paintTex = null\n this.highlightSeg = 1024\n this.paintSet = saveData.erasedSegments ? new Set(saveData.erasedSegments) : new Set()\n\n this.initialWallPaint = saveData.wallPaint || null\n this.compositeBg = null\n\n this.fullyInitialized = false\n\n this.sceneMid = this.generateLitScene(0) // eventually gone\n this.mid = false\n this.sceneFront = this.generateLitScene(1)\n this.sceneOverlay = this.generateImageOverlayScene()\n\n this.aaType = null\n this.composer = null\n this.renderPass = null\n this.outlinePass = null\n this.antiAliasPass = null\n\n this.resetLights()\n if (!this.debugSettings.useMultiShadow) {\n this.allLightOneShadow()\n }\n\n this.shouldRender = true\n this.renderIsDirty = false\n // if previous frame was dirty, used for gathering frame metrics\n this.renderWasDirty = false\n // if any items were loading during last render\n this.itemsWereLoading = false\n // if magic window was loading during last render\n this.magicWindowWasLoading = false\n\n const frameBins = [\n { title: 'frame 0-15 ms', value: 15.0 },\n { title: 'frame 15-40 ms', value: 40.0 },\n { title: 'frame 40-100 ms', value: 100.0 },\n { title: 'frame 100-200 ms', value: 200.0 },\n { title: 'frame 200-500 ms', value: 500 },\n { title: 'frame 500-1000 ms', value: 1000.0 },\n { title: 'frame 1000-2000 ms', value: 2000.0 },\n { title: 'frame 2000-inf ms', value: null },\n ]\n this.frameMetric = new TimeMetric(frameBins)\n this.frameMetricLoading = new TimeMetric(frameBins.map(obj => ({\n title: `loading ${obj.title}`,\n value: obj.value,\n })))\n this.activeFrameMetric = null\n\n this.stackingPlanes = new Map()\n this.renderItems = new Map()\n this.raycaster = new THREE.Raycaster(new THREE.Vector3(), new THREE.Vector3(), 0.1, 10000.0)\n this.hasStaticStackableSurfaces = false\n\n // used during loading of a saved composition to re-link items to corresponding surfaces\n this.delayedStackedLinks = new Map()\n\n this.oneTimeRenderCallbacks = []\n this.scheduledRenderCallbacks = []\n\n this.animationFrameId = null\n this.animate = this.animate.bind(this)\n this.animate()\n\n this.footprintMaterial = null\n this.floorWorldPlane = new THREE.Plane(new THREE.Vector3(0.0, 1, 0.0).normalize(), 0.0)\n this.loadWallData()\n }\n\n static getInstance() {\n return rendererInstance\n }\n\n static newInstance(params) {\n rendererInstance = new Renderer(params)\n }\n\n isRendererValid() {\n return this.ThreeWGLrenderer !== null\n }\n\n setGPUframetime(onoff) {\n if (onoff === this.gpuFrametime.enable) {\n return\n }\n\n if (onoff && !this.gpuFrametime.queryObj) {\n if (this.gpuFrametime.ext && typeof this.ThreeWGLrenderer.getContext().createQuery !== 'undefined') {\n this.gpuFrametime.queryObj = this.ThreeWGLrenderer.getContext().createQuery()\n this.gpuFrametime.enable = true\n }\n } else {\n if (this.gpuFrametime.queryObj) {\n const gl = this.ThreeWGLrenderer.getContext()\n gl.deleteQuery(this.gpuFrametime.queryObj)\n }\n this.gpuFrametime.queryObj = null\n this.gpuFrametime.enable = false\n }\n\n this.enableGPUframeStats(onoff)\n }\n\n enableGPUframeStats(onOff) {\n this.gpuFrametime.enableStats = onOff\n if (this.gpuFrametime.enableStats) {\n const debugInfoDiv = document.createElement('div')\n debugInfoDiv.setAttribute('id', 'debugInfo')\n this.gpuFrametime.stats = new Stats()\n this.gpuFrametime.queryPanel = this.gpuFrametime.stats.addPanel(new Stats.Panel('webgl-ms', '#ff8', '#221'))\n this.gpuFrametime.stats.showPanel(3)\n this.gpuFrametime.stats.domElement.setAttribute('id', 'gpuftstats')\n debugInfoDiv.appendChild(this.gpuFrametime.stats.domElement)\n\n // create a pre as a container for textnode as it handles \\n escape for new lines.\n const newpre = document.createElement('pre')\n newpre.setAttribute('id', 'gpuftpre')\n const newcontent = document.createTextNode('GPU frame times: ')\n newpre.appendChild(newcontent)\n debugInfoDiv.appendChild(newpre)\n\n this.canvas.parentNode.appendChild(debugInfoDiv)\n this.gpuFrametime.statsTextDom = newcontent\n\n this.gpuFrametime.debugInfoDiv = debugInfoDiv\n }\n else if (this.gpuFrametime.debugInfoDiv) {\n this.canvas.parentNode.removeChild(this.gpuFrametime.debugInfoDiv)\n this.gpuFrametime.debugInfoDiv = null\n }\n }\n\n onMouseMove(e) {\n if (this.settings.magicEraserMode)\n this.updateHighlightFromPosition(e, true)\n }\n\n onClick(e) {\n if (this.settings.magicEraserMode) {\n this.infillSegmentFromPosition(e)\n this.updateHighlightFromPosition(e, false)\n }\n }\n\n eraseRegionPlaneIDs(regionID) {\n if (!this.eraseRegionSurfaceCache)\n this.eraseRegionSurfaceCache = new Map()\n\n const cachedResult = this.eraseRegionSurfaceCache.get(regionID)\n\n if (cachedResult)\n return cachedResult\n\n const ids = new Set()\n this.eraseRegionSurfaceCache.set(regionID, ids)\n\n const gridPoints = this.eraseRegionGridPoints.get(regionID)\n\n if (!gridPoints)\n return ids\n\n for(let i = 0; i < gridPoints.length; i++) {\n const p = gridPoints[i];\n\n const pids = this.getStaticSurfacePlaneIDsAtPoint(p[0], p[1])\n\n pids.forEach(pid => {\n ids.add(pid)\n })\n }\n\n return ids\n }\n\n getStaticSurfacePlaneIDsAtPoint(relX, relY) {\n this.setupRaycaster(relX, relY)\n\n const targets = []\n\n if (this.sceneMid)\n targets.push(this.sceneMid.children)\n\n if (this.sceneFront)\n targets.push(this.sceneFront.children)\n\n const staticPlaneHits = targets.flatMap(target => {\n const hits = this.raycaster.intersectObjects(target, true)\n\n return hits.filter(\n hit => (\n hit\n && hit.object\n && hit.object.userData\n && hit.object.userData.isStaticSurface\n && hit.object.stackablePlaneId\n )\n )\n })\n\n return staticPlaneHits.map(hit => hit.object.stackablePlaneId)\n }\n\n updateHiddenSurfaces() {\n if (!this.staticStackablesLoaded || !this.eraseRegionGridPoints || !this.segsData)\n return\n\n //\n // This.eraseRegionSurfaceCache is used inside of\n // eraseRegionPlaneIDs(). In scenes with many erase regions\n // eraseRegionPlaneIDs() may need to perform hundreds of ray\n // casts. It does does these ray casts just once and caches\n // the results. A few hundreds ray casts only takes 100-200ms,\n // but it can make the \"Hide All\" button appear to have\n // a slight delay the first time it is pressed. The code in\n // this block warms the cache to prevent this delay. This\n // method triggers when first loading the room, so this cache\n // warming is guaranteed to happen.\n //\n\n if (!this.eraseRegionSurfaceCache) {\n this.segsData.segments.forEach(segID => {\n // Calling this method warms its internal\n // cache. We call it but ignore the results.\n this.eraseRegionPlaneIDs(segID)\n })\n }\n\n const surfs = new Set()\n\n this.paintSet.forEach(segID => {\n this.eraseRegionPlaneIDs(segID).forEach(id => {\n surfs.add(id)\n })\n })\n\n this.doUpdateHiddenSurfaces([...surfs])\n }\n\n syncPaintSet() {\n this.updateSaveData()\n this.updateHiddenSurfaces()\n }\n\n updateSaveData() {\n if (!this.segsData)\n return\n\n const saveData = {\n erasedSegments: [...this.paintSet],\n }\n const trackingInfo = {\n EraseableItems: this.segsData.numSegments,\n }\n\n this.onUpdateSaveData(saveData, trackingInfo)\n }\n\n incrementLoadedItems(size) {\n this.loadedItems += 1\n this.loadedTotalSize += size\n }\n\n decrementLoadedItems(size) {\n this.loadedItems -= 1\n this.loadedTotalSize -= size\n }\n\n incrementLoadingItems() {\n this.loadingItems += 1\n }\n\n decrementLoadingItems() {\n this.loadingItems -= 1\n }\n\n getWallDimensions() {\n return [this.wallWidth, this.wallHeight]\n }\n\n getRenderDimensions() {\n if (this.depthData) {\n return [this.depthData.width, this.depthData.height]\n }\n if (this.maskData) {\n return [this.maskData.width, this.maskData.height]\n }\n return null\n }\n\n setMaskData(maskData) {\n if (!maskData || !maskData.data) {\n return\n }\n\n if (this.maskG) {\n this.maskData = maskData\n // mask and shift green channel to blue (for now)\n for (let i = 0; i < this.maskData.width * this.maskData.height; i += 1) {\n const pix = i * 4\n this.maskData.data[pix + 2] = this.maskData.data[pix + 1]\n }\n } else {\n this.maskData = maskData\n }\n this.updateFloorLines()\n }\n\n async loadWallData() {\n if (!this.sceneData || !this.manifest) {\n return\n }\n\n const results = await Promise.all([\n loadManifestTexture(this.sceneData.manifest, \"pano_0\", this.defaultDownloadOptions),\n loadManifestImagePixels(this.sceneData.manifest, this.maskDataURL, this.textureHelper)\n ])\n\n if (!this.activeRenderer) return\n\n const wallTexture = results[0] ? results[0].texture : null\n const maskData = results[1] ? results[1].pixels : null\n\n this.additionalDataLoadSize += results.reduce(\n (accum, curr) => accum + (curr ? curr.size : 0),\n 0.0\n )\n\n this.wallTexture = wallTexture\n this.setMaskData(maskData)\n this.depthData = null\n\n if (this.wallTexture) {\n this.wallTexture.flipY = false\n this.wallTexture.encoding = THREE.sRGBEncoding\n this.wallTexture.needsUpdate = true\n }\n\n this.lateInitialization()\n\n this.onWallDataReady(this.wallWidth, this.wallHeight)\n }\n\n lateInitialization() {\n this.wallWidth = (this.wallTexture && this.wallTexture.image) ? this.wallTexture.image.width : 1\n this.wallHeight = (this.wallTexture && this.wallTexture.image) ? this.wallTexture.image.height : 1\n\n this.camera = WallspiceWebgl.createCamera(this.intrinsics, this.wallWidth, this.wallHeight)\n\n Sentry.addBreadcrumb({\n category: SENTRY_BREADCRUMB_CATEGORY,\n message: 'Initial canvas size',\n data: {\n width: this.canvas.width,\n height: this.canvas.height,\n wallWidth: this.wallWidth,\n wallHeight: this.wallHeight,\n }\n })\n\n // Sometimes (rarely) when the tab is inactive, react throttles the components update function calls \n // causing the renderer to initialize before the canvas dimension are set by the PreviewContainer\n if (!this.canvas.width) {\n this.canvas.width = this.settings.canvasWidth || getMaxWindowSize()\n }\n\n this.canvas.height = this.wallWidth > 0 ? this.canvas.width * (this.wallHeight / this.wallWidth) : 0\n\n Sentry.addBreadcrumb({\n category: SENTRY_BREADCRUMB_CATEGORY,\n message: 'Final canvas size',\n data: {\n width: this.canvas.width,\n height: this.canvas.height,\n }\n })\n\n if (this.ThreeWGLrenderer) {\n this.ThreeWGLrenderer.setSize(this.canvas.width, this.canvas.height)\n }\n\n this.sceneBack = this.generateBackgroundScene()\n\n if (!isMobile()) {\n this.generateOcclusionScene().then((scene) => {\n this.sceneOcclusion = scene\n }).catch((error) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error)\n Sentry.captureException(new Error('Error during occlusion scene generation.', { cause: error }))\n }\n }).finally(() => {\n this.fullyInitialized = true\n })\n } else {\n // assuming here that the code below is synchronous\n this.fullyInitialized = true\n }\n\n this.sceneOverlay = this.generateImageOverlayScene()\n this.createForegroundMesh(this.sceneMid)\n\n if (!this.composer) {\n this.initPostprocessing()\n } else {\n this.composer.setSize(this.canvas.width, this.canvas.height)\n this.outlinePass.camera = this.camera\n }\n\n // re-apply 2d positions and update render items properties\n this.renderItems.forEach(item => {\n item.refresh2DPosition()\n if (item.update) {\n item.update()\n }\n })\n\n this.setRenderIsDirty()\n }\n\n initFloorPlane() {\n if (!this.manifest || !this.planeOrientation || !this.occlusionImage) {\n return\n }\n const floorPlaneIdx = this.planeOrientation.planeData.findIndex(plane => plane.class === 'floor')\n if (floorPlaneIdx < 0) {\n return\n }\n const floorPlane = this.planeOrientation.planeData[floorPlaneIdx]\n\n this.occlusionTexture = new THREE.DataTexture(\n this.occlusionImage.data,\n this.occlusionImage.width,\n this.occlusionImage.height,\n )\n this.occlusionTexture.flipY = true\n this.occlusionTexture.needsUpdate = true\n\n this.floorWorldPlane = new THREE.Plane(new THREE.Vector3(floorPlane.rot[2][0], floorPlane.rot[2][1], floorPlane.rot[2][2]), floorPlane.d)\n\n const resolution = new THREE.Vector2(this.canvas.width, this.canvas.height)\n this.footprintMaterial = new FootprintMaterial(this.floorWorldPlane, this.occlusionTexture, resolution)\n }\n\n initPostprocessing() {\n if (!this.ThreeWGLrenderer || isMobile()) {\n return\n }\n\n this.composer = new EffectComposer(this.ThreeWGLrenderer)\n this.composer.renderTarget1.texture.encoding = THREE.sRGBEncoding\n this.composer.renderTarget1.stencilBuffer = true\n this.composer.renderTarget2.texture.encoding = THREE.sRGBEncoding\n this.composer.renderTarget2.stencilBuffer = true\n\n this.renderPass = new CustomRenderPass(this.drawTheThings.bind(this))\n this.composer.addPass(this.renderPass)\n\n this.outlinePass = new CustomOutlinePass(new THREE.Vector2(this.canvas.width, this.canvas.height),\n this.sceneFront, this.camera, [], this.sceneOcclusion)\n this.outlinePass.enabled = this.showOutlines\n this.outlinePass.visibleEdgeColor.set(0xffdb00)\n this.outlinePass.selectedEdgeColor.set(0xffdb00)\n this.outlinePass.hiddenEdgeColor.set(0xffdb00)\n this.outlinePass.edgeThickness = EDGE_THICKNESS_THIN\n this.outlinePass.edgeStrength = EDGE_STRENGTH_THIN\n this.composer.addPass(this.outlinePass)\n\n this.setAntiAliasing(AA_TAA)\n }\n\n updateFloorLines() {\n if (!this.maskData)\n return\n\n this.floorLines = WallSnap.makeFloorLines(\n this.planeOrientation.planeData,\n this.maskData,\n this.intrinsics\n )\n }\n\n setupRaycaster(relX, relY) {\n const start = new THREE.Vector3(0.0, 0.0, 0.0)\n const fx = this.intrinsics[0]\n const fy = this.intrinsics[1]\n const ppx = this.intrinsics[2]\n const ppy = this.intrinsics[3]\n const w = this.wallWidth\n const h = this.wallHeight\n\n const direction = new THREE.Vector3((w * relX - ppx) / fx, -(h * relY - ppy) / fy, -1.0)\n direction.normalize()\n this.raycaster.set(start, direction)\n this.raycaster.layers.enableAll()\n }\n\n getTargetAtPoint(relX, relY) {\n this.setupRaycaster(relX, relY)\n\n let target = this.sceneMid\n ? this.sceneMid.children\n : null\n\n let objHit = null\n let range = 10000\n for (let tgts = 0; tgts < 2; tgts += 1) {\n const intersects = target ? this.raycaster.intersectObjects(target, true) : []\n for (let i = 0; i < intersects.length; i += 1) {\n if (intersects[i].face && Renderer.isObjectVisible(intersects[i].object)) {\n if (intersects[i].distance < range) {\n if (\n intersects[i].object.name\n && intersects[i].object.name !== 'lightmap blend'\n && intersects[i].object.name !== 'shadow floor receiver'\n && intersects[i].object.name !== 'shadow floor black'\n && intersects[i].object.name !== 'occlusion image'\n && intersects[i].object.name !== 'foreground image'\n && intersects[i].object.name !== 'depth occlusion modifier'\n ) {\n range = intersects[i].distance\n objHit = intersects[i].object\n }\n }\n }\n }\n target = this.sceneFront\n ? this.sceneFront.children\n : null\n }\n return { range, objHit }\n }\n\n static isObjectVisible(obj) {\n if (!obj) {\n return false\n }\n if (obj.visible && obj.parent) {\n return Renderer.isObjectVisible(obj.parent)\n }\n return obj.visible\n }\n\n getObjectIdAtPoint(relX, relY) {\n const intersect = this.getTargetAtPoint(relX, relY)\n let id = null\n if (intersect.objHit) {\n let idName = intersect.objHit.name\n while (idName != null && idName.search('renderObject-') !== 0) {\n idName = intersect.objHit.name\n if (!intersect.objHit.parent) {\n break\n }\n intersect.objHit = intersect.objHit.parent\n }\n idName = idName.replace('renderObject-', '')\n id = parseInt(idName, 10)\n }\n return id;\n }\n\n getStackableSurfaceAtPoint(relX, relY) {\n const intersect = this.getTargetAtPoint(relX, relY)\n if (intersect.objHit && intersect.objHit.stackablePlaneId !== undefined) {\n return intersect.objHit.stackablePlaneId\n }\n return null\n }\n\n addToScene(renderItem) {\n if (this.mid && renderItem.getLayer() === 0) {\n if (this.sceneMid) {\n this.sceneMid.add(renderItem.getObject())\n }\n } else if (this.sceneFront) {\n this.sceneFront.add(renderItem.getObject())\n }\n this.setRenderIsDirty()\n this.addToRenderItems(renderItem)\n this.renderItems.forEach((item) => {\n if (item.isCombinableChild && item.isCombinableChild()) {\n item.refreshCombinableParent()\n }\n })\n }\n\n addToRenderItems(renderItem) {\n this.renderItems.set(renderItem.id, renderItem)\n }\n\n addDelayedStackedLink(planeId, furnitureItem) {\n if (!this.delayedStackedLinks.has(planeId)) {\n this.delayedStackedLinks.set(planeId, [])\n }\n const existing = this.delayedStackedLinks.get(planeId)\n existing.push(furnitureItem)\n }\n\n addStackingSurface(stackableSurfaceItem) {\n if (!stackableSurfaceItem) {\n return\n }\n if (!stackableSurfaceItem.parent) {\n this.addToScene(stackableSurfaceItem)\n this.hasStaticStackableSurfaces = true\n\n const staticStackablesInScene = this.sceneData.stackables.length\n\n if( ! this.staticStackableCount )\n this.staticStackableCount = 0\n\n this.staticStackableCount += 1\n\n if( staticStackablesInScene === this.staticStackableCount ) {\n this.staticStackablesLoaded = true\n this.syncPaintSet()\n }\n }\n const { renderObject } = stackableSurfaceItem\n this.stackingPlanes.set(renderObject.stackablePlaneId, stackableSurfaceItem)\n\n const waitingItems = this.delayedStackedLinks.get(renderObject.stackablePlaneId)\n if (Array.isArray(waitingItems)) {\n waitingItems\n .forEach(furnitureItem => furnitureItem.delayedSetPlane(renderObject.stackablePlaneId))\n this.delayedStackedLinks.delete(renderObject.stackablePlaneId)\n }\n }\n\n getStackingSurface(surfaceId) {\n return this.stackingPlanes.get(surfaceId)\n }\n\n getRenderItem(itemId) {\n return this.renderItems.get(itemId)\n }\n\n removeFromScene(renderItem) {\n if (this.mid && renderItem.getLayer() === 0) {\n if (this.sceneMid) {\n this.sceneMid.remove(this.sceneMid.getObjectByName(renderItem.getObject().name))\n }\n } else if (this.sceneFront) {\n this.sceneFront.remove(this.sceneFront.getObjectByName(renderItem.getObject().name))\n }\n // may be selcted at the moment of deletion, in which case will be retained by outline pass\n this.removeObjectFromOutline(renderItem.getObject())\n this.renderItems.delete(renderItem.id)\n this.setRenderIsDirty()\n }\n\n generateBackgroundScene() {\n if (!this.wallTexture) {\n return null\n }\n const scene = WallspiceWebgl.createScene()\n const isCompositeBg = (!!this.manifest.residual_0 || !!this.manifest.residual_0_webp)\n && (!!this.manifest.shading_0 || !!this.manifest.shading_0_webp)\n if (isCompositeBg) {\n this.compositeBg = WallspiceWebgl.createCompositeBackground(\n this,\n this.intrinsics,\n this.wallWidth, this.wallHeight,\n this.manifest,\n this.wallTexture,\n )\n this.unemptyRGB = this.compositeBg.fullscreenQuad\n if (this.initialWallPaint) {\n Object.keys(this.initialWallPaint).forEach((key) => {\n this.compositeBg.setPlaneColor(parseInt(key, 10), this.initialWallPaint[key], true)\n })\n }\n } else {\n this.unemptyRGB = WallspiceWebgl.createBackground(\n this.intrinsics,\n this.wallWidth, this.wallHeight,\n this.wallTexture\n )\n scene.add(this.unemptyRGB)\n this.unemptyRGB.visible = true\n }\n scene.add(this.unemptyRGB)\n this.unemptyRGB.visible = true\n\n loadManifestImagePixels(this.manifest, \"segmentation_0\", this.textureHelper).then(sdData => {\n if (!sdData || !sdData.pixels)\n return\n\n const sd = sdData.pixels\n const sdSize = sdData.size\n\n this.additionalDataLoadSize += sdSize\n\n let sMesh = null\n this.segsData = WallspiceWebgl.isolateChannelDataFromImage(sd, 2)\n\n this.eraseRegionGridPoints = computeEraseRegionGridPoints(this.segsData)\n\n this.syncPaintSet()\n\n this.segsDataFeather = this.segsData\n this.segsDataFeather = WallspiceWebgl.isolateChannelDataFromImage(sd, 3)\n if (!(this.segsData.numSegments > 0 && this.segsData.numSegments === this.segsDataFeather.numSegments)) {\n this.segsDataFeather = this.segsData\n }\n this.segsTex = WallspiceWebgl.createLuminanceTextureFromData(this.segsData)\n sMesh = WallspiceWebgl.createSegmentsMesh(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n this.segsTex,\n 1.0,\n false,\n )\n if (sMesh) {\n this.segmentsMesh = sMesh\n scene.add(sMesh)\n }\n\n this.emptyRGB = WallspiceWebgl.createBackgroundFromURL(\n this.intrinsics,\n this.wallWidth, this.wallHeight,\n this.manifest.pano_inpaint_0,\n this.getWallDimensions(),\n )\n\n scene.add(this.emptyRGB)\n this.emptyRGB.visible = false\n })\n\n if (this.maskData && this.planeOrientation) {\n this.highlightMesh = WallspiceWebgl.createPlaceableOverlay(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n this.maskData,\n this.planeOrientation.planeData,\n 0.2,\n )\n }\n if (this.highlightMesh) {\n scene.add(this.highlightMesh)\n this.highlightMesh.visible = false\n }\n\n if (this.maskData) {\n const normalSegData = WallspiceWebgl.isolateChannelDataFromImage(this.maskData, 2)\n const normalSegTex = WallspiceWebgl.createLuminanceTextureFromData(normalSegData)\n this.debugSegmentsMesh = WallspiceWebgl.createDebugSegmentsMesh(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n normalSegTex,\n 1.0,\n false,\n )\n }\n if (this.debugSegmentsMesh) {\n scene.add(this.debugSegmentsMesh)\n }\n\n return scene\n }\n\n async generateOcclusionScene() {\n if (!this.ThreeWGLrenderer) {\n return null\n }\n\n const scene = WallspiceWebgl.createScene()\n\n const depthOcclusionData = await this.loadDepthOcclusion(scene)\n\n if (!this.activeRenderer) return null\n\n this.updateDebugSettings()\n this.onReady(this.contextInfo)\n\n if (depthOcclusionData) {\n await this.loadDepthOcclusionInpaint(\n scene,\n depthOcclusionData.tex,\n depthOcclusionData.mesh\n )\n }\n\n return scene\n }\n\n async loadDepthOcclusion(scene) {\n const data = await loadManifestTexture(this.manifest, \"depth_occlusion_0\", this.defaultDownloadOptions)\n\n if (!data || !data.texture || !this.activeRenderer) {\n return null\n }\n\n const tex = data.texture\n const size = data.size\n\n this.additionalDataLoadSize += size\n\n this.occlusionImage = this.textureHelper.readPixels(tex)\n this.initFloorPlane() // needs this.occlusionImage\n if (!this.manifest.depth_occlusion_meta_0) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const depth_occlusion_meta_0 = this.mockDepthOcclusionMeta();\n [...this.directionalLights, ...this.pointLights].forEach(light => WallspiceWebgl\n .fitShadowMap(light, this.camera, depth_occlusion_meta_0)) // needs this.occlusionImage\n }\n\n const hasFragmentDepth = this.contextInfo && this.contextInfo.hasFragmentDepth\n\n let mesh = null\n if (hasFragmentDepth) {\n mesh = WallspiceWebgl.createDepthOcclusionFromImage(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n tex,\n 2.0,\n !this.settings.magicEraserMode,\n )\n if (mesh !== null) {\n const ext = this.manifest.extra\n WallspiceWebgl.setOcclusionNearFar(\n mesh,\n (ext && ext.nearValue) || 0.2,\n (ext && ext.farValue) || 30,\n )\n }\n } else if (this.occlusionImage) {\n mesh = WallspiceWebgl.createMeshOcclusionFromImage(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n this.occlusionImage,\n !this.settings.magicEraserMode,\n )\n }\n\n if (mesh !== null) {\n this.occlusionMesh = mesh\n scene.add(mesh)\n }\n\n return { tex, mesh }\n }\n\n async loadDepthOcclusionInpaint(scene, depthOcclusionTex, depthOcclusionMesh) {\n const hasFragmentDepth = this.contextInfo && this.contextInfo.hasFragmentDepth\n\n if (!hasFragmentDepth)\n return\n\n const data = await loadManifestTexture(this.manifest, \"depth_occlusion_inpaint_0\", this.defaultDownloadOptions)\n\n if (!data || !data.texture || !this.activeRenderer)\n return\n\n const tex = data.texture\n const size = data.size\n\n this.additionalDataLoadSize += size\n\n const zMesh = WallspiceWebgl.createDepthMuxOcclusionFromImages(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n depthOcclusionTex,\n tex,\n 2.0,\n !this.settings.magicEraserMode,\n )\n\n if (zMesh !== null) {\n const ext = this.manifest.extra\n WallspiceWebgl.setOcclusionNearFar(\n depthOcclusionMesh,\n (ext && ext.nearValue) || 0.2,\n (ext && ext.farValue) || 30,\n )\n }\n\n if (depthOcclusionMesh !== null) {\n this.emptyOcclusionMesh = zMesh\n // this.emptyOcclusionMesh.visible = false\n scene.add(zMesh)\n }\n\n this.initInfillIfNeeded()\n }\n\n mockDepthOcclusionMeta() {\n let min = 10000\n let max = -10000\n if (!this.occlusionImage) {\n // If no depth data available, mock the scene limits using the camera's near/far properties\n return { min: this.camera.near, max: this.camera.far }\n }\n for (let i = 0; i < this.occlusionImage.data.length; i += 4) {\n // Equation used from the manifest docs to get depth in meters\n const z = 0.0000390625 * (\n this.occlusionImage.data[i] * 65536.0\n + this.occlusionImage.data[i + 1] * 256.0\n + this.occlusionImage.data[i + 2]\n )\n min = Math.min(min, z)\n max = Math.max(max, z)\n }\n return { min, max }\n }\n\n generateImageOverlayScene() {\n const scene = WallspiceWebgl.createScene()\n\n this.iuglyMesh = WallspiceWebgl.createImgPaste(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n )\n if (this.iuglyMesh !== null) {\n scene.add(this.iuglyMesh)\n }\n\n this.iMesh = WallspiceWebgl.createImgPaste(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n )\n if (this.iMesh !== null) {\n scene.add(this.iMesh)\n }\n\n return scene\n }\n\n generateLitScene(layer) {\n if (!this.ThreeWGLrenderer) {\n return null\n }\n\n const scene = WallspiceWebgl.createScene()\n let directBright = 0.6\n let ambientBright = 0.45\n let lights = null\n\n if (layer === 0) {\n if (this.sceneData.hasWall) {\n directBright = 0.15\n ambientBright = 0.55\n this.createForegroundMesh(scene)\n }\n\n // Equirectangular unproject\n const pmremGenerator = new THREE.PMREMGenerator(this.ThreeWGLrenderer);\n pmremGenerator.compileEquirectangularShader()\n THREE.DefaultLoadingManager.onLoad = () => {\n pmremGenerator.dispose()\n THREE.DefaultLoadingManager.onLoad = undefined\n };\n\n // default envmap\n let probepath = `${CDN_BUCKET}/testAssets/cubemap/`\n let equirectangular = 'halfFurnished_HDRnoflip.hdr'\n // if(this.manifest.equirectangular_yflip) {\n // probepath = ''\n // equirectangular = this.manifest.equirectangular_yflip\n // } else\n if (this.manifest.equirectangular) {\n probepath = ''\n equirectangular = this.manifest.equirectangular\n }\n // HDR load\n this.cubeTex = new Promise((resolve) => {\n new RGBELoader()\n .setPath(probepath)\n .setDataType(THREE.UnsignedByteType)\n .load(equirectangular, (texture) => {\n const cubetex = pmremGenerator.fromEquirectangular(texture).texture\n pmremGenerator.dispose()\n texture.dispose()\n resolve(cubetex)\n });\n })\n } else {\n // eslint-disable-next-line no-lonely-if\n if (this.manifest && this.planeOrientation) {\n const planes = this.planeOrientation\n if (planes.planeData && planes.planeData.length) {\n let i\n for (i = 0; i < planes.planeData.length; i += 1) {\n if (planes.planeData[i].class === 'floor') {\n break;\n }\n }\n\n if (i < planes.planeData.length) {\n const { software } = this.contextInfo\n const shadowobj = WallspiceWebgl.createAppMesh(planes.planeData[i], 0, software)\n if (shadowobj) {\n shadowobj.visible = this.settings.showShadows\n scene.add(shadowobj)\n this.shadowfloor = shadowobj;\n }\n\n const blackobj = WallspiceWebgl.createAppMesh(planes.planeData[i], 4, software)\n if (blackobj) {\n blackobj.visible = false\n scene.add(blackobj)\n this.shadowfloorBlack = blackobj;\n }\n\n let debugobj = WallspiceWebgl.createAppMesh(planes.planeData[i], 1, software)\n if (debugobj) {\n this.debugVizObjects.push(debugobj)\n scene.add(debugobj)\n }\n debugobj = WallspiceWebgl.createAppMesh(planes.planeData[i], 2, software)\n if (debugobj) {\n this.debugVizObjects.push(debugobj)\n scene.add(debugobj)\n }\n debugobj = WallspiceWebgl.createAppMesh(planes.planeData[i], 3, software)\n if (debugobj) {\n this.debugVizObjects.push(debugobj)\n scene.add(debugobj)\n }\n this.updateDebugSettings()\n }\n }\n }\n }\n\n if (this.manifest.lighting) { // got manifest?\n lights = this.manifest.lighting.lights\n // make sure we disregard old manifest lights\n if (!lights.ambient.intensity) {\n lights = null\n } else\n if (lights.directional[0] && !lights.directional[0].intensity) {\n lights = null\n } else\n if (lights.point[0] && !lights.point[0].intensity) {\n lights = null\n }\n }\n\n if (lights === null) {\n scene.add(WallspiceWebgl.createAmbientLight(ambientBright))\n if (layer === 1) {\n scene.add(WallspiceWebgl.createDirectionalLight(new THREE.Vector3(-1, 1, 1.5), directBright, true, this.maxTextureSize))\n } else {\n scene.add(WallspiceWebgl.createDirectionalLight(new THREE.Vector3(-1, 1, 3.5), directBright, false, this.maxTextureSize))\n }\n } else {\n let shadow = true\n if (layer === 0) {\n shadow = false\n }\n let totalLights = 0\n this.ambientLight = WallspiceWebgl.createReducedAmbientColoredLight(lights.ambient)\n scene.add(this.ambientLight)\n lights.directional.forEach((light, index) => {\n if (totalLights < 8) {\n const objlight = WallspiceWebgl.createDirectionalColoredLight(light, shadow, this.maxTextureSize)\n scene.add(objlight)\n scene.add(objlight.target)\n if (layer === 1) {\n const olp = objlight.position\n // eslint-disable-next-line no-param-reassign\n objlight.ext_centerPosition = new THREE.Vector3(olp.x, olp.y, olp.z)\n objlight.ext_size = Math.sqrt(light.size) * 0.01\n if (light.volume) {\n objlight.ext_volume = [\n new THREE.Vector3(light.volume[0][0], light.volume[0][1], light.volume[0][2]),\n new THREE.Vector3(light.volume[1][0], light.volume[1][1], light.volume[1][2]),\n new THREE.Vector3(light.volume[2][0], light.volume[2][1], light.volume[2][2])]\n }\n\n // Fit the directional light shadow mapping properties to room dimensions\n WallspiceWebgl.fitShadowMap(objlight, this.camera, this.manifest.depth_occlusion_meta_0)\n\n // Move directional light helpers into the camera's frustum\n const cameraFront = this.camera.getWorldDirection(new THREE.Vector3())\n const targetDeltaPos = objlight.target.position.clone().sub(objlight.position)\n const cameraRight = cameraFront.clone().cross(this.camera.up)\n const lightDirection = targetDeltaPos.clone().normalize()\n const angleToHorizon = lightDirection.projectOnPlane(cameraFront).angleTo(cameraRight)\n const sideTranslation = cameraRight.multiplyScalar(((angleToHorizon / Math.PI) - 0.5))\n const tempLight = objlight.clone(true)\n tempLight.position.copy(this.camera.position).add(cameraFront.multiplyScalar(2)).add(sideTranslation)\n tempLight.target.position.copy(tempLight.position.clone().add(targetDeltaPos))\n tempLight.updateMatrixWorld(true)\n tempLight.target.updateMatrixWorld(true)\n const debugobj = WallspiceWebgl.createLightHelper(tempLight, 0.1, 0x000000)\n const debugLabel = WallspiceWebgl.createTextHelper(`${index}`, 8, debugobj.position)\n if (debugobj) {\n debugobj.add(debugLabel)\n this.debugLightHelpers.push(debugobj)\n scene.add(debugobj)\n objlight.ext_debugviz = debugobj\n }\n this.directionalLights.push(objlight)\n }\n if (shadow && this.shadowfloor) {\n WallspiceWebgl.setOpacity(this.shadowfloor, light.intensity)\n }\n }\n // shadow = false\n totalLights += 1\n })\n lights.point.forEach((light, index) => {\n if (totalLights < 8) {\n const objlight = WallspiceWebgl.createPointColoredLight(light, shadow, this.maxTextureSize)\n scene.add(objlight)\n if (layer === 1) {\n const olp = objlight.position\n // eslint-disable-next-line no-param-reassign\n objlight.ext_centerPosition = new THREE.Vector3(olp.x, olp.y, olp.z)\n objlight.ext_size = Math.sqrt(light.size) * 0.01\n if (light.volume) {\n objlight.ext_volume = [\n new THREE.Vector3(light.volume[0][0], light.volume[0][1], light.volume[0][2]),\n new THREE.Vector3(light.volume[1][0], light.volume[1][1], light.volume[1][2]),\n new THREE.Vector3(light.volume[2][0], light.volume[2][1], light.volume[2][2])]\n }\n const debugobj = WallspiceWebgl.createLightHelper(objlight, 0.1, 0x000000)\n const debugLabel = WallspiceWebgl.createTextHelper(`${index}`, 12, debugobj.position)\n if (debugobj) {\n debugobj.add(debugLabel)\n this.debugLightHelpers.push(debugobj)\n scene.add(debugobj)\n objlight.ext_debugviz = debugobj\n }\n this.pointLights.push(objlight)\n }\n if (shadow && this.shadowfloor) {\n WallspiceWebgl.setOpacity(this.shadowfloor, 0.5 /* light.intensity */)\n }\n }\n // shadow = false\n totalLights += 1\n })\n this.updateDebugSettings()\n }\n\n return scene\n }\n\n createForegroundMesh(scene) {\n if (this.mid) {\n if (!scene) {\n return\n }\n if (this.foregroundMesh) {\n scene.remove(this.foregroundMesh)\n this.foregroundMesh = null\n }\n\n this.foregroundUrl = (this.manifest && this.manifest.foreground_0)\n || this.sceneData.fgMaskUrl\n if (this.foregroundUrl && this.foregroundUrl !== '') {\n this.foregroundMesh = WallspiceWebgl.createForeground(\n this.intrinsics,\n this.wallWidth, this.wallHeight, // needed for intrinsics\n this.foregroundUrl\n )\n }\n if (this.foregroundMesh) {\n scene.add(this.foregroundMesh)\n }\n }\n }\n\n getLightDirectionByIndex(planeIndex) {\n // TODO: there is no metaData anymore!\n const lightData = this.metaData && this.metaData.lightData\n if (lightData && lightData[planeIndex].length) {\n return DirectionVectorMap[lightData[planeIndex][0].direction]\n }\n return DirectionVectorMap.SOUTHEAST\n }\n\n findPlaceableFloorPos() {\n const poss = WallspiceWebgl.findPlaceableFloorPositions(\n this.occlusionImage,\n this.wallWidth, this.wallHeight)\n\n if (poss) {\n let id = null\n for (let count = 0; count < poss.length; count += 1) {\n id = this.getObjectIdAtPoint(\n poss[count][0] / this.wallWidth,\n poss[count][1] / this.wallHeight)\n if (id === null) {\n return poss[count]\n }\n }\n\n return poss[0]\n }\n return null\n }\n\n findPlaceableWallPos() {\n const walls = []\n const planes = this.planeOrientation.planeData\n for (let index = 0; index < planes.length; index += 1) {\n if (planes[index] && planes[index].class === 'wall') {\n walls.push(index + 1) // 0 is reserved for blank so add 1\n }\n }\n const poss = WallspiceWebgl.findPlaceableWallPositions(\n this.maskData,\n this.wallWidth, this.wallHeight,\n walls,\n )\n\n if (poss) {\n let id = null\n for (let count = 0; count < poss.length; count += 1) {\n id = this.getObjectIdAtPoint(\n poss[count][0] / this.wallWidth,\n poss[count][1] / this.wallHeight,\n )\n if (id === null) {\n return poss[count]\n }\n }\n }\n return null\n }\n\n generatePose(position, isFurniture, isRug) {\n if (this.maskData) {\n return WallspiceWebgl.generatePoseFromPlanes(\n this.intrinsics,\n this.planeOrientation.planeData,\n this.maskData,\n position,\n isFurniture,\n this.debugSettings.defaultToFloor || !(this.manifest.extra && this.manifest.extra.useFloorMask),\n isRug\n )\n }\n if (this.depthData) {\n return WallspiceWebgl.generatePose(\n this.intrinsics,\n this.getWallDimensions(),\n this.depthData,\n position,\n )\n }\n return null\n }\n\n generatePoseOnPlane(plane, position) {\n return WallspiceWebgl.generatePoseFromPlane(plane, position, this.intrinsics)\n }\n\n highlightFloorMode(floorMode) {\n if (this.highlightMesh) {\n if (floorMode) {\n WallspiceWebgl.setPlaceableAdjust(this.highlightMesh, -1.0, 0.125)\n } else {\n WallspiceWebgl.setPlaceableAdjust(this.highlightMesh, 1.0, 0.125)\n }\n }\n }\n\n highlightOn(isFloorMode) {\n if (this.highlightMesh) {\n this.highlightFloorMode(isFloorMode)\n\n if (this.debugSettings.highlightPlanes) {\n this.highlightMesh.visible = true\n }\n }\n }\n\n highlightOff() {\n if (this.highlightMesh) {\n this.highlightMesh.visible = false\n }\n }\n\n applyEraseMask() {\n const eraseTex = this.paintTex\n this.paintTex = WallspiceWebgl.createLuminanceTextureFromData(this.paintData)\n\n if (this.emptyRGB) {\n WallspiceWebgl.applyMaskTexToMat(this.emptyRGB.material, this.paintTex)\n this.emptyRGB.visible = this.settings.magicEraserMode || (this.paintSet.size > 0)\n }\n if (this.emptyOcclusionMesh) {\n WallspiceWebgl.applyMaskTexToShader(this.emptyOcclusionMesh.material, this.paintTex)\n this.emptyOcclusionMesh.visible = this.settings.magicEraserMode || (this.paintSet.size > 0)\n }\n if (this.occlusionMesh) {\n this.occlusionMesh.visible = !(this.settings.magicEraserMode || (this.paintSet.size > 0))\n }\n if (this.segmentsMesh) {\n WallspiceWebgl.applyMaskTexToShader(this.segmentsMesh.material, this.paintTex)\n this.segmentsMesh.visible = this.settings.magicEraserMode\n }\n if (this.foregroundMesh) {\n this.foregroundMesh.visible = !(this.settings.magicEraserMode || (this.paintSet.size > 0))\n }\n if (eraseTex) {\n eraseTex.dispose()\n }\n this.setRenderIsDirty()\n }\n\n\n updateHighlightFromPosition(pos, highlight) {\n if (this.segsData && this.segmentsMesh) {\n let segment = 512\n if (pos[0] >= 0.0 && pos[0] <= 1.0 && pos[1] >= 0.0 && pos[1] <= 1.0) {\n segment = WallspiceWebgl.getValueAtPos(this.segsData, pos)\n if (!highlight || segment !== this.highlightSeg) {\n if (segment < 1 || segment > 255) {\n segment = 512 // no highlight\n }\n WallspiceWebgl.setSegmentsHighlightIndex(this.segmentsMesh, highlight ? segment : 512)\n this.highlightSeg = segment\n this.setRenderIsDirty()\n }\n }\n }\n }\n\n initInfillIfNeeded() {\n if (this.segsData && this.segmentsMesh) {\n if (this.paintData == null) {\n this.paintData = WallspiceWebgl.generateMask(this.segsData.w, this.segsData.h, 0)\n this.paintSet.forEach((segment) => WallspiceWebgl.keyMask(this.paintData, this.segsDataFeather, segment, 255))\n this.applyEraseMask()\n }\n this.setRenderIsDirty()\n }\n }\n\n infillSegmentFromPosition(pos) {\n if (this.segsData && this.segmentsMesh) {\n this.initInfillIfNeeded()\n if (pos[0] >= 0.0 && pos[0] <= 1.0 && pos[1] >= 0.0 && pos[1] <= 1.0) {\n const segment = WallspiceWebgl.getValueAtPos(this.segsData, pos)\n const fillvalue = WallspiceWebgl.getValueAtPos(this.paintData, pos)\n if (segment > 0) {\n if (fillvalue < 128) {\n WallspiceWebgl.keyMask(this.paintData, this.segsDataFeather, segment, 255)\n this.paintSet.add(segment)\n this.syncPaintSet()\n }\n else {\n WallspiceWebgl.keyMask(this.paintData, this.segsDataFeather, segment, 0)\n this.paintSet.delete(segment)\n this.syncPaintSet()\n }\n }\n this.applyEraseMask()\n this.setRenderIsDirty()\n }\n }\n }\n\n setStaticFurnitureViz(onoff) {\n // Disable the behavior if the room doesn't have the proper segmentation information\n if (!this.segsData || !this.segmentsMesh) {\n return\n }\n\n // Initialize the paintData mask in case it was still not initialized\n this.initInfillIfNeeded()\n\n // Apply the needed mask to the paintData and paintSet\n if (onoff) {\n this.paintSet.clear()\n this.segsData.segments.forEach((segment) => \n WallspiceWebgl.keyMask(this.paintData, this.segsDataFeather, segment, 0))\n } else {\n this.segsData.segments.forEach((segment) => { \n this.paintSet.add(segment)\n WallspiceWebgl.keyMask(this.paintData, this.segsDataFeather, segment, 255)\n })\n\n }\n\n // Apply the updates to the segmentation mask\n this.syncPaintSet()\n this.applyEraseMask()\n }\n\n updateSettings(settings) {\n if (settings) {\n this.settings = settings\n }\n\n if (this.shadowfloor) {\n this.shadowfloor.visible = this.settings.showShadows\n }\n if (this.occlusionMesh) {\n this.occlusionMesh.visible = !this.settings.magicEraserMode && (this.paintSet.size === 0)\n }\n\n if (this.foregroundMesh) {\n this.foregroundMesh.visible = !this.settings.magicEraserMode && (this.paintSet.size === 0)\n }\n\n if (this.manifest.pano_inpaint_0) {\n if (this.emptyOcclusionMesh) {\n if (this.paintSet.size > 0) {\n this.emptyOcclusionMesh.visible = true\n } else {\n this.emptyOcclusionMesh.visible = this.settings.magicEraserMode\n }\n }\n // if (this.unemptyRGB) {\n // this.unemptyRGB.visible = this.settings.magicEraserMode\n // }\n // if (this.emptyRGB) {\n // this.emptyRGB.visible = !this.settings.magicEraserMode\n // }\n\n if (this.segmentsMesh) {\n this.segmentsMesh.visible = this.settings.magicEraserMode\n }\n }\n\n if (this.settings.disableOutline) {\n this.enableOutline(false)\n }\n\n if (this.hasRendered) {\n this.setRenderIsDirty()\n }\n }\n\n updateDebugSettings(settings) {\n if (settings) {\n this.debugSettings = settings\n }\n this.setLinesViz(this.debugSettings.linesViz)\n this.setLightsViz(this.debugSettings.lightsViz)\n this.setDepthViz(this.debugSettings.depthViz)\n this.setSegmenationViz(this.debugSettings.nsViz)\n this.setNormalsViz(this.debugSettings.normalsViz)\n this.setfrontSideShadows(this.debugSettings.frontSideShadows)\n this.setEnvironmentRotation(this.debugSettings.environmentRotation)\n this.setEnvironmentIntensity(this.debugSettings.environmentIntensity)\n this.setLightsIntensity(\n this.debugSettings.pointLightIntensities,\n this.debugSettings.ambientLightIntensity,\n this.debugSettings.directionalLightIntensities,\n )\n this.setAnalyticLightsOn(this.debugSettings.analyticLightsContribution)\n this.setToneMappingParameters(this.debugSettings.toneMappingType, this.debugSettings.toneMappingExposure)\n this.setGPUframetime(this.debugSettings.enableGPUframetimeStats)\n this.setAoMapIntensity(this.debugSettings.aoMapIntensity)\n\n if (this.hasRendered) {\n this.setRenderIsDirty()\n }\n }\n\n setLinesViz(onoff) {\n if (this.debugVizObjects) {\n this.debugVizObjects.forEach((obj) => {\n // eslint-disable-next-line no-param-reassign\n obj.visible = onoff\n })\n }\n }\n\n setLightsViz(onoff) {\n if (this.debugLightHelpers) {\n this.debugLightHelpers.forEach((obj) => {\n // eslint-disable-next-line no-param-reassign\n obj.visible = onoff\n })\n }\n }\n\n setDepthViz(onoff) {\n if (this.occlusionMesh && this.occlusionMesh.material) {\n this.occlusionMesh.material.colorWrite = onoff\n }\n }\n\n setSegmenationViz(onoff) {\n if (this.sceneBack && this.debugSegmentsMesh) {\n this.debugSegmentsMesh.visible = onoff\n }\n }\n\n setNormalsViz(onoff) {\n if (this.sceneFront) {\n this.sceneFront.traverse((node) => {\n if (node instanceof THREE.Mesh) {\n if (onoff && node.material.normalMap) {\n const oldmat = node.material\n // eslint-disable-next-line no-param-reassign\n node.material = new THREE.MeshNormalMaterial({ normalMap: node.material.normalMap })\n // eslint-disable-next-line no-param-reassign\n node.material.oldmat = oldmat\n } else if (node.material.oldmat) {\n // eslint-disable-next-line no-param-reassign\n node.material = node.material.oldmat\n }\n }\n })\n }\n }\n\n setfrontSideShadows(onoff) {\n if (!this.sceneFront) {\n return\n }\n\n this.sceneFront.traverse(obj => {\n if (obj instanceof THREE.Mesh && obj.material)\n // eslint-disable-next-line no-param-reassign\n obj.material.shadowSide = onoff ? THREE.FrontSide : null\n })\n }\n\n setEnvironmentRotation(axis) {\n if (!this.sceneFront) {\n return\n }\n const rotation = [\n [0, 0, 1, 0, 1, 0, 1, 0, 0], // +Z\n [-1, 0, 0, 0, 1, 0, 0, 0, 1], // -X\n [0, 0, 1, 0, 1, 0, -1, 0, 0], // -Z \n [1, 0, 0, 0, 1, 0, 0, 0, 1], // +X\n ][axis]\n this.sceneFront.traverse((child) => {\n if (child.isMesh\n && child.material\n && child.material.isMeshStandardMaterial) {\n // eslint-disable-next-line no-param-reassign\n child.material.envMapRotation = new THREE.Matrix3().set(...rotation).transpose()\n }\n })\n }\n\n setEnvironmentIntensity(intensity) {\n if (!this.sceneFront) {\n return\n }\n this.sceneFront.traverse((child) => {\n if (child.isMesh\n && child.material\n && child.material.isMeshStandardMaterial) {\n // eslint-disable-next-line no-param-reassign\n child.material.envMapIntensity = child.material.originalEnvMapIntensity * intensity\n }\n })\n }\n\n setAoMapIntensity(intensity) {\n if (!this.sceneFront) {\n return\n }\n this.sceneFront.traverse((child) => {\n if (child.isMesh\n && child.material\n && child.material.isMeshStandardMaterial) {\n // eslint-disable-next-line no-param-reassign\n child.material.aoMapIntensity = intensity\n }\n })\n }\n\n setLightsIntensity(pointLightIntensities, ambientLightIntensity, directionalLightIntensities) {\n if (!this.sceneFront) {\n return\n }\n\n this.pointLights.forEach((light, index) => {\n // eslint-disable-next-line no-param-reassign\n light.intensity = light.originalIntensity * pointLightIntensities[index]\n })\n if (this.ambientLight) {\n this.ambientLight.intensity = this.ambientLight.originalIntensity * ambientLightIntensity\n }\n this.directionalLights.forEach((light, index) => {\n // eslint-disable-next-line no-param-reassign\n light.intensity = light.originalIntensity * directionalLightIntensities[index]\n })\n }\n\n setAnalyticLightsOn(shouldBeOn) {\n if (!this.sceneFront) {\n return\n }\n this.sceneFront.traverse((child) => {\n if (child.isLight && child.originalColor) {\n // eslint-disable-next-line no-param-reassign\n child.color = shouldBeOn\n ? child.originalColor\n : new THREE.Color(0.0, 0.0, 0.0)\n }\n })\n }\n\n setToneMappingParameters(type, exposure) {\n if (!this.ThreeWGLrenderer) {\n return\n }\n const prevToneMappingType = this.ThreeWGLrenderer.toneMapping\n this.ThreeWGLrenderer.toneMapping = type\n this.ThreeWGLrenderer.toneMappingExposure = exposure\n if (this.sceneFront && prevToneMappingType !== type) {\n this.sceneFront.traverse((child) => {\n if (child.material) {\n // eslint-disable-next-line no-param-reassign\n child.material.needsUpdate = true\n }\n })\n }\n }\n\n setAntiAliasing(desiredType) {\n if (!this.composer || !this.ThreeWGLrenderer) {\n return\n }\n let type = desiredType\n if (type === AA_TAA) {\n const floatRTresult = this.textureHelper.testFloatRT()\n if (!floatRTresult || !this.ThreeWGLrenderer.capabilities.isWebGL2) {\n type = AA_FXAA\n }\n }\n if (this.aaType === type) {\n return\n }\n\n this.aaType = type\n if (this.antiAliasPass) {\n this.composer.removePass(this.antiAliasPass)\n if (this.antiAliasPass.dispose) {\n this.antiAliasPass.dispose.apply(this.antiAliasPass)\n }\n this.antiAliasPass = null\n }\n\n // might be turned off for TAA\n this.renderPass.enabled = true\n this.outlinePass.enabled = this.showOutlines\n\n switch (type) {\n case AA_FXAA:\n this.antiAliasPass = new ShaderPass(FXAAShader)\n this.antiAliasPass.uniforms.resolution.value.set(1 / this.canvas.width, 1 / this.canvas.height)\n this.composer.addPass(this.antiAliasPass)\n break\n case AA_TAA: {\n this.renderPass.enabled = false\n this.outlinePass.enabled = false\n const renderFunction = (renderer, writeBuffer, readBuffer) => {\n this.drawTheThings()\n if (this.showOutlines) {\n this.outlinePass.render(renderer, writeBuffer, readBuffer)\n }\n }\n this.antiAliasPass = new CustomTAARenderPass(this.camera, renderFunction)\n this.composer.addPass(this.antiAliasPass)\n this.composer.addPass(new ShaderPass(CopyShader))\n break\n }\n default:\n break\n }\n this.setRenderIsDirty()\n }\n\n onChildUpdate(oneTimeRenderCallback = null) {\n if (oneTimeRenderCallback) {\n this.oneTimeRenderCallbacks.push(oneTimeRenderCallback)\n }\n this.setRenderIsDirty()\n }\n\n onNextRender(cb, skippedFrames = 0) {\n // Run the callbacks after the specified render\n if (skippedFrames > 0) {\n this.scheduledRenderCallbacks.push({ cb, skippedFrames })\n } else {\n this.oneTimeRenderCallbacks.push(cb)\n }\n this.setRenderIsDirty()\n }\n\n jitterAllLights(fraction) {\n [...this.directionalLights, ...this.pointLights].forEach((light) => {\n if (light.ext_centerPosition) {\n const p = light.ext_centerPosition\n if (light.ext_volume) {\n let maxis = 0\n let longest = 0\n let tmp = 0\n const lv = light.ext_volume\n const deltaX = new THREE.Vector3(lv[0].x, lv[0].y, lv[0].z)\n const deltaY = new THREE.Vector3(lv[1].x, lv[1].y, lv[1].z)\n const deltaZ = new THREE.Vector3(lv[2].x, lv[2].y, lv[2].z)\n longest = deltaX.length()\n tmp = deltaY.length()\n if (tmp > longest) {\n longest = tmp\n maxis = 1\n }\n tmp = deltaZ.length()\n if (tmp > longest) {\n maxis = 2\n }\n\n if (maxis === 0) {\n deltaX.multiplyScalar(fraction - 0.5)\n } else {\n deltaX.multiplyScalar(Math.random() - 0.5)\n }\n if (maxis === 1) {\n deltaY.multiplyScalar(fraction - 0.5)\n } else {\n deltaY.multiplyScalar(Math.random() - 0.5)\n }\n if (maxis === 2) {\n deltaZ.multiplyScalar(fraction - 0.5)\n } else {\n deltaZ.multiplyScalar(Math.random() - 0.5)\n }\n\n light.position.set(\n p.x + deltaX.x + deltaY.x + deltaZ.x,\n p.y + deltaX.y + deltaY.y + deltaZ.y,\n p.z + deltaX.z + deltaY.z + deltaZ.z)\n\n if (light.ext_debugviz) {\n light.ext_debugviz.position.set(\n p.x + deltaX.x + deltaY.x + deltaZ.x,\n p.y + deltaX.y + deltaY.y + deltaZ.y,\n p.z + deltaX.z + deltaY.z + deltaZ.z)\n }\n } else {\n const dx = light.ext_size * (Math.random() - 0.5)\n const dy = light.ext_size * (Math.random() - 0.5)\n const dz = light.ext_size * (Math.random() - 0.5)\n light.position.set(p.x + dx, p.y + dy, p.z + dz)\n\n if (light.ext_debugviz) {\n light.ext_debugviz.position.set(p.x + dx, p.y + dy, p.z + dz)\n }\n }\n // eslint-disable-next-line no-param-reassign\n // light.needsUpdate = true\n }\n })\n }\n\n selectLightShadow(count) {\n let i = 0;\n [...this.directionalLights, ...this.pointLights].forEach((light) => {\n if (light) {\n if (i === count) {\n // eslint-disable-next-line no-param-reassign\n light.visible = true\n if (this.shadowfloor) {\n WallspiceWebgl.setOpacity(this.shadowfloor,\n light.intensity * (this.directionalLights.length + this.pointLights.length))\n }\n // eslint-disable-next-line no-param-reassign\n light.distance = 0.001\n } else {\n // eslint-disable-next-line no-param-reassign\n light.visible = false\n // eslint-disable-next-line no-param-reassign\n light.distance = 0.0\n }\n // eslint-disable-next-line no-param-reassign\n // light.needsUpdate = true\n i += 1\n }\n })\n }\n\n setBlackFloor(state) {\n // this.shadowfloorBlack.visible = true\n if (this.shadowfloor && this.shadowfloorBlack) {\n if (state) {\n this.shadowfloor.visible = false\n this.shadowfloorBlack.visible = true\n } else {\n this.shadowfloor.visible = true\n this.shadowfloorBlack.visible = false\n }\n }\n }\n\n allLightShadow() {\n let i = 0;\n [...this.directionalLights, ...this.pointLights].forEach((light) => {\n if (light) {\n if (i === 0) {\n if (this.shadowfloor) {\n WallspiceWebgl.setOpacity(this.shadowfloor, 1.0)\n }\n }\n // eslint-disable-next-line no-param-reassign\n light.visible = true\n // eslint-disable-next-line no-param-reassign\n light.distance = 0.0\n // light.needsUpdate = true\n i += 1\n }\n })\n }\n\n allLightOneShadow() {\n let i = 0;\n [...this.directionalLights, ...this.pointLights].forEach((light) => {\n if (light) {\n if (i === 0) {\n if (this.shadowfloor) {\n WallspiceWebgl.setOpacity(this.shadowfloor, light.intensity)\n }\n // eslint-disable-next-line no-param-reassign\n light.castShadow = true\n } else {\n // eslint-disable-next-line no-param-reassign\n light.castShadow = false\n }\n // eslint-disable-next-line no-param-reassign\n light.visible = true\n // eslint-disable-next-line no-param-reassign\n light.distance = 0.0\n // light.needsUpdate = true\n i += 1\n }\n })\n }\n\n resetLights() {\n let i = 0;\n [...this.directionalLights, ...this.pointLights].forEach((light) => {\n if (light) {\n if (light.ext_centerPosition) {\n // eslint-disable-next-line no-param-reassign\n light.position.set(light.ext_centerPosition.x,\n light.ext_centerPosition.y, light.ext_centerPosition.z)\n\n if (light.debugviz) {\n light.debugviz.position.set(\n light.ext_centerPosition.x, light.ext_centerPosition.y, light.ext_centerPosition.z)\n }\n }\n // eslint-disable-next-line no-param-reassign\n // light.castShadow = true\n if (i === 0) {\n // eslint-disable-next-line no-param-reassign\n light.visible = true\n // eslint-disable-next-line no-param-reassign\n light.distance = 0.0\n if (this.shadowfloor) {\n WallspiceWebgl.setOpacity(this.shadowfloor, light.intensity)\n }\n } else {\n // eslint-disable-next-line no-param-reassign\n light.visible = false\n }\n // eslint-disable-next-line no-param-reassign\n // light.needsUpdate = true\n }\n i += 1\n })\n }\n\n // eslint-disable-next-line class-methods-use-this\n gammacorrect(color) {\n return 255.0 * ((color / 255.0) ** 2.2)\n }\n\n setRenderIsDirty() {\n this.renderIsDirty = true\n if (this.antiAliasPass && this.antiAliasPass.accumulate !== undefined) {\n this.antiAliasPass.accumulate = false\n }\n }\n\n isFrameNeedsRender() {\n return this.renderIsDirty || (this.antiAliasPass && this.antiAliasPass.accumulate \n && this.antiAliasPass.accumulateIndex < 32)\n }\n\n handleGlError() {\n if (!this.ThreeWGLrenderer) {\n return\n }\n const context = this.ThreeWGLrenderer.getContext()\n if (!context) {\n return\n }\n const err = context.getError()\n if (err !== 0) {\n const composerRtSize = {\n width: 0,\n height: 0,\n }\n if (this.composer && this.composer.readBuffer) {\n composerRtSize.width = this.composer.readBuffer.width\n composerRtSize.height = this.composer.readBuffer.height\n }\n const usingTAA = this.antiAliasPass && this.antiAliasPass.isCustomTAARenderPass\n const taaSampleRtSize = {\n width: 0,\n height: 0\n }\n if (usingTAA) {\n taaSampleRtSize.width = (this.antiAliasPass.sampleRenderTarget && this.antiAliasPass.sampleRenderTarget.width) || 0\n taaSampleRtSize.height = (this.antiAliasPass.sampleRenderTarget && this.antiAliasPass.sampleRenderTarget.height) || 0\n }\n Sentry.captureEvent({\n message: 'GL Error',\n breadcrumbs: [\n {\n type: 'GL error data',\n category: SENTRY_BREADCRUMB_CATEGORY,\n data: {\n errorCode: err,\n hasWallData: !!this.wallTexture,\n hasComposer: !!this.composer,\n composerRtSize,\n usingTAA,\n taaSampleRtSize,\n }\n },\n ]\n })\n }\n }\n\n animate() {\n this.animationFrameId = requestAnimationFrame(this.animate)\n if (this.renderWasDirty) {\n this.renderWasDirty = false\n if (this.activeFrameMetric) {\n this.activeFrameMetric.intervalStop()\n this.activeFrameMetric = null\n }\n }\n if (this.isFrameNeedsRender()) {\n const itemsAreLoading = this.loadingItems > 0\n if (this.settings.collectFrameMetric && !this.magicWindowWasLoading) {\n this.activeFrameMetric = (itemsAreLoading || this.itemsWereLoading)\n ? this.frameMetricLoading\n : this.frameMetric\n this.activeFrameMetric.intervalStart()\n }\n this.render()\n this.renderWasDirty = true\n // allow next frame capture as it is still affected by loading\n this.magicWindowWasLoading = !this.settings.collectFrameMetric\n this.itemsWereLoading = itemsAreLoading\n }\n this.renderIsDirty = !this.hasRendered\n if (this.hasRendered &&\n this.antiAliasPass &&\n this.antiAliasPass.accumulate === false) {\n this.antiAliasPass.accumulate = true\n }\n this.handleGlError()\n }\n\n render() {\n if (!this.shouldRender) {\n return\n }\n\n if (!this.debugSettings.useMultiShadow) {\n this.allLightOneShadow()\n }\n\n if (this.composer) {\n this.composer.render()\n } else {\n this.drawTheThings()\n }\n\n // begin beautyshot timeout\n if (this.debugSettings.useFancyShadows) {\n // TODO\n }\n\n if (this.scheduledRenderCallbacks.length > 0) {\n let i = this.scheduledRenderCallbacks.length\n while (i--) {\n const scheduled = this.scheduledRenderCallbacks[i]\n if (scheduled.skippedFrames === 0) {\n this.oneTimeRenderCallbacks.push(scheduled.cb)\n this.scheduledRenderCallbacks.splice(i, 1)\n } else {\n scheduled.skippedFrames -= 1\n }\n }\n }\n\n if (this.oneTimeRenderCallbacks.length > 0) {\n // YP: TODO: these callbacks will usually dispatch redux action(s). and may start a complex\n // chain of synchronous calls, e.g. instantiating new items via redux, etc, while still in the render() function\n // perhaps even assigning new oneTimeRenderCallbacks which will be cleared right away here, \n // or clearing render flag without rendering, etc. causing hard to trace bugs.\n //\n // MO: Because callbacks can add new callbacks, loop and run the first in the queue\n // until the queue is empty\n while (this.oneTimeRenderCallbacks[0]) {\n this.oneTimeRenderCallbacks[0]()\n this.oneTimeRenderCallbacks.shift()\n }\n }\n\n if (this.fullyInitialized && !this.hasRendered) {\n this.hasRendered = true\n this.onFirstRender()\n }\n }\n\n getHistogramStats() {\n const totalSceneTriangles = this.ThreeWGLrenderer\n ? this.ThreeWGLrenderer.info.render.triangles\n : 0\n\n const stats = {\n totalLoadedItems: this.loadedItems,\n totalLoadedSize: this.loadedTotalSize,\n totalSceneTriangles,\n }\n stats.totalFrames = this.frameMetric.valuesCount + this.frameMetricLoading.valuesCount\n this.frameMetric.bins.forEach((bin, idx) => {\n stats[bin.title] = this.frameMetric.histogram[idx]\n })\n this.frameMetricLoading.bins.forEach((bin, idx) => {\n stats[bin.title] = this.frameMetricLoading.histogram[idx]\n })\n stats.glTextureMemory = this.glMemoryRecorder ? this.glMemoryRecorder.currentTextureMemory : 0\n stats.glBufferMemory = this.glMemoryRecorder ? this.glMemoryRecorder.currentBufferMemory : 0\n\n // memory is supported only in chrome\n if (performance.memory) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = performance.memory\n\n stats.jsHeapSizeLimit = jsHeapSizeLimit\n stats.totalJSHeapSize = totalJSHeapSize\n stats.usedJSHeapSize = usedJSHeapSize\n }\n\n // not all browsers may support gpu frametimes\n if (this.gpuFrametime.enable) {\n const nanotomilli = (nano) => nano / 1e6\n stats.gpuFrametimeMin = nanotomilli(this.gpuFrametime.mintime)\n stats.gpuFrametimeMax = nanotomilli(this.gpuFrametime.maxtime)\n stats.gpuFrametimeCumulativeAvg = nanotomilli(this.gpuFrametime.cumulativeAvg)\n stats.gpuFrametimeNumSamples = this.gpuFrametime.numSamples\n }\n\n return stats\n }\n\n getRoomGlbStats() {\n let totalModelsLoadSizeMB = 0.0\n let modelsCount = 0\n this.renderItems.forEach((item) => {\n totalModelsLoadSizeMB += item.metrics.MbFileSizeTransferred\n modelsCount += 1\n })\n return {\n totalModelsLoadSizeMB,\n modelsCount,\n }\n }\n\n getRoomAdditionalStats() {\n const sceneAdditionalDataSizeMB = this.additionalDataLoadSize / 1024 / 1024\n return {\n sceneAdditionalDataSizeMB,\n }\n }\n\n /* eslint-disable no-param-reassign */\n renderFootprints() {\n if (!this.footprintMaterial) {\n return\n }\n const prevOverrideMtl = this.sceneFront.overrideMaterial\n this.sceneFront.overrideMaterial = this.footprintMaterial\n this.sceneFront.children.forEach((child) => {\n if (child.isFurniture) {\n child.traverse((furnitureChild) => {\n if (furnitureChild.isMesh) {\n if (!furnitureChild.prevOnBeforeRender) {\n furnitureChild.prevOnBeforeRender = furnitureChild.onBeforeRender\n }\n furnitureChild.onBeforeRender = (...args) => {\n FootprintMaterial.refreshUniforms(...args, furnitureChild)\n }\n\n if (!furnitureChild.prevOnAfterRender) {\n furnitureChild.prevOnAfterRender = furnitureChild.onAfterRender\n }\n furnitureChild.onAfterRender = () => {\n furnitureChild.onBeforeRender = furnitureChild.prevOnBeforeRender\n furnitureChild.onAfterRender = furnitureChild.prevOnAfterRender\n furnitureChild.prevOnBeforeRender = null\n furnitureChild.prevOnAfterRender = null\n }\n }\n })\n } else {\n child.wasVisible = child.visible\n child.visible = false\n }\n })\n\n this.ThreeWGLrenderer.render(this.sceneFront, this.camera)\n\n this.sceneFront.overrideMaterial = prevOverrideMtl\n this.sceneFront.children.forEach((child) => {\n if (!child.isFurniture) {\n child.visible = child.wasVisible\n }\n })\n }\n /* eslint-enable no-param-reassign */\n\n checkQueryResults(gl, queryobj) {\n const nanotomilli = (nano) => nano / 1e6\n const cumulativeAvg = (newSample, lastAvg, currNumSamples) => (newSample + currNumSamples * lastAvg) / (currNumSamples + 1)\n const available = gl.getQueryParameter(queryobj, gl.QUERY_RESULT_AVAILABLE);\n if (available) {\n // elapsedResult is in nanoseconds\n const elapsedResult = gl.getQueryParameter(queryobj, gl.QUERY_RESULT);\n if (elapsedResult > 0) {\n this.gpuFrametime.enableQuery = true\n this.gpuFrametime.lastQueryResultMS = nanotomilli(elapsedResult)\n this.gpuFrametime.cumulativeAvg = cumulativeAvg(elapsedResult, this.gpuFrametime.cumulativeAvg, this.gpuFrametime.numSamples)\n this.gpuFrametime.numSamples += 1\n this.gpuFrametime.mintime = Math.min(this.gpuFrametime.mintime, elapsedResult)\n this.gpuFrametime.maxtime = Math.max(this.gpuFrametime.maxtime, elapsedResult)\n const log = `\\nGPU frame times:\n \\nnanosec: ${elapsedResult}\n \\nmillisec: ${this.gpuFrametime.lastQueryResultMS}\n \\nmintime: ${nanotomilli(this.gpuFrametime.mintime)}\n \\nmaxtime: ${nanotomilli(this.gpuFrametime.maxtime)}\n \\ncumulative Avg: ${nanotomilli(this.gpuFrametime.cumulativeAvg)}`\n if (this.gpuFrametime.enableStats) {\n this.gpuFrametime.statsTextDom.nodeValue = log\n }\n }\n }\n }\n\n drawTheThings() {\n if (!this.ThreeWGLrenderer || !this.camera) {\n return\n }\n /* According to the specification, one cannot query GPU frametime until the previous query \n is complete and retrieved to the host. Hence, query begin and end are guarded */\n if (this.gpuFrametime.enable) {\n const gl = this.ThreeWGLrenderer.getContext()\n const ext = this.gpuFrametime.ext\n if (this.gpuFrametime.enableStats) {\n this.gpuFrametime.stats.begin()\n }\n\n if (this.gpuFrametime.enableQuery) {\n gl.beginQuery(ext.TIME_ELAPSED_EXT, this.gpuFrametime.queryObj);\n }\n }\n const rendersCount = this.debugSettings.imitateLowPerformance ? 25 : 1\n for (let i = 0; i < rendersCount; i += 1) {\n this.ThreeWGLrenderer.clear(true, true, true)\n if (this.sceneBack) {\n this.ThreeWGLrenderer.render(this.sceneBack, this.camera)\n }\n if (this.mid && this.sceneMid && !this.settings.magicEraserMode) {\n this.ThreeWGLrenderer.render(this.sceneMid, this.camera)\n }\n this.ThreeWGLrenderer.clearDepth()\n if (!this.settings.magicEraserMode) {\n this.renderFootprints()\n }\n if (this.sceneOcclusion) {\n this.ThreeWGLrenderer.render(this.sceneOcclusion, this.camera)\n }\n if (!this.settings.magicEraserMode) {\n this.ThreeWGLrenderer.render(this.sceneFront, this.camera)\n }\n if (this.hasStaticStackableSurfaces && !this.settings.magicEraserMode) {\n // Note stackables on static surfaces are split into a separate Threejs native layer\n // for customized shadow interaction with the surfaces/floor, so a different render call is required\n this.camera.layers.set(STATIC_STACKABLES_THREE_NATIVE_LAYER)\n this.ThreeWGLrenderer.render(this.sceneFront, this.camera)\n this.camera.layers.set(DEFAULT_THREE_NATIVE_LAYER)\n }\n }\n if (this.gpuFrametime.enable) {\n const gl = this.ThreeWGLrenderer.getContext()\n const ext = this.gpuFrametime.ext\n if (this.gpuFrametime.enableQuery) {\n gl.endQuery(ext.TIME_ELAPSED_EXT)\n this.gpuFrametime.enableQuery = false\n }\n if (this.gpuFrametime.enableStats) {\n this.gpuFrametime.stats.end()\n this.gpuFrametime.queryPanel.update(this.gpuFrametime.lastQueryResultMS, 400)\n }\n\n window.requestAnimationFrame(() => {\n this.checkQueryResults(gl, this.gpuFrametime.queryObj)\n })\n }\n\n this.ThreeWGLrenderer.getContext().flush()\n this.ThreeWGLrenderer.getContext().finish()\n }\n\n takeRoomScreenshot(onSuccess, onError) {\n /*\n This function takes a high quality screenshot of the room with no composer effects\n If the current exact preview is needed; use the generateThumbnailFromPreview directly\n */ \n\n // Set the renderer's state suitable for taking a screenshot\n const forceTAA = this.debugSettings.useTAAforScreenshots\n const currentAA = this.aaType\n this.enableOutline(false)\n this.setAntiAliasing(forceTAA ? AA_TAA : AA_FXAA)\n\n // Take screenshot and restore the earlier renderer state\n this.onNextRender(() => {\n generateThumbnailFromPreview().then(\n (baseImageData) => {\n this.enableOutline()\n this.setAntiAliasing(currentAA)\n if (onSuccess) onSuccess(baseImageData)\n },\n (error) => {\n this.enableOutline()\n this.setAntiAliasing(currentAA)\n if (onError) onError(error)\n },\n )\n }, forceTAA ? 32 : 0)\n }\n\n cleanup() {\n cancelAnimationFrame(this.animationFrameId)\n this.activeRenderer = false\n\n this.shouldRender = false\n if (this.composer) {\n this.composer.renderTarget1.dispose()\n this.composer.renderTarget2.dispose()\n }\n if (this.outlinePass) {\n this.outlinePass.dispose()\n }\n if (this.renderPass) {\n this.renderPass.renderFunc = null\n }\n Renderer.disposeMesh(this.highlightMesh)\n Renderer.disposeMesh(this.occlusionMesh)\n Renderer.disposeMesh(this.segmentsMesh)\n Renderer.disposeMesh(this.emptyOcclusionMesh)\n Renderer.disposeMesh(this.foregroundMesh)\n\n // Loading manager can retain Renderer's \"this\" somewhere, causing memory leak\n THREE.DefaultLoadingManager.onLoad = undefined\n if (this.ThreeWGLrenderer) {\n this.ThreeWGLrenderer.dispose()\n }\n if (this.renderItems) {\n this.renderItems.clear()\n }\n if (this.furnitureManager) {\n this.furnitureManager.dispose()\n }\n if (this.glMemoryRecorder) {\n this.glMemoryRecorder.stop()\n }\n\n if (this.gpuFrametime && this.gpuFrametime.enable) {\n const gl = this.ThreeWGLrenderer.getContext()\n gl.deleteQuery(this.gpuFrametime.queryObj)\n this.gpuFrametime.queryObj = null\n this.gpuFrametime.enable = false\n }\n\n rendererInstance = null\n }\n\n static disposeMesh(mesh) {\n if (!mesh) {\n return\n }\n if (mesh.material) {\n mesh.material.dispose()\n }\n if (mesh.geometry) {\n mesh.geometry.dispose()\n }\n }\n\n enableOutline(enable = true) {\n const { disableOutline } = this.settings\n const onoff = disableOutline ? false : enable\n\n this.showOutlines = onoff\n\n if (this.outlinePass) {\n switch (this.aaType) {\n case AA_FXAA: {\n this.outlinePass.enabled = onoff\n break\n }\n case AA_TAA: {\n // With TAA, outlinePass is rendered \"manullay\" if showOutlines is true\n // and internal .enabled is always false\n this.outlinePass.enabled = false\n break\n }\n default:\n break\n }\n }\n\n this.setRenderIsDirty()\n }\n\n addObjectToOutline(object) {\n if (!object || !this.outlinePass) {\n return\n }\n const outlineArray = this.outlinePass.selectedObjects\n const index = outlineArray.indexOf(object)\n if (index === -1) {\n outlineArray.push(object)\n this.setRenderIsDirty()\n }\n }\n\n removeObjectFromOutline(object) {\n if (!object || !this.outlinePass) {\n return\n }\n const outlineArray = this.outlinePass.selectedObjects\n const index = outlineArray.indexOf(object)\n if (index > -1) {\n outlineArray.splice(index, 1)\n this.setRenderIsDirty()\n }\n }\n\n setThickOutline(isThick) {\n if (!this.outlinePass) {\n return\n }\n this.outlinePass.edgeThickness = isThick ? EDGE_THICKNESS_THICK : EDGE_THICKNESS_THIN\n this.outlinePass.edgeStrength = isThick ? EDGE_STRENGTH_THICK : EDGE_STRENGTH_THIN\n this.setRenderIsDirty()\n }\n\n static checkWebPSupport() {\n const tmpCanvas = document.createElement('canvas')\n if (tmpCanvas.getContext && tmpCanvas.getContext('2d')) {\n return tmpCanvas.toDataURL('image/webp').indexOf('data:image/webp') === 0\n }\n return false\n }\n\n static getFileSize(url) {\n if (!url) {\n return Promise.resolve(0.0)\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open(\"HEAD\", url, true)\n xhr.onreadystatechange = () => {\n if (xhr.readyState === xhr.DONE) {\n const size = parseInt(xhr.getResponseHeader(\"Content-Length\"), 10)\n resolve(size)\n }\n }\n xhr.onerror = reject\n xhr.send()\n })\n }\n}\n\nexport default Renderer\n","/* vim: set sw=2: */\n/* eslint-disable no-plusplus */\n/* eslint-disable no-continue */\n\ninterface SegsData\n{\n w: number\n h: number\n pixels: Uint8Array\n numSegments: number\n}\n\nexport\nfunction\ncomputeEraseRegionGridPoints(segsData : SegsData)\n{\n const bboxes = new Map()\n\n for(let j = 0; j < segsData.h; j += 1)\n {\n for(let i = 0; i < segsData.w; i += 1)\n {\n const s = segsData.pixels[segsData.w * j + i]\n\n if( s === 0 )\n continue\n\n if( ! bboxes.get(s) )\n {\n bboxes.set(s, {\n minx: +Infinity,\n maxx: -Infinity,\n miny: +Infinity,\n maxy: -Infinity,\n })\n }\n\n const bbox = bboxes.get(s)\n\n if( i < bbox.minx ) bbox.minx = i\n if( i > bbox.maxx ) bbox.maxx = i\n if( j < bbox.miny ) bbox.miny = j\n if( j > bbox.maxy ) bbox.maxy = j\n }\n }\n\n const divs = 10\n\n const gridPoints = new Map()\n bboxes.forEach((bbox, s) =>\n {\n const gp : number[][] = []\n\n gridPoints.set(s, gp)\n\n const w = bbox.maxx - bbox.minx\n const h = bbox.maxy - bbox.miny\n\n for(let j = 0; j < divs; j++)\n {\n const y = Math.round(\n bbox.miny + h * j / (divs - 1))\n\n for(let i = 0; i < divs; i++)\n {\n const x = Math.round(\n bbox.minx + w * i / (divs - 1))\n\n const v = segsData.pixels[segsData.w * y + x]\n\n if( v === s )\n {\n gp.push([\n x / segsData.w,\n y / segsData.h\n ])\n }\n }\n }\n })\n\n return gridPoints\n}\n","/* vim:set sw=2: */\n/* eslint-disable no-else-return, no-console */\n\nimport * as THREE from 'three'\nimport axios from 'axios'\nimport { is_lpng_initialized, initialize_lpng, decode } from 'utils/lodepng.wrapper'\n\nimport { DOWNLOAD_RETRIES_COUNT, DOWNLOAD_RETRY_DELAY_MS } from 'Renderer/constants'\n\nconst useWasm = (() => {\n const userAgent = ((window || {}).navigator || {}).userAgent\n if (!userAgent) {\n return false\n }\n // iOS detection from: http://stackoverflow.com/a/9039885/177710\n if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {\n return true\n }\n // Safari detection from: https://stackoverflow.com/q/7944460\n if (/^((?!chrome|android).)*safari/i.test(userAgent)) {\n return true\n }\n return false\n})()\n\nconst loadManifestTextureSize = async (manifest, name) => {\n // Get the size of a file by making an HEAD HTTP request to obtain metainformation about the url\n const requestMeta = await axios({ method: 'HEAD', url: manifest[name] })\n return !requestMeta.errors && requestMeta.status === 200\n ? +(requestMeta.headers['content-length'] || 0)\n : 0\n}\n\nconst manifestImageURLS = (manifest, name) => {\n const urls = []\n\n const ordinaryName = name\n const webpName = `${name}_webp`\n\n if(manifest[webpName]) {\n urls.push(manifest[webpName])\n }\n\n if(manifest[ordinaryName]) {\n urls.push(manifest[ordinaryName])\n }\n\n return urls\n}\n\nexport const manifestHasImageURL = (manifest, name) => manifestImageURLS(manifest, name).length > 0\n\nexport const loadTexture = async (url, options = {}) => {\n if (!url) {\n return null\n }\n\n const { retriesCount = DOWNLOAD_RETRIES_COUNT, retryDelay = DOWNLOAD_RETRY_DELAY_MS, onFail } = options\n\n let texture = null\n let tryNum = 0\n /* eslint-disable no-await-in-loop */\n do {\n console.log(`Downloading texture: ${url}, attempt #${tryNum + 1}`)\n texture = await new Promise(resolve => { new THREE.TextureLoader().load(url,\n resolve, null, () => resolve(null))\n })\n if (texture) {\n break\n }\n tryNum += 1\n await new Promise(resolve => { setTimeout(resolve, retryDelay) })\n } while (tryNum < retriesCount)\n /* eslint-disable no-await-in-loop */\n if (!texture && onFail) {\n onFail({ description: `Texture load failed.`, url })\n }\n return texture\n}\n\nexport const loadManifestTexture = async (manifest, name, options) => {\n const texture = await loadTexture(manifest[name], options)\n if (!texture) {\n return null\n }\n\n const textureDownloadSize = await loadManifestTextureSize(manifest, name)\n\n return {\n texture,\n size: textureDownloadSize,\n }\n}\n\nexport const loadManifestImagePixels = async (manifest, name, textureHelper, options) => {\n if ((useWasm || (options || {}).useWasm) && (is_lpng_initialized() || (await initialize_lpng()))) {\n let binaryPNG = null\n try {\n binaryPNG = await axios({ method: 'GET', url: manifest[name], responseType: 'arraybuffer' })\n } catch (err) {\n return null\n }\n\n const decodedPNG = decode(new Uint8Array(binaryPNG.data))\n if (!decodedPNG) {\n return null\n }\n\n const pngDownloadSize = await loadManifestTextureSize(manifest, name)\n\n return {\n pixels: { data: decodedPNG.output, width: decodedPNG.width, height: decodedPNG.height },\n size: pngDownloadSize,\n }\n } else {\n if (!textureHelper) {\n return null\n }\n \n const textureContainer = await loadManifestTexture(manifest, name)\n if (!textureContainer) {\n return null\n }\n \n const { width, height } = textureContainer.texture.image\n textureContainer.texture.flipY = false\n const pixelsContainer = textureHelper.readPixels(textureContainer.texture)\n \n textureContainer.texture.dispose()\n if (textureContainer.texture.image.close) {\n textureContainer.texture.image.close()\n }\n \n return {\n pixels: pixelsContainer ? { data: pixelsContainer.data, width, height } : null,\n size: textureContainer.size,\n }\n }\n}","/* This code is a browser customized version of https://www.npmjs.com/package/@cwasm/lodepng */\n\nimport axios from 'axios'\n\nconst lpng = { code: null, module: null, instance: null }\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const initialize_lpng = async () => {\n // Get the wasm binary\n try {\n lpng.code = await axios({\n method: 'GET',\n url: `${ASSET_BUCKET}/wasm/lodepng.wasm`,\n responseType: 'arraybuffer',\n })\n } catch (err) {\n return false\n }\n\n // Instantiate the wasm instance and set the instance state for future access\n try {\n const returnedWasm = await WebAssembly.instantiate(lpng.code.data)\n lpng.module = returnedWasm.module\n lpng.instance = returnedWasm.instance\n } catch {\n return false\n }\n\n // Success signal\n return true\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const is_lpng_initialized = () => lpng.code && lpng.module && lpng.instance\n\nexport const decode = (input) => {\n // Allocate memory to hand over the input data to WASM\n const inputPointer = lpng.instance.exports.malloc(input.byteLength)\n const targetView = new Uint8Array(lpng.instance.exports.memory.buffer, inputPointer, input.byteLength)\n\n // Copy input data into WASM readable memory\n targetView.set(input)\n\n // Allocate metadata (outputPointer, width, and height)\n const metadataPointer = lpng.instance.exports.malloc(12)\n\n // Decode input data\n const error = lpng.instance.exports.lodepng_decode32(\n metadataPointer,\n metadataPointer + 4,\n metadataPointer + 8,\n inputPointer,\n input.byteLength,\n )\n\n // Free the input data in WASM land\n lpng.instance.exports.free(inputPointer)\n\n // Guard return value for NULL pointer\n if (error !== 0) {\n lpng.instance.exports.free(metadataPointer)\n return null\n }\n\n // Read returned metadata\n const metadata = new Uint32Array(lpng.instance.exports.memory.buffer, metadataPointer, 3)\n const [outputPointer, width, height] = metadata\n\n // Free the metadata in WASM land\n lpng.instance.exports.free(metadataPointer)\n\n // Create an empty buffer for the resulting data\n const outputSize = width * height * 4\n const output = new Uint8ClampedArray(outputSize)\n\n // Copy decoded data from WASM memory to JS\n output.set(new Uint8Array(lpng.instance.exports.memory.buffer, outputPointer, outputSize))\n\n // Free WASM copy of decoded data\n lpng.instance.exports.free(outputPointer)\n\n // Return decoded image data\n return { output, width, height }\n}\n\nexport const encode = (input) => {\n // Allocate memory to hand over the input data to WASM\n const inputPointer = lpng.instance.exports.malloc(input.data.byteLength)\n const targetView = new Uint8Array(lpng.instance.exports.memory.buffer, inputPointer, input.data.byteLength)\n\n // Copy input data into WASM readable memory\n targetView.set(input.data)\n\n // Allocate metadata (outputPointer, outputSize)\n const metadataPointer = lpng.instance.exports.malloc(8)\n\n // Encode input data\n const error = lpng.instance.exports.lodepng_encode32(\n metadataPointer,\n metadataPointer + 4,\n inputPointer,\n input.width,\n input.height,\n )\n\n // Free the input data in WASM land\n lpng.instance.exports.free(inputPointer)\n\n // Guard return value for NULL pointer\n if (error !== 0) {\n lpng.instance.exports.free(metadataPointer)\n return null\n }\n\n // Read returned metadata\n const metadata = new Uint32Array(lpng.instance.exports.memory.buffer, metadataPointer, 2)\n const [outputPointer, outputSize] = metadata\n\n // Free the metadata in WASM land\n lpng.instance.exports.free(metadataPointer)\n\n // Create an empty buffer for the resulting data\n const output = new Uint8Array(outputSize)\n\n // Copy encoded data from WASM memory to JS\n output.set(new Uint8Array(lpng.instance.exports.memory.buffer, outputPointer, outputSize))\n\n // Free WASM copy of encoded data\n lpng.instance.exports.free(outputPointer)\n\n // Return encoded image as raw data\n return output\n}\n","import { createContext } from 'react'\n\nexport const defaultContext = {\n isMagicWindow: false,\n isMobile: false,\n ikeaNav: true,\n allowShare: true,\n hideDashboard: false,\n isKiosk: false,\n}\n\nconst SugarcubeContext = createContext(defaultContext)\n\nexport default SugarcubeContext\n","import qs from 'qs'\nimport * as msgTypes from 'models/iFrame/msgTypes'\nimport { receiveIkeaTokens } from 'models/tokens/actions'\nimport { receiveCompiledComposition, setCompositionPreFetchLoading } from 'models/compositions/actions'\nimport { setBearerToken } from 'services'\nimport { setSpiderpigsToken } from 'services/spiderpigs'\n\nexport const setUpCompositionPreFetch = (store) => {\n const onCompositionPreFetchCallback = (data) => {\n const { composition, scene, furnitures } = data\n if (composition && scene && furnitures) {\n store.dispatch(receiveCompiledComposition(composition, scene, furnitures))\n } else {\n store.dispatch(setCompositionPreFetchLoading(false))\n }\n }\n const onCompositionPreFetchFailedCallback = () => {\n store.dispatch(setCompositionPreFetchLoading(false))\n }\n if (window.compositionPreFetchData) {\n // If we have the data, send it out\n onCompositionPreFetchCallback(window.compositionPreFetchData)\n } else if (window.compositionPreFetchLoading) {\n // If we're still loading, provide a callback\n window.onCompositionPreFetchCallback = onCompositionPreFetchCallback\n window.onCompositionPreFetchFailedCallback = onCompositionPreFetchFailedCallback\n // Let the application know we're loading something\n store.dispatch(setCompositionPreFetchLoading(true))\n }\n}\n\nexport const setUpIFrameListener = (store) => {\n window.addEventListener('message', (message) => {\n if (\n MAGICWINDOW_ORIGIN !== '*' &&\n message.origin !== MAGICWINDOW_ORIGIN &&\n message.origin !== PARTNER_PORTAL_ORIGIN\n ) {\n return\n }\n switch (message.data.type) {\n case msgTypes.GET_TOKENS_RESPONSE:\n setBearerToken(message.data.tokens, message.data.isDev)\n setSpiderpigsToken(message.data.tokens)\n store.dispatch(receiveIkeaTokens(message.data.tokens))\n break\n default:\n break\n }\n })\n}\n\nexport const getUrlContext = () => {\n /* eslint-disable i18next/no-literal-string */\n\n const params = qs.parse(window.location.search, { ignoreQueryPrefix: true })\n const isMagicWindow = Object.prototype.hasOwnProperty.call(params, 'magicWindow')\n\n const isKiosk = window.location.href.indexOf('h22') > -1\n // TODO (Anu): remove / this is for debugging purposes\n // const isKiosk = true\n\n return {\n isMagicWindow,\n hideDashboard: isMagicWindow || isKiosk || Object.prototype.hasOwnProperty.call(params, 'hideDashboard'),\n isKiosk,\n }\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\n\nrequire('./styles.scss')\n\nconst AppDescriptionForScreenReader = () => {\n const { t } = useTranslation()\n return (\n
\n

{t('accessibility.app description')}

\n
\n )\n}\n\nexport default AppDescriptionForScreenReader\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\n\nrequire('./ErrorMessage.scss')\n\nconst ErrorMessage = () => {\n const { t } = useTranslation()\n return (\n
\n
\n
\n {t('common:generalError.header')}\n
\n
{t('common:generalError.subheader')}
\n {\n window.location.reload()\n }}\n >\n {t('common:generalError.cta')}\n \n
\n
\n )\n}\n\nexport default ErrorMessage\n","import React, { useEffect, useRef } from 'react'\nimport { string, func, bool, oneOfType, number } from 'prop-types'\nimport classNames from 'classnames'\n\nrequire('./FormElements.scss')\n\nexport const Input = ({\n type,\n placeholder,\n onFocus,\n onBlur,\n value,\n onChange,\n name,\n disabled,\n onKeyDown,\n autoFocus,\n autoSelect,\n step,\n className,\n ...props\n}) => {\n const inputRef = useRef()\n useEffect(() => {\n if (autoSelect) {\n inputRef.current.setSelectionRange(0, inputRef.current.value.length)\n }\n }, [])\n return (\n
\n \n
\n )\n}\nInput.defaultProps = {\n placeholder: '',\n onFocus: null,\n onBlur: null,\n value: '',\n name: null,\n disabled: false,\n onKeyDown: null,\n autoFocus: false,\n autoSelect: false,\n step: 1,\n className: '',\n}\nInput.propTypes = {\n type: string.isRequired,\n placeholder: string,\n onFocus: func,\n onBlur: func,\n value: oneOfType([string, number]),\n onChange: func.isRequired,\n onKeyDown: func,\n name: string,\n disabled: bool,\n autoFocus: bool,\n autoSelect: bool,\n step: number,\n className: string,\n}\n\nexport const Checkbox = ({ name, label, onChange }) => (\n
\n
\n \n {label ? {label} : null}\n
\n
\n)\nCheckbox.defaultProps = {\n name: '',\n label: '',\n}\nCheckbox.propTypes = {\n name: string,\n label: string,\n onChange: func.isRequired,\n}\n","export const NAVIGATION = 'NAVIGATION'\nexport const HEADER = 'HEADER'\nexport const BROWSE = 'BROWSE'\nexport const DESIGN = 'DESIGN'\n","import { NAVIGATION, DESIGN, BROWSE, HEADER } from './constants'\n\nconst skipToLinkCallback = (skipTo: string) => {\n const skipLinkId = `skipLinkId-${skipTo}`\n const skipLinkElement = document.getElementById(skipLinkId)\n if (skipLinkElement) {\n skipLinkElement.focus()\n }\n}\n\ninterface SkipLinkInfo {\n skipToText: string | null\n iconCode: string | null\n onClick?: () => void\n}\n\nconst getSkipLinkInfo = (skipLink: string, skipContext: string, t: (key: string) => string): SkipLinkInfo => {\n switch (skipLink) {\n case NAVIGATION: {\n let iconCode = `arrowRight`\n if (skipContext === DESIGN) {\n iconCode = `arrowUp`\n }\n return {\n skipToText: t('accessibility.skip to navigation'),\n iconCode,\n onClick: () => skipToLinkCallback(NAVIGATION),\n }\n }\n case DESIGN: {\n let iconCode = `arrowDownForwards`\n if (skipContext === BROWSE) {\n iconCode = `arrowRight`\n }\n if (skipContext === NAVIGATION) {\n iconCode = `arrowDown`\n }\n return {\n skipToText: t('accessibility.skip to design'),\n iconCode,\n onClick: () => skipToLinkCallback(DESIGN),\n }\n }\n case HEADER: {\n let iconCode = `arrowUp`\n if (skipContext === DESIGN) {\n iconCode = `arrowUpBackwards`\n }\n if (skipContext === NAVIGATION) {\n iconCode = `arrowLeft`\n }\n return {\n skipToText: t('accessibility.skip to header'),\n iconCode,\n onClick: () => skipToLinkCallback(HEADER),\n }\n }\n\n case BROWSE: {\n let iconCode = `arrowLeft`\n if (skipContext === HEADER) {\n iconCode = `arrowDown`\n }\n return {\n skipToText: t('accessibility.skip to browse'),\n iconCode,\n onClick: () => skipToLinkCallback(BROWSE),\n }\n }\n\n default: {\n return {\n skipToText: null,\n iconCode: null,\n }\n }\n }\n}\n\nexport default getSkipLinkInfo\n","import React from 'react'\nimport classNames from 'classnames'\nimport { useTranslation } from 'react-i18next'\nimport Icon from 'components/uiElements/Icon'\nimport { DESIGN } from './constants'\nimport getSkipLinkInfo from './helpers'\n\nrequire('./styles.scss')\n\ninterface SkipLinksProps {\n skipLinks: string[]\n skipContext: string\n}\n\nconst SkipLinks = ({ skipLinks, skipContext }: SkipLinksProps) => {\n const { t } = useTranslation()\n\n const skipLinksInfo = skipLinks\n .map((skipLink) => getSkipLinkInfo(skipLink, skipContext, t))\n .filter((skipLink) => skipLink.skipToText)\n\n return (\n
\n {skipLinksInfo.map((skipLinkInfo, index) => {\n const { skipToText, iconCode, onClick } = skipLinkInfo\n\n return (\n \n \n {skipToText}\n \n )\n })}\n
\n )\n}\n\nexport default SkipLinks\n","import React, { useContext } from 'react'\nimport { number, string, bool } from 'prop-types'\nimport ReactTooltip from 'react-tooltip'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./Tooltip.scss')\n\nconst EFFECT_SOLID = 'solid'\nconst PLACEMENT_TOP = 'top'\n\nconst Tooltip = ({ className, delayShow, effect, place, id, title, content, type, hide }) => {\n const { isKiosk } = useContext(SugarcubeContext)\n\n if (hide || isKiosk) {\n return null\n }\n if (type === 'major') {\n return (\n \n
\n
{title}
\n

{content}

\n
\n \n )\n }\n return (\n \n )\n}\n\nTooltip.defaultProps = {\n className: '',\n effect: EFFECT_SOLID,\n place: PLACEMENT_TOP,\n delayShow: 250,\n\n id: null,\n title: null,\n content: null,\n type: null,\n hide: false,\n}\n\nTooltip.propTypes = {\n className: string,\n delayShow: number,\n effect: string,\n place: string,\n\n id: string,\n title: string,\n content: string,\n type: string,\n hide: bool,\n}\n\nexport default Tooltip\n","import React from 'react'\nimport { func, string } from 'prop-types'\n\nimport { dashboardThumbType } from 'models/propTypes'\nimport Icon from 'components/uiElements/Icon'\n\nrequire('./Thumbnail.scss')\n\nconst Thumbnail = ({ item, defaultName, onClick, cta, onDelete, ...props }) => {\n const date = new Date(item.creationDate)\n\n return (\n
\n
\n
\n
\n {onDelete ? (\n {\n e.stopPropagation()\n onDelete()\n }}\n className=\"delete\"\n >\n \n \n ) : null}\n
\n
\n
\n
\n \n
\n
{item.name || defaultName ||  }
\n {item.creationDate ? (\n
\n \n {date.toLocaleDateString()}\n
\n ) : null}\n
\n
\n
\n )\n}\n\nThumbnail.defaultProps = {\n onDelete: null,\n defaultName: null,\n}\n\nThumbnail.propTypes = {\n item: dashboardThumbType.isRequired,\n defaultName: string,\n cta: string.isRequired,\n onClick: func.isRequired,\n onDelete: func,\n}\n\nexport default Thumbnail\n","import React, { useContext } from 'react'\nimport classNames from 'classnames'\nimport { bool, string, func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport './ProductItemDetail.scss'\n\nconst ProductItemDetail = ({ name, isNew, isLarge, description, price, isInSwap, wide, viewDetails }) => {\n const { t } = useTranslation()\n const { isKiosk } = useContext(SugarcubeContext)\n const viewDetailsAriaLabel = `${t('aria.product details')} ${name} ${description}`\n return (\n
\n
\n {isNew &&
{t('design.new')}
}\n {wide ? (\n
\n {viewDetails ? (\n \n {name}\n \n ) : (\n
{name}
\n )}\n {price && !isKiosk &&
{price}
}\n
\n ) : (\n \n )}\n\n {description && (\n
{description}
\n )}\n {!wide && price && !isKiosk &&
{price}
}\n
\n
\n )\n}\n\nProductItemDetail.defaultProps = {\n isLarge: false,\n isNew: false,\n price: '',\n description: '',\n isInSwap: false,\n wide: false,\n viewDetails: null,\n}\n\nProductItemDetail.propTypes = {\n name: string.isRequired,\n isNew: bool,\n isLarge: bool,\n price: string,\n description: string,\n isInSwap: bool,\n wide: bool,\n viewDetails: func,\n}\nexport default ProductItemDetail\n","import React, { useCallback } from 'react'\nimport { number, bool, func, element, string, oneOfType } from 'prop-types'\n\nimport classNames from 'classnames'\n\nrequire('./Range.scss')\n\nconst Range = React.forwardRef((props, ref) => {\n const { min, max, step, value, onChange, onMouseDown, unit, sideLabel, onKeyDown } = props\n const change = useCallback(\n (e) => {\n onChange(parseFloat(e.target.value, 10))\n },\n [onChange],\n )\n\n return (\n
\n
\n {value}\n {unit}\n
\n \n
\n )\n})\n\nRange.defaultProps = {\n onMouseDown: null,\n unit: null,\n sideLabel: false,\n onKeyDown: null,\n}\n\nRange.propTypes = {\n min: number.isRequired,\n max: number.isRequired,\n step: number.isRequired,\n value: number.isRequired,\n onChange: func.isRequired,\n onMouseDown: func,\n onKeyDown: func,\n unit: oneOfType([element, string]),\n sideLabel: bool,\n}\n\nexport default Range\n","import React from 'react'\nimport { string } from 'prop-types'\n\nrequire('./BouncingBallLoader.scss')\n\nconst BouncingBallLoader = ({ headerText, subheaderText }) => {\n const hasText = headerText || subheaderText\n return (\n
\n {hasText && (\n
\n {headerText &&
{headerText}
}\n {subheaderText &&
{subheaderText}
}\n
\n )}\n\n
\n
\n )\n}\n\nBouncingBallLoader.defaultProps = {\n headerText: '',\n subheaderText: '',\n}\n\nBouncingBallLoader.propTypes = {\n headerText: string,\n subheaderText: string,\n}\nexport default BouncingBallLoader\n","import React, { Component } from 'react'\nimport classNames from 'classnames'\nimport { string, func, oneOfType, number, bool } from 'prop-types'\nimport SSRIcon from '@ingka/ssr-icon'\nimport * as paths from '@ingka/ssr-icon/icons'\n\nrequire('./Icon.scss')\n\nclass Icon extends Component {\n constructor(props) {\n super(props)\n this.onClick = this.onClick.bind(this)\n }\n\n onClick(e) {\n if (this.props.onClick) {\n this.props.onClick(e)\n }\n }\n\n render() {\n const { code, label, className, onClick, svg } = this.props\n const toggledClassnames = {\n label,\n onClick,\n svg,\n }\n\n // Show Missing Icon text if icon not found\n const ssrContent = paths[code] ? : 'MI'\n return (\n
\n {svg ? {label} : ssrContent}\n
\n )\n }\n}\nIcon.defaultProps = {\n onClick: null,\n label: null,\n className: null,\n svg: false,\n}\nIcon.propTypes = {\n code: string.isRequired,\n onClick: func,\n label: oneOfType([string, number]),\n className: string,\n svg: bool,\n}\n\nexport default Icon\n","import React, { forwardRef, ReactNode } from 'react'\nimport { func, element, bool } from 'prop-types'\nimport Icon from 'components/uiElements/Icon'\nimport useOutsideAlerter from 'hooks/useOutsideAlerter'\n\nrequire('./TheaterModal.scss')\n\ninterface TheaterModalProps {\n onClose: () => void\n isOpen: boolean\n children: ReactNode\n}\n\nconst TheaterModal = forwardRef((props, ref) => {\n const { onClose, children, isOpen } = props\n\n // If the user clicks outside, the modal is closed\n useOutsideAlerter(ref, onClose)\n\n return (\n
\n {isOpen && (\n
\n
\n \n \n \n\n
{children}
\n
\n
\n )}\n
\n )\n})\n\nTheaterModal.propTypes = {\n onClose: func.isRequired,\n children: element.isRequired,\n isOpen: bool.isRequired,\n}\n\nexport default TheaterModal\n","import * as types from 'models/actionTypes'\nimport { FURNITURE_ITEM } from 'constants/renderItemTypes'\nimport { TRACKING_ADDED_FROM_SALES_DRESSING, SALES_DRESSING } from 'models/tracking/constants'\nimport {\n getNextRenderItemId,\n getSelectedCompositionProductData,\n getSelectedCompositionId,\n getNextStackableInfo,\n getSwappingSurfaces,\n getSelectedRenderItem,\n getSelectedComposition,\n getSelectedCompositionMissingFurnitureIds,\n getSelectedCompositionData,\n getSelectedScene,\n getActiveSceneId,\n getSelectedCompositionRenderedFurnitureItem,\n getSelectedRenderItemId,\n} from 'models/compositions/selectors'\nimport { getFurnitureIsLoadingByIds, getSelectedFurnitureSwappableItemsData } from 'models/furniture/selectors'\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport { getRenderer } from 'models/refStore/selectors'\nimport { getIsFetching as getScenesIsFetching } from 'models/scenes/selectors'\nimport {\n placeRenderItem,\n selectComposition,\n selectCompositionRenderItem,\n startPlaceStackableItem,\n clickPlaceStackableItem,\n swapStackableSurface,\n requestCompiledComposition,\n clickPlaceRenderItem,\n swapStackableToFloor,\n saveSelectedComposition,\n deleteCompositionRenderItem,\n} from 'models/compositions/actions'\nimport { fetchScene } from 'models/scenes/actions'\nimport {\n setDesignSidepanelMode,\n showSwapMenuForId,\n openDesignSidepanel,\n closeDesignSidepanel,\n showMissingWallsModal,\n} from 'models/ui/actions'\nimport {\n selectFurniture,\n requestFurnitureByIds,\n requestFurnitureCombinables,\n filterFeaturedProducts,\n clearFurnitureFilter,\n} from 'models/furniture/actions'\nimport { showPlaceableSurfaces, hidePlaceableSurfaces } from 'models/preview/actions'\nimport * as modes from 'models/ui/constants'\nimport isMobile from 'utils/isMobile'\nimport { getSaveOnFirstRender } from 'models/location/selectors'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nconst compositionsMiddleware = (store) => (next) => (action) => {\n const state = store.getState()\n switch (action.type) {\n case types.PLACE_RENDER_ITEM: {\n store.dispatch(hidePlaceableSurfaces())\n const uniqueId = action.settings.uniqueId || getNextRenderItemId(state)\n return next({\n ...action,\n uniqueId,\n })\n }\n case types.CLICK_PLACE_RENDER_ITEM: {\n const renderer = getRenderer()\n if (renderer) {\n let newPos\n if (action.settings.renderType === FURNITURE_ITEM) {\n newPos = renderer.findPlaceableFloorPos()\n } else {\n newPos = renderer.findPlaceableWallPos()\n if (!newPos) {\n store.dispatch(showMissingWallsModal())\n return next(action)\n }\n }\n\n if (action.settings.stacks && !action.settings.onFloor) {\n store.dispatch(selectCompositionRenderItem(-1))\n const { settings, id } = action\n store.dispatch(\n startPlaceStackableItem(\n {\n ...settings,\n id,\n },\n action.trackingInfo,\n ),\n )\n } else {\n store.dispatch(\n placeRenderItem(\n action.compositionId,\n action.id,\n newPos[0],\n newPos[1],\n {\n ...action.settings,\n uniqueId: Math.floor(Date.now() / 2), // TODO This is not the best way to do this\n },\n action.trackingInfo,\n ),\n )\n }\n }\n return next(action)\n }\n case types.RENDER_ITEM_LOADED: {\n const { renderItems } = getSelectedComposition(state)\n const renderItem = renderItems.find((item) => item.uniqueId === action.id)\n if (renderItem) {\n if (\n renderItem.metadata &&\n renderItem.metadata.combinables &&\n renderItem.metadata.combinables.nodesMeta\n ) {\n renderItem.metadata.combinables.nodesMeta.forEach((nodeMeta, index) => {\n /*\n if (nodeMeta.items && nodeMeta.items.length > 0) {\n const productTrackingInfo = getProductTrackingInfo(renderItem)\n const trackingInfo = {\n ...productTrackingInfo,\n AddedFrom: TRACKING_ADDED_FROM_SALES_DRESSING,\n }\n const settings = {\n renderType: FURNITURE_ITEM,\n heading: 0,\n stacks: false,\n hidden: renderItem.hidden,\n combinablePlacement: {\n parentId: action.id,\n localTransform: nodeMeta.matrixModel.flat(),\n }\n }\n store.dispatch(\n placeRenderItem(\n compositionId,\n renderItem.id,\n 0,\n 0,\n settings,\n combinablePlacement,\n trackingInfo,\n ),\n )\n } else {\n*/\n // look for nearest non-wildcard variant in all ancestors\n const wildcardVariant = 2 // probably temporary\n let currParentRenderItem = renderItem\n let variant = currParentRenderItem.metadata.combinables.selfMeta.variant || wildcardVariant\n while (variant === wildcardVariant) {\n const parentUniqueId =\n currParentRenderItem.combinablePlacement &&\n currParentRenderItem.combinablePlacement.parentId\n if (!parentUniqueId) {\n break\n }\n currParentRenderItem = renderItems.find((item) => item.uniqueId === parentUniqueId)\n if (!currParentRenderItem) {\n break\n }\n variant = currParentRenderItem.metadata.combinables.selfMeta.variant || wildcardVariant\n }\n\n const slotCategory = nodeMeta.category\n const size = nodeMeta.size\n store.dispatch(\n requestFurnitureCombinables(\n renderItem.id,\n renderItem.uniqueId,\n slotCategory,\n size,\n variant,\n index,\n ),\n )\n // }\n })\n }\n }\n return next(action)\n }\n case types.START_PLACE_STACKABLE_ITEM: {\n const { stackableSurfaces } = getSelectedComposition(state)\n const surfaces = stackableSurfaces.map((surface) => surface.id)\n store.dispatch(showPlaceableSurfaces(surfaces))\n return next(action)\n }\n case types.START_SWAP_STACKABLE_SURFACE: {\n const { stackableSurfaces } = getSelectedComposition(state)\n const surfaces = stackableSurfaces.map((surface) => surface.id)\n store.dispatch(showPlaceableSurfaces(surfaces))\n return next(action)\n }\n case types.STACKABLE_SURFACE_CLICKED: {\n const isSwappingSurfaces = getSwappingSurfaces(state)\n if (isSwappingSurfaces) {\n store.dispatch(hidePlaceableSurfaces())\n const compositionId = getSelectedCompositionId(state)\n const itemId = getSelectedRenderItem(state).uniqueId\n store.dispatch(swapStackableSurface(compositionId, itemId, action.planeId, action.x, action.y))\n } else {\n store.dispatch(clickPlaceStackableItem(action.planeId, action.x, action.y))\n }\n return next(action)\n }\n case types.CLICK_PLACE_STACKABLE_ON_FLOOR: {\n const isSwapping = getSwappingSurfaces(state)\n\n const compId = getSelectedCompositionId(state)\n\n if (!isSwapping) {\n const info = getNextStackableInfo(state)\n\n const settings = {\n renderType: info.settings.renderType,\n heading: info.settings.heading,\n onFloor: true,\n }\n\n store.dispatch(clickPlaceRenderItem(compId, info.settings.id, settings, info.trackingInfo))\n } else {\n store.dispatch(hidePlaceableSurfaces())\n\n const renderer = getRenderer()\n\n if (renderer) {\n const selected = getSelectedRenderItem(state)\n const newPos = renderer.findPlaceableFloorPos()\n\n store.dispatch(swapStackableToFloor(compId, selected.uniqueId, newPos[0], newPos[1]))\n }\n }\n\n return next(action)\n }\n case types.CLICK_PLACE_STACKABLE_ITEM: {\n const nextStackableInfo = getNextStackableInfo(state)\n const compositionId = getSelectedCompositionId(state)\n const { trackingInfo, settings } = nextStackableInfo\n settings.stackedPlane = action.planeId\n store.dispatch(placeRenderItem(compositionId, settings.id, action.x, action.y, settings, trackingInfo))\n return next(action)\n }\n case types.OPEN_COMPOSITION: {\n const mode = getDesignSidepanelMode(state)\n const isShowingCatalog =\n mode === modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE ||\n mode === modes.DESIGN_SIDEPANEL_MODE_PRODUCT_DETAILS\n\n // Redirect to product browse if the user was previously on my items\n const isShowingMyItems =\n mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE ||\n mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS\n const isShowingSwap =\n mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE || modes.DESIGN_SIDEPANEL_MODE_SWAP_DETAILS\n\n // When entering a new composition, clear out the furniture filter\n if (isShowingCatalog) {\n store.dispatch(clearFurnitureFilter())\n }\n // Hide the swap menu on opening a composition if it was previously open\n if (isShowingSwap) {\n store.dispatch(showSwapMenuForId(false))\n }\n if (isShowingMyItems || isShowingSwap) {\n store.dispatch(setDesignSidepanelMode(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE))\n }\n store.dispatch(selectComposition(action.compositionId, action.trackingInfo))\n return next(action)\n }\n case types.DELETE_COMPOSITION_RENDER_ITEM: {\n const { renderItems } = getSelectedComposition(state)\n const renderedItems = getSelectedCompositionProductData(state)\n\n const renderItem = renderItems.find((item) => item.uniqueId === action.id)\n const isCombinableChild = !!renderItem.combinablePlacement\n\n if (!isCombinableChild) {\n const mode = getDesignSidepanelMode(state)\n // Hide the swap menu on deleting an item\n store.dispatch(showSwapMenuForId(false))\n\n // If there are no my items, redirect to product browse\n const isShowingMyItems =\n mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE ||\n mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS\n if (isShowingMyItems) {\n // renderItems.length will be one if this item is going to be deleted\n if (renderedItems.length === 1) {\n store.dispatch(setDesignSidepanelMode(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE))\n } else {\n store.dispatch(setDesignSidepanelMode(modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE))\n }\n } else {\n store.dispatch(setDesignSidepanelMode(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE))\n }\n }\n\n // delete all combinable children of this item, if any\n const combinableChildren = renderItems.filter(\n (item) => item.combinablePlacement && item.combinablePlacement.parentId === action.id,\n )\n if (combinableChildren.length > 0) {\n const compositionId = getSelectedCompositionId(state)\n combinableChildren.forEach((item) => {\n const productData = renderedItems.find((prod) => prod.uniqueId === item.uniqueId)\n const productTrackingInfo = getProductTrackingInfo(productData)\n const trackingInfo = {\n ...productTrackingInfo,\n RemovedFrom: SALES_DRESSING,\n }\n store.dispatch(deleteCompositionRenderItem(compositionId, item.uniqueId, trackingInfo))\n })\n }\n\n return next({ ...action, isLastItem: renderedItems.length === 1 })\n }\n case types.SELECT_COMPOSITION_RENDER_ITEM: {\n const result = next(action)\n const nextState = store.getState()\n const { renderItemId } = action\n\n const mode = getDesignSidepanelMode(state)\n const isShowingMyItemDetails = mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS\n const isShowingSwap =\n mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE || modes.DESIGN_SIDEPANEL_MODE_SWAP_DETAILS\n\n if (renderItemId === -1) {\n store.dispatch(showSwapMenuForId(false))\n\n // Redirect to product browse when a selected rendered item is cleared\n if (isShowingMyItemDetails || isShowingSwap) {\n store.dispatch(setDesignSidepanelMode(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE))\n }\n } else {\n const { id } = getSelectedRenderItem(nextState)\n store.dispatch(showSwapMenuForId(true, id))\n store.dispatch(setDesignSidepanelMode(modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE))\n if (isMobile()) {\n store.dispatch(openDesignSidepanel())\n }\n }\n store.dispatch(hidePlaceableSurfaces())\n return result\n }\n case '@@router/LOCATION_CHANGE':\n case types.TRIGGER_COMPOSITION_LOAD:\n case types.RECEIVE_USER:\n case types.RECEIVE_COMPOSITIONS:\n case types.RECEIVE_SCENES:\n case types.RECEIVE_SCENE:\n case types.SET_COMPOSITION_PRE_FETCH_LOADING:\n case types.RECEIVE_COMPILED_COMPOSITION:\n case types.SELECT_COMPOSITION: {\n const result = next(action)\n const nextState = store.getState()\n\n // If we don't have the composition, load it\n const selectedCompositionData = getSelectedCompositionData(nextState)\n if (!selectedCompositionData) {\n const selectedCompositionId = getSelectedCompositionId(nextState)\n store.dispatch(requestCompiledComposition(selectedCompositionId))\n } else if (!getScenesIsFetching(nextState)) {\n // If we have a comp, but not the scene, load it\n const selectedScene = getSelectedScene(nextState)\n if (!selectedScene) {\n const activeSceneId = getActiveSceneId(nextState)\n if (activeSceneId) {\n store.dispatch(fetchScene(activeSceneId))\n }\n }\n }\n\n // Load furniture items we're missing\n if (!getFurnitureIsLoadingByIds(nextState)) {\n const missingFurnitureIds = getSelectedCompositionMissingFurnitureIds(nextState)\n if (missingFurnitureIds.length) {\n store.dispatch(requestFurnitureByIds(missingFurnitureIds))\n }\n }\n\n if (\n action.type === types.RECEIVE_SCENE ||\n action.type === types.RECEIVE_SCENES ||\n action.type === types.RECEIVE_COMPILED_COMPOSITION\n ) {\n // If we're receiving scenes, try to enable featured products\n store.dispatch(filterFeaturedProducts())\n }\n\n return result\n }\n case types.SWAP_RENDER_ITEM: {\n // delete all combinable children of this item, if any\n const renderedItems = getSelectedCompositionProductData(state)\n const { renderItems } = getSelectedComposition(state)\n const combinableChildren = renderItems.filter(\n (item) => item.combinablePlacement && item.combinablePlacement.parentId === action.targetRenderItemId,\n )\n if (combinableChildren.length > 0) {\n const compositionId = getSelectedCompositionId(state)\n combinableChildren.forEach((item) => {\n const productData = renderedItems.find((prod) => prod.uniqueId === item.uniqueId)\n const trackingInfo = {\n ProductTitle: productData.name,\n ProductId: productData.id,\n ProductSource: productData.source,\n RemovedFrom: SALES_DRESSING,\n }\n store.dispatch(deleteCompositionRenderItem(compositionId, item.uniqueId, trackingInfo))\n })\n }\n\n if (isMobile()) {\n store.dispatch(closeDesignSidepanel())\n } else {\n store.dispatch(selectFurniture(action.productId))\n }\n const uniqueId = getNextRenderItemId(state)\n const compositionId = getSelectedCompositionId(state)\n return next({\n compositionId,\n uniqueId,\n ...action,\n })\n }\n case types.DUPLICATE_RENDER_ITEM: {\n const { targetRenderItemId, renderType, trackingInfo } = action\n\n const selectedCompositionData = getSelectedCompositionData(state)\n const targetRenderItem = selectedCompositionData.renderItems[targetRenderItemId]\n const uniqueId = getNextRenderItemId(state)\n const compositionId = getSelectedCompositionId(state)\n const settings = {\n ...targetRenderItem,\n uniqueId,\n renderType,\n }\n\n if (settings.stackedPlane) {\n delete settings.stackedPlane\n settings.stacks = true\n }\n\n delete settings.x\n delete settings.y\n delete settings.metrics\n delete settings.readyAndRendered\n\n store.dispatch(clickPlaceRenderItem(compositionId, targetRenderItem.id, settings, trackingInfo))\n\n return next(action)\n }\n case types.RECEIVE_FURNITURE_COMBINABLES: {\n if (action.furniture.length === 0) {\n return next(action)\n }\n const compositionId = getSelectedCompositionId(state)\n const parentFurnitureData = getSelectedCompositionProductData(state).find(\n (item) => item.uniqueId === action.parentUniqueId,\n )\n if (parentFurnitureData) {\n const furniture = action.furniture[0]\n const productTrackingInfo = getProductTrackingInfo(furniture)\n const trackingInfo = {\n ...productTrackingInfo,\n AddedFrom: TRACKING_ADDED_FROM_SALES_DRESSING,\n }\n const settings = {\n renderType: FURNITURE_ITEM,\n heading: 0,\n stacks: false,\n hidden: furniture.hidden,\n combinablePlacement: {\n parentId: action.parentUniqueId,\n localTransform:\n parentFurnitureData.metadata.combinables.nodesMeta[action.nodeIndex].matrixModel.flat(),\n },\n }\n store.dispatch(placeRenderItem(compositionId, furniture.id, 0, 0, settings, trackingInfo))\n }\n return next(action)\n }\n case types.SET_INITIAL_LOADING: {\n const nextState = next(action)\n if (!action.initialLoading && getSaveOnFirstRender(state)) {\n store.dispatch(saveSelectedComposition())\n }\n return nextState\n }\n case types.START_TEST_SWAP_SAGA: {\n const swapItemsData = getSelectedFurnitureSwappableItemsData(state)\n const selectedProduct = getSelectedCompositionRenderedFurnitureItem(state)\n const targetRenderItemId = getSelectedRenderItemId(state)\n return next({\n ...action,\n targetRenderItemId,\n selectedProduct,\n swapItemsData,\n })\n }\n case types.TEST_SWAP_SAGA_FINISHED: {\n /* eslint-disable no-console */\n console.group('After multi swap test heap difference:')\n console.log(`jsHeapSizeLimitDelta: ${action.results.jsHeapSizeLimitDelta / 1024 / 1024}Mb`)\n console.log(`totalJSHeapSizeDelta: ${action.results.totalJSHeapSizeDelta / 1024 / 1024}Mb`)\n console.log(`usedJSHeapSizeDelta: ${action.results.usedJSHeapSizeDelta / 1024 / 1024}Mb`)\n console.log(`textureMemoryDelta: ${action.results.textureMemoryDelta / 1024 / 1024}Mb`)\n console.log(`bufferMemoryDelta: ${action.results.bufferMemoryDelta / 1024 / 1024}Mb`)\n console.groupEnd()\n return next(action)\n }\n case types.TEST_LOAD_SAGA_FINISHED: {\n /* eslint-disable no-console */\n console.group('After multi load/delete test heap difference:')\n console.log(`jsHeapSizeLimitDelta: ${action.results.jsHeapSizeLimitDelta / 1024 / 1024}Mb`)\n console.log(`totalJSHeapSizeDelta: ${action.results.totalJSHeapSizeDelta / 1024 / 1024}Mb`)\n console.log(`usedJSHeapSizeDelta: ${action.results.usedJSHeapSizeDelta / 1024 / 1024}Mb`)\n console.log(`textureMemoryDelta: ${action.results.textureMemoryDelta / 1024 / 1024}Mb`)\n console.log(`bufferMemoryDelta: ${action.results.bufferMemoryDelta / 1024 / 1024}Mb`)\n console.groupEnd()\n return next(action)\n }\n case types.UPDATE_HIDDEN_SURFACES: {\n const result = next(action)\n const newState = store.getState()\n\n const composition = getSelectedCompositionData(newState)\n const { hiddenSurfaces } = composition\n\n const droppedRenderItems = Object.values(composition.renderItems).filter((renderItem) =>\n hiddenSurfaces.includes(renderItem.stackedPlane),\n )\n\n const renderer = getRenderer()\n const compositionId = getSelectedCompositionId(newState)\n\n droppedRenderItems.forEach((renderItem) => {\n const renderItemUniqueId = renderItem.uniqueId\n const newPos = renderer.findPlaceableFloorPos()\n store.dispatch(swapStackableToFloor(compositionId, renderItemUniqueId, newPos[0], newPos[1]))\n })\n\n return result\n }\n default:\n return next(action)\n }\n}\n\nexport default compositionsMiddleware\n","import * as types from 'models/actionTypes'\nimport { push } from 'connected-react-router'\nimport qs from 'qs'\n\nimport * as tracker from 'utils/tracker'\nimport { FURNITURE_ITEM } from 'constants/renderItemTypes'\nimport {\n getHash,\n getSearch,\n getDebugFurnitureId,\n getDefaultRedirectUrl,\n getDebugFurnitureModelUrl,\n getApiPrefix,\n getDesignLabReturnUrl,\n getIsIFrame,\n getPathRegion,\n getSaveOnFirstRender,\n} from 'models/location/selectors'\nimport { makeLoginUrl } from 'models/location/helpers'\nimport { getSelectedId } from 'models/scenes/selectors'\nimport { getCompositionsData } from 'models/compositions/selectors'\nimport { clickPlaceRenderItem } from 'models/compositions/actions'\nimport { saveSelectedCompositionToLocalStorage } from 'models/localStorage/actions'\nimport { reset } from 'utils/tracker'\nimport { showLoginPromptModal } from 'models/ui/actions'\nimport { PARAM_SAVEONFIRSTRENDER } from './constants'\n\nconst locationMiddleware = (store) => (next) => (action) => {\n switch (action.type) {\n case types.FURNITURE_FILTER_UPDATE:\n // TODO make generic\n if (action.filter.collection) {\n const search =\n action.filter.collection === '*' ? null : qs.stringify({ collection: action.filter.collection })\n store.dispatch(\n push({\n search,\n hash: getHash(store.getState()),\n }),\n )\n }\n break\n case types.OPEN_COMPOSITION:\n if (action.compositionId === -1) {\n const selectedSceneid = getSelectedId(store.getState())\n store.dispatch(\n push({\n pathname: '/design',\n search: getSearch(store.getState()),\n hash: `${action.compositionId}/${selectedSceneid}`,\n }),\n )\n } else {\n const comp = getCompositionsData(store.getState()).find((c) => c.id === action.compositionId)\n const sceneId = comp ? comp.sceneId : null\n store.dispatch(\n push({\n pathname: '/design',\n search: getSearch(store.getState()),\n hash: `${action.compositionId}${sceneId ? `/${sceneId}` : ''}`,\n }),\n )\n }\n break\n case types.RENDERER_READY: {\n const debugModelUrl = getDebugFurnitureModelUrl(store.getState())\n let debugFurnitureId\n if (debugModelUrl) {\n debugFurnitureId = 1\n } else {\n debugFurnitureId = getDebugFurnitureId(store.getState())\n }\n if (debugFurnitureId) {\n store.dispatch(\n clickPlaceRenderItem(-1, debugFurnitureId, {\n id: debugFurnitureId,\n heading: 0,\n renderType: FURNITURE_ITEM,\n }),\n )\n }\n break\n }\n case types.LOGOUT_USER: {\n const redirect = getDefaultRedirectUrl()\n reset().then(() => {\n window.location.href = `${getApiPrefix()}/auth/logout?redirectUrl=${redirect}`\n })\n break\n }\n case types.RELOAD_PAGE:\n window.location.reload()\n break\n case types.REQUEST_LOGIN_PAGE: {\n const { getState, dispatch } = store\n\n tracker.click(`DecorateRoom.SignupLogin.${action.isSignup ? 'Signup' : 'Login'}`)\n\n if (getIsIFrame()) {\n // Add resume param to the history\n const nextSearch = new URLSearchParams(getSearch(getState()))\n nextSearch.set('resume', 'true')\n dispatch(\n push({\n search: nextSearch.toString(),\n hash: getHash(getState()),\n }),\n )\n\n // Save changes locally\n dispatch(saveSelectedCompositionToLocalStorage())\n // Redirect to login/signup with return to DYH in the url\n const returnUrl = getDesignLabReturnUrl()\n const region = getPathRegion()\n const nextUrl = makeLoginUrl(returnUrl, region, action.isSignup, true)\n window.open(nextUrl, '_top')\n } else {\n // Stay in sugarcube (legacy path)\n dispatch(push(`/${action.isSignup ? 'signup' : 'login'}`))\n }\n dispatch(showLoginPromptModal(false))\n break\n }\n case types.RECEIVE_SAVE_COMPOSITION: {\n const state = store.getState()\n // Clear the autosave param after saving\n if (getSaveOnFirstRender(state)) {\n const nextSearch = new URLSearchParams(getSearch(state))\n nextSearch.delete(PARAM_SAVEONFIRSTRENDER)\n store.dispatch(\n push({\n search: nextSearch.toString(),\n hash: getHash(state),\n }),\n )\n }\n break\n }\n default:\n break\n }\n return next(action)\n}\n\nexport default locationMiddleware\n","import { PARAM_SAVEONFIRSTRENDER } from \"./constants\"\n\nexport const makeLoginUrl = (returnUrl: string, region: string, isSignup: boolean, shouldResume: boolean ) => {\n const verb = isSignup ? 'signup' : 'login'\n const baseUrl = `https://www.ikea.com/${region}/profile/${verb}/`\n const fromUrl = new URL(returnUrl)\n if (shouldResume) {\n fromUrl.searchParams.set('resume', 'true')\n fromUrl.searchParams.set(PARAM_SAVEONFIRSTRENDER, 'true')\n }\n return `${baseUrl}?from=${window.encodeURIComponent(fromUrl.toString())}`\n}\n","import * as ratingTypes from 'models/ratings/constants'\nimport fetch from 'services'\n\nexport const getRatingOptions = () =>\n fetch(`/rating/tags`, {\n method: 'GET',\n })\n\nexport const getRatingById = (jobId) =>\n fetch(`/rating/${jobId}`, {\n method: 'GET',\n })\n\nexport const saveRating = (data) => {\n const { kind, value, note, id, tagId, jobId } = data\n let method = 'POST'\n let url = `/rating/${jobId}`\n const rating = {\n id,\n tagId,\n value,\n note,\n }\n let options = { data: rating }\n if (\n (kind === ratingTypes.RATING && !value) ||\n (kind === ratingTypes.SEVERITY && !value) ||\n (kind === ratingTypes.NOTE && !note) ||\n (kind === ratingTypes.TAG && !value)\n ) {\n method = 'DELETE'\n url = `/rating/${jobId}/${id}`\n options = {}\n } else if (id) {\n method = 'PUT'\n }\n\n return fetch(url, {\n method,\n ...options,\n })\n}\n","import * as types from 'models/actionTypes'\nimport { receiveRating, receiveRatings, receiveRatingOptions } from 'models/ratings/actions'\nimport * as ratingApi from 'services/rating'\n\nconst ratingMiddleware = (store) => (next) => (action) => {\n switch (action.type) {\n case types.REQUEST_RATING_OPTIONS:\n ratingApi.getRatingOptions().then(({ data: options }) => store.dispatch(receiveRatingOptions(options)))\n return next(action)\n case types.REQUEST_RATINGS: {\n const { jobId } = action\n ratingApi.getRatingById(jobId).then(({ data }) => store.dispatch(receiveRatings(action.jobId, data)))\n return next(action)\n }\n\n case types.SUBMIT_RATING: {\n ratingApi.saveRating(action).then(({ data }) => store.dispatch(receiveRating(action.jobId, data)))\n return next(action)\n }\n default:\n return next(action)\n }\n}\n\nexport default ratingMiddleware\n","export const getScheduledScreenshotTimeout = (state) => state.tracking.delayedScreenshot.currentTimeoutId\nexport const getFirstScheduledScreenshotTime = (state) => state.tracking.delayedScreenshot.firstScreenshotTime\nexport const getFirstFurnitureScreenshotDone = (state) => state.tracking.delayedScreenshot.firstFurnitureScreenshotDone\n\nexport const getFurnitureFilterTrackingInfo = (state) => state.tracking.furnitureFilter\n","import axios from 'axios'\nimport fetch from 'services'\n\nconst createUpload = (files) =>\n fetch(`/uploads/`, {\n method: 'POST',\n data: {\n urls: files.map((file) => ({\n path: file.name,\n contentType: file.type,\n })),\n },\n })\n\nconst confirmUpload = (uuid, files) =>\n fetch(`/uploads/${uuid}/uploadNotify/`, {\n method: 'PATCH',\n data: {\n urls: files.map((file) => ({\n path: file.name,\n })),\n },\n })\n\n// Upload a file to GCS.\nconst uploadFile = (signedUrl, file) =>\n axios({\n url: signedUrl,\n method: 'PUT',\n headers: {\n 'Content-Type': file.type,\n },\n data: file,\n })\n\nconst uploadFiles = (files) =>\n createUpload(files).then((resp) => {\n const uuid = resp.data.uuid\n return Promise.all(\n resp.data.urls.map((url) => {\n const file = files.find((f) => url.path === f.name)\n return uploadFile(\n url.url,\n files.find((f) => url.path === f.name),\n ).then(() => confirmUpload(uuid, [file]))\n }),\n ).then(() => uuid)\n })\n\nexport default uploadFiles\n","import fetch from 'services'\nimport uploadFiles from 'services/upload'\n\nexport const createScreenshot = (uploadUuid, renderSessionId, metadata = {}) =>\n fetch(`/screenshots/`, {\n method: 'POST',\n data: {\n upload: uploadUuid,\n renderSessionId,\n metadata,\n },\n })\n\nexport const uploadScreenshot = (file, renderSessionId, metadata = {}) =>\n uploadFiles([file]).then((uuid) => createScreenshot(uuid, renderSessionId, metadata).then(() => uuid))\n","import generateThumbnailFromPreview from 'utils/generateThumbnailFromPreview'\nimport { uploadScreenshot } from 'services/screenshot'\n\nimport Renderer from 'Renderer'\n\nconst dataUrlToFile = async (dataUrl, fileName, mimeType) => {\n const response = await fetch(dataUrl)\n const blob = await response.blob()\n return new File([blob], fileName, { type: mimeType })\n}\n\nconst uploadPreviewScreenshot = async (fileName, renderSessionId, metadata = {}) => {\n // Avoid taking a screenshot when the renderer is still not fully initialized\n // This can (rarely) happen when the furnitureItems are loaded faster than the scene's metadata\n const renderer = Renderer.getInstance()\n if (!renderer || !renderer.ThreeWGLrenderer || !renderer.canvas.width || !renderer.canvas.height) {\n return Promise.reject()\n }\n\n // Since a high quality screenshot is not needed in this context; the thumbnail\n // is generated directly instead of using the renderer's roomScreenshot API\n const scale = 0.5\n const jpegQuality = 0.65\n const { thumbDataUrl: imageData, imageIsBlack } = await generateThumbnailFromPreview(scale, jpegQuality)\n const mimeType = 'image/jpeg'\n const file = await dataUrlToFile(imageData, fileName, mimeType)\n const uuid = await uploadScreenshot(file, renderSessionId, metadata)\n return {\n uuid,\n imageIsBlack,\n }\n}\n\nexport default uploadPreviewScreenshot\n","import * as Sentry from '@sentry/react'\n\nimport * as types from 'models/actionTypes'\nimport * as tracker from 'utils/tracker'\nimport { removeNewUser } from 'services/user'\nimport { getCurrentUser, getName } from 'models/user/selectors'\nimport { getRenderer } from 'models/refStore/selectors'\nimport { getSelectedCompositionTrackingRoomInfo, getUserDidAddRenderItem } from 'models/compositions/selectors'\nimport {\n getScheduledScreenshotTimeout,\n getFirstScheduledScreenshotTime,\n getFirstFurnitureScreenshotDone,\n} from 'models/tracking/selectors'\nimport { OPTIMIZELY_ADD_TO_CART_MW, OPTIMIZELY_ADD_TO_CART } from 'models/tracking/constants'\nimport {\n scheduleDelayedScreenshot,\n delayedScreenshotScsheduled,\n delayedScreenshotSent,\n firstRenderItemScreenshotDone,\n} from 'models/compositions/actions'\nimport { getInitialLoading, getIsMagicWindowLoading } from 'models/preview/selectors'\nimport { getSharePanelOpen } from 'models/ui/selectors'\nimport { STATE_DONE } from 'constants/stateTypes'\nimport { DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE } from 'models/ui/constants'\nimport { getNumFavorites } from 'models/favorites/selectors'\nimport * as msgTypes from 'models/iFrame/msgTypes'\n\nimport uploadPreviewScreenshot from 'utils/uploadPreviewScreenshot'\nimport { getAddToCartUrl } from 'utils/buildUrls'\n\nconst trackingMiddleware = (store) => (next) => (action) => {\n const result = next(action)\n const state = store.getState()\n const roomInfo = getSelectedCompositionTrackingRoomInfo(state)\n\n switch (action.type) {\n case types.RECEIVE_USER: {\n const { wid, metricsId, email, isNewUser, isLoggedIn, loginType } = getCurrentUser(state)\n const trackingId = metricsId || wid\n\n if (isNewUser) {\n tracker.alias(trackingId)\n tracker.set({\n UserId: wid,\n UserEmail: email,\n LoginAuthenticationMode: loginType,\n Name: getName(state),\n SignupDate: new Date(),\n LastLogin: new Date(),\n })\n removeNewUser()\n } else if (isLoggedIn) {\n tracker.set({\n UserId: wid,\n UserEmail: email,\n LoginAuthenticationMode: loginType,\n Name: getName(state),\n LastLogin: new Date(),\n })\n tracker.identify(trackingId)\n }\n if (isLoggedIn) {\n tracker.initPendo(trackingId, { email })\n Sentry.configureScope((scope) => {\n scope.setUser({ id: wid })\n })\n } else {\n tracker.initPendo()\n }\n break\n }\n case types.FAILED_RECEIVE_USER:\n tracker.initPendo()\n break\n case types.PLACE_RENDER_ITEM:\n tracker.loadGuides()\n tracker.drop('DecorateRoom.AddProduct', {\n ...action.trackingInfo,\n ...roomInfo,\n })\n break\n case types.DELETE_COMPOSITION_RENDER_ITEM: {\n if (action.trackingInfo) {\n tracker.click('DecorateRoom.RemoveProduct', {\n ...action.trackingInfo,\n ...roomInfo,\n })\n }\n const renderer = getRenderer()\n if (renderer) {\n const isMagicWindowLoading = getIsMagicWindowLoading(state)\n const histogram = renderer.getHistogramStats()\n tracker.workflow('DecorateRoom.Histogram', {\n ...histogram,\n isMagicWindowLoading,\n })\n }\n store.dispatch(scheduleDelayedScreenshot())\n break\n }\n case types.SWAP_RENDER_ITEM: {\n const {\n trackingInfo: { swappedInTrackingInfo, removedTrackingInfo },\n } = action\n if (swappedInTrackingInfo) {\n tracker.drop('DecorateRoom.AddProduct', {\n ...swappedInTrackingInfo,\n ...roomInfo,\n })\n }\n if (removedTrackingInfo) {\n tracker.click('DecorateRoom.RemoveProduct', {\n ...removedTrackingInfo,\n ...roomInfo,\n })\n }\n break\n }\n case types.RENDER_ITEM_LOADED:\n case types.WALLART_ITEM_LOADED: {\n const renderer = getRenderer()\n if (renderer) {\n const isMagicWindowLoading = getIsMagicWindowLoading(state)\n const histogram = renderer.getHistogramStats()\n tracker.workflow('DecorateRoom.Histogram', {\n ...histogram,\n isMagicWindowLoading,\n })\n }\n const userDidAddRenderItem = getUserDidAddRenderItem(state)\n const isInitialLoading = getInitialLoading(state)\n const firstFurnitureScreenshotDone = getFirstFurnitureScreenshotDone(state)\n if (!isInitialLoading && userDidAddRenderItem && !firstFurnitureScreenshotDone) {\n store.dispatch(firstRenderItemScreenshotDone())\n\n const fileName = 'screenshot.jpg'\n uploadPreviewScreenshot(fileName, window.globalRendererSessionId)\n .then(({ uuid, imageIsBlack }) => {\n const eventName = 'DecorateRoom.Screenshot'\n const { wid } = getCurrentUser(state)\n tracker.workflow(eventName, {\n userId: wid,\n sessionId: window.globalRendererSessionId,\n uuid,\n imageIsBlack,\n screenshotType: 'FirstProductAdd',\n minuteIncrement: 0,\n ...roomInfo,\n })\n })\n .catch(() => {\n const eventName = 'DecorateRoom.ScreenshotFailed'\n const { wid } = getCurrentUser(state)\n tracker.workflow(eventName, {\n userId: wid,\n sessionId: window.globalRendererSessionId,\n ...roomInfo,\n })\n })\n }\n store.dispatch(scheduleDelayedScreenshot())\n break\n }\n case types.UPDATE_COMPOSITION_RENDER_ITEM: {\n const {\n item: { x, y, heading },\n trackingInfo,\n } = action\n if (x || y || heading) {\n const eventName = heading ? 'DecorateRoom.RotateProduct' : 'DecorateRoom.MoveProduct'\n tracker.drop(eventName, {\n ...trackingInfo,\n ...roomInfo,\n })\n const renderer = getRenderer()\n if (renderer) {\n const isMagicWindowLoading = getIsMagicWindowLoading(state)\n const histogram = renderer.getHistogramStats()\n tracker.workflow('DecorateRoom.Histogram', {\n ...histogram,\n isMagicWindowLoading,\n })\n }\n } else {\n tracker.click('DecorateRoom.ChangeProperties', {\n ...trackingInfo,\n ...roomInfo,\n })\n }\n store.dispatch(scheduleDelayedScreenshot())\n break\n }\n case types.REQUEST_SAVE_COMPOSITION: {\n const { trackingInfo } = action\n tracker.click('DecorateRoom.SaveDesign', {\n DesignName: action.data.name,\n DesignId: action.data.compositionId,\n SaveType: action.data.compositionId === -1 ? 'New' : 'Edit',\n ...roomInfo,\n ...trackingInfo,\n })\n\n if (action.data.compositionId === -1) {\n tracker.increment('DesignsSaved')\n }\n break\n }\n case types.OPEN_COMPOSITION:\n if (action.trackingInfo) {\n tracker.click('DecorateRoom.OpenDesign', {\n ...action.trackingInfo,\n })\n }\n break\n case types.FAILED_RECEIVE_SCENES:\n tracker.error('LoadingRooms')\n break\n case types.NEW_RENDERER: {\n const randNums = new Uint32Array(1)\n window.crypto.getRandomValues(randNums)\n window.globalRendererSessionId = `${Date.now()}-${randNums[0]}`\n tracker.initDesignFeedbackTriggerEvents(roomInfo)\n if (!getRenderer().isRendererValid()) {\n tracker.error('NullWebGLContextInfo')\n }\n\n break\n }\n case types.RENDERER_READY:\n tracker.track('WebGLContextInfo', action.contextInfo)\n break\n case types.SET_INITIAL_LOADING:\n if (!action.initialLoading) {\n let totalSceneLoadSizeMB = 0.0\n let modelsCount = 0\n const loadCompleteTime = tracker.getTimeSinceLoadingStart()\n const renderer = getRenderer()\n if (renderer) {\n const additionalStats = renderer.getRoomAdditionalStats()\n const glbStats = renderer.getRoomGlbStats()\n totalSceneLoadSizeMB = additionalStats.sceneAdditionalDataSizeMB + glbStats.totalModelsLoadSizeMB\n modelsCount = glbStats.modelsCount\n }\n\n tracker.track('DecorateRoom.FullLoadComplete', {\n ...roomInfo,\n loadCompleteTime,\n totalSceneLoadSizeMB,\n modelsCount,\n })\n\n const fileName = 'screenshot.jpg'\n uploadPreviewScreenshot(fileName, window.globalRendererSessionId)\n .then(({ uuid, imageIsBlack }) => {\n const eventName = 'DecorateRoom.Screenshot'\n const { wid } = getCurrentUser(state)\n tracker.workflow(eventName, {\n userId: wid,\n sessionId: window.globalRendererSessionId,\n uuid,\n imageIsBlack,\n screenshotType: 'InitialLoad',\n minuteIncrement: 0,\n ...roomInfo,\n })\n })\n .catch(() => {\n const eventName = 'DecorateRoom.ScreenshotFailed'\n const { wid } = getCurrentUser(state)\n tracker.workflow(eventName, {\n userId: wid,\n sessionId: window.globalRendererSessionId,\n ...roomInfo,\n })\n })\n } else {\n tracker.markLoadingStart()\n }\n break\n case types.SCHEDULE_DELAYED_SCREENSHOT:\n {\n const currentTimeoutId = getScheduledScreenshotTimeout(state)\n if (!currentTimeoutId) {\n const screenshotTimeout = 60 * 1000\n const newTimeout = window.setTimeout(() => {\n const firstScreenshotTime = getFirstScheduledScreenshotTime(state)\n const minuteIncrement = Math.round(\n (window.performance.now() - firstScreenshotTime) / (1000.0 * 60.0),\n )\n const fileName = 'screenshot.jpg'\n uploadPreviewScreenshot(fileName, window.globalRendererSessionId)\n .then(({ uuid, imageIsBlack }) => {\n const eventName = 'DecorateRoom.Screenshot'\n const { wid } = getCurrentUser(state)\n tracker.workflow(eventName, {\n userId: wid,\n sessionId: window.globalRendererSessionId,\n uuid,\n imageIsBlack,\n screenshotType: 'MinuteIncrement',\n minuteIncrement,\n ...roomInfo,\n })\n store.dispatch(delayedScreenshotSent())\n })\n .catch(() => {\n const eventName = 'DecorateRoom.ScreenshotFailed'\n const { wid } = getCurrentUser(state)\n tracker.workflow(eventName, {\n userId: wid,\n sessionId: window.globalRendererSessionId,\n ...roomInfo,\n })\n })\n }, screenshotTimeout)\n store.dispatch(delayedScreenshotScsheduled(newTimeout))\n }\n }\n break\n case types.DESTROY_RENDERER:\n {\n window.globalRendererSessionId = null\n tracker.cancelDesignFeedbackTriggerEvents()\n const currentTimeoutId = getScheduledScreenshotTimeout(state)\n if (currentTimeoutId) {\n window.clearTimeout(currentTimeoutId)\n }\n }\n break\n case types.SHARE_PANEL_OPEN_TOGGLE:\n // If we're opening the panel\n if (getSharePanelOpen(state)) {\n tracker.click('DecorateRoom.ShareDesignCTA')\n }\n break\n case types.ADD_TO_BAG: {\n const eventName = 'DecorateRoom.AddProductToBag'\n const cartUrl = getAddToCartUrl([action.localItemNumber], action.region)\n const trackingInfo = {\n ...action.trackingInfo,\n CartUrl: cartUrl,\n }\n tracker.click(eventName, {\n ...trackingInfo,\n ...roomInfo,\n })\n\n const isMagicWindow = tracker.getIsMagicWindow()\n if (isMagicWindow) {\n tracker.optimizelyTrack(OPTIMIZELY_ADD_TO_CART_MW)\n tracker.optimizelyTrack(OPTIMIZELY_ADD_TO_CART)\n }\n\n break\n }\n case types.ADD_ROOM_TO_BAG: {\n const eventName = 'DecorateRoom.AddRoomToBag'\n const { localItemNumbers, region, trackingInfo } = action\n const cartUrl = getAddToCartUrl(localItemNumbers, region)\n const updatedTrackingInfo = {\n ...trackingInfo,\n CartUrl: cartUrl,\n }\n tracker.click(eventName, {\n ...updatedTrackingInfo,\n ...roomInfo,\n })\n\n // For each item added to cart, call optimizely add to cart event, global and from magic window\n const isMagicWindow = tracker.getIsMagicWindow()\n if (localItemNumbers.length && isMagicWindow) {\n localItemNumbers.forEach(() => {\n tracker.optimizelyTrack(OPTIMIZELY_ADD_TO_CART_MW)\n tracker.optimizelyTrack(OPTIMIZELY_ADD_TO_CART)\n })\n }\n break\n }\n case types.OPEN_BAG:\n tracker.click('DecorateRoom.OpenBag', { ...roomInfo })\n break\n case types.TRACK_SHOW_DETAILS: {\n const eventName = 'DecorateRoom.GetAdditionalDetails'\n tracker.click(eventName, {\n ...action.trackingInfo,\n ...roomInfo,\n })\n break\n }\n case types.SET_MAGIC_WINDOW_LOADING: {\n // Only track if finished loading\n if (!action.isMagicWindowLoading) {\n // happens when MW loading animation switches to the scene view\n const eventName = 'DecorateRoom.LoadComplete'\n const loadCompleteTime = tracker.getTimeSinceLoadingStart()\n\n let glbStats = {}\n const renderer = getRenderer()\n if (renderer) {\n glbStats = renderer.getRoomGlbStats()\n }\n tracker.track(eventName, {\n ...roomInfo,\n loadCompleteTime,\n ...glbStats,\n })\n }\n break\n }\n case types.OPEN_DESIGN_SIDEPANEL:\n case types.SET_DESIGN_SIDEPANEL_MODE: {\n const { trackingInfo, mode } = action\n // Only track when there is a productId/title/accessFrom fields\n if (trackingInfo && trackingInfo.ProductId) {\n tracker.click('DecorateRoom.GetInfo', {\n ...trackingInfo,\n ...roomInfo,\n })\n }\n if (mode === DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE) {\n tracker.click('DecorateRoom.Favorites', {\n ...roomInfo,\n Favorites: getNumFavorites(state),\n })\n }\n break\n }\n case types.TOGGLE_FAVORITE: {\n const { isFavorite, localItemNumber } = action\n tracker.click(isFavorite ? 'DecorateRoom.AddFavorites' : 'DecorateRoom.RemoveFavorites', {\n ...roomInfo,\n ProductLocalId: localItemNumber,\n Favorites: getNumFavorites(state),\n })\n break\n }\n case types.REMOVE_RENDER_ITEMS: {\n const eventName = 'DecorateRoom.ClearAllFurniture'\n tracker.click(eventName, { ...roomInfo })\n break\n }\n case types.RECEIVE_APP_DOWNLOAD_SMS: {\n const { status } = action\n const eventName = 'DecorateRoom.TryInMyRoomInfo.SendSMSResult'\n tracker.workflow(eventName, {\n ...roomInfo,\n Result: status === STATE_DONE ? 'Success' : 'Failure',\n })\n\n break\n }\n case types.UPDATE_PREVIEW_SETTINGS: {\n const { settings } = action\n if (settings && Object.prototype.hasOwnProperty.call(settings, 'magicEraserMode')) {\n let eventName\n if (settings.magicEraserMode) {\n eventName = 'DecorateRoom.EraseMode'\n } else {\n eventName = 'DecorateRoom.EraseMode.Exit'\n }\n tracker.workflow(eventName, {\n ...roomInfo,\n })\n }\n break\n }\n case types.UPDATE_COMPOSITION_SAVE_DATA:\n if (action.saveData.erasedSegments && action.trackingInfo && action.trackingInfo.prevErasedSegments) {\n const nextSegments = action.saveData.erasedSegments\n const prevSegments = action.trackingInfo.prevErasedSegments\n // If the number of erased items has changed\n if (nextSegments.length !== prevSegments.length) {\n let eventName\n let eraseItemId\n const diff = (ar1, ar2) => {\n const remaining = ar1.filter((i) => !ar2.includes(i))\n // We only get one item at a time in this action\n return remaining[0]\n }\n if (nextSegments.length > prevSegments.length) {\n eventName = 'DecorateRoom.EraseItemHidden'\n eraseItemId = diff(nextSegments, prevSegments)\n } else {\n eventName = 'DecorateRoom.EraseItemShown'\n eraseItemId = diff(prevSegments, nextSegments)\n }\n\n tracker.workflow(eventName, {\n ...roomInfo,\n EraseItemId: eraseItemId,\n ErasedItems: nextSegments.length,\n EraseableItems: action.trackingInfo.EraseableItems,\n })\n }\n }\n break\n case types.NEW_IFRAME_MESSAGE:\n if (action.message && action.message.type === msgTypes.MAGIC_WINDOW_CLOSE) {\n tracker.workflow('DecorateRoom.MagicWindowExit', {\n ...roomInfo,\n })\n }\n break\n case types.WEBGL_CONTEXT_LOST:\n tracker.workflow('DecorateRoom.WebGlContextLost', {\n ...roomInfo,\n })\n break\n case types.WEBGL_CONTEXT_NOT_CREATED:\n tracker.workflow('DecorateRoom.WebGlContextNotCreated', {\n ...roomInfo,\n })\n break\n case types.WEBGL_CONTEXT_RESTORED:\n tracker.workflow('DecorateRoom.WebGlContextRestored', {\n ...roomInfo,\n })\n break\n case types.SET_WALL_COLOR:\n tracker.click('DecorateRoom.WallColor.Select', {\n WallColorChoice: action.colorString,\n WallColorPlaneIndex: action.planeIndex,\n WallColorChangeId: action.trackingInfo.timestamp,\n ...roomInfo,\n })\n break\n case types.SHOW_LOGIN_PROMPT_MODAL:\n case types.LOGIN_NEEDED:\n if (action.type === types.LOGIN_NEEDED || action.showLoginPromptModal) {\n tracker.click('DecorateRoom.SignupLogin.Overlay')\n }\n break\n case types.INITIALIZATION_FAILURE:\n tracker.workflow('DecorateRoom.InitializationFailure', {\n ...action.info,\n })\n break\n default:\n break\n }\n\n return result\n}\n\nexport default trackingMiddleware\n","import fetch from 'services'\n\nexport const saveTrackingEvent = (eventName, trackingInfo) =>\n fetch(`/support/event`, {\n method: 'POST',\n data: { eventName, ...trackingInfo },\n })\n\nexport const requestAppDownloadSms = (phonenumber, app) =>\n fetch('/notification/sms/', {\n method: 'POST',\n data: { phonenumber, app },\n })\n\nexport const getStatus = () => fetch('/status/')\n","import * as types from 'models/actionTypes'\nimport { STATE_DONE, STATE_ERROR } from 'constants/stateTypes'\nimport { getRedirectUrl } from 'models/user/selectors'\nimport { updateDebugSettings } from 'models/admin/actions'\nimport { getUrlParams } from 'models/location/selectors'\nimport {\n receiveTriggerPasswordReset,\n receiveResetPassword,\n receiveEarlyAccessSubscription,\n receiveChangePassword,\n receiveAppDownloadSms,\n fetchUser,\n} from 'models/user/actions'\nimport { requestFavorites } from 'models/favorites/actions'\nimport * as userApi from 'services/user'\nimport * as supportApi from 'services/support'\n\nconst userMiddleware = (store) => (next) => (action) => {\n const { dispatch } = store\n switch (action.type) {\n case types.RECEIVE_IKEA_TOKENS:\n dispatch(fetchUser())\n dispatch(requestFavorites())\n return next(action)\n case types.LOGIN_NEEDED: {\n const nextAction = {\n ...action,\n redirectUrl: window.location.href, // TODO cleanup unused redirectUrl + adjust tests\n }\n return next(nextAction)\n }\n case types.RECEIVE_USER_LOGIN:\n case types.RECEIVE_USER_SIGNUP:\n if (action.response.status === 200 || action.response.status === 201) {\n window.location.href = getRedirectUrl(store.getState())\n }\n return next(action)\n case types.RECEIVE_USER: {\n if (action.userData.isStaff) {\n dispatch(updateDebugSettings({ enableWalls: true }))\n }\n return next(action)\n }\n case types.TRIGGER_PASSWORD_RESET:\n userApi.triggerResetPassword(action.email).then(() => dispatch(receiveTriggerPasswordReset(STATE_DONE)))\n return next(action)\n case types.RESET_PASSWORD: {\n const urlParams = getUrlParams(store.getState())\n userApi\n .resetPassword(urlParams.email, urlParams.token, action.password)\n .then(() => {\n dispatch(receiveResetPassword(STATE_DONE))\n })\n .catch(() => {\n dispatch(receiveResetPassword(STATE_ERROR))\n })\n\n return next(action)\n }\n case types.REQUEST_EARLY_ACCESS:\n userApi\n .requestEarlyAccess(action.email)\n .then(() => {\n dispatch(receiveEarlyAccessSubscription(STATE_DONE))\n })\n .catch(() => {\n dispatch(receiveEarlyAccessSubscription(STATE_ERROR))\n })\n return next(action)\n case types.REQUEST_CHANGE_PASSWORD:\n userApi\n .requestChangePassword(action.currentPassword, action.newPassword)\n .then(() => {\n dispatch(receiveChangePassword(STATE_DONE))\n })\n .catch(() => {\n dispatch(receiveChangePassword(STATE_ERROR))\n })\n return next(action)\n\n case types.REQUEST_APP_DOWNLOAD_SMS: {\n const { phonenumber, app } = action\n supportApi\n .requestAppDownloadSms(phonenumber, app)\n .then(() => {\n dispatch(receiveAppDownloadSms(STATE_DONE))\n })\n .catch(() => {\n dispatch(receiveAppDownloadSms(STATE_ERROR))\n })\n return next(action)\n }\n case types.REQUEST_DELETE_USER:\n // TODO this is for testing only, needs a receive action\n userApi.deleteUser()\n return next(action)\n default:\n return next(action)\n }\n}\n\nexport default userMiddleware\n","import * as types from 'models/actionTypes'\nimport { getDebugFurnitureId, getDebugFurnitureModelUrl, getRegion, getSubCatalog } from 'models/location/selectors'\nimport { clearFurnitureFilter, requestFurniture, updateFurnitureFilter } from 'models/furniture/actions'\nimport { getFilter, getFilterResult, getStackEnabled } from 'models/furniture/selectors'\nimport { DEBUG_CATEGORY } from 'models/furniture/constants'\nimport { LOCALE_GEO } from 'models/location/constants'\nimport { getSelectedSceneRoomType } from 'models/compositions/selectors'\n\nconst furnitureMiddleware = (store) => (next) => (action) => {\n switch (action.type) {\n case types.REQUEST_FURNITURE_SAGA: {\n const state = store.getState()\n\n const { moreToken, currentPage } = getFilterResult(state)\n const requestedPage = currentPage + 1\n\n const stackEnabled = getStackEnabled(state)\n\n const filter = Object.fromEntries(\n Object.entries(getFilter(state)).filter(([, val]) => !!val && val !== '*'),\n )\n\n // Special case for debug furniture\n if (filter.category === DEBUG_CATEGORY) {\n delete filter.category\n filter.region = LOCALE_GEO\n } else {\n filter.region = getRegion(state)\n }\n\n filter.stackEnabled = stackEnabled\n\n const debugModelUrl = getDebugFurnitureModelUrl(state)\n const debugFurnitureId = getDebugFurnitureId(state)\n\n return next({\n ...action,\n filter,\n moreToken,\n requestedPage,\n debugModelUrl,\n debugFurnitureId,\n })\n }\n case types.REQUEST_FURNITURE_CATEGORIES_SAGA: {\n const state = store.getState()\n return next({\n ...action,\n region: getRegion(state),\n stackEnabled: getStackEnabled(state),\n })\n }\n case types.FURNITURE_FILTER_CLEAR:\n case types.FURNITURE_FILTER_UPDATE: {\n const result = next(action)\n store.dispatch(requestFurniture())\n return result\n }\n case types.FILTER_FEATURED_PRODUCTS: {\n const state = store.getState()\n const urlSubCatalog = getSubCatalog(state)\n const roomType = getSelectedSceneRoomType(state)\n\n if (urlSubCatalog) {\n store.dispatch(updateFurnitureFilter({ subCatalog: urlSubCatalog }))\n } else if (roomType) {\n store.dispatch(updateFurnitureFilter({ roomType }))\n } else {\n store.dispatch(clearFurnitureFilter())\n }\n\n return next(action)\n }\n default:\n return next(action)\n }\n}\n\nexport default furnitureMiddleware\n","import * as types from 'models/actionTypes'\nimport * as msgTypes from 'models/iFrame/msgTypes'\nimport { navigateBack, setResumeParam } from 'models/iFrame/actions'\nimport { getIsIFrame } from 'models/location/selectors'\n\nconst messageParent = (action) => {\n try {\n if (getIsIFrame()) {\n window.parent.postMessage(action, '*')\n }\n } catch (e) {\n // eslint-disable-block\n }\n}\n\nconst iFrameMiddleware = () => (next) => (action) => {\n const returnState = next(action)\n switch (action.type) {\n case types.NEW_IFRAME_MESSAGE: {\n const { message } = action\n messageParent(message)\n break\n }\n case types.REQUEST_IKEA_TOKENS: {\n messageParent({ type: msgTypes.GET_TOKENS })\n break\n }\n case types.SET_MAGIC_WINDOW_LOADING: {\n if (!action.isMagicWindowLoading) {\n messageParent({ type: msgTypes.MAGIC_WINDOW_LOADED })\n }\n break\n }\n case types.DELETE_COMPOSITION_RENDER_ITEM: {\n if (action.trackingInfo) {\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: 'remove_product',\n label: action.trackingInfo.LocalItemNumber,\n })\n }\n break\n }\n case types.PLACE_RENDER_ITEM: {\n if (action.trackingInfo) {\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: 'add_product',\n label: action.trackingInfo.LocalItemNumber,\n })\n }\n break\n }\n case types.UPDATE_COMPOSITION_RENDER_ITEM: {\n if (action.trackingInfo) {\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: 'move_product',\n label: action.trackingInfo.LocalItemNumber,\n })\n }\n break\n }\n case types.RECEIVE_SAVE_COMPOSITION: {\n const { compositionId, originId } = action\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: 'save',\n label: `${originId}|${compositionId}`,\n })\n break\n }\n case types.ADD_TO_BAG: {\n const { trackingInfo, localItemNumber } = action\n if (trackingInfo && localItemNumber) {\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: 'add_to_bag',\n label: localItemNumber,\n })\n }\n break\n }\n case types.TRACK_SHOW_DETAILS: {\n const { trackingInfo } = action\n // Only track when there is a productId/title/accessFrom fields\n if (trackingInfo && trackingInfo.LocalItemNumber) {\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: 'get_additional_details',\n label: trackingInfo.LocalItemNumber,\n })\n }\n break\n }\n case types.TOGGLE_FAVORITE: {\n const { isFavorite, localItemNumber } = action\n const gaAction = isFavorite ? 'add_favorite' : 'remove_favorite'\n if (localItemNumber) {\n messageParent({\n type: msgTypes.MAGIC_WINDOW_GA_TRACKING,\n action: gaAction,\n label: localItemNumber,\n })\n }\n break\n }\n case types.OPEN_DESIGN_LAB: {\n messageParent(navigateBack())\n // window.open(getDesignLabUrl(), '_top') // Legacy behavior\n break\n }\n case types.REQUEST_LOGIN_PAGE: {\n messageParent(setResumeParam())\n break\n }\n default:\n break\n }\n return returnState\n}\n\nexport default iFrameMiddleware\n","import * as types from 'models/actionTypes'\nimport { getRenderer } from 'models/refStore/selectors'\nimport { setIsMagicWindowLoading, setInitialLoading, updatePreviewSettings } from 'models/preview/actions'\nimport { getIsMagicWindowLoading, getInitialLoading, getPreviewSettings } from 'models/preview/selectors'\nimport { getSelectedCompositionIsLoading } from 'models/compositions/selectors'\nimport { getFurnitureIsLoading } from 'models/furniture/selectors'\nimport { getHasRendered } from 'models/renderer/selectors'\n\nconst previewMiddleware = (store) => (next) => (action) => {\n const result = next(action)\n const state = store.getState()\n switch (action.type) {\n case types.RENDERER_READY:\n case types.FIRST_RENDER:\n case types.RECEIVE_FURNITURE:\n case types.RENDER_ITEM_LOADED:\n case types.WALLART_ITEM_LOADED: {\n const hasRendered = getHasRendered(state)\n const isCompositionLoading = getSelectedCompositionIsLoading(state)\n const isMagicWindowLoading = getIsMagicWindowLoading(state)\n const isFurnitureLoading = getFurnitureIsLoading(state)\n const isInitialLoading = getInitialLoading(state)\n if (isMagicWindowLoading && !isCompositionLoading && !isFurnitureLoading) {\n store.dispatch(setIsMagicWindowLoading(false))\n }\n if (isInitialLoading && hasRendered && !isCompositionLoading && !isFurnitureLoading) {\n store.dispatch(setInitialLoading(false))\n }\n break\n }\n case types.NEW_RENDERER: {\n store.dispatch(setInitialLoading(true))\n break\n }\n case types.DESTROY_RENDERER: {\n if (getPreviewSettings(state).magicEraserMode) {\n store.dispatch(updatePreviewSettings({ magicEraserMode: false }))\n }\n const renderer = getRenderer()\n if (renderer) {\n renderer.cleanup()\n }\n break\n }\n default:\n break\n }\n return result\n}\n\nexport default previewMiddleware\n","export const STORED_COMPOSITION_LABEL = 'GeoComposition'\n","import * as Sentry from '@sentry/react'\nimport type { Middleware } from 'redux'\n\nimport type { RootState } from 'store'\n\nimport { getSelectedCompositionSaveData } from 'models/compositions/selectors'\nimport { STORED_COMPOSITION_LABEL } from 'models/localStorage/constants'\nimport { getHasLocalStoredComposition } from 'models/localStorage/selectors'\n\nimport * as types from 'models/actionTypes'\n\n\nconst localStorageMiddleware: Middleware = (store) => (next) => (action) => {\n let nextAction = action\n switch (action.type) {\n case types.SAVE_SELECTED_COMPOSITION_TO_LOCAL_STORAGE: {\n const saveData = getSelectedCompositionSaveData(store.getState())\n try {\n window.localStorage.setItem(STORED_COMPOSITION_LABEL, JSON.stringify(saveData))\n } catch (error) {\n Sentry.captureException(error)\n }\n break\n }\n case types.LOAD_COMPOSITION_FROM_LOCAL_STORAGE: {\n try {\n if (getHasLocalStoredComposition()) {\n const saveDataString = window.localStorage.getItem(STORED_COMPOSITION_LABEL)\n if (saveDataString) {\n const saveData = JSON.parse(saveDataString)\n // Legacy difference in saving/loading\n saveData.placedfurnitureSet = saveData.placedFurniture\n nextAction = {\n ...nextAction,\n composition: saveData,\n }\n }\n }\n } catch (error) {\n Sentry.captureException(error)\n }\n break\n }\n default:\n break\n }\n return next(nextAction)\n}\n\nexport default localStorageMiddleware\n","import * as Sentry from '@sentry/react'\n\nimport { STORED_COMPOSITION_LABEL } from 'models/localStorage/constants'\n\nexport const getHasLocalStoredComposition = () => {\n try {\n return !!window.localStorage.getItem(STORED_COMPOSITION_LABEL)\n } catch (error) {\n Sentry.captureException(error)\n return false\n }\n}\n","import { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\n\nconst initialState = {\n gtURLs: [],\n gtZipIsLoading: false,\n debugSettings: {\n linesViz: false,\n lightsViz: false,\n depthViz: false,\n imitateLowPerformance: false,\n ssViz: false,\n nsViz: false,\n normalsViz: false,\n environmentRotation: 2,\n environmentIntensity: 1.0,\n pointLightIntensities: new Array(10).fill(1),\n ambientLightIntensity: 1.0,\n directionalLightIntensities: new Array(10).fill(1),\n highlightPlanes: false,\n defaultToFloor: false,\n useFancyShadows: false,\n frontSideShadows: true,\n useMultiShadow: false,\n enableWalls: true,\n canEditArtSize: false,\n stackablesOnFloor: false,\n enableGPUframetimeStats: false,\n showMemoryStats: false,\n trackedMemoryType: 0,\n toneMappingType: 0, // = THREE.NoToneMapping,\n toneMappingExposure: 1.0,\n aoMapIntensity: 1.0,\n analyticLightsContribution: true,\n showProductAdminData: false,\n useTAAforScreenshots: false,\n hidePins: false,\n },\n}\n\nconst gtURLs = (state = initialState.gtURLs, action) => {\n switch (action.type) {\n case types.RECEIVE_GT:\n return action.gtURLs\n default:\n return state\n }\n}\n\nconst gtZipIsLoading = (state = initialState.gtZipIsLoading, action) => {\n switch (action.type) {\n case types.REQUEST_DOWNLOAD:\n return true\n case types.RECEIVE_DOWNLOAD:\n return false\n default:\n return state\n }\n}\n\nconst debugSettings = (state = initialState.debugSettings, action) => {\n switch (action.type) {\n case types.UPDATE_DEBUG_SETTINGS:\n return {\n ...state,\n ...action.debugSettings,\n useMultiShadow: action.debugSettings.useFancyShadows || false,\n }\n default:\n return state\n }\n}\n\nexport default combineReducers({\n gtURLs,\n gtZipIsLoading,\n debugSettings,\n})\n","import { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\n\nconst initialState = {\n hasAddedToBag: false,\n}\n\nconst hasAddedToBag = (state = initialState.hasAddedToBag, action) => {\n switch (action.type) {\n case types.ADD_TO_BAG:\n case types.ADD_ROOM_TO_BAG:\n return true\n default:\n return state\n }\n}\n\nexport default combineReducers({ hasAddedToBag })\n","import { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\nimport * as RenderItemTypes from 'constants/renderItemTypes'\n\nexport const initialState = {\n selectedId: -1,\n selectedRenderItemId: -1,\n draggingRenderItemId: -1,\n nextRenderItemId: 0,\n byId: {\n '-1': {\n id: -1,\n wid: -1,\n renderItems: {},\n sceneId: null,\n name: '',\n thumbUrl: '',\n uuid: '',\n isShared: false,\n isStock: false,\n geoProperties: {},\n savedProperties: {},\n wallPaint: {},\n hiddenSurfaces: [],\n },\n },\n isSaving: false,\n // TODO: isModified should be per-composition, ideally\n isModified: false,\n isLoadingCompositions: false,\n isLoadingCompiledComposition: false,\n hasSaveError: false,\n hoverRenderType: null,\n nextStackableItem: {\n settings: {},\n trackingInfo: {},\n waitingInteraction: false,\n },\n swappingSurfaces: false,\n userDidAddRenderItem: false,\n}\n\n// When creating new render items in the store\n// these are the properties that are unsaved\n// and must be initialized from scratch.\n// Use for loading/placing/swapping/duplicating/etc\nconst resetableProps = {\n metrics: null,\n readyAndRendered: false,\n}\n\nconst translateServComp = (composition, renderItems) => {\n if (!composition) {\n return {}\n }\n const placedProducts = composition.placedfurnitureSet\n const ri = Object.assign(\n {},\n ...placedProducts.map((item) => {\n const { gfxAttributes } = item\n let artData = {}\n if (gfxAttributes && gfxAttributes.artData) {\n artData = gfxAttributes.artData\n }\n let uniqueId\n if (item.uniqueId) {\n uniqueId = parseInt(item.uniqueId, 10)\n } else {\n // Backfill uniqueId to load mobile compositions\n uniqueId = Date.now() - Math.round(Math.random() * 100000)\n }\n return {\n [uniqueId]: {\n id: item.furnitureId,\n uniqueId,\n x: item.x,\n y: item.y,\n heading: item.heading,\n stackedPlane: gfxAttributes && gfxAttributes.stackedPlane,\n combinablePlacement: gfxAttributes && gfxAttributes.combinablePlacement,\n\n ...artData,\n\n ...resetableProps,\n },\n }\n }),\n )\n return {\n [composition.compositionId]: {\n id: composition.compositionId,\n wid: composition.wid,\n uuid: composition.uuid,\n isShared: composition.isShared,\n isStock: composition.isStock || false,\n renderItems: renderItems || ri || {},\n sceneId: composition.sceneId,\n name: composition.name,\n creationDate: composition.createdAt,\n thumbUrl: composition.thumbnailUrl || '',\n geoProperties: composition.geoProperties || {},\n savedProperties: composition.savedProperties || {},\n wallPaint: (composition.savedProperties && composition.savedProperties.wallPaint) || {},\n hiddenSurfaces: [],\n },\n }\n}\n\nexport const byId = (state = initialState.byId, action) => {\n switch (action.type) {\n case types.RECEIVE_COMPOSITIONS:\n return Object.assign({}, ...action.compositions.map((comp) => translateServComp(comp)), state)\n case types.RECEIVE_COMPILED_COMPOSITION:\n return {\n ...translateServComp(action.composition),\n ...state, // Don't allow incoming comps to overwrite state\n }\n case types.LOAD_COMPOSITION_FROM_LOCAL_STORAGE:\n return {\n ...state,\n ...translateServComp(action.composition), // Local storage can overwrite state\n }\n case types.RECEIVE_SAVE_COMPOSITION:\n // TODO. For now just copy the original composition\n if (action.isNew) {\n return {\n ...state,\n ...translateServComp(action.composition, state[action.originId].renderItems),\n }\n }\n return {\n ...state,\n [action.composition.compositionId]: {\n ...state[action.composition.compositionId],\n thumbUrl: action.composition.thumbnailUrl || '',\n },\n }\n case types.PLACE_RENDER_ITEM:\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n renderItems: {\n ...state[action.compositionId].renderItems,\n [action.uniqueId]: {\n id: action.id,\n uniqueId: action.uniqueId,\n x: action.x,\n y: action.y,\n ...action.settings,\n ...resetableProps,\n },\n },\n },\n }\n case types.SWAP_RENDER_ITEM: {\n const renderItems = { ...state[action.compositionId].renderItems }\n const targetRenderItem = renderItems[action.targetRenderItemId]\n\n const swappedInRenderItem = {\n ...targetRenderItem,\n uniqueId: action.uniqueId,\n id: action.productId,\n ...resetableProps,\n }\n\n if (targetRenderItem.swapChainPosition !== undefined) {\n swappedInRenderItem.x = targetRenderItem.swapChainPosition[0]\n swappedInRenderItem.y = targetRenderItem.swapChainPosition[1]\n\n swappedInRenderItem.swapChainPosition = [...targetRenderItem.swapChainPosition]\n } else {\n swappedInRenderItem.swapChainPosition = [targetRenderItem.x, targetRenderItem.y]\n }\n\n delete renderItems[action.targetRenderItemId]\n\n renderItems[action.uniqueId] = swappedInRenderItem\n\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n renderItems,\n },\n }\n }\n case types.DELETE_COMPOSITION_RENDER_ITEM: {\n const { id: deletedId, compositionId } = action\n const renderItems = { ...state[compositionId].renderItems }\n delete renderItems[deletedId]\n\n // Process for stacked children\n Object.values(renderItems).forEach((renderItem) => {\n // If item stacks, check if stackedPlane begins with deletedId\n if (renderItem.stackedPlane && renderItem.stackedPlane.indexOf(deletedId) === 0) {\n // Delete \"children\" stacked on deleted render item\n delete renderItems[renderItem.uniqueId]\n }\n })\n\n return {\n ...state,\n [compositionId]: {\n ...state[compositionId],\n renderItems,\n },\n }\n }\n case types.SWAP_STACKABLE_SURFACE: {\n const renderItems = { ...state[action.compositionId].renderItems }\n renderItems[action.itemId].stackedPlane = action.planeId\n renderItems[action.itemId].x = action.x\n renderItems[action.itemId].y = action.y\n renderItems[action.itemId].swapChainPosition = renderItems[action.itemId].swapChainPosition && [\n action.x,\n action.y,\n ]\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n renderItems,\n },\n }\n }\n case types.SWAP_STACKABLE_TO_FLOOR: {\n // This reducer finds the target renderItem, removes\n // its .stackedPlane property, and sets a new (x, y)\n // position. This removes a stackable from a surface\n // and places it on the floor.\n\n const renderItems = {\n ...state[action.compositionId].renderItems,\n }\n\n const targetItem = {\n ...renderItems[action.itemId],\n x: action.x,\n y: action.y,\n }\n\n targetItem.swapChainPosition = targetItem.swapChainPosition && [action.x, action.y]\n delete targetItem.stackedPlane\n\n renderItems[action.itemId] = targetItem\n\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n renderItems,\n },\n }\n }\n case types.UPDATE_COMPOSITION_RENDER_ITEM:\n case types.RENDER_ITEM_LOADED:\n case types.WALLART_ITEM_LOADED: {\n const { compositionId, id: renderItemUniqueId, item } = action\n const { renderItems } = state[compositionId]\n // If the user is swapping really quickly, the RENDER_ITEM_LOADED comes in\n // after the item has been swapped. In this case, we do not want to want to\n // add metrics or other item data for a renderitem that has been updated/removed.\n if (!renderItems[renderItemUniqueId]) {\n return state\n }\n\n return {\n ...state,\n [compositionId]: {\n ...state[compositionId],\n renderItems: {\n ...renderItems,\n [renderItemUniqueId]: {\n ...renderItems[renderItemUniqueId],\n ...item,\n },\n },\n },\n }\n }\n\n case types.CLEAR_SWAP_AFFINITY: {\n const newState = { ...state }\n const { compositionId, id } = action\n delete newState[compositionId].renderItems[id].swapChainPosition\n Object.values(newState[compositionId].renderItems)\n .filter((item) => item.stacks && item.stackedPlane.startsWith(id))\n .map((item) => item.uniqueId)\n .forEach((itemId) => {\n delete newState[compositionId].renderItems[itemId].swapChainPosition\n })\n return newState\n }\n\n case types.RENAME_COMPOSITION:\n return {\n ...state,\n [action.id]: {\n ...state[action.id],\n name: action.name,\n },\n }\n case types.REQUEST_DELETE_COMPOSITION: {\n const nextState = { ...state }\n delete nextState[action.id]\n return nextState\n }\n case types.SELECT_SCENE:\n // Clear items from the default comp\n // when selecting scene (the selected id\n // also gets reset)\n return {\n ...state,\n '-1': {\n ...initialState.byId['-1'],\n },\n }\n case types.SHARE_COMPOSITION: {\n if (state[action.id] && state[action.id].isShared) {\n return state\n }\n return {\n ...state,\n [action.id]: {\n ...state[action.id],\n isShared: true,\n },\n }\n }\n case types.UPDATE_COMPOSITION_SAVE_DATA:\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n savedProperties: {\n ...state[action.compositionId].savedProperties,\n ...action.saveData,\n },\n },\n }\n case types.REMOVE_RENDER_ITEMS: {\n const { compositionId } = action\n const composition = state[compositionId]\n const toBeDeletedRenderItems = { ...composition.renderItems }\n return {\n ...state,\n [action.compositionId]: {\n ...composition,\n renderItems: {},\n deletedRenderItems: toBeDeletedRenderItems, // to be used later for undo delete\n },\n }\n }\n case types.UNDO_REMOVE_RENDER_ITEMS: {\n const { compositionId } = action\n const composition = state[compositionId]\n return {\n ...state,\n [action.compositionId]: {\n ...composition,\n renderItems: { ...composition.deletedRenderItems },\n },\n }\n }\n\n case types.SET_WALL_COLOR: {\n const wallPaint = { ...state[action.compositionId].wallPaint }\n if (action.colorString) {\n wallPaint[action.planeIndex] = action.colorString\n } else {\n delete wallPaint[action.planeIndex]\n }\n\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n wallPaint,\n },\n }\n }\n case types.UPDATE_HIDDEN_SURFACES:\n return {\n ...state,\n [action.compositionId]: {\n ...state[action.compositionId],\n hiddenSurfaces: action.surfaces,\n },\n }\n\n default:\n return state\n }\n}\n\nexport const selectedId = (state = initialState.selectedId, action) => {\n switch (action.type) {\n case types.SELECT_COMPOSITION:\n return action.compositionId\n case types.SELECT_SCENE:\n // Select the default comp when changing the scene\n return -1\n default:\n return state\n }\n}\n\nexport const selectedRenderItemId = (state = initialState.selectedRenderItemId, action) => {\n switch (action.type) {\n case types.SWAP_RENDER_ITEM:\n return action.uniqueId\n case types.SELECT_COMPOSITION_RENDER_ITEM:\n return action.renderItemId\n case types.OPEN_DESIGN_SIDEPANEL:\n return action.renderItemId || state\n case types.DELETE_COMPOSITION_RENDER_ITEM:\n return -1\n default:\n return state\n }\n}\n\nexport const draggingRenderItemId = (state = initialState.draggingRenderItemId, action) => {\n switch (action.type) {\n case types.START_DRAG_RENDER_ITEM:\n return action.uniqueId\n case types.STOP_DRAG_RENDER_ITEM:\n return -1\n default:\n return state\n }\n}\n\nexport const nextRenderItemId = (state = initialState.nextRenderItemId, action) => {\n switch (action.type) {\n case types.SET_INITIAL_LOADING:\n case types.SELECT_ART:\n case types.SELECT_FURNITURE:\n case types.QUICK_PREVIEW_ART:\n case types.PLACE_RENDER_ITEM:\n case types.SWAP_RENDER_ITEM:\n case types.DUPLICATE_RENDER_ITEM:\n return Date.now()\n default:\n return state\n }\n}\n\nexport const isSaving = (state = initialState.isSaving, action) => {\n switch (action.type) {\n case types.REQUEST_SAVE_COMPOSITION:\n return true\n case types.RECEIVE_SAVE_COMPOSITION:\n case types.FAILED_SAVE_COMPOSITION:\n return false\n default:\n return state\n }\n}\n\nexport const hasSaveError = (state = initialState.hasSaveError, action) => {\n switch (action.type) {\n case types.REQUEST_SAVE_COMPOSITION:\n case types.RECEIVE_SAVE_COMPOSITION:\n return false\n\n case types.FAILED_SAVE_COMPOSITION:\n return true\n default:\n return state\n }\n}\n\nexport const isModified = (state = initialState.isModified, action) => {\n // TODO: setting to false when you select scene isn't true\n switch (action.type) {\n case types.PLACE_RENDER_ITEM:\n case types.UPDATE_COMPOSITION_RENDER_ITEM:\n case types.RENAME_COMPOSITION:\n case types.UPDATE_COMPOSITION_SAVE_DATA:\n case types.SWAP_RENDER_ITEM:\n return true\n case types.SELECT_COMPOSITION:\n case types.SELECT_SCENE:\n case types.RECEIVE_SAVE_COMPOSITION:\n return false\n case types.DELETE_COMPOSITION_RENDER_ITEM:\n if (action.compositionId === -1 && action.isLastItem) {\n // Empty default comp is not modified\n return false\n }\n return true\n default:\n return state\n }\n}\n\nconst isLoadingCompositions = (state = initialState.isLoadingCompositions, action) => {\n switch (action.type) {\n case types.REQUEST_COMPOSITIONS_SAGA:\n return true\n case types.RECEIVE_COMPOSITIONS:\n case types.FAILED_RECEIVE_COMPOSITIONS:\n return false\n default:\n return state\n }\n}\n\nconst isLoadingCompiledComposition = (state = initialState.isLoadingCompiledComposition, action) => {\n switch (action.type) {\n case types.REQUEST_COMPILED_COMPOSITION_SAGA:\n return true\n case types.RECEIVE_COMPILED_COMPOSITION:\n case types.FAILED_RECEIVE_COMPILED_COMPOSITION:\n return false\n case types.SET_COMPOSITION_PRE_FETCH_LOADING:\n return action.isLoading\n default:\n return state\n }\n}\n\nexport const hoverRenderType = (state = initialState.hoverRenderType, action) => {\n switch (action.type) {\n case types.SELECT_ART:\n return RenderItemTypes.ART_ITEM\n case types.SELECT_FURNITURE:\n return RenderItemTypes.FURNITURE_ITEM\n default:\n return state\n }\n}\n\nexport const nextStackableItem = (state = initialState.nextStackableItem, action) => {\n switch (action.type) {\n case types.START_PLACE_STACKABLE_ITEM:\n return {\n settings: action.settings,\n trackingInfo: action.trackingInfo,\n waitingInteraction: true,\n }\n case types.HIDE_PLACEABLE_SURFACES:\n return {\n settings: {},\n trackingInfo: {},\n waitingInteraction: false,\n }\n default:\n return state\n }\n}\n\nconst swappingSurfaces = (state = initialState.swappingSurfaces, action) => {\n switch (action.type) {\n case types.START_SWAP_STACKABLE_SURFACE:\n return true\n case types.HIDE_PLACEABLE_SURFACES:\n return false\n default:\n return state\n }\n}\n\nconst userDidAddRenderItem = (state = initialState.userDidAddRenderItem, action) => {\n switch (action.type) {\n case types.SET_INITIAL_LOADING:\n return false\n case types.PLACE_RENDER_ITEM:\n return true\n default:\n return state\n }\n}\n\nexport default combineReducers({\n byId,\n selectedId,\n selectedRenderItemId,\n draggingRenderItemId,\n nextRenderItemId,\n isSaving,\n isModified,\n isLoadingCompositions,\n isLoadingCompiledComposition,\n hasSaveError,\n hoverRenderType,\n nextStackableItem,\n swappingSurfaces,\n userDidAddRenderItem,\n})\n","import { combineReducers } from 'redux'\n\nimport * as types from 'models/actionTypes'\n\nconst initialState = {\n ids: null,\n}\n\nconst ids = (state = initialState.ids, action) => {\n switch (action.type) {\n case types.RECEIVE_FAVORITES:\n return action.favorites\n case types.TOGGLE_FAVORITE: {\n if (action.isFavorite) {\n const prevFavs = state ? [...state] : []\n return [...new Set([...prevFavs, action.localItemNumber])]\n }\n return state.filter((f) => f !== action.localItemNumber)\n }\n case types.TOGGLE_FAVORITES: {\n const { isFavorite, itemsToFavorite } = action\n if (isFavorite) {\n const prevFavs = state ? [...state] : []\n return [...new Set([...prevFavs, ...itemsToFavorite])]\n }\n return state.filter((f) => !itemsToFavorite.includes(f))\n }\n default:\n return state\n }\n}\n\nexport default combineReducers({ ids })\n","/*\n\nThis utility file contains code for interpreting stackable\nsurface data. Stackables data appears in both the manifest\n(static regions) and in furniture metadata (dynamic\nregions). Surface defintions can be in V0 format or V1 format. V0\nformat is the original implementation and supports circular\nregions only. V1 supports arbitrary polygon shapes (and\noptionally also supports circles, just like in V0, though with\na different layout).\n\nThe manifest.md file may be helpful in understanding the data\nlayout here. See the section on plane_polygon_0, which describes\nthe new V1 data format:\nhttps://github.com/geomagical/labtech-egress/blob/develop/docs/manifest.md#plane_polygon_0\n\nThe methods here take V0 or V1 data and return a common filtered\ndata format (which looks more like V1). This allows the calling\ncode to be agnostic of version differences in the underlying\ndata. \n\n*/\n\nexport const makeStackableFromV1Data = (data) => {\n const parameters = {\n type: data.style,\n }\n\n if (data.parameters.radius) {\n parameters.radius = data.parameters.radius\n }\n\n if (data.parameters.vertices) {\n parameters.vertices = data.parameters.vertices.map((v) => [+v[0], +v[1]])\n }\n\n const transform = data.matrixModel || data.matrix_model || data.transform\n\n const ret = {\n id: `${data.id}`,\n parameters,\n transform: transform.map((row) => [...row]),\n }\n\n return ret\n}\n\nexport const makeStackableFromV0Data = (data) => {\n const c = data.centroid\n\n let r\n\n if (!data.rot) {\n r = [\n [1, 0, 0],\n [0, 0, 1],\n [0, -1, 0],\n ]\n } else {\n const d = data.rot\n\n // This matrix rotation deserves a note of\n // explination. To undersatnd this rotation let\n // Q be the rotation matrix from the if() section\n // above, the one with the [-1, 0, 0] on the\n // first row. The value of `r` below comes out\n // to `r = Q * d`.\n\n r = [\n [-d[0][0], -d[0][1], -d[0][2]],\n [-d[1][0], -d[1][1], -d[1][2]],\n [+d[2][0], +d[2][1], +d[2][2]],\n ]\n }\n\n const ret = {\n id: `${data.id}`,\n parameters: {\n type: 'circle',\n radius: data.style.radius,\n },\n transform: [\n [r[0][0], r[0][1], r[0][2], c[0]],\n [r[1][0], r[1][1], r[1][2], c[1]],\n [r[2][0], r[2][1], r[2][2], c[2]],\n [0, 0, 0, 1],\n ],\n }\n\n return ret\n}\n\nexport const getManifestStackables = (manifest) => {\n const staticSurfacesV0 =\n manifest.stackables_0 && manifest.stackables_0.stackables && manifest.stackables_0.stackables.planes.horizontal\n\n const staticSurfacesV1 = manifest.plane_polygon_0 && manifest.plane_polygon_0.plane_polygons\n\n if (staticSurfacesV1) {\n return staticSurfacesV1.map((data) => makeStackableFromV1Data(data))\n }\n\n if (staticSurfacesV0) {\n return staticSurfacesV0.map((data) => makeStackableFromV0Data(data))\n }\n\n return []\n}\n\nexport const furnitureItemStackables = (furnitureData) => {\n const hasV0 =\n furnitureData.stackables && furnitureData.stackables.planes && furnitureData.stackables.planes.horizontal\n const hasV1 = furnitureData.stackables && furnitureData.stackables.polygons\n\n if (hasV1) {\n return furnitureData.stackables.polygons.map((data) => makeStackableFromV1Data(data))\n }\n\n if (hasV0) {\n return furnitureData.stackables.planes.horizontal.map((data) => makeStackableFromV0Data(data))\n }\n\n return []\n}\n","// These are used for sorting the categories that we get from the api\n// NOT for showing a list of filters\n\nexport const CATEGORIES = [\n 'FURNITURE',\n 'SOFAS & ARMCHAIRS',\n 'BABY & KIDS',\n 'BEDS & MATTRESSES',\n 'BATHROOM',\n 'KITCHEN & APPLIANCES',\n 'STORAGE & ORGANIZATION',\n 'RUGS',\n 'HOME TEXTILES',\n 'HOME ELECTRONICS',\n 'HOME DÉCOR',\n 'COOKWARE & TABLEWARE',\n]\n\nexport const SUBCATEGORIES = [\n 'OTTOMANS',\n 'SOFAS & SECTIONALS',\n 'DRESSERS & STORAGE DRAWERS',\n 'TABLES & DESKS',\n 'BOOKCASES & SHELVING UNITS',\n 'TV & MEDIA FURNITURE',\n 'ARMOIRES & WARDROBES',\n 'BABY FURNITURE',\n 'KIDS FURNITURE',\n 'CHAIRS',\n 'ARMCHAIRS & CHAISES',\n 'SIDEBOARDS, BUFFETS & SOFA TABLES',\n 'DISPLAY & STORAGE CABINETS',\n 'OUTDOOR FURNITURE',\n 'BAR FURNITURE',\n 'CAFÉ FURNITURE',\n 'ROOM DIVIDERS',\n 'KITCHEN ISLANDS & CARTS',\n 'NURSERY FURNITURE',\n 'SOFAS & ARMCHAIRS',\n 'BEDS & MATTRESSES',\n 'BEDS',\n 'SLEEPER SOFAS',\n 'SECTIONALS',\n 'SOFA COVERS',\n 'SOFA LEGS',\n 'BABY',\n 'CRIBS & CRIB MATTRESSES',\n 'NURSING, FEEDING & EATING',\n 'CHANGING, BATHING & POTTY',\n 'BABY TEXTILES',\n 'BABY TOYS',\n 'KIDS',\n 'KIDS MATTRESSES',\n 'STUVA STORAGE SYSTEM',\n 'KIDS STORAGE & ORGANIZATION',\n 'KIDS TEXTILES',\n 'KIDS KITCHENWARE AND TABLEWARE',\n 'KIDS LIGHTING',\n 'KIDS DECORATION & ACCESSORIES',\n 'TOYS & PLAY',\n 'SAFETY',\n]\n","// eslint-disable-next-line import/prefer-default-export\nconst datefolderStr1 = '2022-05-19'\nconst datefolderStr = '2022-02-23'\n\n// mattress\nconst mattressFullNodesMeta = [\n {\n category: 'pillow',\n size: 'full',\n matrixModel: [\n [1.0, 0.0, 0.0, -0.3858965337276459],\n [0.0, 1.0, 0.0, 0.2749449908733368],\n [0.0, 0.0, 1.0, -0.705109179019928],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'pillow',\n size: 'full',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.3858965337276459],\n [0.0, 1.0, 0.0, 0.2749449908733368],\n [0.0, 0.0, 1.0, -0.705109179019928],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'duvet',\n size: 'full',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.0],\n [0.0, 1.0, 0.0, -0.23533299565315247],\n [0.0, 0.0, 1.0, 0.0],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n]\n\nconst mattressKingNodesMeta = [\n {\n category: 'pillow',\n size: 'king',\n matrixModel: [\n [1.0, 0.0, 0.0, -0.46094465255737305],\n [0.0, 1.0, 0.0, 0.2749454379081726],\n [0.0, 0.0, 1.0, -0.7590532898902893],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'pillow',\n size: 'king',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.46094465255737305],\n [0.0, 1.0, 0.0, 0.2749454379081726],\n [0.0, 0.0, 1.0, -0.7590532898902893],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'duvet',\n size: 'king',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.0],\n [0.0, 1.0, 0.0, -0.2747127413749695],\n [0.0, 0.0, 1.0, 0.0],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n]\n\nconst mattressQueenNodesMeta = [\n {\n category: 'pillow',\n size: 'queen',\n matrixModel: [\n [1.0, 0.0, 0.0, -0.3812639117240906],\n [0.0, 1.0, 0.0, 0.2749449908733368],\n [0.0, 0.0, 1.0, -0.7585901618003845],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'pillow',\n size: 'queen',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.3812639117240906],\n [0.0, 1.0, 0.0, 0.2749449908733368],\n [0.0, 0.0, 1.0, -0.7585901618003845],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'duvet',\n size: 'queen',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.0],\n [0.0, 1.0, 0.0, -0.26042911410331726],\n [0.0, 0.0, 1.0, 0.0],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n]\n\nconst mattressTwinNodesMeta = [\n {\n category: 'pillow',\n size: 'twin',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.0],\n [0.0, 1.0, 0.0, 0.2749449908733368],\n [0.0, 0.0, 1.0, -0.6942226886749268],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n {\n category: 'duvet',\n size: 'twin',\n matrixModel: [\n [1.0, 0.0, 0.0, 0.0],\n [0.0, 1.0, 0.0, -0.2191503643989563],\n [0.0, 0.0, 1.0, 0.0],\n [0.0, 0.0, 0.0, 1.0],\n ],\n },\n]\n\nconst duvetFullFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/full/duvet-full-bed_with_footrest.glb`\nconst duvetFullPlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/full/duvet-full-platform_bed.glb`\nconst duvetKingFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/king/duvet-king-bed_with_footrest.glb`\nconst duvetKingPlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/king/duvet-king-platform_bed.glb`\nconst duvetQueenFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/queen/duvet-queen-bed_with_footrest.glb`\nconst duvetQueenPlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/queen/duvet-queen-platform_bed.glb`\nconst duvetTwinFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/twin/duvet-twin-bed_with_footrest.glb`\nconst duvetTwinPlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/duvet/twin/duvet-twin-platform_bed.glb`\n\n/* eslint-disable @typescript-eslint/naming-convention */\nconst duvetne_100_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_100_200/duvet-ne_100_200-platform_bed.glb`\nconst duvetne_100_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_100_200/duvet-ne_100_200-bed_with_footrest.glb`\nconst duvetne_140_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_140_200/duvet-ne_140_200-platform_bed.glb`\nconst duvetne_140_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_140_200/duvet-ne_140_200-bed_with_footrest.glb`\nconst duvetne_160_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_160_200/duvet-ne_160_200-platform_bed.glb`\nconst duvetne_160_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_160_200/duvet-ne_160_200-bed_with_footrest.glb`\nconst duvetne_180_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_180_200/duvet-ne_180_200-platform_bed.glb`\nconst duvetne_180_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_180_200/duvet-ne_180_200-bed_with_footrest.glb`\nconst duvetne_200_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_200_200/duvet-ne_200_200-platform_bed.glb`\nconst duvetne_200_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_200_200/duvet-ne_200_200-bed_with_footrest.glb`\nconst duvetne_80_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_80_200/duvet-ne_80_200-platform_bed.glb`\nconst duvetne_80_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_80_200/duvet-ne_80_200-bed_with_footrest.glb`\nconst duvetne_90_200PlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_90_200/duvet-ne_90_200-platform_bed.glb`\nconst duvetne_90_200FootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/ne_90_200/duvet-ne_90_200-bed_with_footrest.glb`\nconst duvetuk_doublePlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_double/duvet-uk_double-platform_bed.glb`\nconst duvetuk_doubleFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_double/duvet-uk_double-bed_with_footrest.glb`\nconst duvetuk_kingPlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_king/duvet-uk_king-platform_bed.glb`\nconst duvetuk_kingFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_king/duvet-uk_king-bed_with_footrest.glb`\nconst duvetuk_singlePlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_single/duvet-uk_single-platform_bed.glb`\nconst duvetuk_singleFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_single/duvet-uk_single-bed_with_footrest.glb`\nconst duvetuk_super_kingPlatformUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_super_king/duvet-uk_super_king-platform_bed.glb`\nconst duvetuk_super_kingFootrestUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/duvet/uk_super_king/duvet-uk_super_king-bed_with_footrest.glb`\n/* eslint-enable @typescript-eslint/naming-convention */\n\nconst mattressFullUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/mattress/full/mattress-full.glb`\nconst mattressKingUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/mattress/king/mattress-king.glb`\nconst mattressQueenUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/mattress/queen/mattress-queen.glb`\nconst mattressTwinUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/mattress/twin/mattress-twin.glb`\n\n/* eslint-disable @typescript-eslint/naming-convention */\nconst mattressne_100_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_100_200/mattress-ne_100_200.glb`\nconst mattressne_140_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_140_200/mattress-ne_140_200.glb`\nconst mattressne_160_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_160_200/mattress-ne_160_200.glb`\nconst mattressne_180_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_180_200/mattress-ne_180_200.glb`\nconst mattressne_200_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_200_200/mattress-ne_200_200.glb`\nconst mattressne_80_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_80_200/mattress-ne_80_200.glb`\nconst mattressne_90_200Url = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/ne_90_200/mattress-ne_90_200.glb`\nconst mattressuk_doubleUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/uk_double/mattress-uk_double.glb`\nconst mattressuk_kingUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/uk_king/mattress-uk_king.glb`\nconst mattressuk_singleUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/uk_single/mattress-uk_single.glb`\nconst mattressuk_super_kingUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr}/mattress/uk_super_king/mattress-uk_super_king.glb`\n/* eslint-enable @typescript-eslint/naming-convention */\n\nconst pillowFullUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/pillow/full/pillow-full.glb`\nconst pillowKingUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/pillow/king/pillow-king.glb`\nconst pillowQueenUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/pillow/queen/pillow-queen.glb`\nconst pillowTwinUrl = `https://storage.googleapis.com/catalog-processed/dressed-beds/${datefolderStr1}/pillow/twin/pillow-twin.glb`\n\nconst createFakeDuvet = (id, size, variant, modelUrl) => ({\n id,\n hidden: true,\n region: 'geo',\n name: '00FAKEDUVET',\n thumbUrl: 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__24302_pe089431_s5.jpg',\n collections: ['IKEA', 'Debug'],\n rootCategories: [],\n categories: ['Debug'],\n subCategories: ['Debug'],\n ecommerceUrl: '',\n globalProductId: 'GEO1112',\n price: '$39.99',\n rating: '0.0',\n ratingCount: 0,\n description: 'Fake combinable item',\n imageUrls: [\n 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__24302_pe089431_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__1097696_ph173556_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__1059353_pe849594_s5.jpg',\n ],\n qaStatus: 'PENDING',\n availableInRegion: true,\n uncompressedModelSize: 0,\n localItemNumber: '20033919',\n recommended: [],\n subCatalogs: null,\n swappableItems: null,\n modelUrl,\n rotX: 1.5707963267949,\n scale: 1,\n geometryType: '3d',\n maxX: 0.302869498729706,\n maxY: 0.163490742561407,\n maxZ: 0.30346742272377,\n minX: -0.303461700677872,\n minY: 0,\n minZ: -0.30165821313858,\n stackables: null,\n metadata: {\n combinables: {\n selfMeta: { category: 'duvet', size, variant },\n nodesMeta: [],\n },\n },\n})\n\nconst createFakeMattress = (id, size, nodesMeta, modelUrl) => ({\n id,\n hidden: true,\n region: 'geo',\n name: '00FAKEMATTRESS',\n thumbUrl:\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0736462_pe740546_s5.jpg',\n collections: ['IKEA', 'Debug'],\n rootCategories: [],\n categories: [],\n subCategories: ['Debug'],\n ecommerceUrl: '',\n globalProductId: '80213446',\n price: '$55.00',\n rating: '0.0',\n ratingCount: 0,\n description: 'Fake combinable item',\n imageUrls: [\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0736462_pe740546_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0673536_pe717303_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0673539_pe717311_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0917930_ph166330_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0706058_ph141986_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0907955_pe617526_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0907980_pe619789_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/aepplaroe-table-stool-section-outdoor-brown-stained__0907951_pe616541_s5.jpg',\n ],\n qaStatus: 'PENDING',\n availableInRegion: true,\n uncompressedModelSize: 0,\n localItemNumber: '80213446',\n recommended: [],\n subCatalogs: null,\n swappableItems: null,\n modelUrl,\n rotX: 1.5707963267949,\n scale: 1,\n geometryType: '3d',\n maxX: 0.313216686248779,\n maxY: 0.28579631447792,\n maxZ: 0.313265472650528,\n minX: -0.313233524560928,\n minY: 0,\n minZ: -0.313269466161728,\n stackables: null,\n isRug: false,\n selected: true,\n isLeftMost: true,\n\n metadata: {\n combinables: {\n selfMeta: { category: 'mattress', size },\n nodesMeta,\n },\n },\n})\n\nconst createFakePillow = (id, size, modelUrl) => ({\n id,\n hidden: true,\n region: 'geo',\n name: '00FAKEPILLOW',\n thumbUrl: 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__24302_pe089431_s5.jpg',\n collections: ['IKEA', 'Debug'],\n rootCategories: [],\n categories: ['Debug'],\n subCategories: ['Debug'],\n ecommerceUrl: '',\n globalProductId: 'GEO1112',\n price: '$39.99',\n rating: '0.0',\n ratingCount: 0,\n description: 'Fake combinable item',\n imageUrls: [\n 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__24302_pe089431_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__1097696_ph173556_s5.jpg',\n 'https://www.ikea.com/us/en/images/products/alseda-stool-banana-fiber__1059353_pe849594_s5.jpg',\n ],\n qaStatus: 'PENDING',\n availableInRegion: true,\n uncompressedModelSize: 0,\n localItemNumber: '20033919',\n recommended: [],\n subCatalogs: null,\n swappableItems: null,\n modelUrl,\n rotX: 1.5707963267949,\n scale: 1,\n geometryType: '3d',\n maxX: 0.302869498729706,\n maxY: 0.163490742561407,\n maxZ: 0.30346742272377,\n minX: -0.303461700677872,\n minY: 0,\n minZ: -0.30165821313858,\n stackables: null,\n metadata: {\n combinables: {\n selfMeta: { category: 'pillow', size },\n nodesMeta: [],\n },\n },\n})\n\nlet id = 9999990\n/* eslint-disable no-plusplus */\nconst mockCombinableChildren = [\n createFakeDuvet(id++, 'full', 'bed_with_footrest', duvetFullFootrestUrl), // fakeDuvetFullFootrest,\n createFakeDuvet(id++, 'full', 'platform_bed', duvetFullPlatformUrl), // fakeDuvetFullPlatform,\n createFakeDuvet(id++, 'king', 'bed_with_footrest', duvetKingFootrestUrl), // fakeDuvetKingFootrest,\n createFakeDuvet(id++, 'king', 'platform_bed', duvetKingPlatformUrl), // fakeDuvetKingPlatform,\n createFakeDuvet(id++, 'queen', 'bed_with_footrest', duvetQueenFootrestUrl), // fakeDuvetQueenFootrest,\n createFakeDuvet(id++, 'queen', 'platform_bed', duvetQueenPlatformUrl), // fakeDuvetQueenPlatform,\n createFakeDuvet(id++, 'twin', 'bed_with_footrest', duvetTwinFootrestUrl), // fakeDuvetTwinFootrest,\n createFakeDuvet(id++, 'twin', 'platform_bed', duvetTwinPlatformUrl), // fakeDuvetTwinPlatform,\n\n createFakeMattress(id++, 'full', mattressFullNodesMeta, mattressFullUrl), // fakeMattressFull,\n createFakeMattress(id++, 'king', mattressKingNodesMeta, mattressKingUrl), // fakeMattressKing,\n createFakeMattress(id++, 'queen', mattressQueenNodesMeta, mattressQueenUrl), // fakeMattressQueen,\n createFakeMattress(id++, 'twin', mattressTwinNodesMeta, mattressTwinUrl), // fakeMattressTwin,\n\n createFakePillow(id++, 'full', pillowFullUrl), // fakePillowFull,\n createFakePillow(id++, 'king', pillowKingUrl), // fakePillowKing,\n createFakePillow(id++, 'queen', pillowQueenUrl), // fakePillowQueen,\n createFakePillow(id++, 'twin', pillowTwinUrl), // fakePillowTwin,\n\n createFakeDuvet(id++, 'ne_80_200', 'bed_with_footrest', duvetne_80_200FootrestUrl),\n createFakeDuvet(id++, 'ne_80_200', 'platform_bed', duvetne_80_200PlatformUrl),\n createFakeDuvet(id++, 'ne_90_200', 'bed_with_footrest', duvetne_90_200FootrestUrl),\n createFakeDuvet(id++, 'ne_90_200', 'platform_bed', duvetne_90_200PlatformUrl),\n createFakeDuvet(id++, 'ne_100_200', 'bed_with_footrest', duvetne_100_200FootrestUrl),\n createFakeDuvet(id++, 'ne_100_200', 'platform_bed', duvetne_100_200PlatformUrl),\n createFakeDuvet(id++, 'ne_140_200', 'bed_with_footrest', duvetne_140_200FootrestUrl),\n createFakeDuvet(id++, 'ne_140_200', 'platform_bed', duvetne_140_200PlatformUrl),\n createFakeDuvet(id++, 'ne_160_200', 'bed_with_footrest', duvetne_160_200FootrestUrl),\n createFakeDuvet(id++, 'ne_160_200', 'platform_bed', duvetne_160_200PlatformUrl),\n createFakeDuvet(id++, 'ne_180_200', 'bed_with_footrest', duvetne_180_200FootrestUrl),\n createFakeDuvet(id++, 'ne_180_200', 'platform_bed', duvetne_180_200PlatformUrl),\n createFakeDuvet(id++, 'ne_200_200', 'bed_with_footrest', duvetne_200_200FootrestUrl),\n createFakeDuvet(id++, 'ne_200_200', 'platform_bed', duvetne_200_200PlatformUrl),\n createFakeDuvet(id++, 'us_king', 'bed_with_footrest', duvetKingFootrestUrl),\n createFakeDuvet(id++, 'us_king', 'platform_bed', duvetKingPlatformUrl),\n createFakeDuvet(id++, 'us_queen', 'bed_with_footrest', duvetQueenFootrestUrl),\n createFakeDuvet(id++, 'us_queen', 'platform_bed', duvetQueenPlatformUrl),\n createFakeDuvet(id++, 'us_full', 'bed_with_footrest', duvetFullFootrestUrl),\n createFakeDuvet(id++, 'us_full', 'platform_bed', duvetFullPlatformUrl),\n createFakeDuvet(id++, 'us_twin', 'bed_with_footrest', duvetTwinFootrestUrl),\n createFakeDuvet(id++, 'us_twin', 'platform_bed', duvetTwinPlatformUrl),\n createFakeDuvet(id++, 'uk_super_king', 'bed_with_footrest', duvetuk_super_kingFootrestUrl),\n createFakeDuvet(id++, 'uk_super_king', 'platform_bed', duvetuk_super_kingPlatformUrl),\n createFakeDuvet(id++, 'uk_king', 'bed_with_footrest', duvetuk_kingFootrestUrl),\n createFakeDuvet(id++, 'uk_king', 'platform_bed', duvetuk_kingPlatformUrl),\n createFakeDuvet(id++, 'uk_double', 'bed_with_footrest', duvetuk_doubleFootrestUrl),\n createFakeDuvet(id++, 'uk_double', 'platform_bed', duvetuk_doublePlatformUrl),\n createFakeDuvet(id++, 'uk_single', 'bed_with_footrest', duvetuk_singleFootrestUrl),\n createFakeDuvet(id++, 'uk_single', 'platform_bed', duvetuk_singlePlatformUrl),\n\n createFakeMattress(id++, 'us_king', mattressKingNodesMeta, mattressKingUrl),\n createFakeMattress(id++, 'us_queen', mattressQueenNodesMeta, mattressQueenUrl),\n createFakeMattress(id++, 'us_full', mattressFullNodesMeta, mattressFullUrl),\n createFakeMattress(id++, 'us_twin', mattressTwinNodesMeta, mattressTwinUrl),\n createFakeMattress(id++, 'uk_super_king', mattressFullNodesMeta, mattressuk_super_kingUrl),\n createFakeMattress(id++, 'uk_king', mattressFullNodesMeta, mattressuk_kingUrl),\n createFakeMattress(id++, 'uk_double', mattressFullNodesMeta, mattressuk_doubleUrl),\n createFakeMattress(id++, 'uk_single', mattressFullNodesMeta, mattressuk_singleUrl),\n createFakeMattress(id++, 'ne_80_200', mattressFullNodesMeta, mattressne_80_200Url),\n createFakeMattress(id++, 'ne_90_200', mattressFullNodesMeta, mattressne_90_200Url),\n createFakeMattress(id++, 'ne_100_200', mattressFullNodesMeta, mattressne_100_200Url),\n createFakeMattress(id++, 'ne_140_200', mattressFullNodesMeta, mattressne_140_200Url),\n createFakeMattress(id++, 'ne_160_200', mattressFullNodesMeta, mattressne_160_200Url),\n createFakeMattress(id++, 'ne_180_200', mattressFullNodesMeta, mattressne_180_200Url),\n createFakeMattress(id++, 'ne_200_200', mattressFullNodesMeta, mattressne_200_200Url),\n\n createFakePillow(id++, 'us_king', pillowKingUrl),\n createFakePillow(id++, 'us_queen', pillowQueenUrl),\n createFakePillow(id++, 'us_full', pillowFullUrl),\n createFakePillow(id++, 'us_twin', pillowTwinUrl),\n createFakePillow(id++, 'uk_super_king', pillowFullUrl),\n createFakePillow(id++, 'uk_king', pillowFullUrl),\n createFakePillow(id++, 'uk_double', pillowFullUrl),\n createFakePillow(id++, 'uk_single', pillowFullUrl),\n createFakePillow(id++, 'ne_80_200', pillowFullUrl),\n createFakePillow(id++, 'ne_90_200', pillowFullUrl),\n createFakePillow(id++, 'ne_100_200', pillowFullUrl),\n createFakePillow(id++, 'ne_140_200', pillowFullUrl),\n createFakePillow(id++, 'ne_160_200', pillowFullUrl),\n createFakePillow(id++, 'ne_180_200', pillowFullUrl),\n createFakePillow(id++, 'ne_200_200', pillowFullUrl),\n]\n/* eslint-enable no-plusplus */\n\nexport const getMockCommbinables = (mappingFunc) =>\n mockCombinableChildren.map(mappingFunc).reduce((accum, currItem) => {\n const obj = {}\n Object.assign(obj, ...Object.values(currItem))\n return Object.assign(accum, { [obj.id]: obj })\n }, {})\n\nexport const getCombinables = (slotCategory, size, variant) =>\n mockCombinableChildren.filter(\n (child) =>\n child.metadata.combinables.selfMeta.category === slotCategory &&\n child.metadata.combinables.selfMeta.size === size &&\n (child.metadata.combinables.selfMeta.variant === undefined ||\n child.metadata.combinables.selfMeta.variant === variant),\n )\n","import { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\nimport sortByArray from 'utils/sortByArray'\nimport { furnitureItemStackables } from 'utils/stackables'\nimport { CATEGORIES as CATORDER, SUBCATEGORIES as SUBCATORDER } from 'constants/categories'\nimport { GEOMETRY_TYPE_MAP } from 'constants/renderItemTypes'\nimport { isEmpty } from 'utils/buildUrls'\nimport { getMockCommbinables } from 'services/mockdata'\n\nconst processProductItem = (product) => {\n const renderType = GEOMETRY_TYPE_MAP[product.geometryType]\n const thumbUrl = product.thumbUrl\n const isRug =\n (product.name && product.name.includes('rug')) ||\n (product.description && product.description.includes('rug')) ||\n (product.categories && product.categories.includes('Rugs'))\n const hasTallLegs = ['Tables & desks', 'Chairs'].some((category) => product.subCategories.includes(category))\n const isCubicStructure = [\n 'Drawer units',\n 'Dressers & storage drawers',\n 'Storage solution systems',\n 'Sideboards, buffets & sofa tables',\n 'Display & storage cabinets',\n 'Filing cabinets & storage cabinets',\n 'TV & media furniture',\n 'Shelving units, bookcases & storage options',\n 'Clothes organizers',\n 'Nightstands',\n 'Bathroom storage',\n ].some((category) => product.subCategories.includes(category))\n\n return {\n [product.id]: {\n id: product.id,\n region: product.region,\n name: product.name,\n thumbUrl,\n collections: product.collections,\n rootCategories: product.rootCategories,\n categories: product.categories,\n subCategories: product.subCategories,\n ecommerceUrl: product.ecommerceUrl,\n globalProductId: product.globalProductId,\n price: product.price || '$0.00',\n rating: product.rating,\n ratingCount: product.ratingCount,\n description: product.description,\n imageUrls: product.imageUrls,\n qaStatus: product.qaStatus,\n availableInRegion: product.availableInRegion,\n uncompressedModelSize: product.uncompressedModelSize,\n localItemNumber: product.localItemNumber,\n recommended: product.recommended,\n subCatalogs: product.subCatalogs,\n swappableItems: null,\n renderType,\n\n // Furniture props\n modelUrl: product.modelUrl,\n rotX: product.rotX, // TODO check proptypes\n scale: product.scale,\n max: { x: product.maxX, y: product.maxY, z: product.maxZ },\n min: { x: product.minX, y: product.minY, z: product.minZ },\n stacks: product.stacks, // TODO check proptypes\n stackables: furnitureItemStackables(product), // TODO check proptypes\n isRug,\n metadata: product.metadata,\n hidden: product.hidden || false,\n hasTallLegs,\n isCubicStructure,\n\n // Art props\n artAssetUrls: product.processedImageUrls,\n displayHeightCm: product.displayHeightCm,\n displayWidthCm: product.displayWidthCm,\n\n // Admin properties\n globalProductAdminUrl: product.globalProductAdminUrl,\n localProductAdminUrl: product.localProductAdminUrl,\n },\n }\n}\n\nexport const initialState = {\n byId: {\n ...getMockCommbinables(processProductItem),\n },\n selectedId: null,\n swapAnchorId: null,\n selectedSwapDetailsId: null,\n filter: {\n query: null,\n category: '*',\n subCategory: '*',\n subCatalog: '*',\n roomType: '*',\n },\n loadedSubCatalogs: [],\n isLoading: false,\n isSwappablesLoading: false,\n isCategoriesLoading: false,\n isLoadingByIds: false,\n stackEnabled: true, // TODO remove entirely\n categories: [],\n filterResult: {\n ids: [],\n count: 0,\n currentPage: 0,\n hasNext: true,\n moreToken: null,\n },\n}\n\nexport const byId = (state = initialState.byId, action) => {\n switch (action.type) {\n case types.RECEIVE_FURNITURE:\n case types.RECEIVE_FURNITURE_BY_IDS:\n case types.RECEIVE_FURNITURE_BY_LOCALITEMNOS:\n case types.RECEIVE_COMPILED_COMPOSITION:\n return Object.assign({}, state, ...action.furniture.map(processProductItem))\n case types.RECEIVE_FURNITURE_SWAPPABLES:\n return Object.assign({}, state, ...action.furniture.map(processProductItem), {\n [action.id]: {\n ...state[action.id],\n swappableItems: action.furniture.map((furni) => furni.id),\n },\n })\n case types.RECEIVE_FURNITURE_COMBINABLES: {\n const newState = { ...state }\n newState[action.parentId].metadata.combinables.nodesMeta[action.nodeIndex].items = action.furniture.map(\n (furni) => furni.id,\n )\n return newState\n }\n default:\n return state\n }\n}\n\nexport const selectedId = (state = initialState.selectedId, action) => {\n switch (action.type) {\n case types.SELECT_FURNITURE:\n return action.id\n default:\n return state\n }\n}\n\n// swapAnchorId is different from the selectedId and is used to display\n// a consistent set of swappable items for the original selected furniture.\n// The selectedId value will change as furniture is swapped, while\n// the swapAnchorId state maintains the original selection.\nexport const swapAnchorId = (state = initialState.swapAnchorId, action) => {\n switch (action.type) {\n case types.PLACE_RENDER_ITEM: {\n const {\n settings: { combinablePlacement },\n id,\n } = action\n\n if (!combinablePlacement || isEmpty(combinablePlacement) || !combinablePlacement.parentId) {\n return id\n }\n return state\n }\n case types.SHOW_SWAP_MENU:\n return action.id\n default:\n return state\n }\n}\n\nexport const selectedSwapDetailsId = (state = initialState.selectedSwapDetailsId, action) => {\n switch (action.type) {\n case types.SELECT_FURNITURE_SWAP_DETAILS:\n return action.id\n default:\n return state\n }\n}\n\nexport const filter = (state = initialState.filter, action) => {\n switch (action.type) {\n case types.FURNITURE_FILTER_UPDATE: {\n const nextFilter = {\n ...state,\n ...action.filter,\n }\n if (Object.prototype.hasOwnProperty.call(action.filter, 'query')) {\n nextFilter.category = '*'\n nextFilter.subCategory = '*'\n nextFilter.subCatalog = '*'\n nextFilter.roomType = '*'\n } else if (action.filter.subCatalog) {\n nextFilter.query = null\n nextFilter.category = '*'\n nextFilter.subCategory = '*'\n nextFilter.roomType = '*'\n } else if (action.filter.roomType) {\n nextFilter.query = null\n nextFilter.category = '*'\n nextFilter.subCategory = '*'\n nextFilter.subCatalog = '*'\n } else if (action.filter.category) {\n nextFilter.query = null\n nextFilter.subCatalog = '*'\n nextFilter.roomType = '*'\n if (!action.filter.subCategory) {\n nextFilter.subCategory = '*'\n }\n }\n return nextFilter\n }\n case types.FURNITURE_FILTER_CLEAR:\n return {\n ...initialState.filter,\n }\n default:\n return state\n }\n}\n\nconst isLoading = (state = initialState.isLoading, action) => {\n switch (action.type) {\n case types.REQUEST_FURNITURE_SAGA:\n return true\n case types.RECEIVE_FURNITURE:\n case types.FAILED_RECEIVE_FURNITURE:\n return false\n default:\n return state\n }\n}\n\nexport const isSwappablesLoading = (state = initialState.isSwappablesLoading, action) => {\n switch (action.type) {\n case types.REQUEST_FURNITURE_SWAPPABLES_SAGA:\n return true\n case types.RECEIVE_FURNITURE_SWAPPABLES:\n case types.FAILED_RECEIVE_FURNITURE_SWAPPABLES:\n return false\n default:\n return state\n }\n}\n\nconst isCategoriesLoading = (state = initialState.isCategoriesLoading, action) => {\n switch (action.type) {\n case types.REQUEST_FURNITURE_CATEGORIES_SAGA:\n return true\n case types.RECEIVE_FURNITURE_CATEGORIES:\n case types.FAILED_RECEIVE_FURNITURE_CATEGORIES:\n return false\n default:\n return state\n }\n}\n\nexport const isLoadingByIds = (state = initialState.isLoadingByIds, action) => {\n switch (action.type) {\n case types.REQUEST_FURNITURE_BY_IDS_SAGA:\n return true\n case types.RECEIVE_FURNITURE_BY_IDS:\n case types.FAILED_RECEIVE_FURNITURE_BY_IDS:\n return false\n default:\n return state\n }\n}\n\nexport const stackEnabled = (state = initialState.stackEnabled, action) => {\n switch (action.type) {\n case types.SET_MAGIC_WINDOW_LOADING:\n return true\n default:\n return state\n }\n}\n\nexport const categories = (state = initialState.categories, action) => {\n switch (action.type) {\n case types.RECEIVE_FURNITURE_CATEGORIES:\n if (action.categories && action.categories.length) {\n return sortByArray(\n action.categories.map((cat) => ({\n key: cat.categoryId,\n label: cat.name,\n subCategories: sortByArray(\n cat.subCategories.map((subCat) => ({\n key: subCat.categoryId,\n label: subCat.name,\n })),\n [(a) => a.label, SUBCATORDER],\n (a) => a.label,\n ),\n })),\n [(a) => a.label, CATORDER],\n (a) => a.label,\n )\n }\n return state\n default:\n return state\n }\n}\n\nexport const filterResult = (state = initialState.filterResult, action) => {\n switch (action.type) {\n case types.RECEIVE_FURNITURE:\n return {\n ids: [...state.ids, ...action.furniture.map((furni) => furni.id)],\n count: action.count || 0,\n currentPage: state.currentPage + 1,\n hasNext: action.hasNext || false,\n moreToken: action.moreToken || null,\n }\n case types.FURNITURE_FILTER_CLEAR:\n case types.FURNITURE_FILTER_UPDATE:\n return initialState.filterResult\n default:\n return state\n }\n}\n\nexport default combineReducers({\n byId,\n selectedId,\n filter,\n isLoading,\n isSwappablesLoading,\n isCategoriesLoading,\n isLoadingByIds,\n stackEnabled,\n categories,\n filterResult,\n swapAnchorId,\n selectedSwapDetailsId,\n})\n","import * as types from 'models/actionTypes'\nimport { AnyAction } from 'redux'\n\nconst initialState = {\n kioskSelectedRoomType: null,\n isKioskIntroViewed: false,\n}\n\nconst kiosk = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case types.SELECT_KIOSK_ROOM_TYPE:\n return {\n ...state,\n kioskSelectedRoomType: action.roomType,\n }\n case types.SET_KIOSK_INTRO_VIEWED:\n return {\n ...state,\n isKioskIntroViewed: true,\n }\n default:\n return state\n }\n}\n\nexport default kiosk\n","import * as types from 'models/actionTypes'\n\nconst initialState = {\n quickPreviewIsOpen: false,\n isCurrentDragValid: true,\n isMagicWindowLoading: false,\n initialLoading: false,\n wallDataDimensions: {\n width: 0,\n height: 0,\n },\n settings: {\n showOcclusions: true,\n showShadows: true,\n showSurfaces: [],\n magicEraserMode: false,\n wallCollisions: false,\n },\n}\n\nconst preview = (state = initialState, action) => {\n switch (action.type) {\n case types.QUICK_PREVIEW_ART:\n return {\n ...state,\n quickPreviewIsOpen: true,\n }\n case types.QUICK_PREVIEW_CLOSE:\n return {\n ...state,\n quickPreviewIsOpen: false,\n }\n case types.DRAG_VALIDITY_CHANGE:\n return {\n ...state,\n isCurrentDragValid: action.isValid,\n }\n case types.UPDATE_PREVIEW_SETTINGS:\n return {\n ...state,\n settings: {\n ...state.settings,\n ...action.settings,\n },\n }\n case types.SHOW_PLACEABLE_SURFACES:\n return {\n ...state,\n settings: {\n ...state.settings,\n showSurfaces: action.surfaces,\n },\n }\n case types.HIDE_PLACEABLE_SURFACES:\n return {\n ...state,\n settings: {\n ...state.settings,\n showSurfaces: [],\n },\n }\n case types.SET_MAGIC_WINDOW_LOADING:\n return {\n ...state,\n isMagicWindowLoading: action.isMagicWindowLoading,\n }\n case types.SET_INITIAL_LOADING:\n return {\n ...state,\n initialLoading: action.initialLoading,\n }\n case types.WALLDATA_READY:\n return {\n ...state,\n wallDataDimensions: {\n width: action.wallDataWidth,\n height: action.wallDataHeight,\n },\n }\n default:\n return state\n }\n}\n\nexport default preview\n","import { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\nimport * as ratingTypes from 'models/ratings/constants'\n\nconst initialState = {\n isFetching: false,\n ratingsByJobId: {},\n options: null,\n}\n\nconst processServerRating = (rating) => ({\n [rating.ratingTag]: {\n ...rating,\n },\n})\n\nconst ratingsByJobId = (state = initialState.ratingsByJobId, action) => {\n switch (action.type) {\n case types.RECEIVE_RATINGS: {\n const ratings = [...action.ratings]\n ratings.sort((a, b) => a.id - b.id)\n return {\n ...state,\n [action.jobId]: Object.assign({}, state[action.jobId], ...ratings.map(processServerRating)),\n }\n }\n case types.RECEIVE_RATING:\n if (!Object.keys(action.rating).length) {\n return state\n }\n return {\n ...state,\n [action.jobId]: {\n ...state[action.jobId],\n ...processServerRating(action.rating),\n },\n }\n case types.SUBMIT_RATING: {\n const rating = state[action.jobId] && state[action.jobId][action.tagId]\n if (\n (action.kind === ratingTypes.RATING && !action.value) ||\n (action.kind === ratingTypes.SEVERITY && !action.value) ||\n (action.kind === ratingTypes.NOTE && !action.note) ||\n (action.kind === ratingTypes.TAG && !action.value)\n ) {\n const newState = { ...state }\n delete newState[action.jobId][action.tagId]\n return newState\n }\n return {\n ...state,\n [action.jobId]: {\n ...state[action.jobId],\n [action.tagId]: {\n ...rating,\n value: action.value,\n note: action.note,\n job: action.jobId,\n ratingTag: action.tagId,\n },\n },\n }\n }\n default:\n return state\n }\n}\n\nconst options = (state = initialState.options, action) => {\n switch (action.type) {\n case types.RECEIVE_RATING_OPTIONS: {\n const ops = [...action.options]\n ops.sort((a, b) => a.position - b.position)\n return ops\n }\n default:\n return state\n }\n}\n\nconst isFetching = (state = initialState.isFetching, action) => {\n switch (action.type) {\n case types.REQUEST_RATINGS:\n case types.SUBMIT_RATING:\n return true\n case types.RECEIVE_RATINGS:\n case types.RECEIVE_RATING:\n return false\n default:\n return state\n }\n}\n\nexport default combineReducers({\n ratingsByJobId,\n isFetching,\n options,\n})\n","import * as types from 'models/actionTypes'\n\nconst initialState = {\n renderer: null,\n contextInfo: null,\n hasRendered: false,\n isLowPerformanceDevice: false, // set once a renderer is created and keeps its value after the renderer is destroyed.\n}\n\nconst renderer = (state = initialState, action) => {\n switch (action.type) {\n case types.NEW_RENDERER:\n return {\n ...state,\n renderer: true,\n contextInfo: null,\n hasRendered: false,\n }\n case types.DESTROY_RENDERER:\n return {\n ...state,\n renderer: null,\n contextInfo: null,\n hasRendered: false,\n }\n case types.RENDERER_READY: {\n const isLowPerformanceDevice = !!(action.contextInfo && action.contextInfo.software)\n return {\n ...state,\n contextInfo: action.contextInfo,\n isLowPerformanceDevice,\n }\n }\n case types.FIRST_RENDER:\n return {\n ...state,\n hasRendered: true,\n }\n case types.INITIALIZATION_FAILURE:\n return {\n ...state,\n isLowPerformanceDevice: !!action.info.webglfailure,\n }\n default:\n return state\n }\n}\n\nexport default renderer\n","export const UNKNOWN_ROOMTYPE = 'UNKNOWN'\nexport const OTHER_ROOMTYPE = 'OTHER'\n\nexport const UNSUPPORTED_ROOMTYPES = [UNKNOWN_ROOMTYPE, OTHER_ROOMTYPE]\n","// TODO: double check that scene.width/height should be the rgb w/h\n\nimport { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\nimport { STATE_NOMINAL, STATE_FETCHING, STATE_ERROR } from 'constants/stateTypes'\nimport { getManifestStackables } from 'utils/stackables'\nimport { manifestHasImageURL } from 'Renderer/manifestImageLoader'\nimport { UNSUPPORTED_ROOMTYPES } from 'models/scenes/constants'\n\n// byId: a map between ids and item properties\nconst initialState = {\n fetchState: STATE_NOMINAL,\n selectedSceneId: null,\n byId: {},\n}\n\nexport const fetchState = (state = initialState.fetchState, action) => {\n switch (action.type) {\n case types.REQUEST_SCENES:\n case types.REQUEST_SCENE:\n return STATE_FETCHING\n case types.RECEIVE_SCENES:\n case types.RECEIVE_SCENE:\n case types.RECEIVE_COMPILED_COMPOSITION:\n return STATE_NOMINAL\n case types.FAILED_RECEIVE_SCENES:\n case types.FAILED_RECEIVE_SCENE:\n return STATE_ERROR\n default:\n return state\n }\n}\n\nconst processServerScene = (sceneItem) => {\n const hasFloor = !!(\n sceneItem.manifest.plane_orientation_0 &&\n sceneItem.manifest.plane_orientation_0.planeData &&\n sceneItem.manifest.plane_orientation_0.planeData.length &&\n sceneItem.manifest.plane_orientation_0.planeData.some((p) => p.class === 'floor')\n )\n // If there is a floor we must have at least 2 planes to have a wall\n const hasWall = !!(\n sceneItem.manifest.plane_orientation_0 &&\n sceneItem.manifest.plane_orientation_0.planeData &&\n sceneItem.manifest.plane_orientation_0.planeData.length > (hasFloor ? 1 : 0)\n )\n const supportsShadows = hasFloor\n const supportsForegroundOcclusion = !!sceneItem.manifest.foreground_0\n\n const supportsDepthOcclusion = manifestHasImageURL(sceneItem.manifest, 'depth_occlusion_0')\n\n const supportsOcclusion = supportsForegroundOcclusion || supportsDepthOcclusion\n const thumbUrl = sceneItem.manifest.thumbnail || (sceneItem.thumbnails && sceneItem.thumbnails.url) || null\n const hasWallPaint = !!(\n sceneItem.manifest.residual_0 ||\n sceneItem.manifest.residual_0_webp ||\n sceneItem.manifest.shading_0 ||\n sceneItem.manifest.shading_0_webp\n )\n\n let roomType = null\n if (sceneItem.roomType && !UNSUPPORTED_ROOMTYPES.includes(sceneItem.roomType)) {\n roomType = sceneItem.roomType\n }\n\n return {\n [sceneItem.sceneId]: {\n sceneId: sceneItem.sceneId,\n jobId: sceneItem.jobId,\n name: sceneItem.name || '',\n depthUrl: sceneItem.depthUrl,\n creationDate: sceneItem.creation,\n defaultX: 400,\n defaultY: 150,\n wid: sceneItem.wid,\n thumbUrl,\n manifest: sceneItem.manifest,\n stackables: getManifestStackables(sceneItem.manifest),\n hasFloor,\n hasWall,\n supportsShadows,\n supportsOcclusion,\n supportsForegroundOcclusion,\n supportsDepthOcclusion,\n isStock: sceneItem.isStock,\n hasWallPaint,\n roomType,\n },\n }\n}\n\nexport const byId = (state = initialState.byId, action) => {\n switch (action.type) {\n case types.RECEIVE_SCENES:\n return Object.assign({}, state, ...action.scenes.map(processServerScene))\n case types.RECEIVE_SCENE:\n case types.RECEIVE_COMPILED_COMPOSITION:\n return {\n ...state,\n ...processServerScene(action.scene),\n }\n case types.UPDATE_SCENE_MANIFEST:\n return {\n ...state,\n [action.id]: {\n ...state[action.id],\n manifest: {\n ...state[action.id].manifest,\n [action.key]: action.value,\n },\n },\n }\n default:\n return state\n }\n}\n\nexport const selectedSceneId = (state = initialState.selectedSceneId, action) => {\n let firstDemoSceneId\n switch (action.type) {\n case types.SELECT_SCENE:\n return action.id\n case types.RECEIVE_SCENES:\n // TODO Move to middleware\n if (action.scenes.length > 0) {\n for (let i = 0; i < action.scenes.length; i += 1) {\n if (action.scenes[i].sceneId === state) {\n return state\n }\n if (!firstDemoSceneId && action.scenes[i].wid === 10016) {\n firstDemoSceneId = action.scenes[i].sceneId\n }\n }\n if (firstDemoSceneId) {\n return firstDemoSceneId\n }\n return action.scenes[0].sceneId\n }\n return state\n default:\n return state\n }\n}\n\nexport default combineReducers({\n fetchState,\n byId,\n selectedSceneId,\n})\n","import * as types from 'models/actionTypes'\n\nconst initialState = {\n hasOutage: false,\n}\n\nconst support = (state = initialState, action) => {\n switch (action.type) {\n case types.RECEIVE_STATUS:\n return {\n ...state,\n hasOutage: action.status.outage,\n }\n default:\n return state\n }\n}\n\nexport default support\n","import * as types from 'models/actionTypes'\n\nconst initialState = []\n\nconst toasts = (state = initialState, action) => {\n switch (action.type) {\n case types.SHOW_TOAST:\n return [\n ...state,\n {\n toastType: action.toastType,\n props: action.props,\n },\n ]\n case types.HIDE_TOAST: {\n const nextState = [...state]\n nextState.splice(action.index, 1)\n return nextState\n }\n default:\n return state\n }\n}\n\nexport default toasts\n","import { combineReducers } from 'redux'\nimport * as types from 'models/actionTypes'\n\nexport const initialState = {\n delayedScreenshot: {\n currentTimeoutId: null,\n firstScreenshotTime: 0,\n firstFurnitureScreenshotDone: false,\n },\n furnitureFilter: {\n filterSource: null,\n categoryLabel: null,\n subCategoryLabel: null,\n },\n}\n\nexport const furnitureFilter = (state = initialState.furnitureFilter, action) => {\n switch (action.type) {\n case types.FURNITURE_FILTER_UPDATE: {\n const { trackingInfo } = action\n\n return trackingInfo || state\n }\n\n default:\n return state\n }\n}\n\nconst delayedScreenshot = (state = initialState.delayedScreenshot, action) => {\n switch (action.type) {\n case types.DELAYED_SCREENSHOT_SCHEDULED:\n return {\n ...state,\n currentTimeoutId: action.timeoutId,\n }\n case types.DELAYED_SCREENSHOT_SENT:\n return {\n ...state,\n currentTimeoutId: null,\n }\n case types.SET_INITIAL_LOADING:\n if (action.initialLoading) {\n return initialState.delayedScreenshot\n }\n return {\n ...state,\n firstScreenshotTime: window.performance.now(),\n }\n case types.FIRST_RENDER_ITEM_SCREENSHOT_DONE: {\n return {\n ...state,\n firstFurnitureScreenshotDone: true,\n }\n }\n default:\n return state\n }\n}\n\nexport default combineReducers({\n delayedScreenshot,\n furnitureFilter,\n})\n","import * as types from 'models/actionTypes'\nimport {\n DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE,\n DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS,\n ORIENTATION_LANDSCAPE,\n} from 'models/ui/constants'\n\nconst initialState = {\n compositionsOpen: false,\n scenesOpen: false,\n artOpen: true,\n designSidepanelOpen: false,\n designSidepanelMode: DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE,\n shouldPresentItemSelection: false,\n artTrayFilter: null,\n shouldShowWelcomePopup: false,\n sceneSelectionTabShowStock: false,\n sharePanelOpen: false,\n filterModalOpen: false,\n showSwapMenu: false,\n showMissingWallsModal: false,\n showLoginPromptModal: false,\n orientation: ORIENTATION_LANDSCAPE,\n showDesignSummary: false,\n}\n\nconst ui = (state = initialState, action) => {\n switch (action.type) {\n case types.COMPOSITIONS_TOGGLE:\n return {\n ...state,\n compositionsOpen: !state.compositionsOpen,\n }\n case types.SCENES_TOGGLE:\n return {\n ...state,\n scenesOpen: !state.scenesOpen,\n }\n case types.SCENES_OPEN:\n return {\n ...state,\n scenesOpen: true,\n }\n case types.ART_TOGGLE:\n return {\n ...state,\n artOpen: !state.artOpen,\n }\n case types.OPEN_DESIGN_SIDEPANEL: {\n const newState = {\n ...state,\n designSidepanelOpen: true,\n }\n if (action.renderItemId) {\n newState.designSidepanelMode = DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS\n }\n return newState\n }\n case types.CLOSE_DESIGN_SIDEPANEL:\n return {\n ...state,\n designSidepanelOpen: false,\n }\n case types.SET_DESIGN_SIDEPANEL_MODE:\n return {\n ...state,\n designSidepanelMode: action.mode,\n }\n case types.SET_ADMIN:\n if (!action.shouldBeAdmin) {\n return {\n ...state,\n designSidepanelMode: DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE,\n }\n }\n return {\n ...state,\n }\n case types.PRESENT_ITEM_SELECTION:\n return {\n ...state,\n shouldPresentItemSelection: action.shouldPresent,\n }\n case types.ART_TRAY_FILTER:\n return {\n ...state,\n artTrayFilter: action.filter,\n }\n case types.ITEM_SELECTION_DISPLAY:\n return {\n ...state,\n itemSelectionDisplay: action.display,\n }\n case types.RECEIVE_USER:\n return {\n ...state,\n shouldShowWelcomePopup: action.userData.isFirstTime || false,\n }\n case types.CLOSE_WELCOME_POPUP:\n return {\n ...state,\n shouldShowWelcomePopup: false,\n }\n case types.SELECT_SCENE_SELECTION_TAB:\n return {\n ...state,\n sceneSelectionTabShowStock: action.shouldShowStock,\n }\n case types.SHARE_PANEL_OPEN_TOGGLE:\n return {\n ...state,\n sharePanelOpen: !state.sharePanelOpen,\n }\n case types.SET_FILTER_MODAL_OPEN:\n return {\n ...state,\n filterModalOpen: action.isOpen,\n }\n case types.SHOW_SWAP_MENU:\n return {\n ...state,\n showSwapMenu: action.showSwapMenu,\n }\n case types.SHOW_MISSING_WALLS_MODAL:\n return {\n ...state,\n showMissingWallsModal: action.showMissingWallsModal,\n }\n case types.SET_MOBILE_ORIENTATION:\n return {\n ...state,\n orientation: action.orientation,\n }\n case types.LOGIN_NEEDED:\n return {\n ...state,\n showLoginPromptModal: true,\n }\n case types.SHOW_LOGIN_PROMPT_MODAL:\n return {\n ...state,\n showLoginPromptModal: action.showLoginPromptModal,\n }\n\n case types.SHOW_DESIGN_SUMMARY:\n return {\n ...state,\n showDesignSummary: action.showDesignSummary,\n }\n default:\n return state\n }\n}\n\nexport default ui\n","import * as types from 'models/actionTypes'\nimport { STATE_NOMINAL, STATE_FETCHING } from 'constants/stateTypes'\n\nexport const initialState = {\n isLoggedIn: false,\n wid: -1,\n metricsId: '',\n email: null,\n firstName: null,\n lastName: null,\n isAdmin: false,\n canBeAdmin: false,\n signupLoginStatus: null,\n isNewUser: false,\n redirectUrl: null,\n loginType: [],\n subCatalogs: null,\n canChangePassword: false,\n passwordResetStatus: STATE_NOMINAL,\n changePasswordStatus: STATE_NOMINAL,\n triggerPasswordResetStatus: STATE_NOMINAL,\n earlyAccessSubscribeStatus: STATE_NOMINAL,\n hasSeenMagicEraserTutorial: false,\n appDownloadSmsStatus: STATE_NOMINAL,\n}\n\nconst user = (state = initialState, action) => {\n switch (action.type) {\n case types.RECEIVE_USER:\n return {\n ...state,\n isAdmin: action.userData.isStaff,\n canBeAdmin: action.userData.isStaff,\n isLoggedIn: action.userData.isLoggedIn,\n wid: action.userData.wid || initialState.wid,\n metricsId: action.userData.metricsId || initialState.metricsId,\n email: action.userData.email || initialState.email,\n firstName: action.userData.firstName || initialState.firstName,\n lastName: action.userData.lastName || initialState.lastName,\n isNewUser: action.userData.isFirstTime || initialState.isNewUser,\n loginType: action.userData.loginType || initialState.loginType,\n subCatalogs: action.userData.subCatalogs || initialState.subCatalogs,\n canChangePassword: action.userData.loginType.includes('Email'),\n }\n case types.SET_ADMIN:\n return {\n ...state,\n isAdmin: action.shouldBeAdmin,\n }\n case types.FAILED_RECEIVE_USER:\n return {\n ...state,\n isLoggedIn: false,\n error: action.error,\n }\n case types.RECEIVE_USER_LOGIN:\n case types.RECEIVE_USER_SIGNUP:\n return {\n ...state,\n signupLoginStatus: action.response.status,\n }\n case types.LOGIN_NEEDED:\n return {\n ...state,\n redirectUrl: action.redirectUrl,\n }\n case types.TRIGGER_PASSWORD_RESET:\n return {\n ...state,\n triggerPasswordResetStatus: STATE_FETCHING,\n }\n case types.RESET_PASSWORD:\n return {\n ...state,\n passwordResetStatus: STATE_FETCHING,\n }\n case types.RECEIVE_TRIGGER_PASSWORD_RESET:\n return {\n ...state,\n triggerPasswordResetStatus: action.status,\n }\n case types.RECEIVE_RESET_PASSWORD:\n return {\n ...state,\n passwordResetStatus: action.status,\n }\n case types.REQUEST_EARLY_ACCESS:\n return {\n ...state,\n earlyAccessSubscribeStatus: STATE_FETCHING,\n }\n case types.RECEIVE_EARLY_ACCESS:\n return {\n ...state,\n earlyAccessSubscribeStatus: action.status,\n }\n case types.REQUEST_CHANGE_PASSWORD:\n return {\n ...state,\n changePasswordStatus: STATE_FETCHING,\n }\n case types.RECEIVE_CHANGE_PASSWORD:\n return {\n ...state,\n changePasswordStatus: action.status,\n }\n case types.RESET_CHANGE_PASSWORD_STATUS:\n return {\n ...state,\n changePasswordStatus: STATE_NOMINAL,\n }\n case types.MAGIC_ERASER_TUTORIAL_SEEN:\n return {\n ...state,\n hasSeenMagicEraserTutorial: true,\n }\n case types.RECEIVE_APP_DOWNLOAD_SMS:\n return {\n ...state,\n appDownloadSmsStatus: action.status,\n }\n case types.REQUEST_APP_DOWNLOAD_SMS:\n return {\n ...state,\n appDownloadSmsStatus: STATE_FETCHING,\n }\n case types.RESET_APP_DOWNLOAD_SMS_STATUS:\n return {\n ...state,\n appDownloadSmsStatus: STATE_NOMINAL,\n }\n default:\n return state\n }\n}\n\nexport default user\n","import { takeEvery, call, put, select } from 'redux-saga/effects'\n\nimport { ADD_TO_BAG, ADD_ROOM_TO_BAG, OPEN_BAG } from 'models/actionTypes'\n\nimport { getShoppingCartUrl, getAddToCartUrl } from 'utils/buildUrls'\nimport * as cartApi from 'services/spiderpigs'\nimport { getRegion, getLanguageCodeFromRegion } from 'models/location/selectors'\n\nimport { ADDED_TO_BAG_TOAST } from 'toasts/toastTypes'\nimport { showToast } from 'models/toasts/actions'\n\nexport function* addToBag(action) {\n const hasToken = yield call(cartApi.hasToken)\n\n try {\n if (hasToken) {\n const region = yield select(getRegion)\n const lang = yield select(getLanguageCodeFromRegion, region)\n yield call(cartApi.addToCart, lang, [[action.localItemNumber, 1]])\n yield put(showToast(ADDED_TO_BAG_TOAST, { name: action.name }))\n } else {\n const cartUrl = getAddToCartUrl([action.localItemNumber], action.region)\n window.open(cartUrl, '_blank')\n }\n } catch (error) {\n yield put(showToast(ADDED_TO_BAG_TOAST, { name: action.name, failed: true }))\n }\n}\n\nexport function* addRoomToBag(action) {\n const hasToken = yield call(cartApi.hasToken)\n\n try {\n if (hasToken) {\n const region = yield select(getRegion)\n const lang = yield select(getLanguageCodeFromRegion, region)\n const items = action.localItemNumbers.reduce((acc, num) => {\n if (acc[num]) {\n acc[num] += 1\n } else {\n acc[num] = 1\n }\n return acc\n }, {})\n yield call(cartApi.addToCart, lang, Object.entries(items))\n yield put(showToast(ADDED_TO_BAG_TOAST, { count: action.localItemNumbers.length }))\n // In the case of the Design summary modal for the mobile web, we do not want to redirect\n // to the cart url. Instead we want to show and exit popup that has a checkout button.\n // In this case, we pass the blockRedirect parameter as true. It is false by default.\n } else if (!action.blockRedirect) {\n const cartUrl = getAddToCartUrl(action.localItemNumbers, action.region)\n window.open(cartUrl, '_blank')\n }\n } catch (error) {\n yield put(showToast(ADDED_TO_BAG_TOAST, { count: action.localItemNumbers.length, failed: true }))\n }\n}\n\nexport function* openBag() {\n const region = yield select(getRegion)\n const shoppingCartUrl = getShoppingCartUrl(region)\n window.open(shoppingCartUrl, '_blank')\n}\n\nfunction* watchAddToBag() {\n yield takeEvery(ADD_TO_BAG, addToBag)\n}\n\nfunction* watchAddRoomToBag() {\n yield takeEvery(ADD_ROOM_TO_BAG, addRoomToBag)\n}\n\nfunction* watchOpenBag() {\n yield takeEvery(OPEN_BAG, openBag)\n}\n\nexport const bagSagas = [watchAddToBag(), watchAddRoomToBag(), watchOpenBag()]\n","import { takeEvery, takeLatest, call, put, select, take, delay } from 'redux-saga/effects'\nimport { getCompositions, getCompiledComposition } from 'services/compositions'\n\nimport {\n receiveCompositions,\n receiveCompiledComposition,\n failedReceiveCompositions,\n failedReceiveCompiledComposition,\n swapRenderItem,\n placeRenderItem,\n removeRenderItems,\n} from 'models/compositions/actions'\nimport { getSelectedCompositionId } from 'models/compositions/selectors'\nimport {\n REQUEST_COMPOSITIONS_SAGA,\n REQUEST_COMPILED_COMPOSITION_SAGA,\n RENDER_ITEM_LOADED,\n WALLART_ITEM_LOADED,\n START_TEST_SWAP_SAGA,\n RECEIVE_FURNITURE_SWAPPABLES,\n START_TEST_LOAD_SAGA,\n RECEIVE_FURNITURE,\n SWAP_RENDER_ITEM,\n} from 'models/actionTypes'\nimport { getRegion } from 'models/location/selectors'\nimport { swapTestSagaFinished, loadTestSagaFinished } from 'models/admin/actions'\nimport { requestFurniture, requestFurnitureSwappables } from 'models/furniture/actions'\nimport { FURNITURE_ITEM } from 'constants/renderItemTypes'\nimport { PRODUCT_SWAP } from 'models/tracking/constants'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\nimport Renderer from 'Renderer'\n\nexport function* requestCompositionsSaga() {\n try {\n const region = yield select(getRegion)\n const { data: compositions } = yield call(getCompositions, region)\n yield put(receiveCompositions(compositions))\n } catch (error) {\n yield put(failedReceiveCompositions())\n }\n}\n\nexport function* requestCompiledCompositionSaga({ id }) {\n try {\n const {\n data: { composition, scene, furnitures: furniture },\n } = yield call(getCompiledComposition, id)\n yield put(receiveCompiledComposition(composition, scene, furniture))\n } catch (error) {\n yield put(failedReceiveCompiledComposition())\n }\n}\n\nexport function* testSwapsSaga({ targetRenderItemId, selectedProduct, swapItemsData }) {\n let furnitures = swapItemsData\n if (!furnitures || furnitures.length === 0) {\n try {\n yield put(requestFurnitureSwappables(selectedProduct.id))\n const action = yield take(RECEIVE_FURNITURE_SWAPPABLES)\n furnitures = action.furniture\n if (!furnitures || furnitures.length === 0) {\n return\n }\n } catch (error) {\n return\n }\n }\n let heapSizeLimit = 0\n let totalHeapSize = 0\n let usedHeapSize = 0\n if (performance.memory) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = performance.memory\n\n heapSizeLimit = jsHeapSizeLimit\n totalHeapSize = totalJSHeapSize\n usedHeapSize = usedJSHeapSize\n }\n let textureMemory = 0\n let bufferMemory = 0\n const renderer = Renderer.getInstance()\n if (renderer && renderer.glMemoryRecorder) {\n textureMemory = renderer.glMemoryRecorder.currentTextureMemory\n bufferMemory = renderer.glMemoryRecorder.currentBufferMemory\n }\n const count = 50\n let id = targetRenderItemId\n let targetProduct = selectedProduct\n for (let i = 0; i < count; i += 1) {\n const swapItemData = furnitures[i % furnitures.length]\n\n const swappedInProductTrackingInfo = getProductTrackingInfo(swapItemData)\n const swappedInTrackingInfo = {\n ...swappedInProductTrackingInfo,\n AddedFrom: PRODUCT_SWAP,\n }\n\n const removedProductTrackingInfo = getProductTrackingInfo(targetProduct)\n const removedTrackingInfo = {\n ...removedProductTrackingInfo,\n RemovedFrom: PRODUCT_SWAP,\n }\n\n const trackingInfo = {\n swappedInTrackingInfo,\n removedTrackingInfo,\n }\n\n yield put(swapRenderItem(id, targetProduct.id, trackingInfo))\n\n const swapAction = yield take(SWAP_RENDER_ITEM)\n const newItemId = swapAction.uniqueId\n\n const itemLoadedAction = yield take(\n (act) => (act.type === RENDER_ITEM_LOADED || act.type === WALLART_ITEM_LOADED) && act.id === newItemId,\n )\n\n // `yield take` will be called here synchronously from Renderer's render() function, causing\n // nested calls which will interfere with renderer's oneTimeRenderCallbacks, clearing them too early\n // yield here to allow rendering to finish properly.\n yield delay(100)\n\n id = itemLoadedAction.id\n targetProduct = swapItemData\n }\n\n const results = {}\n if (performance.memory) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = performance.memory\n results.jsHeapSizeLimitDelta = jsHeapSizeLimit - heapSizeLimit\n results.totalJSHeapSizeDelta = totalJSHeapSize - totalHeapSize\n results.usedJSHeapSizeDelta = usedJSHeapSize - usedHeapSize\n }\n if (renderer && renderer.glMemoryRecorder) {\n results.textureMemoryDelta = renderer.glMemoryRecorder.currentTextureMemory - textureMemory\n results.bufferMemoryDelta = renderer.glMemoryRecorder.currentBufferMemory - bufferMemory\n }\n yield put(swapTestSagaFinished(results))\n}\n\nexport function* testLoadsSaga() {\n // Clear composition\n const compositionId = yield select(getSelectedCompositionId)\n yield put(removeRenderItems(compositionId))\n\n // Get a list of all available furniture data currently in the store\n const getById = (state) => state.furniture.byId\n const furnitureById = yield select(getById)\n\n // Get the current preview dimensions\n const getDimensions = (state) => state.preview.wallDataDimensions\n const dimensions = yield select(getDimensions)\n const x = dimensions.width * 0.5\n const y = dimensions.height * 0.85\n\n // Load furniture data into the store\n try {\n let count = Object.keys(furnitureById).length\n while (count < 400) {\n yield put(requestFurniture())\n const action = yield take(RECEIVE_FURNITURE)\n if (!action || !action.furniture || !Object.keys(action.furniture).length) {\n return\n }\n count += action.furniture.length\n }\n } catch (error) {\n return\n }\n\n let heapSizeLimit = 0\n let totalHeapSize = 0\n let usedHeapSize = 0\n if (performance.memory) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = performance.memory\n\n heapSizeLimit = jsHeapSizeLimit\n totalHeapSize = totalJSHeapSize\n usedHeapSize = usedJSHeapSize\n }\n let textureMemory = 0\n let bufferMemory = 0\n const renderer = Renderer.getInstance()\n if (renderer && renderer.glMemoryRecorder) {\n textureMemory = renderer.glMemoryRecorder.currentTextureMemory\n bufferMemory = renderer.glMemoryRecorder.currentBufferMemory\n }\n\n let count = 50\n const furnitureIDs = Object.keys(furnitureById)\n const placedIDs = []\n while (count > 0) {\n const index = Math.floor(Math.random() * (furnitureIDs.length - 1))\n const furnitureItem = furnitureById[furnitureIDs[index]]\n const { id, stacks, renderType } = furnitureItem\n if (!stacks && renderType === FURNITURE_ITEM) {\n const settings = { id, heading: 0, renderType, stacks }\n const trackingInfo = getProductTrackingInfo(furnitureItem)\n\n yield put(placeRenderItem(compositionId, id, x, y, settings, trackingInfo))\n yield take(RENDER_ITEM_LOADED)\n placedIDs.push(id)\n count -= 1\n }\n }\n\n // Remove all render items\n // TODO: investigate: deleting items directly after last item is placed without this delay causes\n // a race condition that consumes the renderIsDirty causing the update to not propagate into rendered scene\n yield new Promise((resolve) => {\n setTimeout(resolve, 200)\n })\n yield put(removeRenderItems(compositionId))\n\n const results = {}\n if (performance.memory) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = performance.memory\n results.jsHeapSizeLimitDelta = jsHeapSizeLimit - heapSizeLimit\n results.totalJSHeapSizeDelta = totalJSHeapSize - totalHeapSize\n results.usedJSHeapSizeDelta = usedJSHeapSize - usedHeapSize\n }\n if (renderer && renderer.glMemoryRecorder) {\n results.textureMemoryDelta = renderer.glMemoryRecorder.currentTextureMemory - textureMemory\n results.bufferMemoryDelta = renderer.glMemoryRecorder.currentBufferMemory - bufferMemory\n }\n\n yield put(loadTestSagaFinished(results))\n}\n\nfunction* watchRequestCompositionsSaga() {\n yield takeEvery(REQUEST_COMPOSITIONS_SAGA, requestCompositionsSaga)\n}\n\nfunction* watchRequestCompiledCompositionSaga() {\n yield takeLatest(REQUEST_COMPILED_COMPOSITION_SAGA, requestCompiledCompositionSaga)\n}\n\nfunction* watchStartTestSwapSaga() {\n yield takeEvery(START_TEST_SWAP_SAGA, testSwapsSaga)\n}\n\nfunction* watchStartTestLoadSaga() {\n yield takeEvery(START_TEST_LOAD_SAGA, testLoadsSaga)\n}\n\nexport const compositionsSagas = [\n watchRequestCompositionsSaga(),\n watchRequestCompiledCompositionSaga(),\n watchStartTestSwapSaga(),\n watchStartTestLoadSaga(),\n]\n","import { takeEvery, call, put } from 'redux-saga/effects'\n\nimport * as favsApi from 'services/spiderpigs'\n\nimport { REQUEST_FAVORITES, TOGGLE_FAVORITE, TOGGLE_FAVORITES } from 'models/actionTypes'\nimport { receiveFavorites, failedReceiveFavorites } from 'models/favorites/actions'\nimport { requestFurnitureByLocalItemNos } from 'models/furniture/actions'\n\nexport function* requestFavorites() {\n try {\n const favorites = yield call(favsApi.getDefaultFavs)\n if (favorites && favorites.items) {\n yield put(receiveFavorites(favorites.items))\n if (favorites.items.length) {\n yield put(requestFurnitureByLocalItemNos(favorites.items))\n }\n } else {\n yield put(failedReceiveFavorites())\n }\n } catch (error) {\n yield put(failedReceiveFavorites())\n }\n}\n\nexport function* toggleFavorite({ isFavorite, localItemNumber }) {\n try {\n if (isFavorite) {\n yield call(favsApi.addToFavs([localItemNumber]))\n } else {\n yield call(favsApi.removeFromFavs([localItemNumber]))\n }\n } catch (error) {\n //\n }\n}\n\nexport function* toggleFavorites({ isFavorite, itemsToFavorite }) {\n try {\n if (isFavorite) {\n yield call(favsApi.addToFavs(itemsToFavorite))\n } else {\n yield call(favsApi.removeFromFavs(itemsToFavorite))\n }\n } catch (error) {\n //\n }\n}\n\nexport function* watchRequestFavorites() {\n yield takeEvery(REQUEST_FAVORITES, requestFavorites)\n}\n\nexport function* watchToggleFavorite() {\n yield takeEvery(TOGGLE_FAVORITE, toggleFavorite)\n}\n\nexport function* watchToggleFavorites() {\n yield takeEvery(TOGGLE_FAVORITES, toggleFavorites)\n}\n\nexport const favoritesSagas = [watchRequestFavorites(), watchToggleFavorite(), watchToggleFavorites()]\n","import fetch from 'services'\n\nimport { getCombinables } from './mockdata'\n\nconst PAGE_LIMIT = 50\n\nexport const getFurniture = ({ region, subCatalog, category, subCategory, roomType, stackEnabled }, page) =>\n fetch('/furniture/', {\n params: {\n region,\n sub_catalogs: subCatalog,\n category_id: category,\n sub_category_id: subCategory,\n room_type: roomType,\n stacks: stackEnabled ? undefined : false,\n limit: PAGE_LIMIT,\n offset: (page - 1) * PAGE_LIMIT,\n geometry_type: '3d,2d_wall',\n },\n })\n\nexport const getFurnitureBySearch = ({ query, region, stackEnabled }, moreToken) =>\n fetch('/furniture/search', {\n params: {\n q: query,\n region,\n needMore: 'True',\n moreToken,\n stacks: stackEnabled ? undefined : false,\n geometry_type: '3d,2d_wall',\n },\n })\n\nexport const getFurnitureByIds = (ids) =>\n fetch('/furniture/', {\n params: {\n id__in: ids.join(','),\n geometry_type: '3d,2d_wall',\n },\n })\n\nexport const getFurnitureByLocalItemNos = (localItemNos) =>\n fetch('/furniture/', {\n params: {\n local_item_number: localItemNos.join(','),\n },\n })\n\nexport const getFurnitureCategories = (region, stackEnabled) =>\n fetch('/furniture/categories', {\n params: {\n region,\n stack: stackEnabled ? undefined : false,\n geometry_type: '3d,2d_wall',\n },\n })\n\nexport const getFurnitureSwappables = (id) =>\n fetch(`/furniture/${id}/swappables/`, {\n params: {\n geometry_type: '3d,2d_wall',\n },\n })\n\nexport const getFurnitureCombinables = (slotCategory, size, variant) => {\n // fetch(`/furniture/${id}/combinables`, {\n // params: {\n // slotCategory,\n // size,\n // },\n // })\n const data = getCombinables(slotCategory, size, variant)\n return {\n data,\n }\n}\n","import { takeEvery, call, put } from 'redux-saga/effects'\nimport {\n REQUEST_FURNITURE_SAGA,\n REQUEST_FURNITURE_BY_IDS_SAGA,\n REQUEST_FURNITURE_BY_LOCALITEMNOS_SAGA,\n REQUEST_FURNITURE_CATEGORIES_SAGA,\n REQUEST_FURNITURE_SWAPPABLES_SAGA,\n REQUEST_FURNITURE_COMBINABLES_SAGA,\n} from 'models/actionTypes'\nimport {\n getFurniture,\n getFurnitureBySearch,\n getFurnitureByIds,\n getFurnitureByLocalItemNos,\n getFurnitureCategories,\n getFurnitureSwappables,\n getFurnitureCombinables,\n} from 'services/furniture'\nimport { LOCALE_US_EN } from 'models/location/constants'\nimport {\n receiveFurniture,\n failedReceiveFurniture,\n receiveFurnitureByIds,\n failedReceiveFurnitureByIds,\n receiveFurnitureByLocalItemNos,\n failedReceiveFurnitureByLocalItemNos,\n receiveFurnitureCategories,\n failedReceiveFurnitureCategories,\n receiveFurnitureSwappables,\n failedReceiveFurnitureSwappables,\n selectFurniture,\n receiveFurnitureCombinables,\n failedReceiveFurnitureCombinables,\n} from './actions'\n\nexport function* requestFurnitureSaga({ filter, requestedPage, moreToken, debugModelUrl, debugFurnitureId }) {\n try {\n let furniture\n let count\n let hasNext\n let nextMoreToken\n\n if (filter.query) {\n const { data } = yield call(getFurnitureBySearch, filter, moreToken)\n furniture = data.results\n count = data.results.length\n hasNext = !!data.moreToken\n nextMoreToken = data.moreToken\n } else {\n const { data } = yield call(getFurniture, filter, requestedPage)\n furniture = data.results\n count = data.count\n hasNext = !!data.next\n }\n\n if (debugModelUrl) {\n const urlModel = {\n id: 1,\n localItemNumber: '1',\n name: 'Debug URL Model',\n region: LOCALE_US_EN,\n thumbUrl: `${ASSET_BUCKET}/logo_sugarcube_bug_ikea.svg`,\n modelUrl: debugModelUrl,\n rotX: 1.5707963267949,\n scale: 1,\n maxX: 0.361636996269226,\n maxY: 0.8396155834198,\n maxZ: 0.353101998567581,\n minX: -0.361636996269226,\n minY: 0,\n minZ: -0.353101998567581,\n stacks: false,\n isDebug: true,\n collections: ['Debug'],\n rootCategories: ['Debug'],\n categories: ['Debug'],\n subCategories: [],\n description: 'This model is loaded from a URL param',\n imageUrls: [`${ASSET_BUCKET}/logo_sugarcube_bug_ikea.svg`],\n availableInRegion: true,\n geometryType: '3d',\n price: '$4.19',\n }\n furniture.push(urlModel)\n }\n\n yield put(receiveFurniture(furniture, filter, count, hasNext, nextMoreToken))\n\n const selectDebugFurnitureId = debugModelUrl ? 1 : debugFurnitureId\n if (selectDebugFurnitureId) {\n yield call(selectFurniture(parseInt(selectDebugFurnitureId, 10)))\n }\n } catch (error) {\n yield put(failedReceiveFurniture())\n }\n}\n\nexport function* requestFurnitureByIdsSaga({ ids }) {\n try {\n const { data: furniture } = yield call(getFurnitureByIds, ids)\n yield put(receiveFurnitureByIds(furniture))\n } catch (error) {\n yield put(failedReceiveFurnitureByIds())\n }\n}\n\nexport function* requestFurnitureByLocalItemNosSaga({ localItemNos }) {\n try {\n const { data: furniture } = yield call(getFurnitureByLocalItemNos, localItemNos)\n yield put(receiveFurnitureByLocalItemNos(furniture))\n } catch (error) {\n yield put(failedReceiveFurnitureByLocalItemNos())\n }\n}\n\nexport function* requestFurnitureCategoriesSaga({ region, stackEnabled }) {\n try {\n const { data: categories } = yield call(getFurnitureCategories, region, stackEnabled)\n yield put(receiveFurnitureCategories(categories))\n } catch (error) {\n yield put(failedReceiveFurnitureCategories())\n }\n}\n\nexport function* requestFurnitureSwappablesSaga({ id }) {\n try {\n const { data: furniture } = yield call(getFurnitureSwappables, id)\n yield put(receiveFurnitureSwappables(furniture, id))\n } catch (error) {\n yield put(failedReceiveFurnitureSwappables())\n }\n}\n\nexport function* requestFurnitureCombinablesSaga({ id, uniqueId, slotCategory, size, variant, nodeIndex }) {\n try {\n const { data: furniture } = yield call(getFurnitureCombinables, slotCategory, size, variant)\n yield put(receiveFurnitureCombinables(furniture, id, uniqueId, nodeIndex))\n } catch (error) {\n yield put(failedReceiveFurnitureCombinables())\n }\n}\n\nfunction* watchRequestFurnitureSaga() {\n yield takeEvery(REQUEST_FURNITURE_SAGA, requestFurnitureSaga)\n}\n\nfunction* watchRequestFurnitureByIdsSaga() {\n yield takeEvery(REQUEST_FURNITURE_BY_IDS_SAGA, requestFurnitureByIdsSaga)\n}\n\nfunction* watchRequestFurnitureByLocalItemNosSaga() {\n yield takeEvery(REQUEST_FURNITURE_BY_LOCALITEMNOS_SAGA, requestFurnitureByLocalItemNosSaga)\n}\n\nfunction* watchRequestFurnitureCategoriesSaga() {\n yield takeEvery(REQUEST_FURNITURE_CATEGORIES_SAGA, requestFurnitureCategoriesSaga)\n}\n\nfunction* watchRequestFurnitureSwappablesSaga() {\n yield takeEvery(REQUEST_FURNITURE_SWAPPABLES_SAGA, requestFurnitureSwappablesSaga)\n}\n\nfunction* watchRequestFurnitureCombinablesSaga() {\n yield takeEvery(REQUEST_FURNITURE_COMBINABLES_SAGA, requestFurnitureCombinablesSaga)\n}\n\nexport const furnitureSagas = [\n watchRequestFurnitureSaga(),\n watchRequestFurnitureByIdsSaga(),\n watchRequestFurnitureByLocalItemNosSaga(),\n watchRequestFurnitureCategoriesSaga(),\n watchRequestFurnitureSwappablesSaga(),\n watchRequestFurnitureCombinablesSaga(),\n]\n","import { takeEvery, call, put } from 'redux-saga/effects'\nimport { getStatus } from 'services/support'\nimport { receiveStatus, failedReceiveStatus } from 'models/support/actions'\nimport { REQUEST_STATUS } from 'models/actionTypes'\n\nexport function* requestStatusSaga() {\n try {\n const { data } = yield call(getStatus)\n yield put(receiveStatus(data))\n } catch (error) {\n yield put(failedReceiveStatus())\n }\n}\n\nexport function* watchRequestStatus() {\n yield takeEvery(REQUEST_STATUS, requestStatusSaga)\n}\n\nexport const supportSagas = [watchRequestStatus()]\n","import { takeEvery, select } from 'redux-saga/effects'\nimport { RECEIVE_FURNITURE } from 'models/actionTypes'\nimport { getFilterResult } from 'models/furniture/selectors'\nimport { getFurnitureFilterTrackingInfo } from 'models/tracking/selectors'\nimport { getSelectedCompositionTrackingRoomInfo } from 'models/compositions/selectors'\nimport * as tracker from 'utils/tracker'\nimport { CATEGORY, SUB_CATEGORY } from 'models/tracking/constants'\n\nexport function* trackSearchBrowseSaga({ filter }) {\n const filterResult = yield select(getFilterResult)\n const { categoryLabel, subCategoryLabel, filterSource } = yield select(getFurnitureFilterTrackingInfo)\n const roomInfo = yield select(getSelectedCompositionTrackingRoomInfo)\n if (filter) {\n let eventName\n let trackingInfo = null\n if (filter.query) {\n eventName = 'DecorateRoom.Catalog.Search'\n trackingInfo = {\n SearchTerm: filter.query,\n SearchResultCount: filterResult.count,\n }\n } else if (filter.category) {\n eventName = 'DecorateRoom.Catalog.Browse.Select'\n trackingInfo = {\n BrowseCategoryKey: filter.category,\n BrowseCategoryLabel: categoryLabel,\n BrowseSubCategoryKey: filter.subCategory || null,\n BrowseSubCategoryLabel: subCategoryLabel || null,\n BrowseSelected: filter.subCategory ? SUB_CATEGORY : CATEGORY,\n SelectType: filterSource,\n }\n }\n if (trackingInfo) {\n tracker.click(eventName, { ...roomInfo, ...trackingInfo })\n }\n }\n}\n\nfunction* watchTrackSearchBrowseSaga() {\n yield takeEvery(RECEIVE_FURNITURE, trackSearchBrowseSaga)\n}\n\nexport const trackingSagas = [watchTrackSearchBrowseSaga()]\n","import { all } from 'redux-saga/effects'\nimport { bagSagas } from 'models/bag/sagas'\nimport { compositionsSagas } from 'models/compositions/sagas'\nimport { favoritesSagas } from 'models/favorites/sagas'\nimport { furnitureSagas } from 'models/furniture/sagas'\nimport { supportSagas } from 'models/support/sagas'\nimport { trackingSagas } from 'models/tracking/sagas'\n\nfunction* rootSaga() {\n yield all([...furnitureSagas, ...trackingSagas, ...compositionsSagas, ...bagSagas, ...favoritesSagas, ...supportSagas])\n}\n\nexport default rootSaga\n","import { createStore, applyMiddleware, compose } from 'redux'\nimport thunkMiddleware from 'redux-thunk'\nimport { createLogger } from 'redux-logger'\n\nimport { routerMiddleware } from 'connected-react-router'\nimport { createBrowserHistory } from 'history'\n\nimport compositionsMiddleware from 'models/compositions/middleware'\nimport locationMiddleware from 'models/location/middleware'\nimport ratingsMiddleware from 'models/ratings/middleware'\nimport trackingMiddleware from 'models/tracking/middleware'\nimport userMiddleware from 'models/user/middleware'\nimport furnitureMiddleware from 'models/furniture/middleware'\nimport iFrameMiddleWare from 'models/iFrame/middleware'\nimport previewMiddleWare from 'models/preview/middleware'\nimport localStorageMiddleware from 'models/localStorage/middleware'\n\nimport { getRoutingBasename } from 'models/location/selectors'\n\nimport createRootReducer from 'models/reducers'\nimport createSagaMiddleware from 'redux-saga'\nimport rootSaga from 'models/sagas'\n\nimport type { RootState } from 'store'\n\nconst sagaMiddleware = createSagaMiddleware()\nconst loggerMiddleware = createLogger()\n\n/* eslint-disable-next-line no-underscore-dangle */\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose\nexport const history = createBrowserHistory({ basename: getRoutingBasename() })\nexport const rootReducer = createRootReducer(history)\n\nexport default function configureStore(initialState?: RootState) {\n const store = createStore(\n rootReducer,\n initialState,\n composeEnhancers(\n applyMiddleware(\n thunkMiddleware,\n previewMiddleWare,\n iFrameMiddleWare,\n localStorageMiddleware,\n furnitureMiddleware,\n compositionsMiddleware,\n userMiddleware,\n ratingsMiddleware,\n locationMiddleware,\n trackingMiddleware,\n sagaMiddleware,\n loggerMiddleware,\n routerMiddleware(history),\n ),\n ),\n )\n sagaMiddleware.run(rootSaga)\n return store\n}\n","import { combineReducers } from 'redux'\nimport { connectRouter } from 'connected-react-router'\nimport type { History } from 'history'\n\nimport admin from 'models/admin/reducers'\nimport bag from 'models/bag/reducers'\nimport compositions from 'models/compositions/reducers'\nimport favorites from 'models/favorites/reducers'\nimport furniture from 'models/furniture/reducers'\nimport kiosk from 'models/kiosk/reducers'\nimport preview from 'models/preview/reducers'\nimport ratings from 'models/ratings/reducers'\nimport renderer from 'models/renderer/reducers'\nimport scenes from 'models/scenes/reducers'\nimport support from 'models/support/reducers'\nimport toasts from 'models/toasts/reducers'\nimport tracking from 'models/tracking/reducers'\nimport ui from 'models/ui/reducers'\nimport user from 'models/user/reducers'\n\nexport default (history: History) =>\n combineReducers({\n admin,\n bag,\n compositions,\n favorites,\n furniture,\n kiosk,\n preview,\n ratings,\n renderer,\n router: connectRouter(history),\n scenes,\n support,\n toasts,\n tracking,\n ui,\n user,\n })\n","export const ART_ITEM = 'ART_ITEM'\nexport const FURNITURE_ITEM = 'FURNITURE_ITEM'\n\nexport const GEOMETRY_TYPE_MAP = {\n '2d_wall': ART_ITEM,\n '3d': FURNITURE_ITEM,\n}\n\nexport type RenderType = ('ART_ITEM' | 'FURNITURE_ITEM')\n","export const STATE_NOMINAL = 'STATE_NOMINAL'\nexport const STATE_FETCHING = 'STATE_FETCHING'\nexport const STATE_ERROR = 'STATE_ERROR'\nexport const STATE_DONE = 'STATE_DONE'\n\nexport const QA_STATUS_PENDING = 'PENDING'\nexport const QA_STATUS_GOOD = 'GOOD'\nexport const QA_STATUS_BAD = 'BAD'\n\nexport type QAStatus = ('PENDING' | 'GOOD' | 'BAD')\n","import React, { useEffect, useRef } from 'react'\nimport classNames from 'classnames'\nimport SSRIcon from '@ingka/ssr-icon'\nimport arrowLeft from '@ingka/ssr-icon/paths/arrow-left'\nimport cross from '@ingka/ssr-icon/paths/cross'\nimport { useTranslation } from 'react-i18next'\nimport { func, bool, string, arrayOf } from 'prop-types'\nimport Icon from 'components/uiElements/Icon'\nimport generateThumbnailFromPreview from 'utils/generateThumbnailFromPreview'\n\nimport { compositionType, productsDataType } from 'models/propTypes'\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\nimport { TRACK_LOCATION_DESIGN_SUMMARY } from 'models/tracking/constants'\nimport { ROTATE_PHONE } from 'toasts/toastTypes.js'\nimport Button from '@ingka/button'\nimport { ORIENTATION_LANDSCAPE } from 'models/ui/constants'\nimport ProductItemContainer from 'containers/designSidepanel/ProductItemContainer'\n\nrequire('./DesignSummaryModalMobile.scss')\n\nconst DesignSummaryModalMobile = ({\n closeModal,\n addRoomToBag,\n hasAddedToBag,\n composition,\n totalPrice,\n localItemNumbers,\n showToast,\n hideToast,\n orientation,\n onCloseMagicWindow,\n openExitPopup,\n addedToRoomItems,\n}) => {\n const panoImageRef = useRef(null)\n\n useEffect(() => {\n // Since outlines are disabled on mobile; the thumbnail\n // is generated directly instead of using the renderer's roomScreenshot API\n generateThumbnailFromPreview().then((thumb) => {\n const imageElement = panoImageRef && panoImageRef.current\n\n if (imageElement) {\n imageElement.src = thumb.thumbDataUrl\n }\n })\n }, [])\n\n useEffect(() => {\n if (orientation === ORIENTATION_LANDSCAPE) {\n showToast(ROTATE_PHONE)\n } else {\n hideToast(ROTATE_PHONE)\n }\n }, [orientation])\n\n const { t } = useTranslation()\n const compositionName = composition && (composition.name || t('design.default composition name'))\n const hasLandscapeOrientation = orientation === ORIENTATION_LANDSCAPE\n\n const onClose = () => {\n if (!hasAddedToBag) {\n onCloseMagicWindow()\n } else {\n openExitPopup()\n }\n }\n\n const onAddRoomToBagClick = () => {\n addRoomToBag()\n openExitPopup()\n }\n const hasProductsInRoom = addedToRoomItems && addedToRoomItems.length\n const hasItemsToFavorite = localItemNumbers && localItemNumbers.length\n\n return (\n \n
\n \n \n
\n\n
\n
\n \n
{compositionName}
\n
\n
\n \"\"\n
\n
{t('designSummary.shop this design')}
\n
\n
{t('designSummary.total price')}
\n
{totalPrice}
\n
\n
\n \n {hasItemsToFavorite && (\n
\n \n
\n )}\n
\n\n {hasProductsInRoom && (\n
\n {addedToRoomItems.map((productData) => (\n \n ))}\n
\n )}\n
\n
\n )\n}\n\nDesignSummaryModalMobile.defaultProps = {\n localItemNumbers: null,\n}\n\nDesignSummaryModalMobile.propTypes = {\n closeModal: func.isRequired,\n composition: compositionType.isRequired,\n addRoomToBag: func.isRequired,\n hasAddedToBag: bool.isRequired,\n totalPrice: string.isRequired,\n localItemNumbers: arrayOf(string),\n showToast: func.isRequired,\n hideToast: func.isRequired,\n orientation: string.isRequired,\n onCloseMagicWindow: func.isRequired,\n openExitPopup: func.isRequired,\n addedToRoomItems: productsDataType.isRequired,\n}\n\nexport default DesignSummaryModalMobile\n","import React, { useEffect, useRef } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport { func, bool, string, arrayOf } from 'prop-types'\nimport arrowLeft from '@ingka/ssr-icon/paths/arrow-left'\nimport cross from '@ingka/ssr-icon/paths/cross'\nimport shoppingBag from '@ingka/ssr-icon/paths/shopping-bag'\nimport shoppingBagActive from '@ingka/ssr-icon/paths/shopping-bag-active'\nimport { useTranslation } from 'react-i18next'\nimport Icon from 'components/uiElements/Icon'\nimport { compositionType, productsDataType } from 'models/propTypes'\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\nimport { TRACK_LOCATION_DESIGN_SUMMARY } from 'models/tracking/constants'\nimport Button from '@ingka/button'\nimport ProductItemContainer from 'containers/designSidepanel/ProductItemContainer'\nimport { getRenderer } from 'models/refStore/selectors'\nimport * as Sentry from '@sentry/react'\n\nrequire('./DesignSummaryModal.scss')\n\nconst DesignSummaryModal = ({\n closeModal,\n addRoomToBag,\n hasAddedToBag,\n composition,\n totalPrice,\n localItemNumbers = null,\n openExitPopup,\n addedToRoomItems,\n openBag,\n isModified,\n openDesignLab,\n ikeaNav,\n isMagicWindow,\n onCloseMagicWindow,\n isLoggedIn,\n isSaving,\n onSave,\n}) => {\n const panoImageRef = useRef(null)\n const history = useHistory()\n\n useEffect(() => {\n getRenderer().takeRoomScreenshot(\n (thumb) => {\n const imageElement = panoImageRef && panoImageRef.current\n\n if (imageElement) {\n imageElement.src = thumb.thumbDataUrl\n }\n },\n (error) => {\n Sentry.captureException(new Error('Error generating thumbnail from preview', { cause: error }))\n },\n )\n }, [])\n\n const { t } = useTranslation()\n const compositionName = composition && (composition.name || t('design.default composition name'))\n\n const onDoneClick = () => {\n // If the user is in a magic window, close the window\n if (isMagicWindow && onCloseMagicWindow) {\n onCloseMagicWindow()\n // else user is in design lab or sugarcube\n // if the design is not saved and user is logged in,\n // open the the save popup\n } else if (isModified && isLoggedIn) {\n openExitPopup()\n // if the user has a saved design return to design your home\n } else if (ikeaNav) {\n closeModal()\n openDesignLab()\n // else return to sugarcube\n } else {\n closeModal()\n // go back to sugarcube dashboard\n history.push(`/dashboard`)\n }\n }\n\n const onSaveClick = () => {\n if (isModified) {\n // if the user is logged out, login prompt will appear to log in or sign up\n const trackingInfo = {\n SavedFrom: TRACK_LOCATION_DESIGN_SUMMARY,\n }\n onSave(trackingInfo)\n }\n }\n\n const hasProductsInRoom = addedToRoomItems && addedToRoomItems.length\n const hasItemsToFavorite = localItemNumbers && localItemNumbers.length\n const showSaveButton = !isMagicWindow && isModified\n const saveButtonText = isSaving ? t('designSummary.saving') : t('designSummary.save')\n\n return (\n
\n
\n \n
\n \n
\n
\n
\n
\n
\n
\n
{compositionName}
\n \"\"\n
\n\n
\n
\n
{t('designSummary.shop this design')}
\n
{totalPrice}
\n
\n\n
\n
\n\n {hasProductsInRoom && (\n
\n {addedToRoomItems.map((productData) => (\n \n ))}\n
\n )}\n
\n
\n
\n )\n}\n\nDesignSummaryModal.defaultProps = {\n localItemNumbers: null,\n onCloseMagicWindow: null,\n}\n\nDesignSummaryModal.propTypes = {\n closeModal: func.isRequired,\n composition: compositionType.isRequired,\n addRoomToBag: func.isRequired,\n hasAddedToBag: bool.isRequired,\n totalPrice: string.isRequired,\n localItemNumbers: arrayOf(string),\n openExitPopup: func.isRequired,\n addedToRoomItems: productsDataType.isRequired,\n openBag: func.isRequired,\n isModified: bool.isRequired,\n openDesignLab: func.isRequired,\n ikeaNav: bool.isRequired,\n onCloseMagicWindow: func,\n isMagicWindow: bool.isRequired,\n isLoggedIn: bool.isRequired,\n isSaving: bool.isRequired,\n onSave: func.isRequired,\n}\n\nexport default DesignSummaryModal\n","import React, { useEffect, useContext } from 'react'\nimport { connect } from 'react-redux'\nimport DesignSummaryModalMobile from 'components/DesignSummaryModalMobile'\nimport DesignSummaryModal from 'components/DesignSummaryModal'\nimport { func, bool, string, arrayOf } from 'prop-types'\nimport {\n getSelectedComposition,\n getSelectedCompositionShoppableProductData,\n getSelectedCompositionRenderedItemsTotalPrice,\n getSelectedCompositionRenderItemsLocalIds,\n getIsModified,\n getIsSaving,\n} from 'models/compositions/selectors'\nimport { getHasAddedToBag } from 'models/bag/selectors'\n\nimport { compositionType, productsDataType } from 'models/propTypes'\nimport { addRoomToBag as addRoomToBagAction, openBag as openBagAction } from 'models/bag/actions'\nimport { showToast as showToastAction, hideToast as hideToastAction } from 'models/toasts/actions'\nimport { getOrientation } from 'models/ui/selectors'\nimport { requestFavorites as requestFavoritesAction } from 'models/favorites/actions'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { openDesignLab as openDesignLabAction } from 'models/ui/actions'\nimport { getIsLoggedIn } from 'models/user/selectors'\nimport { saveSelectedComposition as saveSelectedCompositionAction } from 'models/compositions/actions'\n\nconst DesignSummaryModalContainer = ({\n closeModal,\n composition,\n addedToRoomItems,\n addRoomToBag,\n hasAddedToBag,\n openBag,\n totalPrice,\n localItemNumbers,\n showToast,\n orientation,\n hideToast,\n onCloseMagicWindow,\n openExitPopup,\n requestFavorites,\n isModified,\n openDesignLab,\n isLoggedIn,\n isSaving,\n saveSelectedComposition,\n}) => {\n useEffect(() => {\n requestFavorites()\n }, [])\n const { isMobile, ikeaNav, isMagicWindow } = useContext(SugarcubeContext)\n const productIds = addedToRoomItems.map((item) => item.localItemNumber)\n const region = addedToRoomItems.length ? addedToRoomItems[0].region : null\n const trackingInfo = { ProductsAdded: addedToRoomItems.length }\n const blockRedirect = true\n return isMobile ? (\n addRoomToBag(productIds, region, trackingInfo, blockRedirect)}\n hasAddedToBag={hasAddedToBag}\n openBag={openBag}\n totalPrice={totalPrice}\n localItemNumbers={localItemNumbers}\n showToast={showToast}\n hideToast={hideToast}\n addedToRoomItems={addedToRoomItems}\n orientation={orientation}\n onCloseMagicWindow={onCloseMagicWindow}\n openExitPopup={openExitPopup}\n />\n ) : (\n addRoomToBag(productIds, region, trackingInfo, blockRedirect)}\n hasAddedToBag={hasAddedToBag}\n openBag={openBag}\n totalPrice={totalPrice}\n localItemNumbers={localItemNumbers}\n addedToRoomItems={addedToRoomItems}\n openExitPopup={openExitPopup}\n isModified={isModified}\n ikeaNav={ikeaNav}\n openDesignLab={openDesignLab}\n isMagicWindow={isMagicWindow}\n onCloseMagicWindow={onCloseMagicWindow}\n isLoggedIn={isLoggedIn}\n isSaving={isSaving}\n onSave={saveSelectedComposition}\n />\n )\n}\n\nDesignSummaryModalContainer.defaultProps = {\n localItemNumbers: null,\n onCloseMagicWindow: null,\n}\n\nDesignSummaryModalContainer.propTypes = {\n closeModal: func.isRequired,\n composition: compositionType.isRequired,\n addedToRoomItems: productsDataType.isRequired,\n addRoomToBag: func.isRequired,\n openBag: func.isRequired,\n hasAddedToBag: bool.isRequired,\n totalPrice: string.isRequired,\n localItemNumbers: arrayOf(string),\n showToast: func.isRequired,\n hideToast: func.isRequired,\n orientation: string.isRequired,\n onCloseMagicWindow: func,\n openExitPopup: func.isRequired,\n requestFavorites: func.isRequired,\n isModified: bool.isRequired,\n openDesignLab: func.isRequired,\n isLoggedIn: bool.isRequired,\n isSaving: bool.isRequired,\n saveSelectedComposition: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n composition: getSelectedComposition(state),\n addedToRoomItems: getSelectedCompositionShoppableProductData(state),\n hasAddedToBag: getHasAddedToBag(state),\n totalPrice: getSelectedCompositionRenderedItemsTotalPrice(state),\n localItemNumbers: getSelectedCompositionRenderItemsLocalIds(state),\n orientation: getOrientation(state),\n isModified: getIsModified(state),\n isLoggedIn: getIsLoggedIn(state),\n isSaving: getIsSaving(state),\n})\n\nconst mapDispatchToProps = {\n addRoomToBag: addRoomToBagAction,\n openBag: openBagAction,\n showToast: showToastAction,\n hideToast: hideToastAction,\n requestFavorites: requestFavoritesAction,\n openDesignLab: openDesignLabAction,\n saveSelectedComposition: saveSelectedCompositionAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DesignSummaryModalContainer)\n","import React, { useContext } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { func } from 'prop-types'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport Icon from 'components/uiElements/Icon'\nimport { compositionDataItemsType, trackingRoomInfoType } from 'models/propTypes'\nimport { click } from 'utils/tracker'\nimport Thumbnail from 'components/dashboard/Thumbnail'\nimport { ROOM_SOURCE_STOCK } from 'models/tracking/constants'\n\nrequire('./OpenCompositionModal.scss')\n\nconst OpenCompositionModal = ({ closeTryNewRoomModal, compositionDataItems, openComposition, roomInfo }) => {\n const { t } = useTranslation()\n const { isMagicWindow } = useContext(SugarcubeContext)\n const openNewComposition = (composition) => {\n const { name, id, sceneId } = composition\n const newRoomInfo = {\n RoomId: sceneId,\n RoomTitle: name,\n RoomSource: ROOM_SOURCE_STOCK,\n }\n click('DecorateRoom.TryNewRoom.Open', newRoomInfo)\n openComposition(id)\n closeTryNewRoomModal()\n }\n\n const onCancel = () => {\n click('DecorateRoom.TryNewRoom.Cancel', roomInfo)\n closeTryNewRoomModal()\n }\n\n return (\n
\n
\n {isMagicWindow ? (\n \n ) : (\n \n )}\n \n
\n
\n
\n
{t('design.select a new room')}
\n
{t('design.replace and rearrange')}
\n {compositionDataItems.map((composition) => {\n const compNoCreationDate = { ...composition, creationDate: undefined }\n return (\n openNewComposition(composition)}\n item={compNoCreationDate}\n cta={t('dashboard.compositionOpenCTA')}\n data-testid=\"stock-compositions\"\n />\n )\n })}\n
\n
\n
\n )\n}\n\nOpenCompositionModal.defaultProps = {\n compositionDataItems: null,\n roomInfo: null,\n}\n\nOpenCompositionModal.propTypes = {\n closeTryNewRoomModal: func.isRequired,\n compositionDataItems: compositionDataItemsType,\n openComposition: func.isRequired,\n roomInfo: trackingRoomInfoType,\n}\n\nexport default OpenCompositionModal\n","import React, { useEffect } from 'react'\nimport { connect } from 'react-redux'\nimport OpenCompositionModal from 'components/OpenCompositionModal'\nimport { func } from 'prop-types'\nimport {\n getSelectedComposition,\n getStockCompositionsDataSorted,\n getSelectedCompositionTrackingRoomInfo,\n} from 'models/compositions/selectors'\nimport {\n openComposition as openCompositionAction,\n requestCompositions as requestCompositionsAction,\n} from 'models/compositions/actions'\nimport { compositionType, compositionDataItemsType, trackingRoomInfoType } from 'models/propTypes'\n\nconst OpenCompositionModalContainer = ({\n composition,\n closeTryNewRoomModal,\n compositionDataItems,\n openComposition,\n requestCompositions,\n roomInfo,\n}) => {\n useEffect(() => {\n const hasNoCompositions = !(compositionDataItems && compositionDataItems.length)\n if (hasNoCompositions) {\n requestCompositions()\n }\n }, [])\n\n return (\n \n )\n}\nOpenCompositionModalContainer.defaultProps = {\n composition: null,\n compositionDataItems: null,\n roomInfo: null,\n}\n\nOpenCompositionModalContainer.propTypes = {\n closeTryNewRoomModal: func.isRequired,\n composition: compositionType,\n compositionDataItems: compositionDataItemsType,\n openComposition: func.isRequired,\n requestCompositions: func.isRequired,\n roomInfo: trackingRoomInfoType,\n}\n\nconst mapStateToProps = (state) => ({\n composition: getSelectedComposition(state),\n compositionDataItems: getStockCompositionsDataSorted(state),\n roomInfo: getSelectedCompositionTrackingRoomInfo(state),\n})\n\nconst mapDispatchToProps = {\n openComposition: openCompositionAction,\n requestCompositions: requestCompositionsAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(OpenCompositionModalContainer)\n","import React from 'react'\nimport { getUserId, getIsAdmin } from 'models/user/selectors'\nimport { OptimizelyProvider } from '@optimizely/react-sdk'\nimport optimizely from 'utils/optimizely'\nimport { bool, number } from 'prop-types'\nimport { connect } from 'react-redux'\n\nconst OptimizelyProviderContainer = ({ userId, isAdmin, ...otherProps }) => (\n \n {otherProps.children}\n \n)\n\nOptimizelyProviderContainer.propTypes = {\n userId: number.isRequired,\n isAdmin: bool.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n userId: getUserId(state),\n isAdmin: getIsAdmin(state),\n})\n\nexport default connect(mapStateToProps)(OptimizelyProviderContainer)\n","import * as types from 'models/actionTypes'\n\nexport const newRenderer = () => ({\n type: types.NEW_RENDERER,\n})\n\nexport const destroyRenderer = () => ({\n type: types.DESTROY_RENDERER,\n})\n\nexport const rendererReady = (contextInfo) => ({\n type: types.RENDERER_READY,\n contextInfo,\n})\n\nexport const firstRender = () => ({\n type: types.FIRST_RENDER,\n})\n\nexport const webglContextLost = () => ({\n type: types.WEBGL_CONTEXT_LOST,\n})\n\nexport const webglContextNotCreated = () => ({\n type: types.WEBGL_CONTEXT_NOT_CREATED,\n})\n\nexport const webglContextRestored = () => ({\n type: types.WEBGL_CONTEXT_RESTORED,\n})\n\nexport const initializationFailure = (info) => ({\n type: types.INITIALIZATION_FAILURE,\n info,\n})\n","import * as THREE from 'three'\n\nclass RenderItem {\n constructor(id, renderer, position, placedOnFloor, onUpdate, updateReact) {\n this.id = id\n this.Renderer = renderer\n this.name = `renderObject-${this.id}`\n this.onUpdate = onUpdate\n this.updateReact = updateReact\n this.isDeleted = false\n\n this.metrics = {\n id,\n msStartLoad: null,\n msEndLoad: null,\n msEndFlush: null,\n sFileDownloadTime: null,\n msBasisUniversalTextureTranscodingTime: null,\n msDracoDecompress: null,\n sLoadTime: null,\n sFlushTime: null,\n sTotalTime: null,\n LoadSize: null,\n MeshCompression: null,\n TextureCompression: null,\n MbFileSizeTransferred: null\n }\n\n this.layer = 0\n\n this.visible = true\n this.renderObject = null\n this.bbox = new THREE.Box3()\n this.pose = null\n this.placedOnFloor = placedOnFloor\n\n this.position = position\n this.setPosition(position)\n this.children = []\n }\n\n getName() {\n return this.name\n }\n\n getLayer() {\n return this.layer\n }\n\n setObject(obj) {\n this.renderObject = obj\n }\n\n unsetObject() {\n this.renderObject = null\n }\n\n getObject() {\n return this.renderObject\n }\n\n getPose() {\n return this.pose\n }\n\n getPosition() {\n return this.position\n }\n\n setLoadSize(total) {\n this.metrics.LoadSize = total\n }\n\n getLoadSize() {\n return this.metrics.LoadSize\n }\n\n refresh2DPosition() {\n this.setPosition(this.position)\n this.children.forEach(child => child.refresh2DPosition())\n }\n\n // eslint-disable-next-line class-methods-use-this\n update() {\n \n }\n\n setPosition(xy, options = {}) {\n if (!xy) {\n return false\n }\n\n if (\n options.enforceBounds\n && (\n xy[0] < 0 || xy[1] < 0\n || xy[0] > this.Renderer.getRenderDimensions()[0]\n || xy[1] > this.Renderer.getRenderDimensions()[1]\n )\n ) {\n return false\n }\n\n const pose = this.Renderer.generatePose(xy, this.placedOnFloor, this.isRug)\n if (pose) {\n this.position = xy\n this.pose = pose\n return true\n }\n return false\n }\n\n setVisible(shouldBeVisible) {\n if (this.getObject()) {\n this.getObject().visible = shouldBeVisible\n }\n this.visible = shouldBeVisible\n this.Renderer.onChildUpdate()\n }\n\n onDragStart() {\n this.Renderer.highlightOn(this.placedOnFloor)\n }\n\n onDragFinish() {\n this.Renderer.highlightOff()\n\n this.children.forEach((child) => {\n if (child.onDragFinish) {\n if (child.onDragFinish) {\n child.onDragFinish()\n }\n if (child.update) {\n child.update()\n }\n if (child.updateReactSide) {\n child.updateReactSide()\n }\n }\n })\n }\n\n addToScene() {\n this.Renderer.addToScene(this)\n }\n\n addChild(childItem) {\n this.children.push(childItem)\n if (this.renderObject) {\n const threeObject = childItem.getObject()\n this.renderObject.add(threeObject)\n }\n }\n\n removeChild(childItem) {\n const idx = this.children.indexOf(childItem)\n if (idx > -1) {\n this.children.splice(idx, 1)\n }\n if (this.renderObject) {\n const threeObject = childItem.getObject()\n this.renderObject.remove(threeObject)\n }\n }\n\n removeFromScene() {\n this.bbox.makeEmpty()\n this.Renderer.removeFromScene(this)\n }\n\n addJustLoaded() {\n this.Renderer.incrementLoadedItems(this.getLoadSize())\n if (!this.isDeleted) {\n this.addToScene()\n if (this.renderObject) {\n this.children.forEach(childItem => {\n this.renderObject.add(childItem.getObject())\n })\n }\n }\n }\n\n endIsNigh() {\n this.Renderer.decrementLoadedItems(this.getLoadSize())\n this.isDeleted = true\n this.removeFromScene()\n this.Renderer.furnitureManager.releaseGlb(this.renderObject)\n // this.disposeResources()\n this.unsetObject()\n this.parent = null\n }\n\n enableOutline() {\n if (!this.Renderer) {\n return\n }\n this.Renderer.addObjectToOutline(this.renderObject)\n }\n\n disableOutline() {\n if (!this.Renderer) {\n return\n }\n this.Renderer.removeObjectFromOutline(this.renderObject)\n }\n}\nexport default RenderItem\n","/* eslint-disable no-param-reassign */\nimport WallspiceWebgl from 'Renderer/WallspiceWebgl'\nimport RenderItem from 'Renderer/RenderItem'\n// import WallspiceWebgl, { ShadowDirectionURLs } from 'Renderer/WallspiceWebgl'\nimport * as THREE from 'three'\n\nimport * as artTypes from 'constants/artTypes'\n// import { INSPECT_MAX_BYTES } from 'buffer';\n\nlet maxArtItemOffset = 0.1 // eslint-disable-line\n\nclass ArtItem extends RenderItem {\n constructor(id, renderer, position, onUpdate, artImage, frameData, size) {\n super(id, renderer, position, false, onUpdate)\n\n this.renderer = renderer\n this.size = size\n this.frameData = frameData\n this.selected = false\n this.frameCorners = null\n this.rotation = null\n this.zoffset = maxArtItemOffset\n maxArtItemOffset += 0.1\n\n this.outerL = 0\n this.outerR = 0\n this.outerB = 0\n this.outerT = 0\n\n this.ratio = parseFloat((artImage.width / artImage.height).toFixed(2), 10)\n if (artImage.width >= artImage.height) {\n this.orientation = artTypes.ART_LANDSCAPE\n } else {\n this.orientation = artTypes.ART_PORTRAIT\n }\n this.artMaterial = WallspiceWebgl.createArtMaterial(artImage)\n\n this.artSize = [(this.size * this.ratio), this.size]\n\n this.loadFrame()\n this.planeIndex = null\n this.shadowDirection = null\n this.shadowMaterial = null\n this.shadowPlane = null\n\n this.isUnderMouse = false\n }\n\n // applyCubemap() {\n // // eslint-disable-next-line func-names\n // setTimeout(function(){ this.attemptCubemap() }.bind(this), 5000)\n // }\n\n // attemptCubemap() {\n // const cubeTex = this.renderer && this.renderer.cubeTex\n // const model = this.getObject()\n // if(cubeTex && model) {\n // if(model) {\n // model.traverse((child) => {\n // if (child instanceof THREE.Mesh) {\n // cubeTex.then((cubetexmap) => {\n // const envMapIntensity = 1.0\n // child.material.envMapIntensity = envMapIntensity\n // child.material.originalEnvMapIntensity = envMapIntensity\n // child.material.envMap = cubetexmap\n // child.material.envMap.isCubeTexture = true\n // child.material.needsUpdate = true\n // this.update()\n // })\n // }\n // })\n // }\n // } else {\n // // eslint-disable-next-line func-names\n // setTimeout(function(){ this.attemptCubemap() }.bind(this), 250)\n // }\n // }\n\n\n applyCubemapMat(material) {\n setTimeout(() => { this.attemptCubemapMat(material) }, 50)\n }\n\n attemptCubemapMat(material) {\n const cubeTex = this.renderer && this.renderer.cubeTex\n const model = this.getObject()\n if(cubeTex && model) {\n cubeTex.then((cubetexmap) => {\n const envMapIntensity = 1.0\n material.envMapIntensity = envMapIntensity\n material.originalEnvMapIntensity = envMapIntensity\n material.envMap = cubetexmap\n material.envMap.isCubeTexture = true\n material.needsUpdate = true\n this.update()\n })\n } else {\n setTimeout(() => { this.attemptCubemapMat() }, 250)\n }\n }\n\n getCorners() {\n return this.frameCorners\n }\n\n getRotation() {\n return this.rotation\n }\n\n getOrientation() {\n return this.orientation\n }\n\n getZoffset() {\n return this.zoffset || maxArtItemOffset\n }\n\n updateFrame(frameData, size) {\n this.frameData = frameData\n this.setSizeNoReload(size)\n this.loadFrame()\n }\n\n setSizeNoReload(size) {\n this.size = size\n this.artSize = [(size * this.ratio), size]\n }\n\n setPosition(xy) {\n const isValid = super.setPosition(xy)\n\n if (isValid) {\n const pose = this.getPose()\n const zOffset = this.getZoffset()\n pose.pos[0] += pose.rot[2][0] * 0.001 * zOffset\n pose.pos[1] += pose.rot[2][1] * 0.001 * zOffset\n pose.pos[2] += pose.rot[2][2] * 0.001 * zOffset\n }\n\n this.update()\n return isValid\n }\n\n setVisible(shouldBeVisible) {\n super.setVisible(shouldBeVisible)\n this.update()\n }\n\n setSelected(shouldBeSelected) {\n this.selected = shouldBeSelected\n if (this.selected) {\n this.enableOutline()\n } else {\n this.disableOutline()\n }\n this.updateOutlineThickness()\n this.update()\n }\n\n onHover() {\n this.isUnderMouse = true\n this.enableOutline()\n this.updateOutlineThickness()\n }\n\n onHoverEnd() {\n this.isUnderMouse = false\n if (!this.selected) {\n this.disableOutline()\n }\n this.updateOutlineThickness()\n }\n\n onDragStart() {\n super.onDragStart()\n\n // Exchange the current z-offset with the highest artItem\n if (this.getZoffset() < maxArtItemOffset) {\n const maxItem = Array.from(this.Renderer.renderItems.values()).filter(item => item instanceof ArtItem)\n .reduce((max, cur) => cur.zoffset > max.zoffset ? cur : max, { zoffset: 0 })\n const temp = maxItem.zoffset\n maxItem.zoffset = this.zoffset\n this.zoffset = temp\n maxItem.setPosition(maxItem.position)\n }\n }\n\n updateOutlineThickness() {\n if (!this.Renderer) {\n return\n }\n // assuming here that hover+selcted can happen only when a single object is outlined,\n // muliple objects can't be selcted and hovered over at the same time\n this.Renderer.setThickOutline(this.isUnderMouse && this.selected)\n }\n\n update(metrics = null) {\n if (!this.getObject()) {\n return\n }\n\n const { Renderer } = this\n\n const pose = this.getPose()\n if (!pose) {\n // need to call react's update to assign metrics to render item, it is used to track \n // if item is still loading\n const oneTimeRenderCallback = metrics ?\n () => this.onUpdate({ corners: null, metrics }) :\n null\n Renderer.onChildUpdate(oneTimeRenderCallback)\n return\n }\n\n const rotation = pose.rot\n const position = pose.pos\n\n const mat4 = new THREE.Matrix4();\n WallspiceWebgl.createMat4(rotation, position, mat4)\n this.getObject().matrix.copy(mat4)\n\n const corners = WallspiceWebgl.projBoundBox(mat4, this.bbox, this.Renderer.camera.projectionMatrix)\n this.rotation = pose.rot\n this.frameCorners = corners\n\n if (this.planeIndex !== pose.planeIndex) {\n this.planeIndex = pose.planeIndex\n }\n // must reapply uniform settings as material might have been recreated\n // due to dynamic frame edits\n const lightDirection = Renderer.getLightDirectionByIndex(this.planeIndex)\n const cast = WallspiceWebgl.cardinalToVector(lightDirection)\n WallspiceWebgl.setShadowMeshDirection(this.shadowMesh, cast);\n\n const oneTimeRenderCallback = metrics ?\n () => this.onUpdate({ corners, metrics }) :\n null\n Renderer.onChildUpdate(oneTimeRenderCallback)\n if (!metrics) {\n this.onUpdate({ corners })\n }\n }\n\n async loadFrame() {\n this.metrics.msStartLoad = Date.now()\n\n if (this.getObject()) {\n this.removeFromScene()\n this.unsetObject()\n }\n\n const frame = this.makeFrameModel()\n frame.name = this.name\n frame.matrixAutoUpdate = false\n frame.visible = this.visible\n frame.castShadow = true\n frame.receiveShadow = false\n\n this.setObject(frame)\n // this.visualizeDebugBoundBox(0x00FF00)\n this.addToScene()\n\n this.metrics.msEndLoad = Date.now()\n this.metrics.sLoadTime = (this.metrics.msEndLoad - this.metrics.msStartLoad) * 0.001\n\n if (this.selected) {\n this.setSelected(true)\n }\n this.update(this.metrics)\n }\n\n makeFrameModel() {\n const frame = new THREE.Object3D()\n const width = this.artSize[0];\n const height = this.artSize[1];\n let innerDepth = this.frameData.canvasDepth;\n let maxDepth = 0;\n let innerLength = 0.02;\n const outerLength = 0.04;\n this.outerL = -width * 0.5;\n this.outerR = width * 0.5;\n this.outerB = -height * 0.5;\n this.outerT = height * 0.5;\n\n // canvas\n const geometryCanvas = WallspiceWebgl.makeCanvasGeometry(width, height, this.frameData.canvasDepth, false);\n const canvas = new THREE.Mesh(geometryCanvas, this.artMaterial)\n canvas.name = 'canvas'\n frame.add(canvas)\n this.bbox.setFromObject(frame)\n this.applyCubemapMat(this.artMaterial)\n\n if (this.frameData.matte && this.frameData.matte.sections) {\n const matDesc = this.frameData.matte.sections\n let mOff = 0\n if (this.frameData.matOffset) {\n mOff = this.frameData.matOffset\n }\n\n for (let i = 0; i < matDesc.length; i += 1) {\n const tmp = matDesc[0].profile[matDesc[i].profile.length - 1][1] + mOff\n if (tmp > innerDepth) {\n innerDepth = tmp\n }\n const L = this.outerL\n const R = this.outerR\n const B = this.outerB\n const T = this.outerT\n WallspiceWebgl.createFrameMaterial(matDesc[i].textureName,\n matDesc[i].albedo).then((material) => {\n this.applyCubemapMat(material)\n const geometry = WallspiceWebgl.extrudeFrame(L, R, B, T, mOff,\n matDesc[i].scaleU, matDesc[i].scaleV, matDesc[i].profile)\n const segment = new THREE.Mesh(geometry, material)\n segment.name = `matSegment_${i}`\n frame.add(segment)\n this.update()\n })\n const extrusionDist = matDesc[i].profile[matDesc[i].profile.length - 1][0]\n this.outerL -= extrusionDist\n this.outerR += extrusionDist\n this.outerB -= extrusionDist\n this.outerT += extrusionDist\n }\n }\n const iL = this.outerL\n const iR = this.outerR\n const iB = this.outerB\n const iT = this.outerT\n if (this.frameData.sections) {\n const frDesc = this.frameData.sections;\n for (let i = 0; i < frDesc.length; i += 1) {\n let textureName = frDesc[i].textureName\n let albedo = frDesc[i].albedo\n if (this.frameData.color) {\n if (this.frameData.color.material) {\n textureName = this.frameData.color.material\n albedo = '#ffffff'\n }\n if (this.frameData.color.albedo) {\n albedo = this.frameData.color.albedo\n }\n }\n for (let j = 0; j < frDesc[i].profile.length; j += 1) {\n if (frDesc[i].profile[j][1] > maxDepth) {\n maxDepth = frDesc[i].profile[j][1]\n }\n }\n\n const L = this.outerL\n const R = this.outerR\n const B = this.outerB\n const T = this.outerT\n WallspiceWebgl.createFrameMaterial(textureName, albedo).then((material) => {\n this.applyCubemapMat(material)\n const geometry = WallspiceWebgl.extrudeFrame(L, R, B, T, 0,\n frDesc[i].scaleU, frDesc[i].scaleV, frDesc[i].profile)\n const segment = new THREE.Mesh(geometry, material)\n segment.name = `frameSegment_${i}`\n frame.add(segment)\n this.update()\n })\n const extrusionDist = frDesc[i].profile[frDesc[i].profile.length - 1][0]\n this.outerL -= extrusionDist\n this.outerR += extrusionDist\n this.outerB -= extrusionDist\n this.outerT += extrusionDist\n }\n } else {\n innerDepth = 0;\n innerLength = 0;\n }\n\n this.bbox.min.x = this.outerL\n this.bbox.max.x = this.outerR\n this.bbox.min.y = this.outerB\n this.bbox.max.y = this.outerT\n if (this.bbox.max.z < maxDepth) {\n this.bbox.max.z = maxDepth\n }\n\n this.shadowMesh = WallspiceWebgl.makeFrameShadow(this.outerL, this.outerR, this.outerB, this.outerT,\n iL, iR, iB, iT, innerDepth, innerLength, outerLength)\n\n this.shadowMesh.name = 'frameShadow'\n frame.add(this.shadowMesh)\n\n return frame\n }\n}\n\nexport default ArtItem\n","export const ART_PORTRAIT = 'ART_PORTRAIT'\nexport const ART_LANDSCAPE = 'ART_LANDSCAPE'\n","export function isMultiTouchEvent(event: (MouseEvent | TouchEvent)) {\n if ('touches' in event) {\n return event.touches.length >= 2\n }\n return false\n}\n\nexport function getClientEventCoords(event: (MouseEvent | TouchEvent)) {\n let clientX\n let clientY\n let isTouch = false\n\n if ('touches' in event) {\n if (event.touches.length) {\n clientX = event.touches[0].clientX\n clientY = event.touches[0].clientY\n isTouch = true\n }\n } else {\n clientX = event.clientX\n clientY = event.clientY\n }\n\n return { clientX, clientY, isTouch }\n}\n\nexport function getMultiTouchAngle(event: TouchEvent) {\n if (!isMultiTouchEvent(event)) {\n return 0\n }\n\n const { clientX: x1, clientY: y1 } = event.touches[0]\n const { clientX: x2, clientY: y2 } = event.touches[1]\n\n return Math.atan2((y2 - y1), (x2 - x1))\n}\n","import React, { Component } from 'react'\nimport { shape, func, bool, arrayOf, number, string } from 'prop-types'\nimport classNames from 'classnames'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { GET_INFO_CANVAS_PIN } from 'models/tracking/constants'\nimport { getClientEventCoords, getMultiTouchAngle, isMultiTouchEvent } from 'utils/events'\n\nrequire('./CompositionItemDraggable.scss')\n\nclass CompositionItemDraggable extends Component {\n static optionsMD(e) {\n // Stop the mouseDown if we're clicking\n // on options so that the dragStart doesn't\n // interfere\n e.stopPropagation()\n }\n\n constructor(props) {\n super(props)\n this.cornerRef = React.createRef()\n this.dragWrapper = React.createRef()\n\n this.startDrag = this.startDrag.bind(this)\n this.whileDragging = this.whileDragging.bind(this)\n this.cancelDrag = this.cancelDrag.bind(this)\n this.updateScale = this.updateScale.bind(this)\n this.getConvertedCoordinates = this.getConvertedCoordinates.bind(this)\n this.getSceneToDisplayCoordinates = this.getSceneToDisplayCoordinates.bind(this)\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onMouseUp = this.onMouseUp.bind(this)\n this.onMouseMove = this.onMouseMove.bind(this)\n this.updateCenterPointStyle = this.updateCenterPointStyle.bind(this)\n this.getCorners = this.getCorners.bind(this)\n\n this.scaleX = 1\n this.scaleY = 1\n\n this.dragOffset = [0, 0]\n\n this.state = {\n isDragging: false,\n isMouseDown: false,\n centerStyle: null,\n }\n\n this.x = props.x\n this.y = props.y\n\n this.lastConvertedCoordinates = null\n this.lastTouchAngle = null // Multi-touch rotate\n this.lastX = 0\n\n this.mouseDownLocation = [0, 0]\n }\n\n componentDidMount() {\n this.updateScale()\n\n const { current: wrapperCurrent } = this.dragWrapper\n if (wrapperCurrent) {\n wrapperCurrent.addEventListener('touchstart', this.onMouseDown)\n wrapperCurrent.addEventListener('touchmove', this.onMouseMove)\n wrapperCurrent.addEventListener('touchend', this.cancelDrag)\n wrapperCurrent.addEventListener('touchcancel', this.cancelDrag)\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.x !== this.lastX) {\n this.lastX = this.props.x\n }\n if (this.props.x !== this.x) {\n this.x = this.props.x\n this.updateCenterPointStyle()\n }\n if (this.props.y !== this.y) {\n this.y = this.props.y\n this.updateCenterPointStyle()\n }\n if (!this.state.centerStyle) {\n this.updateCenterPointStyle()\n }\n if (this.props.corners !== prevProps.corners) {\n this.updateCenterPointStyle()\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('mouseup', this.cancelDrag)\n }\n\n onMouseDown(event) {\n // This check will allow unselected items to\n // trigger the deselect-all function in the\n // preview component\n if (this.props.selected) {\n event.stopPropagation()\n }\n const { clientX, clientY } = getClientEventCoords(event)\n this.mouseDownLocation = [clientX, clientY]\n this.setState({ isMouseDown: true })\n }\n\n onMouseUp() {\n this.setState({ isMouseDown: false })\n }\n\n onMouseMove(event) {\n const { isMobile } = this.context\n const { isDragging } = this.state\n const { selected } = this.props\n const { clientX, clientY, isTouch } = getClientEventCoords(event)\n event.preventDefault() // Don't back nav on touch drag\n\n if (isMobile || (isTouch && !selected)) {\n return\n }\n\n if (isDragging) {\n this.whileDragging(event)\n } else if (this.state.isMouseDown) {\n const thresholdExceeded =\n Math.abs(clientX - this.mouseDownLocation[0]) > 3 || Math.abs(clientY - this.mouseDownLocation[1]) > 3\n\n if (this.props.selected || thresholdExceeded) {\n this.startDrag(event)\n }\n }\n }\n\n getConvertedCoordinates(clientX, clientY) {\n // Convert from window-scale coordinates\n // to scene and Preview scale coordinates\n const corner = this.cornerRef.current\n const { left, top, width, height } = corner.getBoundingClientRect()\n const { scaleX, scaleY } = this\n\n const eventX = clientX - left\n const eventY = clientY - top\n\n const x = eventX * scaleX\n const y = eventY * scaleY\n\n // Percentage values\n const relX = (eventX / width) * 100\n const relY = (eventY / height) * 100\n\n return {\n x,\n y,\n relX,\n relY,\n }\n }\n\n getSceneToDisplayCoordinates(sceneX, sceneY) {\n // Convert from scene coordinates to Preview-scale\n // percentage values\n const corner = this.cornerRef.current\n if (!corner) {\n return null\n }\n const { width, height } = corner.getBoundingClientRect()\n const { scaleX, scaleY } = this\n\n const x = sceneX / scaleX\n const y = sceneY / scaleY\n\n const relX = (x / width) * 100\n const relY = (y / height) * 100\n\n return {\n x,\n y,\n relX,\n relY,\n }\n }\n\n getCorners() {\n // Corner layout (unit: percentage)\n // |0 1|\n // |3 2|\n\n const { corners } = this.props\n if (!corners) {\n return {\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n bottomPadded: 0,\n farRight: 0,\n farBottom: 0,\n }\n }\n\n const top = corners[0][1] * 100\n const left = corners[0][0] * 100\n const farBottom = corners[2][1] * 100\n const farRight = corners[1][0] * 100\n\n // If the distance between sides\n // is too small, pad it\n const paddingX = 0\n const paddingY = 0\n\n return {\n // Corner relative\n bottom: Math.max(0, 100 - farBottom - paddingY),\n top: Math.max(0, top - paddingY),\n left: Math.max(0, left - paddingX),\n right: Math.max(0, 100 - farRight - paddingX),\n // Padded for dimensionsContainer\n bottomPadded: Math.max(100 - farBottom - 4, 0),\n // Top-left relative\n farRight: Math.min(100, farRight + paddingX),\n farBottom: Math.min(100, farBottom + paddingY),\n }\n }\n\n updateScale() {\n /*\n We need to calculate the scale between\n the depthmap and the drag handle because\n the drag handle is rendered relative to the\n dom while we want to save the x,y coords\n relative to the depthmap\n */\n\n const renderDimensions = this.props.renderDimensions\n if (!renderDimensions) {\n return\n }\n\n const previewRect = this.cornerRef.current.getBoundingClientRect()\n const scaleX = renderDimensions[0] / previewRect.width\n const scaleY = renderDimensions[1] / previewRect.height\n\n this.scaleX = scaleX\n this.scaleY = scaleY\n }\n\n startDrag(event) {\n this.updateScale()\n this.setState({ isDragging: true })\n window.addEventListener('mouseup', this.cancelDrag)\n this.props.onDragStart()\n const corner = this.cornerRef.current\n const { left, top } = corner.getBoundingClientRect()\n const { clientX, clientY } = getClientEventCoords(event)\n\n // Don't snap to center\n const centerPoint = this.getSceneToDisplayCoordinates(this.x, this.y)\n this.dragOffset = [clientX - left - centerPoint.x, clientY - top - centerPoint.y]\n\n const renderObject = this.props.getRenderObject()\n if (renderObject) {\n this.headingTarget = renderObject.getOrientation()\n } else {\n this.headingTarget = 0\n }\n }\n\n whileDragging(event) {\n if (!event) {\n return\n }\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n\n const { isDragging } = this.state\n if (isDragging) {\n let overrideHeading = false\n\n const { clientX, clientY } = getClientEventCoords(event)\n\n const convertedCoordinates = this.getConvertedCoordinates(\n clientX - this.dragOffset[0],\n clientY - this.dragOffset[1],\n )\n\n if (this.props.rotating) {\n if (this.lastConvertedCoordinates !== null) {\n // The value 100 for dxScale was chosen\n // empirically through trial and error. If\n // dxScale was 1 then one pixel of mouse\n // motion would produce 1 radian of rotation,\n // which is way too much. Rotation needs to\n // be less sensitive than that.\n\n const dxScale = 100\n const dx = convertedCoordinates.x - this.lastConvertedCoordinates.x\n const dh = dx / dxScale\n this.headingTarget += dh\n }\n\n this.lastConvertedCoordinates = convertedCoordinates\n } else if (isMultiTouchEvent(event)) {\n overrideHeading = true\n\n const rotateAngle = getMultiTouchAngle(event)\n\n if (this.lastTouchAngle !== null) {\n const deltaAngle = rotateAngle - this.lastTouchAngle\n this.headingTarget -= deltaAngle\n }\n\n this.lastTouchAngle = rotateAngle\n } else {\n this.x = convertedCoordinates.x\n this.y = convertedCoordinates.y\n }\n\n const renderObject = this.props.getRenderObject()\n if (renderObject) {\n this.props.onDrag({\n x: this.x,\n y: this.y,\n heading: this.headingTarget,\n timeStamp: event.timeStamp,\n overrideHeading,\n })\n }\n }\n }\n\n cancelDrag(event) {\n const { isDragging, isMouseDown } = this.state\n if (isMouseDown && !isDragging) {\n // Handle \"click\" manually to prevent click events\n // when dragging\n this.props.onClick(event)\n }\n\n this.onMouseUp()\n event.stopPropagation()\n window.removeEventListener('mouseup', this.cancelDrag)\n\n if (isDragging) {\n this.setState({ isDragging: false })\n this.lastX = this.x\n this.lastConvertedCoordinates = null\n this.lastTouchAngle = null\n this.props.onDragFinish()\n }\n }\n\n updateCenterPointStyle() {\n let centerStyle = null\n\n const corners = this.getCorners()\n centerStyle = {\n top: `${corners.top + (corners.farBottom - corners.top) / 2}%`,\n left: `${corners.left + (corners.farRight - corners.left) / 2}%`,\n maxWidth: `${corners.farRight - corners.left}%`,\n }\n\n this.setState({ centerStyle })\n }\n\n render() {\n const {\n className,\n isUnderCursor,\n isCurrentDragValid,\n rotating,\n onClick,\n options,\n name,\n price,\n description,\n openSettings,\n selected,\n revealDots,\n showDot,\n } = this.props\n const { isDragging, centerStyle, isMouseDown } = this.state\n const { isMobile } = this.context\n\n const corners = this.getCorners()\n\n const boxStyle = {\n left: `${corners.left}%`,\n top: `${corners.top}%`,\n right: `${corners.right}%`,\n bottom: `${selected ? corners.bottom : corners.bottomPadded}%`,\n }\n\n const optionsStyle = {\n top: `${corners.top}%`,\n bottom: `${corners.bottom}%`,\n }\n if (corners.right < 4) {\n optionsStyle.right = `${100 - corners.left}%`\n } else {\n optionsStyle.left = `${100 - corners.right}%`\n }\n\n const itemClass = {\n dragging: isDragging,\n isUnderCursor,\n rotating,\n isInvalid: !isCurrentDragValid,\n }\n\n return (\n \n {!isMobile && (\n {\n if (!isMouseDown) {\n onClick(e)\n }\n }}\n >\n {this.props.children}\n \n )}\n
\n {options}\n
\n
\n {showDot && !isMobile && (\n \n
\n
\n
\n {\n e.stopPropagation()\n openSettings(GET_INFO_CANVAS_PIN)\n }}\n >\n
\n
\n
\n
{name}
\n {description &&
{description}
}\n
\n
\n {price &&
{price}
}\n
\n
\n
\n )}\n {showDot && isMobile && (\n \n
\n
\n
\n
\n )}\n \n )\n }\n}\n\nCompositionItemDraggable.contextType = SugarcubeContext\n\nCompositionItemDraggable.defaultProps = {\n corners: null,\n tagPoint: null,\n rotating: false,\n options: null,\n description: null,\n price: null,\n openSettings: null,\n renderDimensions: null,\n onDrag: null,\n onClick: null,\n children: null,\n}\n\nCompositionItemDraggable.propTypes = {\n className: string.isRequired,\n isUnderCursor: bool.isRequired,\n isCurrentDragValid: bool.isRequired,\n corners: arrayOf(arrayOf(number).isRequired),\n renderDimensions: arrayOf(number),\n onDragStart: func.isRequired,\n onDrag: func,\n onDragFinish: func.isRequired,\n onClick: func,\n\n tagPoint: shape({}),\n\n children: shape({}),\n options: shape({}),\n\n x: number.isRequired,\n y: number.isRequired,\n\n rotating: bool,\n selected: bool.isRequired,\n name: string.isRequired,\n description: string,\n price: string,\n openSettings: func,\n getRenderObject: func.isRequired,\n revealDots: bool.isRequired,\n showDot: bool.isRequired,\n}\n\nexport default CompositionItemDraggable\n","export const convertRadToDeg = (rad:number): number => rad * (180 / Math.PI)\nexport const convertDegToRad = (deg:number): number => deg * (Math.PI / 180)\n","// Map the heading to within -180 - 180\nexport const mapHeading = (heading) => {\n let ret = (heading + 180) % 360\n if (ret < 0) {\n ret += 360\n }\n ret -= 180\n return ret\n}\n\nexport const generatePositionStyle = (targetRect, panelRect, contentRect, docHeight, docWidth) => {\n const spaceBelowOnScreen = docHeight - targetRect.bottom\n const spaceBelowOnCanvas = contentRect.bottom - targetRect.bottom\n const spaceAboveOnScreen = targetRect.top\n const spaceAboveOnCanvas = targetRect.top - contentRect.top\n\n const pad = 16 // 16px = 1rem\n const style = { opacity: 1 }\n // Place it 1rem off and then animate it place using margin\n const animationOffset = -16\n\n const toolHeight = 80 // rotateHeight\n const toolWidth = 200 // rotateWidth\n const panelHeight = panelRect.height\n const panelWidth = panelRect.width\n const maxPanelWidth = Math.max(panelWidth, toolWidth) + pad\n\n // Start with vertical placement\n if (spaceBelowOnCanvas >= panelHeight + pad && spaceBelowOnScreen >= panelHeight + toolHeight + pad) {\n // Try to place it under the target, but on the canvas and with space to open the tool\n style.top = targetRect.bottom + pad - animationOffset\n style.marginTop = animationOffset\n } else if (spaceAboveOnCanvas >= panelHeight + pad && spaceAboveOnScreen >= panelHeight + toolHeight + pad) {\n // Try to place above the target, but on the canvas and with space to open the tool\n style.top = 'initial' // eslint-disable-line i18next/no-literal-string\n style.bottom = docHeight - targetRect.top + pad - animationOffset\n style.marginBottom = animationOffset\n }\n\n // Continue with horizontal placement\n\n if (style.top) {\n // We were able to place it above or below the target\n\n // Space between the left side of the target and the right edge of the canvas\n const spaceRight = contentRect.right - targetRect.left\n if (spaceRight >= maxPanelWidth) {\n // Place it left aligned with the target, open to the right\n // Don't let the panel touch the edge of the canvas\n style.left = Math.max(targetRect.left, contentRect.left + pad)\n } else {\n style.left = 'initial' // eslint-disable-line i18next/no-literal-string\n // Place it right aligned with the target, open to the left\n // Don't let the panel touch the edge of the canvas\n style.right = Math.max(docWidth - targetRect.right, pad)\n }\n } else {\n // We were unable to place it above or below, let's try placing it to the side\n const spaceLeft = targetRect.left - contentRect.left\n const spaceRight = contentRect.right - targetRect.right\n const placeLeft = spaceLeft >= maxPanelWidth && spaceLeft >= spaceRight\n const placeRight = spaceRight >= maxPanelWidth\n if (placeLeft || placeRight) {\n // We can fit the panel to the side\n if (placeLeft) {\n style.left = 'initial' // eslint-disable-line i18next/no-literal-string\n style.right = docWidth - targetRect.left\n } else {\n style.left = targetRect.right + pad\n }\n // Align with the top of the target, but at least a pad away from the edge\n style.top = Math.max(targetRect.top, contentRect.top + pad)\n } else {\n // We were unable to place it above or below or to either side\n // so we'll place it on top of the item\n\n // Center the panel with the target\n style.left = targetRect.left + targetRect.width / 2 - panelWidth / 2\n\n // Don't let the panel+tool go off-screen\n const onScreenBound = docHeight - pad - toolHeight - panelHeight\n // Don't let the panel go off-canvas\n const onCanvasBound = targetRect.bottom - panelHeight - pad\n style.top = Math.min(onScreenBound, onCanvasBound)\n }\n }\n return style\n}\n","import React, { useCallback, useEffect, useState, useRef } from 'react'\nimport classNames from 'classnames'\nimport { shape, func, number, string } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\n\nimport { convertRadToDeg, convertDegToRad } from 'utils/convertRotation'\n\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\n\nimport Tooltip from 'components/Tooltip'\nimport Icon from 'components/uiElements/Icon'\nimport Range from 'components/formElements/Range'\nimport { TRACK_LOCATION_ACTION_PANEL } from 'models/tracking/constants'\n\nimport { mapHeading, generatePositionStyle } from './helpers'\n\nrequire('./style.scss')\n\nconst MODE_ROTATE = 'MODE_ROTATE'\nconst MODE_MORE = 'MODE_MORE'\n\nconst ActionPanel = ({\n targetRef,\n onDelete,\n onRotateStart,\n onRotate,\n onRotateFinish,\n heading,\n onAddToCart,\n onDuplicate,\n onChangeSurface,\n localItemNumber,\n}) => {\n const { t } = useTranslation()\n const [position, setPosition] = useState(null)\n // Locally we'll use degrees since that's what we expose to users\n const [localHeading, setLocalHeading] = useState(mapHeading(Math.round(convertRadToDeg(heading))))\n const [isRotating, setIsRotating] = useState(false)\n const [openUp, setOpenUp] = useState(false)\n const [openLeft, setOpenLeft] = useState(false)\n const [mode, setMode] = useState(null)\n const panelRef = useRef()\n const rotateRangeRef = useRef(null)\n\n const rotateStart = useCallback(() => {\n setIsRotating(true)\n onRotateStart()\n }, [onRotateStart])\n\n const rotate = useCallback(\n (h) => {\n setLocalHeading(h)\n // Convert to radians for the renderer/data model\n onRotate(convertDegToRad(h))\n },\n [onRotate],\n )\n\n const rotateFinish = useCallback(() => {\n if (isRotating) {\n let { heading: nextHeading } = onRotateFinish()\n nextHeading = mapHeading(Math.round(convertRadToDeg(nextHeading)))\n setLocalHeading(nextHeading)\n setIsRotating(false)\n }\n }, [localHeading, isRotating])\n\n const reposition = useCallback(() => {\n if (targetRef && targetRef.current && panelRef.current) {\n const targetRect = targetRef.current.getBoundingClientRect()\n const panelRect = panelRef.current.getBoundingClientRect()\n const contentRect = panelRef.current.parentNode.getBoundingClientRect()\n const docHeight = document.documentElement.clientHeight\n const docWidth = document.documentElement.clientWidth\n\n const style = generatePositionStyle(targetRect, panelRect, contentRect, docHeight, docWidth)\n\n if (style.right) {\n setOpenLeft(true)\n } else {\n setOpenLeft(false)\n }\n\n if (style.bottom) {\n setOpenUp(true)\n } else {\n setOpenUp(false)\n }\n\n setPosition(style)\n } else {\n setMode(null)\n setPosition(null)\n }\n }, [targetRef, panelRef])\n\n useEffect(reposition, [])\n\n useEffect(() => {\n // Close if we resize the window or click anywhere\n window.addEventListener('resize', reposition)\n window.addEventListener('mouseup', rotateFinish)\n return () => {\n window.removeEventListener('resize', reposition)\n window.removeEventListener('mouseup', rotateFinish)\n }\n }, [rotateFinish, reposition])\n\n useEffect(() => {\n setLocalHeading(mapHeading(Math.round(convertRadToDeg(heading))))\n }, [heading])\n\n const hasMore = !!(onDuplicate || onChangeSurface)\n\n const setRotateMode = () => {\n if (!mode) {\n setMode(MODE_ROTATE)\n }\n }\n const onRotateEnterKey = (event) => {\n const { key } = event\n if (key === 'Enter') {\n const rangeElement = rotateRangeRef && rotateRangeRef.current\n if (rangeElement) {\n rangeElement.focus()\n setMode(MODE_ROTATE)\n rotateStart()\n }\n }\n }\n const onRangeEnterKey = (event) => {\n const { key } = event\n if (key === 'Tab' || key === 'Enter') {\n const rangeElement = rotateRangeRef && rotateRangeRef.current\n if (rangeElement) {\n rangeElement.blur()\n rotateFinish()\n }\n const secondActionButton = document.querySelector(\n // eslint-disable-next-line i18next/no-literal-string\n '.actionPanelButtons button:nth-of-type(1)',\n )\n if (secondActionButton) {\n secondActionButton.focus()\n }\n }\n }\n\n return (\n e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n >\n \n
\n {onRotate && (\n setMode(MODE_ROTATE)}\n onMouseEnter={setRotateMode}\n onFocus={setRotateMode}\n onKeyDown={onRotateEnterKey}\n onBlur={() => {\n if (!isRotating) {\n setMode(null)\n }\n }}\n data-tip={t('design.rotate in place')}\n tabIndex={0}\n aria-label={t('design.rotate in place')}\n >\n \n \n )}\n {onAddToCart && (\n {\n setMode(null)\n onAddToCart()\n }}\n data-tip={t('design.add to bag')}\n tabIndex={0}\n aria-label={t('design.add to bag')}\n >\n \n \n )}\n {onDelete && (\n {\n setMode(null)\n onDelete()\n }}\n data-tip={t('design.remove from design')}\n tabIndex={0}\n aria-label={t('design.remove from design')}\n >\n \n \n )}\n {!onChangeSurface && (\n \n )}\n {onChangeSurface && (\n {\n setMode(null)\n onChangeSurface()\n }}\n data-tip={t('design.change surface')}\n tabIndex={0}\n aria-label={t('design.change surface')}\n >\n \n \n )}\n {hasMore && (\n \n )}\n
\n
\n {mode === MODE_ROTATE && (\n
\n °} // eslint-disable-line i18next/no-literal-string\n onKeyDown={onRangeEnterKey}\n ref={rotateRangeRef}\n />\n
\n )}\n {mode === MODE_MORE && (\n
    \n {onDuplicate && (\n
  • \n {\n setMode(null)\n onDuplicate()\n }}\n >\n \n {t('design.duplicate item')}\n \n
  • \n )}\n {onChangeSurface && (\n
  • \n \n
  • \n )}\n
\n )}\n
\n \n )\n}\n\nActionPanel.defaultProps = {\n onAddToCart: null,\n onDelete: null,\n onRotate: null,\n onRotateStart: null,\n onRotateFinish: null,\n onDuplicate: null,\n onChangeSurface: null,\n heading: null,\n}\n\nActionPanel.propTypes = {\n targetRef: shape({}).isRequired,\n onDelete: func,\n onRotateStart: func,\n onRotate: func,\n onRotateFinish: func,\n heading: number,\n onAddToCart: func,\n onDuplicate: func,\n onChangeSurface: func,\n localItemNumber: string.isRequired,\n}\n\nexport default ActionPanel\n","import React, { useContext } from 'react'\nimport { connect } from 'react-redux'\nimport { number, shape, func, string } from 'prop-types'\n\nimport { getSelectedRenderItemId } from 'models/compositions/selectors'\nimport { addToBag as addToBagAction } from 'models/bag/actions'\nimport { TRACKING_ADDED_FROM_CANVAS_ACTION } from 'models/tracking/constants'\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nimport ActionPanel from 'components/design/ActionPanel'\n\nconst ActionPanelContainer = ({\n selectedId,\n targetRef,\n onDelete,\n onRotateStart,\n onRotate,\n onRotateFinish,\n onDuplicate,\n onChangeSurface,\n heading,\n localItemNumber,\n region,\n trackingInfo,\n name,\n addToBag,\n}) => {\n const { isKiosk } = useContext(SugarcubeContext)\n\n const onAddToCart = isKiosk\n ? null\n : () =>\n addToBag(localItemNumber, region, name, {\n ...trackingInfo,\n AddedFrom: TRACKING_ADDED_FROM_CANVAS_ACTION,\n })\n return (\n \n )\n}\n\nActionPanelContainer.defaultProps = {\n selectedId: null,\n onDelete: null,\n onRotate: null,\n onRotateStart: null,\n onRotateFinish: null,\n onDuplicate: null,\n onChangeSurface: null,\n heading: null,\n}\n\nActionPanelContainer.propTypes = {\n selectedId: number,\n targetRef: shape({}).isRequired,\n onDelete: func,\n onRotateStart: func,\n onRotate: func,\n onRotateFinish: func,\n onDuplicate: func,\n onChangeSurface: func,\n heading: number,\n localItemNumber: string.isRequired,\n region: string.isRequired,\n trackingInfo: shape({}).isRequired,\n name: string.isRequired,\n addToBag: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n selectedId: getSelectedRenderItemId(state),\n})\n\nconst mapDispatchToProps = {\n addToBag: addToBagAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ActionPanelContainer)\n","import React, { Component } from 'react'\nimport { shape, func, bool } from 'prop-types'\nimport classNames from 'classnames'\n\nimport ArtItem from 'Renderer/ArtItem'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { artItemType } from 'models/propTypes'\nimport { withTranslation } from 'react-i18next'\nimport Tooltip from 'components/Tooltip'\nimport CompositionItemDraggable from 'components/CompositionItemDraggable'\nimport ActionPanelContainer from 'containers/design/ActionPanelContainer'\n\nimport { workflow } from 'utils/tracker'\n\nimport { getRenderer } from 'models/refStore/selectors'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nrequire('./CompositionArtItem.scss')\n\nclass CompositionArtItem extends Component {\n static optionsMD(e) {\n // Stop the mouseDown if we're clicking\n // on options so that the dragStart doesn't\n // interfere\n e.stopPropagation()\n }\n\n constructor(props) {\n super(props)\n this.aoeRef = React.createRef()\n this.onRender = this.onRender.bind(this)\n this.RenderObject = null\n\n this.onDragStart = this.onDragStart.bind(this)\n this.onDrag = this.onDrag.bind(this)\n this.onDragFinish = this.onDragFinish.bind(this)\n this.updateObjectSelected = this.updateObjectSelected.bind(this)\n this.deleteRenderItem = this.deleteRenderItem.bind(this)\n\n this.onHoverStart = this.onHoverStart.bind(this)\n this.onHoverEnd = this.onHoverEnd.bind(this)\n this.getRenderObject = this.getRenderObject.bind(this)\n\n this.lastValidPosition = null\n this.wasLastDragValid = false\n\n this.state = {\n corners: null,\n dragging: false,\n loaded: false,\n }\n }\n\n componentDidMount() {\n this.renderCanvas(this.props.renderItem.x, this.props.renderItem.y)\n window.addEventListener('keydown', this.deleteRenderItem)\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { renderItem: artItem } = this.props\n const { renderItem: prevArtItem } = prevProps\n\n const hasFrameUpdated =\n artItem.size.height !== prevArtItem.size.height ||\n artItem.frame.id !== prevArtItem.frame.id ||\n (artItem.frame.color &&\n (artItem.frame.color.hex !== prevArtItem.frame.color.hex ||\n artItem.frame.color.material !== prevArtItem.frame.color.material)) ||\n (artItem.frame.matte && artItem.frame.matte.id !== prevArtItem.frame.matte.id)\n if (hasFrameUpdated) {\n this.RenderObject.updateFrame(artItem.frame, artItem.size.height)\n }\n if (\n artItem.x !== prevArtItem.x ||\n artItem.y !== prevArtItem.y ||\n this.props.artImageData !== prevProps.artImageData\n ) {\n this.renderCanvas(artItem.x, artItem.y)\n }\n if (prevArtItem.selected !== artItem.selected || prevState.dragging !== this.state.dragging) {\n this.updateObjectSelected()\n }\n }\n\n componentWillUnmount() {\n if (this.RenderObject) {\n this.RenderObject.endIsNigh()\n this.RenderObject = null\n }\n window.removeEventListener('keydown', this.deleteRenderItem)\n }\n\n onRender({ corners, metrics }) {\n if (corners) {\n // TODO: investigate this condition need\n this.setState({\n corners,\n })\n }\n if (metrics) {\n const { isInitialLoading, renderItem } = this.props\n\n const productTrackingInfo = getProductTrackingInfo(renderItem)\n\n workflow('DecorateRoom.AddProductLoadTime', {\n ...metrics,\n ...productTrackingInfo,\n LoadTime: metrics.sTotalTime,\n CompositionLoading: isInitialLoading,\n })\n this.setState({ loaded: true })\n this.props.onLoad(metrics)\n }\n }\n\n onDragStart() {\n if (this.props.onDragStart) {\n this.props.onDragStart()\n }\n if (this.RenderObject) {\n this.RenderObject.onDragStart()\n }\n this.setState({ dragging: true })\n\n this.props.clearSwapAffinity()\n }\n\n onDrag({ x, y }) {\n if (!this.RenderObject) {\n return\n }\n const isValid = this.RenderObject.setPosition([x, y])\n if (isValid) {\n this.lastValidPosition = [x, y]\n }\n\n if (isValid !== this.wasLastDragValid) {\n this.RenderObject.setVisible(isValid)\n this.wasLastDragValid = isValid\n }\n\n this.props.onDrag({ isValid })\n }\n\n onDragFinish() {\n const { onDragFinish, update } = this.props\n\n if (onDragFinish) {\n onDragFinish()\n }\n\n if (update && this.lastValidPosition && this.lastValidPosition.length) {\n update({\n x: this.lastValidPosition[0],\n y: this.lastValidPosition[1],\n })\n this.RenderObject.setVisible(true)\n }\n if (this.RenderObject) {\n this.RenderObject.onDragFinish()\n }\n this.setState({ dragging: false })\n }\n\n onHoverStart() {\n const { isMagicWindow, isKiosk } = this.context\n if (isMagicWindow || isKiosk) {\n return\n }\n if (this.RenderObject) {\n this.RenderObject.onHover()\n }\n }\n\n onHoverEnd() {\n const { isMagicWindow, isKiosk } = this.context\n if (isMagicWindow || isKiosk) {\n return\n }\n if (this.RenderObject) {\n this.RenderObject.onHoverEnd()\n }\n }\n\n getRenderObject() {\n return this.RenderObject\n }\n\n updateObjectSelected() {\n if (this.RenderObject) {\n this.RenderObject.setSelected(this.props.renderItem.selected && !this.state.dragging)\n }\n }\n\n deleteRenderItem(e) {\n const {\n delete: del,\n renderItem: { selected },\n } = this.props\n if (del && selected && (e.keyCode === 8 || e.keyCode === 46)) {\n e.stopPropagation()\n e.preventDefault()\n del()\n }\n }\n\n renderCanvas(x, y) {\n if (!this.props.artImageData) {\n // Some async stuff still needs to come in\n // The state update will handle it\n return\n }\n\n const renderer = getRenderer()\n\n if (!this.RenderObject) {\n const { frame } = this.props.renderItem\n const { height } = this.props.renderItem.size\n\n this.RenderObject = new ArtItem(\n this.props.renderItem.uniqueId,\n renderer,\n [x, y],\n this.onRender,\n this.props.artImageData,\n frame,\n height,\n )\n this.updateObjectSelected()\n if (this.state.dragging) {\n this.RenderObject.onDragStart()\n }\n }\n }\n\n render() {\n const {\n delete: del,\n openSettings,\n isUnderCursor,\n renderItem,\n isCurrentDragValid,\n onSelect,\n t,\n disableDrag,\n revealDots,\n showDot,\n duplicate,\n } = this.props\n const { corners, dragging, loaded } = this.state\n const { isKiosk } = this.context\n\n const { x, y, selected, uniqueId, name, price, description, localItemNumber, region } = renderItem\n const trackingInfo = getProductTrackingInfo(renderItem)\n\n const renderer = getRenderer()\n if (!renderer) {\n return null\n }\n\n return (\n <>\n {!disableDrag && (\n \n {isKiosk ? null : (\n \n \n \n )}\n \n )}\n {selected && loaded && !dragging && (\n \n )}\n \n )\n }\n}\n\nCompositionArtItem.contextType = SugarcubeContext\nCompositionArtItem.defaultProps = {\n artImageData: null,\n delete: null,\n openSettings: null,\n onDragStart: null,\n onDragFinish: null,\n disableDrag: false,\n}\n\nCompositionArtItem.propTypes = {\n renderItem: artItemType.isRequired,\n artImageData: shape({}),\n isUnderCursor: bool.isRequired,\n\n delete: func,\n openSettings: func,\n update: func.isRequired,\n clearSwapAffinity: func.isRequired,\n duplicate: func.isRequired,\n\n onDragStart: func,\n onDragFinish: func,\n onDrag: func.isRequired,\n onSelect: func.isRequired,\n onLoad: func.isRequired,\n isCurrentDragValid: bool.isRequired,\n t: func.isRequired,\n isInitialLoading: bool.isRequired,\n disableDrag: bool,\n revealDots: bool.isRequired,\n showDot: bool.isRequired,\n}\n\nexport default withTranslation()(CompositionArtItem)\n","import * as Sentry from '@sentry/react'\nimport WallspiceWebgl from 'Renderer/WallspiceWebgl'\nimport RenderItem from 'Renderer/RenderItem'\n\nimport * as THREE from 'three'\nimport * as WallSnap from 'Renderer/WallSnap'\nimport isMobile from 'utils/isMobile'\n\nimport { DEFAULT_THREE_NATIVE_LAYER } from 'Renderer/constants'\n\nclass FurnitureItem extends RenderItem {\n constructor(id, renderer, position, onUpdate, furnitureData, updateReact) {\n super(id, renderer, position, true, onUpdate, updateReact)\n\n this.furnitureData = furnitureData\n\n this.parent = null\n this.planeId = null\n\n this.selected = false\n this.corners = null\n this.rotation = null\n this.orientation = furnitureData.heading\n this.tagPointLocal = new THREE.Vector3()\n\n this.layer = 1\n\n // Static stackable surfaces are assigned a separate rendering layer to isolate shadows\n this.ThreeNtvLayer = this.furnitureData.stacks && this.furnitureData.stackedPlane \n ? (this.Renderer.stackingPlanes.get(this.furnitureData.stackedPlane) || {}).ThreeNtvLayer\n : DEFAULT_THREE_NATIVE_LAYER\n\n this.tmpMat4 = new THREE.Matrix4()\n this.scalemat4 = new THREE.Matrix4()\n this.rotmat4 = new THREE.Matrix4()\n this.orientationmat4 = new THREE.Matrix4()\n\n this.marker = null\n this.boundingBox = null\n this.loadFurniture()\n this.planeIndex = null\n this.lastUpdateFraction = null\n\n if (this.furnitureData && this.furnitureData.stacks && this.furnitureData.stackedPlane) {\n this.initialSetPlane(this.furnitureData.stackedPlane, position)\n }\n this.position = position\n this.setPosition(position)\n\n // to handle visual and mouseover states\n this.isSelected = false\n this.isUnderMouse = false\n }\n\n getCorners() {\n return this.corners\n }\n\n getRotation() {\n return this.rotation\n }\n\n getOrientation() {\n return this.orientation\n }\n\n setOrientation(orientation) {\n const { wallCollisions } = this.Renderer.settings\n\n if( wallCollisions && ! this.isStackable() )\n {\n WallSnap.setOrientation(this, orientation)\n }\n else\n {\n this.orientation = orientation\n }\n\n this.update()\n }\n\n updateFurniture(furnitureData) {\n this.furnitureData = furnitureData\n this.loadFurniture()\n }\n\n initialSetPlane(planeId, position2d) {\n const surface = this.Renderer.getStackingSurface(planeId)\n if (!surface) {\n this.position = position2d // save for delayed initialization\n this.Renderer.addDelayedStackedLink(planeId, this)\n return\n }\n this.setPlane(planeId)\n }\n\n delayedSetPlane(planeId) {\n this.setPlane(planeId)\n this.setPosition(this.position)\n }\n\n setPlane(planeId, xy = null, modifyOutlineState = false) {\n // A missing planeId means that the stackable item is being\n // placed on the floor. In cases where the stackable\n // previously sat on furniture the caller is expected to\n // provide this function advanced notice of the object's new\n // `xy` position on the floor. This is so that physics\n // metadata for wall snapping can be intialized correctly. We\n // can't use a stale `xy` position and then have the caller\n // update us with the new `xy` position later. This could\n // produce an abrupt warp across the room which could cause\n // surprising wall collisions. Once the furniture item is\n // under the control of the physics system motion should\n // happen in small increments. The following block makes sure\n // that initPhysicsEntity() sees the object's new floor\n // position right away.\n //\n // TODO: It would be preferable to have initPhysicsEntity()\n // take a suite of parameters instead of reading data (such\n // as position) off of the RenderItem object directly. This\n // will be part of a coming wall snapping refactor. \n\n const noPlane = (planeId === null || planeId === undefined)\n\n if (noPlane && xy) {\n this.position = xy\n this.initPhysicsEntity()\n }\n\n this.stackedPlane = planeId\n \n const surface = this.Renderer.getStackingSurface(this.stackedPlane)\n this.ThreeNtvLayer = surface ? surface.ThreeNtvLayer : DEFAULT_THREE_NATIVE_LAYER \n this.renderObject.traverse(obj => obj.layers.set(this.ThreeNtvLayer))\n\n this.refreshParentSurface(modifyOutlineState)\n }\n\n addParentToHighlight() {\n const rootObject = this.findRootParent()\n if (!rootObject) {\n return\n }\n rootObject.isSelected = true\n if (rootObject.renderObject) {\n rootObject.renderObject.isSelected = rootObject.isSelected\n }\n rootObject.enableOutline()\n rootObject.updateOutlineThickness()\n }\n\n removeParentFromHighlight() {\n const rootObject = this.findRootParent()\n if (!rootObject) {\n return\n }\n rootObject.isSelected = false\n if (rootObject.renderObject) {\n rootObject.renderObject.isSelected = rootObject.isSelected\n }\n if (!rootObject.isUnderMouse) {\n rootObject.disableOutline()\n }\n rootObject.updateOutlineThickness()\n }\n\n refreshParentSurface(modifyOutlineState = false) {\n if (this.parent) {\n if (modifyOutlineState)\n this.removeParentFromHighlight()\n this.parent.removeChild(this)\n this.parent = null\n } else {\n this.Renderer.removeFromScene(this)\n }\n\n const surface = this.Renderer.getStackingSurface(this.stackedPlane)\n if (surface && surface.parent) {\n const parentItem = this.Renderer.getRenderItem(surface.parent.uniqueId)\n if (parentItem) {\n this.parent = parentItem\n parentItem.addChild(this)\n if (modifyOutlineState)\n this.addParentToHighlight()\n }\n } else {\n this.Renderer.addToScene(this)\n\n if (modifyOutlineState)\n this.addParentToHighlight()\n }\n }\n\n refreshCombinableParent() {\n if (!this.isCombinableChild()) {\n return\n }\n const parentItem = this.Renderer.getRenderItem(this.furnitureData.combinablePlacement.parentId)\n if (!parentItem) {\n return\n }\n\n // TODO: optimize to minimeze these \"recoursive\" calls\n if (parentItem.refreshCombinableParent) {\n parentItem.refreshCombinableParent()\n }\n\n if (this.parent) {\n this.parent.removeChild(this)\n this.parent = null\n } else {\n this.Renderer.removeFromScene(this)\n }\n this.parent = parentItem\n parentItem.addChild(this)\n this.Renderer.addToRenderItems(this)\n const matrix = new THREE.Matrix4()\n matrix.set(...this.furnitureData.combinablePlacement.localTransform)\n this.renderObject.matrix.identity()\n this.renderObject.applyMatrix4(matrix)\n this.renderObject.updateMatrixWorld()\n\n const rootParent = this.findRootParent()\n if (rootParent && rootParent.renderObject) {\n const prevMatrix = new THREE.Matrix4().copy(rootParent.renderObject.matrix)\n rootParent.renderObject.matrix.identity()\n rootParent.bbox.setFromObject(rootParent.renderObject)\n\n rootParent.renderObject.matrix.copy(prevMatrix)\n rootParent.renderObject.updateMatrixWorld()\n rootParent.update()\n }\n }\n\n addJustLoaded() {\n super.addJustLoaded()\n this.refreshParentSurface()\n this.refreshCombinableParent()\n if (this.isSelected) {\n this.onSelect()\n }\n }\n\n isStackable() {\n return (\n this.stackedPlane !== undefined\n && this.stackedPlane !== null\n )\n }\n\n isCombinableChild() {\n return this.furnitureData\n && this.furnitureData.combinablePlacement\n && this.furnitureData.combinablePlacement.parentId\n }\n\n setPosition(xy, options = {}) {\n const { wallCollisions } = this.Renderer.settings\n if (this.isStackable()) {\n this.setStackedPosition(xy, this.stackedPlane)\n } else if (wallCollisions) {\n WallSnap.setPosition(this, xy)\n } else if (!this.isCombinableChild()) {\n super.setPosition(xy, options)\n }\n\n this.update()\n return true\n }\n\n setStackedPosition(xy, stackedSurfaceId) {\n if (!Array.isArray(xy)) {\n return false\n }\n\n const surface = this.Renderer.getStackingSurface(stackedSurfaceId)\n if (!surface || !surface.renderObject) {\n return false\n }\n\n const renderDimensions = this.Renderer.getRenderDimensions()\n if (!renderDimensions) {\n return false\n }\n this.Renderer.setupRaycaster(xy[0] / renderDimensions[0], xy[1] / renderDimensions[1])\n const intersections = this.Renderer.raycaster.intersectObject(surface.renderObject)\n\n // TODO: temporary, calculate correct rotation\n const rot = surface.frame()\n\n if (intersections && intersections.length > 0) {\n let p = intersections[0].point\n if (this.parent) {\n p = this.parent.getObject().worldToLocal(p)\n }\n this.position = xy\n this.pose = {\n pos: [p.x, p.y, p.z],\n rot,\n scale: 1.0\n // depth,\n }\n return true\n }\n return false\n }\n\n setVisible(shouldBeVisible) {\n super.setVisible(shouldBeVisible)\n this.update()\n }\n\n setSelected(shouldBeSelected) {\n this.selected = shouldBeSelected\n this.update()\n }\n\n update(oneTimeRenderCallback = null) {\n if (!this.getObject()) {\n return\n }\n const { Renderer } = this\n\n if (this.isCombinableChild()) {\n this.getObject().updateMatrixWorld(true)\n const corners = WallspiceWebgl.projBoundBox(this.getObject().matrixWorld, this.bbox,\n this.Renderer.camera.projectionMatrix)\n this.onUpdate({\n corners,\n position: this.getPosition(),\n })\n Renderer.onChildUpdate(oneTimeRenderCallback)\n return\n }\n\n const pose = this.getPose()\n if (!pose) {\n Renderer.onChildUpdate(oneTimeRenderCallback)\n return\n }\n\n const rotation = pose.rot\n const position = pose.pos\n\n WallspiceWebgl.createMat4(rotation, position, this.tmpMat4)\n\n // this.orientationmat4.makeRotationZ(this.parent ? -this.orientation : this.orientation)\n this.orientationmat4.makeRotationZ(this.orientation)\n\n this.scalemat4.makeScale(this.furnitureData.scale, this.furnitureData.scale, this.furnitureData.scale)\n this.rotmat4.makeRotationX(this.furnitureData.rotX)\n\n this.tmpMat4.multiply(this.scalemat4)\n this.tmpMat4.multiply(this.orientationmat4)\n this.tmpMat4.multiply(this.rotmat4)\n\n this.getObject().matrix.copy(this.tmpMat4)\n this.getObject().updateMatrixWorld(true)\n\n const corners = WallspiceWebgl.projBoundBox(this.getObject().matrixWorld, this.bbox,\n this.Renderer.camera.projectionMatrix)\n\n const tagPointWorldCoords = this.renderObject.localToWorld(this.tagPointLocal.clone())\n const tagPoint = tagPointWorldCoords.project(this.Renderer.camera)\n tagPoint.x = Math.min(Math.max(tagPoint.x * 0.5 + 0.5, 0.025), 0.975) * 100\n tagPoint.y = Math.min(Math.max(1.0 - (tagPoint.y * 0.5 + 0.5), 0.05), 0.95) * 100\n\n this.rotation = pose.rot\n this.corners = corners\n\n if (this.planeIndex !== pose.planeIndex) {\n this.planeIndex = pose.planeIndex\n }\n\n Renderer.onChildUpdate(oneTimeRenderCallback)\n this.onUpdate({\n corners,\n tagPoint,\n position: this.getPosition(),\n })\n\n this.children.forEach((child) => {\n if (child.update) {\n child.update()\n }\n })\n }\n\n position3Dto2D() {\n const position = new THREE.Vector3()\n this.renderObject.getWorldPosition(position)\n\n const screenPos = position.project(this.Renderer.camera)\n screenPos.x = screenPos.x * 0.5 + 0.5\n screenPos.y = screenPos.y * 0.5 + 0.5\n screenPos.y = 1.0 - screenPos.y\n\n const renderDimensions = this.Renderer.getRenderDimensions()\n\n return {\n x: screenPos.x * renderDimensions[0],\n y: screenPos.y * renderDimensions[1]\n }\n }\n\n updateReactSide() {\n const { x, y } = this.position3Dto2D()\n this.position = [x, y]\n this.updateReact(x, y)\n }\n\n initPhysicsEntity() {\n const { wallCollisions } = this.Renderer.settings\n if (!wallCollisions) {\n return\n }\n const fd = this.furnitureData\n\n let sx = 0.5 / fd.scale\n let sz = 0.5 / fd.scale\n\n if (fd.min && fd.max) {\n sx = fd.max.x - fd.min.x\n sz = fd.max.z - fd.min.z\n }\n\n this.body = WallSnap.initBody(this, sx, sz)\n WallSnap.pushOut(this)\n }\n\n addPlaceholder() {\n this.placeholderGroup = new THREE.Group();\n\n let sx = 0.5 / this.furnitureData.scale\n let sy = 0.5 / this.furnitureData.scale\n let sz = 0.5 / this.furnitureData.scale\n if (this.furnitureData.min && this.furnitureData.max) {\n sx = this.furnitureData.max.x - this.furnitureData.min.x\n sy = this.furnitureData.max.y - this.furnitureData.min.y\n sz = this.furnitureData.max.z - this.furnitureData.min.z\n }\n const geometry = new THREE.BoxGeometry(sx, sy, sz)\n if (this.furnitureData.min) {\n geometry.translate(\n this.furnitureData.min.x + sx * 0.5,\n this.furnitureData.min.y + sy * 0.5,\n this.furnitureData.min.z + sz * 0.5,\n )\n } else {\n geometry.translate(0, 0.5 * sy, 0)\n }\n this.placeholder = new THREE.Mesh(geometry, new THREE.MeshPhongMaterial({\n color: 0xFFFFFF,\n emissive: 0x888888,\n opacity: 0.5,\n transparent: true,\n }))\n\n this.placeholder.matrixAutoUpdate = false\n this.placeholder.visible = this.visible\n this.placeholder.castShadow = false\n this.placeholder.receiveShadow = true\n\n this.bbox.makeEmpty()\n this.bbox.expandByObject(this.placeholder)\n\n this.placeholderGroup.name = this.name\n this.placeholderGroup.add(this.placeholder)\n this.placeholderGroup.matrixAutoUpdate = false\n this.placeholderGroup.visible = this.visible\n\n const marker = new THREE.Mesh(geometry, new THREE.MeshPhongMaterial({\n color: 0xFFFFFF,\n emissive: 0x888888,\n }))\n marker.name = 'marker'\n marker.castShadow = true\n marker.receiveShadow = true\n this.placeholderGroup.add(marker)\n\n this.placeholderGroup.traverse(obj => obj.layers.set(this.ThreeNtvLayer))\n\n this.marker = marker\n this.lastUpdateFraction = 0.0\n this.setObject(this.placeholderGroup)\n this.addToScene()\n this.updatePlaceholder(0.0)\n\n this.initPhysicsEntity()\n\n this.updateReact(...this.position)\n }\n\n updatePlaceholder(fraction) {\n const quantFraction = Math.floor(fraction * 10.0) / 10.0\n const limitedFraction = Math.max(0.001, Math.min(quantFraction, 0.9))\n\n if (limitedFraction !== this.lastUpdateFraction) {\n if (this.marker) {\n if (this.furnitureData.rotX === 0) {\n this.marker.scale.z = limitedFraction\n } else {\n this.marker.scale.y = limitedFraction\n }\n if(this.Renderer.settings.showItemLoaders){\n this.update()\n }\n }\n this.lastUpdateFraction = limitedFraction\n }\n }\n\n clearObject() {\n if (this.marker) {\n this.marker = null\n }\n if (this.parent) {\n this.parent.removeChild(this)\n }\n if (this.getObject()) {\n this.removeFromScene()\n this.unsetObject()\n }\n this.placeholderGroup = null\n }\n\n findRootParent() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let rootParent = this\n while(rootParent.parent) {\n rootParent = rootParent.parent\n }\n // found rootParent still supposed to have a parent itself, but maybe it's not ready yet\n if (rootParent.isCombinableChild()) {\n return null\n }\n return rootParent\n }\n\n onHover() {\n this.isUnderMouse = true\n\n const rootObject = this.findRootParent()\n if (!rootObject) {\n return\n }\n rootObject.enableOutline()\n rootObject.updateOutlineThickness()\n }\n\n onHoverEnd() {\n this.isUnderMouse = false\n const rootObject = this.findRootParent()\n if (!rootObject) {\n return\n }\n if (!rootObject.isSelected) {\n rootObject.disableOutline()\n }\n rootObject.updateOutlineThickness()\n }\n\n onSelect() {\n this.addParentToHighlight()\n }\n\n onSelectEnd() {\n this.removeParentFromHighlight()\n }\n\n updateOutlineThickness() {\n if (!this.Renderer) {\n return\n }\n // assuming here that hover+selcted can happen only when a single object is outlined,\n // muliple objects can't be selcted and hovered over at the same time\n this.Renderer.setThickOutline(this.isUnderMouse && this.isSelected)\n }\n\n initializeTagPointPosition() {\n // Initializes the white tag dot position in 3D local coordinates\n // Define utility values that are used along the point selection logic\n const leastItemHeight = 0.3\n const leastNonTableHeight = 0.6\n const furnitureItemHeight = this.bbox.max.y - this.bbox.min.y\n const maxIntersections = 10\n const maxSearchTrials = 5\n const intersectionShiftStep = 0.025\n const maxPointDistanceToCenter = furnitureItemHeight * 0.35\n\n // For very tall/short furniture items, the bbox center is used as the tag point\n if (this.isStackable() || furnitureItemHeight < leastItemHeight) {\n this.tagPointLocal = this.bbox.getCenter(new THREE.Vector3())\n return \n }\n\n // Calculate downward ray for intersection using the bbox dimensions\n const centerPointLocal = this.bbox.getCenter(new THREE.Vector3())\n const topPointLocal = centerPointLocal.clone().setY(this.bbox.max.y)\n const topPoint = this.renderObject.localToWorld(topPointLocal)\n \n // Note THREE.raycaster doesn't support intersecting object groups so they're split into child meshes\n const furnitureMeshList = this.renderObject.children\n .reduce((list, child) => [\n ...list, \n ...child instanceof THREE.Group ? child.children : [],\n ...child instanceof THREE.Mesh ? [child, ...child.children] : [],\n ], [])\n\n // Calculate intersection points of the downward ray with the furniture geometry\n // Note some furniture items have central holes so a proper search for the intersection surface is needed\n let trials = 0\n let intersections = []\n const searchCenter = topPoint.clone()\n const raycaster = new THREE.Raycaster(searchCenter, new THREE.Vector3(0, -1, 0))\n while (intersections.length < maxIntersections && trials <= maxSearchTrials) {\n searchCenter\n .setX(topPoint.x + (trials % 2 === 0 ? trials * intersectionShiftStep : 0))\n .setZ(topPoint.z + (trials % 2 === 0 ? 0 : trials * intersectionShiftStep))\n raycaster.set(searchCenter, raycaster.ray.direction)\n intersections.push(...raycaster.intersectObjects(furnitureMeshList).map(({ point }) => point))\n trials += 1\n }\n\n // Get the nearest intersection point to the furniture's center for relatively tall items\n // Note chairs and tables are excluded as their shape easily achieves the correct placement with the first intersection\n // Note far intersections from center are excluded for storageunits items since they lead to bad pin placements\n const centerPoint = this.renderObject.localToWorld(centerPointLocal)\n if (!this.furnitureData.hasTallLegs && furnitureItemHeight > leastNonTableHeight) {\n intersections.sort((a, b) => a.distanceTo(centerPoint) - b.distanceTo(centerPoint))\n }\n if (this.furnitureData.isCubicStructure) {\n intersections = intersections\n .filter(intersection => intersection.distanceTo(centerPoint) < maxPointDistanceToCenter)\n }\n\n // Save the intersection point, if any, in local coordinates\n this.tagPointLocal = intersections[0]\n ? centerPointLocal.clone().setY(this.renderObject.worldToLocal(intersections[0]).y)\n : centerPointLocal.clone()\n }\n\n resizeTextures(rootObject) {\n const textureMap = new Map()\n const textureSize = this.Renderer.maxTextureSize\n const processTexture = (texture) => {\n if (!texture || textureMap.has(texture.uuid)) {\n return\n }\n textureMap.set(texture.uuid, {\n old: texture,\n resized: this.Renderer.textureHelper.getResizedCopy(texture, textureSize, textureSize)\n })\n }\n const reassignTexture = (material, propertyName) => {\n if (!material[propertyName]) {\n return\n }\n const info = textureMap.get(material[propertyName].uuid)\n if (info && info.resized) {\n // eslint-disable-next-line no-param-reassign\n material[propertyName] = info.resized\n }\n }\n rootObject.traverse((child) => {\n if(!child.material) {\n return\n }\n processTexture(child.material.map)\n processTexture(child.material.normalMap)\n processTexture(child.material.roughnessMap)\n processTexture(child.material.metalnessMap)\n processTexture(child.material.aoMap)\n })\n rootObject.traverse((child) => {\n if (!child.material) {\n return\n }\n reassignTexture(child.material, 'map')\n reassignTexture(child.material, 'normalMap')\n reassignTexture(child.material, 'roughnessMap')\n reassignTexture(child.material, 'metalnessMap')\n reassignTexture(child.material, 'aoMap')\n })\n textureMap.forEach((value) => {\n value.old.dispose()\n if (value.old.image && value.old.image.close) {\n value.old.image.close()\n }\n })\n textureMap.clear()\n }\n\n async loadFurniture() {\n this.clearObject()\n this.addPlaceholder()\n\n this.metrics.msStartLoad = Date.now()\n\n // this.Renderer.furnitureLoader.loadFurniture(\n this.Renderer.furnitureManager.getGlb(\n this.furnitureData.modelUrl,\n (progress) => {\n // Either the model size or the total or the largest of loaded, 4mb\n const defaultSize = (progress.total || Math.max(4000000, progress.loaded))\n this.setLoadSize(defaultSize)\n\n // Progress is the uncompressed size so get the total from the model data\n const { uncompressedModelSize} = this.furnitureData\n const total = (uncompressedModelSize || defaultSize)\n this.updatePlaceholder(progress.loaded / total)\n },\n () => this.update(),\n this.Renderer,\n this.metrics\n ).then((furnishing) => {\n this.metrics.msEndLoad = Date.now()\n this.metrics.sLoadTime = (this.metrics.msEndLoad - this.metrics.msStartLoad) * 0.001\n /* eslint-disable no-param-reassign */\n furnishing.name = this.name\n furnishing.visible = this.visible\n furnishing.isFurniture = true\n furnishing.matrix.identity()\n furnishing.matrix.decompose(furnishing.position, furnishing.quaternion, furnishing.scale)\n furnishing.updateMatrixWorld(true)\n this.clearObject()\n\n // Item loading may be cancelled by the moment loading finished, the item might be already in deleted state\n // and the resources are already cleared by the CompositionItem's componentWillUnmount\n if (this.isDeleted) {\n this.metrics.msEndFlush = Date.now()\n this.metrics.sFlushTime = (this.metrics.msEndFlush - this.metrics.msEndLoad) * 0.001\n this.metrics.sTotalTime = (this.metrics.msEndFlush - this.metrics.msStartLoad) * 0.001\n return\n }\n\n if (isMobile()) {\n this.resizeTextures(furnishing)\n if (this.Renderer.ThreeWGLrenderer) {\n furnishing.traverse(obj => {\n obj.layers.set(this.ThreeNtvLayer)\n const keyCount = Object.keys(obj.material).length\n for (let i = 0; i < keyCount; i += 1) {\n const key = Object.keys(obj.material)[i];\n if (key.endsWith('map') && (obj.material[key] && obj.material[key].image)) {\n this.Renderer.ThreeWGLrenderer.initTexture(obj.material[key])\n delete obj.material[key].image\n }\n }\n })\n }\n }\n // ThreeJS saves the texture memory on RAM to allow future texture updates, so to reduce memory footprint we\n // force early upload the material maps to GPU, delete them from the RAM memory\n if (this.Renderer.ThreeWGLrenderer) {\n furnishing.traverse(obj => {\n obj.layers.set(this.ThreeNtvLayer)\n // Temporary workaround: some transparent glbs have base color map all black with \n // zero alpha, which zeroes the opacity value, same can happen if alphaMap is all black too.\n // Until glbs have proper transmmission setup, we'll aplly temporary value here.\n if (!(obj.material && obj.material.isMeshStandardMaterial)) return\n if (obj.material.transparent) {\n if (obj.material.alphaMap) {\n obj.material.alphaMap.dispose()\n obj.material.alphaMap = null\n }\n if (obj.material.map) {\n obj.material.map.dispose()\n obj.material.map = null\n }\n obj.material.opacity = 0.35\n }\n })\n }\n this.bbox.expandByObject(furnishing)\n this.boundingBox = WallspiceWebgl.createBoundingBox(this.bbox)\n this.boundingBox.visible = false\n furnishing.add(this.boundingBox)\n this.setObject(furnishing)\n this.addJustLoaded()\n this.initializeTagPointPosition()\n this.update(() => this.onUpdate({ metrics: this.metrics }))\n\n this.metrics.msEndFlush = Date.now()\n this.metrics.sFlushTime = (this.metrics.msEndFlush - this.metrics.msEndLoad) * 0.001\n this.metrics.sTotalTime = (this.metrics.msEndFlush - this.metrics.msStartLoad) * 0.001\n\n if (this.furnitureData.isRug) {\n furnishing.isFurniture = false\n this.isRug = true\n const childMeshes = []\n furnishing.traverse((child) => {\n if (!child.isMesh) {\n return\n }\n childMeshes.push(child)\n })\n childMeshes.forEach((child) => {\n const backsideMesh = child.clone()\n backsideMesh.scale.y *= 0.5\n backsideMesh.matrixAutoUpdate = true\n\n backsideMesh.material = new THREE.MeshStandardMaterial({\n map: child.material.map,\n color: child.material.color,\n normalMap: child.material.normalMap,\n metalness: child.material.metalness,\n roughness: child.material.roughness,\n metalnessMap: child.material.metalnessMap,\n roughnessMap: child.material.roughnessMap,\n aoMap: child.material.aoMap,\n\n stencilWrite: true,\n stencilFunc: THREE.AlwaysStencilFunc,\n stencilRef: 3,\n stencilFail: THREE.ReplaceStencilOp,\n stencilZFail: THREE.ReplaceStencilOp,\n stencilZPass: THREE.ReplaceStencilOp,\n })\n\n child.add(backsideMesh)\n child.material.stencilWrite = true\n child.material.stencilFunc = THREE.NotEqualStencilFunc\n child.material.stencilRef = 2\n })\n }\n }).catch((error) => {\n this.metrics.msEndLoad = Date.now()\n this.metrics.sLoadTime = (this.metrics.msEndLoad - this.metrics.msStartLoad) * 0.001\n this.metrics.failed = true\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error)\n this.metrics.errorMessage = error.message\n Sentry.captureException(new Error(error))\n }\n this.onUpdate({ metrics: this.metrics })\n })\n }\n\n endIsNigh() {\n if(this.parent) {\n this.parent.removeChild(this)\n }\n super.endIsNigh()\n }\n\n onDragStart() {\n super.onDragStart()\n\n if (this.stackedPlane) {\n const surface = this.Renderer.getStackingSurface(this.stackedPlane)\n if (surface) {\n surface.setHighlighted(true)\n }\n }\n }\n\n onDragFinish() {\n super.onDragFinish()\n\n if (this.stackedPlane) {\n const surface = this.Renderer.getStackingSurface(this.stackedPlane)\n if (surface) {\n surface.setHighlighted(false)\n }\n }\n }\n}\n\nexport default FurnitureItem\n","import React, { Component } from 'react'\nimport { func, bool } from 'prop-types'\nimport classNames from 'classnames'\n\nimport FurnitureItem from 'Renderer/FurnitureItem'\nimport { convertMeterDimensionsByLocale } from 'utils/convertDimensions'\nimport { workflow } from 'utils/tracker'\n\nimport { furnitureItemType } from 'models/propTypes'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { withTranslation } from 'react-i18next'\nimport Tooltip from 'components/Tooltip'\nimport ActionPanelContainer from 'containers/design/ActionPanelContainer'\nimport CompositionItemDraggable from 'components/CompositionItemDraggable'\nimport { LOCALES_USING_IMPERIAL_SYSTEM } from 'models/location/constants'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\nimport { getRenderer } from 'models/refStore/selectors'\n\nrequire('./CompositionFurnitureItem.scss')\n\nconst CM_SUFFIX = 'cm'\nconst INCHES_SUFFIX = '\"'\n\nclass CompositionFurnitureItem extends Component {\n static optionsMD(e) {\n // Stop the mouseDown if we're clicking\n // on options so that the dragStart doesn't\n // interfere\n e.stopPropagation()\n }\n\n constructor(props) {\n super(props)\n this.onRender = this.onRender.bind(this)\n this.updateFromRenderObject = this.updateFromRenderObject.bind(this)\n this.RenderObject = null\n this.aoeRef = React.createRef()\n\n this.onDragStart = this.onDragStart.bind(this)\n this.onDrag = this.onDrag.bind(this)\n this.onDragFinish = this.onDragFinish.bind(this)\n\n this.onHoverStart = this.onHoverStart.bind(this)\n this.onHoverEnd = this.onHoverEnd.bind(this)\n\n this.toggleRotate = this.toggleRotate.bind(this)\n this.enableRotate = this.enableRotate.bind(this)\n this.disableRotate = this.disableRotate.bind(this)\n this.deleteRenderItem = this.deleteRenderItem.bind(this)\n this.makeDimensionsLabel = this.makeDimensionsLabel.bind(this)\n this.getRenderObject = this.getRenderObject.bind(this)\n\n const {\n renderItem: {\n max: { x: maxX, y: maxY, z: maxZ },\n min: { x: minX, y: minY, z: minZ },\n scale,\n region,\n },\n } = props\n\n this.dimensions = {\n x: convertMeterDimensionsByLocale((maxX - minX) * scale, region),\n y: convertMeterDimensionsByLocale((maxY - minY) * scale, region),\n z: convertMeterDimensionsByLocale((maxZ - minZ) * scale, region),\n }\n\n this.state = {\n corners: null,\n tagPoint: { x: Infinity, y: Infinity },\n dragging: false,\n rotating: false,\n shiftkeyPressed: false,\n loaded: false,\n // Allow components to respond to item teleporting\n needsUpdatedCorners: true,\n }\n }\n\n componentDidMount() {\n const { renderItem } = this.props\n const renderer = getRenderer()\n this.RenderObject = new FurnitureItem(\n renderItem.uniqueId,\n renderer,\n [renderItem.x, renderItem.y],\n this.onRender,\n renderItem,\n this.updateFromRenderObject,\n )\n if (renderItem.selected) {\n this.RenderObject.onSelect()\n }\n\n window.addEventListener('keydown', this.enableRotate)\n window.addEventListener('keyup', this.disableRotate)\n window.addEventListener('keydown', this.deleteRenderItem)\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.dragging !== this.state.dragging) {\n this.RenderObject.setSelected(!this.state.dragging)\n }\n\n const prevPlaneId = prevProps.renderItem.stackedPlane\n const newPlaneId = this.props.renderItem.stackedPlane\n if (newPlaneId !== prevPlaneId) {\n const { x, y } = this.props.renderItem\n this.RenderObject.setPlane(newPlaneId, [x, y], true)\n }\n\n const { x: prevX, y: prevY } = prevProps.renderItem\n const { x, y } = this.props.renderItem\n if (x !== prevX || y !== prevY) {\n // Track that we're updating the position externally (item teleports)\n // then set the position\n this.setState({ needsUpdatedCorners: true }, () => {\n this.RenderObject.setPosition([x, y])\n })\n }\n\n const {\n renderItem: { selected },\n } = this.props\n const {\n renderItem: { selected: wasSelected },\n } = prevProps\n\n const isSwappingSurfaces = this.props.isSwappingSurfaces\n const prevSwappingSurfaces = prevProps.isSwappingSurfaces\n\n if (selected && isSwappingSurfaces !== prevSwappingSurfaces) {\n this.RenderObject.setVisible(!isSwappingSurfaces)\n }\n\n if (selected && !wasSelected) {\n this.RenderObject.onSelect()\n } else if (!selected && wasSelected) {\n this.RenderObject.onSelectEnd()\n }\n }\n\n componentWillUnmount() {\n if (this.RenderObject) {\n if (this.props.renderItem.selected) this.RenderObject.onSelectEnd()\n\n this.RenderObject.endIsNigh()\n this.RenderObject = null\n }\n window.removeEventListener('keydown', this.enableRotate)\n window.removeEventListener('keyup', this.disableRotate)\n window.removeEventListener('keydown', this.deleteRenderItem)\n }\n\n onRender({ corners, metrics, tagPoint }) {\n if (corners || tagPoint) {\n // TODO: investigate this condition need\n this.setState({ corners, tagPoint })\n\n // If we were waiting for corners, reset the state\n if (this.state.needsUpdatedCorners) {\n this.setState({ needsUpdatedCorners: false })\n }\n }\n if (metrics) {\n const { isInitialLoading, renderItem } = this.props\n const productTrackingInfo = getProductTrackingInfo(renderItem)\n workflow('DecorateRoom.AddProductLoadTime', {\n ...metrics,\n ...productTrackingInfo,\n LoadTime: metrics.sTotalTime,\n CompositionLoading: isInitialLoading,\n })\n this.setState({ loaded: true })\n this.props.onLoad(metrics)\n }\n }\n\n onDragStart(rotating = false) {\n const { renderItem, doShowPlaceableSurfaces, onDragStart } = this.props\n\n if (onDragStart) {\n onDragStart()\n }\n if (renderItem && renderItem.stackedPlane !== null) {\n doShowPlaceableSurfaces([renderItem.stackedPlane])\n }\n this.RenderObject.onDragStart()\n this.setState({ dragging: true, rotating })\n\n this.props.clearSwapAffinity()\n }\n\n onDrag(move) {\n const { x, y, heading, overrideHeading } = move\n\n if (this.state.rotating || this.state.shiftkeyPressed || overrideHeading) {\n this.RenderObject.setOrientation(heading)\n } else {\n const options = { enforceBounds: false }\n\n this.RenderObject.setPosition([x, y], options)\n\n this.props.onDrag({ isValid: true })\n }\n }\n\n onDragFinish() {\n const { renderItem, doHidePlaceableSurfaces, onDragFinish } = this.props\n\n if (onDragFinish) {\n onDragFinish()\n }\n\n const [x, y] = this.RenderObject.getPosition()\n const heading = this.RenderObject.getOrientation()\n\n const nextPosition = {}\n\n if (x !== renderItem.x || y !== renderItem.y) {\n nextPosition.x = x\n nextPosition.y = y\n }\n\n if (heading !== renderItem.heading) {\n nextPosition.heading = heading\n }\n\n if (Object.keys(nextPosition).length && this.props.update) {\n this.props.update(nextPosition)\n }\n\n this.RenderObject.onDragFinish()\n doHidePlaceableSurfaces()\n this.setState({ dragging: false, rotating: false })\n\n return nextPosition\n }\n\n onHoverStart() {\n const { isMagicWindow, isKiosk } = this.context\n if (isMagicWindow || isKiosk) {\n return\n }\n this.RenderObject.onHover()\n }\n\n onHoverEnd() {\n const { isMagicWindow, isKiosk } = this.context\n if (isMagicWindow || isKiosk) {\n return\n }\n this.RenderObject.onHoverEnd()\n }\n\n getRenderObject() {\n return this.RenderObject\n }\n\n updateFromRenderObject(x, y) {\n const { renderItem, update } = this.props\n update({ x, y, heading: renderItem.heading })\n }\n\n toggleRotate() {\n this.setState((prevState) => ({ rotating: !prevState.rotating }))\n }\n\n enableRotate(e) {\n if (e.keyCode === 16 && !this.state.shiftkeyPressed) {\n this.setState({ shiftkeyPressed: true })\n }\n }\n\n disableRotate(e) {\n if (e.keyCode === 16) {\n this.setState({ shiftkeyPressed: false })\n }\n }\n\n deleteRenderItem(e) {\n const {\n delete: del,\n renderItem: { selected },\n } = this.props\n if (selected && (e.keyCode === 8 || e.keyCode === 46)) {\n e.stopPropagation()\n e.preventDefault()\n del()\n }\n }\n\n makeDimensionsLabel() {\n const {\n renderItem: { region },\n } = this.props\n const { x, y, z } = this.dimensions\n const dimensionSymbol = LOCALES_USING_IMPERIAL_SYSTEM.includes(region) ? INCHES_SUFFIX : CM_SUFFIX\n return `L ${x}${dimensionSymbol}, W ${z}${dimensionSymbol}, H ${y}${dimensionSymbol}`\n }\n\n render() {\n const {\n delete: del,\n openSettings,\n isUnderCursor,\n renderItem,\n isCurrentDragValid,\n onSelect,\n t,\n disableDrag,\n onStartSwapStackableSurface,\n revealDots,\n showDot,\n isSwappingSurfaces,\n isDraggingRenderItem,\n duplicate,\n } = this.props\n\n const {\n x,\n y,\n heading,\n selected,\n uniqueId,\n name,\n price,\n description,\n isLeftMost,\n stacks,\n localItemNumber,\n region,\n isCombinableChild,\n } = renderItem\n const { rotating, shiftkeyPressed, corners, dragging, loaded, needsUpdatedCorners } = this.state\n\n const isInRotatingMode = rotating || shiftkeyPressed\n const dimensionsLabel = this.makeDimensionsLabel()\n\n const trackingInfo = getProductTrackingInfo(renderItem)\n\n const renderer = getRenderer()\n if (!renderer) {\n return null\n }\n\n const { isMobile, isKiosk } = this.context\n return (\n <>\n {!disableDrag && !isCombinableChild && (\n \n {isKiosk ? null : (\n \n \n {this.dimensions ? (\n
\n
\n {dimensionsLabel}\n
\n
\n ) : null}\n \n )}\n \n )}\n {!isMobile &&\n selected &&\n loaded &&\n !isSwappingSurfaces &&\n // TODO: Shouldn't need rotating in the corners check, but we run into a precision\n // issue in the check above which sets the needsUpdatedCorners state (x/y shouldn't change\n // when rotating)\n (!needsUpdatedCorners || rotating) &&\n (!isDraggingRenderItem || rotating) && (\n this.onDragStart(true)}\n onRotate={(h) => this.onDrag({ heading: h, overrideHeading: true })}\n onRotateFinish={this.onDragFinish}\n onDuplicate={duplicate}\n onChangeSurface={stacks ? onStartSwapStackableSurface : null}\n localItemNumber={localItemNumber}\n region={region}\n trackingInfo={trackingInfo}\n name={name}\n />\n )}\n \n )\n }\n}\n\nCompositionFurnitureItem.contextType = SugarcubeContext\nCompositionFurnitureItem.defaultProps = {\n delete: null,\n openSettings: null,\n disableDrag: false,\n onDrag: null,\n onDragStart: null,\n onDragFinish: null,\n onSelect: null,\n}\n\nCompositionFurnitureItem.propTypes = {\n renderItem: furnitureItemType.isRequired,\n isUnderCursor: bool.isRequired,\n\n delete: func,\n openSettings: func,\n update: func.isRequired,\n clearSwapAffinity: func.isRequired,\n duplicate: func.isRequired,\n\n onDragStart: func,\n onDragFinish: func,\n onDrag: func,\n onLoad: func.isRequired,\n onSelect: func,\n onStartSwapStackableSurface: func.isRequired,\n isCurrentDragValid: bool.isRequired,\n t: func.isRequired,\n doShowPlaceableSurfaces: func.isRequired,\n doHidePlaceableSurfaces: func.isRequired,\n\n disableDrag: bool,\n isSwappingSurfaces: bool.isRequired,\n isDraggingRenderItem: bool.isRequired,\n isInitialLoading: bool.isRequired,\n showDot: bool.isRequired,\n revealDots: bool.isRequired,\n}\n\nexport default withTranslation()(CompositionFurnitureItem)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { shape, func, number, bool, string } from 'prop-types'\n\nimport { renderItemType, previewSettingsType } from 'models/propTypes'\nimport { CONTEXT_QUICK } from 'constants/contexts'\nimport * as RenderItemTypes from 'constants/renderItemTypes'\n\nimport { getIsCurrentDragValid, getPreviewSettings, getInitialLoading } from 'models/preview/selectors'\nimport {\n getSelectedRenderItemId,\n getIsDraggingRenderItem,\n getSurfacesInteractive,\n getSwappingSurfaces,\n} from 'models/compositions/selectors'\n\nimport CompositionArtItem from 'components/CompositionArtItem'\nimport CompositionFurnitureItem from 'components/CompositionFurnitureItem'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nimport {\n deleteCompositionRenderItem,\n updateCompostitionRenderItem,\n selectCompositionRenderItem,\n renderItemLoaded,\n wallartItemLoaded,\n startSwapStackableSurface,\n clearSwapAffinity,\n startDragRenderItem,\n stopDragRenderItem,\n duplicateRenderItem as duplicateRenderItemAction,\n} from 'models/compositions/actions'\nimport { openDesignSidepanel } from 'models/ui/actions'\nimport { dragValidityChange, showPlaceableSurfaces, hidePlaceableSurfaces } from 'models/preview/actions'\nimport { selectFurniture } from 'models/furniture/actions'\nimport {\n PRODUCT_TYPE_WALLART,\n PRODUCT_TYPE_FURNITURE,\n TRASH_CAN,\n TRACKING_ADDED_FROM_DUPLICATE,\n} from 'models/tracking/constants'\n\nclass CompositionRenderItemContainer extends Component {\n constructor(props) {\n super(props)\n\n this.removeRenderItem = this.removeRenderItem.bind(this)\n this.updateRenderItem = this.updateRenderItem.bind(this)\n this.openSettings = this.openSettings.bind(this)\n this.selectRenderItem = this.selectRenderItem.bind(this)\n this.duplicateRenderItem = this.duplicateRenderItem.bind(this)\n\n this.onDrag = this.onDrag.bind(this)\n this.onDragStart = this.onDragStart.bind(this)\n this.onDragFinish = this.onDragFinish.bind(this)\n this.onLoad = this.onLoad.bind(this)\n }\n\n onDrag({ isValid }) {\n if (isValid !== this.props.isCurrentDragValid) {\n this.props.onDragValidityChange(isValid)\n }\n }\n\n onDragStart() {\n const { renderItem, doStartDragRenderItem } = this.props\n doStartDragRenderItem(renderItem.uniqueId)\n }\n\n onDragFinish() {\n const { doStopDragRenderItem } = this.props\n doStopDragRenderItem()\n }\n\n onLoad(metrics) {\n const { compositionId, renderItem, onRenderItemLoaded, onWallartItemLoaded } = this.props\n switch (renderItem.renderType) {\n case RenderItemTypes.ART_ITEM:\n onWallartItemLoaded(compositionId, renderItem.uniqueId, { metrics, readyAndRendered: true })\n break\n case RenderItemTypes.FURNITURE_ITEM:\n onRenderItemLoaded(compositionId, renderItem.uniqueId, { metrics, readyAndRendered: true })\n break\n default:\n break\n }\n }\n\n openSettings(accessFrom) {\n const { renderItem, openSettings, selectRenderItem, onSelectFurniture } = this.props\n const { id, uniqueId } = renderItem\n const productTrackingInfo = getProductTrackingInfo(renderItem)\n\n const trackingInfo = {\n ...productTrackingInfo,\n AccessFrom: accessFrom,\n }\n selectRenderItem(uniqueId, id)\n onSelectFurniture(id)\n openSettings(uniqueId, trackingInfo)\n }\n\n selectRenderItem(e) {\n e.stopPropagation()\n const {\n renderItem: { uniqueId, id },\n selectRenderItem,\n onSelectFurniture,\n } = this.props\n\n selectRenderItem(uniqueId, id)\n onSelectFurniture(id)\n }\n\n removeRenderItem() {\n const { compositionId, renderItem, deleteRenderItem } = this.props\n const productTrackingInfo = getProductTrackingInfo(renderItem)\n\n const trackingInfo = {\n ...productTrackingInfo,\n RemovedFrom: TRASH_CAN,\n }\n\n if (renderItem.renderType === RenderItemTypes.ART_ITEM) {\n trackingInfo.ProductType = PRODUCT_TYPE_WALLART\n } else {\n trackingInfo.ProductType = PRODUCT_TYPE_FURNITURE\n }\n deleteRenderItem(compositionId, renderItem.uniqueId, trackingInfo)\n }\n\n duplicateRenderItem() {\n const { renderItem, duplicateRenderItem } = this.props\n const { uniqueId, renderType } = renderItem\n const productTrackingInfo = getProductTrackingInfo(renderItem)\n\n const trackingInfo = {\n ...productTrackingInfo,\n AddedFrom: TRACKING_ADDED_FROM_DUPLICATE,\n }\n\n duplicateRenderItem(uniqueId, renderType, trackingInfo)\n }\n\n updateRenderItem(item) {\n const { compositionId, renderItem, updateRenderItem } = this.props\n const trackingInfo = getProductTrackingInfo(renderItem)\n\n if (item.x || item.y) {\n trackingInfo.OriginalPosition = { x: renderItem.x, y: renderItem.y }\n trackingInfo.FinalPosition = { x: item.x, y: item.y }\n }\n if (item.heading) {\n trackingInfo.OriginalOrientation = renderItem.heading\n trackingInfo.FinalOrientation = item.heading\n }\n updateRenderItem(compositionId, renderItem.uniqueId, item, trackingInfo)\n }\n\n clearSwapAffinity() {\n const { compositionId, renderItem } = this.props\n this.props.doClearSwapAffinity(compositionId, renderItem.uniqueId)\n }\n\n render() {\n const {\n customContext,\n renderItem,\n waitingSurfacesInteraction,\n previewSettings,\n revealDots,\n selectedRenderItem,\n } = this.props\n\n const isReg = customContext === CONTEXT_QUICK ? null : true\n\n const { isMobile } = this.context\n\n const showDot = revealDots || isMobile || !selectedRenderItem\n\n const onSelect = this.selectRenderItem\n const onDrag = isMobile ? null : this.onDrag\n const onDragStart = isMobile ? null : this.onDragStart\n const onDragFinish = isMobile ? null : this.onDragFinish\n\n const extraProps = {\n update: this.updateRenderItem,\n clearSwapAffinity: this.clearSwapAffinity.bind(this),\n delete: isReg && this.removeRenderItem,\n openSettings: this.openSettings,\n duplicate: this.duplicateRenderItem,\n onDrag,\n onDragStart,\n onDragFinish,\n onLoad: this.onLoad,\n onSelect,\n disableDrag: waitingSurfacesInteraction || previewSettings.magicEraserMode,\n showDot,\n }\n\n switch (renderItem.renderType) {\n case RenderItemTypes.ART_ITEM:\n return \n case RenderItemTypes.FURNITURE_ITEM:\n return \n default:\n return null\n }\n }\n}\n\nCompositionRenderItemContainer.contextType = SugarcubeContext\nCompositionRenderItemContainer.defaultProps = {\n artImageData: null,\n selectedRenderItem: null,\n}\n\nCompositionRenderItemContainer.propTypes = {\n renderItem: renderItemType.isRequired,\n artImageData: shape({}),\n compositionId: number.isRequired,\n isUnderCursor: bool.isRequired,\n customContext: string.isRequired,\n deleteRenderItem: func.isRequired,\n updateRenderItem: func.isRequired,\n doClearSwapAffinity: func.isRequired,\n openSettings: func.isRequired,\n selectRenderItem: func.isRequired,\n onDragValidityChange: func.isRequired,\n isCurrentDragValid: bool.isRequired,\n onSelectFurniture: func.isRequired,\n onRenderItemLoaded: func.isRequired,\n onWallartItemLoaded: func.isRequired,\n onStartSwapStackableSurface: func.isRequired,\n waitingSurfacesInteraction: bool.isRequired,\n doShowPlaceableSurfaces: func.isRequired,\n doHidePlaceableSurfaces: func.isRequired,\n isSwappingSurfaces: bool.isRequired,\n previewSettings: previewSettingsType.isRequired,\n revealDots: bool.isRequired,\n isInitialLoading: bool.isRequired,\n selectedRenderItem: number,\n doStartDragRenderItem: func.isRequired,\n doStopDragRenderItem: func.isRequired,\n duplicateRenderItem: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n isCurrentDragValid: getIsCurrentDragValid(state),\n selectedRenderItem: getSelectedRenderItemId(state),\n isDraggingRenderItem: getIsDraggingRenderItem(state),\n waitingSurfacesInteraction: getSurfacesInteractive(state),\n isSwappingSurfaces: getSwappingSurfaces(state),\n previewSettings: getPreviewSettings(state),\n isInitialLoading: getInitialLoading(state),\n})\n\nconst mapDispatchToProps = {\n deleteRenderItem: deleteCompositionRenderItem,\n updateRenderItem: updateCompostitionRenderItem,\n selectRenderItem: selectCompositionRenderItem,\n duplicateRenderItem: duplicateRenderItemAction,\n doClearSwapAffinity: clearSwapAffinity,\n openSettings: openDesignSidepanel,\n onDragValidityChange: dragValidityChange,\n onSelectFurniture: selectFurniture,\n onRenderItemLoaded: renderItemLoaded,\n onWallartItemLoaded: wallartItemLoaded,\n onStartSwapStackableSurface: startSwapStackableSurface,\n doShowPlaceableSurfaces: showPlaceableSurfaces,\n doHidePlaceableSurfaces: hidePlaceableSurfaces,\n doStartDragRenderItem: startDragRenderItem,\n doStopDragRenderItem: stopDragRenderItem,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CompositionRenderItemContainer)\n","export const CONTEXT_DEFAULT = 'CONTEXT_DEFAULT'\nexport const CONTEXT_QUICK = 'CONTEXT_QUICK'\nexport const CONTEXT_IOS = 'CONTEXT_IOS'\n","import * as THREE from 'three'\n\nimport RenderItem from 'Renderer/RenderItem'\n\nclass GhostItem extends RenderItem {\n constructor(id, renderer, parent, onUpdate, planeId) {\n super(id, renderer)\n\n this.onUpdate = onUpdate\n\n this.parent = parent\n this.furnitureData = null\n this.planeId = planeId\n\n this.visible = false\n this.geometry = null\n this.renderObject = null\n\n this.material = null\n this.bbox = new THREE.Box3()\n }\n\n setFurnitureData(furnitureData) {\n if (this.furnitureData && \n furnitureData &&\n this.furnitureData.id === furnitureData.id) {\n return\n }\n\n this.furnitureData = furnitureData\n this.recreateRenderObject()\n }\n\n setVisible(visible) {\n if (visible === this.visible || !this.renderObject) {\n return\n }\n\n this.visible = visible\n this.renderObject.visible = visible\n this.Renderer.onChildUpdate()\n\n this.onUpdate({\n corners: this.projectBBox(),\n })\n }\n\n projectBBox() {\n const boxCorners = [\n new THREE.Vector3(this.bbox.min.x, this.bbox.max.y, this.bbox.max.z),\n new THREE.Vector3(this.bbox.min.x, this.bbox.min.y, this.bbox.max.z),\n new THREE.Vector3(this.bbox.min.x, this.bbox.min.y, this.bbox.min.z),\n new THREE.Vector3(this.bbox.min.x, this.bbox.max.y, this.bbox.min.z),\n new THREE.Vector3(this.bbox.max.x, this.bbox.max.y, this.bbox.max.z),\n new THREE.Vector3(this.bbox.max.x, this.bbox.min.y, this.bbox.max.z),\n new THREE.Vector3(this.bbox.max.x, this.bbox.min.y, this.bbox.min.z),\n new THREE.Vector3(this.bbox.max.x, this.bbox.max.y, this.bbox.min.z),\n ]\n .map(position => position.project(this.Renderer.camera))\n .map(position => \n new THREE.Vector2(position.x * 0.5 + 0.5, position.y * 0.5 + 0.5))\n\n let minX = 9999\n let maxX = -9999\n let minY = 9999\n let maxY = -9999\n for (let i = 0; i < boxCorners.length; i += 1) {\n minX = Math.min(minX, boxCorners[i].x)\n maxX = Math.max(maxX, boxCorners[i].x)\n minY = Math.min(minY, boxCorners[i].y)\n maxY = Math.max(maxY, boxCorners[i].y)\n }\n return [minX, maxX, minY, maxY]\n }\n\n recreateRenderObject() {\n this.clearRenderObject()\n\n let sx = 0.5 / this.furnitureData.scale\n let sy = 0.5 / this.furnitureData.scale\n let sz = 0.5 / this.furnitureData.scale\n if (this.furnitureData.min && this.furnitureData.max) {\n sx = this.furnitureData.max.x - this.furnitureData.min.x\n sy = this.furnitureData.max.y - this.furnitureData.min.y\n sz = this.furnitureData.max.z - this.furnitureData.min.z\n }\n this.geometry = new THREE.BoxGeometry(sx, sy, sz)\n if (this.furnitureData.min) {\n this.geometry.translate(\n this.furnitureData.min.x + sx * 0.5,\n this.furnitureData.min.y + sy * 0.5,\n this.furnitureData.min.z + sz * 0.5,\n )\n } else {\n this.geometry.translate(0, 0.5 * sy, 0)\n }\n\n this.material = new THREE.MeshPhongMaterial({\n color: 0xFFFFFF,\n emissive: 0x888888,\n })\n this.renderObject = new THREE.Mesh(this.geometry, this.material)\n\n this.renderObject.matrixAutoUpdate = false\n this.renderObject.matrix.scale(new THREE.Vector3(this.furnitureData.scale, \n this.furnitureData.scale, this.furnitureData.scale))\n this.renderObject.matrix.multiply(new THREE.Matrix4().makeRotationX(this.furnitureData.rotX))\n\n if (this.parent) {\n this.parent.addChild(this)\n }\n this.renderObject.updateWorldMatrix()\n\n this.bbox.makeEmpty()\n this.bbox.expandByObject(this.renderObject)\n }\n\n clearRenderObject() {\n if (this.renderObject && this.parent) {\n this.parent.removeChild(this)\n }\n\n this.renderObject = null\n\n if (this.geometry) {\n this.geometry.dispose()\n }\n this.geometry = null\n }\n\n setPosition(xy) {\n if (this.planeId === null) {\n return\n }\n\n const surface = this.Renderer.getStackingSurface(this.planeId)\n if (!surface) {\n return\n }\n\n const renderDimensions = this.Renderer.getRenderDimensions()\n this.Renderer.setupRaycaster(xy[0] / renderDimensions[0], xy[1] / renderDimensions[1])\n const intersections = this.Renderer.raycaster.intersectObject(surface.renderObject)\n\n if (intersections && intersections.length > 0) {\n let p = intersections[0].point\n if (this.parent) {\n p = this.parent.getObject().worldToLocal(p)\n\n this.renderObject.matrix.makeTranslation(p.x, p.y, p.z)\n this.renderObject.matrix.scale(new THREE.Vector3(this.furnitureData.scale, \n this.furnitureData.scale, this.furnitureData.scale))\n this.renderObject.matrix.multiply(new THREE.Matrix4().makeRotationX(this.furnitureData.rotX))\n this.getObject().updateWorldMatrix()\n\n this.bbox.makeEmpty()\n this.bbox.expandByObject(this.renderObject)\n this.onUpdate({\n corners: this.projectBBox(),\n })\n this.Renderer.onChildUpdate()\n }\n }\n }\n}\n\nexport default GhostItem","import * as THREE from 'three'\n\nimport RenderItem from 'Renderer/RenderItem'\nimport GhostItem from 'Renderer/GhostItem'\n\nimport Fading from 'utils/fading'\n\nimport { DEFAULT_THREE_NATIVE_LAYER, STATIC_STACKABLES_THREE_NATIVE_LAYER } from 'Renderer/constants'\n\nconst fullOpacity = 0.75\nconst defaultColor = new THREE.Color(0x4595FF)\nconst highlightColor = new THREE.Color(0x0A8A00)\n\nclass StackableSurfaceItem extends RenderItem {\n constructor(id, renderer, plane, parent, onGhostRender) {\n super(id, renderer)\n\n this.plane = plane\n\n this.parent = parent\n this.onGhostRender = onGhostRender\n\n // Static stackable surfaces are assigned a separate rendering layer to isolate shadows\n this.ThreeNtvLayer = parent ? DEFAULT_THREE_NATIVE_LAYER : STATIC_STACKABLES_THREE_NATIVE_LAYER\n\n this.highlighted = false\n this.layer = 1\n this.renderer = renderer\n this.createThreeObject()\n\n const planeId = this.plane && this.plane.id\n this.ghost = new GhostItem(id, renderer, this, onGhostRender, planeId)\n }\n\n createThreeObject() {\n if (!this.renderer) {\n return\n }\n\n let geometry\n\n const { type } = this.plane.parameters\n\n if( type === \"circle\" ) {\n const { radius } = this.plane.parameters\n geometry = new THREE.CircleGeometry(radius, 32)\n }\n else if( type === \"polygon\" ){\n geometry = new THREE.BufferGeometry()\n\n const points = this.plane.parameters.vertices.map(\n point => new THREE.Vector2(point[0], point[1])\n )\n\n geometry.vertices = points\n\n const triangles = THREE.ShapeUtils.triangulateShape(points, [])\n const positions = []\n const normals = []\n\n triangles.forEach(triangle => {\n const p0 = points[triangle[0]]\n const p1 = points[triangle[1]]\n const p2 = points[triangle[2]]\n\n positions.push(p0.x)\n positions.push(p0.y)\n positions.push(0)\n\n positions.push(p1.x)\n positions.push(p1.y)\n positions.push(0)\n\n positions.push(p2.x)\n positions.push(p2.y)\n positions.push(0)\n\n normals.push(0, 0, 1)\n normals.push(0, 0, 1)\n normals.push(0, 0, 1)\n })\n\n geometry.setAttribute(\n 'position',\n new THREE.BufferAttribute(\n new Float32Array(positions), 3))\n\n geometry.setAttribute(\n 'normal',\n new THREE.BufferAttribute(\n new Float32Array(normals), 3))\n }\n\n this.material = new THREE.MeshBasicMaterial({\n color: defaultColor,\n side: THREE.DoubleSide,\n transparent: true,\n depthWrite: false,\n opacity: 1.0,\n })\n\n this.renderObject = new THREE.Mesh(geometry, this.material)\n this.renderObject.name = `StackablePlane${this.id}`\n this.renderObject.stackablePlaneId = this.id\n\n this.renderObject.userData.isStaticSurface = ! this.parent\n\n if (!this.parent) {\n // Add a shadow layer to static stackable surfaces since they have not a virtual object\n const shadowPlane = this.renderObject.clone()\n shadowPlane.receiveShadow = true\n shadowPlane.material = new THREE.ShadowMaterial()\n shadowPlane.material.opacity = 0.3\n shadowPlane.material.depthWrite = false\n shadowPlane.layers.set(this.ThreeNtvLayer)\n this.renderObject.add(shadowPlane)\n }\n\n const t = this.plane.transform\n const depthDelta = 0.0035\n\n const mat = new THREE.Matrix4().set(\n t[0][0], t[0][1], t[0][2], t[0][3],\n t[1][0], t[1][1], t[1][2], t[1][3] + depthDelta,\n t[2][0], t[2][1], t[2][2], t[2][3],\n 0, 0, 0, 1)\n\n this.renderObject.applyMatrix4(mat)\n\n if (this.parent) {\n const parentItem = this.renderer.getRenderItem(this.parent.uniqueId)\n if (parentItem) {\n parentItem.addChild(this)\n }\n }\n\n this.renderObject.updateMatrixWorld()\n this.renderer.addStackingSurface(this)\n }\n\n frame() {\n const t = this.plane.transform\n\n return [\n [ t[0][0], t[1][0], t[2][0] ],\n [ t[0][1], t[1][1], t[2][1] ],\n [ t[0][2], t[1][2], t[2][2] ]\n ]\n }\n\n // eslint-disable-next-line class-methods-use-this\n setPosition() {}\n\n setVisible(visible) {\n if (visible === this.visible || !this.renderObject) {\n return\n }\n\n this.visible = visible\n if (visible) { // if not, object will need to fade out first\n this.highlighted = false\n this.material.color = defaultColor\n }\n\n this.startFade(visible)\n this.Renderer.onChildUpdate()\n }\n\n startFade(isFadeIn) {\n if (!this.material) {\n return\n }\n // easeOutExp\n const ease = isFadeIn ? \n (t) => 1 - 2 ** (-10 * t) :\n (t) => 2 ** (10 * t - 10)\n\n let totalTime = 0.75\n if (this.material.appearFading) {\n totalTime *= this.material.appearFading.t\n this.material.appearFading.stop()\n }\n\n this.material.appearFading = new Fading(totalTime,\n (t) => {\n const timeFactor = isFadeIn ? t : (1.0 - t)\n this.material.opacity = fullOpacity * ease(timeFactor)\n this.Renderer.onChildUpdate()\n },\n () => {\n this.material.appearFading = null\n }\n )\n }\n\n setHighlighted(highlight) {\n if (this.highlighted === highlight) {\n return\n }\n if (!this.Renderer || !this.material) {\n return\n }\n\n this.highlighted = highlight\n\n const startColor = new THREE.Color().copy(this.material.color)\n const targetColor = new THREE.Color().copy(highlight ? highlightColor : defaultColor)\n // this.material.color = color\n // this.Renderer.onChildUpdate()\n\n const ease = (t) => 1 - 2 ** (-10 * t)\n let totalTime = 0.75\n if (this.material.highlightFading) {\n totalTime *= this.material.highlightFading.t\n this.material.highlightFading.stop()\n }\n this.material.highlightFading = new Fading(totalTime,\n (t) => {\n this.material.color = startColor.lerp(targetColor, ease(t))\n this.Renderer.onChildUpdate()\n },\n () => {\n this.material.highlightFading = null\n this.material.color = targetColor\n this.Renderer.onChildUpdate()\n }\n )\n }\n\n showGhost(furnitureData) {\n if (!furnitureData ) {\n return\n }\n if (this.ghost && this.ghost.visible) {\n return\n }\n this.ghost.setFurnitureData(furnitureData)\n this.ghost.setVisible(true)\n }\n\n hideGhost() {\n this.ghost.setVisible(false)\n }\n\n setGhostPosition(xy) {\n this.ghost.setPosition(xy)\n }\n\n endIsNigh() {\n if (this.material) {\n if (this.material.appearFading) {\n this.material.appearFading.stop()\n this.material.appearFading = null\n }\n if (this.material.highlightFading) {\n this.material.highlightFading.stop()\n this.material.highlightFading = null\n }\n this.material.dispose()\n this.material = null\n }\n super.endIsNigh()\n }\n}\n\nexport default StackableSurfaceItem\n","import React, { useRef, useEffect, useState } from 'react'\nimport { bool, number, shape } from 'prop-types'\n\nimport classNames from 'classnames'\n\nimport StackableSurfaceItem from 'Renderer/StackableSurfaceItem'\nimport { stackableSurfaceItemType, renderItemType, furnitureItemType } from 'models/propTypes'\nimport Icon from 'components/uiElements/Icon'\n\nimport { getRenderer } from 'models/refStore/selectors'\n\nrequire('./CompositionStackableSurfaceItem.scss')\n\nconst CompositionStackableSurfaceItem = ({\n parent,\n plane,\n visible,\n highlight,\n incomingFurnitureData,\n selectedRenderItem,\n mouseOverCoords,\n}) => {\n const renderObjectRef = useRef(null)\n\n const defaultCorners = {\n left: 0,\n right: 0,\n }\n const [corners, setCorners] = useState(defaultCorners)\n\n const onGhostRender = ({ corners: itemCorners }) => {\n if (!itemCorners) {\n return\n }\n\n const left = itemCorners[0] * 100\n const right = itemCorners[1] * 100\n const top = itemCorners[2] * 100\n const bottom = itemCorners[3] * 100\n\n const minSizeX = 2.5 // %\n const minSizeY = 5 // %\n\n let paddingX = 0\n let paddingY = 0\n if (bottom - top < minSizeY) {\n paddingY = (minSizeY - (bottom - top)) / 2\n }\n if (right - left < minSizeX) {\n paddingX = (minSizeX - (right - left)) / 2\n }\n\n setCorners({\n top: Math.max(0, top - paddingY),\n bottom: Math.max(0, 100 - bottom - paddingY),\n left: Math.max(0, left - paddingX),\n right: Math.max(0, 100 - right - paddingX),\n })\n }\n\n useEffect(() => {\n const renderer = getRenderer()\n if (renderer) {\n renderObjectRef.current = new StackableSurfaceItem(plane.id, renderer, plane, parent, onGhostRender)\n renderObjectRef.current.setVisible(false)\n }\n return () => {\n if (renderObjectRef.current) {\n renderObjectRef.current.endIsNigh()\n renderObjectRef.current = null\n }\n }\n }, [parent && parent.uniqueId, plane && plane.id])\n\n useEffect(() => {\n if (!renderObjectRef.current) {\n return\n }\n renderObjectRef.current.setVisible(visible)\n }, [visible])\n\n useEffect(() => {\n if (!renderObjectRef.current) {\n return\n }\n renderObjectRef.current.setHighlighted(highlight)\n }, [highlight])\n\n useEffect(() => {\n if (!renderObjectRef.current) {\n return\n }\n if (highlight && visible) {\n renderObjectRef.current.showGhost(incomingFurnitureData || selectedRenderItem)\n } else {\n renderObjectRef.current.hideGhost()\n }\n }, [visible, highlight, incomingFurnitureData, selectedRenderItem])\n\n useEffect(() => {\n if (!renderObjectRef.current) {\n return\n }\n if (highlight && visible && mouseOverCoords !== null) {\n renderObjectRef.current.setGhostPosition([mouseOverCoords.x, mouseOverCoords.y])\n }\n }, [visible, highlight, mouseOverCoords])\n\n const boxStyle = {\n left: corners.left && `${corners.left}%`,\n bottom: corners.top && `${corners.top}%`,\n right: corners.right && `${corners.right}%`,\n top: corners.bottom && `${corners.bottom}%`,\n }\n\n const iconVisible = highlight && visible\n return (\n
\n \n
\n )\n}\n\nCompositionStackableSurfaceItem.defaultProps = {\n visible: false,\n highlight: false,\n parent: null,\n incomingFurnitureData: null,\n selectedRenderItem: null,\n mouseOverCoords: null,\n}\n\nCompositionStackableSurfaceItem.propTypes = {\n plane: stackableSurfaceItemType.isRequired,\n visible: bool,\n highlight: bool,\n parent: renderItemType,\n incomingFurnitureData: furnitureItemType,\n selectedRenderItem: renderItemType,\n mouseOverCoords: shape({ x: number, y: number }),\n}\n\nexport default CompositionStackableSurfaceItem\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { bool } from 'prop-types'\n\nimport { stackableSurfaceItemType, renderItemType, furnitureItemType } from 'models/propTypes'\n\nimport { getNextStackableFurnitureData, getSelectedRenderItem } from 'models/compositions/selectors'\n\nimport CompositionStackableSurfaceItem from 'components/CompositionStackableSurfaceItem'\n\nconst CompositionStackableSurfaceItemContainer = (props) => \n\nCompositionStackableSurfaceItemContainer.defaultProps = {\n visible: false,\n highlight: false,\n parent: null,\n incomingFurnitureData: null,\n selectedRenderItem: null,\n}\n\nCompositionStackableSurfaceItemContainer.propTypes = {\n plane: stackableSurfaceItemType.isRequired,\n visible: bool,\n highlight: bool,\n parent: renderItemType,\n incomingFurnitureData: furnitureItemType,\n selectedRenderItem: renderItemType,\n}\n\nconst mapStateToProps = (state) => ({\n incomingFurnitureData: getNextStackableFurnitureData(state),\n selectedRenderItem: getSelectedRenderItem(state),\n})\n\nconst mapDispatchToProps = {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CompositionStackableSurfaceItemContainer)\n","import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport { number, string, func, arrayOf } from 'prop-types'\nimport { wallColorsType, wallMarkerType } from 'models/propTypes'\nimport { getRenderer } from 'models/refStore/selectors'\n\nimport classNames from 'classnames'\n\nrequire('./WallPaintPin.scss')\n\nconst RIGHT_SIDE_BUFFER = 48 // Pixels - 3rem\n\nconst rgbArrayToHex = (color) =>\n `#${color\n .slice(0, 3)\n .map((channel) => {\n const hex = channel.toString(16)\n return hex.length === 1 ? `0${hex}` : hex\n })\n .join('')}`\n\n// https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx\nconst rbgToBrightness = (colorOpt) =>\n colorOpt ? (colorOpt[0] * 299 + colorOpt[1] * 587 + colorOpt[2] * 114) / 1000 : 255\n\nconst WallPaintPin = ({ planeIndices, color, setColor, compositionId, wallMarker, colorsList, onPinInteract }) => {\n const containerRef = useRef()\n const pickerRef = useRef()\n const [renderLeft, setRenderLeft] = useState(false)\n\n const reposition = useCallback(() => {\n // Set renderLeft true if there isn't enough space for the\n // picker on the right of the dot\n const { offsetWidth: pickerWidth } = pickerRef.current\n const { offsetWidth: containerWidth } = containerRef.current\n const spaceRight = containerWidth * ((100 - wallMarker[0]) / 100)\n setRenderLeft(spaceRight <= pickerWidth + RIGHT_SIDE_BUFFER)\n }, [wallMarker])\n\n useEffect(() => {\n const renderer = getRenderer()\n if (renderer && renderer.compositeBg) {\n planeIndices.forEach((planeIndex) => renderer.compositeBg.setPlaneColor(planeIndex, color, true))\n }\n }, [color])\n\n useEffect(reposition, [wallMarker])\n useEffect(() => {\n window.addEventListener('resize', reposition)\n return () => {\n window.removeEventListener('resize', reposition)\n }\n }, [wallMarker])\n\n if (!Array.isArray(colorsList) || colorsList.length === 0 || !Array.isArray(wallMarker) || wallMarker.length < 2) {\n return null\n }\n\n const setColorWrapped = (colorString) => {\n const timestamp = Date.now() // For analytics to sync the individual events\n planeIndices.forEach((planeIndex) => {\n setColor(compositionId, planeIndex, colorString, { timestamp })\n })\n }\n\n const dotStyle = {\n left: `${wallMarker[0]}%`,\n top: `${wallMarker[1]}%`,\n }\n\n const colors = []\n const colorBrightness = {}\n colorsList.forEach((rgb) => {\n const hex = rgbArrayToHex(rgb)\n colors.push(hex)\n colorBrightness[hex] = rbgToBrightness(rgb)\n })\n\n // Option to unset the color\n if (renderLeft) {\n if (colors.length >= 5) {\n colors.splice(5, 0, null)\n } else {\n colors.push(null)\n }\n } else {\n colors.unshift(null)\n }\n\n const colorOptions = colors.map((colorOpt) => {\n const selected = colorOpt === color\n const brightness = colorBrightness[colorOpt]\n const checkmarkColor = brightness > 192 ? '#111' : `white`\n\n return (\n {\n e.stopPropagation()\n setColorWrapped(colorOpt)\n }}\n >\n 225 : true,\n })}\n style={{ backgroundColor: colorOpt || 'white' }}\n />\n
\n {colorOpt && selected && (\n
\n \n \n \n
\n )}\n {!colorOpt &&
}\n
\n )\n })\n\n return (\n
\n onPinInteract(true)}\n onMouseLeave={() => onPinInteract(false)}\n >\n
\n
\n
\n {colorOptions}\n
\n
\n
\n
\n )\n}\n\nWallPaintPin.defaultProps = {\n color: null,\n wallMarker: null,\n colorsList: null,\n}\n\nWallPaintPin.propTypes = {\n planeIndices: arrayOf(number).isRequired,\n color: string,\n setColor: func.isRequired,\n compositionId: number.isRequired,\n wallMarker: wallMarkerType,\n colorsList: wallColorsType,\n onPinInteract: func.isRequired,\n}\n\nexport default WallPaintPin\n","import React, { useCallback } from 'react'\nimport { connect } from 'react-redux'\nimport { number, func } from 'prop-types'\n\nimport {\n wallColorsType,\n scenePlanesType,\n wallMarkersType,\n compositionType,\n trackingRoomInfoType,\n} from 'models/propTypes'\nimport { hover } from 'utils/tracker'\n\nimport {\n getSelectedComposition,\n getSelectedCompositionId,\n getSelectedCompositionTrackingRoomInfo,\n getSelectedRenderItemId,\n} from 'models/compositions/selectors'\nimport {\n getSelectedSceneWalls,\n getSelectedSceneWallColorsList,\n getSelectedSceneWallMarkers,\n} from 'models/scenes/selectors'\nimport { setWallColor } from 'models/compositions/actions'\n\nimport WallPaintPin from 'components/WallPaintPin'\n\nconst WallPaintPinContainer = ({\n composition,\n compositionId,\n setColor,\n scenePlanes,\n wallColors,\n wallMarkers,\n wallWidth,\n wallHeight,\n roomInfo,\n selectedRenderItem,\n}) => {\n const onPinInteract = useCallback(\n (opening) => {\n // Track opening/closing the color selector\n // Selection is tracked in middleware\n // eslint-disable-next-line i18next/no-literal-string\n const eventname = `DecorateRoom.WallColor.${opening ? 'Open' : 'Dismiss'}`\n hover(eventname, roomInfo)\n },\n [roomInfo],\n )\n\n if (\n !scenePlanes ||\n !composition ||\n !composition.wallPaint ||\n !scenePlanes ||\n !wallMarkers ||\n wallMarkers.length === 0\n ) {\n return null\n }\n const planeIndices = scenePlanes.map((plane) => plane.planeIdx)\n if (!wallMarkers[planeIndices[0]]) {\n return null\n }\n\n const wallPaint = composition.wallPaint\n // assuming for now, that all walls are always of the same color\n const singleWallColor = wallPaint[planeIndices[0] || 0] || null\n const singleWallMarker = [\n (100 * wallMarkers[planeIndices[0]][0]) / wallWidth,\n (100 * wallMarkers[planeIndices[0]][1]) / wallHeight,\n ]\n\n // Hide wall paint pin when a product is selected\n const hidePin = !!selectedRenderItem\n if (hidePin) {\n return null\n }\n\n return (\n \n )\n}\n\nWallPaintPinContainer.defaultProps = {\n composition: null,\n scenePlanes: null,\n wallColors: null,\n wallMarkers: null,\n wallWidth: null,\n wallHeight: null,\n selectedRenderItem: null,\n}\n\nWallPaintPinContainer.propTypes = {\n composition: compositionType,\n compositionId: number.isRequired,\n setColor: func.isRequired,\n scenePlanes: scenePlanesType,\n wallColors: wallColorsType,\n wallMarkers: wallMarkersType,\n wallWidth: number,\n wallHeight: number,\n roomInfo: trackingRoomInfoType.isRequired,\n selectedRenderItem: number,\n}\n\nconst mapStateToProps = (state) => ({\n composition: getSelectedComposition(state),\n compositionId: getSelectedCompositionId(state),\n scenePlanes: getSelectedSceneWalls(state),\n wallColors: getSelectedSceneWallColorsList(state),\n wallMarkers: getSelectedSceneWallMarkers(state),\n roomInfo: getSelectedCompositionTrackingRoomInfo(state),\n selectedRenderItem: getSelectedRenderItemId(state),\n})\n\nconst mapDispatchToProps = { setColor: setWallColor }\n\nexport default connect(mapStateToProps, mapDispatchToProps)(WallPaintPinContainer)\n","import React, { useState, useRef } from 'react'\nimport { func, string } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport Button from '@ingka/button'\nimport useOutsideAlerter from 'hooks/useOutsideAlerter'\n\nrequire('./MissingFeatureModal.scss')\n\nconst MissingFeatureModal = ({ onClose, body, headerText, ctaText, onCtaClick, closeBtnText }) => {\n const { t } = useTranslation()\n const [isOpen, setIsOpen] = useState(true)\n const wrapperRef = useRef(null)\n const closeModal = () => {\n setIsOpen(false)\n if (onClose) {\n onClose()\n }\n }\n\n // We want to stop propagation here since there is a mousedown event listener\n // on the parent component in Preview.jsx\n const onMouseDown = (e) => e.stopPropagation()\n\n // If the user clicks outside, the modal is closed\n useOutsideAlerter(wrapperRef, closeModal)\n\n if (!isOpen) {\n return null\n }\n const closeCtaText = closeBtnText || t('design.got it')\n const header = headerText || t('design.did not find a surface')\n return (\n
\n
\n
\n
{header}
\n
\n
{body}
\n
\n {onCtaClick && (\n
\n
\n
\n )\n}\n\nMissingFeatureModal.defaultProps = {\n onClose: null,\n ctaText: null,\n onCtaClick: null,\n headerText: null,\n closeBtnText: null,\n}\n\nMissingFeatureModal.propTypes = {\n onClose: func,\n body: string.isRequired,\n ctaText: string,\n onCtaClick: func,\n headerText: string,\n closeBtnText: string,\n}\n\nexport default MissingFeatureModal\n","import React, { useRef } from 'react'\n\nimport { getRenderer } from 'models/refStore/selectors'\n\nrequire('./DirectInteractionLayer.scss')\n\nconst DirectInteractionLayer = () => {\n const layerRef = useRef(null)\n\n const renderer = getRenderer()\n\n const transformCoords = (e) => {\n // Returns [x, y] fractional coordinates (range 0 - 1.0)\n const corner = layerRef.current\n const { clientX, clientY } = e\n const { left, top, width, height } = corner.getBoundingClientRect()\n\n const eventX = clientX - left\n const eventY = clientY - top\n\n return [eventX / width, eventY / height]\n }\n\n const onMouseMove = (e) => {\n // console.debug(transformCoords(e))\n if (renderer) {\n renderer.onMouseMove(transformCoords(e))\n }\n }\n\n const onClick = (e) => {\n // console.debug(transformCoords(e))\n if (renderer) {\n renderer.onClick(transformCoords(e))\n }\n }\n\n return
\n}\n\nDirectInteractionLayer.defaultProps = {}\n\nDirectInteractionLayer.propTypes = {}\n\nexport default DirectInteractionLayer\n","import Renderer from 'Renderer'\n\nlet trackingActive = false\nlet intervalBinding = null\nlet renderer = null\nlet WebGLMemTracking = null\nlet heapMemTracking = null\nconst snapshotEvent = new Event('memorySnapshot')\n\nfunction takeMemorySnapshot() {\n snapshotEvent.memorySnapshot = {\n ...(heapMemTracking\n ? {\n jsHeapSizeLimit: performance.memory.jsHeapSizeLimit / 1024 / 1024,\n totalJSHeapSize: performance.memory.totalJSHeapSize / 1024 / 1024,\n usedJSHeapSize: performance.memory.usedJSHeapSize / 1024 / 1024,\n }\n : {}),\n ...(WebGLMemTracking\n ? {\n textureMemory: renderer.glMemoryRecorder.currentTextureMemory / 1024 / 1024,\n bufferMemory: renderer.glMemoryRecorder.currentBufferMemory / 1024 / 1024,\n }\n : {}),\n }\n document.dispatchEvent(snapshotEvent)\n}\n\nexport function toggleMemoryTracking(onoroff) {\n // Stop current memory tracking if any\n trackingActive = onoroff\n if (intervalBinding) {\n clearInterval(intervalBinding)\n intervalBinding = null\n }\n if (!onoroff) {\n return\n }\n\n // Check the memory tracking support\n renderer = Renderer.getInstance()\n WebGLMemTracking = renderer && renderer.glMemoryRecorder\n heapMemTracking = performance.memory\n if (!heapMemTracking && !WebGLMemTracking) {\n // eslint-disable-next-line no-console\n console.warn('Memory tracking is not supported by this browser/device combination.')\n return\n }\n if (!heapMemTracking || !WebGLMemTracking) {\n // eslint-disable-next-line no-console\n console.warn(\n `${heapMemTracking ? 'WebGL' : 'Heap'} memory tracking is not supported by this browser/device.`,\n `The memory tracker will be enabled only for the ${heapMemTracking ? 'Heap' : 'WebGL'} memory.`,\n )\n }\n\n // Clear the earlier binding if any\n if (intervalBinding) {\n clearInterval(intervalBinding)\n }\n\n // Start the interval\n intervalBinding = setInterval(takeMemorySnapshot, 500)\n takeMemorySnapshot()\n}\n\nexport function isMemoryTrackingActive() {\n return trackingActive\n}\n","import React, { Component } from 'react'\nimport { debugSettingsType } from 'models/propTypes'\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n} from 'chart.js'\nimport { Line } from 'react-chartjs-2'\nimport { toggleMemoryTracking, isMemoryTrackingActive } from 'utils/memoryTracker'\n\n/* eslint-disable i18next/no-literal-string */\n\nclass MemoryCharts extends Component {\n constructor(props) {\n super(props)\n\n this.onMemorySnapshot = this.onMemorySnapshot.bind(this)\n this.onToggleTrackingButton = this.onToggleTrackingButton.bind(this)\n\n ChartJS.register(CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend)\n\n this.state = {\n debugMemoryTracking: [], // Track change to reload memory tracker chart\n }\n }\n\n componentDidMount() {\n document.addEventListener('memorySnapshot', this.onMemorySnapshot)\n toggleMemoryTracking(true)\n }\n\n componentWillUnmount() {\n document.removeEventListener('memorySnapshot', this.onMemorySnapshot)\n toggleMemoryTracking(false)\n }\n\n onMemorySnapshot(event) {\n this.setState((prevState) => {\n const lastIndex = prevState.debugMemoryTracking.length - 1\n const prevMinTotalHeap = (prevState.debugMemoryTracking[lastIndex] || {}).minTotalHeap || Infinity\n const prevMinUsedHeap = (prevState.debugMemoryTracking[lastIndex] || {}).minUsedHeap || Infinity\n const prevMinWebGLMem = (prevState.debugMemoryTracking[lastIndex] || {}).minWebGL || Infinity\n return {\n debugMemoryTracking: [\n ...prevState.debugMemoryTracking,\n {\n minTotalHeap: Math.min(prevMinTotalHeap, event.memorySnapshot.totalJSHeapSize),\n minUsedHeap: Math.min(prevMinUsedHeap, event.memorySnapshot.usedJSHeapSize),\n minWebGL: Math.min(prevMinWebGLMem, event.memorySnapshot.textureMemory),\n ...event.memorySnapshot,\n },\n ],\n }\n })\n }\n\n onToggleTrackingButton() {\n if (!isMemoryTrackingActive()) {\n toggleMemoryTracking(true)\n document.addEventListener('memorySnapshot', this.onMemorySnapshot)\n } else {\n toggleMemoryTracking(false)\n document.removeEventListener('memorySnapshot', this.onMemorySnapshot)\n }\n }\n\n render() {\n const showHeapMemoryChart =\n !this.props.debugSettings.trackedMemoryType && // 0 -> heap\n this.state.debugMemoryTracking.length &&\n this.state.debugMemoryTracking[0].jsHeapSizeLimit\n const showWebGLMemoryChart =\n this.props.debugSettings.trackedMemoryType && // 1 -> webgl\n this.state.debugMemoryTracking.length &&\n this.state.debugMemoryTracking[0].textureMemory\n\n return (\n \n {showHeapMemoryChart && (\n index / 2),\n label: 'JS Memory tracking',\n datasets: [\n {\n id: 1,\n fill: false,\n pointBorderColor: 'rgba(0, 0, 0, 0)',\n pointBackgroundColor: 'rgba(0, 0, 0, 0)',\n data: this.state.debugMemoryTracking.map((snapshot) =>\n snapshot.totalJSHeapSize.toFixed(1),\n ),\n label: 'Total JS heap',\n borderColor: 'rgb(75, 192, 192)',\n },\n {\n id: 2,\n fill: false,\n pointBorderColor: 'rgba(0, 0, 0, 0)',\n pointBackgroundColor: 'rgba(0, 0, 0, 0)',\n data: this.state.debugMemoryTracking.map((_, i, a) =>\n a[a.length - 1].minTotalHeap.toFixed(1),\n ),\n label: 'Minimum total JS heap',\n borderColor: 'rgba(75, 192, 192, 0.4)',\n },\n {\n id: 3,\n fill: false,\n pointBorderColor: 'rgba(0, 0, 0, 0)',\n pointBackgroundColor: 'rgba(0, 0, 0, 0)',\n data: this.state.debugMemoryTracking.map((snapshot) =>\n snapshot.usedJSHeapSize.toFixed(1),\n ),\n label: 'Used JS heap',\n borderColor: 'rgb(120, 0, 0)',\n },\n {\n id: 4,\n fill: false,\n pointBorderColor: 'rgba(0, 0, 0, 0)',\n pointBackgroundColor: 'rgba(0, 0, 0, 0)',\n data: this.state.debugMemoryTracking.map((_, i, a) =>\n a[a.length - 1].minUsedHeap.toFixed(1),\n ),\n label: 'Minimum used JS heap',\n borderColor: 'rgba(130, 0, 0, 0.4)',\n },\n ],\n }}\n options={{\n animation: { y: { duration: 0 } },\n responsive: true,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'JS memory tracking' },\n },\n }}\n />\n )}\n {showHeapMemoryChart && (\n

Max available heap: {this.state.debugMemoryTracking[0].jsHeapSizeLimit}mb

\n )}\n {showWebGLMemoryChart && (\n index / 2),\n label: 'WebGL memory tracking',\n datasets: [\n {\n id: 1,\n fill: false,\n pointBorderColor: 'rgba(0, 0, 0, 0)',\n pointBackgroundColor: 'rgba(0, 0, 0, 0)',\n data: this.state.debugMemoryTracking.map((snapshot) =>\n snapshot.textureMemory.toFixed(1),\n ),\n label: 'Texture memory',\n borderColor: 'rgb(0, 192, 0)',\n },\n {\n id: 2,\n fill: false,\n pointBorderColor: 'rgba(0, 0, 0, 0)',\n pointBackgroundColor: 'rgba(0, 0, 0, 0)',\n data: this.state.debugMemoryTracking.map((_, i, a) =>\n a[a.length - 1].minWebGL.toFixed(1),\n ),\n label: 'Minimum texture memory',\n borderColor: 'rgba(0, 192, 0, 0.4)',\n },\n ],\n }}\n options={{\n animation: { y: { duration: 0 } },\n responsive: true,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'WebGL memory tracking' },\n },\n }}\n />\n )}\n {(showHeapMemoryChart || showWebGLMemoryChart) && (\n \n )}\n
\n )\n }\n}\n\nMemoryCharts.propTypes = {\n debugSettings: debugSettingsType.isRequired,\n}\n\nexport default MemoryCharts\n","import React, { useState } from 'react'\nimport classNames from 'classnames'\nimport { func, bool, number } from 'prop-types'\nimport Icon from 'components/uiElements/Icon'\nimport Tooltip from 'components/Tooltip'\nimport { useTranslation } from 'react-i18next'\nimport Toast from '@ingka/toast'\nimport './Sweep.scss'\n\nconst Sweep = ({\n compositionId,\n removeRenderItems,\n undoRemoveRenderItems,\n hasRenderItems,\n onSweepButtonMouseOut,\n onSweepButtonMouseOver,\n}) => {\n const [showSweepToast, setShowSweepToast] = useState(false)\n const { t } = useTranslation()\n return (\n
\n {t('sweep.all pinned items have been removed')}}\n isOpen={showSweepToast}\n actionButtonText={t('sweep.undo')}\n actionClick={() => {\n undoRemoveRenderItems(compositionId)\n setShowSweepToast(false)\n }} // required if there is an action label supplied\n onCloseRequest={() => {\n setShowSweepToast(false)\n }}\n onTransitionEnd={() => {}}\n ariaLabelCloseBtn={t('sweep.dismiss notification')}\n />\n \n {\n removeRenderItems(compositionId)\n setShowSweepToast(true)\n }}\n className={classNames('sweepButton', { enabled: hasRenderItems })}\n disabled={!hasRenderItems}\n onMouseOver={onSweepButtonMouseOver}\n onFocus={onSweepButtonMouseOver}\n onMouseOut={onSweepButtonMouseOut}\n onBlur={onSweepButtonMouseOut}\n data-tip={t('tooltip.remove all items')}\n data-for=\"sweep-btn\"\n data-testid=\"sweep-btn\"\n >\n {hasRenderItems ? : }\n \n
\n )\n}\n\nSweep.propTypes = {\n removeRenderItems: func.isRequired,\n undoRemoveRenderItems: func.isRequired,\n hasRenderItems: bool.isRequired,\n compositionId: number.isRequired,\n onSweepButtonMouseOver: func.isRequired,\n onSweepButtonMouseOut: func.isRequired,\n}\n\nexport default Sweep\n","/*\n This the composition preview.\n */\n\nimport React, { Component } from 'react'\nimport classNames from 'classnames'\nimport { bool, func, number, string } from 'prop-types'\nimport * as Sentry from '@sentry/react'\n\nimport Renderer from 'Renderer'\nimport { SENTRY_BREADCRUMB_CATEGORY } from 'Renderer/constants'\n\nimport { compositionType, debugSettingsType, previewSettingsType, dimensionsType } from 'models/propTypes'\n\nimport * as RenderItemTypes from 'constants/renderItemTypes'\nimport { STATE_ERROR } from 'constants/stateTypes'\nimport { withTranslation, Trans } from 'react-i18next'\nimport CompositionRenderItemContainer from 'containers/CompositionRenderItemContainer'\nimport CompositionStackableSurfaceItemContainer from 'containers/CompositionStackableSurfaceItemContainer'\nimport WallPaintPinContainer from 'containers/WallPaintPinContainer'\nimport MissingFeatureModal from 'components/MissingFeatureModal'\nimport DirectInteractionLayer from 'components/design/DirectInteractionLayer'\nimport BouncingBallLoader from 'components/uiElements/BouncingBallLoader'\nimport MemoryCharts from 'components/MemoryCharts'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { getRenderer } from 'models/refStore/selectors'\nimport Button from '@ingka/button'\nimport SSRIcon from '@ingka/ssr-icon'\nimport arrowRight from '@ingka/ssr-icon/paths/arrow-right'\nimport visibilityHide from '@ingka/ssr-icon/paths/visibility-hide'\nimport visibilityShow from '@ingka/ssr-icon/paths/visibility-show'\nimport cross from '@ingka/ssr-icon/paths/cross'\nimport SkipLinks from 'components/SkipLinks'\nimport { BROWSE, DESIGN, HEADER, NAVIGATION } from 'components/SkipLinks/constants'\nimport { getClientEventCoords } from 'utils/events'\nimport Sweep from './Sweep'\n\nrequire('./Preview.scss')\n\nconst stopPropagationFunc = (e) => e.stopPropagation()\n\n// TODO: clean up where we're using state and where\n// we're using props. Right now it's a confusing mix.\n// TODO: we can probably get rid of derived state\n// and use a better abstraction\n// TODO: we probably don't need to pass in composition\n\nclass Preview extends Component {\n static generateImageData(imageUrl) {\n // Load wallart and return the resulting imageData\n const artStagingCanvas = document.createElement('canvas')\n const artStagingContext = artStagingCanvas.getContext('2d')\n const artImg = new Image()\n // eslint-disable-next-line i18next/no-literal-string\n artImg.crossOrigin = 'anonymous'\n artImg.src = imageUrl\n\n return new Promise((resolve) => {\n artImg.onload = () => {\n artStagingCanvas.width = artImg.width\n artStagingCanvas.height = artImg.height\n artStagingContext.drawImage(artImg, 0, 0)\n const artImageData = artStagingContext.getImageData(0, 0, artImg.width, artImg.height)\n\n resolve(artImageData)\n }\n })\n }\n\n constructor(props) {\n super(props)\n\n this.cacheImages = this.cacheImages.bind(this)\n this.triggerRaycast = this.triggerRaycast.bind(this)\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onMouseLeave = this.onMouseLeave.bind(this)\n this.onWindowMouseDown = this.onWindowMouseDown.bind(this)\n this.onKeyDown = this.onKeyDown.bind(this)\n this.onSweepButtonMouseOver = this.onSweepButtonMouseOver.bind(this)\n this.onSweepButtonMouseOut = this.onSweepButtonMouseOut.bind(this)\n this.onContextCreationError = this.onContextCreationError.bind(this)\n\n this.sceneContainerRef = React.createRef()\n this.canvasRef = React.createRef()\n\n this.state = {\n composition: props.composition,\n coords: null,\n underCursorItemId: null,\n underCursorStackableSurfaceId: null,\n stackableCursorMouseoverCoords: null,\n isInvalidForStackable: false,\n debugUseMultiShadow: false, // Track change to reload renderer\n revealDots: false,\n showSweepToast: false,\n }\n }\n\n componentDidMount() {\n this.cacheImages()\n\n const canvas = this.canvasRef.current\n canvas.addEventListener('webglcontextlost', this.props.onContextLost, false)\n canvas.addEventListener('webglcontextcreationerror', this.onContextCreationError, false)\n canvas.addEventListener('webglcontextrestored', this.props.onContextRestored, false)\n }\n\n componentDidUpdate(prevProps, prevState) {\n this.cacheImages(prevState)\n const renderer = getRenderer()\n\n if (!renderer) {\n const {\n composition,\n debugSettings,\n previewSettings,\n onRendererReady,\n onUpdateCompositionSaveData,\n onFirstRender,\n onWallDataReady,\n maxTextureSize,\n updateHiddenSurfaces,\n onInitializationFailure,\n } = this.props\n if (composition) {\n const { scene, savedProperties } = composition\n const canvas = this.canvasRef.current\n\n Renderer.newInstance({\n canvas,\n scene,\n debugSettings,\n previewSettings,\n onFirstRender,\n onReady: onRendererReady,\n saveData: savedProperties,\n onUpdateSaveData: onUpdateCompositionSaveData,\n onWallDataReady,\n maxTextureSize,\n updateHiddenSurfaces,\n onInitializationFailure,\n })\n this.props.newRenderer()\n }\n }\n\n if (renderer && this.props.debugSettings !== prevProps.debugSettings) {\n renderer.updateDebugSettings(this.props.debugSettings)\n }\n if (renderer && this.props.previewSettings !== prevProps.previewSettings) {\n renderer.updateSettings(this.props.previewSettings)\n }\n if (this.props.waitingSurfacesInteraction !== prevProps.waitingSurfacesInteraction) {\n if (this.props.waitingSurfacesInteraction) {\n window.addEventListener('mousedown', this.onWindowMouseDown)\n document.addEventListener('keydown', this.onKeyDown)\n } else {\n window.removeEventListener('mousedown', this.onWindowMouseDown)\n document.removeEventListener('keydown', this.onKeyDown)\n }\n if (this.props.waitingSurfacesInteraction) {\n this.setState({\n isInvalidForStackable: false,\n })\n }\n }\n }\n\n componentWillUnmount() {\n const canvas = this.canvasRef.current\n canvas.removeEventListener('webglcontextlost', this.props.onContextLost, false)\n canvas.removeEventListener('webglcontextcreationerror', this.onContextCreationError, false)\n canvas.removeEventListener('webglcontextrestored', this.props.onContextRestored, false)\n\n this.props.destroyRenderer()\n }\n\n onContextCreationError(evt) {\n Sentry.captureEvent({\n message: `GL Context creation error`,\n breadcrumbs: [\n {\n type: `Error message`,\n category: SENTRY_BREADCRUMB_CATEGORY,\n data: {\n errorMessage: (evt && evt.statusMessage) || `Unknown error`,\n },\n },\n ],\n })\n\n const { onContextCreationError } = this.props\n onContextCreationError()\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const { composition, debugSettings } = nextProps\n\n return {\n ...prevState,\n debugUseMultiShadow: debugSettings.useMultiShadow,\n composition,\n }\n }\n\n onKeyDown(e) {\n const { waitingSurfacesInteraction, hideSurfaces } = this.props\n if (waitingSurfacesInteraction && e.keyCode === 27) {\n hideSurfaces()\n }\n }\n\n onWindowMouseDown() {\n const { waitingSurfacesInteraction, hideSurfaces } = this.props\n if (waitingSurfacesInteraction) {\n hideSurfaces()\n }\n }\n\n onMouseDown(e) {\n const { waitingSurfacesInteraction, onStackableSurfaceClicked } = this.props\n const { composition } = this.state\n const canStack = composition && composition.stackableSurfaces && composition.stackableSurfaces.length\n const renderer = getRenderer()\n if (waitingSurfacesInteraction && canStack) {\n e.stopPropagation()\n\n const { relX, relY, x, y } = this.getRelativeCoords(e)\n const planeId = renderer.getStackableSurfaceAtPoint(relX, relY)\n if (planeId === null) {\n this.setState({ isInvalidForStackable: true })\n } else {\n this.setState({ isInvalidForStackable: false })\n onStackableSurfaceClicked(planeId, x, y)\n }\n } else if (!this.state.underCursorItemId) {\n this.props.clearSelection()\n }\n }\n\n onMouseLeave() {\n this.setState({\n underCursorItemId: null,\n underCursorStackableSurfaceId: null,\n isInvalidForStackable: false,\n })\n }\n\n onSweepButtonMouseOver() {\n this.setState({\n revealDots: true,\n })\n }\n\n onSweepButtonMouseOut() {\n this.setState({\n revealDots: false,\n })\n }\n\n getRelativeCoords(mouseEvt) {\n const renderer = getRenderer()\n if (!renderer) {\n return {\n relX: 0,\n relY: 0,\n x: 0,\n y: 0,\n }\n }\n\n const corner = this.sceneContainerRef.current\n const { clientX, clientY } = getClientEventCoords(mouseEvt)\n const { left, top, width, height } = corner.getBoundingClientRect()\n\n const eventX = clientX - left\n const eventY = clientY - top\n\n const relX = eventX / width\n const relY = eventY / height\n\n const renderDimensions = renderer.getRenderDimensions()\n const scaleX = renderDimensions ? renderDimensions[0] / width : 1.0\n const scaleY = renderDimensions ? renderDimensions[1] / height : 1.0\n\n return {\n relX,\n relY,\n x: eventX * scaleX,\n y: eventY * scaleY,\n }\n }\n\n triggerRaycast(e) {\n const { relX, relY, x, y } = this.getRelativeCoords(e)\n const { waitingSurfacesInteraction } = this.props\n const renderer = getRenderer()\n\n if (renderer) {\n let underCursorStackableSurfaceId = null\n let underCursorItemId = null\n\n if (waitingSurfacesInteraction) {\n underCursorStackableSurfaceId = renderer.getStackableSurfaceAtPoint(relX, relY)\n }\n if (underCursorStackableSurfaceId !== this.state.underCursorStackableSurfaceId) {\n this.setState({ underCursorStackableSurfaceId, isInvalidForStackable: false })\n }\n if (underCursorStackableSurfaceId !== null) {\n this.setState({ stackableCursorMouseoverCoords: { x, y } })\n }\n\n if (underCursorStackableSurfaceId === null) {\n underCursorItemId = renderer.getObjectIdAtPoint(relX, relY)\n }\n if (underCursorItemId !== this.state.underCursorItemId) {\n this.setState({ underCursorItemId })\n }\n }\n }\n\n cacheImages(prevState) {\n // TODO: this caching only works for artItems\n if (!this.props.composition) {\n return\n }\n if (\n !prevState ||\n !prevState.composition ||\n prevState.composition.renderItems !== this.state.composition.renderItems\n ) {\n const {\n composition: { renderItems },\n } = this.props\n\n const cache = (renderItem) => {\n const { id } = renderItem\n if (renderItem.renderType === RenderItemTypes.ART_ITEM && !this.state[id]) {\n const imageUrl =\n Array.isArray(renderItem.artAssetUrls) &&\n renderItem.artAssetUrls.length > 0 &&\n renderItem.artAssetUrls[0]\n if (imageUrl) {\n Preview.generateImageData(imageUrl).then((artImageData) => {\n this.setState({ [id]: artImageData })\n })\n }\n }\n }\n\n renderItems.forEach(cache)\n }\n }\n\n render() {\n const {\n customContext,\n sceneFetchState,\n isLoggedIn,\n canvasHeight,\n canvasWidth,\n settings,\n t,\n previewSettings,\n waitingSurfacesInteraction,\n removeRenderItems,\n undoRemoveRenderItems,\n correctOrientation,\n onCloseMagicWindow,\n hasRendered,\n wallDimensions,\n showMissingWallsModal,\n closeMissingWallsModal,\n setShowDesignSummary,\n placeStackableOnFloor,\n debugSettings,\n } = this.props\n const { isInvalidForStackable, revealDots } = this.state\n\n const renderer = getRenderer()\n const { isMagicWindow, isMobile } = this.context\n const { hidePins: adminHidePins } = debugSettings\n\n const sceneHeight = wallDimensions.width > 0 ? `${(wallDimensions.height / wallDimensions.width) * 100}%` : 0\n\n const { composition, underCursorItemId, underCursorStackableSurfaceId, stackableCursorMouseoverCoords } =\n this.state\n\n const key = composition && composition.scene ? composition.scene.sceneId : null\n const thumbUrl = composition && composition.scene ? composition.scene.thumbUrl : null\n\n let renderItems = []\n\n if (composition && composition.renderItems) {\n renderItems = composition.renderItems\n }\n\n let stackableSurfaces = []\n if (composition && composition.stackableSurfaces) {\n stackableSurfaces = composition.stackableSurfaces\n }\n\n const hasWallPaint = !isMobile && composition && composition.scene && composition.scene.hasWallPaint\n const hasError = sceneFetchState === STATE_ERROR\n\n let errorMessage\n\n if (sceneFetchState === STATE_ERROR) {\n errorMessage = (\n
\n \n We're sorry, but this is unexpected. We were not able to load your rooms.\n
\n
\n Please reload the page, or try again later.\n
\n
\n )\n } else if (isLoggedIn) {\n errorMessage = (\n
\n \n Your account does not have access to this room.\n
\n Please visit your Dashboard to access your rooms.\n
\n
\n )\n } else {\n errorMessage = (\n
\n

{t('design.need to login')}

\n
\n )\n }\n\n let stackableIndicatorMessage = null\n\n if (isInvalidForStackable) {\n stackableIndicatorMessage = (\n Please choose a valid surface\n )\n } else if (underCursorStackableSurfaceId) {\n stackableIndicatorMessage = (\n Click to select this surface\n )\n } else {\n stackableIndicatorMessage = (\n \n Select a colored surface or{' '}\n \n place on floor\n \n \n )\n }\n\n const ssVizUrl = composition && composition.scene && composition.scene.manifest.semantic_segmentation_visual_0\n\n const showSurfacesMessage = stackableSurfaces.length === 0 && waitingSurfacesInteraction\n const hasRenderItems = !!(composition && composition.renderItems && composition.renderItems.length)\n\n const isMobileWebMagicWindow = isMagicWindow && isMobile\n\n return (\n \n \n {hasError &&
{errorMessage}
}\n\n {!hasRendered && !hasError && (\n
\n
\n

{t('design.preparing your room')}

\n
\n \n
\n
\n
\n )}\n\n {this.props.debugSettings.ssViz ? \"\" : null}\n {composition && composition.scene ? (\n \n {!isMagicWindow && showSurfacesMessage && (\n \n )}\n {showMissingWallsModal && (\n \n )}\n\n {isMagicWindow && !isMobile && (\n \n )}\n\n {isMobileWebMagicWindow && (\n <>\n \n \n \n )}\n\n {!showSurfacesMessage ? (\n \n

{stackableIndicatorMessage}

\n
\n ) : null}\n {settings.magicEraserMode && }\n {renderer && settings.magicEraserMode && (\n
\n {\n renderer.setStaticFurnitureViz(false)\n }}\n text={t('design.hide all')}\n ssrIcon={visibilityHide}\n small\n />\n {\n renderer.setStaticFurnitureViz(true)\n }}\n text={t('design.show all')}\n ssrIcon={visibilityShow}\n small\n />\n
\n )}\n {renderer\n ? renderItems.map((renderItem) => {\n const isUnderCursor = renderItem.uniqueId === underCursorItemId\n return (\n \n )\n })\n : null}\n {renderer\n ? stackableSurfaces.map((plane) => {\n const highlight = underCursorStackableSurfaceId === plane.id\n const coords = highlight ? stackableCursorMouseoverCoords : null\n return (\n \n )\n })\n : null}\n {hasWallPaint && (\n \n )}\n \n ) : null}\n \n {/* Note the memory charts waits for the renderer to be initialized to use the GlMemoryRecorder */}\n {hasRendered && this.props.debugSettings.showMemoryStats && (\n \n )}\n \n )\n }\n}\n\nPreview.contextType = SugarcubeContext\nPreview.defaultProps = {\n composition: null,\n correctOrientation: false,\n maxTextureSize: null,\n onCloseMagicWindow: null,\n}\n\nPreview.propTypes = {\n hideSurfaces: func.isRequired,\n composition: compositionType,\n customContext: string.isRequired,\n canvasWidth: number.isRequired,\n maxTextureSize: number,\n canvasHeight: number.isRequired,\n sceneFetchState: string.isRequired,\n isLoggedIn: bool.isRequired,\n debugSettings: debugSettingsType.isRequired,\n previewSettings: previewSettingsType.isRequired,\n clearSelection: func.isRequired,\n newRenderer: func.isRequired,\n destroyRenderer: func.isRequired,\n onRendererReady: func.isRequired,\n onWallDataReady: func.isRequired,\n onFirstRender: func.isRequired,\n settings: previewSettingsType.isRequired,\n t: func.isRequired,\n onStackableSurfaceClicked: func.isRequired,\n waitingSurfacesInteraction: bool.isRequired,\n onUpdateCompositionSaveData: func.isRequired,\n removeRenderItems: func.isRequired,\n undoRemoveRenderItems: func.isRequired,\n hasRendered: bool.isRequired,\n correctOrientation: bool,\n onCloseMagicWindow: func,\n wallDimensions: dimensionsType.isRequired,\n showMissingWallsModal: bool.isRequired,\n closeMissingWallsModal: func.isRequired,\n onContextLost: func.isRequired,\n onContextCreationError: func.isRequired,\n onContextRestored: func.isRequired,\n onInitializationFailure: func.isRequired,\n setShowDesignSummary: func.isRequired,\n placeStackableOnFloor: func.isRequired,\n updateHiddenSurfaces: func.isRequired,\n}\n\nexport default withTranslation()(Preview)\n","/* eslint-disable i18next/no-literal-string */\n/*\n This the composition preview Container.\n This is the drop target for ArtItems.\n*/\n\nimport React, { Component } from 'react'\nimport { func, string, number, bool } from 'prop-types'\nimport { connect } from 'react-redux'\nimport { compositionType, debugSettingsType, previewSettingsType, dimensionsType } from 'models/propTypes'\nimport DeviceOrientation, { Orientation } from 'react-screen-orientation'\nimport classNames from 'classnames'\nimport fscreen from 'fscreen'\n\nimport { CONTEXT_DEFAULT } from 'constants/contexts'\nimport getMaxWindowSize from 'utils/getMaxWindowSize'\n\nimport { getSelectedComposition, getSurfacesInteractive } from 'models/compositions/selectors'\nimport { getFetchState } from 'models/scenes/selectors'\nimport { getIsLoggedIn } from 'models/user/selectors'\nimport {\n getIsCurrentDragValid,\n getPreviewSettings,\n getIsMagicWindowLoading,\n getWallDataDimensions,\n} from 'models/preview/selectors'\nimport { getDebugSettings } from 'models/admin/selectors'\nimport { getCanvasWidth, getMaxTextureSize } from 'models/location/selectors'\nimport { getShowMissingWallsModal, getOrientation } from 'models/ui/selectors'\n// TODO move this to the renderer selector\nimport { getRenderer } from 'models/refStore/selectors'\nimport {\n selectCompositionRenderItem,\n stackableSurfaceClicked,\n updateCompositionSaveData,\n removeRenderItems as removeRenderItemsAction,\n undoRemoveRenderItems as undoRemoveRenderItemsAction,\n clickPlaceStackableOnFloor,\n updateHiddenSurfaces,\n} from 'models/compositions/actions'\nimport {\n newRenderer,\n destroyRenderer,\n rendererReady,\n firstRender,\n webglContextLost,\n webglContextNotCreated,\n webglContextRestored,\n initializationFailure,\n} from 'models/renderer/actions'\nimport { wallDataReady, hidePlaceableSurfaces } from 'models/preview/actions'\nimport {\n showMissingWallsModal as showMissingWallsModalAction,\n setMobileOrientation as setMobileOrientationAction,\n} from 'models/ui/actions'\nimport Preview from 'components/Preview'\nimport { withTranslation } from 'react-i18next'\nimport Icon from 'components/uiElements/Icon'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { getHasRendered } from 'models/renderer/selectors'\nimport { ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT } from 'models/ui/constants'\n\nconst supportedOrientation = ORIENTATION_LANDSCAPE\n\nclass PreviewContainer extends Component {\n constructor(props) {\n super(props)\n this.onUpdateCompositionSaveData = this.onUpdateCompositionSaveData.bind(this)\n this.onOrientationChange = this.onOrientationChange.bind(this)\n this.onScroll = this.onScroll.bind(this)\n this.onScrollFinished = this.onScrollFinished.bind(this)\n this.onFullscreenChange = this.onFullscreenChange.bind(this)\n this.doUpdateHiddenSurfaces = this.doUpdateHiddenSurfaces.bind(this)\n\n this.scrollTimeout = null\n\n this.defaultBgColor = null\n\n this.state = {\n composition: props.composition,\n scrollPos: 0,\n fullscreen: fscreen.fullscreenElement !== null,\n bgImageSource: null,\n canvasWidth: 0,\n canvasHeight: 0,\n }\n }\n\n componentDidMount() {\n window.addEventListener('scroll', this.onScroll, { passive: true })\n fscreen.addEventListener('fullscreenchange', this.onFullscreenChange)\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { composition } = this.props\n\n const renderer = getRenderer()\n const hasComposition = prevState.composition && composition\n const hasNewScene = hasComposition && prevState.composition.scene !== composition.scene\n // Reset if there's a renderer and (we're missing a composition or the scene has changed)\n if (renderer && (!hasComposition || hasNewScene)) {\n this.props.destroyRenderer()\n }\n\n // wall dimensions are updated from the\n const { wallDimensions } = this.props\n let { canvasWidth } = prevState\n const { wallDimensions: newDimensions } = prevProps\n if (\n canvasWidth === 0 ||\n wallDimensions.width !== newDimensions.width ||\n wallDimensions.height !== newDimensions.height\n ) {\n canvasWidth = this.props.canvasWidth || canvasWidth || getMaxWindowSize()\n const canvasHeight =\n wallDimensions.width > 0 ? canvasWidth * (wallDimensions.height / wallDimensions.width) : 0\n\n this.setState({\n canvasWidth,\n canvasHeight,\n })\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('scroll', this.onScroll)\n fscreen.removeEventListener('fullscreenchange', this.onFullscreenChange)\n }\n\n onOrientationChange(orientation) {\n const { setMobileOrientation } = this.props\n setMobileOrientation(orientation)\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const { composition } = nextProps\n return {\n ...prevState,\n composition,\n }\n }\n\n onScroll() {\n if (this.scrollTimeout !== null) {\n clearTimeout(this.scrollTimeout)\n this.scrollTimeout = null\n }\n\n this.scrollTimeout = window.setTimeout(this.onScrollFinished, 50)\n }\n\n onScrollFinished() {\n this.scrollTimeout = null\n this.setState({ scrollPos: window.scrollY })\n }\n\n onFullscreenChange() {\n const delay = new Promise((resolve) => {\n setTimeout(resolve, 500)\n })\n delay.then(() => this.setState({ fullscreen: fscreen.fullscreenElement !== null }))\n }\n\n onUpdateCompositionSaveData(saveData, trackingInfoRaw) {\n const trackingInfo = { ...trackingInfoRaw }\n const { composition, onUpdateCompositionSaveData } = this.props\n if (composition) {\n const {\n savedProperties: { erasedSegments },\n } = composition\n trackingInfo.prevErasedSegments = erasedSegments || []\n onUpdateCompositionSaveData(composition.id, saveData, trackingInfo)\n }\n }\n\n doUpdateHiddenSurfaces(surfs) {\n this.props.updateHiddenSurfaces(this.props.composition.id, surfs)\n }\n\n render() {\n const {\n composition,\n customContext,\n maxHeight,\n sceneFetchState,\n isLoggedIn,\n debugSettings,\n previewSettings,\n clearSelection,\n hideSurfaces,\n onRendererReady,\n onWallDataReady,\n settings,\n onStackableSurfaceClicked,\n waitingSurfacesInteraction,\n removeRenderItems,\n undoRemoveRenderItems,\n t,\n isMagicWindowLoading,\n onCloseMagicWindow,\n onFirstRender,\n hasRendered,\n wallDimensions,\n showMissingWallsModal,\n closeMissingWallsModal,\n onContextLost,\n onInitializationFailure,\n onContextCreationError,\n onContextRestored,\n setShowDesignSummary,\n orientation,\n maxTextureSize,\n placeStackableOnFloor,\n } = this.props\n\n const { canvasWidth, canvasHeight } = this.state\n\n const { isMobile, isKiosk } = this.context\n\n let maxWidth = null\n const headerOffset = isKiosk ? 0 : 80 // Kiosk has no header\n const useMaxHeight = isMobile ? window.innerHeight : maxHeight - headerOffset\n if (useMaxHeight && wallDimensions.height > 0) {\n const aspect = wallDimensions.width / wallDimensions.height\n maxWidth = useMaxHeight * aspect\n }\n\n /* eslint-disable i18next/no-literal-string */\n const correctOrientation = isMobile && orientation === supportedOrientation\n\n const previewContent = (\n (this.node = node)}\n >\n \n \n )\n\n const result = isMobile ? (\n \n \n
\n {previewContent}\n
\n
\n \n {!isMagicWindowLoading && (\n
(this.node = node)}>\n
\n
\n
\n \n
\n
{t('mobile.rotate phone')}
\n
\n
\n \n
\n
\n )}\n \n \n ) : (\n previewContent\n )\n\n return result\n }\n}\n\nPreviewContainer.contextType = SugarcubeContext\nPreviewContainer.defaultProps = {\n composition: null,\n customContext: CONTEXT_DEFAULT,\n maxHeight: null,\n canvasWidth: null,\n maxTextureSize: null,\n onCloseMagicWindow: null,\n}\n\nPreviewContainer.propTypes = {\n composition: compositionType,\n customContext: string,\n maxHeight: number,\n sceneFetchState: string.isRequired,\n isLoggedIn: bool.isRequired,\n debugSettings: debugSettingsType.isRequired,\n previewSettings: previewSettingsType.isRequired,\n\n clearSelection: func.isRequired,\n newRenderer: func.isRequired,\n destroyRenderer: func.isRequired,\n onRendererReady: func.isRequired,\n onWallDataReady: func.isRequired,\n onFirstRender: func.isRequired,\n settings: previewSettingsType.isRequired,\n canvasWidth: number,\n maxTextureSize: number,\n onStackableSurfaceClicked: func.isRequired,\n waitingSurfacesInteraction: bool.isRequired,\n onUpdateCompositionSaveData: func.isRequired,\n removeRenderItems: func.isRequired,\n undoRemoveRenderItems: func.isRequired,\n t: func.isRequired,\n isMagicWindowLoading: bool.isRequired,\n onCloseMagicWindow: func,\n hasRendered: bool.isRequired,\n placeStackableOnFloor: func.isRequired,\n updateHiddenSurfaces: func.isRequired,\n hideSurfaces: func.isRequired,\n\n wallDimensions: dimensionsType.isRequired,\n showMissingWallsModal: bool.isRequired,\n closeMissingWallsModal: func.isRequired,\n onContextLost: func.isRequired,\n onContextCreationError: func.isRequired,\n onContextRestored: func.isRequired,\n onInitializationFailure: func.isRequired,\n setShowDesignSummary: func.isRequired,\n setMobileOrientation: func.isRequired,\n orientation: string.isRequired,\n}\n\nconst mapStateToProps = (state, props) => ({\n composition: props.composition || getSelectedComposition(state),\n sceneFetchState: getFetchState(state),\n isLoggedIn: getIsLoggedIn(state),\n isCurrentDragValid: getIsCurrentDragValid(state),\n debugSettings: getDebugSettings(state),\n previewSettings: getPreviewSettings(state),\n settings: getPreviewSettings(state),\n canvasWidth: getCanvasWidth(state),\n maxTextureSize: getMaxTextureSize(state),\n waitingSurfacesInteraction: getSurfacesInteractive(state),\n isMagicWindowLoading: getIsMagicWindowLoading(state),\n hasRendered: getHasRendered(state),\n wallDimensions: getWallDataDimensions(state),\n showMissingWallsModal: getShowMissingWallsModal(state),\n orientation: getOrientation(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n hideSurfaces: () => dispatch(hidePlaceableSurfaces()),\n clearSelection: () => dispatch(selectCompositionRenderItem(-1)),\n newRenderer: () => dispatch(newRenderer()),\n destroyRenderer: () => dispatch(destroyRenderer()),\n onRendererReady: (info) => dispatch(rendererReady(info)),\n onWallDataReady: (width, height) => dispatch(wallDataReady(width, height)),\n onFirstRender: () => dispatch(firstRender()),\n onStackableSurfaceClicked: (...args) => dispatch(stackableSurfaceClicked(...args)),\n onUpdateCompositionSaveData: (...args) => dispatch(updateCompositionSaveData(...args)),\n removeRenderItems: (id) => dispatch(removeRenderItemsAction(id)),\n undoRemoveRenderItems: (id) => dispatch(undoRemoveRenderItemsAction(id)),\n closeMissingWallsModal: () => dispatch(showMissingWallsModalAction(false)),\n onContextLost: () => dispatch(webglContextLost()),\n onContextCreationError: () => dispatch(webglContextNotCreated()),\n onContextRestored: () => dispatch(webglContextRestored()),\n onInitializationFailure: (...args) => dispatch(initializationFailure(...args)),\n setMobileOrientation: (orientation) => dispatch(setMobileOrientationAction(orientation)),\n placeStackableOnFloor: () => dispatch(clickPlaceStackableOnFloor()),\n updateHiddenSurfaces: (compositionId, surfs) => dispatch(updateHiddenSurfaces(compositionId, surfs)),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withTranslation()(PreviewContainer))\n","import React, { useState, useEffect, useContext, useRef } from 'react'\nimport ReactTooltip from 'react-tooltip'\nimport Toast from '@ingka/toast'\nimport { bool, func, string } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport classNames from 'classnames'\nimport Icon from 'components/uiElements/Icon'\nimport InputField from '@ingka/input-field'\nimport Tooltip from 'components/Tooltip'\nimport usePrevious from 'hooks/usePrevious'\nimport { compositionType } from 'models/propTypes'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport SkipLinks from 'components/SkipLinks'\nimport { DESIGN, HEADER, NAVIGATION } from 'components/SkipLinks/constants'\n\nimport './PreviewHeader.scss'\n\nconst PreviewHeader = ({\n composition,\n isSaving,\n isModified,\n designingEnabled,\n onSave,\n onShareClick,\n editing,\n editName,\n rename,\n edit,\n checkEdit,\n openTryNewRoomModal,\n hasSaveError,\n hasRendered,\n openBag,\n hasAddedToBag,\n onCompositionInputBlur,\n}) => {\n const [showSaveToast, setSaveSweepToast] = useState(false)\n const { t } = useTranslation()\n const prevIsSaving = usePrevious(isSaving)\n const { isMagicWindow, allowShare } = useContext(SugarcubeContext)\n\n // Remove MW check when design lab is done\n const canModify = composition && !isMagicWindow\n const canSave = !isSaving && (isModified || editing)\n const noRenderedItems = composition && composition.renderItems && composition.renderItems.length === 0\n const autoSelect = editName === t('design.default composition name')\n const toastText = hasSaveError ? t('design.your design could not be saved') : t('design.your design has been saved')\n\n const onSaveClick = () => {\n ReactTooltip.hide()\n onSave()\n }\n\n const inputRef = useRef(null)\n useEffect(() => {\n if (autoSelect && inputRef && inputRef.current) {\n inputRef.current.setSelectionRange(0, inputRef.current.value.length)\n }\n }, [])\n\n useEffect(() => {\n if (prevIsSaving && !isSaving) {\n setSaveSweepToast(true)\n }\n }, [prevIsSaving, isSaving])\n\n return (\n
\n \n {\n setSaveSweepToast(false)\n }}\n onTransitionEnd={() => {}}\n ariaLabelCloseBtn={t('design.dismiss notification')}\n />\n {isMagicWindow && (\n \n )}\n
\n {canModify ? (\n
\n \n
\n \n
\n
\n ) : null}\n
\n \n
\n )\n}\n\nPreviewHeader.defaultProps = {\n composition: null,\n onCompositionInputBlur: null,\n}\n\nPreviewHeader.propTypes = {\n composition: compositionType,\n isSaving: bool.isRequired,\n isModified: bool.isRequired,\n designingEnabled: bool.isRequired,\n onSave: func.isRequired,\n onShareClick: func.isRequired,\n rename: func.isRequired,\n edit: func.isRequired,\n checkEdit: func.isRequired,\n editing: bool.isRequired,\n editName: string.isRequired,\n openTryNewRoomModal: func.isRequired,\n hasSaveError: bool.isRequired,\n hasRendered: bool.isRequired,\n openBag: func.isRequired,\n hasAddedToBag: bool.isRequired,\n onCompositionInputBlur: func,\n}\nexport default PreviewHeader\n","import React, { Component } from 'react'\nimport PreviewHeader from 'components/PreviewHeader'\nimport { toggleSharePanelOpen } from 'models/ui/actions'\nimport { func, bool } from 'prop-types'\nimport { connect } from 'react-redux'\nimport { compositionType } from 'models/propTypes'\nimport {\n saveSelectedComposition,\n renameSelectedComposition as renameSelectedCompositionAction,\n saveCompositionBeforeSharing as saveCompositionBeforeSharingAction,\n} from 'models/compositions/actions'\nimport { openBag as openBagAction } from 'models/bag/actions'\nimport { getSelectedComposition, getIsSaving, getIsModified, getHasSaveError } from 'models/compositions/selectors'\nimport { getDesigningEnabled } from 'models/ui/selectors'\nimport { getIsLoggedIn } from 'models/user/selectors'\nimport { getHasRendered } from 'models/renderer/selectors'\nimport { getHasAddedToBag } from 'models/bag/selectors'\nimport { loginNeeded } from 'models/user/actions'\nimport { TRACK_LOCATION_DESIGN_HEADER, TRACK_LOCATION_SHARE_PANEL } from 'models/tracking/constants'\nimport { withTranslation } from 'react-i18next'\n\nclass PreviewHeaderContainer extends Component {\n constructor(props) {\n super(props)\n this.onWindowClick = this.onWindowClick.bind(this)\n this.onSave = this.onSave.bind(this)\n this.onShareClick = this.onShareClick.bind(this)\n this.rename = this.rename.bind(this)\n this.edit = this.edit.bind(this)\n this.checkEdit = this.checkEdit.bind(this)\n this.onCompositionInputBlur = this.onCompositionInputBlur.bind(this)\n const { t } = props\n this.state = {\n editing: false,\n editName: (props.composition && props.composition.name) || t('design.default composition name'),\n }\n }\n\n componentDidMount() {\n window.addEventListener('click', this.onWindowClick)\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.onWindowClick)\n }\n\n onWindowClick() {\n if (this.state.editing) {\n this.onSave()\n }\n }\n\n onCompositionInputBlur() {\n const { t } = this.props\n const { editName } = this.state\n if (!editName) {\n this.setState({ editName: t('design.default composition name') }, this.onWindowClick())\n }\n }\n\n onSave() {\n const trackingInfo = {\n SavedFrom: TRACK_LOCATION_DESIGN_HEADER,\n }\n const { editing, editName } = this.state\n const {\n renameSelectedComposition,\n saveComposition,\n composition: { name: compositionName },\n } = this.props\n if (editing) {\n this.setState({ editing: false })\n if (editName !== compositionName) {\n renameSelectedComposition(editName, trackingInfo)\n }\n } else {\n saveComposition(trackingInfo)\n }\n }\n\n onShareClick() {\n const { toggleSharePanel, saveCompositionBeforeSharing, isLoggedIn, onLoginNeeded } = this.props\n if (isLoggedIn) {\n const trackingInfo = {\n SavedFrom: TRACK_LOCATION_SHARE_PANEL,\n }\n saveCompositionBeforeSharing(trackingInfo)\n toggleSharePanel()\n } else {\n onLoginNeeded()\n }\n }\n\n checkEdit(e) {\n e.stopPropagation()\n if (e.keyCode === 13) {\n // Enter key pressed, save it\n this.onSave()\n } else if (e.keyCode === 27) {\n // Cancel with Esc\n this.setState({ editing: false })\n }\n }\n\n rename(e) {\n e.stopPropagation()\n if (!this.state.editing) {\n this.setState({ editing: true, editName: this.props.composition.name })\n }\n }\n\n edit(e) {\n this.setState({ editName: e.target.value })\n }\n\n render() {\n const {\n composition,\n designingEnabled,\n isSaving,\n isModified,\n openTryNewRoomModal,\n hasSaveError,\n hasRendered,\n openBag,\n hasAddedToBag,\n } = this.props\n const { editing, editName } = this.state\n return (\n \n )\n }\n}\n\nPreviewHeaderContainer.defaultProps = {\n composition: null,\n}\n\nPreviewHeaderContainer.propTypes = {\n composition: compositionType,\n isLoggedIn: bool.isRequired,\n designingEnabled: bool.isRequired,\n isSaving: bool.isRequired,\n isModified: bool.isRequired,\n saveComposition: func.isRequired,\n renameSelectedComposition: func.isRequired,\n toggleSharePanel: func.isRequired,\n saveCompositionBeforeSharing: func.isRequired,\n openTryNewRoomModal: func.isRequired,\n hasSaveError: bool.isRequired,\n hasRendered: bool.isRequired,\n openBag: func.isRequired,\n hasAddedToBag: bool.isRequired,\n onLoginNeeded: func.isRequired,\n t: func.isRequired,\n}\n\nconst mapStateToProps = (state, props) => ({\n composition: props.composition || getSelectedComposition(state),\n isLoggedIn: getIsLoggedIn(state),\n designingEnabled: getDesigningEnabled(state),\n isSaving: getIsSaving(state),\n isModified: getIsModified(state),\n hasSaveError: getHasSaveError(state),\n hasRendered: getHasRendered(state),\n hasAddedToBag: getHasAddedToBag(state),\n})\n\nconst mapDispatchToProps = {\n saveComposition: saveSelectedComposition,\n renameSelectedComposition: renameSelectedCompositionAction,\n toggleSharePanel: toggleSharePanelOpen,\n saveCompositionBeforeSharing: saveCompositionBeforeSharingAction,\n openBag: openBagAction,\n onLoginNeeded: loginNeeded,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withTranslation()(PreviewHeaderContainer))\n","import React, { useState, useContext } from 'react'\nimport classNames from 'classnames'\nimport { bool, string } from 'prop-types'\nimport Icon from 'components/uiElements/Icon'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./ProductItemImage.scss')\n\nconst ProductItemImage = ({ thumbUrl, name, showIcon, isInSwap }) => {\n const [imgIsLoading, setImgIsLoading] = useState(true)\n\n const { isMobile } = useContext(SugarcubeContext)\n\n return (\n
\n {showIcon && (\n
\n
\n \n
\n
\n )}\n\n setImgIsLoading(false)}\n />\n
\n )\n}\n\nProductItemImage.defaultProps = {\n isInSwap: false,\n showIcon: false,\n}\nProductItemImage.propTypes = {\n thumbUrl: string.isRequired,\n name: string.isRequired,\n showIcon: bool,\n isInSwap: bool,\n}\n\nexport default ProductItemImage\n","import React from 'react'\nimport { func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport { productDataType } from 'models/propTypes'\nimport ProductItemDetail from 'components/designSidepanel/ProductItemDetail'\nimport ProductItemImage from 'components/designSidepanel/ProductItemImage'\n\nrequire('./ProductItem.scss')\n\nconst ProductItem = ({ furnitureData, onSelect, addToRoom, viewDetails }) => {\n const { t } = useTranslation()\n const addToRoomHandler = (e) => {\n e.stopPropagation()\n addToRoom()\n }\n\n const { name, price, description, thumbUrl, stacks } = furnitureData\n const addToRoomButtonAriaLabel = `${t('design.add to room')} ${name} ${description}`\n const viewDetailsAriaLabel = `${t('aria.product details')} ${name} ${description}`\n return (\n
\n
\n \n
\n
\n \n
\n
\n )\n}\nProductItem.propTypes = {\n furnitureData: productDataType.isRequired,\n onSelect: func.isRequired,\n addToRoom: func.isRequired,\n viewDetails: func.isRequired,\n}\n\nexport default ProductItem\n","import React, { useContext } from 'react'\nimport classNames from 'classnames'\nimport { func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport { productDataType } from 'models/propTypes'\nimport ProductItemDetail from 'components/designSidepanel/ProductItemDetail'\nimport ProductItemImage from 'components/designSidepanel/ProductItemImage'\nimport Icon from 'components/uiElements/Icon'\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\nimport { TRACK_LOCATION_SIDEPANEL } from 'models/tracking/constants'\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./ProductItem.scss')\n\nconst ProductItemWide = ({ productData, onSelect, viewDetails, addToBag, addToRoom }) => {\n const { t } = useTranslation()\n const { isMobile, isKiosk } = useContext(SugarcubeContext)\n const { name, price, description, thumbUrl, localItemNumber } = productData\n const viewDetailsClick = () => {\n onSelect()\n viewDetails()\n }\n\n const isInDesignSummaryView = !viewDetails\n return (\n
\n
\n \n
\n\n
\n \n
\n {addToRoom && (\n \n )}\n {!addToRoom && !isKiosk && (\n \n )}\n
\n {addToRoom && !isKiosk && (\n \n )}\n \n
\n
\n
\n
\n )\n}\n\nProductItemWide.defaultProps = {\n addToRoom: null,\n viewDetails: null,\n}\n\nProductItemWide.propTypes = {\n productData: productDataType.isRequired,\n onSelect: func.isRequired,\n viewDetails: func,\n addToBag: func.isRequired,\n addToRoom: func,\n}\n\nexport default ProductItemWide\n","import React, { useContext } from 'react'\nimport { func } from 'prop-types'\nimport classNames from 'classnames'\nimport { useTranslation } from 'react-i18next'\nimport { productDataType } from 'models/propTypes'\nimport ProductItemDetail from 'components/designSidepanel/ProductItemDetail'\nimport ProductItemImage from 'components/designSidepanel/ProductItemImage'\nimport Icon from 'components/uiElements/Icon'\nimport arrowCounterclockwise from '@ingka/ssr-icon/paths/arrow-counterclockwise'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport Button from '@ingka/button'\n\nrequire('./ProductItem.scss')\n\nconst ProductItemInSwap = ({ swappableItemData, onSelect, onSwap, selectedFurnitureData, viewDetails, onUndoSwap }) => {\n const { t } = useTranslation()\n const isSelected = swappableItemData.id === selectedFurnitureData.id\n const { name, price, thumbUrl, description } = swappableItemData\n\n const { isMobile } = useContext(SugarcubeContext)\n const threeColumns = !isMobile\n const onDetailsClick = isMobile || isSelected ? null : viewDetails\n const swapButtonAriaLabel = `${t('design.swap')} ${name} ${description}`\n const viewDetailsAriaLabel = `${t('aria.product details')} ${name} ${description}`\n return (\n
\n {isMobile && (\n
\n \n \n
\n
\n
\n \n \n
\n )}\n {!isMobile && (\n \n \n \n \n
\n )}\n
\n {isSelected ? (\n
\n
{t('design.product swapped')}
\n \n
\n ) : (\n \n )}\n
\n
\n )\n}\nProductItemInSwap.propTypes = {\n swappableItemData: productDataType.isRequired,\n onSelect: func.isRequired,\n onSwap: func.isRequired,\n selectedFurnitureData: productDataType.isRequired,\n viewDetails: func.isRequired,\n onUndoSwap: func.isRequired,\n}\n\nexport default ProductItemInSwap\n","import React, { Component } from 'react'\nimport { bool, func, number, string } from 'prop-types'\nimport { connect } from 'react-redux'\n\nimport { productDataType } from 'models/propTypes'\nimport { FURNITURE_ITEM } from 'constants/renderItemTypes'\nimport { selectFurniture, selectSwapFurnitureForDetails } from 'models/furniture/actions'\nimport { setDesignSidepanelMode } from 'models/ui/actions'\nimport * as modes from 'models/ui/constants'\nimport { getSelectedCompositionId, getSelectedRenderItemId } from 'models/compositions/selectors'\nimport { clickPlaceRenderItem, selectCompositionRenderItem, swapRenderItem } from 'models/compositions/actions'\nimport { addToBag as addToBagAction } from 'models/bag/actions'\nimport {\n GET_INFO_CATALOG_LIST,\n GET_INFO_SWAP_LIST,\n GET_INFO_ROOM_LIST,\n GET_INFO_FAVORITES_LIST,\n PRODUCT_SWAP,\n} from 'models/tracking/constants'\nimport { getDesignSidepanelMode, getShowDesignSummary } from 'models/ui/selectors'\nimport ProductItem from 'components/designSidepanel/ProductItem'\nimport ProductItemWide from 'components/designSidepanel/ProductItemWide'\nimport ProductItemInSwap from 'components/designSidepanel/ProductItemInSwap'\nimport { getSelectedFurnitureData, getSelectedSwapFurnitureData } from 'models/furniture/selectors'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nimport classNames from 'classnames'\n\nclass ProductItemContainer extends Component {\n constructor(props) {\n super(props)\n this.onSelect = this.onSelect.bind(this)\n this.addToRoom = this.addToRoom.bind(this)\n this.viewDetails = this.viewDetails.bind(this)\n this.addToBag = this.addToBag.bind(this)\n this.onSwap = this.onSwap.bind(this)\n this.onUndoSwap = this.onUndoSwap.bind(this)\n }\n\n onSelect() {\n const {\n onSelect,\n furnitureData: { id: furnitureDataId, uniqueId },\n mode,\n selectItem,\n } = this.props\n const isInMyItems = mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE\n\n onSelect(furnitureDataId)\n if (isInMyItems) {\n if (uniqueId) {\n selectItem(uniqueId)\n }\n }\n }\n\n onSwap(e) {\n e.stopPropagation()\n const { onSwap, selectedId: removedFurnitureId, selectedFurnitureData, furnitureData } = this.props\n const { id: swappedFurnitureId } = furnitureData\n const swappedInProductTrackingInfo = getProductTrackingInfo(furnitureData)\n const swappedInTrackingInfo = {\n ...swappedInProductTrackingInfo,\n AddedFrom: PRODUCT_SWAP,\n }\n\n if (removedFurnitureId) {\n const removedProductTrackingInfo = getProductTrackingInfo(selectedFurnitureData)\n const removedTrackingInfo = {\n ...removedProductTrackingInfo,\n RemovedFrom: PRODUCT_SWAP,\n }\n\n const trackingInfo = {\n swappedInTrackingInfo,\n removedTrackingInfo,\n }\n onSwap(removedFurnitureId, swappedFurnitureId, trackingInfo)\n }\n }\n\n onUndoSwap(e) {\n e.stopPropagation()\n const { onSwap, selectedId: removedFurnitureId, selectedFurnitureData, selectedSwapFurnitureData } = this.props\n // Swap back the original product, the swap anchor\n if (selectedFurnitureData && selectedSwapFurnitureData) {\n const swappedInProductTrackingInfo = getProductTrackingInfo(selectedSwapFurnitureData)\n const { id: swappedFurnitureId } = selectedSwapFurnitureData\n const swappedInTrackingInfo = {\n ...swappedInProductTrackingInfo,\n AddedFrom: PRODUCT_SWAP,\n }\n\n if (removedFurnitureId) {\n const removedProductTrackingInfo = getProductTrackingInfo(selectedFurnitureData)\n const removedTrackingInfo = {\n ...removedProductTrackingInfo,\n RemovedFrom: PRODUCT_SWAP,\n }\n\n const trackingInfo = {\n swappedInTrackingInfo,\n removedTrackingInfo,\n }\n onSwap(removedFurnitureId, swappedFurnitureId, trackingInfo)\n }\n }\n }\n\n addToRoom() {\n const { furnitureData: productData, compositionId, addProductToRoom, trackingInfoAddedFrom } = this.props\n const { id, stacks, renderType, hidden } = productData\n let renderData\n if (renderType === FURNITURE_ITEM) {\n renderData = {\n heading: 0,\n stacks,\n hidden,\n }\n } else {\n // For Art\n renderData = {\n matteId: 1,\n frameId: 1,\n sizeId: 1,\n colorId: 1,\n customHeight: null,\n }\n }\n const productTrackingInfo = getProductTrackingInfo(productData)\n addProductToRoom(\n compositionId,\n id,\n {\n renderType,\n ...renderData,\n },\n {\n ...productTrackingInfo,\n AddedFrom: trackingInfoAddedFrom,\n },\n )\n this.onSelect()\n }\n\n addToBag() {\n const { furnitureData, addToBag } = this.props\n const { localItemNumber, region } = furnitureData\n const { name: productTitle } = furnitureData\n\n const trackingInfo = getProductTrackingInfo(furnitureData)\n addToBag(localItemNumber, region, productTitle, trackingInfo)\n }\n\n viewDetails() {\n const { setMode, mode, furnitureData, selectSwapItemForDetails } = this.props\n\n const isInMyItems = mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE\n const isInFavorites = mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE\n const isInSwap = mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE\n\n const { id } = furnitureData\n\n const trackingInfo = getProductTrackingInfo(furnitureData)\n\n if (isInMyItems) {\n setMode(modes.DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS, { ...trackingInfo, AccessFrom: GET_INFO_ROOM_LIST })\n } else if (isInFavorites) {\n setMode(modes.DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS, {\n ...trackingInfo,\n AccessFrom: GET_INFO_FAVORITES_LIST,\n })\n } else if (isInSwap) {\n selectSwapItemForDetails(id)\n setMode(modes.DESIGN_SIDEPANEL_MODE_SWAP_DETAILS, { ...trackingInfo, AccessFrom: GET_INFO_SWAP_LIST })\n } else {\n setMode(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_DETAILS, { ...trackingInfo, AccessFrom: GET_INFO_CATALOG_LIST })\n }\n }\n\n render() {\n const { furnitureData, mode, selectedFurnitureData, isDesignSummaryVisible } = this.props\n const isInMyItems = mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE\n const isInFavorites = mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE\n const isInSwap = mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE\n const { isMobile = false } = this.context\n\n if (isInMyItems || isInFavorites || isDesignSummaryVisible) {\n return (\n
\n \n
\n )\n }\n if (isInSwap) {\n const threeColumns = !isMobile\n return (\n
\n \n
\n )\n }\n return (\n
\n \n
\n )\n }\n}\n\nProductItemContainer.contextType = SugarcubeContext\nProductItemContainer.defaultProps = {\n selectedFurnitureData: null,\n selectedId: null,\n selectedSwapFurnitureData: null,\n trackingInfoAddedFrom: null,\n}\n\nProductItemContainer.propTypes = {\n furnitureData: productDataType.isRequired,\n onSelect: func.isRequired,\n compositionId: number.isRequired,\n addProductToRoom: func.isRequired,\n setMode: func.isRequired,\n selectItem: func.isRequired,\n trackingInfoAddedFrom: string,\n addToBag: func.isRequired,\n mode: string.isRequired,\n selectedFurnitureData: productDataType,\n onSwap: func.isRequired,\n selectedId: number,\n selectSwapItemForDetails: func.isRequired,\n selectedSwapFurnitureData: productDataType,\n isDesignSummaryVisible: bool.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n compositionId: getSelectedCompositionId(state),\n mode: getDesignSidepanelMode(state),\n selectedFurnitureData: getSelectedFurnitureData(state),\n selectedId: getSelectedRenderItemId(state),\n selectedSwapFurnitureData: getSelectedSwapFurnitureData(state),\n isDesignSummaryVisible: getShowDesignSummary(state),\n})\n\nconst mapDispatchToProps = {\n addProductToRoom: clickPlaceRenderItem,\n onSelect: selectFurniture,\n setMode: setDesignSidepanelMode,\n selectItem: selectCompositionRenderItem,\n addToBag: addToBagAction,\n onSwap: swapRenderItem,\n selectSwapItemForDetails: selectSwapFurnitureForDetails,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductItemContainer)\n","import React from 'react'\nimport classNames from 'classnames'\nimport { bool, func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport Icon from 'components/uiElements/Icon'\nimport * as modes from 'models/ui/constants'\nimport { productsDataType, sidepanelTabsType } from 'models/propTypes'\n\nrequire('./SidepanelMenu.scss')\n\nconst SidepanelMenu = ({ setMode, isAdmin, addedToRoomItems, isOpen, open, hasFavoritesList, selectedTabs }) => {\n const { t } = useTranslation()\n\n const { isSwapSelected, isBrowseSelected, isMyListSelected, isFavoritesSelected, isDebugSelected, isRateSelected } =\n selectedTabs\n\n const hasMyItems = !!addedToRoomItems.length\n\n const openSidepanel = (sidepanelMode) => {\n if (!isOpen) {\n open()\n }\n setMode(sidepanelMode)\n }\n return (\n
\n openSidepanel(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE)}\n data-testid=\"sidepanel-menu-products\"\n key=\"products\"\n id=\"sidepanel-menu-products\"\n role=\"tab\"\n aria-selected={isBrowseSelected ? 'true' : 'false'}\n aria-controls=\"sidepanel-body-products\"\n >\n
\n \n {isBrowseSelected &&
{t('design.add')}
}\n
\n\n
\n \n openSidepanel(modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE)}\n key=\"swapItems\"\n data-testid=\"sidepanel-menu-swap-items\"\n id=\"sidepanel-menu-swap-items\"\n role=\"tab\"\n aria-selected={isSwapSelected ? 'true' : 'false'}\n aria-controls=\"sidepanel-body-swap\"\n >\n
\n \n {isSwapSelected &&
{t('design.product options')}
}\n
\n
\n \n {hasMyItems ? (\n openSidepanel(modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE)}\n key=\"myItems\"\n data-testid=\"sidepanel-menu-my-items\"\n id=\"sidepanel-menu-my-items\"\n role=\"tab\"\n aria-selected={isSwapSelected ? 'true' : 'false'}\n aria-controls=\"sidepanel-body-my-items\"\n >\n
\n \n {isMyListSelected &&
{t('design.my list')}
}\n
\n
\n \n ) : null}\n {hasFavoritesList ? (\n openSidepanel(modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE)}\n key=\"favorites\"\n data-testid=\"sidepanel-menu-favorites\"\n id=\"sidepanel-menu-favorites\"\n role=\"tab\"\n aria-selected={isFavoritesSelected ? 'true' : 'false'}\n aria-controls=\"sidepanel-body-favorites\"\n >\n
\n \n {isFavoritesSelected &&
{t('design.favorites')}
}\n
\n
\n \n ) : null}\n {isAdmin ? (\n <>\n openSidepanel(modes.DESIGN_SIDEPANEL_MODE_DEBUG)}\n key=\"debug\"\n data-testid=\"sidepanel-menu-debug\"\n id=\"sidepanel-menu-debug\"\n role=\"tab\"\n aria-selected={isDebugSelected ? 'true' : 'false'}\n aria-controls=\"sidepanel-body-debug\"\n >\n
\n \n
\n\n
\n \n openSidepanel(modes.DESIGN_SIDEPANEL_MODE_RATE)}\n key=\"rate\"\n data-testid=\"sidepanel-menu-rate\"\n id=\"sidepanel-menu-rate\"\n role=\"tab\"\n aria-selected={isRateSelected ? 'true' : 'false'}\n aria-controls=\"sidepanel-body-rate\"\n >\n
\n \n
\n\n
\n \n \n ) : null}\n
\n )\n}\n\nSidepanelMenu.propTypes = {\n setMode: func.isRequired,\n isAdmin: bool.isRequired,\n isOpen: bool.isRequired,\n addedToRoomItems: productsDataType.isRequired,\n open: func.isRequired,\n hasFavoritesList: bool.isRequired,\n selectedTabs: sidepanelTabsType.isRequired,\n}\n\nexport default SidepanelMenu\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { bool, func } from 'prop-types'\n\nimport { getDesignSidepanelOpen, getSelectedSidepanelTabs } from 'models/ui/selectors'\nimport { setDesignSidepanelMode, openDesignSidepanel } from 'models/ui/actions'\nimport { getIsAdmin } from 'models/user/selectors'\nimport { getSelectedCompositionShoppableProductData } from 'models/compositions/selectors'\nimport { productsDataType, sidepanelTabsType } from 'models/propTypes'\nimport { getHasFavoritesList } from 'models/favorites/selectors'\n\nimport SidepanelMenu from 'components/designSidepanel/SidepanelMenu'\n\nconst SidepanelMenuContainer = ({\n setMode,\n isAdmin,\n addedToRoomItems,\n isOpen,\n openOptions,\n hasFavoritesList,\n selectedTabs,\n}) => (\n \n)\n\nSidepanelMenuContainer.propTypes = {\n isOpen: bool.isRequired,\n isAdmin: bool.isRequired,\n setMode: func.isRequired,\n openOptions: func.isRequired,\n addedToRoomItems: productsDataType.isRequired,\n hasFavoritesList: bool.isRequired,\n selectedTabs: sidepanelTabsType.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n isOpen: getDesignSidepanelOpen(state),\n isAdmin: getIsAdmin(state),\n addedToRoomItems: getSelectedCompositionShoppableProductData(state),\n hasFavoritesList: getHasFavoritesList(state),\n selectedTabs: getSelectedSidepanelTabs(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n setMode: (mode) => dispatch(setDesignSidepanelMode(mode)),\n openOptions: () => dispatch(openDesignSidepanel()),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidepanelMenuContainer)\n","import React, { useContext } from 'react'\nimport { productsDataType } from 'models/propTypes'\nimport ProductItemContainer from 'containers/designSidepanel/ProductItemContainer'\nimport { FURNITURE_BROWSE_NUM_COLUMNS } from 'models/ui/constants'\nimport { TRACKING_ADDED_FROM_RECOMMENDED } from 'models/tracking/constants'\nimport { useTranslation } from 'react-i18next'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./RelatedProducts.scss')\n\nconst RelatedProducts = ({ furnituresData }) => {\n const { t } = useTranslation()\n const { isMobile } = useContext(SugarcubeContext)\n\n if (!furnituresData || !furnituresData.length) {\n return null\n }\n\n const rowCount = isMobile ? 1 : Math.ceil(furnituresData.length / FURNITURE_BROWSE_NUM_COLUMNS)\n const rowArray = [...Array(rowCount).keys()]\n return (\n
\n
{t('related.you may also like')}
\n
\n {rowArray.map((_, index) => {\n const data1 = furnituresData[2 * index]\n const data2 = furnituresData[2 * index + 1]\n return (\n
\n {data1 && (\n \n )}\n {data2 && (\n \n )}\n
\n )\n })}\n
\n
\n )\n}\n\nRelatedProducts.defaultProps = {\n furnituresData: [],\n}\nRelatedProducts.propTypes = {\n furnituresData: productsDataType,\n}\nexport default RelatedProducts\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { productsDataType } from 'models/propTypes'\nimport { getSelectedFurnitureRecommendedListData } from 'models/furniture/selectors'\n\nimport RelatedProducts from '../../components/designSidepanel/RelatedProducts'\n\nconst RelatedProductsContainer = ({ relatedFurnitureData }) => \n\nRelatedProductsContainer.defaultProps = {\n relatedFurnitureData: [],\n}\n\nRelatedProductsContainer.propTypes = {\n relatedFurnitureData: productsDataType,\n}\n\nconst mapStateToProps = (state) => ({\n relatedFurnitureData: getSelectedFurnitureRecommendedListData(state),\n})\n\nexport default connect(mapStateToProps)(RelatedProductsContainer)\n","import React from 'react'\nimport { func, string } from 'prop-types'\nimport Icon from 'components/uiElements/Icon'\n\nrequire('./BackNavigationHeader.scss')\n\nconst BackNavigationHeader = ({ onClick, navigationText }) => (\n
\n \n
\n)\n\nBackNavigationHeader.propTypes = {\n onClick: func.isRequired,\n navigationText: string.isRequired,\n}\nexport default BackNavigationHeader\n","import React, { Component } from 'react'\nimport { string, func } from 'prop-types'\nimport classNames from 'classnames'\n\nimport { dropdownOptionsType, dropdownOptionKeyType } from 'models/propTypes'\n\nimport Icon from 'components/uiElements/Icon'\n\nrequire('./Dropdown.scss')\n\nclass Dropdown extends Component {\n constructor(props) {\n super(props)\n this.toggleOpen = this.toggleOpen.bind(this)\n this.onChange = this.onChange.bind(this)\n this.close = this.close.bind(this)\n\n this.state = {\n open: false,\n }\n }\n\n onChange(e, item) {\n const event = e\n event.target = {\n name: this.props.name,\n value: item.key,\n }\n\n this.toggleOpen()\n this.props.onChange(event)\n }\n\n close() {\n document.removeEventListener('click', this.close)\n this.setState({ open: false })\n }\n\n toggleOpen() {\n const isOpen = this.state.open\n this.setState({ open: !isOpen }, () => {\n if (this.state.open) {\n const timeoutId = window.setTimeout(() => {\n document.addEventListener('click', this.close)\n window.clearTimeout(timeoutId)\n }, 100)\n }\n })\n }\n\n render() {\n const { value, options, placeholder } = this.props\n const { open } = this.state\n const selectedItem = options.find((item) => item.key === value)\n const offDefault = value !== options[0].key\n return (\n
\n
\n
{(selectedItem && selectedItem.label) || placeholder}
\n \n
\n
\n {options.map((item) => (\n this.onChange(e, item)}\n >\n {item.label}\n
\n ))}\n
\n
\n )\n }\n}\n\nDropdown.defaultProps = {\n placeholder: '',\n}\n\nDropdown.propTypes = {\n value: dropdownOptionKeyType.isRequired,\n options: dropdownOptionsType.isRequired,\n onChange: func.isRequired,\n placeholder: string,\n name: string.isRequired,\n}\n\nexport default Dropdown\n","/* eslint-disable i18next/no-literal-string */\nimport React, { useState } from 'react'\nimport { func, string, bool } from 'prop-types'\nimport classNames from 'classnames'\nimport { renderItemType } from 'models/propTypes'\nimport { convertMeterDimensionsByLocale, convertDimensionsToMeterByLocale } from 'utils/convertDimensions'\nimport { LOCALES_USING_IMPERIAL_SYSTEM } from 'models/location/constants'\nimport Dropdown from 'components/formElements/Dropdown'\nimport { Input } from 'components/FormElements'\nimport { ART_FRAMES, ART_SIZES } from 'models/furniture/artConstants'\n\nrequire('./OptionSelectorView.scss')\n\nconst ACTUAL_SIZE_ID = 1\nconst CUSTOM_SIZE_ID = 999\n\nconst OptionSelectorView = ({ selectedRenderItem, updateRenderItem, locale, canEditArtSize }) => {\n const artRatio = selectedRenderItem.displayWidthCm / selectedRenderItem.displayHeightCm\n const { height: initialHeight } = selectedRenderItem.size\n const [customHeight, setCustomHeight] = useState(convertMeterDimensionsByLocale(initialHeight, locale))\n const [customWidth, setCustomWidth] = useState(convertMeterDimensionsByLocale(initialHeight * artRatio, locale))\n\n const updateArtItem = (event, data) => {\n if (event) {\n event.stopPropagation()\n }\n updateRenderItem(data)\n }\n\n const updateSize = (e) => {\n const { name, value } = e.target\n let height = null\n if (value === CUSTOM_SIZE_ID) {\n height = selectedRenderItem.size.height\n\n if (value !== selectedRenderItem.sizeId) {\n setCustomHeight(convertMeterDimensionsByLocale(height, locale))\n setCustomWidth(convertMeterDimensionsByLocale(height * artRatio, locale))\n }\n }\n updateArtItem(e, {\n [name]: value,\n customHeight: height,\n })\n }\n\n const updateCustomSize = (e) => {\n const { name, value } = e.target\n let height\n let width\n\n if (name === 'height') {\n height = value\n width = value * artRatio\n } else {\n width = value\n height = value / artRatio\n }\n setCustomHeight(Math.ceil(height * 4) / 4)\n setCustomWidth(Math.ceil(width * 4) / 4)\n\n updateArtItem(e, { customHeight: convertDimensionsToMeterByLocale(height, locale) })\n }\n\n const makeLabel = ({ id, name, height: sizeHeight }) => {\n if (id === CUSTOM_SIZE_ID) {\n return name\n }\n let height = sizeHeight\n let suffix = ''\n if (id === ACTUAL_SIZE_ID) {\n height = selectedRenderItem.displayHeightCm / 100\n suffix = ' (actual)'\n }\n const dimensionSymbol = LOCALES_USING_IMPERIAL_SYSTEM.includes(locale) ? '\"' : 'cm'\n return `${convertMeterDimensionsByLocale(\n height * artRatio,\n locale,\n )}${dimensionSymbol} x ${convertMeterDimensionsByLocale(height, locale)}${dimensionSymbol}${suffix}`\n }\n\n if (!selectedRenderItem) {\n return
Select something in your room
\n }\n\n const {\n frame: { color, colors, mattes, matte, name: frameName },\n frameId: selectedFrameId,\n colorId: selectedColorId,\n matteId: selectedMatteId,\n sizeId: selectedSizeId,\n } = selectedRenderItem\n\n return (\n
\n
\n
\n {canEditArtSize && (\n
\n
\n
Size
\n
\n
\n ({\n key: item.id,\n label: makeLabel(item),\n }))}\n onChange={updateSize}\n />\n {selectedSizeId === CUSTOM_SIZE_ID ? (\n
\n
\n Width\n \n
\n
\n Height\n \n
\n
\n ) : null}\n
\n
\n )}\n
\n
\n
Frames
\n
\n {frameName}\n {selectedFrameId !== 1 ? ' (Frame not included)' : ''}\n
\n
\n
\n {Object.keys(ART_FRAMES).map((id) => {\n const frameId = parseInt(id, 10)\n const frameData = ART_FRAMES[frameId]\n const selected = frameId === selectedFrameId\n\n return (\n \n
\n {\n updateArtItem(e, { frameId })\n }}\n />\n
\n
\n )\n })}\n
\n
\n {color && (\n
\n
\n
Colors
\n
{color.name}
\n
\n
\n {colors &&\n Object.keys(colors).map((cId) => {\n const colorId = parseInt(cId, 10)\n const colorData = colors[colorId]\n const selected = selectedColorId === colorId\n return (\n \n
\n {\n updateArtItem(e, { colorId })\n }}\n />\n
\n
\n )\n })}\n
\n
\n )}\n
\n
\n
Mats
\n
{matte.name}
\n
\n
\n {Object.keys(mattes).map((mId) => {\n const matteId = parseInt(mId, 10)\n const matteData = mattes[matteId]\n const selected = matteId === selectedMatteId\n return (\n
\n updateArtItem(e, { matteId })}\n >\n
\n
\n
\n
\n
\n
\n
\n )\n })}\n
\n
\n
\n
\n
\n )\n}\n\nOptionSelectorView.propTypes = {\n selectedRenderItem: renderItemType.isRequired,\n updateRenderItem: func.isRequired,\n locale: string.isRequired,\n canEditArtSize: bool.isRequired,\n}\n\nexport default OptionSelectorView\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { func, string, bool } from 'prop-types'\n\nimport { renderItemType } from 'models/propTypes'\n\nimport { ART_ITEM } from 'constants/renderItemTypes'\nimport { getSelectedRenderItem } from 'models/compositions/selectors'\nimport { getRegion } from 'models/location/selectors'\nimport { getCanEditArtSize } from 'models/admin/selectors'\nimport { updateSelectedCompositionRenderItem } from 'models/compositions/actions'\nimport OptionSelectorView from 'components/designSidepanel/OptionSelectorView'\nimport { ART_FRAMES, ART_SIZES } from 'models/furniture/artConstants'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nclass OptionSelectorViewContainer extends Component {\n constructor(props) {\n super(props)\n this.updateRenderItem = this.updateRenderItem.bind(this)\n }\n\n updateRenderItem(settings) {\n const item = { ...settings }\n const { selectedRenderItem: artItem } = this.props\n\n if (!item.matteId && item.frameId) {\n if (!ART_FRAMES[item.frameId].mattes[artItem.matteId]) {\n item.matteId = parseInt(Object.keys(ART_FRAMES[item.frameId].mattes)[0], 10)\n }\n }\n const productTrackingInfo = getProductTrackingInfo(artItem)\n const trackingInfo = {\n ...productTrackingInfo,\n OriginalProperties: {},\n FinalProperties: {},\n }\n if (item.frameId) {\n trackingInfo.OriginalProperties.frameId = artItem.frameId\n trackingInfo.FinalProperties.frameId = item.frameId\n }\n if (item.matteId) {\n trackingInfo.OriginalProperties.matteId = artItem.matteId\n trackingInfo.FinalProperties.matteId = item.matteId\n }\n if (item.colorId) {\n trackingInfo.OriginalProperties.colorId = artItem.colorId\n trackingInfo.FinalProperties.colorId = item.colorId\n }\n if (item.sizeId) {\n trackingInfo.OriginalProperties.sizeId = artItem.sizeId\n trackingInfo.FinalProperties.sizeId = item.sizeId\n }\n if (item.customHeight || item.sizeId) {\n trackingInfo.OriginalSize = artItem.customHeight || artItem.size.height\n trackingInfo.FinalSize = item.customHeight || ART_SIZES[item.sizeId].height\n }\n this.props.updateSelectedCompositionRenderItem(item, trackingInfo)\n }\n\n render() {\n const { selectedRenderItem, locale, canEditArtSize } = this.props\n if (!selectedRenderItem || selectedRenderItem.renderType !== ART_ITEM) {\n return null\n }\n return (\n \n )\n }\n}\n\nOptionSelectorViewContainer.defaultProps = {\n selectedRenderItem: null,\n}\n\nOptionSelectorViewContainer.propTypes = {\n selectedRenderItem: renderItemType,\n updateSelectedCompositionRenderItem: func.isRequired,\n locale: string.isRequired,\n canEditArtSize: bool.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n selectedRenderItem: getSelectedRenderItem(state),\n locale: getRegion(state),\n canEditArtSize: getCanEditArtSize(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n updateSelectedCompositionRenderItem: (...args) => dispatch(updateSelectedCompositionRenderItem(...args)),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(OptionSelectorViewContainer)\n","/* eslint-disable i18next/no-literal-string */\nimport React from 'react'\n\nimport { ProductData } from 'models/furniture'\n\nimport \"./AdminProductDetails.scss\"\n\nconst AdminProductDetails = ({ productData }: { productData: ProductData }) => (\n
\n
    \n
  • Geo Id: {productData.id}
  • \n
  • LocalItemNumber: {productData.localItemNumber}
  • \n
  • GlobalProductId: {productData.globalProductId}
  • \n
  • QA Status: {productData.qaStatus}
  • \n
  • Stacks: {productData.stacks.toString()}
  • \n
  • RenderType: {productData.renderType}
  • \n
  • \n \n Jiji Global\n \n
  • \n
  • \n \n Jiji Local\n \n
  • \n
\n
\n)\n\nexport default AdminProductDetails\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport { RootState } from 'store'\n\nimport { getIsAdmin } from 'models/user/selectors'\nimport { getDebugSettings } from 'models/admin/selectors'\n\nimport AdminProductDetails from 'components/admin/AdminProductDetails'\nimport type { ProductData } from 'models/furniture'\nimport type { DebugSettings } from 'models/admin'\n\ninterface AdminProductDetailsContainerProps {\n isAdmin: boolean\n productData: ProductData\n debugSettings: DebugSettings\n}\n\nconst AdminProductDetailsContainer = ({ isAdmin, productData, debugSettings }: AdminProductDetailsContainerProps) => (\n (isAdmin && debugSettings.showProductAdminData) ? : null\n)\n\nconst mapStateToProps = (state: RootState) => ({\n isAdmin: getIsAdmin(state),\n debugSettings: getDebugSettings(state),\n})\n\nexport default connect(mapStateToProps)(AdminProductDetailsContainer)\n","import React from 'react'\nimport Icon from 'components/uiElements/Icon'\nimport { string, number } from 'prop-types'\n\nrequire('./StarRatings.scss')\n\nconst STAR_FILLED_SVG = 'rating_star_filled'\nconst STAR_HALF_FILLED_SVG = 'rating_star_filled_half'\nconst STAR_EMPTY_SVG = 'rating_star_empty'\nconst STAR_RATING_MAX_VALUE = 5\n\n// This function returns an array of icon svg codes, given\n// value: string value of a number between 0.0 to maxValue\n// maxValue: number of maximum stars\n// This function rounds up the ratings like ikea.\n// Ex: 4.2 -> 4 and a half stars, 4.8 -> 5 stars\n\n// TODO: put this helper function in another file and unit test\nconst getStarIconArray = (value, maxValue) => {\n const resultArray = []\n const valueNumber = parseFloat(value)\n if (!maxValue || Number.isNaN(valueNumber)) {\n return resultArray\n }\n const fullStarsIndex = Math.round(valueNumber)\n const decimalPart = valueNumber - Math.floor(valueNumber)\n\n const needsHalfStar = decimalPart > 0 && decimalPart < 0.5\n\n for (let i = 1; i <= maxValue; i += 1) {\n if (i <= fullStarsIndex) {\n resultArray.push(STAR_FILLED_SVG)\n } else if (i === fullStarsIndex + 1 && needsHalfStar) {\n resultArray.push(STAR_HALF_FILLED_SVG)\n } else {\n resultArray.push(STAR_EMPTY_SVG)\n }\n }\n return resultArray\n}\n\nconst StarRatings = ({ value, count }) => {\n const starIconArray = getStarIconArray(value, STAR_RATING_MAX_VALUE)\n const ariaLabelText = `Review: ${value} out of ${STAR_RATING_MAX_VALUE} stars`\n\n if (!starIconArray.length) {\n return null\n }\n return (\n
\n \n {starIconArray.map((starIconCode, index) => (\n // eslint-disable-next-line react/no-array-index-key\n \n \n \n ))}\n \n\n {count && {count}}\n
\n )\n}\nStarRatings.defaultProps = {\n count: null,\n}\n\nStarRatings.propTypes = {\n value: string.isRequired,\n count: number,\n}\nexport default StarRatings\n","import React, { useContext } from 'react'\nimport { func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport { productDataType } from 'models/propTypes'\nimport ProductItemDetail from 'components/designSidepanel/ProductItemDetail'\nimport Icon from 'components/uiElements/Icon'\nimport StarRatings from 'components/uiElements/StarRatings'\nimport { ProductData } from 'models/furniture'\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./ProductSummary.scss')\n\ninterface ProductSummaryProps {\n productData: ProductData;\n trackShowDetails?: () => void;\n}\n\nconst ProductSummary = ({ productData, trackShowDetails }: ProductSummaryProps) => {\n const { t } = useTranslation()\n const { isKiosk } = useContext(SugarcubeContext)\n\n const { name, ecommerceUrl, description, price, rating, ratingCount } = productData\n return (\n
\n \n {rating && }\n {ecommerceUrl && !isKiosk && (\n \n )}\n
\n )\n}\nProductSummary.propTypes = {\n productData: productDataType.isRequired,\n trackShowDetails: func.isRequired,\n}\n\nexport default ProductSummary\n","import React, { useState } from 'react'\nimport classNames from 'classnames'\nimport Icon from 'components/uiElements/Icon'\nimport { string, arrayOf, func } from 'prop-types'\n\nrequire('./ImagePicker.scss')\n\nconst ImagePicker = ({ images, thumbUrl, name, onLoad }) => {\n const [selectedImageIndex, setSelectedImageIndex] = useState(0)\n\n if (!images || images.length === 1) {\n return (\n
\n {name}\n
\n )\n }\n\n // refs will store a ref for each image so that it can be scrolled into view.\n const refs = {}\n\n const scrollSelectedImageIntoView = () => {\n const selectedImageElement = refs[selectedImageIndex].current\n if (selectedImageElement) {\n selectedImageElement.scrollIntoView({\n behavior: 'smooth',\n inline: 'center',\n block: 'nearest',\n })\n }\n }\n\n const onPrevImageClick = (e) => {\n e.stopPropagation()\n if (selectedImageIndex > 0) {\n setSelectedImageIndex(selectedImageIndex - 1)\n scrollSelectedImageIntoView()\n }\n }\n\n const onNextImageClick = (e) => {\n e.stopPropagation()\n if (selectedImageIndex < images.length - 1) {\n setSelectedImageIndex(selectedImageIndex + 1)\n scrollSelectedImageIntoView()\n }\n }\n\n const selectedImageUrl = images[selectedImageIndex]\n return (\n
\n
\n
\n
\n \n \n
\n
\n {name}\n
\n
    \n {images.map((image, index) => {\n refs[index] = React.createRef()\n return (\n \n \n \n )\n })}\n
\n
\n )\n}\n\nImagePicker.defaultProps = {\n images: [],\n onLoad: () => {},\n}\n\nImagePicker.propTypes = {\n images: arrayOf(string),\n thumbUrl: string.isRequired,\n name: string.isRequired,\n onLoad: func,\n}\n\nexport default ImagePicker\n","import React, { useContext } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { func, bool } from 'prop-types'\nimport Button from '@ingka/button'\nimport SSRIcon from '@ingka/ssr-icon'\nimport shoppingBagAdd from '@ingka/ssr-icon/paths/shopping-bag-add'\n\nimport { productDataType } from 'models/propTypes'\nimport * as RenderItemTypes from 'constants/renderItemTypes'\nimport RelatedProductsContainer from 'containers/designSidepanel/RelatedProductsContainer'\nimport Icon from 'components/uiElements/Icon'\nimport BackNavigationHeader from 'components/designSidepanel/BackNavigationHeader'\nimport Tooltip from 'components/Tooltip'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport OptionSelectorViewContainer from 'containers/designSidepanel/OptionSelectorViewContainer'\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\nimport { TRACK_LOCATION_SIDEPANEL } from 'models/tracking/constants'\nimport AdminProductDetailsContainer from 'containers/admin/AdminProductDetailsContainer'\nimport ProductSummary from 'components/designSidepanel/ProductSummary'\nimport ImagePicker from './ImagePicker'\n\nrequire('./ItemDetailsView.scss')\n\nconst ItemDetailsView = ({\n productData,\n deleteItem,\n addToBag,\n trackShowDetails,\n swapItem,\n disableSwapCta,\n onBackClick,\n isInSwap,\n}) => {\n const { t } = useTranslation()\n\n const { name, thumbUrl, imageUrls, localItemNumber } = productData\n const { isMagicWindow, isMobile, isKiosk } = useContext(SugarcubeContext)\n const navigationText = isInSwap\n ? `${t('design.swap list')} > ${name.toUpperCase()}`\n : t('design.products in this room')\n const showAddToBagPrimary = addToBag && !isInSwap && !isKiosk\n\n const ctaContainer = (\n
\n {isInSwap && (\n <>\n \n {t('design.swap')}\n \n\n {!isKiosk && (\n \n \n \n )}\n \n )}\n {showAddToBagPrimary && (\n \n )}\n
\n \n {deleteItem && (\n <>\n \n \n \n \n \n )}\n
\n
\n )\n\n return (\n
\n \n
\n
\n
\n \n
\n
\n \n \n {isMobile && ctaContainer}\n
\n
\n {!isMobile && ctaContainer}\n {!isInSwap && productData.renderType === RenderItemTypes.ART_ITEM && (\n
\n \n
\n )}\n {!isMagicWindow && }\n
\n
\n )\n}\n\nItemDetailsView.defaultProps = {\n addToBag: null,\n deleteItem: null,\n swapItem: null,\n disableSwapCta: false,\n isInSwap: false,\n}\n\nItemDetailsView.propTypes = {\n productData: productDataType.isRequired,\n deleteItem: func,\n addToBag: func,\n trackShowDetails: func.isRequired,\n isInSwap: bool,\n swapItem: func,\n disableSwapCta: bool,\n onBackClick: func.isRequired,\n}\n\nexport default ItemDetailsView\n","import * as types from 'models/actionTypes'\n\nexport const trackShowDetails = (trackingInfo) => ({\n type: types.TRACK_SHOW_DETAILS,\n trackingInfo,\n})\n\nexport default trackShowDetails\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { func, number, string } from 'prop-types'\nimport { productDataType } from 'models/propTypes'\nimport { setDesignSidepanelMode } from 'models/ui/actions'\nimport ItemDetailsView from 'components/designSidepanel/ItemDetailsView'\nimport { deleteCompositionRenderItem, swapRenderItem } from 'models/compositions/actions'\nimport {\n getSelectedCompositionId,\n getSelectedCompositionRenderedFurnitureItem,\n getSelectedRenderItemId,\n} from 'models/compositions/selectors'\nimport { PRODUCT_SWAP } from 'models/tracking/constants'\nimport { trackShowDetails as trackShowDetailsAction } from 'models/tracking/actions'\nimport { addToBag as addToBagAction } from 'models/bag/actions'\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport { getSelectedSwapDetailsFurnitureData } from 'models/furniture/selectors'\nimport { selectSwapFurnitureForDetails } from 'models/furniture/actions'\nimport * as modes from 'models/ui/constants'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nconst ItemDetailsViewContainer = ({\n setMode,\n productData,\n deleteItem,\n compositionId,\n addToBag,\n trackShowDetails,\n mode,\n onSwap,\n selectedSwapDetailsData,\n selectedRenderItemId,\n clearSwapSelection,\n}) => {\n const swapItem = (e) => {\n e.stopPropagation()\n const { id: swappedFurnitureId } = selectedSwapDetailsData\n const swappedInProductTrackingInfo = getProductTrackingInfo(selectedSwapDetailsData)\n const swappedInTrackingInfo = {\n ...swappedInProductTrackingInfo,\n AddedFrom: PRODUCT_SWAP,\n }\n\n if (productData) {\n const removedProductTrackingInfo = getProductTrackingInfo(productData)\n\n const removedTrackingInfo = {\n ...removedProductTrackingInfo,\n RemovedFrom: PRODUCT_SWAP,\n }\n\n const trackingInfo = {\n swappedInTrackingInfo,\n removedTrackingInfo,\n }\n onSwap(selectedRenderItemId, swappedFurnitureId, trackingInfo)\n }\n }\n\n const removeRenderItem = () => {\n const trackingInfo = getProductTrackingInfo(productData)\n deleteItem(compositionId, productData.uniqueId, trackingInfo)\n }\n\n const goBack = () => {\n const isInSwap = mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_DETAILS\n const isInFavorites = mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS\n if (isInSwap) {\n setMode(modes.DESIGN_SIDEPANEL_MODE_SWAP_BROWSE)\n // clear the selected swap details id in the state\n clearSwapSelection()\n } else if (isInFavorites) {\n setMode(modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE)\n } else {\n setMode(modes.DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE)\n }\n }\n\n const isInSwap = mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_DETAILS\n const childProductData = isInSwap ? selectedSwapDetailsData : productData\n const { localItemNumber, region, name: productTitle } = childProductData\n\n const trackingInfo = getProductTrackingInfo(childProductData)\n const disableSwapCta = childProductData.id === productData.id\n\n const onAddToBag = () => addToBag(localItemNumber, region, productTitle, trackingInfo)\n\n return isInSwap ? (\n trackShowDetails(trackingInfo)}\n addToBag={onAddToBag}\n onBackClick={goBack}\n isInSwap\n swapItem={swapItem}\n disableSwapCta={disableSwapCta}\n />\n ) : (\n trackShowDetails(trackingInfo)}\n addToBag={onAddToBag}\n onBackClick={goBack}\n deleteItem={removeRenderItem}\n />\n )\n}\n\nItemDetailsViewContainer.defaultProps = {\n selectedSwapDetailsData: null,\n selectedRenderItemId: null,\n}\n\nItemDetailsViewContainer.propTypes = {\n setMode: func.isRequired,\n deleteItem: func.isRequired,\n productData: productDataType.isRequired,\n compositionId: number.isRequired,\n addToBag: func.isRequired,\n trackShowDetails: func.isRequired,\n mode: string.isRequired,\n onSwap: func.isRequired,\n selectedSwapDetailsData: productDataType,\n selectedRenderItemId: number,\n clearSwapSelection: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n productData: getSelectedCompositionRenderedFurnitureItem(state),\n compositionId: getSelectedCompositionId(state),\n mode: getDesignSidepanelMode(state),\n selectedSwapDetailsData: getSelectedSwapDetailsFurnitureData(state),\n selectedRenderItemId: getSelectedRenderItemId(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n setMode: (mode) => dispatch(setDesignSidepanelMode(mode)),\n deleteItem: (...args) => dispatch(deleteCompositionRenderItem(...args)),\n addToBag: (...args) => dispatch(addToBagAction(...args)),\n trackShowDetails: (info) => dispatch(trackShowDetailsAction(info)),\n clearSwapSelection: () => dispatch(selectSwapFurnitureForDetails(-1)),\n onSwap: (...args) => dispatch(swapRenderItem(...args)),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ItemDetailsViewContainer)\n","import React, { useRef, useContext } from 'react'\nimport { FixedSizeList as List } from 'react-window'\nimport AutoSizer from 'react-virtualized-auto-sizer'\nimport { bool, func, number, string } from 'prop-types'\nimport { productsDataType } from 'models/propTypes'\nimport classNames from 'classnames'\n\nimport {\n MY_ITEMS_BROWSE_NUM_COLUMNS,\n FURNITURE_BROWSE_NUM_COLUMNS,\n FURNITURE_SWAP_NUM_COLUMNS,\n} from 'models/ui/constants'\nimport { TRACKING_ADDED_FROM_CATALOG } from 'models/tracking/constants'\n\nimport ProductItemContainer from 'containers/designSidepanel/ProductItemContainer'\nimport BouncingBallLoader from 'components/uiElements/BouncingBallLoader'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./Products.scss')\n\nconst ITEM_HEIGHT_BY_COL = {\n [MY_ITEMS_BROWSE_NUM_COLUMNS]: 200,\n [FURNITURE_BROWSE_NUM_COLUMNS]: 280,\n [FURNITURE_SWAP_NUM_COLUMNS]: 280,\n}\nconst ITEM_WIDTH = 150\n\nconst NEXT_PAGE_TRIGGER = 1000\nconst DEFAULT_LIST_LAYOUT = 'vertical'\n\nconst Products = ({ furnituresData, furnitureIsLoading, requestFurniture, columnCount, listLayout }) => {\n const { isMobile } = useContext(SugarcubeContext)\n const itemSize = isMobile ? ITEM_WIDTH : ITEM_HEIGHT_BY_COL[columnCount]\n const actualColumnCount = isMobile ? 1 : columnCount\n\n const containerHeightRef = useRef()\n if (!(furnituresData && furnituresData.length)) {\n if (furnitureIsLoading) {\n return \n }\n return null\n }\n\n const onScroll = ({ scrollOffset }) => {\n if (containerHeightRef.current) {\n const loadTrigger = (furnituresData.length / actualColumnCount) * itemSize - NEXT_PAGE_TRIGGER\n const scrollProgress = scrollOffset + containerHeightRef.current.clientHeight\n if (scrollProgress > loadTrigger && !furnitureIsLoading && requestFurniture) {\n requestFurniture()\n }\n }\n }\n\n return (\n
\n \n {({ height, width }) => (\n \n {({ index, style }) => {\n // This returns the content of each row in the list.\n // The itemCount prop in the List component = the number of rows\n // We ensure that we will not have have an out of bounds index by\n // using Math.ceil().\n // if actualColumnCount is 2, Ex: 11 items --> Math.ceil(11/2) = 6 rows\n const colArray = [...Array(actualColumnCount).keys()]\n const furnitureRowArray = colArray.map((colIndex) => {\n const furnitureDataIndex = actualColumnCount * index + colIndex\n\n return furnituresData[furnitureDataIndex]\n })\n\n return (\n
\n
\n {furnitureRowArray.map((data) =>\n data ? (\n \n ) : null,\n )}\n
\n
\n )\n }}\n \n )}\n
\n
\n )\n}\n\nProducts.defaultProps = {\n furnitureIsLoading: false,\n requestFurniture: null,\n columnCount: FURNITURE_BROWSE_NUM_COLUMNS,\n furnituresData: [],\n listLayout: DEFAULT_LIST_LAYOUT,\n}\n\nProducts.propTypes = {\n furnituresData: productsDataType,\n furnitureIsLoading: bool,\n requestFurniture: func,\n columnCount: number,\n listLayout: string,\n}\n\nexport default Products\n","import React, { useContext } from 'react'\nimport { string, func } from 'prop-types'\nimport classNames from 'classnames'\nimport { productsDataType } from 'models/propTypes'\nimport { useTranslation } from 'react-i18next'\nimport * as modes from 'models/ui/constants'\nimport ItemDetailsViewContainer from 'containers/designSidepanel/ItemDetailsViewContainer'\nimport { MY_ITEMS_BROWSE_NUM_COLUMNS } from 'models/ui/constants'\nimport Products from 'components/designSidepanel/Products'\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./MyItemsBrowseView.scss')\n\nconst MyItemsBrowseView = ({ addedToRoomItems, mode, addRoomToBag }) => {\n const { t } = useTranslation()\n const { isKiosk } = useContext(SugarcubeContext)\n const isDetailsVisible = mode === modes.DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS\n\n return (\n
\n {isDetailsVisible && (\n
\n \n
\n )}\n
\n
\n
\n \n
\n
\n {!isKiosk && (\n
\n \n
\n )}\n
\n
\n )\n}\n\nMyItemsBrowseView.propTypes = {\n addedToRoomItems: productsDataType.isRequired,\n mode: string.isRequired,\n addRoomToBag: func.isRequired,\n}\n\nexport default MyItemsBrowseView\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { string, func } from 'prop-types'\nimport { productsDataType } from 'models/propTypes'\n\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport { getSelectedCompositionShoppableProductData } from 'models/compositions/selectors'\nimport MyItemsBrowseView from 'components/designSidepanel/MyItemsBrowseView'\n\nimport { addRoomToBag as addRoomToBagAction } from 'models/bag/actions'\n\nconst MyItemsBrowseViewContainer = ({ addedToRoomItems, mode, addRoomToBag }) => {\n const productIds = addedToRoomItems.map((item) => item.localItemNumber)\n const region = addedToRoomItems.length ? addedToRoomItems[0].region : null\n const trackingInfo = { ProductsAdded: addedToRoomItems.length }\n\n return (\n addRoomToBag(productIds, region, trackingInfo)}\n />\n )\n}\n\nMyItemsBrowseViewContainer.propTypes = {\n addedToRoomItems: productsDataType.isRequired,\n mode: string.isRequired,\n addRoomToBag: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n addedToRoomItems: getSelectedCompositionShoppableProductData(state),\n mode: getDesignSidepanelMode(state),\n})\nconst mapDispatchToProps = {\n addRoomToBag: addRoomToBagAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MyItemsBrowseViewContainer)\n","import React, { useEffect } from 'react'\nimport { connect } from 'react-redux'\nimport { bool, func } from 'prop-types'\nimport { productsDataType } from 'models/propTypes'\n\nimport { requestFurniture as requestFurnitureAction } from 'models/furniture/actions'\n\nimport { getFurnitureByFilter, getFurnitureIsLoading, getCanLoadMore } from 'models/furniture/selectors'\n\nimport Products from 'components/designSidepanel/Products'\n\nconst ProductsContainer = ({ furnituresData, isInMyItems, furnitureIsLoading, canLoadMore, requestFurniture }) => {\n useEffect(() => {\n if (!(furnituresData && furnituresData.length) && !furnitureIsLoading && requestFurniture) {\n // Load initial furniture\n requestFurniture()\n }\n }, [])\n\n return (\n \n )\n}\n\nProductsContainer.defaultProps = {\n isInMyItems: false,\n}\n\nProductsContainer.propTypes = {\n furnituresData: productsDataType.isRequired,\n isInMyItems: bool,\n furnitureIsLoading: bool.isRequired,\n canLoadMore: bool.isRequired,\n requestFurniture: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n furnituresData: getFurnitureByFilter(state),\n furnitureIsLoading: getFurnitureIsLoading(state),\n canLoadMore: getCanLoadMore(state),\n})\n\nconst mapDispatchToProps = {\n requestFurniture: requestFurnitureAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductsContainer)\n","import React from 'react'\nimport { func, element } from 'prop-types'\nimport Icon from 'components/uiElements/Icon'\n\nrequire('./SheetModal.scss')\n\nconst SheetModal = ({ onClose, children }) => (\n
\n
\n
\n
\n \n
\n
{children}
\n
\n
\n
\n)\n\nSheetModal.propTypes = {\n onClose: func.isRequired,\n children: element.isRequired,\n}\n\nexport default SheetModal\n","import React, { useCallback, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport Button from '@ingka/button'\nimport plus from '@ingka/ssr-icon/paths/plus'\nimport minus from '@ingka/ssr-icon/paths/minus'\n\nimport { CATS_BY_ROOM_TYPE, CAT_ROOM_TYPES } from 'models/kiosk/constants'\nimport { updateFurnitureFilter as updateFurnitureFilterAction } from 'models/furniture/actions'\n\nimport './style.scss'\nimport classNames from 'classnames'\n\ninterface CategoryFiltersProps {\n updateFurnitureFilter: typeof updateFurnitureFilterAction\n}\n\nconst CategoryFilters = ({ updateFurnitureFilter }: CategoryFiltersProps) => {\n const { t } = useTranslation()\n const [roomFilter, setRoomFilter] = useState(CAT_ROOM_TYPES[0].key)\n const [isExpanded, setIsExpanded] = useState(false)\n\n const onRoomClick = useCallback((roomKey) => {\n setRoomFilter(roomKey)\n updateFurnitureFilter({ roomType: roomKey })\n }, [setRoomFilter, updateFurnitureFilter])\n const onCatClick = useCallback((cat) => {\n const nextFilter: { category?: string, subCategory?: string, query?: string } = {}\n\n if (cat.catId) {\n nextFilter.category = cat.catId\n\n if (cat.subCatId) {\n nextFilter.subCategory = cat.subCatId\n }\n } else if (cat.query) {\n nextFilter.query = cat.query\n }\n\n updateFurnitureFilter(nextFilter)\n\n }, [updateFurnitureFilter])\n\n const roomFilters = CAT_ROOM_TYPES.map((room) => (\n onRoomClick(room.key)}\n key={room.key}\n >\n {room.label}\n \n ))\n\n const content = CATS_BY_ROOM_TYPE[roomFilter].map((cat) => (\n \n ))\n\n\n return (\n
\n
\n {roomFilters}\n
\n
\n {content}\n
\n
\n { setIsExpanded(!isExpanded) }}\n >\n {t(isExpanded ? 'kiosk.view fewer categories' : 'kiosk.view more categories')}\n \n
\n
\n )\n}\n\nexport default CategoryFilters\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport { updateFurnitureFilter as updateFurnitureFilterAction } from 'models/furniture/actions'\n\nimport CategoryFilters from 'components/designSidepanel/ProductFilter/CategoryFilters'\n\ninterface CategoryFiltersContainerProps {\n updateFurnitureFilter: typeof updateFurnitureFilterAction,\n}\n\nconst CategoryFiltersContainer = ({ updateFurnitureFilter }: CategoryFiltersContainerProps) => (\n \n)\n\nconst mapDispatchToProps = {\n updateFurnitureFilter: updateFurnitureFilterAction,\n}\n\nexport default connect(null, mapDispatchToProps)(CategoryFiltersContainer)\n","import axios, { AxiosRequestConfig } from 'axios'\nimport { getPathRegion } from 'models/location/selectors'\n\ninterface Completion {\n completion: {\n text: string\n }\n}\ninterface Category {\n category: {\n name: string\n key: string\n }\n}\n\ntype SearchCompletionResponseItem = (Completion | Category)\n\ninterface Response {\n searchBox: {\n universal: SearchCompletionResponseItem[]\n }\n}\n\nconst SIK_SEARCH_BASE_URL = 'https://sik.search.blue.cdtapps.com'\nexport const getSearchCompletions = (searchTerm: string) => {\n const region = getPathRegion()\n const url = `${SIK_SEARCH_BASE_URL}/${region}/search-box?range=GEOMAGICAL&q=${searchTerm}`\n const config: AxiosRequestConfig = {\n headers: {\n Accept: `application/json`,\n 'Content-type': `application/json`,\n },\n method: `get`,\n url,\n }\n return axios.request(config)\n}\n\nexport default getSearchCompletions\n","import { useState, useEffect } from 'react'\nimport { getSearchCompletions } from 'services/searchCompletions'\n\nconst useSearchCompletions = (searchTerm: string, shouldAutocomplete: boolean) => {\n const [searchCompletions, setSearchCompletions] = useState([] as string[])\n const [error, setError] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n setIsLoading(true)\n const fetchData = async () => {\n if (!searchTerm) {\n return\n }\n try {\n const response = await getSearchCompletions(searchTerm)\n const {\n searchBox: { universal = [] },\n } = response.data\n // Results could be either completion, category or product.\n const completions = universal.reduce((acc, current) => {\n // Only supporting text completions for now\n if ('completion' in current) {\n acc.push(current.completion.text)\n }\n return acc\n }, [] as string[])\n\n setSearchCompletions(completions)\n setError(false)\n\n setIsLoading(false)\n } catch (err) {\n setError(true)\n }\n }\n setIsLoading(false)\n if (searchTerm && shouldAutocomplete) {\n fetchData()\n }\n }, [searchTerm, shouldAutocomplete])\n\n const clearSearchResults = () => setSearchCompletions([])\n\n return { isLoading, error, searchCompletions, clearSearchResults }\n}\n\nexport default useSearchCompletions\n","import React, { useState, useRef, useContext } from 'react'\nimport { func, bool, number } from 'prop-types'\n\nimport { filterType, categoriesType, trackingRoomInfoType } from 'models/propTypes'\nimport classNames from 'classnames'\nimport { useTranslation, Trans } from 'react-i18next'\nimport Icon from 'components/uiElements/Icon'\nimport SheetModal from 'components/uiElements/SheetModal'\nimport BouncingBallLoader from 'components/uiElements/BouncingBallLoader'\nimport Tooltip from 'components/Tooltip'\nimport useOutsideAlerter from 'hooks/useOutsideAlerter'\nimport { DEBUG_CATEGORY } from 'models/furniture/constants'\nimport { click } from 'utils/tracker'\nimport { FILTER_SOURCE_MENU, FILTER_SOURCE_BREADCRUMB } from 'models/tracking/constants'\nimport Search from '@ingka/search'\nimport SSRIcon from '@ingka/ssr-icon'\nimport magnifyingGlass from '@ingka/ssr-icon/paths/magnifying-glass'\nimport cross from '@ingka/ssr-icon/paths/cross'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport CategoryFiltersContainer from 'containers/designSidepanel/ProductFilter/CategoryFiltersContainer'\nimport useSearchCompletions from './useSearchCompletions'\n\nrequire('./style.scss')\n\nconst ProductFilter = ({\n furnitureFilter,\n updateFurnitureFilter,\n categories,\n clearFurnitureFilter,\n isFilterActive,\n numberProductItems,\n furnitureIsLoading,\n isCategoriesLoading,\n filterFeaturedFurniture,\n showFilterModal,\n setShowFilterModal,\n hasDebugCategory,\n roomInfo,\n hasFeaturedProducts,\n}) => {\n const { t } = useTranslation()\n const [isEditing, setIsEditing] = useState(false)\n const searchAndDropdownRef = useRef(null)\n const { isKiosk } = useContext(SugarcubeContext)\n const [isSearchCollapsed, setIsSearchCollapsed] = useState(isKiosk)\n const clickOutsideInput = () => setIsEditing(false)\n useOutsideAlerter(searchAndDropdownRef, clickOutsideInput)\n\n const searchQuery = furnitureFilter.query || ''\n const [hoveredCategoryKey, setHoveredCategoryKey] = useState(null)\n const [query, setQuery] = useState(searchQuery)\n // activeCompletionIndex is used to manage the active selection when the user is using the up/down keys\n const [activeCompletionIndex, setActiveCompletionIndex] = useState(-1)\n const hasSelectedCategory = furnitureFilter.category && furnitureFilter.category !== '*'\n const hasSelectedSubCategory = furnitureFilter.subCategory && furnitureFilter.subCategory !== '*'\n const FEATURED_CATEGORY = 'FEATURED_CATEGORY'\n // We want to get search autocompletions when the user is not using the up and down keys.\n // This behavior is similar to that seen in the search auto completions on ikea.com\n const shouldAutocomplete = activeCompletionIndex === -1\n const { searchCompletions, clearSearchResults } = useSearchCompletions(query, shouldAutocomplete)\n\n // For the category list\n const selectedCategory = hoveredCategoryKey ? categories.find(({ key }) => key === hoveredCategoryKey) : null\n\n const onCategoryHover = (e) => {\n const categoryKey = e.target.getAttribute('data-category')\n setHoveredCategoryKey(categoryKey)\n }\n\n const onCategoryClick = (categoryKey, categoryLabel, filterSource) => {\n if (categoryKey === FEATURED_CATEGORY) {\n filterFeaturedFurniture()\n } else {\n const trackingInfo = {\n filterSource,\n categoryLabel,\n }\n updateFurnitureFilter({ category: categoryKey }, trackingInfo)\n setQuery('')\n }\n setShowFilterModal(false)\n }\n\n const onSubCategoryClick = (subCategory, subCategoryLabel) => {\n const trackingInfo = {\n categoryLabel: selectedCategory.label,\n subCategoryLabel,\n filterSource: FILTER_SOURCE_MENU,\n }\n updateFurnitureFilter(\n {\n category: hoveredCategoryKey,\n subCategory,\n },\n trackingInfo,\n )\n setQuery('')\n setShowFilterModal(false)\n }\n\n const clearSearchQuery = () => {\n setQuery('')\n setActiveCompletionIndex(-1)\n clearFurnitureFilter()\n clearSearchResults()\n }\n\n const handleBrowseByCategoryClick = () => {\n clearSearchResults()\n setShowFilterModal(true)\n click('DecorateRoom.Catalog.Browse', roomInfo)\n }\n\n const onBrowseClose = () => {\n setShowFilterModal(false)\n click('DecorateRoom.Catalog.Browse.Quit', roomInfo)\n }\n\n const onSearchClear = () => {\n clearSearchQuery()\n click('DecorateRoom.Catalog.Search.Clear', roomInfo)\n }\n\n const onSelectCompletion = (completion) => {\n setQuery(completion)\n setIsEditing(false)\n clearSearchResults()\n updateFurnitureFilter({ query: completion })\n }\n\n const onQueryKeyDown = (e) => {\n // Arrow key up\n if (e.keyCode === 38) {\n // if there an active selection for the search dropdown\n\n if (activeCompletionIndex !== -1) {\n const nextActiveIndex = activeCompletionIndex - 1\n setQuery(searchCompletions[nextActiveIndex])\n setActiveCompletionIndex(nextActiveIndex)\n }\n }\n\n // Arrow key down\n if (e.keyCode === 40) {\n // if the active selection is not at the last entry in the search dropdown\n if (activeCompletionIndex !== searchCompletions.length - 1) {\n const nextActiveIndex = activeCompletionIndex + 1\n setQuery(searchCompletions[nextActiveIndex])\n setActiveCompletionIndex(nextActiveIndex)\n }\n }\n }\n\n const handleQueryChange = (e) => {\n const {\n target: { value },\n } = e\n setQuery(value)\n setActiveCompletionIndex(-1)\n setIsEditing(true)\n if (value === '') {\n clearSearchResults()\n }\n\n if (e.keyCode === 13) {\n onSelectCompletion(value)\n }\n }\n\n const browseByCategoryContent = isKiosk ? null : (\n \n \n \n )\n\n // For the filter subHeader\n let filterCategory = null\n if (hasSelectedCategory) {\n if (furnitureFilter.category === DEBUG_CATEGORY) {\n filterCategory = { label: t('common.debug') }\n } else {\n filterCategory = categories.find(({ key }) => key === furnitureFilter.category)\n }\n }\n const filterSubCategory =\n hasSelectedSubCategory && filterCategory\n ? filterCategory.subCategories.find(({ key }) => key === furnitureFilter.subCategory)\n : null\n\n const numberItemsText = t('design.itemWithCount', { count: numberProductItems })\n const isSearchActive = !!furnitureFilter.query\n const isFeaturedFilterActive = furnitureFilter.subCatalog !== '*' || furnitureFilter.roomType !== '*'\n const showFilterSubheader = !furnitureIsLoading && ((isFilterActive && !isFeaturedFilterActive) || isSearchActive)\n const showFeaturedSubheader = hasFeaturedProducts && !showFilterSubheader && !furnitureIsLoading\n const placeHolderText = t('design.what are you looking for?')\n const tryAgainText = t('design.try again')\n const showSearchAutocompletions = !!searchCompletions.length && isEditing\n\n return (\n
\n
\n
\n \n {browseByCategoryContent}\n {isKiosk && isSearchCollapsed && (\n \n )}\n \n
e.stopPropagation()}>\n onSelectCompletion(query)}\n value={query}\n placeholder={placeHolderText}\n onClear={onSearchClear}\n data-testid=\"product-search-input\"\n onKeyDown={onQueryKeyDown}\n actions={\n isKiosk && [\n {\n disabled: false,\n onClick: () => setIsSearchCollapsed(true),\n ssrIcon: cross,\n },\n ]\n }\n />\n
\n\n {showSearchAutocompletions && (\n
\n
    \n {searchCompletions.map((completion, index) => (\n \n \n \n ))}\n
\n
\n )}\n
\n
\n {isKiosk && }\n {showFilterSubheader && (\n
\n {isSearchActive ? (\n
\n
\n {numberProductItems ? (\n \n Results from "{{ searchQuery }}"\n \n ) : (\n \n We've turned up no matches for{' '}\n "{{ searchQuery }}"\n \n )}\n
\n {!numberProductItems &&
{tryAgainText}
}\n
\n ) : (\n
\n \n {t('design.all Items')}\n \n {filterCategory && (\n \n onCategoryClick(\n furnitureFilter.category,\n filterCategory.label,\n FILTER_SOURCE_BREADCRUMB,\n )\n }\n >\n \n
{filterCategory.label}
\n \n )}\n {filterSubCategory && (\n \n \n
{filterSubCategory.label}
\n
\n )}\n
\n )}\n
{numberItemsText}
\n
\n )}\n {showFeaturedSubheader && (\n
\n
\n {isFeaturedFilterActive ? t('design.featured products') : t('design.all products')}\n
\n
\n \n
\n
\n )}\n {showFilterModal && (\n \n
\n
\n
{t('design.products')}
\n {isCategoriesLoading && }\n {categories.length && (\n
\n
    \n {hasFeaturedProducts && (\n onCategoryClick(FEATURED_CATEGORY)}\n role=\"presentation\"\n >\n {t('design.featured products')}\n \n )}\n {hasDebugCategory && (\n onCategoryClick(DEBUG_CATEGORY)}\n role=\"presentation\"\n >\n {t('common.debug')}\n \n )}\n {categories.map(({ key, label }) => {\n const isActive = key === hoveredCategoryKey\n return (\n onCategoryClick(key, label, FILTER_SOURCE_MENU)}\n data-testid=\"product-filter-category\"\n role=\"presentation\"\n >\n {label}\n {isActive && }\n \n )\n })}\n
\n
\n )}\n
\n\n {selectedCategory && (\n
\n
{selectedCategory.label}
\n
\n
    \n {selectedCategory.subCategories.map(({ key, label }) => (\n onSubCategoryClick(key, label)}\n data-testid=\"product-filter-sub-category\"\n role=\"presentation\"\n >\n {label}\n \n ))}\n
\n
\n
\n )}\n
\n
\n )}\n
\n
\n )\n}\n\nProductFilter.defaultProps = {\n roomInfo: null,\n}\n\nProductFilter.propTypes = {\n furnitureFilter: filterType.isRequired,\n updateFurnitureFilter: func.isRequired,\n filterFeaturedFurniture: func.isRequired,\n categories: categoriesType.isRequired,\n clearFurnitureFilter: func.isRequired,\n isFilterActive: bool.isRequired,\n numberProductItems: number.isRequired,\n furnitureIsLoading: bool.isRequired,\n isCategoriesLoading: bool.isRequired,\n showFilterModal: bool.isRequired,\n setShowFilterModal: func.isRequired,\n hasDebugCategory: bool.isRequired,\n roomInfo: trackingRoomInfoType,\n hasFeaturedProducts: bool.isRequired,\n}\n\nexport default ProductFilter\n","import React, { useEffect } from 'react'\nimport { connect } from 'react-redux'\nimport { func, string, bool, number } from 'prop-types'\n\nimport { filterType, categoriesType, trackingRoomInfoType } from 'models/propTypes'\n\nimport {\n getFilter,\n getCategories,\n getIsFilterActive,\n getNumberFurnitureItems,\n getFurnitureIsLoading,\n getIsCategoriesLoading,\n} from 'models/furniture/selectors'\nimport { DEBUG_CATEGORY } from 'models/furniture/constants'\nimport { getFilterModalOpen } from 'models/ui/selectors'\nimport { getSubCatalog } from 'models/location/selectors'\nimport { getIsAdmin } from 'models/user/selectors'\nimport {\n updateFurnitureFilter as updateFurnitureFilterAction,\n clearFurnitureFilter as clearFurnitureFilterAction,\n requestFurnitureCategories as requestFurnitureCategoriesAction,\n filterFeaturedProducts as filterFeaturedProductsAction,\n} from 'models/furniture/actions'\nimport { setShowFilterModal as setShowFilterModalAction } from 'models/ui/actions'\nimport { getSelectedCompositionTrackingRoomInfo, getSelectedSceneRoomType } from 'models/compositions/selectors'\n\nimport ProductFilter from 'components/designSidepanel/ProductFilter'\n\nconst ProductFilterContainer = ({\n furnitureFilter,\n updateFurnitureFilter,\n clearFurnitureFilter,\n filterFeaturedProducts,\n isFilterActive,\n numberProductItems,\n furnitureIsLoading,\n isCategoriesLoading,\n urlSubCatalog,\n showFilterModal,\n setShowFilterModal,\n loadCategories,\n categories,\n isAdmin,\n roomInfo,\n roomType,\n}) => {\n useEffect(() => {\n if (!categories.length && !isCategoriesLoading) {\n loadCategories()\n }\n }, [])\n\n const filterDebugFurniture = () => {\n updateFurnitureFilter({ category: DEBUG_CATEGORY })\n }\n\n const hasFeaturedProducts = !!(urlSubCatalog || roomType)\n\n return (\n \n )\n}\n\nProductFilterContainer.defaultProps = {\n urlSubCatalog: null,\n roomInfo: null,\n roomType: null,\n}\n\nProductFilterContainer.propTypes = {\n furnitureFilter: filterType.isRequired,\n updateFurnitureFilter: func.isRequired,\n categories: categoriesType.isRequired,\n clearFurnitureFilter: func.isRequired,\n isFilterActive: bool.isRequired,\n numberProductItems: number.isRequired,\n furnitureIsLoading: bool.isRequired,\n isCategoriesLoading: bool.isRequired,\n urlSubCatalog: string,\n setShowFilterModal: func.isRequired,\n showFilterModal: bool.isRequired,\n loadCategories: func.isRequired,\n isAdmin: bool.isRequired,\n roomInfo: trackingRoomInfoType,\n roomType: string,\n filterFeaturedProducts: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n furnitureFilter: getFilter(state),\n categories: getCategories(state),\n isFilterActive: getIsFilterActive(state),\n numberProductItems: getNumberFurnitureItems(state),\n furnitureIsLoading: getFurnitureIsLoading(state),\n isCategoriesLoading: getIsCategoriesLoading(state),\n urlSubCatalog: getSubCatalog(state),\n showFilterModal: getFilterModalOpen(state),\n isAdmin: getIsAdmin(state),\n roomInfo: getSelectedCompositionTrackingRoomInfo(state),\n roomType: getSelectedSceneRoomType(state),\n})\n\nconst mapDispatchToProps = {\n updateFurnitureFilter: updateFurnitureFilterAction,\n clearFurnitureFilter: clearFurnitureFilterAction,\n setShowFilterModal: setShowFilterModalAction,\n loadCategories: requestFurnitureCategoriesAction,\n filterFeaturedProducts: filterFeaturedProductsAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductFilterContainer)\n","import React, { useContext } from 'react'\nimport { func, string } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport Icon from 'components/uiElements/Icon'\nimport Tooltip from 'components/Tooltip'\nimport BackNavigationHeader from 'components/designSidepanel/BackNavigationHeader'\nimport { productDataType } from 'models/propTypes'\nimport RelatedProductsContainer from 'containers/designSidepanel/RelatedProductsContainer'\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport { TRACK_LOCATION_SIDEPANEL } from 'models/tracking/constants'\nimport AdminProductDetailsContainer from 'containers/admin/AdminProductDetailsContainer'\nimport ImagePicker from './ImagePicker'\nimport ProductSummary from './ProductSummary'\n\nrequire('./ProductDetailsView.scss')\n\nconst ProductDetailsView = ({ furnitureData, addToRoom, addToBag, trackShowDetails, onBackClick, navigationText }) => {\n const { t } = useTranslation()\n\n const { name, localItemNumber, thumbUrl, imageUrls } = furnitureData\n\n const { isMagicWindow, isKiosk } = useContext(SugarcubeContext)\n\n return (\n
\n \n
\n
\n
\n
\n \n
\n
\n \n \n
\n
\n {!isMagicWindow && }\n
\n
\n
\n \n
\n
\n {localItemNumber && !isKiosk && (\n <>\n \n \n \n \n )}\n
\n
\n
\n
\n )\n}\n\nProductDetailsView.propTypes = {\n furnitureData: productDataType.isRequired,\n addToRoom: func.isRequired,\n addToBag: func.isRequired,\n trackShowDetails: func.isRequired,\n onBackClick: func.isRequired,\n navigationText: string.isRequired,\n}\n\nexport default ProductDetailsView\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { func, number, string } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\n\nimport { productDataType } from 'models/propTypes'\nimport { ART_ITEM } from 'constants/renderItemTypes'\nimport * as modes from 'models/ui/constants'\nimport { getSelectedFurnitureData } from 'models/furniture/selectors'\nimport { getSelectedCompositionId } from 'models/compositions/selectors'\nimport { setDesignSidepanelMode } from 'models/ui/actions'\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport { clickPlaceRenderItem } from 'models/compositions/actions'\nimport ProductDetailsView from 'components/designSidepanel/ProductDetailsView'\nimport { trackShowDetails as trackShowDetailsAction } from 'models/tracking/actions'\nimport { addToBag as addToBagAction } from 'models/bag/actions'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nconst ProductDetailsViewContainer = ({\n setMode,\n productData,\n compositionId,\n placeRenderItem,\n addToBag,\n trackShowDetails,\n mode,\n}) => {\n const { t } = useTranslation()\n\n const { localItemNumber, region, renderType, name, id, stacks, hidden, categories, subCategories } = productData\n\n const isArtItem = renderType === ART_ITEM\n const trackingInfo = getProductTrackingInfo(productData)\n\n let renderData\n if (isArtItem) {\n renderData = {\n matteId: 1,\n frameId: 1,\n sizeId: 1,\n colorId: 1,\n customHeight: null,\n }\n } else {\n renderData = {\n heading: 0,\n stacks,\n hidden,\n }\n }\n\n const addToRoom = () => {\n placeRenderItem(\n compositionId,\n id,\n {\n renderType,\n ...renderData,\n },\n trackingInfo,\n )\n }\n\n const onBackClick = () => {\n if (mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS) {\n setMode(modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE)\n } else {\n setMode(modes.DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE)\n }\n }\n\n const getNavigationText = () => {\n if (mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS) {\n return t('design.favorites')\n }\n\n return `${categories[0]} / ${subCategories[0]}`\n }\n\n return (\n addToBag(localItemNumber, region, name, trackingInfo)}\n trackShowDetails={() => trackShowDetails(trackingInfo)}\n onBackClick={onBackClick}\n navigationText={getNavigationText()}\n />\n )\n}\n\nProductDetailsViewContainer.propTypes = {\n setMode: func.isRequired,\n productData: productDataType.isRequired,\n compositionId: number.isRequired,\n placeRenderItem: func.isRequired,\n addToBag: func.isRequired,\n trackShowDetails: func.isRequired,\n mode: string.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n productData: getSelectedFurnitureData(state),\n compositionId: getSelectedCompositionId(state),\n mode: getDesignSidepanelMode(state),\n})\n\nconst mapDispatchToProps = {\n setMode: setDesignSidepanelMode,\n placeRenderItem: clickPlaceRenderItem,\n addToBag: addToBagAction,\n trackShowDetails: trackShowDetailsAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductDetailsViewContainer)\n","import React, { useContext } from 'react'\nimport { string } from 'prop-types'\nimport classNames from 'classnames'\n\nimport ProductsContainer from 'containers/designSidepanel/ProductsContainer'\nimport ProductFilterContainer from 'containers/designSidepanel/ProductFilterContainer'\nimport ProductDetailsViewContainer from 'containers/designSidepanel/ProductDetailsViewContainer'\nimport * as modes from 'models/ui/constants'\n\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nrequire('./ProductBrowseView.scss')\n\nconst ProductBrowseView = ({ mode }) => {\n const isDetailsVisible = mode === modes.DESIGN_SIDEPANEL_MODE_PRODUCT_DETAILS\n\n const { isMobile } = useContext(SugarcubeContext)\n\n return (\n
\n {isDetailsVisible && (\n
\n \n
\n )}\n
\n {!isMobile && }\n
\n
\n \n
\n
\n
\n
\n )\n}\n\nProductBrowseView.propTypes = {\n mode: string.isRequired,\n}\n\nexport default ProductBrowseView\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { string } from 'prop-types'\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport ProductBrowseView from 'components/designSidepanel/ProductBrowseView'\n\nconst ProductBrowseViewContainer = ({ mode }) => \n\nProductBrowseViewContainer.propTypes = {\n mode: string.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n mode: getDesignSidepanelMode(state),\n})\n\nexport default connect(mapStateToProps)(ProductBrowseViewContainer)\n","import React, { useState, useEffect } from 'react'\nimport { string, func } from 'prop-types'\nimport classNames from 'classnames'\nimport { productsDataType } from 'models/propTypes'\nimport { useTranslation } from 'react-i18next'\nimport * as modes from 'models/ui/constants'\nimport ProductDetailsViewContainer from 'containers/designSidepanel/ProductDetailsViewContainer'\nimport { MY_ITEMS_BROWSE_NUM_COLUMNS } from 'models/ui/constants'\nimport Products from 'components/designSidepanel/Products'\n\nrequire('./MyItemsBrowseView.scss')\n\nconst FavoritesBrowseView = ({ products, mode, addAllToBag }) => {\n const { t } = useTranslation()\n const isDetailsVisible = mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS\n\n const [localProducts, setLocalProducts] = useState(products)\n useEffect(() => {\n // Pick up the updated products list when we toggle\n // to the favorites list. This prevents the item from\n // disappearing immediately when unfavorited\n if (mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE) {\n setLocalProducts(products)\n }\n }, [mode])\n useEffect(() => {\n // If we're watching the favorites panel, only update\n // the list if we're adding a new item\n if (mode === modes.DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE && products.length > localProducts.length) {\n setLocalProducts(products)\n }\n }, [products])\n\n return (\n
\n {isDetailsVisible && (\n
\n \n
\n )}\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n )\n}\n\nFavoritesBrowseView.propTypes = {\n products: productsDataType.isRequired,\n mode: string.isRequired,\n addAllToBag: func.isRequired,\n}\n\nexport default FavoritesBrowseView\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { string, func } from 'prop-types'\nimport { productsDataType } from 'models/propTypes'\n\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport { getFavoriteProducts } from 'models/favorites/selectors'\nimport FavoritesBrowseView from 'components/designSidepanel/FavoritesBrowseView'\n\nimport { addRoomToBag as addRoomToBagAction } from 'models/bag/actions'\n\nconst FavoritesBrowseViewContainer = ({ products, mode, addAllToBag }) => {\n const productIds = products.map((item) => item.localItemNumber)\n const region = products.length ? products[0].region : null\n const trackingInfo = { ProductsAdded: products.length }\n\n return (\n addAllToBag(productIds, region, trackingInfo)}\n />\n )\n}\n\nFavoritesBrowseViewContainer.propTypes = {\n products: productsDataType.isRequired,\n mode: string.isRequired,\n addAllToBag: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n products: getFavoriteProducts(state),\n mode: getDesignSidepanelMode(state),\n})\nconst mapDispatchToProps = {\n addAllToBag: addRoomToBagAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FavoritesBrowseViewContainer)\n","import React from 'react'\nimport classNames from 'classnames'\nimport { func, string, arrayOf } from 'prop-types'\nimport { isURL } from 'validator'\nimport { debugSettingsType, compositionType, filterType } from 'models/propTypes'\n\nimport Icon from 'components/uiElements/Icon'\nimport Dropdown from 'components/formElements/Dropdown'\nimport Range from 'components/formElements/Range'\n\nimport * as THREE from 'three'\n\nrequire('./Debug.scss')\n\nconst Debug = ({\n debugSettings,\n updateDebugSettings,\n composition,\n takeScreenshot,\n loseWebglContext,\n disableAdmin,\n updateManifest,\n subCatalogs,\n furnitureFilter,\n updateFurnitureFilter,\n startSwapTest,\n startLoadTest,\n}) => {\n const onInputChange = (key, e, isData) => {\n let { value } = e.target\n if (isData) {\n value = JSON.parse(e.target.value)\n }\n updateManifest(composition.sceneId, key, value)\n }\n\n const subCatalogOptions = [{ key: '*', label: 'All' }]\n if (subCatalogs && subCatalogs.length) {\n subCatalogs.reduce((acc, val) => {\n acc.push({ key: val, label: val })\n return acc\n }, subCatalogOptions)\n }\n\n const environmentRotationOptions = [\n { key: 0, label: '+Z' },\n { key: 1, label: '-X' },\n { key: 2, label: '-Z' },\n { key: 3, label: '+X' },\n ]\n\n const toneMappingOptions = [\n { key: THREE.NoToneMapping, label: 'None' },\n { key: THREE.LinearToneMapping, label: 'Linear' },\n { key: THREE.ReinhardToneMapping, label: 'Reinhard' },\n { key: THREE.CineonToneMapping, label: 'Cineon' },\n { key: THREE.ACESFilmicToneMapping, label: 'ACES Filmic' },\n ]\n\n const swapFiftyItems = () => {\n startSwapTest()\n }\n\n const trackedMemoryOptions = [\n { key: 0, label: 'JS heap' },\n { key: 1, label: 'WebGLBuffers' },\n ]\n\n return (\n
\n
\n {composition ? (\n
\n

Info

\n
\n
CompositionId
\n
\n {composition.id} {composition.id < 0 ? (new) : null}\n
\n
\n
\n
SceneId
\n \n
\n {composition.scene ? (\n
\n
JobId
\n
{composition.scene.jobId}
\n
\n ) : null}\n {composition.scene && composition.scene.metaData ? (\n
\n
MetaData
\n
\n \n \n \n \n \n
\n \n
\n
\n ) : null}\n {composition.scene\n ? [\n

Manifest

,\n
\n {Object.keys(composition.scene.manifest).map((key) => {\n const value = composition.scene.manifest[key]\n const isData = typeof value !== 'string'\n const content = []\n\n if (!isData && isURL(value)) {\n // We have a url\n content.push(\n \n \n ,\n )\n } else {\n // No url\n content.push()\n }\n if (value) {\n if (isData || !isURL(value)) {\n content.push(\n \n \n
,\n )\n } else {\n // TODO: check for image url specifically\n content.push(\n
\n \n
\n \"\"\n
\n
,\n )\n }\n content.push(\n onInputChange(key, e, isData)}\n onKeyDown={(e) => e.stopPropagation()}\n />,\n )\n }\n return (\n
\n
{key}
\n
{content}
\n
\n )\n })}\n
,\n ]\n : null}\n
\n ) : null}\n

Catalog

\n
\n

\n Sub-catalogctrl + 0, 1-5\n

\n updateFurnitureFilter({ subCatalog: e.target.value })}\n value={furnitureFilter.subCatalog}\n options={subCatalogOptions}\n />\n
\n

Visualization

\n
\n

\n Vanishing linesg\n

\n updateDebugSettings({ linesViz: !debugSettings.linesViz })}\n />\n
\n
\n

Light helpers

\n updateDebugSettings({ lightsViz: !debugSettings.lightsViz })}\n />\n
\n
\n

Show depth

\n updateDebugSettings({ depthViz: !debugSettings.depthViz })}\n />\n
\n
\n

Imitate low performance

\n \n updateDebugSettings({ imitateLowPerformance: !debugSettings.imitateLowPerformance })\n }\n />\n
\n
\n

\n Highlight dropzone on dragh\n

\n updateDebugSettings({ highlightPlanes: !debugSettings.highlightPlanes })}\n />\n
\n
\n

\n Sematic Segmentationz\n

\n updateDebugSettings({ ssViz: !debugSettings.ssViz })}\n />\n
\n
\n

\n Normals Segmentationn\n

\n updateDebugSettings({ nsViz: !debugSettings.nsViz })}\n />\n
\n
\n

Normals Visualization on Loaded Items

\n updateDebugSettings({ normalsViz: !debugSettings.normalsViz })}\n />\n
\n

Light controls

\n
\n

Asset AO Map intensity multiplier

\n updateDebugSettings({ aoMapIntensity: value })}\n sideLabel\n />\n
\n
\n

Asset IBL intensity multiplier

\n updateDebugSettings({ environmentIntensity: value })}\n sideLabel\n />\n
\n
\n

IBL map rotation:

\n updateDebugSettings({ environmentRotation: e.target.value })}\n value={debugSettings.environmentRotation}\n options={environmentRotationOptions}\n />\n
\n {composition &&\n composition.scene &&\n composition.scene.manifest &&\n composition.scene.manifest.lighting ? (\n
\n {composition.scene.manifest.lighting.lights.point\n ? [\n
\n {composition.scene.manifest.lighting.lights.point.map((pointLight, index) => (\n
\n

Point light [{index}] intensity

\n \n updateDebugSettings({\n pointLightIntensities:\n debugSettings.pointLightIntensities.map((v, i) =>\n index === i ? value / pointLight.intensity : v,\n ),\n })\n }\n sideLabel\n />\n
\n ))}\n
,\n ]\n : null}\n {composition.scene.manifest.lighting.lights.ambient\n ? [\n
\n
\n

Ambient light intensity

\n \n updateDebugSettings({\n ambientLightIntensity:\n value /\n composition.scene.manifest.lighting.lights.ambient.intensity,\n })\n }\n sideLabel\n />\n
\n
,\n ]\n : null}\n {composition.scene.manifest.lighting.lights.directional\n ? [\n
\n {composition.scene.manifest.lighting.lights.directional.map(\n (directional, index) => (\n
\n

Directional light [{index}] intensity

\n \n updateDebugSettings({\n directionalLightIntensities:\n debugSettings.directionalLightIntensities.map(\n (v, i) =>\n index === i\n ? value / directional.intensity\n : v,\n ),\n })\n }\n sideLabel\n />\n
\n ),\n )}\n
,\n ]\n : null}\n
\n ) : null}\n
\n

Tone mapping:

\n updateDebugSettings({ toneMappingType: e.target.value })}\n value={debugSettings.toneMappingType}\n options={toneMappingOptions}\n />\n
\n
\n

Tone mapping exposure

\n updateDebugSettings({ toneMappingExposure: value })}\n sideLabel\n />\n
\n
\n

Enable analytical lights contribution to lightening.

\n {\n updateDebugSettings({\n analyticLightsContribution: !debugSettings.analyticLightsContribution,\n })\n }}\n />\n
\n

Settings

\n
\n

\n Infinite floor planedefault to floor plane\n

\n updateDebugSettings({ defaultToFloor: !debugSettings.defaultToFloor })}\n />\n
\n
\n

\n Enable advanced shadowsa\n

\n updateDebugSettings({ useFancyShadows: !debugSettings.useFancyShadows })}\n />\n
\n
\n

\n Front side shadow mappingd\n

\n updateDebugSettings({ frontSideShadows: !debugSettings.frontSideShadows })}\n />\n
\n
\n

\n Enable wallsw\n

\n updateDebugSettings({ enableWalls: !debugSettings.enableWalls })}\n />\n
\n
\n

\n Enable GPU statsq\n

\n \n updateDebugSettings({ enableGPUframetimeStats: !debugSettings.enableGPUframetimeStats })\n }\n />\n
\n
\n

\n Enable memory trackingm\n

\n updateDebugSettings({ showMemoryStats: !debugSettings.showMemoryStats })}\n />\n
\n
\n

Tracked memory:

\n updateDebugSettings({ trackedMemoryType: e.target.value })}\n value={debugSettings.trackedMemoryType}\n options={trackedMemoryOptions}\n />\n
\n
\n

\n Enable art resizingr\n

\n updateDebugSettings({ canEditArtSize: !debugSettings.canEditArtSize })}\n />\n
\n
\n

\n Show extra product detailsp\n

\n \n updateDebugSettings({ showProductAdminData: !debugSettings.showProductAdminData })\n }\n />\n
\n
\n

\n Use TAA for screenshotsp\n

\n \n updateDebugSettings({ useTAAforScreenshots: !debugSettings.useTAAforScreenshots })\n }\n />\n
\n
\n

\n Disable admin privilegesctrl + j\n

\n \n
\n

Tools

\n
\n

\n Take screenshots\n

\n \n
\n
\n

Lose webgl context

\n \n
\n
\n

Furniture swap test

\n \n
\n
\n

Furniture memory leak test

\n \n
\n \n
\n )\n}\n\nDebug.defaultProps = {\n composition: null,\n subCatalogs: null,\n}\n\nDebug.propTypes = {\n debugSettings: debugSettingsType.isRequired,\n updateDebugSettings: func.isRequired,\n composition: compositionType,\n takeScreenshot: func.isRequired,\n loseWebglContext: func.isRequired,\n disableAdmin: func.isRequired,\n updateManifest: func.isRequired,\n subCatalogs: arrayOf(string),\n furnitureFilter: filterType.isRequired,\n updateFurnitureFilter: func.isRequired,\n startSwapTest: func.isRequired,\n startLoadTest: func.isRequired,\n}\n\nexport default Debug\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { func, arrayOf, string } from 'prop-types'\nimport { debugSettingsType, compositionType, filterType } from 'models/propTypes'\n\nimport {\n updateDebugSettings,\n takeScreenshot,\n loseWebglContext,\n setAdmin,\n startSwapTestSaga,\n startLoadTestSaga,\n} from 'models/admin/actions'\nimport { updateSceneManifest } from 'models/scenes/actions'\nimport { getDebugSettings } from 'models/admin/selectors'\nimport { getSelectedComposition } from 'models/compositions/selectors'\nimport { getSubCatalogs, getFilter } from 'models/furniture/selectors'\nimport { updateFurnitureFilter as updateFurnitureFilterAction } from 'models/furniture/actions'\n\nimport Debug from 'components/admin/Debug'\n\nconst DebugViewContainer = ({\n debugSettings,\n update,\n composition,\n screenshot,\n loseContext,\n disableAdmin,\n updateManifest,\n subCatalogs,\n furnitureFilter,\n updateFurnitureFilter,\n startSwapTest,\n startLoadTest,\n}) => {\n const onManifestUpdate = (...args) => {\n updateManifest(...args)\n // Destroy renderer will be called in PreviewContainer when\n // it gets a new scene because the manifest has changed\n }\n\n return (\n \n )\n}\n\nDebugViewContainer.defaultProps = {\n composition: null,\n subCatalogs: null,\n}\n\nDebugViewContainer.propTypes = {\n debugSettings: debugSettingsType.isRequired,\n update: func.isRequired,\n composition: compositionType,\n screenshot: func.isRequired,\n loseContext: func.isRequired,\n disableAdmin: func.isRequired,\n updateManifest: func.isRequired,\n subCatalogs: arrayOf(string),\n furnitureFilter: filterType.isRequired,\n updateFurnitureFilter: func.isRequired,\n startSwapTest: func.isRequired,\n startLoadTest: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n debugSettings: getDebugSettings(state),\n composition: getSelectedComposition(state),\n subCatalogs: getSubCatalogs(state),\n furnitureFilter: getFilter(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n update: (ds) => dispatch(updateDebugSettings(ds)),\n screenshot: () => dispatch(takeScreenshot()),\n loseContext: () => dispatch(loseWebglContext()),\n disableAdmin: () => dispatch(setAdmin(false)),\n updateManifest: (...args) => dispatch(updateSceneManifest(...args)),\n updateFurnitureFilter: (...args) => dispatch(updateFurnitureFilterAction(...args)),\n startSwapTest: (...args) => dispatch(startSwapTestSaga(...args)),\n startLoadTest: (...args) => dispatch(startLoadTestSaga(...args)),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DebugViewContainer)\n","import { createSelector } from 'reselect'\n\nimport { getSelectedScene } from 'models/compositions/selectors'\n\nexport const getIsFetching = (state) => state.ratings.isFetching\nexport const getRatingsByJobId = (state) => state.ratings.ratingsByJobId\nexport const getRatingOptions = (state) => state.ratings.options\n\nexport const getRatingForSelectedScene = createSelector(\n [getRatingsByJobId, getSelectedScene],\n (ratingsByJobId, selectedScene) => {\n if (!selectedScene) {\n return {}\n }\n return ratingsByJobId[selectedScene.jobId] || {}\n },\n)\n","import React from 'react'\nimport classNames from 'classnames'\nimport { number, string, func, element, bool } from 'prop-types'\n\nimport Icon from 'components/uiElements/Icon'\n\nrequire('./StarRating.scss')\n\nconst StarRating = ({ max, name, value, iconChecked, iconUnchecked, onChange, children, highlightCurrentOnly }) => (\n
\n {[...Array(max).keys()].map((i) => {\n const key = i + 1\n const isCurrentValue = key === value\n const checked = highlightCurrentOnly ? isCurrentValue : key <= value\n return (\n \n onChange({\n target: {\n name,\n value: isCurrentValue ? 0 : key,\n },\n })\n }\n >\n {children || }\n \n )\n })}\n
\n)\n\nStarRating.defaultProps = {\n max: 4,\n value: 0,\n iconChecked: null,\n iconUnchecked: null,\n children: null,\n highlightCurrentOnly: false,\n}\n\nStarRating.propTypes = {\n max: number,\n value: number,\n name: string.isRequired,\n iconUnchecked: string,\n iconChecked: string,\n onChange: func.isRequired,\n children: element,\n highlightCurrentOnly: bool,\n}\n\nexport default StarRating\n","import { useState, useEffect } from 'react'\n\nconst useDebounce = (value, delay) => {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n return () => {\n clearTimeout(handler)\n }\n }, [value])\n\n return debouncedValue\n}\n\nexport default useDebounce\n","import React, { useState, useEffect } from 'react'\nimport { string, number, func } from 'prop-types'\n\nimport useDebounce from 'hooks/useDebounce'\n\nconst Textarea = ({ placeholder, value, name, onChange, debounce }) => {\n const [note, setNote] = useState('')\n const [hasTyped, setHasTyped] = useState(false)\n const debouncedNote = useDebounce(note, debounce)\n const onType = (e) => {\n setHasTyped(true)\n setNote(e.target.value)\n }\n useEffect(() => {\n setHasTyped(false)\n // Don't overwrite the local value if it's\n // basically the same\n if (note.trim() !== value) {\n setNote(value || '')\n }\n }, [value])\n useEffect(() => {\n if (hasTyped) {\n onChange({\n target: {\n name,\n value: debouncedNote,\n },\n })\n }\n }, [debouncedNote])\n\n return (\n e.stopPropagation()}\n />\n )\n}\n\nTextarea.defaultProps = {\n placeholder: '',\n value: '',\n name: '',\n debounce: 0,\n}\n\nTextarea.propTypes = {\n placeholder: string,\n value: string,\n name: string,\n onChange: func.isRequired,\n debounce: number,\n}\n\nexport default Textarea\n","/* eslint-disable i18next/no-literal-string */\nimport React, { useState } from 'react'\nimport { func, bool } from 'prop-types'\n\nimport { ratingType, ratingOptionsType } from 'models/propTypes'\nimport * as ratingTypes from 'models/ratings/constants'\n\nimport StarRating from 'components/formElements/StarRating'\nimport Textarea from 'components/formElements/Textarea'\nimport Icon from 'components/uiElements/Icon'\n\nrequire('./RatingPanelView.scss')\n\nconst RatingPanelView = ({ onChange, rating, options, isFetching, autoDecorate }) => {\n const [canDecorate, setCanDecorate] = useState(true)\n const getVal = (tagId, kind) => {\n if (!rating[tagId]) {\n return null\n }\n if (kind === ratingTypes.NOTE) {\n return rating[tagId].note\n }\n return rating[tagId].value\n }\n\n return (\n
\n
\n

Capture Score {isFetching ? : null}

\n
Stars go from 1=Terrible, 2=Borderline, 3=Acceptable, 4=Excellent
\n
Severity goes from Low=subtle, Med=noticeable, High=problematic
\n {canDecorate ? (\n {\n setCanDecorate(false)\n autoDecorate()\n }}\n code=\"shoppingBagAdd\"\n />\n ) : null}\n
\n
\n {options ? (\n options.map((option) => {\n let ratingElement = null\n switch (option.kind) {\n case ratingTypes.RATING:\n ratingElement = (\n onChange(e, option.id, option.kind)}\n />\n )\n break\n case ratingTypes.SEVERITY:\n ratingElement = (\n onChange(e, option.id, option.kind)}\n max={3}\n highlightCurrentOnly\n >\n \n \n )\n break\n case ratingTypes.NOTE:\n ratingElement = (\n onChange(e, option.id, option.kind)}\n onKeyDown={(e) => e.stopPropagation()}\n debounce={500}\n />\n )\n break\n default:\n break\n }\n return (\n
\n {option.name}\n {ratingElement}\n
\n )\n })\n ) : (\n
Loading...
\n )}\n
\n
\n )\n}\n\nRatingPanelView.defaultProps = {\n options: null,\n}\n\nRatingPanelView.propTypes = {\n rating: ratingType.isRequired,\n options: ratingOptionsType,\n onChange: func.isRequired,\n isFetching: bool.isRequired,\n autoDecorate: func.isRequired,\n}\n\nexport default RatingPanelView\n","import React, { useEffect } from 'react'\nimport { connect } from 'react-redux'\nimport { func, number, bool } from 'prop-types'\n\nimport { isProd } from 'utils/environment'\nimport { ratingType, sceneType, ratingOptionsType } from 'models/propTypes'\nimport { ART_ITEM, FURNITURE_ITEM } from 'constants/renderItemTypes'\nimport * as ratingTypes from 'models/ratings/constants'\nimport { getRatingForSelectedScene, getIsFetching, getRatingOptions } from 'models/ratings/selectors'\nimport { getSelectedScene, getSelectedCompositionId } from 'models/compositions/selectors'\nimport { requestRatings, submitRating, requestRatingOptions } from 'models/ratings/actions'\nimport { clickPlaceRenderItem } from 'models/compositions/actions'\nimport { triggerCompositionLoad } from 'models/admin/actions'\n\nimport RatingPanelView from 'components/designSidepanel/RatingPanelView'\n\nconst RatingPanelViewContainer = ({\n rating,\n options,\n scene,\n submit,\n fetchRatings,\n fetchRatingOptions,\n isFetching,\n compositionId,\n onClickPlace,\n refreshComposition,\n}) => {\n const onChange = (e, tagId, kind) => {\n if (scene) {\n const value = kind !== ratingTypes.NOTE ? e.target.value : null\n const note = kind === ratingTypes.NOTE ? e.target.value : null\n const id = rating[tagId] && rating[tagId].id\n\n if (!value && !note && !id) {\n // If no value and no id then we can't delete\n return\n }\n\n submit(scene.jobId, tagId, id, kind, value, note)\n }\n }\n useEffect(() => {\n if (scene) {\n fetchRatings(scene.jobId)\n }\n if (!options) {\n fetchRatingOptions()\n }\n }, [scene])\n\n const autoDecorate = () => {\n if (scene.hasFloor) {\n const furnIds = isProd ? [17667, 23792, 18678, 24853] : [9576, 15142, 5695, 20122]\n\n furnIds.forEach((id) => {\n onClickPlace(compositionId, id, { id, heading: 0, renderType: FURNITURE_ITEM })\n })\n }\n if (scene.hasWall) {\n const artId = isProd ? 126026 : 126575\n onClickPlace(compositionId, artId, {\n matteId: 10,\n frameId: 2,\n sizeId: 1,\n colorId: 1,\n customHeight: null,\n renderType: ART_ITEM,\n })\n }\n refreshComposition()\n }\n\n return (\n \n )\n}\n\nRatingPanelViewContainer.defaultProps = {\n rating: {},\n scene: null,\n options: null,\n}\n\nRatingPanelViewContainer.propTypes = {\n rating: ratingType,\n options: ratingOptionsType,\n scene: sceneType,\n submit: func.isRequired,\n fetchRatings: func.isRequired,\n fetchRatingOptions: func.isRequired,\n isFetching: bool.isRequired,\n compositionId: number.isRequired,\n onClickPlace: func.isRequired,\n refreshComposition: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n rating: getRatingForSelectedScene(state),\n scene: getSelectedScene(state),\n isFetching: getIsFetching(state),\n options: getRatingOptions(state),\n compositionId: getSelectedCompositionId(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n submit: (...args) => dispatch(submitRating(...args)),\n fetchRatings: (jobId) => dispatch(requestRatings(jobId)),\n fetchRatingOptions: () => dispatch(requestRatingOptions()),\n onClickPlace: (...args) => dispatch(clickPlaceRenderItem(...args)),\n refreshComposition: () => dispatch(triggerCompositionLoad()),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RatingPanelViewContainer)\n","import React, { useContext } from 'react'\nimport { string, bool, func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport classNames from 'classnames'\nimport ItemDetailsViewContainer from 'containers/designSidepanel/ItemDetailsViewContainer'\nimport * as modes from 'models/ui/constants'\nimport Products from 'components/designSidepanel/Products'\nimport { productsDataType, productDataType } from 'models/propTypes'\nimport { FURNITURE_SWAP_NUM_COLUMNS } from 'models/ui/constants'\nimport Icon from 'components/uiElements/Icon'\nimport ProductSummary from 'components/designSidepanel/ProductSummary'\nimport Tooltip from 'components/Tooltip'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport ImagePicker from 'components/designSidepanel/ImagePicker'\nimport Button from '@ingka/button'\nimport ProductItemContainer from 'containers/designSidepanel/ProductItemContainer'\nimport Accordion, { AccordionItem } from '@ingka/accordion'\nimport * as RenderItemTypes from 'constants/renderItemTypes'\nimport OptionSelectorViewContainer from 'containers/designSidepanel/OptionSelectorViewContainer'\nimport FavoriteButtonContainer from 'containers/uiElements/FavoriteButtonContainer'\nimport { TRACK_LOCATION_SIDEPANEL } from 'models/tracking/constants'\nimport AdminProductDetailsContainer from 'containers/admin/AdminProductDetailsContainer'\n\nrequire('./SwapView.scss')\n\nconst SwapView = ({\n swappableItemsData,\n isLoading,\n mode,\n onToggle,\n selectedSwapFurnitureData,\n trackShowDetails,\n selectedFurnitureData,\n onUndoSwap,\n addToBag,\n}) => {\n const { t } = useTranslation()\n\n const isDetailsVisible = mode === modes.DESIGN_SIDEPANEL_MODE_SWAP_DETAILS\n const { isMobile, isKiosk } = useContext(SugarcubeContext)\n\n const hasNoSelectedFurniture = !selectedFurnitureData\n const selectedOriginalSwapFurniture =\n selectedFurnitureData && selectedSwapFurnitureData && selectedFurnitureData.id === selectedSwapFurnitureData.id\n\n const undoSwapCallback = selectedOriginalSwapFurniture ? null : onUndoSwap\n const undoSwapTooltipText = !selectedOriginalSwapFurniture ? t('tooltip.revert to original') : null\n\n const hasSwappableItems = !!(swappableItemsData && swappableItemsData.length) && !isLoading\n const isArtItem = (selectedFurnitureData && selectedFurnitureData.renderType === RenderItemTypes.ART_ITEM) || false\n\n if (isMobile) {\n return (\n
\n {isDetailsVisible && (\n
\n \n
\n )}\n \n
\n
{t('design.swap products')}
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n )\n }\n\n return (\n
\n {hasNoSelectedFurniture ? (\n
\n
\n {t('design.alt.product\n
\n
\n
{t('design.select a product')}
\n
{t('design.select or add a product')}
\n
\n
\n ) : (\n <>\n {isDetailsVisible && (\n
\n \n
\n )}\n \n
\n
\n \n
\n
\n \n \n
\n {!isKiosk && (\n \n )}\n {selectedFurnitureData && (\n \n )}\n
\n
\n
\n {isArtItem && (\n \n \n \n {t('design.customize')}\n \n }\n >\n \n \n \n )}\n\n {hasSwappableItems && (\n <>\n

\n
{t('design.swap product')}
\n {selectedSwapFurnitureData.thumbUrl && !selectedOriginalSwapFurniture && (\n <>\n {undoSwapTooltipText && (\n \n )}\n \n \n\n \n \n \n )}\n

\n
\n
\n {swappableItemsData &&\n swappableItemsData.map((productData) => (\n \n ))}\n
\n
\n \n )}\n
\n \n )}\n \n )\n}\n\nSwapView.defaultProps = {\n swappableItemsData: null,\n onToggle: null,\n selectedSwapFurnitureData: null,\n selectedFurnitureData: null,\n}\n\nSwapView.propTypes = {\n swappableItemsData: productsDataType,\n isLoading: bool.isRequired,\n mode: string.isRequired,\n onToggle: func,\n selectedSwapFurnitureData: productDataType,\n trackShowDetails: func.isRequired,\n selectedFurnitureData: productDataType,\n onUndoSwap: func.isRequired,\n addToBag: func.isRequired,\n}\n\nexport default SwapView\n","import React, { useEffect } from 'react'\nimport { connect } from 'react-redux'\nimport { bool, string, func, number } from 'prop-types'\nimport { productDataType, productsDataType } from 'models/propTypes'\nimport { getSelectedRenderItemId } from 'models/compositions/selectors'\nimport {\n getSelectedFurnitureSwappableItemsData,\n getSelectedSwapFurnitureData,\n getIsSwappablesLoading,\n getSelectedFurnitureData,\n} from 'models/furniture/selectors'\nimport { getDesignSidepanelMode } from 'models/ui/selectors'\nimport { requestFurnitureSwappables as requestFurnitureSwappablesAction } from 'models/furniture/actions'\nimport { trackShowDetails as trackShowDetailsAction } from 'models/tracking/actions'\nimport { addToBag as addToBagAction } from 'models/bag/actions'\nimport SwapView from 'components/designSidepanel/SwapView'\nimport { PRODUCT_SWAP } from 'models/tracking/constants'\nimport { swapRenderItem as swapRenderItemAction } from 'models/compositions/actions'\nimport { getProductTrackingInfo } from 'models/tracking/utils'\n\nconst SwapViewContainer = ({\n swappableItemsData,\n selectedSwapFurnitureData,\n requestFurnitureSwappables,\n isLoading,\n mode,\n onToggle,\n trackShowDetails,\n selectedFurnitureData,\n onSwap,\n selectedId,\n addToBag,\n}) => {\n const selectedSwapFurnitureId = (selectedSwapFurnitureData && selectedSwapFurnitureData.id) || null\n const isSwappableItemsNull = !swappableItemsData\n useEffect(() => {\n if (selectedSwapFurnitureId && isSwappableItemsNull && !isLoading) {\n requestFurnitureSwappables(selectedSwapFurnitureId)\n }\n }, [isSwappableItemsNull, selectedSwapFurnitureId])\n\n let trackShowDetailsCallback = null\n if (selectedSwapFurnitureData) {\n const trackingInfo = getProductTrackingInfo(selectedSwapFurnitureData)\n trackShowDetailsCallback = () => trackShowDetails(trackingInfo)\n }\n const onUndoSwap = (e) => {\n e.stopPropagation()\n // Swap back the original product, the swap anchor\n if (selectedId && selectedSwapFurnitureData) {\n const removedFurnitureId = selectedFurnitureData.id\n const { id: swappedFurnitureId } = selectedSwapFurnitureData\n\n const swappedInProductTrackingInfo = getProductTrackingInfo(selectedSwapFurnitureData)\n const swappedInTrackingInfo = {\n ...swappedInProductTrackingInfo,\n AddedFrom: PRODUCT_SWAP,\n }\n\n if (removedFurnitureId) {\n const removedProductTrackingInfo = getProductTrackingInfo(selectedFurnitureData)\n const removedTrackingInfo = {\n ...removedProductTrackingInfo,\n RemovedFrom: PRODUCT_SWAP,\n }\n\n const trackingInfo = {\n swappedInTrackingInfo,\n removedTrackingInfo,\n }\n onSwap(selectedId, swappedFurnitureId, trackingInfo)\n }\n }\n }\n\n const onAddToBag = () => {\n if (selectedFurnitureData) {\n const { localItemNumber, region, name: productTitle } = selectedFurnitureData\n const trackingInfo = getProductTrackingInfo(selectedFurnitureData)\n\n addToBag(localItemNumber, region, productTitle, trackingInfo)\n }\n }\n\n return (\n \n )\n}\n\nSwapViewContainer.defaultProps = {\n swappableItemsData: [],\n selectedSwapFurnitureData: null,\n onToggle: null,\n selectedFurnitureData: null,\n selectedId: null,\n}\n\nSwapViewContainer.propTypes = {\n swappableItemsData: productsDataType,\n selectedSwapFurnitureData: productDataType,\n selectedFurnitureData: productDataType,\n requestFurnitureSwappables: func.isRequired,\n isLoading: bool.isRequired,\n mode: string.isRequired,\n onToggle: func,\n trackShowDetails: func.isRequired,\n onSwap: func.isRequired,\n selectedId: number,\n addToBag: func.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n selectedId: getSelectedRenderItemId(state),\n swappableItemsData: getSelectedFurnitureSwappableItemsData(state),\n selectedSwapFurnitureData: getSelectedSwapFurnitureData(state),\n selectedFurnitureData: getSelectedFurnitureData(state),\n isLoading: getIsSwappablesLoading(state),\n mode: getDesignSidepanelMode(state),\n})\n\nconst mapDispatchToProps = {\n requestFurnitureSwappables: requestFurnitureSwappablesAction,\n trackShowDetails: trackShowDetailsAction,\n onSwap: swapRenderItemAction,\n addToBag: addToBagAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SwapViewContainer)\n","import React from 'react'\nimport classNames from 'classnames'\nimport { func } from 'prop-types'\nimport MyItemsBrowseViewContainer from 'containers/designSidepanel/MyItemsBrowseViewContainer'\nimport ProductBrowseViewContainer from 'containers/designSidepanel/ProductBrowseViewContainer'\nimport FavoritesBrowseViewContainer from 'containers/designSidepanel/FavoritesBrowseViewContainer'\nimport DebugViewContainer from 'containers/admin/DebugViewContainer'\nimport RatingPanelViewContainer from 'containers/designSidepanel/RatingPanelViewContainer'\nimport SwapViewContainer from 'containers/designSidepanel/SwapViewContainer'\nimport { sidepanelTabsType } from 'models/propTypes'\nimport SkipLinks from 'components/SkipLinks'\nimport { BROWSE, DESIGN, HEADER } from 'components/SkipLinks/constants'\n\nrequire('./SidepanelBody.scss')\n\nconst SidepanelBody = ({ onToggle, selectedTabs }) => {\n const { isSwapSelected, isBrowseSelected, isMyListSelected, isFavoritesSelected, isDebugSelected, isRateSelected } =\n selectedTabs\n\n return (\n <>\n {isBrowseSelected ? (\n \n \n \n \n ) : null}\n\n {isSwapSelected ? (\n \n \n \n \n ) : null}\n\n {isMyListSelected ? (\n \n \n \n \n ) : null}\n {isFavoritesSelected ? (\n \n \n \n \n ) : null}\n\n {isDebugSelected ? (\n \n \n \n \n ) : null}\n {isRateSelected ? (\n \n \n \n \n ) : null}\n \n )\n}\n\nSidepanelBody.defaultProps = {\n onToggle: null,\n}\n\nSidepanelBody.propTypes = {\n onToggle: func,\n selectedTabs: sidepanelTabsType.isRequired,\n}\n\nexport default SidepanelBody\n","import React, { useState, useContext } from 'react'\nimport classNames from 'classnames'\nimport { Link, useHistory } from 'react-router-dom'\nimport { bool, func } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\nimport SugarcubeContext from 'apps/SugarcubeContext'\nimport SidepanelMenuContainer from 'containers/designSidepanel/SidepanelMenuContainer'\nimport SidepanelBody from 'components/designSidepanel/SidepanelBody'\nimport { sidepanelTabsType } from 'models/propTypes'\n\nimport Icon from 'components/uiElements/Icon'\nimport Tooltip from 'components/Tooltip'\nimport SkipLinks from 'components/SkipLinks'\nimport { BROWSE, DESIGN, HEADER, NAVIGATION } from 'components/SkipLinks/constants'\n\nrequire('./Sidepanel.scss')\n\nconst Sidepanel = ({\n isOpen: isPinned,\n close,\n open,\n showFilterModal,\n designingEnabled,\n openDesignLab,\n selectedTabs,\n}) => {\n const { t } = useTranslation()\n const [isHovered, setIsHovered] = useState(false)\n const { hideDashboard, isMobile, ikeaNav, isKiosk } = useContext(SugarcubeContext)\n const history = useHistory()\n\n const onHover = () => {\n if (!isMobile && designingEnabled) {\n setIsHovered(true)\n }\n }\n const onBlur = () => setIsHovered(false)\n const onToggle = () => {\n if (isPinned) {\n onBlur()\n close()\n } else {\n open()\n }\n }\n\n const onKiosk = () => {\n history.push(`/dashboard`)\n }\n\n const isHoverOpened = !isMobile && isHovered && !isPinned\n const showChevronIcon = !isMobile && !isKiosk\n\n return (\n
\n \n\n
\n \n {!isMobile && (\n
\n {ikeaNav ? (\n <>\n \n {!hideDashboard && (\n \n )}\n {isKiosk && (\n \n )}\n \n ) : (\n \n \n \n \n )}\n
\n )}\n {!isMobile && (\n
\n \n
\n )}\n
\n \n
\n
\n {!isMobile && }\n {showChevronIcon && !showFilterModal && (\n \n \n \n \n
\n )}\n {isMobile &&
}\n
\n )\n}\n\nSidepanel.propTypes = {\n isOpen: bool.isRequired,\n close: func.isRequired,\n open: func.isRequired,\n showFilterModal: bool.isRequired,\n designingEnabled: bool.isRequired,\n openDesignLab: func.isRequired,\n selectedTabs: sidepanelTabsType.isRequired,\n}\n\nexport default Sidepanel\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { bool, func } from 'prop-types'\n\nimport {\n getDesignSidepanelOpen,\n getCanPersonalize,\n getFilterModalOpen,\n getDesigningEnabled,\n getSelectedSidepanelTabs,\n} from 'models/ui/selectors'\nimport { closeDesignSidepanel, openDesignSidepanel, openDesignLab as openDesignLabAction } from 'models/ui/actions'\nimport { getIsAdmin } from 'models/user/selectors'\nimport { sidepanelTabsType } from 'models/propTypes'\n\nimport Sidepanel from 'components/designSidepanel/Sidepanel'\n\nconst SidepanelContainer = ({\n isOpen,\n closeOptions,\n openOptions,\n showFilterModal,\n designingEnabled,\n openDesignLab,\n selectedTabs,\n}) => (\n \n)\n\nSidepanelContainer.propTypes = {\n isOpen: bool.isRequired,\n designingEnabled: bool.isRequired,\n closeOptions: func.isRequired,\n openOptions: func.isRequired,\n showFilterModal: bool.isRequired,\n openDesignLab: func.isRequired,\n selectedTabs: sidepanelTabsType.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n isOpen: getDesignSidepanelOpen(state),\n canPersonalize: getCanPersonalize(state),\n isAdmin: getIsAdmin(state),\n showFilterModal: getFilterModalOpen(state),\n designingEnabled: getDesigningEnabled(state),\n selectedTabs: getSelectedSidepanelTabs(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n closeOptions: () => dispatch(closeDesignSidepanel()),\n openOptions: () => dispatch(openDesignSidepanel()),\n openDesignLab: () => dispatch(openDesignLabAction()),\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidepanelContainer)\n","import React, { useContext } from 'react'\nimport { func, bool, string } from 'prop-types'\nimport { useTranslation } from 'react-i18next'\n\nimport Tooltip from 'components/Tooltip'\nimport Icon from 'components/uiElements/Icon'\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nconst FavoriteButton = ({ onClick, selected, text }) => {\n const { t } = useTranslation()\n const { isMobile } = useContext(SugarcubeContext)\n const tip = selected ? t('tooltip.remove favorite') : t('tooltip.add favorite')\n return (\n <>\n {!isMobile && }\n \n \n {text}\n \n \n )\n}\n\nFavoriteButton.defaultProps = {\n text: null,\n}\n\nFavoriteButton.propTypes = {\n onClick: func.isRequired,\n selected: bool.isRequired,\n text: string,\n}\n\nexport default FavoriteButton\n","import React, { useCallback, useContext } from 'react'\nimport { connect } from 'react-redux'\nimport { arrayOf, func, string } from 'prop-types'\nimport SugarcubeContext from 'apps/SugarcubeContext'\n\nimport { getIds } from 'models/favorites/selectors'\n\nimport {\n toggleFavorite as toggleFavoriteAction,\n toggleFavorites as toggleFavoritesAction,\n} from 'models/favorites/actions'\n\nimport FavoriteButton from 'components/uiElements/FavoriteButton'\n\nconst FavoriteButtonContainer = ({\n favorites,\n toggleFavorite,\n localItemNumber,\n location,\n localItemNumbers,\n toggleFavorites,\n text,\n}) => {\n const { isKiosk } = useContext(SugarcubeContext)\n const hasFavorites = !!(favorites && favorites.length)\n const singleFavoriteSelected = hasFavorites && localItemNumber && favorites.includes(localItemNumber)\n const multipleFavoritesSelected =\n hasFavorites &&\n localItemNumbers &&\n localItemNumbers.length &&\n localItemNumbers.every((val) => favorites.includes(val))\n\n const isSingleFavorite = !!localItemNumber\n const selected = isSingleFavorite ? singleFavoriteSelected : multipleFavoritesSelected\n\n const toggleSingle = useCallback(() => {\n const isFavorite = !selected\n const trackingInfo = {}\n if (isFavorite) {\n trackingInfo.AddedFrom = location\n } else {\n trackingInfo.RemovedFrom = location\n }\n toggleFavorite(localItemNumber, isFavorite, trackingInfo)\n }, [toggleFavorite, localItemNumber, selected])\n\n const toggleAll = useCallback(() => {\n const isFavorite = !selected\n\n // If all items are favorited or there are no favorites, we want to send all items to fav/un-favorite\n // else, we want to favorite the remaining items that are not already in favorites\n const modifyAll = selected || !hasFavorites\n const itemsToModify = modifyAll ? localItemNumbers : localItemNumbers.filter((item) => favorites.includes(item))\n if (itemsToModify && itemsToModify.length) {\n toggleFavorites(itemsToModify, isFavorite)\n }\n }, [toggleFavorites, localItemNumbers, selected])\n\n if (isKiosk || (!favorites && !localItemNumbers)) {\n return null\n }\n\n return \n}\n\nFavoriteButtonContainer.defaultProps = {\n favorites: null,\n localItemNumber: null,\n localItemNumbers: null,\n text: null,\n}\n\nFavoriteButtonContainer.propTypes = {\n favorites: arrayOf(string),\n toggleFavorite: func.isRequired,\n toggleFavorites: func.isRequired,\n localItemNumber: string,\n localItemNumbers: arrayOf(string),\n location: string.isRequired,\n text: string,\n}\n\nconst mapStateToProps = (state) => ({\n favorites: getIds(state),\n})\n\nconst mapDispatchToProps = {\n toggleFavorite: toggleFavoriteAction,\n toggleFavorites: toggleFavoritesAction,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FavoriteButtonContainer)\n","import { useEffect } from 'react'\n/**\n * Hook that alerts clicks outside of the passed ref\n */\nconst useOutsideAlerter = (ref, onClickOutside) => {\n useEffect(() => {\n /**\n * If clicked on outside of element, call onClickOutside if it exists\n */\n function handleClickOutside(event) {\n if (ref.current && !ref.current.contains(event.target) && onClickOutside) {\n onClickOutside()\n }\n }\n\n // Bind the event listener\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n // Unbind the event listener on clean up\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [ref])\n}\n\nexport default useOutsideAlerter\n","import { useRef, useEffect } from 'react'\n\nconst usePrevious = (value) => {\n const ref = useRef()\n useEffect(() => {\n ref.current = value\n })\n return ref.current\n}\nexport default usePrevious\n","import i18n from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport Backend from 'i18next-http-backend'\n\nimport { getPathRegion, getLocaleFromRegion } from 'models/location/selectors'\nimport { ALLOWED_LOCALES } from 'models/location/constants'\nimport commonEn from '../locales/en/common.json'\nimport commonNl from '../locales/nl-nl/common.json'\n\nconst locale = getLocaleFromRegion(getPathRegion())\nconst resources = {\n en: {\n common: commonEn,\n },\n 'nl-nl': {\n common: commonNl,\n },\n}\n\nconst i18nextInit = (onError, overrideOptions = {}) => {\n const i18nOptions = {\n debug: true,\n lng: locale,\n fallbackLng: locale,\n supportedLngs: ALLOWED_LOCALES,\n // locale will be fully lowercased eg. en-US --> en-us\n lowerCaseLng: true,\n backend: {\n loadPath: `${CDN_BUCKET}/locales/{{lng}}/{{ns}}.json`,\n },\n\n // language codes to lookup, given set language is 'en-US':\n // 'currentOnly' --> 'en-US'\n load: 'currentOnly',\n resources,\n // allows some resources to be set on initialization while others\n // can be loaded using a backend connector\n partialBundledLanguages: true,\n ns: ['translation', 'common'],\n defaultNS: ['translation', 'common'],\n ...overrideOptions,\n }\n return i18n\n .use(Backend)\n .use(initReactI18next)\n .init(i18nOptions, (err, t) => {\n if (err && typeof onError === 'function') {\n onError(err, t)\n }\n })\n}\n\nexport default i18nextInit\n","import generateThumbnailFromPreview from 'utils/generateThumbnailFromPreview'\nimport * as types from 'models/actionTypes'\nimport Renderer from 'Renderer'\n\nexport const updateDebugSettings = (debugSettings) => ({\n type: types.UPDATE_DEBUG_SETTINGS,\n debugSettings,\n})\n\nexport const takeScreenshot = () => () =>\n generateThumbnailFromPreview().then((thumb) => {\n const newWindow = window.open()\n newWindow.document.write(``)\n })\n\nexport const setAdmin = (shouldBeAdmin) => ({\n type: types.SET_ADMIN,\n shouldBeAdmin,\n})\n\nexport const loseWebglContext = () => () => {\n const renderer = Renderer.getInstance()\n if (renderer && renderer.ThreeWGLrenderer) {\n renderer.ThreeWGLrenderer.forceContextLoss()\n }\n}\n\nexport const triggerCompositionLoad = () => ({\n type: types.TRIGGER_COMPOSITION_LOAD,\n})\n\nexport const startSwapTestSaga = (targetRenderItemId, selectedProduct, swapItemsData) => ({\n type: types.START_TEST_SWAP_SAGA,\n targetRenderItemId,\n selectedProduct,\n swapItemsData,\n})\n\nexport const swapTestSagaFinished = (results) => ({\n type: types.TEST_SWAP_SAGA_FINISHED,\n results,\n})\n\nexport const startLoadTestSaga = () => ({\n type: types.START_TEST_LOAD_SAGA,\n})\n\nexport const loadTestSagaFinished = (results) => ({\n type: types.TEST_LOAD_SAGA_FINISHED,\n results,\n})\n","import { createSelector } from 'reselect'\nimport { getMemoryTrackingEnv } from 'models/location/selectors'\n\nexport const getGTURLs = (state) => state.admin.gtURLs\nexport const getGTZipIsLoading = (state) => state.admin.gtZipIsLoading\n\n// Override the state debug settings by the provided URL parameters\nconst getBasicDebugSettings = (state) => state.admin.debugSettings\nexport const getDebugSettings = createSelector(\n [getBasicDebugSettings, getMemoryTrackingEnv],\n (debugSettings, memoryTrackingEnv) =>\n memoryTrackingEnv\n ? {\n ...debugSettings,\n showMemoryStats: !!memoryTrackingEnv,\n trackedMemoryType: memoryTrackingEnv === 'webgl' ? 1 : 0,\n }\n : debugSettings,\n)\n\nexport const getCanEditArtSize = (state) => getDebugSettings(state).canEditArtSize\n","import * as types from 'models/actionTypes'\n\nexport const addToBag = (localItemNumber, region, name, trackingInfo) => ({\n type: types.ADD_TO_BAG,\n localItemNumber,\n region,\n name,\n trackingInfo,\n})\n\nexport const addRoomToBag = (localItemNumbers, region, trackingInfo, blockRedirect = false) => ({\n type: types.ADD_ROOM_TO_BAG,\n localItemNumbers,\n region,\n trackingInfo,\n blockRedirect,\n})\n\nexport const openBag = () => ({\n type: types.OPEN_BAG,\n})\n","export const getHasAddedToBag = (state) => state.bag.hasAddedToBag\n\nexport default getHasAddedToBag\n","export const LAST_SAVED_ON_WEB = 'web'\nexport const LAST_SAVED_ON_IOS = 'ios'\nexport const LAST_SAVED_ON_ANDROID = 'android'\n\nexport const FEATURE_WALLART = 'wallArt'\nexport const FEATURE_ERASER = 'erased'\nexport const FEATURE_STACKABLES = 'stackable'\nexport const FEATURE_COMBINABLES = 'combinable'\nexport const FEATURE_WALLPAINT = 'wallPaint'\n\nexport const FEATURE_VERSIONS = {\n [FEATURE_WALLART]: 1,\n [FEATURE_ERASER]: 1,\n [FEATURE_STACKABLES]: 1,\n [FEATURE_COMBINABLES]: 1,\n [FEATURE_WALLPAINT]: 1,\n}\n","import * as types from 'models/actionTypes'\n\nexport const requestFavorites = () => ({\n type: types.REQUEST_FAVORITES,\n})\n\nexport const receiveFavorites = (favorites) => ({\n type: types.RECEIVE_FAVORITES,\n favorites,\n})\n\nexport const failedReceiveFavorites = () => ({\n type: types.FAILED_RECEIVE_FAVORITES,\n})\n\nexport const toggleFavorite = (localItemNumber, isFavorite, trackingInfo) => ({\n type: types.TOGGLE_FAVORITE,\n localItemNumber,\n isFavorite,\n trackingInfo,\n})\n\nexport const toggleFavorites = (itemsToFavorite, isFavorite, trackingInfo = {}) => ({\n type: types.TOGGLE_FAVORITES,\n itemsToFavorite,\n isFavorite,\n trackingInfo,\n})\n","import { createSelector } from 'reselect'\n\nimport { getFurnitureById as getProductsById } from 'models/furniture/selectors'\n\nexport const getIds = (state) => state.favorites.ids\n\nexport const getHasFavoritesList = createSelector([getIds], (ids) => !!ids && Array.isArray(ids))\n\nexport const getFavoriteProducts = createSelector([getIds, getProductsById], (favIds, productsById) => {\n if (favIds) {\n const products = Object.values(productsById)\n return favIds.map((favId) => products.find((furni) => furni.localItemNumber === favId)).filter((i) => !!i)\n }\n return []\n})\n\nexport const getNumFavorites = createSelector([getIds], (favIds) => (favIds ? favIds.length : 0))\n","import * as types from 'models/actionTypes'\n\nexport const requestFurniture = () => ({\n type: types.REQUEST_FURNITURE_SAGA,\n})\n\n// This is receiving a filtered, paginated result\nexport const receiveFurniture = (furniture, filter, count, hasNext, moreToken) => ({\n type: types.RECEIVE_FURNITURE,\n furniture,\n filter,\n count,\n hasNext,\n moreToken,\n})\n\nexport const failedReceiveFurniture = () => ({\n type: types.FAILED_RECEIVE_FURNITURE,\n})\n\nexport const requestFurnitureByIds = (ids) => ({\n type: types.REQUEST_FURNITURE_BY_IDS_SAGA,\n ids,\n})\n\nexport const receiveFurnitureByIds = (furniture) => ({\n type: types.RECEIVE_FURNITURE_BY_IDS,\n furniture,\n})\n\nexport const failedReceiveFurnitureByIds = () => ({\n type: types.FAILED_RECEIVE_FURNITURE_BY_IDS,\n})\n\nexport const requestFurnitureByLocalItemNos = (localItemNos) => ({\n type: types.REQUEST_FURNITURE_BY_LOCALITEMNOS_SAGA,\n localItemNos,\n})\n\nexport const receiveFurnitureByLocalItemNos = (furniture) => ({\n type: types.RECEIVE_FURNITURE_BY_LOCALITEMNOS,\n furniture,\n})\n\nexport const failedReceiveFurnitureByLocalItemNos = () => ({\n type: types.FAILED_RECEIVE_FURNITURE_BY_LOCALITEMNOS,\n})\n\nexport const requestFurnitureCategories = (region) => ({\n type: types.REQUEST_FURNITURE_CATEGORIES_SAGA,\n region,\n})\n\nexport const receiveFurnitureCategories = (categories) => ({\n type: types.RECEIVE_FURNITURE_CATEGORIES,\n categories,\n})\n\nexport const failedReceiveFurnitureCategories = () => ({\n type: types.FAILED_RECEIVE_FURNITURE_CATEGORIES,\n})\n\nexport const requestFurnitureSwappables = (id) => ({\n type: types.REQUEST_FURNITURE_SWAPPABLES_SAGA,\n id,\n})\n\nexport const receiveFurnitureSwappables = (furniture, id) => ({\n type: types.RECEIVE_FURNITURE_SWAPPABLES,\n furniture,\n id,\n})\n\nexport const failedReceiveFurnitureSwappables = () => ({\n type: types.FAILED_RECEIVE_FURNITURE_SWAPPABLES,\n})\n\nexport const requestFurnitureCombinables = (id, uniqueId, slotCategory, size, variant, nodeIndex) => ({\n type: types.REQUEST_FURNITURE_COMBINABLES_SAGA,\n id,\n uniqueId,\n slotCategory,\n size,\n variant,\n nodeIndex,\n})\n\nexport const receiveFurnitureCombinables = (furniture, parentId, parentUniqueId, nodeIndex) => ({\n type: types.RECEIVE_FURNITURE_COMBINABLES,\n furniture,\n parentId,\n parentUniqueId,\n nodeIndex,\n})\n\nexport const failedReceiveFurnitureCombinables = () => ({\n type: types.FAILED_RECEIVE_FURNITURE_COMBINABLES,\n})\n\nexport const selectFurniture = (id) => ({\n type: types.SELECT_FURNITURE,\n id,\n})\n\nexport const selectSwapFurnitureForDetails = (id) => ({\n type: types.SELECT_FURNITURE_SWAP_DETAILS,\n id,\n})\n\nexport const updateFurnitureFilter = (filter, trackingInfo = null) => ({\n type: types.FURNITURE_FILTER_UPDATE,\n filter,\n trackingInfo,\n})\n\nexport const clearFurnitureFilter = () => ({\n type: types.FURNITURE_FILTER_CLEAR,\n})\n\nexport const filterFeaturedProducts = () => ({\n type: types.FILTER_FEATURED_PRODUCTS,\n})\n","export const colors = {\n 1: {\n name: 'Brushed Metal',\n hex: '#2c2c2c',\n material: `${CDN_BUCKET}/testAssets/frames/textures/1/brushed-metal-dark.jpg`,\n },\n 2: {\n name: 'Oak',\n hex: '#ffffff',\n material: `${CDN_BUCKET}/testAssets/frames/textures/1/oak.jpg`,\n },\n 3: {\n name: 'Wood',\n hex: '#81481f',\n material: `${CDN_BUCKET}/testAssets/frames/textures/1/wood.jpg`,\n },\n}\nexport const productSimpleMaterials = {\n 1: {\n name: 'White',\n hex: '#ffffff',\n material: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n },\n 2: {\n name: 'Brown',\n hex: '#8a5b1e',\n material: `${CDN_BUCKET}/testAssets/frames/textures/contrastGrain.jpg`,\n albedo: '#9b6622',\n },\n 3: {\n name: 'Grey',\n hex: '#222222',\n material: `${CDN_BUCKET}/testAssets/frames/textures/contrastGrain.jpg`,\n albedo: '#222228',\n },\n}\nexport const productProfileMaterials = {\n 1: {\n name: 'White',\n hex: '#ffffff',\n material: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n },\n 2: {\n name: 'Brown',\n hex: '#8a5b1e',\n material: `${CDN_BUCKET}/testAssets/frames/textures/contrastGrain.jpg`,\n albedo: '#9b6622',\n },\n 3: {\n name: 'Grey',\n hex: '#222222',\n material: `${CDN_BUCKET}/testAssets/frames/textures/contrastGrain.jpg`,\n albedo: '#222228',\n },\n}\nexport const rustic = {\n 1: {\n name: 'Rustic',\n hex: '#8c8d62',\n material: `${CDN_BUCKET}/testAssets/frames/textures/woodmoss.jpg`,\n },\n 2: {\n name: 'Old Wood',\n hex: '#ada480',\n material: `${CDN_BUCKET}/testAssets/frames/textures/woodold.jpg`,\n },\n 3: {\n name: 'Rough Wood',\n hex: '#c6af51',\n material: `${CDN_BUCKET}/testAssets/frames/textures/woodrough.jpg`,\n },\n}\nexport const modern = {\n 1: {\n name: 'Wood Swirl',\n hex: '#e58328',\n material: `${CDN_BUCKET}/testAssets/frames/textures/woodswirl.jpg`,\n },\n 2: {\n name: 'Wood Grain',\n hex: '#cec190',\n material: `${CDN_BUCKET}/testAssets/frames/textures/woodgrain.jpg`,\n },\n 3: {\n name: 'Marble',\n hex: '#e2e0d3',\n material: `${CDN_BUCKET}/testAssets/frames/textures/marble.jpg`,\n },\n}\n\nexport const ART_SIZES = {\n 1: {\n id: 1,\n name: 'IKEA',\n },\n 2: {\n id: 2,\n name: 'small',\n height: 0.4,\n },\n 3: {\n id: 3,\n name: 'medium',\n height: 0.5,\n },\n 4: {\n id: 4,\n name: 'large',\n height: 0.6,\n },\n 999: {\n id: 999,\n name: 'Custom',\n },\n}\n\nconst noMatte = {\n id: 1,\n name: 'No Mat',\n hex: null,\n key: 'noMatte',\n}\n\n// const offWhiteMat = {\n// id: 2,\n// name: 'Off White',\n// hex: '#ffe2Ac',\n// key: 'offWhite',\n// sections: [\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 0.25,\n// scaleV: 0.01,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0xffffff,\n// profile: [\n// [0, 0],\n// [0, 0.02],\n// [0.005, 0.025],\n// ],\n// },\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 0.25,\n// scaleV: 0.1,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0xffe2ac,\n// profile: [\n// [0, 0.025],\n// [0.04, 0.025],\n// ],\n// },\n// ],\n// }\n\nconst productSimpleMats = {\n [noMatte.id]: noMatte,\n 10: {\n id: 10,\n name: 'White Mat',\n hex: '#ffffff',\n key: 'whiteMat',\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0, 0],\n [0, 0.01],\n [0.0025, 0.0125],\n [0.05, 0.0125],\n ],\n },\n ],\n },\n 11: {\n id: 11,\n name: 'White Mat With Black Core',\n hex: '#FFFFFF',\n key: 'whiteBlkCore',\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0x222222,\n profile: [\n [0, 0],\n [0, 0.01],\n [0.0025, 0.0125],\n ],\n },\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0.0, 0.0125],\n [0.0475, 0.0125],\n ],\n },\n ],\n },\n 12: {\n id: 12,\n name: 'Grey Mat',\n hex: '#AAAAAA',\n key: 'greyMat',\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0, 0],\n [0, 0.01],\n [0.0025, 0.0125],\n ],\n },\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xaaaaaa,\n profile: [\n [0.0, 0.0125],\n [0.0475, 0.0125],\n ],\n },\n ],\n },\n // 13: {\n // id: 13,\n // name: 'Off White Mat',\n // hex: '#FFE2AC',\n // key: 'owMat',\n // sections: [\n // {\n // Extrude: true,\n // ScaleAbsolute: false,\n // scaleU: 0.25,\n // scaleV: 0.01,\n // textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n // albedo: 0xffffff,\n // profile: [\n // [0, 0],\n // [0, 0.01],\n // [0.0025, 0.0125],\n // ],\n // },\n // {\n // Extrude: true,\n // ScaleAbsolute: false,\n // scaleU: 0.25,\n // scaleV: 0.01,\n // textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n // albedo: 0xffe2ac,\n // profile: [\n // [0.0, 0.0125],\n // [0.0475, 0.0125],\n // ],\n // },\n // ],\n // },\n}\n\nconst productWideMats = {\n [noMatte.id]: noMatte,\n 10: {\n id: 10,\n name: 'White Mat',\n hex: '#ffffff',\n key: 'whiteMat',\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0, 0],\n [0, 0.01],\n [0.0025, 0.0125],\n [0.1, 0.0125],\n ],\n },\n ],\n },\n 11: {\n id: 11,\n name: 'White Mat With Black Core',\n hex: '#FFFFFF',\n key: 'whiteBlkCore',\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0x222222,\n profile: [\n [0, 0],\n [0, 0.01],\n [0.0025, 0.0125],\n ],\n },\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0.0, 0.0125],\n [0.0975, 0.0125],\n ],\n },\n ],\n },\n 12: {\n id: 12,\n name: 'Grey Mat',\n hex: '#AAAAAA',\n key: 'greyMat',\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0, 0],\n [0, 0.01],\n [0.0025, 0.0125],\n ],\n },\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 0.25,\n scaleV: 0.01,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xaaaaaa,\n profile: [\n [0.0, 0.0125],\n [0.0975, 0.0125],\n ],\n },\n ],\n },\n // 13: {\n // id: 13,\n // name: 'Off White Mat',\n // hex: '#FFE2AC',\n // key: 'owMat',\n // sections: [\n // {\n // Extrude: true,\n // ScaleAbsolute: false,\n // scaleU: 0.25,\n // scaleV: 0.01,\n // textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n // albedo: 0xffffff,\n // profile: [\n // [0, 0],\n // [0, 0.01],\n // [0.0025, 0.0125],\n // ],\n // },\n // {\n // Extrude: true,\n // ScaleAbsolute: false,\n // scaleU: 0.25,\n // scaleV: 0.01,\n // textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n // albedo: 0xffe2ac,\n // profile: [\n // [0.0, 0.0125],\n // [0.0975, 0.0125],\n // ],\n // },\n // ],\n // },\n}\n\nconst canvasFrameMattes = {\n [noMatte.id]: noMatte,\n}\n\n// const newFrameMats = {\n// [noMatte.id]: noMatte,\n// [offWhiteMat.id]: offWhiteMat,\n// 3: {\n// id: 3,\n// name: 'Striped Matte',\n// hex: '#ffffff',\n// key: 'stripedMatte',\n// sections: [\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 1.0,\n// scaleV: 1.0,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0x222222,\n// profile: [[0, 0], [0, 0.02], [0.005, 0.025]],\n// },\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 1.0,\n// scaleV: 1.0,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0xFFDDDD,\n// profile: [[0, 0.025], [0.02, 0.025]],\n// },\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 1.0,\n// scaleV: 1.0,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0x222222,\n// profile: [[0, 0.025], [0.005, 0.025]],\n// },\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 1.0,\n// scaleV: 1.0,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0xFFDDDD,\n// profile: [[0, 0.025], [0.02, 0.025]],\n// },\n// ],\n// },\n// 4: {\n// id: 4,\n// name: 'Pattern Matte',\n// hex: '#ffffff',\n// key: 'patternMatte',\n// sections: [\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 0.25,\n// scaleV: 0.01,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/paper.png`,\n// albedo: 0xFFFFFF,\n// profile: [[0, 0], [0, 0.02], [0.005, 0.025]],\n// },\n// {\n// Extrude: true,\n// ScaleAbsolute: false,\n// scaleU: 5.0,\n// scaleV: 1.0,\n// textureName: `${CDN_BUCKET}/testAssets/frames/textures/border.png`,\n// albedo: 0xAAE2FF,\n// profile: [[0, 0.025], [0.06, 0.025]],\n// },\n// ],\n// },\n// }\n\n// const ornateFrameMats = {\n// [noMatte.id]: noMatte,\n// [offWhiteMat.id]: offWhiteMat,\n// }\n\nexport const ART_FRAMES = {\n 1: {\n id: 1,\n name: 'Canvas',\n canvasDepth: 0.02,\n thumbUrl: `${ASSET_BUCKET}/graphics/customize/frames/canvas.png`,\n mattes: canvasFrameMattes,\n },\n 2: {\n id: 2,\n name: 'Gallery Wide',\n canvasDepth: 0.01,\n thumbUrl: `${ASSET_BUCKET}/graphics/customize/frames/gallery_wide.png`,\n mattes: productSimpleMats,\n colors: productSimpleMaterials,\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 1.0,\n scaleV: 0.15,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0, 0],\n [0, 0.01905],\n [0.028575, 0.01905],\n [0.028575, 0.0],\n ],\n },\n ],\n },\n 3: {\n id: 3,\n name: 'Gallery',\n canvasDepth: 0.01,\n thumbUrl: `${ASSET_BUCKET}/graphics/customize/frames/gallery.png`,\n mattes: productWideMats,\n colors: productSimpleMaterials,\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 1.0,\n scaleV: 0.15,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0, 0],\n [0, 0.034925],\n [0.0195, 0.034925],\n [0.0195, 0.0],\n ],\n },\n ],\n },\n 4: {\n id: 4,\n name: 'Traditional',\n canvasDepth: 0.007,\n matOffset: -0.003,\n thumbUrl: `${ASSET_BUCKET}/graphics/customize/frames/traditional.png`,\n mattes: productSimpleMats,\n colors: productProfileMaterials,\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 1.0,\n scaleV: 0.15,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/white.png`,\n albedo: 0xffffff,\n profile: [\n [0.0, 0.0],\n [0.0, 0.01101],\n [0.00087, 0.01183],\n [0.00197, 0.01241],\n [0.00275, 0.01254],\n [0.00363, 0.01216],\n [0.00399, 0.01114],\n [0.02009, 0.01114],\n [0.02057, 0.01203],\n [0.02171, 0.01266],\n [0.02322, 0.01304],\n [0.02487, 0.01343],\n [0.02703, 0.01469],\n [0.02899, 0.01654],\n [0.03013, 0.01844],\n [0.03076, 0.01895],\n [0.03749, 0.01913],\n [0.0381, 0.01862],\n [0.0381, 0.0],\n ],\n },\n ],\n },\n /*\n 4: {\n id: 4,\n name: 'Rustic',\n canvasDepth: 0.02,\n thumbUrl: `${CDN_BUCKET}/testAssets/frames/inset2.png`,\n mattes: newFrameMats,\n colors: rustic,\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 1.0,\n scaleV: 0.25,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/woodmoss.jpg`,\n albedo: 0xFFFFFF,\n profile: [[0, 0], [0, 0.035], [0.06, 0.035], [0.06, 0.0]],\n },\n ],\n },\n 5: {\n id: 5,\n name: 'Modern',\n canvasDepth: 0.02,\n thumbUrl: `${CDN_BUCKET}/testAssets/frames/inset2.png`,\n mattes: newFrameMats,\n colors: modern,\n sections: [\n {\n Extrude: true,\n ScaleAbsolute: false,\n scaleU: 1.0,\n scaleV: 0.25,\n textureName: `${CDN_BUCKET}/testAssets/frames/textures/woodswirl.jpg`,\n albedo: 0xFFFFFF,\n profile: [[0, 0], [0, 0.04], [0.03, 0.04], [0.03, 0.0]],\n },\n ],\n }, */\n // 6: {\n // id: 6,\n // name: 'Ornate',\n // canvasDepth: 0.02,\n // thumbUrl: `${CDN_BUCKET}/testAssets/frames/inset2.png`,\n // mattes: ornateFrameMats,\n // sections: [\n // {\n // Extrude: true,\n // ScaleAbsolute: false,\n // scaleU: 5.0,\n // scaleV: 1.0,\n // textureName: `${CDN_BUCKET}/testAssets/frames/textures/ornate.png`,\n // albedo: 0xffffff,\n // profile: [\n // [0, 0.02],\n // [0, 0.03],\n // [0.02, 0.04],\n // [0.03, 0.04],\n // [0.04, 0.035],\n // [0.06, 0.03],\n // [0.07, 0.03],\n // [0.08, 0.035],\n // [0.09, 0.035],\n // [0.1, 0.03],\n // [0.11, 0.02],\n // [0.11, 0.0],\n // ],\n // },\n // ],\n // },\n}\n","export const DEBUG_CATEGORY = 'DEBUG_CATEGORY'\n\nexport default DEBUG_CATEGORY\n","import { createSelector } from 'reselect'\n\nimport { getIsAdmin, getSubCatalogs as getUserSubCatalogs } from 'models/user/selectors'\nimport sortByArray from 'utils/sortByArray'\n\nconst getById = (state) => state.furniture.byId\nconst getSelectedId = (state) => state.furniture.selectedId\nconst getSwapAnchorId = (state) => state.furniture.swapAnchorId\nexport const getSelectedSwapDetailsId = (state) => state.furniture.selectedSwapDetailsId\nexport const getStackEnabled = (state) => state.furniture.stackEnabled\nexport const getFilterResult = (state) => state.furniture.filterResult\nexport const getFurnitureIsLoading = (state) => state.furniture.isLoading\nexport const getFurnitureIsLoadingByIds = (state) => state.furniture.isLoadingByIds\nexport const getIsSwappablesLoading = (state) => state.furniture.isSwappablesLoading\nexport const getIsCategoriesLoading = (state) => state.furniture.isCategoriesLoading\nexport const getFilter = (state) => state.furniture.filter\nexport const getCategories = (state) => state.furniture.categories\n\nexport const getFurnitureById = createSelector([getById], (itemsById) => itemsById)\n\nexport const getSubCatalogs = createSelector(\n [getById, getUserSubCatalogs, getIsAdmin],\n (itemsById, userSubCatalogs, isAdmin) => {\n if (isAdmin) {\n const result = new Set()\n Object.values(itemsById).forEach((item) => {\n if (item.subCatalogs) {\n item.subCatalogs.forEach((subCat) => {\n result.add(subCat)\n })\n }\n })\n return sortByArray(Array.from(result), [(a) => a, userSubCatalogs], (a) => a)\n }\n return userSubCatalogs\n },\n)\n\nexport const getFurnitureByFilter = createSelector([getFurnitureById, getFilterResult], (itemsById, filterResult) =>\n filterResult.ids.map((fId) => itemsById[fId]).filter((i) => !!i && !i.hidden),\n)\n\nexport const getCanLoadMore = createSelector([getFilterResult], (filterResult) => filterResult.hasNext)\n\nexport const getNumberFurnitureItems = createSelector([getFilterResult], (filterResult) => filterResult.count)\n\nexport const getIsFilterActive = createSelector(\n getFilter,\n (filter) => filter.category !== '*' || filter.subCategory !== '*' || filter.subCatalog !== '*',\n)\n\nexport const getSelectedFurnitureData = createSelector([getFurnitureById, getSelectedId], (furniture, selectedId) => {\n if (!furniture || !furniture[selectedId]) {\n return null\n }\n return {\n ...furniture[selectedId],\n }\n})\n\nexport const getSelectedSwapFurnitureData = createSelector(\n [getFurnitureById, getSwapAnchorId],\n (furniture, selectedId) => furniture[selectedId] || null,\n)\n\nexport const getSelectedSwapDetailsFurnitureData = createSelector(\n [getFurnitureById, getSelectedSwapDetailsId],\n (furniture, selectedId) => furniture[selectedId] || null,\n)\n\nexport const getSelectedFurnitureRecommendedListData = createSelector(\n [getSelectedFurnitureData, getFurnitureById],\n (selectedFurnitureData, itemsById) => {\n if (!selectedFurnitureData || !selectedFurnitureData.recommended) {\n return null\n }\n const { recommended } = selectedFurnitureData\n return Object.values(itemsById).filter(({ id: itemId }) => recommended.includes(itemId))\n },\n)\n\nexport const getSelectedFurnitureSwappableItemsData = createSelector(\n [getSelectedSwapFurnitureData, getFurnitureById],\n (selectedFurnitureData, itemsById) => {\n if (!selectedFurnitureData || !selectedFurnitureData.swappableItems) {\n return null\n }\n\n const { swappableItems: swappableItemIds } = selectedFurnitureData\n\n const swappableItemsData = swappableItemIds.map((swapId) => itemsById[swapId]).filter((item) => !!item)\n\n return swappableItemsData\n },\n)\n","import * as types from 'models/actionTypes'\n\nexport const saveSelectedCompositionToLocalStorage = () => ({\n type: types.SAVE_SELECTED_COMPOSITION_TO_LOCAL_STORAGE,\n})\n\nexport const loadCompositionFromLocalStorage = () => ({\n type: types.LOAD_COMPOSITION_FROM_LOCAL_STORAGE,\n composition: null, // Filled in middleware\n})\n","import * as types from 'models/actionTypes'\n\nexport const quickPreviewClose = () => ({\n type: types.QUICK_PREVIEW_CLOSE,\n})\n\nexport const dragValidityChange = (isValid) => ({\n type: types.DRAG_VALIDITY_CHANGE,\n isValid,\n})\n\nexport const updatePreviewSettings = (settings) => ({\n type: types.UPDATE_PREVIEW_SETTINGS,\n settings,\n})\n\nexport const showPlaceableSurfaces = (surfaces) => ({\n type: types.SHOW_PLACEABLE_SURFACES,\n surfaces,\n})\n\nexport const hidePlaceableSurfaces = () => ({\n type: types.HIDE_PLACEABLE_SURFACES,\n})\n\nexport const setIsMagicWindowLoading = (isMagicWindowLoading) => ({\n type: types.SET_MAGIC_WINDOW_LOADING,\n isMagicWindowLoading,\n})\n\nexport const setInitialLoading = (initialLoading) => ({\n type: types.SET_INITIAL_LOADING,\n initialLoading,\n})\n\nexport const wallDataReady = (wallDataWidth, wallDataHeight) => ({\n type: types.WALLDATA_READY,\n wallDataWidth,\n wallDataHeight,\n})\n","import { createSelector } from 'reselect'\nimport { getSelectedScene } from 'models/compositions/selectors'\nimport { getCanvasWidth } from 'models/location/selectors'\n\nimport isMobile from 'utils/isMobile'\n\nexport const quickPreviewIsOpen = (state) => state.preview.quickPreviewIsOpen\nexport const getIsCurrentDragValid = (state) => state.preview.isCurrentDragValid\nexport const getIsMagicWindowLoading = (state) => state.preview.isMagicWindowLoading\nexport const getInitialLoading = (state) => state.preview.initialLoading\nexport const getPreviewSettingsRaw = (state) => state.preview.settings\nexport const getWallDataDimensions = (state) => state.preview.wallDataDimensions\n\nexport const getPreviewSettings = createSelector(\n [getPreviewSettingsRaw, getIsMagicWindowLoading, getSelectedScene, getCanvasWidth],\n (settings, isMagicWindowLoading, scene, canvasWidth) => ({\n ...settings,\n wallCollisions: scene ? !!scene.isStock : false,\n collectFrameMetric: !isMagicWindowLoading,\n showItemLoaders: !isMagicWindowLoading,\n disableOutline: isMobile(),\n canvasWidth,\n }),\n)\n","import * as types from 'models/actionTypes'\n\nexport const requestRatings = (jobId) => ({\n type: types.REQUEST_RATINGS,\n jobId,\n})\n\nexport const receiveRating = (jobId, rating) => ({\n type: types.RECEIVE_RATING,\n jobId,\n rating,\n})\n\nexport const receiveRatings = (jobId, ratings) => ({\n type: types.RECEIVE_RATINGS,\n jobId,\n ratings,\n})\n\nexport const requestRatingOptions = () => ({\n type: types.REQUEST_RATING_OPTIONS,\n})\n\nexport const receiveRatingOptions = (options) => ({\n type: types.RECEIVE_RATING_OPTIONS,\n options,\n})\n\nexport const submitRating = (jobId, tagId, id, kind, value, note) => ({\n type: types.SUBMIT_RATING,\n jobId,\n tagId,\n id,\n kind,\n value,\n note,\n})\n","export const NOTE = 'NOTE'\nexport const RATING = 'RATING'\nexport const TAG = 'TAG'\nexport const SEVERITY = 'SEVERITY'\n","// TODO: deprecate this file\nimport Renderer from 'Renderer'\n\nexport const getRenderer = () => Renderer.getInstance()\n\nexport default getRenderer\n","import * as types from 'models/actionTypes'\n\nexport const requestStatus = () => ({\n type: types.REQUEST_STATUS,\n})\n\nexport const receiveStatus = (status) => ({\n type: types.RECEIVE_STATUS,\n status,\n})\n\nexport const failedReceiveStatus = () => ({\n type: types.FAILED_RECEIVE_STATUS,\n})\n","export const getHasOutage = (state) => state.support.hasOutage\n\nexport default getHasOutage\n","import * as types from 'models/actionTypes'\n\nexport const showToast = (toastType, props) => ({\n type: types.SHOW_TOAST,\n toastType,\n props,\n})\n\nexport const hideToast = (index) => ({\n type: types.HIDE_TOAST,\n index,\n})\n","export const TRACKING_ADDED_FROM_CATALOG = 'Catalog'\nexport const TRACKING_ADDED_FROM_RECOMMENDED = 'RecommendedProductList'\nexport const TRACKING_ADDED_FROM_CANVAS_ACTION = 'CanvasAction'\nexport const TRACKING_ADDED_FROM_MY_LIST = 'MyList'\nexport const TRACKING_ADDED_FROM_SALES_DRESSING = 'SalesDressing'\nexport const TRACKING_ADDED_FROM_DUPLICATE = 'Duplicate'\n\nexport const TRACK_LOCATION_ACTION_PANEL = 'ActionPanel'\nexport const TRACK_LOCATION_SIDEPANEL = 'Panel'\nexport const TRACK_LOCATION_DESIGN_SUMMARY = 'DesignSummary'\nexport const TRACK_LOCATION_DESIGN_HEADER = 'DesignHeader'\nexport const TRACK_LOCATION_SHARE_PANEL = 'SharePanel'\n\nexport const APP_TYPE_SUGARCUBE = 'Sugarcube'\nexport const APP_TYPE_MAGICWINDOW = 'MagicWindow'\nexport const APP_TYPE_DESIGN_HOME = 'DesignYourHome'\nexport const APP_TYPE_KIOSK = 'Kiosk'\n\nexport const ROOM_SOURCE_USERCAPTURED = 'UserCaptured'\nexport const ROOM_SOURCE_STOCK = 'Stock'\n\nexport const PRODUCT_TYPE_WALLART = 'WallArt'\nexport const PRODUCT_TYPE_FURNITURE = 'Furniture'\n\nexport const APP_ENV_PROD = 'Production'\nexport const APP_ENV_TESTING = 'Testing'\n\nexport const PRODUCT_SWAP = 'ProductSwap'\nexport const TRASH_CAN = 'TrashCan'\nexport const SALES_DRESSING = 'SalesDressing'\nexport const GET_INFO_CANVAS_PIN = 'CanvasPin'\nexport const GET_INFO_PIN_CLICK = 'PinClick'\nexport const GET_INFO_CATALOG_LIST = 'CatalogList'\nexport const GET_INFO_ROOM_LIST = 'RoomList'\nexport const GET_INFO_FAVORITES_LIST = 'FavoritesList'\nexport const GET_INFO_SWAP_LIST = 'SwapList'\n\nexport const CATEGORY = 'Category'\nexport const SUB_CATEGORY = 'Sub-category'\nexport const FILTER_SOURCE_BREADCRUMB = 'Breadcrumb'\nexport const FILTER_SOURCE_MENU = 'Menu'\n\n// Optimizely custom events\n\n// Add to cart clicks from the magic window/sugarcube/design lab experience\nexport const OPTIMIZELY_ADD_TO_CART_MW = 'add_to_cart_mw'\n// Add to cart clicks from either magic window or general shopping experience on ikea.com\nexport const OPTIMIZELY_ADD_TO_CART = 'add_to_cart'\n","import { PRODUCT_TYPE_FURNITURE, PRODUCT_TYPE_WALLART } from 'models/tracking/constants'\nimport * as RenderItemTypes from 'constants/renderItemTypes'\nimport { ProductData } from 'models/furniture'\n\ninterface ProductTrackingInfo {\n ProductTitle: string\n ProductId: number\n ProductType: string\n LocalItemNumber: string\n}\nexport const getProductTrackingInfo = (product: ProductData): ProductTrackingInfo => {\n const { name, id, renderType, localItemNumber } = product\n const isArtItem = renderType === RenderItemTypes.ART_ITEM\n\n return {\n ProductTitle: name,\n ProductId: id,\n ProductType: isArtItem ? PRODUCT_TYPE_WALLART : PRODUCT_TYPE_FURNITURE,\n LocalItemNumber: localItemNumber,\n }\n}\n","export const ART_FILTER_FULL = 'ART_FILTER_FULL'\nexport const ART_FILTER_FAVORITES = 'ART_FILTER_FAVORITES'\n\nexport const DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE = 'DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE'\nexport const DESIGN_SIDEPANEL_MODE_PRODUCT_DETAILS = 'DESIGN_SIDEPANEL_MODE_PRODUCT_DETAILS'\nexport const DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE = 'DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE'\nexport const DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS = 'DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS'\nexport const DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE = 'DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE'\nexport const DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS = 'DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS'\nexport const DESIGN_SIDEPANEL_MODE_SWAP_BROWSE = 'DESIGN_SIDEPANEL_MODE_SWAP_BROWSE'\nexport const DESIGN_SIDEPANEL_MODE_SWAP_DETAILS = 'DESIGN_SIDEPANEL_MODE_SWAP_DETAILS'\nexport const DESIGN_SIDEPANEL_MODE_OPTIONS = 'DESIGN_SIDEPANEL_MODE_OPTIONS'\nexport const DESIGN_SIDEPANEL_MODE_DEBUG = 'DESIGN_SIDEPANEL_MODE_DEBUG'\nexport const DESIGN_SIDEPANEL_MODE_RATE = 'DESIGN_SIDEPANEL_MODE_RATE'\n\nexport const MY_ITEMS_BROWSE_NUM_COLUMNS = 1\nexport const FURNITURE_BROWSE_NUM_COLUMNS = 3\nexport const FURNITURE_SWAP_NUM_COLUMNS = 3\n\n// constants used in react-screen-orientation library, do not change\nexport const ORIENTATION_LANDSCAPE = 'landscape'\nexport const ORIENTATION_PORTRAIT = 'portrait'\n","import axios from 'axios'\nimport { getApiPrefix } from 'models/location/selectors'\n\nconst csrfRegexp = /(^|\\s|;)sugarcube_csrf=(\\S+)(;|$)/\n\nlet bearerToken = null\nlet bearerTokenIsDev = false\n\nexport const setBearerToken = (tokens, isDev = false) => {\n const now = Date.now()\n if (tokens.auth && tokens.auth.expirationTime < now) {\n bearerToken = tokens.auth.value\n }\n // DISABLED UNTIL WE SUPPORT GUEST TOKENS IN BACKEND.\n // else if (tokens.guest && tokens.guest.expirationTime < now) {\n // bearerToken = tokens.guest.value\n // }\n else {\n bearerToken = null\n }\n bearerTokenIsDev = isDev\n}\n\nexport const getCSRFToken = (cookie = document.cookie) => {\n const match = cookie.match(csrfRegexp)\n return match && match[2]\n}\n\nexport const fetchWrapper = (url, config = {}) => {\n const completeUrl = `${getApiPrefix()}${url}`\n const updatedConfig = {\n withCredentials: true,\n headers: {\n Accept: 'application/json',\n 'Content-type': 'application/json',\n },\n url: completeUrl,\n ...config,\n }\n if (config.method !== 'GET' && config.method !== 'HEAD') {\n const token = getCSRFToken()\n if (token) {\n updatedConfig.headers['X-CSRFToken'] = token\n }\n }\n if (bearerToken) {\n updatedConfig.headers.Authorization = `Bearer ${bearerToken}`\n }\n if (bearerTokenIsDev) {\n updatedConfig.headers['X-Geomagical-Dev-Auth'] = '1'\n }\n return axios(updatedConfig)\n}\n\nexport default fetchWrapper\n","import axios from 'axios'\n\nlet token = null\n// window.ikea.authentication.getTokens(console.debug)\n// token = \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImVxSFFLR3duR3hfV3dJZkx0RGpaeDA5MTUzS2xSam5fVE1nVUlMYlJ5RncifQ.eyJpc3MiOiJodHRwczovL2FwaS5pbmdrYS5pa2VhLmNvbS9ndWVzdCIsInN1YiI6ImE5ODdjZDkyLTIwNDItNDRiZS1hMmVmLTk3NTczYWI1NmNmMyIsInJldGFpbFVuaXQiOiJ1cyIsImlhdCI6MTY1NDUzNjE5MywiZXhwIjoxNjU3MTI4MTkzfQ.ecEdeuAEcuXwYEmFDM2AQ1PVLm7tyBGRGFeDxS-YpApwOM-e-Yf20P0xGK7-kw-CXuAJQXJIK2XaCnj0NusAYb7SqrYJsMk9ROTxQVwTFhKlC-7xjzFxOtr3Gap5uSKEyoX-8UN-a2WCP5nUsSzBCiDABioeD_pdA1tabtk_zzQ\"\nexport const hasToken = () => !!token\n\nexport const setSpiderpigsToken = (tokens) => {\n const now = Date.now()\n if (tokens.auth && tokens.auth.expirationTime < now) {\n token = tokens.auth.value\n } else if (tokens.guest && tokens.guest.expirationTime < now) {\n token = tokens.guest.value\n } else {\n // token = null\n }\n}\n\nconst spiderpigsQuery = async (url, query, variables = {}) => {\n const resp = await axios({\n method: 'POST',\n url,\n headers: {\n Accept: 'application/json',\n 'Content-type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'X-Client-Id': SPIDERPIGS_CLIENT_ID,\n },\n data: {\n query,\n variables,\n },\n })\n\n if (resp.errors) {\n return Promise.reject(resp.errors)\n }\n return resp.data\n}\n\nexport const getFavs = () =>\n spiderpigsQuery(\n SPIDERPIGS_LIST_API,\n `\n query {\n minimalLists {\n listId\n name\n isSelected\n items {\n itemNo\n }\n }\n }\n `,\n ).then(({ data }) =>\n data.minimalLists.map((l) => ({\n listId: l.listId,\n name: l.name,\n isSelected: l.isSelected,\n items: l.items.map((it) => it.itemNo),\n })),\n )\n\nexport const getDefaultFavs = () =>\n getFavs().then((lists) => {\n for (let i = 0; i < lists.length; i += 1) {\n if (lists[i].isSelected) {\n return lists[i]\n }\n }\n return lists[0]\n })\n\n// Create a new named list. Select=true means it will become the new default list.\nexport const createFavs = (name, select = true) =>\n spiderpigsQuery(\n SPIDERPIGS_LIST_API,\n `\n mutation($name: String!, $select: Boolean!) {\n createList(name: $name, setSelected: $select) {\n listId\n }\n }\n `,\n {\n name,\n select,\n },\n ).then((data) => data.createList.listId)\n\n// Add items to a favorites list. If listId is null, add to the selected (default) list.\n// If there is no default list currently, this will create it and return the listId.\nexport const addToFavs = (items, listId = null) =>\n spiderpigsQuery(\n SPIDERPIGS_LIST_API,\n `\n mutation($listId: ID, $items: [AddItemInput!]!) {\n addItems(listId: $listId, items: $items) {\n listId\n }\n }\n `,\n {\n listId,\n items: items.map((item) => ({\n itemNo: item,\n quantity: 1,\n })),\n },\n ).then(({ data }) => data.addItems.listId)\n\n// Remove items from the favorites list. If listId is null, remove from the selected (default) list.\nexport const removeFromFavs = (itemNos, listId = null) =>\n spiderpigsQuery(\n SPIDERPIGS_LIST_API,\n `\n mutation($listId: ID, $itemNos: [ID!]!) {\n removeItems(listId: $listId, itemNos: $itemNos) {\n listId\n }\n }\n `,\n {\n listId,\n itemNos,\n },\n ).then(({ data }) => data.removeItems.listId)\n\nexport const getCart = (languageCode) =>\n spiderpigsQuery(\n SPIDERPIGS_CART_API,\n `\n query($languageCode: String!) {\n cart(languageCode: $languageCode) {\n items {\n itemNo\n quantity\n }\n }\n }\n `,\n {\n languageCode,\n },\n ).then((data) => ({\n items: data.cart.items,\n }))\n\n// Incremental add by quantity.\nexport const addToCart = (languageCode, items) =>\n spiderpigsQuery(\n SPIDERPIGS_CART_API,\n `\n mutation($languageCode: String!, $items: [AddItemInput!]!) {\n addItems(items: $items, languageCode: $languageCode) {\n items {\n itemNo\n quantity\n }\n }\n }\n `,\n {\n languageCode,\n items: items.map((item) => ({\n itemNo: item[0],\n quantity: item[1],\n })),\n },\n ).then(({ data }) => ({\n items: data.addItems.items,\n }))\n\n// Set quantity, must be positive, use removeFromCart to \"set to 0\".\nexport const updateCart = (languageCode, itemNo, quantity) =>\n spiderpigsQuery(\n SPIDERPIGS_CART_API,\n `\n mutation($languageCode: String!, $items: [UpdateItemInput!]!) {\n updateItems(items: $items, languageCode: $languageCode) {\n items {\n itemNo\n quantity\n }\n }\n }\n `,\n {\n languageCode,\n items: [\n {\n itemNo,\n quantity,\n },\n ],\n },\n ).then((data) => ({\n items: data.updateItems.items,\n }))\n\n// Zero out an item.\nexport const removeFromCart = (languageCode, itemNo) =>\n spiderpigsQuery(\n SPIDERPIGS_CART_API,\n `\n mutation($languageCode: String!, $items: [ID!]!) {\n removeItems(itemNos: $items, languageCode: $languageCode) {\n items {\n itemNo\n quantity\n }\n }\n }\n `,\n {\n languageCode,\n items: [itemNo],\n },\n ).then((data) => ({\n items: data.removeItems.items,\n }))\n","import configureStore, { rootReducer } from 'configureStore'\n\nexport const store = configureStore()\n\nexport type RootState = ReturnType\nexport type AppDispatch = typeof store.dispatch\n","export const getToasts = (state) => state.toasts\n\nexport default getToasts\n","import { useEffect } from 'react'\n\nconst useDelay = (callback, delay) => {\n useEffect(() => {\n const handler = setTimeout(() => {\n if (callback) {\n callback()\n }\n }, delay)\n\n return () => {\n clearTimeout(handler)\n }\n }, [])\n}\n\nexport default useDelay\n","import React, { useState } from 'react'\nimport Toast from '@ingka/toast'\nimport { useTranslation } from 'react-i18next'\n\nimport { toastType } from 'models/propTypes'\n\nimport useDelay from 'hooks/useDelay'\n\nconst AddedToBagToast = ({ toast }) => {\n const { t } = useTranslation()\n const [isOpen, setIsOpen] = useState(false)\n useDelay(() => setIsOpen(true), 500)\n const {\n props: { name, count, failed },\n } = toast\n\n let message\n\n if (failed) {\n if (count && count > 1) {\n message = t('toasts.unable to add_other')\n } else {\n message = t('toasts.unable to add_one')\n }\n } else if (name) {\n message = t('toasts.named added to bag', { name })\n } else if (count && count > 1) {\n message = t('toasts.multiple added to bag_other', { count })\n } else {\n message = t('toasts.multiple added to bag_one', { count: 1 })\n }\n\n return setIsOpen(false)} onTransitionEnd={() => {}} />\n}\n\nAddedToBagToast.propTypes = {\n toast: toastType.isRequired,\n}\n\nexport default AddedToBagToast\n","import React, { useState } from 'react'\nimport Toast from '@ingka/toast'\nimport { useTranslation } from 'react-i18next'\nimport useDelay from 'hooks/useDelay'\n\nconst RotatePhoneToast = () => {\n const { t } = useTranslation()\n const [isOpen, setIsOpen] = useState(false)\n useDelay(() => setIsOpen(true), 500)\n\n const message = t('toasts.rotate phone')\n return setIsOpen(false)} onTransitionEnd={() => {}} />\n}\n\nexport default RotatePhoneToast\n","import React, { useCallback } from 'react'\nimport { connect } from 'react-redux'\n\nimport { toastsType } from 'models/propTypes'\n\nimport { getToasts } from 'models/toasts/selectors'\n\nimport * as types from 'toasts/toastTypes.js'\n\nimport AddedToBagToast from 'toasts/AddedToBagToast'\nimport RotatePhoneToast from 'toasts/RotatePhoneToast'\n\nconst ToastDisplay = ({ toasts }) => {\n const getToast = useCallback((toast, index) => {\n switch (toast.toastType) {\n case types.ADDED_TO_BAG_TOAST:\n return \n case types.ROTATE_PHONE:\n return \n default:\n return null\n }\n }, [])\n\n return <>{toasts.map(getToast)}\n}\n\nToastDisplay.propTypes = {\n toasts: toastsType.isRequired,\n}\n\nconst mapStateToProps = (state) => ({\n toasts: getToasts(state),\n})\n\nexport default connect(mapStateToProps)(ToastDisplay)\n","export const ADDED_TO_BAG_TOAST = 'ADDED_TO_BAG_TOAST'\nexport const ROTATE_PHONE = 'ROTATE_PHONE'\n","import UAParser from 'ua-parser-js'\n\nconst parser = new UAParser()\nconst minimumVersions = {\n Firefox: 28,\n Chrome: 29,\n Chromium: 29,\n Safari: 9,\n Edge: 12,\n}\n\nexport const getBrowser = () => parser.getBrowser()\n\nexport const isEdge = () => {\n const browser = getBrowser()\n return !!(browser && browser.name && browser.name === 'Edge')\n}\n\nexport const isUnsupportedBrowser = () => {\n const { name, version } = getBrowser()\n return !!(minimumVersions[name] && version < minimumVersions[name])\n}\n\nexport default getBrowser\n","export const buildTag = BUILD_TAG\nexport default `Version: ${BUILD_TAG}`\n","import { LOCALE_US_EN } from 'models/location/constants'\n\nexport const isEmpty = (obj) => Object.keys(obj).length === 0 && obj.constructor === Object\n\nexport const getShoppingCartUrl = (region = LOCALE_US_EN) => `https://www.ikea.com/${region}/shoppingcart/`\n\n// Return a url for checkout of ikea products\n// items: array of string (global product id's) or null\nexport const getAddToCartUrl = (items, region = LOCALE_US_EN) => {\n if (!items || !items.length) {\n return null\n }\n\n const IKEA_SHOPPING_CART_URL = getShoppingCartUrl(region)\n\n // Create a hash of global product id's so that we can create a url of the type:\n // `...items?:&:...`\n const itemsCount = items.reduce((acc, curr) => {\n // skip if curr value is null or empty string\n // ie., this product does not have a global product id\n if (!curr) {\n return acc\n }\n\n if (acc[curr]) {\n acc[curr] += 1\n } else {\n acc[curr] = 1\n }\n return acc\n }, {})\n\n if (isEmpty(itemsCount)) {\n return null\n }\n\n const resultUrl = Object.keys(itemsCount).reduce(\n (acc, curr) => `${acc}${curr}:${itemsCount[curr]},`,\n `${IKEA_SHOPPING_CART_URL}?items=`,\n )\n\n // Remove the trailing '&'\n return resultUrl.slice(0, resultUrl.length - 1)\n}\n","const convertCurrency = (currency) => {\n // Make currency string suitable for parseFloat() to convert by removing $\n const temp = currency.replace(/[^0-9.-]+/g, '')\n\n return parseFloat(temp)\n}\n\nexport default convertCurrency\n","import { LOCALE_US_EN, LOCALES_USING_IMPERIAL_SYSTEM } from 'models/location/constants'\n\nconst convertIntoM = (inches) => {\n const meters = inches / 39.3701\n return meters\n}\n\nconst convertCmtoM = (centimeters) => {\n const meters = centimeters / 100\n return meters\n}\n\nconst convertMtoIn = (meters, round) => {\n const inches = 39.3701 * meters\n\n return round ? Math.ceil(inches * 8) / 8 : inches\n}\n\nconst convertMtoCm = (dimensionMeters, round) => {\n const centimeters = dimensionMeters * 100\n\n return round ? Math.ceil(centimeters) : centimeters\n}\n\nexport const convertMeterDimensionsByLocale = (dimensionMeters, locale = LOCALE_US_EN, round = true) =>\n LOCALES_USING_IMPERIAL_SYSTEM.includes(locale)\n ? convertMtoIn(dimensionMeters, round)\n : convertMtoCm(dimensionMeters, round)\n\nexport const convertDimensionsToMeterByLocale = (dimension, locale = LOCALE_US_EN) =>\n LOCALES_USING_IMPERIAL_SYSTEM.includes(locale) ? convertIntoM(dimension) : convertCmtoM(dimension)\n","import qs from 'qs'\n\nexport const isProd = ENV_IS_PRODUCTION || false\n\nexport const getTestingEnv = () => {\n const { testing: isTestingEnvironment } = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n })\n\n let geoAppTestingFromLocalStorage\n\n try {\n geoAppTestingFromLocalStorage = localStorage.getItem('geoAppTesting')\n\n if (isTestingEnvironment && !geoAppTestingFromLocalStorage) {\n localStorage.setItem('geoAppTesting', true)\n }\n } catch (e) {\n geoAppTestingFromLocalStorage = false\n }\n\n return !!isTestingEnvironment || geoAppTestingFromLocalStorage\n}\n\nexport const getMaxTextureSize = () => {\n const { maxTextureSize } = qs.parse(window.location.search, { ignoreQueryPrefix: true })\n return parseInt(maxTextureSize, 10) || null\n}\n\nexport const getMemoryTrackingEnv = () => {\n const { memoryTrackingEnv } = qs.parse(window.location.search, { ignoreQueryPrefix: true })\n return memoryTrackingEnv\n}\n\nexport default ENV_MODE\n","export default class Fading {\n constructor(fadeTime, onAnimate, onFinish) {\n this.fadeTime = fadeTime * 1000.0\n this.onAnimate = onAnimate\n this.onFinish = onFinish\n\n this.animationRequest = null\n this.startTime = null\n this.isFading = false\n\n this.start = this.start.bind(this)\n this.stop = this.stop.bind(this)\n this.animate = this.animate.bind(this)\n\n this.t = null\n\n this.start()\n }\n\n start() {\n this.t = 0.0\n this.isFading = true\n this.animationRequest = requestAnimationFrame(this.animate)\n }\n\n stop() {\n this.t = null\n this.isFading = false\n cancelAnimationFrame(this.animationRequest)\n }\n\n animate(time) {\n if (!this.isFading) {\n return\n }\n\n if (!this.startTime) {\n this.startTime = time\n }\n\n this.t = (time - this.startTime) / this.fadeTime\n if (this.onAnimate) {\n this.onAnimate(this.t)\n }\n\n if (this.t < 1.0) {\n this.animationRequest = requestAnimationFrame(this.animate)\n } else {\n this.t = null\n this.isFading = false\n if (this.onFinish) {\n this.onFinish()\n }\n }\n }\n}\n","import * as Sentry from '@sentry/react'\n\nconst generateThumbnailFromPreview = (scale = 1.0, quality = 0.92) =>\n new Promise((resolve, reject) => {\n try {\n const artCanvas = document.getElementById('PreviewCanvas')\n\n if (!artCanvas) {\n throw new Error('No canvas data source')\n }\n\n const thumbCanvas = document.createElement('canvas')\n thumbCanvas.width = scale * artCanvas.width\n thumbCanvas.height = scale * artCanvas.height\n\n const thumbCanvasContext = thumbCanvas.getContext('2d')\n\n thumbCanvasContext.scale(scale, scale)\n thumbCanvasContext.drawImage(artCanvas, 0, 0)\n thumbCanvasContext.scale(1, 1)\n\n let imageIsBlack = true\n const imgData = thumbCanvasContext.getImageData(0, 0, thumbCanvas.width, thumbCanvas.height)\n const { data } = imgData\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n imageIsBlack = r === 0 && g === 0 && b === 0\n if (!imageIsBlack) {\n break\n }\n }\n\n const thumbDataUrl = thumbCanvas.toDataURL('image/jpeg', quality)\n\n if (imageIsBlack) {\n Sentry.captureEvent({\n message: 'Black screenshot',\n })\n }\n\n resolve({\n thumbDataUrl,\n imageIsBlack,\n })\n } catch (error) {\n reject(error)\n }\n })\n\nexport default generateThumbnailFromPreview\n","import isMobile from 'utils/isMobile'\n\nexport default () => {\n if (isMobile()) {\n return Math.max(window.screen.width, window.screen.height) * (window.devicePixelRatio || 1)\n }\n return Math.max(window.innerWidth, window.innerHeight)\n}\n","// TODO: swap in ua-parser-js\nimport isMobile from 'ismobilejs'\n\nexport default () => isMobile(window.navigator.userAgent).any\n","import { createInstance } from '@optimizely/react-sdk'\nimport { isProd } from 'utils/environment'\n\nconst optimizely = createInstance({\n sdkKey: isProd ? 'QCe1mjSmjUYMjK6T4SDFo' : 'ExQ1LrMbqzKPKq9DXXgH5',\n})\n\nexport default optimizely\n","// item to find the index of, list to find the index in\nconst findIndex = (item, list) => {\n if (!item) {\n return -1\n }\n if (typeof item === 'string') {\n return list.indexOf(item.trim().toUpperCase())\n }\n if (Array.isArray(item)) {\n let index = -1\n item.forEach((k) => {\n const i = list.indexOf(k.trim().toUpperCase())\n\n // Find the index that's closest to the top of the list\n if (i >= 0 && (index === -1 || i < index)) {\n index = i\n }\n })\n return index\n }\n return -1\n}\n\nconst compare = (a, b, sortDefinition) => {\n let accessor\n let order = null\n\n if (typeof sortDefinition === 'function') {\n accessor = sortDefinition\n } else {\n accessor = sortDefinition[0]\n order = sortDefinition[1]\n }\n\n if (order) {\n const indexA = findIndex(accessor(a), order)\n const indexB = findIndex(accessor(b), order)\n\n // Preserve order if both missing in order array or the same\n if (indexA === indexB) {\n return 0\n }\n // Sink \"unordered\" items\n if (indexA < 0) {\n return 1\n }\n if (indexB < 0) {\n return -1\n }\n // Sort found items\n return indexA - indexB\n }\n\n const itemA = accessor(a)\n const itemB = accessor(b)\n return (itemA ? itemA.toUpperCase() : '').localeCompare(itemB ? itemB.toUpperCase() : '')\n}\n\n// List: the list to sort\n// Sort definitions:\n// Array:\n// Accessor: a function that returns the key(s) to sort by (string or array of keys)\n// This is because the furniture categories weren't ordered by priority so we\n// need to find the highest priority one in the list of keys\n// Order: a list which defines the target order\n// Function:\n// Accessor: a function that returns the key to sort by (string only)\n// Future: could add support for sorting alphabetically with key arrays\nexport default (list, ...sortDefinitions) => {\n if (!list) {\n return null\n }\n if (!list.length) {\n return list\n }\n\n const sorted = [...list]\n\n sorted.sort((a, b) => {\n let comparison = 0\n\n // For each search definition\n for (let i = 0; i < sortDefinitions.length; i += 1) {\n comparison = compare(a, b, sortDefinitions[i])\n // If we can compare using the current definition, return the comparison\n if (comparison !== 0) {\n return comparison\n }\n // Otherwise continue and comparison using the next definition\n }\n return comparison\n })\n\n return sorted\n}\n"],"names":["getFloorPlane","planes","filter","p","reduce","a","b","d","getFloorIndex","floor","indexOf","rotMat","Math","cos","sin","bake","renderItem","xy","orientation","ri","renderer","Renderer","intrinsics","manifest","plane_orientation_0","planeData","floorPoint","WallspiceWebgl","position","pose","pos","rot","intersectLines","a0","a1","b0","b1","na","nb","c","e","f","det","dot0","dot1","x","y","a0Len2","t","b0Len2","s","initBody","w","h","body","lines","i","length","q0","q1","n","nLen","sqrt","normals","push","area","density","mass","corners","radius","positionalOffsets","fb","tb","cs","fs","dt","ds","fn","tau","abs","fx","fy","rho0","dts","m","ti","fMag","dtf","dta","dtr","min","floorLineSegs","floorLine","points","normal","n2","t2","contactPoints","contacts","q","minDQY","jmin","j","floorLines","segs","k","ki","dq","dqy","i0","i1","c0","c1","cp0","cp1","undefined","endpointContacts","dqys","bn","isInside","z","sort","found","di","nDotN2","nDotT2","rotateAndShift","r","getIntersection","bodyLines","map","line","rotate","mid","floorLinePointsInside","point","every","cps","concat","dx","dy","determinant","slice","_","populatefs","mat","row","nx","ny","thetaHatRho0","je","cj","nj","rhoJ","niDotNJ","shift","res","A","ret","d0","AC","cramer","normalShifts","mps","acs","aOnN","accels","setPositionals","bxy","borientation","targetPos","targetOrientation","hist","loopi","dp","dpLen","fbMag","v0","v1","xHat","yHat","vx","vy","drot","atan2","csOrig","remove","removeForce","newcs","newfs","da","ns","good","nsi","Number","isFinite","d1","jitterThreshold","neg","v","pushOut","totalDist","linesAndIntersections","intersection","midp","dir","dot","sign","dist","lineAndIntersection","screenPos","setPosition","setOrientation","newOrientation","makeFloorLines","maskData","planePoints","extControlPoints","centroids","height","width","idx","planeIndex","data","plane","worldPos","fd","fxh","fyh","fzh","fcenter","wallPoints","centroid","wall","wallExtControlPoints","wd","wxh","wyh","wzh","wcenter","right","left","px","max","ep","taus","lambda","xip","tangent2D","normal2D","WALL_SHIFT","len","maxWallsCount","CompositeBackground","panoTexture","this","fullscreenQuad","material","colorFading","fadingStartColor","fadingTargetColor","createFullscreenQuad","rangeArray","Array","keys","defaultUniforms","shadingMap","value","residualMap","segmentationMap","panoMap","customColors","THREE","prevColors","colorsAssigned","colorLerp","colorsHasPrev","defines","MAX_WALLS_COUNT","segmentation_0","USE_OLD_SEGMENTATION","uniforms","vertexShader","fragmentShader","transparent","depthTest","depthWrite","side","rect","intrinsicsRectGeo","onMapLoad","texture","uniformName","flipY","encoding","needsUpdate","resultTex","isMobile","newWidth","round","image","DEFAULT_MOBILE_TEXTURE_SIZE","newHeight","resized","textureHelper","getResizedCopy","dispose","Promise","all","loadManifestTexture","defaultDownloadOptions","then","name","planeIdx","targetColor","stop","unifromIdx","copy","Fading","setRenderIsDirty","color","interpolate","String","set","isArray","g","setRGB","startInterpolation","unsetPlaneColor","py","intrinsicRect","translate","parser","UAParser","getHardwareInfo","model","getDevice","type","vendor","os","getOS","cpu","getCPU","tmpMat4","tmpXAxis","tmpYAxis","tmpZAxis","DirectionVectorMap","NORTH","NORTHEAST","EAST","SOUTHEAST","SOUTH","SOUTHWEST","WEST","NORTHWEST","canvas","ext_depth","canvas_width","canvas_height","downrez","antialias","software","query_canvas","document","createElement","ctx","getContext","failIfMajorPerformanceCaveat","debugInfo","getExtension","rendy","getParameter","RENDERER","underlyingVendor","UNMASKED_VENDOR_WEBGL","underlyingRenderer","UNMASKED_RENDERER_WEBGL","wgl2QueryTimerExt","wgl1QueryTimerExt","navigator","platform","userAgent","applyCustomShaderChunks","alpha","preserveDrawingBuffer","powerPreference","shadowMap","enabled","setSize","setClearAlpha","autoClear","outputEncoding","localClippingEnabled","toneMappingExposure","hwinfo","wallspiceContextInfo","hasFragmentDepth","hasWGL1QueryTimer","hasWGL2QueryTimer","envMapRotation","transpose","wglrend","version","VERSION","GLSLversion","SHADING_LANGUAGE_VERSION","VENDOR","devicePixelRatio","window","camera","top","bottom","near","far","updateProjectionMatrix","view","offsetX","fullWidth","offsetY","fullHeight","B","C","D","projectionMatrix","bind","amb","light","intensity","originalColor","hexgammacol","originalIntensity","layers","enableAll","shadow","mobileTextureSize","pLight","frustumCulled","bias","mapSize","castShadow","dirLight","direction","normalBias","brightness","vector","sceneCam","depth_occlusion_meta_0","cameraPos","cameraFront","getWorldDirection","lightRotMat","lookAt","lightTransMat","lightModelMatInv","multiplyMatrices","invert","currentWidthUnits","currentHeightUnits","currentCenter","lightSpaceNDCProject","clone","applyMatrix4","p1NDC","p2NDC","add","multiplyScalar","minWidth","minHeight","dimensionRatio","widthNDC","heightNDC","newRelativeCenterNDC","sceneCenterViewSpace","elements","sceneCenterLightSpaceNDC","fname","CDN_BUCKET","albedo","resolve","load","anisotropy","wrapS","wrapT","frameMaterial","artImage","Uint8Array","col","bgM","sphereGeo","intrinsicMesh","size","Type","createDebugSphere","debug","shadowfloor","horizongeo","wireframe","geometry","flip","PI","setAttribute","floorgeo","receiveShadow","opacity","stencilWrite","stencilFunc","stencilRef","RUG_SUB_LAYER_DELTA","shadmat","createMat4","matrixAutoUpdate","matrix","string","fontSize","font","fillText","textTexture","bgTex","diffuse","fgUrl","tgtmat","tex","alphaTest","alphaMap","iM","pixels","fgM","fgTex","depth","depthUniform","factoralpha","Float32Array","index","placeMesh","factor","idata","segment","segments","Set","numSegments","val","mask","lTex","segMesh","idhighlight","segsTex","isVisible","colorWrite","depthFunc","visible","itex","nearfar","extensions","fragDepth","dTex","mapping","magFilter","minFilter","depthPackMaterial","itex1","itex2","dTex1","map1","dTex2","map2","mux","depthMesh","textured","offset","xsize","ysize","xoffset","yoffset","vert","divx","ypos","dpix","depthm","intrinsicGeom","setIndex","createIntrinsicDepthGeom","rotation","outMat","makeBasis","p2","cx","cy","p3","objMat","bbox","projMat","boxCorners","screenbox","forEach","expandByPoint","artSize","x_axis","y_axis","P","scale","depth_fx","depth_fy","depth_cx","depth_cy","x_step","y_step","Q1","numeric","Q2","Q3","Q4","proj","wallDimensions","depthImage","mousePosition","pixPos","P3","count","mu","pixel_index","unproj","maskImage","isFurniture","defaultToFloor","isRug","halfHeight","plane_index","generatePoseFromPlane","floor_index","narr","delta","wallData","wallIDs","poss","midx","starty","id","idoffset","includes","occlusionData","midy","wallSize","uvs","shadowMesh","dirVec2","L","R","T","iL","iR","iB","iT","iD","inL","outL","shadowUniform","makeFrameShadowGeo","distance","density1","density2","density3","slen","spr","slengthI","walloffset","geo","vpos","transp","extrusion","ortho","indices","uscale","vscale","xSect","trueLength","v2","Xchamf","Ychamf","innerV","outerV","innerU","outerU","ind","uv","indexBase","voffset","pos2","computeVertexNormals","verticesNeedUpdate","uvsNeedUpdate","computeBoundingSphere","wrap","uL","uR","vB","vT","uv2","edges","scalefactor","shape","moveTo","lineTo","curve","curveType","tension","extrudeSettings","steps","extrudePath","wirecolor","mesh","lightDirection","xcast","ycast","zhat","xh","yh","zh","p0","RUG_THICKNESS","SENTRY_BREADCRUMB_CATEGORY","AA_FXAA","AA_TAA","DEFAULT_THREE_NATIVE_LAYER","STATIC_STACKABLES_THREE_NATIVE_LAYER","DOWNLOAD_RETRIES_COUNT","DOWNLOAD_RETRY_DELAY_MS","TimeMetric","bins","lastFrame","intervalStartTime","histogram","valuesCount","performance","now","interval","addValue","lowerLimit","upperLimit","Infinity","webglConstants","byteSizePerInternalFormat","originalPrefix","dataPrefix","textureUpdateFuncs","textureDeleteFuncs","bufferUpdateFuncs","bufferDeleteFuncs","GlMemoryRecorder","context","gl","currentTextureMemory","currentBufferMemory","trackUpdate","trackDelete","functionName","applyOverride","args","unapplyOverride","trackingFunction","storedOriginalName","targetOrInstance","target","boundInstance","getBoundInstance","customInfo","getCustomInfo","isTargetTexture","internalFormat","previousMemorySize","memorySize","cubeMapMultiplier","getByteSizeForInternalFormat","previousLength","getTexImage2DTextureInfo","getCompressedTexImage2DTextureInfo","getTexStorage2DTextureInfo","getBufferCustomInfo","textureInfo","format","getBufferLength","byteLength","TextureHelper","scene","planeMesh","renderTargets","Map","disposeCallback","threeRenderer","ThreeWGLrenderer","renderTarget","currentRenderTarget","getRenderTarget","setRenderTarget","clear","render","addEventListener","uuid","event","get","removeEventListener","retBuffer","readRenderTargetPixels","currentMaterial","checkError","where","glError","getError","Sentry","message","breadcrumbs","category","errorCode","buffer","result","BINARY_EXTENSION_HEADER_MAGIC","GLTFTextureBasisUExtension","metrics","textureIndex","json","textureDef","textures","extension","source","images","loader","options","ktx2Loader","extensionsRequired","Error","TextureCompression","loadTextureImage","transcodingTimes","has","msBasisUniversalTextureTranscodingTime","CustomGLTFLoader","url","onLoad","onProgress","onError","resourcePath","path","manager","itemStart","onErrorWrapped","itemError","itemEnd","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","downloadStart","sFileDownloadTime","MbFileSizeTransferred","gltfInfo","analyzeJson","pluginCallbacks","parse","gltf","MeshCompression","extensionsUsed","content","headerView","DataView","header","magic","getUint32","chunkView","chunkIndex","chunkLength","chunkType","contentArray","JSON","extensionName","GLTFLoader","CustomDRACOLoader","taskConfig","startTime","elapsed","dracoDecompressTime","DRACOLoader","FurnitureLoader","gltfLoader","dracoLoader","setDecoderPath","preload","setDRACOLoader","ktx2CheckPromise","async","bytes","atob","ArrayBuffer","bufferView","charCodeAt","blob","Blob","objectUrl","URL","createObjectURL","tryKtx2","webglContext","workerConfig","astcSupported","etc1Supported","etc2Supported","dxtSupported","bptcSupported","pvrtcSupported","testKtx2Support","onUpdate","incrementLoadingItems","reject","cubeTex","gltfstuff","furnishing","traverse","child","shadowSide","debugSettings","frontSideShadows","emissiveMap","normalMap","metalnessMap","aoMap","cubetexmap","envMapIntensity","originalEnvMapIntensity","envMap","isCubeTexture","onBeforeCompile","shader","Object","defineProperty","configurable","computeBoundingBox","msDracoDecompress","decrementLoadingItems","error","PendingDownload","furnitureLoader","progressCallbacks","onUpdateCallbacks","promise","loadFurniture","cb","FurnitureManager","glbs","pendingDownloads","referenceCounts","retFurnitureItem","cloned","glbUrl","disassembled","disassembleGLb","pendingDownload","furniture","obj","userData","gltfDataShouldClone","renderObject","glb","childUrl","disposeResources","object","constructor","children","rootObject","childrenGlbs","disposeMap","roughnessMap","close","CustomRenderPass","renderFunc","clearColor","clearAlpha","clearDepth","needsSwap","oldClearColor","Color","writeBuffer","readBuffer","oldClearAlpha","oldAutoClear","getClearColor","getClearAlpha","setClearColor","renderToScreen","autoClearColor","autoClearDepth","autoClearStencil","Pass","CustomOutlinePass","resolution","selectedObjects","occlusionScene","selectedEdgeColor","selectedEdgeStrength","sceneOriginalVisibility","deltaTime","maskActive","renderCamera","_oldClearColor","state","buffers","stencil","setTest","changeVisibilityOfSelectedObjects","renderTargetDepthBuffer","isMesh","originalMaterial","currentBackground","renderScene","background","overrideMaterial","depthMaterial","_visibilityCache","updateTextureMatrix","changeVisibilityOfNonSelectedObjects","prepareMaskMaterial","cameraNearFar","depthTexture","textureMatrix","setupObjectMaskPass","renderTargetMaskBuffer","clearObjectMaskPass","fsQuad","materialCopy","copyUniforms","tDiffuse","renderTargetMaskDownSampleBuffer","tempPulseColor1","visibleEdgeColor","tempPulseColor2","hiddenEdgeColor","pulsePeriod","scalar","edgeDetectionMaterial","maskTexture","texSize","renderTargetEdgeBuffer1","separableBlurMaterial1","colorTexture","OutlinePass","kernelRadius","edgeThickness","renderTargetBlurBuffer1","separableBlurMaterial2","renderTargetBlurBuffer2","renderTargetEdgeBuffer2","overlayMaterial","edgeTexture1","edgeTexture2","patternTexture","edgeStrength","edgeGlow","usePatternTexture","blending","selectedObject","isSelected","selected","bVisible","cache","selectedMeshes","isSprite","isPoints","isLine","prevVisible","FootprintMaterial","floorPlane","occlusionTexture","isFootprintMaterial","stencilFail","stencilZFail","stencilZPass","rugSurfacePlane","constant","clipping","clipIntersection","clippingPlanes","invModelMatrix","occlusionMap","group","matrixWorld","uniformsNeedUpdate","jitterVectors","CustomTAARenderPass","renderFunction","isCustomTAARenderPass","accumulateIndex","sampleLevel","accumulate","holdRenderTarget","sampleRenderTarget","unbiased","copyShader","CopyShader","copyMaterial","premultipliedAlpha","FullScreenQuad","renderInternal","jitterOffsets","stencilBuffer","oldRT","sampleWeight","numSamplesPerFrame","jitterOffset","setViewOffset","clearViewOffset","accumulationWeight","baseSampleWeight","viewOffset","originalViewOffset","assign","rendererInstance","sceneData","settings","previewSettings","onFirstRender","onReady","saveData","onUpdateSaveData","onWallDataReady","maxTextureSize","updateHiddenSurfaces","onInitializationFailure","console","activeRenderer","showOutlines","furnitureManager","onFail","intrinsics_0","m11","m22","m31","m32","pointLights","directionalLights","ambientLight","segmentation_inpainting_0","maskDataURL","planeOrientation","plane_orientation_inpaint_0","maskG","normals_segmentation_inpaint_0","loadedItems","loadedTotalSize","loadingItems","doUpdateHiddenSurfaces","additionalDataLoadSize","wallWidth","wallHeight","hasWebPSupport","checkWebPSupport","description","webglfailure","contextInfo","hasRendered","glMemoryRecorder","start","wallTexture","gpuFrametime","enable","enableQuery","enableStats","lastQueryResultMS","mintime","maxtime","cumulativeAvg","numSamples","ext","debugVizObjects","debugLightHelpers","updateDebugSettings","shadowfloorBlack","highlightMesh","occlusionMesh","segmentsMesh","emptyOcclusionMesh","occlusionImage","foregroundMesh","emptyRGB","unemptyRGB","segsData","segsDataFeather","paintData","paintTex","highlightSeg","paintSet","erasedSegments","initialWallPaint","wallPaint","compositeBg","fullyInitialized","sceneMid","generateLitScene","sceneFront","sceneOverlay","generateImageOverlayScene","aaType","composer","renderPass","outlinePass","antiAliasPass","resetLights","useMultiShadow","allLightOneShadow","shouldRender","renderIsDirty","renderWasDirty","itemsWereLoading","magicWindowWasLoading","frameBins","title","frameMetric","frameMetricLoading","activeFrameMetric","stackingPlanes","renderItems","raycaster","hasStaticStackableSurfaces","delayedStackedLinks","oneTimeRenderCallbacks","scheduledRenderCallbacks","animationFrameId","animate","footprintMaterial","floorWorldPlane","normalize","loadWallData","onoff","queryObj","createQuery","deleteQuery","enableGPUframeStats","onOff","debugInfoDiv","stats","Stats","queryPanel","addPanel","showPanel","domElement","appendChild","newpre","newcontent","createTextNode","parentNode","statsTextDom","removeChild","magicEraserMode","updateHighlightFromPosition","infillSegmentFromPosition","regionID","eraseRegionSurfaceCache","cachedResult","ids","gridPoints","eraseRegionGridPoints","getStaticSurfacePlaneIDsAtPoint","pid","relX","relY","setupRaycaster","targets","flatMap","intersectObjects","hit","isStaticSurface","stackablePlaneId","staticStackablesLoaded","segID","eraseRegionPlaneIDs","surfs","updateSaveData","trackingInfo","EraseableItems","depthData","pix","updateFloorLines","results","loadManifestImagePixels","accum","curr","setMaskData","lateInitialization","canvasWidth","getMaxWindowSize","sceneBack","generateBackgroundScene","generateOcclusionScene","sceneOcclusion","cause","createForegroundMesh","initPostprocessing","item","refresh2DPosition","update","floorPlaneIdx","findIndex","EffectComposer","renderTarget1","renderTarget2","drawTheThings","addPass","setAntiAliasing","WallSnap","ppx","ppy","objHit","range","tgts","intersects","face","isObjectVisible","intersect","getTargetAtPoint","idName","search","parent","replace","parseInt","getLayer","getObject","addToRenderItems","isCombinableChild","refreshCombinableParent","planeId","furnitureItem","stackableSurfaceItem","addToScene","staticStackablesInScene","stackables","staticStackableCount","syncPaintSet","waitingItems","delayedSetPlane","surfaceId","itemId","getObjectByName","removeObjectFromOutline","residual_0","residual_0_webp","shading_0","shading_0_webp","key","setPlaneColor","sdData","sd","sdSize","sMesh","bboxes","minx","maxx","miny","maxy","gp","computeEraseRegionGridPoints","pano_inpaint_0","getWallDimensions","normalSegData","normalSegTex","debugSegmentsMesh","depthOcclusionData","loadDepthOcclusion","loadDepthOcclusionInpaint","readPixels","initFloorPlane","mockDepthOcclusionMeta","extra","nearValue","farValue","depthOcclusionTex","depthOcclusionMesh","zMesh","initInfillIfNeeded","iuglyMesh","iMesh","layer","directBright","ambientBright","lights","hasWall","pmremGenerator","compileEquirectangularShader","probepath","equirectangular","RGBELoader","setDataType","cubetex","fromEquirectangular","shadowobj","showShadows","blackobj","debugobj","lighting","ambient","directional","totalLights","objlight","olp","ext_centerPosition","ext_size","volume","ext_volume","targetDeltaPos","sub","cameraRight","cross","up","angleToHorizon","projectOnPlane","angleTo","sideTranslation","tempLight","updateMatrixWorld","debugLabel","ext_debugviz","foregroundUrl","foreground_0","fgMaskUrl","lightData","metaData","getObjectIdAtPoint","walls","useFloorMask","floorMode","isFloorMode","highlightFloorMode","highlightPlanes","eraseTex","highlight","applyEraseMask","fillvalue","disableOutline","enableOutline","setLinesViz","linesViz","setLightsViz","lightsViz","setDepthViz","depthViz","setSegmenationViz","nsViz","setNormalsViz","normalsViz","setfrontSideShadows","setEnvironmentRotation","environmentRotation","setEnvironmentIntensity","environmentIntensity","setLightsIntensity","pointLightIntensities","ambientLightIntensity","directionalLightIntensities","setAnalyticLightsOn","analyticLightsContribution","setToneMappingParameters","toneMappingType","setGPUframetime","enableGPUframetimeStats","setAoMapIntensity","aoMapIntensity","node","oldmat","axis","isMeshStandardMaterial","shouldBeOn","isLight","exposure","prevToneMappingType","toneMapping","desiredType","testFloatRT","capabilities","isWebGL2","removePass","apply","ShaderPass","FXAAShader","oneTimeRenderCallback","skippedFrames","fraction","maxis","longest","tmp","lv","deltaX","deltaY","deltaZ","random","dz","debugviz","err","composerRtSize","usingTAA","taaSampleRtSize","hasWallData","hasComposer","requestAnimationFrame","intervalStop","isFrameNeedsRender","itemsAreLoading","collectFrameMetric","intervalStart","handleGlError","useFancyShadows","scheduled","splice","totalSceneTriangles","info","triangles","totalLoadedItems","totalLoadedSize","totalFrames","bin","glTextureMemory","glBufferMemory","memory","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","nanotomilli","nano","gpuFrametimeMin","gpuFrametimeMax","gpuFrametimeCumulativeAvg","gpuFrametimeNumSamples","totalModelsLoadSizeMB","modelsCount","sceneAdditionalDataSizeMB","prevOverrideMtl","furnitureChild","prevOnBeforeRender","onBeforeRender","prevOnAfterRender","onAfterRender","wasVisible","queryobj","newSample","lastAvg","currNumSamples","getQueryParameter","QUERY_RESULT_AVAILABLE","elapsedResult","QUERY_RESULT","log","nodeValue","begin","beginQuery","TIME_ELAPSED_EXT","rendersCount","imitateLowPerformance","renderFootprints","endQuery","end","checkQueryResults","flush","finish","onSuccess","forceTAA","useTAAforScreenshots","currentAA","onNextRender","generateThumbnailFromPreview","baseImageData","cancelAnimationFrame","disposeMesh","outlineArray","isThick","params","tmpCanvas","toDataURL","xhr","XMLHttpRequest","open","onreadystatechange","readyState","DONE","getResponseHeader","onerror","send","lpng","code","module","instance","useWasm","test","MSStream","loadManifestTextureSize","requestMeta","axios","method","errors","status","headers","manifestHasImageURL","urls","ordinaryName","webpName","manifestImageURLS","retriesCount","retryDelay","tryNum","setTimeout","loadTexture","ASSET_BUCKET","responseType","returnedWasm","WebAssembly","instantiate","initialize_lpng","binaryPNG","decodedPNG","input","inputPointer","exports","malloc","metadataPointer","lodepng_decode32","free","metadata","Uint32Array","outputPointer","outputSize","output","Uint8ClampedArray","decode","pngDownloadSize","textureContainer","pixelsContainer","defaultContext","isMagicWindow","ikeaNav","allowShare","hideDashboard","isKiosk","createContext","setUpCompositionPreFetch","store","onCompositionPreFetchCallback","composition","furnitures","dispatch","receiveCompiledComposition","setCompositionPreFetchLoading","compositionPreFetchData","compositionPreFetchLoading","onCompositionPreFetchFailedCallback","setUpIFrameListener","MAGICWINDOW_ORIGIN","origin","PARTNER_PORTAL_ORIGIN","msgTypes","setBearerToken","tokens","isDev","setSpiderpigsToken","receiveIkeaTokens","getUrlContext","qs","location","ignoreQueryPrefix","prototype","hasOwnProperty","call","href","require","useTranslation","role","className","onClick","reload","Input","placeholder","onFocus","onBlur","onChange","disabled","onKeyDown","autoFocus","autoSelect","step","props","inputRef","useRef","useEffect","current","setSelectionRange","classNames","ref","defaultProps","propTypes","func","oneOfType","number","bool","Checkbox","label","NAVIGATION","HEADER","BROWSE","DESIGN","skipToLinkCallback","skipTo","skipLinkId","skipLinkElement","getElementById","focus","skipLink","skipContext","iconCode","skipToText","skipLinks","skipLinksInfo","getSkipLinkInfo","positionAbsolute","skipLinkInfo","Icon","Tooltip","delayShow","effect","place","hide","useContext","SugarcubeContext","delayHide","Thumbnail","defaultName","cta","onDelete","date","Date","creationDate","style","backgroundImage","thumbUrl","stopPropagation","svg","toLocaleDateString","dashboardThumbType","ProductItemDetail","isNew","isLarge","price","isInSwap","wide","viewDetails","viewDetailsAriaLabel","isSmall","isStaticText","Range","React","onMouseDown","unit","sideLabel","change","useCallback","parseFloat","tabIndex","element","BouncingBallLoader","headerText","subheaderText","hasText","toggledClassnames","ssrContent","paths","src","alt","draggable","Component","TheaterModal","forwardRef","onClose","isOpen","useOutsideAlerter","next","action","getState","types","hidePlaceableSurfaces","uniqueId","getNextRenderItemId","getRenderer","newPos","renderType","FURNITURE_ITEM","findPlaceableFloorPos","findPlaceableWallPos","showMissingWallsModal","stacks","onFloor","selectCompositionRenderItem","startPlaceStackableItem","placeRenderItem","compositionId","getSelectedComposition","find","combinables","nodesMeta","nodeMeta","currParentRenderItem","variant","selfMeta","parentUniqueId","combinablePlacement","parentId","slotCategory","requestFurnitureCombinables","surfaces","stackableSurfaces","surface","showPlaceableSurfaces","getSwappingSurfaces","getSelectedCompositionId","getSelectedRenderItem","swapStackableSurface","clickPlaceStackableItem","isSwapping","compId","swapStackableToFloor","getNextStackableInfo","heading","clickPlaceRenderItem","nextStackableInfo","stackedPlane","mode","getDesignSidepanelMode","isShowingCatalog","modes","isShowingMyItems","isShowingSwap","clearFurnitureFilter","showSwapMenuForId","setDesignSidepanelMode","selectComposition","renderedItems","getSelectedCompositionProductData","combinableChildren","productData","prod","getProductTrackingInfo","RemovedFrom","SALES_DRESSING","deleteCompositionRenderItem","isLastItem","nextState","renderItemId","isShowingMyItemDetails","openDesignSidepanel","getSelectedCompositionData","getScenesIsFetching","getSelectedScene","activeSceneId","getActiveSceneId","fetchScene","selectedCompositionId","requestCompiledComposition","getFurnitureIsLoadingByIds","missingFurnitureIds","getSelectedCompositionMissingFurnitureIds","requestFurnitureByIds","filterFeaturedProducts","targetRenderItemId","ProductTitle","ProductId","ProductSource","closeDesignSidepanel","selectFurniture","productId","targetRenderItem","readyAndRendered","parentFurnitureData","AddedFrom","TRACKING_ADDED_FROM_SALES_DRESSING","hidden","localTransform","nodeIndex","matrixModel","flat","initialLoading","getSaveOnFirstRender","saveSelectedComposition","swapItemsData","getSelectedFurnitureSwappableItemsData","selectedProduct","getSelectedCompositionRenderedFurnitureItem","getSelectedRenderItemId","jsHeapSizeLimitDelta","totalJSHeapSizeDelta","usedJSHeapSizeDelta","textureMemoryDelta","bufferMemoryDelta","groupEnd","newState","hiddenSurfaces","droppedRenderItems","values","renderItemUniqueId","collection","hash","getHash","selectedSceneid","getSelectedId","pathname","getSearch","comp","getCompositionsData","sceneId","debugFurnitureId","getDebugFurnitureModelUrl","getDebugFurnitureId","redirect","getDefaultRedirectUrl","reset","getApiPrefix","tracker","isSignup","getIsIFrame","nextSearch","URLSearchParams","toString","saveSelectedCompositionToLocalStorage","nextUrl","returnUrl","region","shouldResume","verb","baseUrl","fromUrl","searchParams","PARAM_SAVEONFIRSTRENDER","encodeURIComponent","makeLoginUrl","getDesignLabReturnUrl","getPathRegion","showLoginPromptModal","saveRating","kind","note","tagId","jobId","ratingTypes","fetch","receiveRatingOptions","ratingApi","receiveRatings","receiveRating","getScheduledScreenshotTimeout","tracking","delayedScreenshot","currentTimeoutId","getFurnitureFilterTrackingInfo","furnitureFilter","files","file","contentType","createUpload","resp","signedUrl","uploadFile","confirmUpload","createScreenshot","uploadUuid","renderSessionId","upload","uploadScreenshot","uploadFiles","dataUrlToFile","dataUrl","fileName","mimeType","response","File","jpegQuality","imageData","thumbDataUrl","imageIsBlack","roomInfo","getSelectedCompositionTrackingRoomInfo","getCurrentUser","wid","metricsId","email","isNewUser","isLoggedIn","loginType","trackingId","UserId","UserEmail","LoginAuthenticationMode","Name","getName","SignupDate","LastLogin","removeNewUser","scope","setUser","isMagicWindowLoading","getIsMagicWindowLoading","getHistogramStats","scheduleDelayedScreenshot","swappedInTrackingInfo","removedTrackingInfo","userDidAddRenderItem","getUserDidAddRenderItem","isInitialLoading","getInitialLoading","firstFurnitureScreenshotDone","getFirstFurnitureScreenshotDone","firstRenderItemScreenshotDone","uploadPreviewScreenshot","globalRendererSessionId","userId","sessionId","screenshotType","minuteIncrement","eventName","DesignName","DesignId","SaveType","randNums","crypto","getRandomValues","isRendererValid","totalSceneLoadSizeMB","loadCompleteTime","additionalStats","getRoomAdditionalStats","glbStats","getRoomGlbStats","newTimeout","firstScreenshotTime","getFirstScheduledScreenshotTime","delayedScreenshotSent","delayedScreenshotScsheduled","clearTimeout","getSharePanelOpen","cartUrl","getAddToCartUrl","localItemNumber","CartUrl","OPTIMIZELY_ADD_TO_CART_MW","OPTIMIZELY_ADD_TO_CART","localItemNumbers","updatedTrackingInfo","DESIGN_SIDEPANEL_MODE_FAVORITES_BROWSE","Favorites","getNumFavorites","isFavorite","ProductLocalId","Result","STATE_DONE","prevErasedSegments","nextSegments","prevSegments","eraseItemId","diff","ar1","ar2","EraseItemId","ErasedItems","WallColorChoice","colorString","WallColorPlaneIndex","WallColorChangeId","timestamp","getStatus","fetchUser","requestFavorites","nextAction","redirectUrl","getRedirectUrl","isStaff","enableWalls","userApi","receiveTriggerPasswordReset","urlParams","getUrlParams","token","password","receiveResetPassword","STATE_ERROR","receiveEarlyAccessSubscription","currentPassword","newPassword","receiveChangePassword","phonenumber","app","supportApi","receiveAppDownloadSms","getFilterResult","moreToken","requestedPage","currentPage","stackEnabled","getStackEnabled","fromEntries","entries","getFilter","DEBUG_CATEGORY","LOCALE_GEO","getRegion","debugModelUrl","requestFurniture","urlSubCatalog","getSubCatalog","roomType","getSelectedSceneRoomType","updateFurnitureFilter","subCatalog","messageParent","postMessage","returnState","LocalItemNumber","originId","gaAction","navigateBack","setResumeParam","getHasRendered","isCompositionLoading","getSelectedCompositionIsLoading","isFurnitureLoading","getFurnitureIsLoading","setIsMagicWindowLoading","setInitialLoading","getPreviewSettings","updatePreviewSettings","cleanup","STORED_COMPOSITION_LABEL","getSelectedCompositionSaveData","localStorage","setItem","stringify","getItem","getHasLocalStoredComposition","saveDataString","placedfurnitureSet","placedFurniture","initialState","gtURLs","gtZipIsLoading","ssViz","fill","canEditArtSize","stackablesOnFloor","showMemoryStats","trackedMemoryType","showProductAdminData","hidePins","combineReducers","hasAddedToBag","selectedId","selectedRenderItemId","draggingRenderItemId","nextRenderItemId","byId","isShared","isStock","geoProperties","savedProperties","isSaving","isModified","isLoadingCompositions","isLoadingCompiledComposition","hasSaveError","hoverRenderType","nextStackableItem","waitingInteraction","swappingSurfaces","resetableProps","translateServComp","placedProducts","gfxAttributes","artData","furnitureId","createdAt","thumbnailUrl","compositions","swappedInRenderItem","swapChainPosition","deletedId","targetItem","startsWith","toBeDeletedRenderItems","deletedRenderItems","isLoading","RenderItemTypes","favorites","prevFavs","itemsToFavorite","makeStackableFromV1Data","parameters","vertices","transform","matrix_model","makeStackableFromV0Data","CATEGORIES","SUBCATEGORIES","datefolderStr1","datefolderStr","mattressFullNodesMeta","mattressKingNodesMeta","mattressQueenNodesMeta","mattressTwinNodesMeta","duvetFullFootrestUrl","duvetFullPlatformUrl","duvetKingFootrestUrl","duvetKingPlatformUrl","duvetQueenFootrestUrl","duvetQueenPlatformUrl","duvetTwinFootrestUrl","duvetTwinPlatformUrl","duvetne_100_200PlatformUrl","duvetne_100_200FootrestUrl","duvetne_140_200PlatformUrl","duvetne_140_200FootrestUrl","duvetne_160_200PlatformUrl","duvetne_160_200FootrestUrl","duvetne_180_200PlatformUrl","duvetne_180_200FootrestUrl","duvetne_200_200PlatformUrl","duvetne_200_200FootrestUrl","duvetne_80_200PlatformUrl","duvetne_80_200FootrestUrl","duvetne_90_200PlatformUrl","duvetne_90_200FootrestUrl","duvetuk_doublePlatformUrl","duvetuk_doubleFootrestUrl","duvetuk_kingPlatformUrl","duvetuk_kingFootrestUrl","duvetuk_singlePlatformUrl","duvetuk_singleFootrestUrl","duvetuk_super_kingPlatformUrl","duvetuk_super_kingFootrestUrl","mattressFullUrl","mattressKingUrl","mattressQueenUrl","mattressTwinUrl","mattressne_100_200Url","mattressne_140_200Url","mattressne_160_200Url","mattressne_180_200Url","mattressne_200_200Url","mattressne_80_200Url","mattressne_90_200Url","mattressuk_doubleUrl","mattressuk_kingUrl","mattressuk_singleUrl","mattressuk_super_kingUrl","pillowFullUrl","pillowKingUrl","pillowQueenUrl","pillowTwinUrl","createFakeDuvet","modelUrl","collections","rootCategories","categories","subCategories","ecommerceUrl","globalProductId","rating","ratingCount","imageUrls","qaStatus","availableInRegion","uncompressedModelSize","recommended","subCatalogs","swappableItems","rotX","geometryType","maxX","maxY","maxZ","minX","minY","minZ","createFakeMattress","isLeftMost","createFakePillow","mockCombinableChildren","mappingFunc","processProductItem","product","furnitureData","hasV0","GEOMETRY_TYPE_MAP","hasTallLegs","some","isCubicStructure","horizontal","polygons","artAssetUrls","processedImageUrls","displayHeightCm","displayWidthCm","globalProductAdminUrl","localProductAdminUrl","currItem","swapAnchorId","selectedSwapDetailsId","query","subCategory","loadedSubCatalogs","isSwappablesLoading","isCategoriesLoading","isLoadingByIds","filterResult","hasNext","furni","items","nextFilter","sortByArray","cat","categoryId","subCat","SUBCATORDER","CATORDER","isEmpty","kioskSelectedRoomType","isKioskIntroViewed","quickPreviewIsOpen","isCurrentDragValid","wallDataDimensions","showOcclusions","showSurfaces","wallCollisions","isValid","wallDataWidth","wallDataHeight","isFetching","ratingsByJobId","processServerRating","ratingTag","ratings","job","ops","isLowPerformanceDevice","UNSUPPORTED_ROOMTYPES","fetchState","STATE_NOMINAL","selectedSceneId","processServerScene","sceneItem","staticSurfacesV0","staticSurfacesV1","hasFloor","supportsShadows","supportsForegroundOcclusion","supportsDepthOcclusion","supportsOcclusion","thumbnail","thumbnails","hasWallPaint","depthUrl","creation","defaultX","defaultY","stackables_0","plane_polygon_0","plane_polygons","STATE_FETCHING","scenes","firstDemoSceneId","hasOutage","outage","toastType","filterSource","categoryLabel","subCategoryLabel","timeoutId","compositionsOpen","scenesOpen","artOpen","designSidepanelOpen","designSidepanelMode","DESIGN_SIDEPANEL_MODE_PRODUCT_BROWSE","shouldPresentItemSelection","artTrayFilter","shouldShowWelcomePopup","sceneSelectionTabShowStock","sharePanelOpen","filterModalOpen","showSwapMenu","ORIENTATION_LANDSCAPE","showDesignSummary","DESIGN_SIDEPANEL_MODE_MYITEMS_DETAILS","shouldBeAdmin","shouldPresent","itemSelectionDisplay","display","isFirstTime","shouldShowStock","firstName","lastName","isAdmin","canBeAdmin","signupLoginStatus","canChangePassword","passwordResetStatus","changePasswordStatus","triggerPasswordResetStatus","earlyAccessSubscribeStatus","hasSeenMagicEraserTutorial","appDownloadSmsStatus","addToBag","hasToken","cartApi","select","lang","getLanguageCodeFromRegion","put","showToast","ADDED_TO_BAG_TOAST","failed","addRoomToBag","acc","num","blockRedirect","openBag","shoppingCartUrl","getShoppingCartUrl","bagSagas","takeEvery","ADD_TO_BAG","watchAddToBag","ADD_ROOM_TO_BAG","watchAddRoomToBag","OPEN_BAG","watchOpenBag","requestCompositionsSaga","getCompositions","receiveCompositions","failedReceiveCompositions","requestCompiledCompositionSaga","getCompiledComposition","failedReceiveCompiledComposition","testSwapsSaga","requestFurnitureSwappables","take","RECEIVE_FURNITURE_SWAPPABLES","heapSizeLimit","totalHeapSize","usedHeapSize","textureMemory","bufferMemory","targetProduct","swapItemData","PRODUCT_SWAP","swapRenderItem","newItemId","SWAP_RENDER_ITEM","itemLoadedAction","act","RENDER_ITEM_LOADED","WALLART_ITEM_LOADED","delay","swapTestSagaFinished","testLoadsSaga","removeRenderItems","furnitureById","dimensions","preview","RECEIVE_FURNITURE","furnitureIDs","placedIDs","loadTestSagaFinished","compositionsSagas","REQUEST_COMPOSITIONS_SAGA","watchRequestCompositionsSaga","takeLatest","REQUEST_COMPILED_COMPOSITION_SAGA","watchRequestCompiledCompositionSaga","START_TEST_SWAP_SAGA","watchStartTestSwapSaga","START_TEST_LOAD_SAGA","watchStartTestLoadSaga","favsApi","receiveFavorites","requestFurnitureByLocalItemNos","failedReceiveFavorites","toggleFavorite","toggleFavorites","favoritesSagas","REQUEST_FAVORITES","watchRequestFavorites","TOGGLE_FAVORITE","watchToggleFavorite","TOGGLE_FAVORITES","watchToggleFavorites","getFurniture","page","sub_catalogs","category_id","sub_category_id","room_type","limit","geometry_type","getFurnitureBySearch","needMore","getFurnitureByIds","id__in","join","getFurnitureByLocalItemNos","localItemNos","local_item_number","getFurnitureCategories","stack","getFurnitureSwappables","getFurnitureCombinables","getCombinables","requestFurnitureSaga","nextMoreToken","urlModel","LOCALE_US_EN","isDebug","receiveFurniture","selectDebugFurnitureId","failedReceiveFurniture","requestFurnitureByIdsSaga","receiveFurnitureByIds","failedReceiveFurnitureByIds","requestFurnitureByLocalItemNosSaga","receiveFurnitureByLocalItemNos","failedReceiveFurnitureByLocalItemNos","requestFurnitureCategoriesSaga","receiveFurnitureCategories","failedReceiveFurnitureCategories","requestFurnitureSwappablesSaga","receiveFurnitureSwappables","failedReceiveFurnitureSwappables","requestFurnitureCombinablesSaga","receiveFurnitureCombinables","failedReceiveFurnitureCombinables","furnitureSagas","REQUEST_FURNITURE_SAGA","watchRequestFurnitureSaga","REQUEST_FURNITURE_BY_IDS_SAGA","watchRequestFurnitureByIdsSaga","REQUEST_FURNITURE_BY_LOCALITEMNOS_SAGA","watchRequestFurnitureByLocalItemNosSaga","REQUEST_FURNITURE_CATEGORIES_SAGA","watchRequestFurnitureCategoriesSaga","REQUEST_FURNITURE_SWAPPABLES_SAGA","watchRequestFurnitureSwappablesSaga","REQUEST_FURNITURE_COMBINABLES_SAGA","watchRequestFurnitureCombinablesSaga","requestStatusSaga","receiveStatus","failedReceiveStatus","supportSagas","REQUEST_STATUS","watchRequestStatus","trackSearchBrowseSaga","SearchTerm","SearchResultCount","BrowseCategoryKey","BrowseCategoryLabel","BrowseSubCategoryKey","BrowseSubCategoryLabel","BrowseSelected","SUB_CATEGORY","CATEGORY","SelectType","trackingSagas","watchTrackSearchBrowseSaga","history","sagaMiddleware","createSagaMiddleware","loggerMiddleware","createLogger","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","createBrowserHistory","basename","getRoutingBasename","rootReducer","admin","bag","kiosk","router","connectRouter","support","toasts","ui","user","configureStore","createStore","applyMiddleware","thunkMiddleware","previewMiddleWare","iFrameMiddleWare","localStorageMiddleware","furnitureMiddleware","compositionsMiddleware","userMiddleware","ratingsMiddleware","locationMiddleware","trackingMiddleware","routerMiddleware","run","rootSaga","ART_ITEM","DesignSummaryModalMobile","closeModal","totalPrice","hideToast","onCloseMagicWindow","openExitPopup","addedToRoomItems","panoImageRef","thumb","imageElement","ROTATE_PHONE","compositionName","hasLandscapeOrientation","hasProductsInRoom","hasItemsToFavorite","landscape","arrowLeft","text","FavoriteButtonContainer","TRACK_LOCATION_DESIGN_SUMMARY","ProductItemContainer","isInDesignSummaryView","compositionType","arrayOf","productsDataType","DesignSummaryModal","openDesignLab","onSave","useHistory","takeRoomScreenshot","showSaveButton","saveButtonText","iconOnly","ssrIcon","shoppingBagActive","shoppingBag","SavedFrom","DesignSummaryModalContainer","productIds","ProductsAdded","mapDispatchToProps","addRoomToBagAction","openBagAction","showToastAction","hideToastAction","requestFavoritesAction","openDesignLabAction","saveSelectedCompositionAction","connect","getSelectedCompositionShoppableProductData","getHasAddedToBag","getSelectedCompositionRenderedItemsTotalPrice","getSelectedCompositionRenderItemsLocalIds","getOrientation","getIsModified","getIsLoggedIn","getIsSaving","OpenCompositionModal","closeTryNewRoomModal","compositionDataItems","openComposition","click","compNoCreationDate","newRoomInfo","RoomId","RoomTitle","RoomSource","ROOM_SOURCE_STOCK","openNewComposition","compositionDataItemsType","trackingRoomInfoType","OpenCompositionModalContainer","requestCompositions","openCompositionAction","requestCompositionsAction","getStockCompositionsDataSorted","OptimizelyProviderContainer","otherProps","timeout","attributes","optimizely","getUserId","getIsAdmin","initializationFailure","RenderItem","placedOnFloor","updateReact","isDeleted","msStartLoad","msEndLoad","msEndFlush","sLoadTime","sFlushTime","sTotalTime","LoadSize","total","enforceBounds","getRenderDimensions","generatePose","shouldBeVisible","onChildUpdate","highlightOn","highlightOff","onDragFinish","updateReactSide","childItem","threeObject","makeEmpty","removeFromScene","incrementLoadedItems","getLoadSize","decrementLoadedItems","releaseGlb","unsetObject","addObjectToOutline","maxArtItemOffset","ArtItem","frameData","frameCorners","zoffset","outerL","outerR","outerB","outerT","ratio","toFixed","artMaterial","loadFrame","shadowDirection","shadowMaterial","shadowPlane","isUnderMouse","attemptCubemapMat","setSizeNoReload","getPose","zOffset","getZoffset","shouldBeSelected","updateOutlineThickness","maxItem","from","cur","temp","setThickOutline","mat4","getLightDirectionByIndex","cast","frame","makeFrameModel","setObject","setSelected","innerDepth","canvasDepth","maxDepth","innerLength","geometryCanvas","setFromObject","applyCubemapMat","matte","sections","matDesc","mOff","matOffset","profile","textureName","scaleU","scaleV","extrusionDist","frDesc","isMultiTouchEvent","touches","getClientEventCoords","clientX","clientY","isTouch","CompositionItemDraggable","cornerRef","dragWrapper","startDrag","whileDragging","cancelDrag","updateScale","getConvertedCoordinates","getSceneToDisplayCoordinates","onMouseUp","onMouseMove","updateCenterPointStyle","getCorners","scaleX","scaleY","dragOffset","isDragging","isMouseDown","centerStyle","lastConvertedCoordinates","lastTouchAngle","lastX","mouseDownLocation","wrapperCurrent","prevProps","setState","preventDefault","thresholdExceeded","getBoundingClientRect","eventX","eventY","sceneX","sceneY","corner","bottomPadded","farRight","farBottom","renderDimensions","previewRect","onDragStart","centerPoint","getRenderObject","headingTarget","overrideHeading","convertedCoordinates","rotating","dh","rotateAngle","x1","y1","x2","y2","getMultiTouchAngle","deltaAngle","onDrag","timeStamp","maxWidth","isUnderCursor","openSettings","revealDots","showDot","boxStyle","optionsStyle","itemClass","dragging","isInvalid","tagPoint","GET_INFO_CANVAS_PIN","contextType","isRequired","convertRadToDeg","rad","mapHeading","MODE_ROTATE","MODE_MORE","ActionPanel","targetRef","onRotateStart","onRotate","onRotateFinish","onAddToCart","onDuplicate","onChangeSurface","useState","localHeading","setLocalHeading","isRotating","setIsRotating","openUp","setOpenUp","openLeft","setOpenLeft","setMode","panelRef","rotateRangeRef","rotateStart","rotateFinish","nextHeading","reposition","targetRect","panelRect","contentRect","docHeight","docWidth","spaceBelowOnScreen","spaceBelowOnCanvas","spaceAboveOnScreen","spaceAboveOnCanvas","pad","animationOffset","panelHeight","panelWidth","maxPanelWidth","marginTop","marginBottom","spaceLeft","spaceRight","placeLeft","onScreenBound","onCanvasBound","generatePositionStyle","documentElement","clientHeight","clientWidth","hasMore","setRotateMode","active","onMouseEnter","rangeElement","TRACK_LOCATION_ACTION_PANEL","blur","secondActionButton","querySelector","ActionPanelContainer","TRACKING_ADDED_FROM_CANVAS_ACTION","addToBagAction","CompositionArtItem","aoeRef","onRender","RenderObject","updateObjectSelected","deleteRenderItem","onHoverStart","onHoverEnd","lastValidPosition","wasLastDragValid","loaded","renderCanvas","prevState","artItem","prevArtItem","hex","updateFrame","artImageData","endIsNigh","productTrackingInfo","workflow","LoadTime","CompositionLoading","clearSwapAffinity","setVisible","onHover","del","keyCode","onSelect","disableDrag","duplicate","onMouseLeave","onOpenSettings","delete","artItemType","withTranslation","FurnitureItem","tagPointLocal","ThreeNtvLayer","scalemat4","rotmat4","orientationmat4","marker","boundingBox","lastUpdateFraction","initialSetPlane","isStackable","position2d","getStackingSurface","addDelayedStackedLink","setPlane","modifyOutlineState","noPlane","initPhysicsEntity","refreshParentSurface","findRootParent","removeParentFromHighlight","parentItem","getRenderItem","addChild","addParentToHighlight","identity","rootParent","prevMatrix","setStackedPosition","stackedSurfaceId","intersections","intersectObject","worldToLocal","getPosition","makeRotationZ","makeScale","makeRotationX","multiply","tagPointWorldCoords","localToWorld","project","getWorldPosition","position3Dto2D","sx","sz","placeholderGroup","sy","emissive","expandByObject","updatePlaceholder","quantFraction","limitedFraction","showItemLoaders","furnitureItemHeight","maxPointDistanceToCenter","getCenter","centerPointLocal","topPointLocal","setY","topPoint","furnitureMeshList","list","trials","searchCenter","setX","setZ","ray","distanceTo","textureMap","textureSize","processTexture","old","reassignTexture","propertyName","clearObject","addPlaceholder","getGlb","progress","defaultSize","setLoadSize","decompose","quaternion","resizeTextures","keyCount","endsWith","initTexture","addJustLoaded","initializeTagPointPosition","childMeshes","backsideMesh","metalness","roughness","errorMessage","setHighlighted","CompositionFurnitureItem","updateFromRenderObject","toggleRotate","enableRotate","disableRotate","makeDimensionsLabel","convertMeterDimensionsByLocale","shiftkeyPressed","needsUpdatedCorners","prevPlaneId","newPlaneId","prevX","prevY","wasSelected","isSwappingSurfaces","prevSwappingSurfaces","onSelectEnd","doShowPlaceableSurfaces","move","doHidePlaceableSurfaces","nextPosition","dimensionSymbol","LOCALES_USING_IMPERIAL_SYSTEM","onStartSwapStackableSurface","isDraggingRenderItem","isInRotatingMode","dimensionsLabel","furnitureItemType","CompositionRenderItemContainer","removeRenderItem","updateRenderItem","selectRenderItem","duplicateRenderItem","onDragValidityChange","doStartDragRenderItem","doStopDragRenderItem","onRenderItemLoaded","onWallartItemLoaded","accessFrom","onSelectFurniture","AccessFrom","TRASH_CAN","ProductType","PRODUCT_TYPE_WALLART","PRODUCT_TYPE_FURNITURE","TRACKING_ADDED_FROM_DUPLICATE","OriginalPosition","FinalPosition","OriginalOrientation","FinalOrientation","doClearSwapAffinity","customContext","waitingSurfacesInteraction","selectedRenderItem","isReg","extraProps","renderItemType","previewSettingsType","updateCompostitionRenderItem","duplicateRenderItemAction","dragValidityChange","renderItemLoaded","wallartItemLoaded","startSwapStackableSurface","startDragRenderItem","stopDragRenderItem","getIsCurrentDragValid","getIsDraggingRenderItem","getSurfacesInteractive","GhostItem","recreateRenderObject","projectBBox","clearRenderObject","updateWorldMatrix","makeTranslation","defaultColor","highlightColor","StackableSurfaceItem","onGhostRender","highlighted","createThreeObject","ghost","positions","triangle","p1","addStackingSurface","startFade","isFadeIn","ease","totalTime","appearFading","timeFactor","startColor","highlightFading","lerp","setFurnitureData","CompositionStackableSurfaceItem","incomingFurnitureData","mouseOverCoords","renderObjectRef","setCorners","itemCorners","paddingX","paddingY","showGhost","hideGhost","setGhostPosition","iconVisible","stackableSurfaceItemType","CompositionStackableSurfaceItemContainer","getNextStackableFurnitureData","WallPaintPin","planeIndices","setColor","wallMarker","colorsList","onPinInteract","containerRef","pickerRef","renderLeft","setRenderLeft","pickerWidth","offsetWidth","dotStyle","colors","colorBrightness","rgb","colorOpt","channel","rgbArrayToHex","unshift","colorOptions","checkmarkColor","bright","backgroundColor","noColor","viewBox","xmlns","fillRule","clipRule","wallMarkerType","wallColorsType","WallPaintPinContainer","scenePlanes","wallColors","wallMarkers","opening","eventname","hover","singleWallColor","singleWallMarker","scenePlanesType","wallMarkersType","setWallColor","getSelectedSceneWalls","getSelectedSceneWallColorsList","getSelectedSceneWallMarkers","MissingFeatureModal","ctaText","onCtaClick","closeBtnText","setIsOpen","wrapperRef","closeCtaText","DirectInteractionLayer","layerRef","transformCoords","trackingActive","intervalBinding","WebGLMemTracking","heapMemTracking","snapshotEvent","Event","takeMemorySnapshot","memorySnapshot","dispatchEvent","toggleMemoryTracking","onoroff","clearInterval","warn","setInterval","MemoryCharts","onMemorySnapshot","onToggleTrackingButton","ChartJS","CategoryScale","LinearScale","PointElement","LineElement","Title","Legend","debugMemoryTracking","lastIndex","prevMinTotalHeap","minTotalHeap","prevMinUsedHeap","minUsedHeap","prevMinWebGLMem","minWebGL","showHeapMemoryChart","showWebGLMemoryChart","labels","datasets","pointBorderColor","pointBackgroundColor","snapshot","borderColor","animation","duration","responsive","plugins","legend","debugSettingsType","Sweep","undoRemoveRenderItems","hasRenderItems","onSweepButtonMouseOut","onSweepButtonMouseOver","showSweepToast","setShowSweepToast","actionButtonText","actionClick","onCloseRequest","onTransitionEnd","ariaLabelCloseBtn","onMouseOver","onMouseOut","stopPropagationFunc","Preview","cacheImages","triggerRaycast","onWindowMouseDown","onContextCreationError","sceneContainerRef","canvasRef","coords","underCursorItemId","underCursorStackableSurfaceId","stackableCursorMouseoverCoords","isInvalidForStackable","debugUseMultiShadow","onContextLost","onContextRestored","onRendererReady","onUpdateCompositionSaveData","newRenderer","updateSettings","destroyRenderer","evt","statusMessage","hideSurfaces","onStackableSurfaceClicked","canStack","getRelativeCoords","getStackableSurfaceAtPoint","clearSelection","mouseEvt","imageUrl","generateImageData","sceneFetchState","canvasHeight","correctOrientation","closeMissingWallsModal","setShowDesignSummary","placeStackableOnFloor","adminHidePins","sceneHeight","hasError","Trans","i18nKey","stackableIndicatorMessage","ssVizUrl","semantic_segmentation_visual_0","showSurfacesMessage","isMobileWebMagicWindow","mobile","SkipLinks","paddingTop","onTouchStart","arrowRight","setStaticFurnitureViz","visibilityHide","small","visibilityShow","artStagingCanvas","artStagingContext","artImg","Image","crossOrigin","onload","drawImage","getImageData","nextProps","dimensionsType","supportedOrientation","PreviewContainer","onOrientationChange","onScroll","onScrollFinished","onFullscreenChange","scrollTimeout","defaultBgColor","scrollPos","fullscreen","fscreen","bgImageSource","passive","hasComposition","hasNewScene","newDimensions","setMobileOrientation","scrollY","trackingInfoRaw","maxHeight","headerOffset","useMaxHeight","innerHeight","previewContent","lockOrientation","ORIENTATION_PORTRAIT","alwaysRender","getFetchState","getDebugSettings","getCanvasWidth","getMaxTextureSize","getWallDataDimensions","getShowMissingWallsModal","wallDataReady","stackableSurfaceClicked","updateCompositionSaveData","removeRenderItemsAction","undoRemoveRenderItemsAction","showMissingWallsModalAction","setMobileOrientationAction","clickPlaceStackableOnFloor","PreviewHeader","designingEnabled","onShareClick","editing","editName","rename","edit","checkEdit","openTryNewRoomModal","onCompositionInputBlur","showSaveToast","setSaveSweepToast","prevIsSaving","usePrevious","canModify","canSave","noRenderedItems","toastText","ReactTooltip","PreviewHeaderContainer","onWindowClick","TRACK_LOCATION_DESIGN_HEADER","renameSelectedComposition","saveComposition","toggleSharePanel","saveCompositionBeforeSharing","onLoginNeeded","TRACK_LOCATION_SHARE_PANEL","renameSelectedCompositionAction","toggleSharePanelOpen","saveCompositionBeforeSharingAction","loginNeeded","getDesigningEnabled","getHasSaveError","ProductItemImage","showIcon","imgIsLoading","setImgIsLoading","noIcon","ProductItem","addToRoom","addToRoomButtonAriaLabel","productDataType","ProductItemWide","isStaticImage","TRACK_LOCATION_SIDEPANEL","ProductItemInSwap","swappableItemData","onSwap","selectedFurnitureData","onUndoSwap","threeColumns","onDetailsClick","swapButtonAriaLabel","isInMyItems","arrowCounterclockwise","furnitureDataId","selectItem","removedFurnitureId","swappedFurnitureId","selectedSwapFurnitureData","swappedInProductTrackingInfo","renderData","addProductToRoom","trackingInfoAddedFrom","matteId","frameId","sizeId","colorId","customHeight","selectSwapItemForDetails","isInFavorites","GET_INFO_ROOM_LIST","GET_INFO_FAVORITES_LIST","GET_INFO_SWAP_LIST","GET_INFO_CATALOG_LIST","isDesignSummaryVisible","selectSwapFurnitureForDetails","getSelectedFurnitureData","getSelectedSwapFurnitureData","getShowDesignSummary","SidepanelMenu","hasFavoritesList","selectedTabs","isSwapSelected","isBrowseSelected","isMyListSelected","isFavoritesSelected","isDebugSelected","isRateSelected","hasMyItems","openSidepanel","sidepanelMode","sidepanelTabsType","SidepanelMenuContainer","openOptions","getDesignSidepanelOpen","getHasFavoritesList","getSelectedSidepanelTabs","RelatedProducts","furnituresData","rowCount","ceil","FURNITURE_BROWSE_NUM_COLUMNS","rowArray","data1","data2","TRACKING_ADDED_FROM_RECOMMENDED","RelatedProductsContainer","relatedFurnitureData","getSelectedFurnitureRecommendedListData","BackNavigationHeader","navigationText","Dropdown","toggleOpen","selectedItem","offDefault","expanded","dropdownOptionKeyType","dropdownOptionsType","OptionSelectorView","locale","artRatio","initialHeight","setCustomHeight","customWidth","setCustomWidth","updateArtItem","updateCustomSize","convertDimensionsToMeterByLocale","makeLabel","sizeHeight","suffix","mattes","frameName","selectedFrameId","selectedColorId","selectedMatteId","selectedSizeId","ART_SIZES","I","ART_FRAMES","cId","colorData","mId","matteData","OptionSelectorViewContainer","OriginalProperties","FinalProperties","OriginalSize","FinalSize","updateSelectedCompositionRenderItem","getCanEditArtSize","rel","StarRatings","starIconArray","maxValue","resultArray","valueNumber","isNaN","fullStarsIndex","decimalPart","needsHalfStar","getStarIconArray","ariaLabelText","starIconCode","ProductSummary","trackShowDetails","ImagePicker","selectedImageIndex","setSelectedImageIndex","refs","scrollSelectedImageIntoView","selectedImageElement","scrollIntoView","behavior","inline","block","selectedImageUrl","ItemDetailsView","deleteItem","swapItem","disableSwapCta","onBackClick","toUpperCase","showAddToBagPrimary","ctaContainer","shoppingBagAdd","ItemDetailsViewContainer","selectedSwapDetailsData","clearSwapSelection","goBack","childProductData","productTitle","onAddToBag","getSelectedSwapDetailsFurnitureData","trackShowDetailsAction","ITEM_HEIGHT_BY_COL","MY_ITEMS_BROWSE_NUM_COLUMNS","FURNITURE_SWAP_NUM_COLUMNS","Products","furnitureIsLoading","columnCount","listLayout","itemSize","actualColumnCount","containerHeightRef","scrollOffset","loadTrigger","itemCount","layout","furnitureRowArray","colIndex","TRACKING_ADDED_FROM_CATALOG","MyItemsBrowseView","isDetailsVisible","isBrowseVisible","MyItemsBrowseViewContainer","ProductsContainer","canLoadMore","requestFurnitureAction","getFurnitureByFilter","getCanLoadMore","SheetModal","CAT_ROOM_TYPES","roomFilter","setRoomFilter","isExpanded","setIsExpanded","onRoomClick","roomKey","onCatClick","catId","subCatId","roomFilters","room","CATS_BY_ROOM_TYPE","minus","plus","updateFurnitureFilterAction","getSearchCompletions","searchTerm","config","Accept","shouldAutocomplete","searchCompletions","setSearchCompletions","setError","setIsLoading","searchBox","universal","completions","completion","fetchData","clearSearchResults","ProductFilter","isFilterActive","numberProductItems","filterFeaturedFurniture","showFilterModal","setShowFilterModal","hasDebugCategory","hasFeaturedProducts","isEditing","setIsEditing","searchAndDropdownRef","isSearchCollapsed","setIsSearchCollapsed","searchQuery","hoveredCategoryKey","setHoveredCategoryKey","setQuery","activeCompletionIndex","setActiveCompletionIndex","hasSelectedCategory","hasSelectedSubCategory","FEATURED_CATEGORY","useSearchCompletions","selectedCategory","onCategoryHover","categoryKey","getAttribute","onCategoryClick","onSelectCompletion","browseByCategoryContent","filterCategory","filterSubCategory","numberItemsText","isSearchActive","isFeaturedFilterActive","showFilterSubheader","showFeaturedSubheader","placeHolderText","tryAgainText","showSearchAutocompletions","magnifyingGlass","onSearch","onClear","nextActiveIndex","actions","isActive","isBrowseResult","isNotClickable","FILTER_SOURCE_BREADCRUMB","FILTER_SOURCE_MENU","filterType","categoriesType","ProductFilterContainer","loadCategories","filterDebugFurniture","clearFurnitureFilterAction","setShowFilterModalAction","requestFurnitureCategoriesAction","filterFeaturedProductsAction","getCategories","getIsFilterActive","getNumberFurnitureItems","getIsCategoriesLoading","getFilterModalOpen","ProductDetailsView","ProductDetailsViewContainer","isArtItem","ProductBrowseView","ProductBrowseViewContainer","FavoritesBrowseView","products","addAllToBag","localProducts","setLocalProducts","FavoritesBrowseViewContainer","getFavoriteProducts","Debug","takeScreenshot","loseWebglContext","disableAdmin","updateManifest","startSwapTest","startLoadTest","subCatalogOptions","toneMappingOptions","metaUrl","readOnly","isData","isURL","onInputChange","on","pointLight","DebugViewContainer","screenshot","loseContext","getSubCatalogs","setAdmin","updateSceneManifest","startSwapTestSaga","startLoadTestSaga","getIsFetching","getRatingOptions","getRatingForSelectedScene","createSelector","selectedScene","StarRating","iconChecked","iconUnchecked","highlightCurrentOnly","isCurrentValue","checked","debouncedValue","setDebouncedValue","handler","Textarea","debounce","setNote","hasTyped","setHasTyped","debouncedNote","useDebounce","trim","RatingPanelView","autoDecorate","canDecorate","setCanDecorate","getVal","option","ratingElement","ratingType","ratingOptionsType","RatingPanelViewContainer","submit","fetchRatings","fetchRatingOptions","onClickPlace","refreshComposition","isProd","artId","sceneType","submitRating","requestRatings","requestRatingOptions","triggerCompositionLoad","SwapView","swappableItemsData","onToggle","hasNoSelectedFurniture","selectedOriginalSwapFurniture","undoSwapCallback","undoSwapTooltipText","hasSwappableItems","SwapViewContainer","selectedSwapFurnitureId","isSwappableItemsNull","trackShowDetailsCallback","requestFurnitureSwappablesAction","swapRenderItemAction","getIsSwappablesLoading","SidepanelBody","Sidepanel","isPinned","isHovered","setIsHovered","isHoverOpened","showChevronIcon","to","SidepanelContainer","closeOptions","canPersonalize","getCanPersonalize","FavoriteButton","tip","hasFavorites","singleFavoriteSelected","multipleFavoritesSelected","isSingleFavorite","toggleSingle","toggleAll","itemsToModify","toggleFavoriteAction","toggleFavoritesAction","getIds","onClickOutside","handleClickOutside","contains","getLocaleFromRegion","resources","en","common","commonEn","commonNl","overrideOptions","i18nOptions","lng","fallbackLng","supportedLngs","ALLOWED_LOCALES","lowerCaseLng","backend","loadPath","partialBundledLanguages","defaultNS","i18n","Backend","use","initReactI18next","init","write","forceContextLoss","getMemoryTrackingEnv","memoryTrackingEnv","LAST_SAVED_ON_WEB","FEATURE_WALLART","FEATURE_ERASER","FEATURE_STACKABLES","FEATURE_COMBINABLES","FEATURE_WALLPAINT","FEATURE_VERSIONS","getProductsById","favIds","productsById","favId","requestFurnitureCategories","productSimpleMaterials","productProfileMaterials","noMatte","productSimpleMats","Extrude","ScaleAbsolute","productWideMats","canvasFrameMattes","getById","getFurnitureById","itemsById","getUserSubCatalogs","userSubCatalogs","fId","swapId","loadCompositionFromLocalStorage","NOTE","RATING","TAG","SEVERITY","requestStatus","getHasOutage","APP_TYPE_SUGARCUBE","APP_TYPE_MAGICWINDOW","APP_TYPE_DESIGN_HOME","APP_TYPE_KIOSK","ROOM_SOURCE_USERCAPTURED","APP_ENV_PROD","APP_ENV_TESTING","DESIGN_SIDEPANEL_MODE_PRODUCT_DETAILS","DESIGN_SIDEPANEL_MODE_MYITEMS_BROWSE","DESIGN_SIDEPANEL_MODE_FAVORITES_DETAILS","DESIGN_SIDEPANEL_MODE_SWAP_BROWSE","DESIGN_SIDEPANEL_MODE_SWAP_DETAILS","DESIGN_SIDEPANEL_MODE_OPTIONS","DESIGN_SIDEPANEL_MODE_DEBUG","DESIGN_SIDEPANEL_MODE_RATE","csrfRegexp","bearerToken","bearerTokenIsDev","auth","expirationTime","getCSRFToken","cookie","match","completeUrl","updatedConfig","Authorization","guest","spiderpigsQuery","variables","SPIDERPIGS_CLIENT_ID","getDefaultFavs","SPIDERPIGS_LIST_API","minimalLists","l","listId","it","itemNo","lists","addToFavs","quantity","addItems","removeFromFavs","itemNos","removeItems","addToCart","languageCode","SPIDERPIGS_CART_API","getToasts","callback","AddedToBagToast","toast","useDelay","ToastDisplay","getToast","toastsType","minimumVersions","Firefox","Chrome","Chromium","Safari","Edge","getBrowser","isUnsupportedBrowser","buildTag","BUILD_TAG","IKEA_SHOPPING_CART_URL","itemsCount","resultUrl","currency","convertIntoM","inches","convertCmtoM","centimeters","convertMtoIn","meters","convertMtoCm","dimensionMeters","dimension","ENV_IS_PRODUCTION","getTestingEnv","geoAppTestingFromLocalStorage","isTestingEnvironment","testing","fadeTime","onAnimate","onFinish","animationRequest","isFading","time","quality","artCanvas","thumbCanvas","thumbCanvasContext","screen","innerWidth","any","createInstance","sdkKey","compare","sortDefinition","accessor","order","indexA","indexB","itemA","itemB","localeCompare","sortDefinitions","sorted","comparison"],"sourceRoot":""}