{"version":3,"file":"31.9baeb0e4bb73add2.js","mappings":"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","names":["asyncGeneratorStep","n","t","e","r","o","a","c","i","u","value","done","Promise","resolve","then","_asyncToGenerator","this","arguments","apply","_next","_throw","_retryWeb","fn","maxRetries","timeoutMs","retries","response","error","status","_resolve","setTimeout","Error","Customizer","_reHydrate","request","url","URL","catalog","baseUrl","toString","requestInit","method","headers","Accept","body","JSON","stringify","customizer","mapRequestBodyInit","mapRequestBody","retryWeb","_x","fetch","text","json","product","selected","main","selectedAddons","addons","getProduct","productId","split","id","startsWith","find","addon","map","add","productIdPart","select","SimilarityLength","strA","strB","strASplitted","strBSplitted","reduce","acc","curr","groupSortOrder","group","variantGroups","Number","MAX_SAFE_INTEGER","sortOrder","splitId","concat","mapDialogHeadSelectedVariantsVariants","includes","variants","variantTypes","vt","title","type","replace","variant","options","name","ViewType","Object","freeze","Combi","reHydrate","_x2","mapSelected","mapView","variantIds","path","length","mapVariants","selectedVariantIds","currentSelected","groups","partVariation","filter","_","join","isCombi","view","entries","variantPrices","forEach","variation","priceKey","variantKeys","variantId","groupId","savedVariant","savedPriceHigh","priceDictionary","price","high","savedPriceLow","low","currentSimilarityLength","currentPrice","salesPrice","amount","key","values","sort","va","vb","groupA","groupB","needsHydration","some","mapDialogFilters","inView","_filters","facets","push","depth","v","index","array","findIndex","av","mapDialogView","atEnd","getAtEnd","viableAddons","atStart","getAtStart","next","getNext","offset","indexOfNextAddon","previous","getPrevious","Math","max","goToProduct","isCombi__","__group","hidden","description","translatedSpecifications","assign","mode","productType","mapAccessoryLayout","getSelectedVariants","pid","imgUrl","images","total","mapMainLayout","variationStr","variatants","vidA","vidB","vid","vi","option","mapDialogHead","products","totalSteps","currentStep","prevStepsHasCombi","getPrevProductsSteps","found","productName","overview","mapDialogHeadSelectedVariants","typeTitle","self","addEventListener","_ref","msg","data","mainLayout","accessoryLayout","dialogFilters","dialogView","dialogHead","postMessage","console","message","color","backgroundColor","position"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","./src/business/customizer/model.ts","./src/business/customizer/customizer-advanced2.worker.ts"],"sourcesContent":["function asyncGeneratorStep(n, t, e, r, o, a, c) {\n try {\n var i = n[a](c),\n u = i.value;\n } catch (n) {\n return void e(n);\n }\n i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n return function () {\n var t = this,\n e = arguments;\n return new Promise(function (r, o) {\n var a = n.apply(t, e);\n function _next(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n }\n function _throw(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n }\n _next(void 0);\n });\n };\n}\nexport { _asyncToGenerator as default };","import { NotificationModel } from 'src/app/notification/models/notification';\n\n\nexport declare type DocumentModel = {\n id?: string;\n url?: string;\n label?: string | undefined;\n}\n\nexport declare type ValueObjectOfVariantOption = {\n}\n\nexport declare type VariantOption = ValueObjectOfVariantOption & {\n id?: string;\n name?: string;\n description?: string | undefined;\n imageUrl?: string | undefined;\n sortOrder?: number;\n groupId?: string;\n translatedSpecifications?: string[];\n specifications?: Specification | undefined;\n}\n\nexport declare type Specification = {\n name?: string;\n group?: SpecificationGroup | undefined;\n value?: any | undefined;\n unit?: string | undefined;\n useAsFacet?: boolean;\n sortOrder?: number;\n type?: string;\n}\n\nexport declare type CustomizerAccessoryLayout = {\n imgUrl: string;\n name: string;\n variation: (VariantOption & VariantType)[];\n price: Money;\n id: string;\n isSelcted?: boolean;\n}\nexport declare type CustomizerMainLayout = {\n productId: string;\n variation: string;\n variatants: {\n type: string;\n option: string;\n }[];\n}[];\nexport declare type SpecificationGroup = {\n id?: string;\n name?: string;\n sortOrder?: number;\n}\n\nexport declare type VariantType = {\n type?: string;\n title?: string;\n longTitle?: string | undefined;\n description?: string | undefined;\n view?: string | undefined;\n index?: number;\n}\n\nexport declare type VariantGroup = {\n id?: string;\n title?: string | undefined;\n description?: string | undefined;\n sortOrder?: number;\n}\n\nexport declare type AddonModel = {\n brand?: string | undefined;\n googleProductCategory?: string | undefined;\n options?: { [key: string]: VariantOption; } | undefined;\n productType?: string | undefined;\n variantPrices?: { [key: string]: string; } | undefined;\n variantTypes?: VariantType[] | undefined;\n images?: string[] | undefined;\n priceDictionary?: { [key: string]: Price; } | undefined;\n price?: Price | undefined;\n id?: string | undefined;\n}\n\nexport declare type Indicator = {\n text?: string;\n textColor?: string | undefined;\n backgroundColor?: string | undefined;\n display?: string | undefined;\n}\n\nexport declare type ProductModel = {\n documents?: DocumentModel[] | undefined;\n shortDescription?: string | undefined;\n longDescription?: string | undefined;\n relatedProductIds?: string[][] | undefined;\n price?: Price | undefined;\n primaryTag?: string | undefined;\n productType?: string;\n seoTitle?: string;\n estimatedShippingPrice?: Price | undefined;\n seoDescription?: string;\n id?: string;\n name?: string;\n url?: string | undefined;\n addons?: AddonModel[];\n designer?: string;\n googleProductCategory?: string | undefined;\n variantGroups?: { [key: string]: VariantGroup; };\n variantTypes?: VariantType[];\n variantPrices?: { [key: string]: string; } | undefined;\n options?: { [key: string]: VariantOption; } | undefined;\n specifications?: Specification[];\n brand?: string;\n images?: string[];\n indicators?: Indicator[];\n saleUnitSize?: number;\n campaignFrom?: Date | undefined;\n campaignTo?: Date | undefined;\n priceDictionary?: { [key: string]: Price; };\n categoryGroupCustomizerSelectionTitle?: string | undefined;\n}\n\nexport declare type ValueObjectOfPrice = {\n}\n\nexport declare type Price = ValueObjectOfPrice & {\n id?: string;\n listPrice?: Money;\n salesPrice?: Money;\n vatAmount?: Money;\n vatRate?: number;\n discounts?: Discount[];\n quantityPrices?: { [key: string]: QuantityPrice; } | undefined;\n}\n\nexport declare type ValueObjectOfMoney = {\n}\n\nexport declare type Money = ValueObjectOfMoney & {\n amount?: number;\n currency?: string;\n}\n\nexport declare type Discount = {\n currency?: string | undefined;\n type?: string;\n amount?: number;\n reference?: string;\n}\n\nexport declare type ValueObjectOfQuantityPrice = {\n}\n\nexport declare type QuantityPrice = ValueObjectOfQuantityPrice & {\n totalSalesPrice?: Money;\n id?: string;\n listPrice?: Money;\n salesPrice?: Money;\n vatAmount?: Money;\n vatRate?: number;\n discounts?: Discount[];\n quantityPriceDescriptor?: string | undefined;\n}\nexport declare type CustomizerVariant = string;\nexport declare type CustomizerVariation = string;\nexport declare type CustomizerPriceKey = string;\nexport declare type CustomizerType = number;\nexport declare type CustomizerViewVariation = {\n key: CustomizerVariant,\n price: {\n low: string,\n high: string,\n },\n};\nexport declare type CustomizerSelected = {\n main: CustomizerVariation;\n addons: CustomizerVariation[];\n}\nexport declare type CustomizerViewGroup = {\n variants: CustomizerViewVariation[],\n group: string\n}\nexport declare type CustomizerView = {\n selected: CustomizerVariation;\n type: CustomizerType;\n variantGroups: CustomizerViewGroup[];\n}\nexport declare type CustomizerModel = {\n total?: Price | undefined;\n product?: ProductModel;\n content?: any | undefined;\n}\nexport declare type CustomizerRequest = {\n catalog?: string;\n baseUrl?: string;\n id: string;\n customizer?: CustomizerModel;\n path?: string[]; // [product id, ...variant id]\n select?: string;\n selected?: CustomizerSelected;\n}\nexport type CustomizerDialogHead = {\n typeTitle: string,\n productName: string,\n currentStep: number,\n totalSteps: number,\n overview: any\n}\nexport declare type CustomizerRequestBody = Pick & { selected?: CustomizerSelected }\nexport declare type CustomizerResponse = {\n id: string;\n customizer: CustomizerModel;\n selected: CustomizerSelected;\n inView?: CustomizerView;\n error?: NotificationModel;\n request?: CustomizerRequest;\n mainLayout?: CustomizerMainLayout;\n accessoryLayout?: CustomizerAccessoryLayout;\n dialogFilters?: CustomizerDialogFilter[];\n dialogView?: CustomizerDialogView;\n dialogHead?: CustomizerDialogHead;\n}\nexport declare type CustomizerDialogFacet = {\n id: string;\n value: string;\n depth: number;\n title: string;\n}\nexport declare type CustomizerDialogFilter = {\n title: string;\n facets: CustomizerDialogFacet[];\n}\nexport declare type VariantOptionPrice = VariantOption & Price;\nexport declare type CustomizerDialogVariant = {\n variation: string;\n high: VariantOptionPrice;\n low: VariantOptionPrice;\n selected: boolean\n}\nexport declare type CustomizerDialogGroup = {\n id: string;\n hidden: boolean;\n name: string;\n description: string;\n translatedSpecifications: string[];\n variants: CustomizerDialogVariant[];\n}\nexport declare type CustomizerDialogView = {\n mode: string;\n productId: string;\n productType: string;\n groups: CustomizerDialogGroup[];\n previous: string[] | null;\n next: string[] | null;\n atStart: boolean;\n atEnd: boolean;\n}\nasync function retryWeb(\n fn: () => Promise,\n maxRetries: number = 3,\n timeoutMs: number = 3000\n): Promise {\n let retries = 0;\n let response = null;\n let error = null\n\n while ((response == null || (response != null && 'status' in response && response?.status !== 200)) && retries < maxRetries) {\n try {\n response = await fn();\n } catch (e) {\n error = e\n }\n\n if ((response == null || (response != null && 'status' in response && response?.status !== 200)))\n await new Promise(_resolve => setTimeout(_resolve, timeoutMs));\n retries++;\n }\n if (response == null && error != null)\n throw new Error(error);\n\n return response;\n}\n\nexport namespace Customizer {\n export const ViewType = Object.freeze({\n Combi: 'Combi1And2'\n })\n\n export async function reHydrate(request: CustomizerRequest | CustomizerRequestBody): Promise {\n let url = new URL(`api/${(\"\" + request.catalog)}/product/get-product-customizer`, request.baseUrl).toString();\n let requestInit: RequestInit = {\n method: \"POST\", headers: { \"Accept\": \"application/json\", \"Content-Type\": \"application/json\", },\n body: JSON.stringify(request.customizer == null ? mapRequestBodyInit(request as CustomizerRequestBody) : mapRequestBody(request as CustomizerRequest))\n };\n let response = await retryWeb(() => fetch(url, requestInit));\n if (response.status != 200) {\n throw new Error(await response.text());\n }\n let data = await response.json();\n return data as CustomizerModel;\n }\n\n export function mapRequestBodyInit(request: CustomizerRequestBody) {\n return {\n product: request.selected.main,\n selectedAddons: request.selected.addons,\n };\n }\n\n export function mapSelected(request: CustomizerRequest | CustomizerResponse): CustomizerSelected {\n if (request?.customizer?.product)\n return {\n main: request.customizer.product.id,\n addons: request.customizer.product.addons.map(addon => addon.id)\n }\n if (request?.selected)\n return request?.selected\n return {\n main: '',\n addons: []\n }\n }\n\n export function mapView(request: CustomizerRequest, response: CustomizerResponse): CustomizerView {\n let [productId, ...variantIds] = request.path;\n let type = variantIds?.length ?? 0;\n let product = getProduct(response, productId);\n let selected = product.id;\n let variantGroups = mapVariants(response, product, variantIds, type);\n return { selected, type, variantGroups };\n }\n\n export function needsHydration(request: CustomizerRequest, response: CustomizerResponse) {\n if (response.customizer == null)\n return true;\n if (request.select == null)\n return false;\n return request.select != response.customizer.product.id &&\n !response.customizer.product.addons.some(addon => addon.id == request.select);\n }\n\n export function getProduct(response: CustomizerResponse, productId: string): ProductModel {\n productId = productId.split(',')[0];\n if (response.customizer.product.id.startsWith(productId))\n return response.customizer.product;\n return response.customizer.product.addons.find(addon => addon.id.startsWith(productId));\n }\n\n export function mapDialogFilters(response: CustomizerResponse): CustomizerDialogFilter[] {\n if (response == null || response.inView == null)\n return null;\n let product = getProduct(response, response.inView.selected);\n let isCombi = product.variantTypes[response.inView.type].view == ViewType.Combi;\n if (!isCombi)\n return null;\n let _filters = {\n 0: {\n type: product.variantTypes[response.inView.type],\n facets: []\n }, 1: {\n type: product.variantTypes[response.inView.type + 1],\n facets: []\n }\n };\n\n response\n .inView\n .variantGroups\n .forEach(group => {\n _filters[0].facets.push({\n id: group.group,\n value: group.group,\n depth: 0,\n title: product.options[group.group].name\n })\n group.variants.forEach(v => {\n _filters[1].facets.push({\n id: v.key,\n value: v.key,\n depth: 1,\n title: product.options[v.key].name\n })\n })\n })\n _filters[0].facets = _filters[0]\n .facets\n .filter((value, index, array) => array\n .findIndex(av => av.id == value.id) === index\n )\n _filters[1].facets = _filters[1]\n .facets\n .filter((value, index, array) => array\n .findIndex(av => av.id == value.id) === index\n )\n return Object.values(_filters).map(filter => ({\n title: filter.type.title,\n facets: Object.values(filter.facets)\n })) as CustomizerDialogFilter[]\n }\n\n export function mapDialogView(response: CustomizerResponse): CustomizerDialogView {\n if (response == null || response.inView == null)\n return null;\n let product = getProduct(response, response.inView.selected);\n let isCombi = product.variantTypes[response.inView.type].view == ViewType.Combi;\n let atEnd: boolean = getAtEnd(response, product);\n let atStart: boolean = getAtStart(response, product);\n let next: string[] = getNext(response, product, atEnd);\n let previous: string[] = getPrevious(response, product, atStart);\n let productId: string = product.id.split(',')[0];\n\n let groups = response.inView.variantGroups.map(group => {\n if (isCombi) {\n let __group = product.options[group.group]\n return {\n id: group.group,\n name: __group?.name,\n hidden: false,\n description: __group?.description,\n translatedSpecifications: __group?.translatedSpecifications.filter((_, i) => i == 0),\n variants: group.variants.map(variant => ({\n variation: variant.key,\n ...product.options[group.group],\n ...product.options[variant.key],\n selected: [variant.price.high, variant.price.low].includes(response.inView.selected.split(',')[1]),\n high: Object.assign({ variation: variant.price.high }, product.priceDictionary[product.variantPrices[variant.price.high]]) as VariantOptionPrice,\n low: Object.assign({ variation: variant.price.low }, product.priceDictionary[product.variantPrices[variant.price.low]]) as VariantOptionPrice,\n } as CustomizerDialogVariant))\n } as CustomizerDialogGroup\n }\n let __group = product.variantGroups[group.group];\n return {\n id: group.group,\n name: __group?.title,\n hidden: false,\n description: __group?.description,\n translatedSpecifications: [],\n variants: group.variants.map(variant => ({\n variation: variant.key,\n ...product.options[variant.key],\n selected: [variant.price.high, variant.price.low].includes(response.inView.selected.split(',')[1]),\n high: Object.assign({ variation: variant.price.high }, product.priceDictionary[product.variantPrices[variant.price.high]]) as VariantOptionPrice,\n low: Object.assign({ variation: variant.price.low }, product.priceDictionary[product.variantPrices[variant.price.low]]) as VariantOptionPrice,\n } as CustomizerDialogVariant))\n } as CustomizerDialogGroup\n })\n let productType = product.id === response.customizer.product.id ? 'group' : 'line';\n\n return { productId, groups, mode: product.variantTypes[response.inView.type].view, atEnd, atStart, next, previous, productType, }\n }\n\n function getSelectedVariants(product: ProductModel | AddonModel) {\n let [pid, variation] = product.id.split(',');\n if (!variation)\n return [];\n let variants = variation.split(';');\n return variants.map((variant, type) => Object.assign({}, product.options[variant], product.variantTypes[type]));\n }\n\n export function mapAccessoryLayout(response: CustomizerResponse): CustomizerAccessoryLayout {\n let variation = [\n response.customizer.product,\n ...response.customizer.product.addons\n ]\n .reduce((acc, curr) => acc.concat(getSelectedVariants(curr)), [])\n return {\n imgUrl: response.customizer.product.images[0],\n name: response.customizer.product.name,\n price: response.customizer.total.salesPrice,\n variation,\n id: response.customizer.product.id\n }\n }\n\n export function mapMainLayout(response: CustomizerResponse): CustomizerMainLayout {\n if (response == null || response.selected == null)\n return null;\n return [response.selected.main, ...(response.selected?.addons ?? [])].map(variation => {\n let product = getProduct(response, variation);\n let [productId, variationStr] = variation.split(',');\n let variationParts = variationStr.split(';');\n let variatants = variationParts\n .sort((vidA, vidB) => (product.options[vidA].sortOrder ?? Number.MAX_SAFE_INTEGER) - (product.options[vidB].sortOrder ?? Number.MAX_SAFE_INTEGER))\n .map((vid, vi) => ({ type: product.variantTypes[vi].title, option: product.options[vid].name }))\n return {\n productId,\n variation,\n variatants\n }\n })\n }\n\n export function mapDialogHead(response: CustomizerResponse): CustomizerDialogHead {\n if (response == null)\n return null;\n let product = getProduct(response, response.inView.selected);\n let products = [response.customizer.product, ...response.customizer.product?.addons];\n let totalSteps = products.map(t => t.variantTypes.length - (t.variantTypes.some(vt => vt.view == ViewType.Combi) ? 1 : 0)).reduce((acc, curr) => acc += curr, 0)\n let currentStep = response.inView.type - prevStepsHasCombi(response.inView.type, product) + getPrevProductsSteps(product, products);\n let productName = response.customizer.product.name;\n let overview = mapDialogHeadSelectedVariants(response);\n let typeTitle = product.variantTypes[response.inView.type].title;\n return { productName, currentStep, totalSteps, overview, typeTitle };\n }\n\n function mapRequestBody(request: CustomizerRequest): { product: string, selectedAddons: string[] } {\n if (request == null || request.customizer == null)\n return;\n let response = { product: request.customizer.product.id, selectedAddons: request.customizer.product.addons.map(add => add.id) ?? [] };\n let productIdPart = request.select.split(',')[0];\n if (request.customizer.product.id.startsWith(productIdPart)) {\n response.product = request.select;\n } else {\n response.selectedAddons = response.selectedAddons.map(id => id.startsWith(productIdPart) ? request.select : id)\n }\n return response;\n }\n\n function SimilarityLength(strA: string, strB: string) {\n let strASplitted = strA.split(';');\n let strBSplitted = strB.split(';');\n return strASplitted.reduce((acc, curr, i) => acc += (curr == strBSplitted[i] ? 1 : 0), 0);\n }\n\n function mapVariants(\n response: CustomizerResponse,\n product: ProductModel | AddonModel,\n selectedVariantIds: string[],\n type: number\n ): CustomizerViewGroup[] {\n let currentSelected = product.id.split(',')[1];\n let groups: {\n [key: string]: {\n group: string,\n variants: { [key: string]: CustomizerViewVariation } | CustomizerViewVariation[]\n }\n } = {};\n let partVariation = selectedVariantIds.filter((_, i) => i < type).join(';')\n let isCombi = product.variantTypes[type].view == ViewType.Combi;\n\n Object\n .entries(product?.variantPrices ?? {})\n .forEach(([variation, priceKey]) => {\n if (!variation.startsWith(partVariation))\n return;\n let variantKeys = variation.split(';');\n let variantId = isCombi ? variantKeys[type + 1] : variantKeys[type];\n /// Group get/set ///////\n let groupId = isCombi ? variantKeys[type] : product.options[variantId]?.groupId ?? '';\n if (!(groups[groupId]))\n groups[groupId] = {\n group: groupId,\n variants: {}\n }\n let group = groups[groupId];\n //////////////////////////////////////////\n if (!(group.variants[variantId])) // variant not set yet\n group.variants[variantId] = {\n key: variantId,\n price: {\n low: variation,\n high: variation,\n }\n }\n else {\n let savedVariant = group.variants[variantId];\n let savedPriceHigh = product.priceDictionary[product.variantPrices[savedVariant.price.high]];\n let savedPriceLow = product.priceDictionary[product.variantPrices[savedVariant.price.low]];\n let currentSimilarityLength = SimilarityLength(variation, currentSelected);\n let currentPrice = product.priceDictionary[product.variantPrices[variation]];\n if (variation == currentSelected)\n savedVariant.price.high = variation;\n else if (savedVariant.price.high != currentSelected) {\n if (savedPriceHigh.salesPrice.amount < currentPrice.salesPrice.amount)\n savedVariant.price.high = variation;\n else if (savedPriceHigh.salesPrice.amount == currentPrice.salesPrice.amount && SimilarityLength(savedVariant.price.high, currentSelected) < currentSimilarityLength)\n savedVariant.price.high = variation;\n }\n if (variation == currentSelected)\n savedVariant.price.low = variation;\n else if (savedVariant.price.low != currentSelected) {\n if (savedPriceLow.salesPrice.amount > currentPrice.salesPrice.amount)\n savedVariant.price.low = variation;\n else if (savedPriceLow.salesPrice.amount == currentPrice.salesPrice.amount && SimilarityLength(savedVariant.price.low, currentSelected) < currentSimilarityLength)\n savedVariant.price.low = variation;\n }\n\n }\n });\n\n return Object\n .values(groups)\n .map((group) => {\n group.variants = Object\n .values(group.variants)\n .sort((va, vb) => product.options[va.key].sortOrder - product.options[vb.key].sortOrder)\n return group as CustomizerViewGroup;\n })\n .sort((groupA, groupB) => groupSortOrder(product, groupA.group) - groupSortOrder(product, groupB.group));\n }\n\n function groupSortOrder(product: ProductModel | AddonModel, group: string) {\n if (product['variantGroups'] == null)\n return Number.MAX_SAFE_INTEGER;\n if (product['variantGroups'][group] == null)\n return Number.MAX_SAFE_INTEGER;\n return product['variantGroups'][group]['sortOrder'];\n }\n\n function dialogMapFacet(product: ProductModel, group: CustomizerViewGroup, type: number): any {\n let _group = product.variantGroups[group.group] ?? product.options[group.group];\n return {\n id: group,\n value: group,\n depth: type,\n title: (_group as VariantGroup).title ?? (_group as VariantOption).name,\n }\n }\n\n function getAtEnd(response: CustomizerResponse, product: ProductModel): boolean {\n let offset = product.variantTypes[response.inView.type].view == ViewType.Combi ? 2 : 1;\n // is not an end of current products types\n // console.debug(product.variantTypes.length, offset, response.inView.type)\n if (product.variantTypes.length - offset > response.inView.type)\n return false;\n // meaning at end now\n ////////////////////////\n let viableAddons = (response.customizer.product?.addons ?? []).filter(addon => Object.values(addon?.variantPrices ?? {}).length > 0)\n // has no viable addons\n if ((viableAddons.length) == 0)\n return true;\n\n // is at last viable addon\n if (viableAddons[viableAddons.length - 1].id == product.id)\n return true;\n\n // At end of types for current product but has viable addons\n return false;\n }\n\n function getAtStart(response: CustomizerResponse, product: ProductModel): boolean {\n return product.id == response.customizer.product.id && response.inView.type == 0;\n }\n\n function getNext(response: CustomizerResponse, product: ProductModel, atEnd: boolean): string[] {\n if (atEnd)\n return null;\n let offset = product.variantTypes[response.inView.type].view == ViewType.Combi ? 2 : 1;\n // is not an end of current products types\n if (product.variantTypes.length - offset > response.inView.type)\n return splitId(response.inView.selected).filter((_, i) => i < response.inView.type + offset + 1)\n let viableAddons = (response.customizer.product?.addons ?? []).filter(addon => Object.values(addon?.variantPrices ?? {}).length > 0)\n let indexOfNextAddon = viableAddons.findIndex(a => a.id == product.id);\n return [viableAddons[indexOfNextAddon + 1].id.split(',')[0]]\n }\n\n function getPrevious(response: CustomizerResponse, product: ProductModel, atStart: boolean): string[] {\n if (atStart)\n return null;\n let offset = product.variantTypes[Math.max(response.inView.type - 2, 0)].view == ViewType.Combi ? 2 : 1;\n // within same product\n if (response.inView.type - offset >= 0) {\n return splitId(response.inView.selected).filter((_, i) => i < response.inView.type - offset + 1);\n }\n let viableAddons = (response.customizer.product?.addons ?? []).filter(addon => Object.values(addon?.variantPrices ?? {}).length > 0)\n let goToProduct = viableAddons[0].id == product.id ? response.customizer.product : viableAddons[viableAddons.findIndex(a => a.id == product.id) - 1]\n let isCombi__ = goToProduct.variantTypes[goToProduct.variantTypes.length - 2].view == ViewType.Combi;\n return splitId(goToProduct.id).filter((_, i, a) => isCombi__ ? i < a.length - 2 : true)\n }\n\n function splitId(selected: string): string[] {\n return selected.split(',').reduce((acc, curr) => acc.concat(curr.split(';')), []);\n }\n\n function prevStepsHasCombi(type: number, product: ProductModel): number {\n let index = product.variantTypes.findIndex(vt => vt.view == ViewType.Combi);\n return index < type ? 0 : 1\n }\n\n function getPrevProductsSteps(product: ProductModel | AddonModel, products: AddonModel[]) {\n let i = 0;\n let currentStep = 0;\n let found = false;\n while (!found && i < products.length) {\n found = products[i] == product\n if (!found) {\n currentStep += products[i].variantTypes.length;\n if (products[i].variantTypes.some(vt => vt.view === ViewType.Combi))\n currentStep -= 1\n }\n i++;\n }\n return currentStep;\n }\n\n function mapDialogHeadSelectedVariants(response: CustomizerResponse) {\n let options = [];\n // let products = [response.customizer.product,...(response.customizer.product.addons??[])]\n options = options.concat(mapDialogHeadSelectedVariantsVariants(response.customizer.product, response.selected.main))\n response.customizer.product.addons.forEach((addon, i) => {\n options = options.concat(mapDialogHeadSelectedVariantsVariants(addon, response.selected.addons[i]))\n })\n return options;\n\n }\n\n function mapDialogHeadSelectedVariantsVariants(product: ProductModel | AddonModel, selected: string) {\n if (!selected.includes(','))\n return [];\n let variants = selected.split(',')[1].split(';')\n return product.variantTypes.map((vt, i) => ({\n title: vt.type.replace(':', ''),\n variant: product.options[variants[i]].name\n }))\n }\n}\n\n\n","import { AddonModel, Customizer, CustomizerModel, CustomizerRequest, CustomizerResponse, CustomizerSelected, CustomizerVariant, CustomizerView, CustomizerViewGroup, CustomizerViewVariation, ProductModel, VariantGroup, VariantOption } from './model';\n\n\n/**\n * demands\n * - leastDifferentBranches\n * - weightSort\n * - weightFilter\n */\n\n\n/**\n *\n * @param fn promise\n * @param maxRetries number\n * @param timeoutMs time in ms\n * @returns promised response\n */\n\n/// \nself.addEventListener('message', async (msg: MessageEvent) => {\n let request = msg.data;\n // console.debug(request)\n\n // Current State\n let response: CustomizerResponse = {\n id: request.id,\n customizer: request.customizer,\n selected: Customizer.mapSelected(request),\n };\n // Update State\n try {\n // console.debug(Customizer.needsHydration(request, response))\n if (Customizer.needsHydration(request, response))\n response.customizer = await Customizer.reHydrate(request);\n response.selected = Customizer.mapSelected(response);\n if ((request?.path ?? []).length > 0)\n response.inView = Customizer.mapView(request, response);\n if (!request?.selected)\n response.mainLayout = Customizer.mapMainLayout(response);\n if (request?.selected)\n response.accessoryLayout = Customizer.mapAccessoryLayout(response);\n if (response.inView != null) {\n response.dialogFilters = Customizer.mapDialogFilters(response);\n response.dialogView = Customizer.mapDialogView(response);\n response.dialogHead = Customizer.mapDialogHead(response);\n }\n // post updated State\n // console.debug(response)\n postMessage(response)\n } catch (error) {\n console.error(error)\n response.error = {\n title: 'Customizer Error',\n text: error?.message ?? 'unkown error',\n color: 'var(--error-color, white)',\n backgroundColor: 'var(--error-background-color, red)',\n position: 'top-mid'\n };\n response.request = request;\n // post Error\n postMessage(response)\n }\n});\n\n\n"],"x_google_ignoreList":[0]}