@spiffcommerce/core 12.2.0 → 12.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +5 -1
- package/dist/module.js +10 -6
- package/dist/types.d.ts +6 -5
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -486,9 +486,12 @@ var t=require("@apollo/client"),e=require("lodash.clonedeep"),A=require("react/j
|
|
|
486
486
|
id
|
|
487
487
|
previewImageLink
|
|
488
488
|
}
|
|
489
|
+
processExecution {
|
|
490
|
+
id
|
|
491
|
+
}
|
|
489
492
|
}
|
|
490
493
|
}
|
|
491
|
-
`,ko=(t,e,A)=>{const i={};return e.steps.forEach((e=>{Object.assign(i,(e=>{const i={};if("Frame"===e.type){const n=t[e.stepName],a=e.data;if(!n||a.hideImageInCart&&A)return i;i[`${e.stepTitle} image`]=n.image}if("Illustration"===e.type){const n=t[e.stepName],a=e.data;if(!n||a.hideColorsInCart&&A||!n.colors)return i;if(n.colors.length>0){const t=n.colors.join(", ").toUpperCase();i[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const n=t[e.stepName],a=e.data;if(!n||a.hideTextInCart&&A)return i;i[`${e.stepTitle} text`]=n.text}if("Text"===e.type){const n=t[e.stepName];if(!n)return i;const a=e.data;a.hideTextInCart&&A||(i[`${e.stepTitle} text`]=n.text),!n.color||a.hideColorInCart&&A||(i[`${e.stepTitle} color`]=n.color)}return i})(e))})),i},Ho=(t,e,A,i,n,a,r,s,o)=>{const c=(ca.getMap("transactionOwnerIds")||new Map).get(t.id),l={event:"onComplete",lineItemImageUrl:r||"",transactionId:t.id,designProductVariantId:t.externalDesignProductVariantId,designProductId:t.externalDesignProductId,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,baseCost:A,weight:e.weight,optionsCost:i,exportedData:a,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return n&&(l.metadata=n),s&&(l.selectedVariants=s),o&&(l.sku=o),l},Uo=async(t,e,A,i,n,a,r)=>{const s=t.product?.basePrice||0,o=t.priceModifierTotal||0,c=((t,e,A,i)=>{const n={};let a;if(A){a=ko(A,e,!1);for(const t of Object.keys(a))n[t]={value:a[t],priceModifier:0}}else if(i){a=i;for(const t of Object.keys(a))n[t]={value:a[t],priceModifier:0}}for(const A of Object.keys(t)){const i=t[A],a=e.steps.find((t=>t.stepTitle===A));if(1===i.length)n[`${a?.stepTitle} selection`]={value:i[0].name,priceModifier:i[0].priceModifier};else if(i.length>1)for(let t=0;t<i.length;t++)n[`${a?.stepTitle} selection ${t+1}`]={value:i[t].name,priceModifier:i[t].priceModifier}}return n})(i,A,void 0,a);return Ho(t,e,s,o,a,c,r,i,n)},Go=async(t,e,A,i,n,a,r,s,o,c,l,g,h)=>{o("workflow.steps.finish.finalize.buildingLayouts"),await t.outstandingRequestsPromise();const d=Ca.getShadowGraphqlClient();await d.resetStore();const u=await d.query({query:Ns,variables:{id:a.id},errorPolicy:"all"}),B=u.data?.transactions[0].workflowState;!u.errors&&B||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(i())),u.errors&&u.errors.forEach((t=>{u.errors&&console.log("Server Error:",t.message)})),await t.updateStateWithServerImmediate(i),console.log("Server state is undefined @ Workflow completion"));const w=t.getPreviewService(),E=e?.finalizeStepConfig?.lookAtAnimation,p=w&&100===w.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!E,m=h&&ko(h,e,!0),C=h&&ko(h,e,!1),f=async t=>{const A={};let i=0;if(Object.keys(r).length>0)for(const n of Object.keys(r)){const a=r[n],s=e.steps.find((t=>t.stepName===n));for(let e=0;e<a.selections.length;++e){const n=a.selections[e];if(s&&(!t||s.option&&(s.option.variants||[]).length>1&&!s.data.hideSelectionInCart&&!s.data.hideSelectionsInCart)){const t=s.stepTitle;A[t]?A[t].push({id:n.id||"",name:n.name,priceModifier:n.priceModifier}):A[t]=[{id:n.id||"",name:n.name,priceModifier:n.priceModifier}]}i+=n.priceModifier}}return[A,i]},[Q]=await f(!0),y=Object.fromEntries(Object.keys(Q).map((t=>[t,Q[t].map((t=>t.id))]))),[D]=await f(!1),I=Object.fromEntries(Object.keys(D).map((t=>[t,D[t].map((t=>t.id))]))),x=await g(p);o("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await c(l);const M=await(async t=>(await Ca.getShadowGraphqlClient().mutate({mutation:Ro,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants}})).data?.designCreate)((()=>{const t={name:s,layouts:A.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!p,previewImage:x};if(C){const e=[];for(const[t,A]of Object.entries(C))e.push({key:t,value:A});t.metadata=e}if(y){const e=[];for(const[t,A]of Object.entries(I))e.push({key:t,ids:A});t.selectedVariants=e}return t})()),v=M?.transaction?.previewImageLink;o("workflow.steps.finish.finalize.updatingTransaction");const F=(await Ca.getShadowGraphqlClient().query({query:Ps,variables:{id:a.id}})).data.transactions[0];return a.bulk?((t,e,A)=>{const i=(t.product?.basePrice||0)*(t.variationsCount||0),n=t.priceModifierTotal||0,a={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return Ho(t,e,i,n,void 0,a,A)})(F,n,v):await Uo(F,n,e,Q,M?.sku,m,v)};let To;var Oo;(Oo=To||(To={})).Local="Local",Oo.Remote="Remote";const Jo=new class{constructor(){No(this,"localPersistenceKey","designTransactions"),No(this,"storageMethod",To.Local),No(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===To.Local){const t=ca.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new Aa("Unexpected storage method requested")}async getSavedDesignByTransaction(t){return(await this.getSavedDesigns()).find((e=>e.transactionId===t))}async addDesign(t){const e=(await this.getSavedDesigns()).filter((e=>e.transactionId!==t.transactionId));e.unshift(t),await this.setDesigns(e),this.designSavedListeners.forEach((e=>e(t)))}async renameDesign(t,e){const A=await this.getSavedDesigns(),i=A.find((e=>e.transactionId===t));if(!i)throw new Error(`No saved design for transaction ${t}.`);i.title=e,await this.setDesigns(A)}async removeDesign(t){const e=await this.getSavedDesigns();await this.setDesigns(e.filter((e=>e.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==To.Local)throw new Aa("Unexpected storage method requested");ca.set(this.localPersistenceKey,JSON.stringify(t))}};function Lo(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var i=A.call(t,e||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class zo{constructor(t,e){if(Lo(this,"client",void 0),Lo(this,"commandContext",void 0),Lo(this,"workflowManager",void 0),Lo(this,"isReadOnly",void 0),Lo(this,"renderableScenes",[]),Lo(this,"renderableSceneCallbacks",[]),Lo(this,"debouncedSavedDesignUpdate",S(I)((async()=>{await Jo.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Lo(this,"getCanvasObjectURLAsync",(async t=>new Promise(((e,A)=>{try{t.toBlob((t=>{if(t){const A=URL.createObjectURL(t);e(A)}}))}catch(t){A(t)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const A=e.layouts;this.commandContext=new Ui,this.commandContext.initialize(A,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Eo(e.workflow,e.product.profanities?.map((t=>t.word))||[],A,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(t)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly,e.modelContainer),this.workflowManager.addSelectionCallback((t=>{const e=t.traversableScenes.map((t=>{const e=t.renderableSteps.map((t=>t.stepName));return{id:t.name,title:t.title,renderableSteps:e}}));this.renderableScenes=e,this.renderableSceneCallbacks.forEach((t=>t(e)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(t){await Ca.getShadowGraphqlClient().mutate({mutation:Ys,variables:{transactionId:this.workflowManager.getTransaction().id,updates:t.map((t=>({recordNumber:t.recordNumber,values:t.values.map((t=>({aspect:t.aspect,stepName:t.stepName,value:t.value})))})))}})}async createPreviewImage(t,e){const A=this.workflowManager.getWorkflow(),i=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!i)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,i))||""}const n=document.createElement("canvas");let a=2048;e&&e<=2048&&(a=e),n.width=a,n.height=a;const r=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,o=A.panels[s],c=r.find((t=>t.layoutState?.layout.panelId===o?.name))||r[0],l=c.layoutState.layout.previewRegion?{x:c.layoutState.layout.previewRegion.left,y:c.layoutState.layout.previewRegion.top,width:c.layoutState.layout.previewRegion.width,height:c.layoutState.layout.previewRegion.height}:{x:0,y:0,width:c.layoutState.layout.width,height:c.layoutState.layout.height},g=this.commandContext.getLayoutById(c.layoutState.layout.id),h=n.getContext("2d");if(!h)throw new aa("Failed to obtain 2D context for preview image creation");const d=Ti(g.layoutState.layout,g.layoutState.elements,{renderingConfiguration:{purpose:Ve.Print,region:{left:l.x,top:l.y,width:l.width,height:l.height}}}),u=S(Q).renderToStaticMarkup(d),B=await ke.from(h,u,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await B.render();const w=await this.getCanvasObjectURLAsync(n);return n.toDataURL(w)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return Po.get(this.getWorkflowManager(),e)}getSteps(){return this.getScenes().flatMap((t=>this.getStepsByScene(t)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((t=>({id:t.id,name:t.name,stepIds:t.stepNames})))}getSelectionPriceSubunits(){const t=this.getWorkflowManager().getWorkflowSelections();let e=0;return Object.values(t).forEach((t=>{e+=t.selections.map((t=>t.priceModifier)).reduce(((t,e)=>t+e))})),e}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,e={type:nA.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Rs(this.getWorkflowManager().getWorkflow())},conditions:[]};return Po.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return Po.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>Po.get(this.getWorkflowManager(),t)))}getStepsByScene(t){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((e=>e.name===t.name)))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return t.stepIds.map((t=>this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t)))).filter((t=>this.stepHasHandle(t))).map((t=>Po.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const e=(await Ca.getShadowGraphqlClient().mutate({mutation:yo,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((e=>e.customer?.emailAddress===t.emailAddress));if(e?.customer){this.getWorkflowManager().setTransactionCustomer(e.customer);const t=ca.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,e.customer.id),ca.setMap("transactionCustomerIds",t)}}attachRenderableSceneListener(t){this.renderableSceneCallbacks.push(t),t(this.renderableScenes)}detachRenderableSceneListener(t){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((e=>e!==t))}async save(t){if(!this.getCommandContext().getState())throw new Aa("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await Jo.getSavedDesigns()).find((t=>t.transactionId===e))?.title;return A||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Jo.addDesign(e),e}async copy(){const t=S(e)(this.getCommandContext().getState());if(!t)throw new Aa("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),i=this.getWorkflowManager().getWorkflow(),n=new Bc({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new Aa("Integration product id is undefined!");await n.initFromIntegrationProduct(a);return await n.getWorkflowExperience(i.id,A,void 0)}async onDesignFinished(t){return Go(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,t||(()=>{}),(t=>this.updateVariationRecords(t)),this.workflowManager.getVariationRecords(),(t=>this.createPreviewImage(t)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==nA.SilentIllustration&&t.type!==nA.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!i)return;t.has(i.stepTitle)||t.set(i.stepTitle,{});const n=e[A];Object.keys(n).forEach((e=>{t.get(i.stepTitle)[e]=n[e]}))})),Object.keys(A)?.forEach((e=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));i&&(t.has(i.stepTitle)||t.set(i.stepTitle,{}),t.get(i.stepTitle).selection=A[e].selections[0].name)})),t}}const jo=M.gql`
|
|
494
|
+
`,ko=(t,e,A)=>{const i={};return e.steps.forEach((e=>{Object.assign(i,(e=>{const i={};if("Frame"===e.type){const n=t[e.stepName],a=e.data;if(!n||a.hideImageInCart&&A)return i;i[`${e.stepTitle} image`]=n.image}if("Illustration"===e.type){const n=t[e.stepName],a=e.data;if(!n||a.hideColorsInCart&&A||!n.colors)return i;if(n.colors.length>0){const t=n.colors.join(", ").toUpperCase();i[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const n=t[e.stepName],a=e.data;if(!n||a.hideTextInCart&&A)return i;i[`${e.stepTitle} text`]=n.text}if("Text"===e.type){const n=t[e.stepName];if(!n)return i;const a=e.data;a.hideTextInCart&&A||(i[`${e.stepTitle} text`]=n.text),!n.color||a.hideColorInCart&&A||(i[`${e.stepTitle} color`]=n.color)}return i})(e))})),i},Ho=(t,e,A,i,n,a,r,s,o,c)=>{const l=(ca.getMap("transactionOwnerIds")||new Map).get(t.id),g={baseCost:A,designProductId:t.externalDesignProductId,designProductVariantId:t.externalDesignProductVariantId,event:"onComplete",exportedData:a,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,lineItemImageUrl:r||"",optionsCost:i,processExecutionId:c,transactionId:t.id,transactionOwnerId:l,weight:e.weight,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||""};return n&&(g.metadata=n),s&&(g.selectedVariants=s),o&&(g.sku=o),g},Uo=async(t,e,A,i,n,a,r,s)=>{const o=t.product?.basePrice||0,c=t.priceModifierTotal||0,l=((t,e,A,i)=>{const n={};let a;if(A){a=ko(A,e,!1);for(const t of Object.keys(a))n[t]={value:a[t],priceModifier:0}}else if(i){a=i;for(const t of Object.keys(a))n[t]={value:a[t],priceModifier:0}}for(const A of Object.keys(t)){const i=t[A],a=e.steps.find((t=>t.stepTitle===A));if(1===i.length)n[`${a?.stepTitle} selection`]={value:i[0].name,priceModifier:i[0].priceModifier};else if(i.length>1)for(let t=0;t<i.length;t++)n[`${a?.stepTitle} selection ${t+1}`]={value:i[t].name,priceModifier:i[t].priceModifier}}return n})(i,A,void 0,a);return Ho(t,e,o,c,a,l,r,i,n,s)},Go=async(t,e,A,i,n,a,r,s,o,c,l,g,h)=>{o("workflow.steps.finish.finalize.buildingLayouts"),await t.outstandingRequestsPromise();const d=Ca.getShadowGraphqlClient();await d.resetStore();const u=await d.query({query:Ns,variables:{id:a.id},errorPolicy:"all"}),B=u.data?.transactions[0].workflowState;!u.errors&&B||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(i())),u.errors&&u.errors.forEach((t=>{u.errors&&console.log("Server Error:",t.message)})),await t.updateStateWithServerImmediate(i),console.log("Server state is undefined @ Workflow completion"));const w=t.getPreviewService(),E=e?.finalizeStepConfig?.lookAtAnimation,p=w&&100===w.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!E,m=h&&ko(h,e,!0),C=h&&ko(h,e,!1),f=async t=>{const A={};let i=0;if(Object.keys(r).length>0)for(const n of Object.keys(r)){const a=r[n],s=e.steps.find((t=>t.stepName===n));for(let e=0;e<a.selections.length;++e){const n=a.selections[e];if(s&&(!t||s.option&&(s.option.variants||[]).length>1&&!s.data.hideSelectionInCart&&!s.data.hideSelectionsInCart)){const t=s.stepTitle;A[t]?A[t].push({id:n.id||"",name:n.name,priceModifier:n.priceModifier}):A[t]=[{id:n.id||"",name:n.name,priceModifier:n.priceModifier}]}i+=n.priceModifier}}return[A,i]},[Q]=await f(!0),y=Object.fromEntries(Object.keys(Q).map((t=>[t,Q[t].map((t=>t.id))]))),[D]=await f(!1),I=Object.fromEntries(Object.keys(D).map((t=>[t,D[t].map((t=>t.id))]))),x=await g(p);o("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await c(l);const M=await(async t=>(await Ca.getShadowGraphqlClient().mutate({mutation:Ro,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants}})).data?.designCreate)((()=>{const t={name:s,layouts:A.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!p,previewImage:x};if(C){const e=[];for(const[t,A]of Object.entries(C))e.push({key:t,value:A});t.metadata=e}if(y){const e=[];for(const[t,A]of Object.entries(I))e.push({key:t,ids:A});t.selectedVariants=e}return t})()),v=M?.transaction?.previewImageLink;o("workflow.steps.finish.finalize.updatingTransaction");const F=(await Ca.getShadowGraphqlClient().query({query:Ps,variables:{id:a.id}})).data.transactions[0];return a.bulk?((t,e,A,i)=>{const n=(t.product?.basePrice||0)*(t.variationsCount||0),a=t.priceModifierTotal||0,r={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return Ho(t,e,n,a,void 0,r,A,void 0,void 0,i)})(F,n,v,M?.processExecution?.id):await Uo(F,n,e,Q,M?.sku,m,v,M?.processExecution?.id)};let To;var Oo;(Oo=To||(To={})).Local="Local",Oo.Remote="Remote";const Jo=new class{constructor(){No(this,"localPersistenceKey","designTransactions"),No(this,"storageMethod",To.Local),No(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===To.Local){const t=ca.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new Aa("Unexpected storage method requested")}async getSavedDesignByTransaction(t){return(await this.getSavedDesigns()).find((e=>e.transactionId===t))}async addDesign(t){const e=(await this.getSavedDesigns()).filter((e=>e.transactionId!==t.transactionId));e.unshift(t),await this.setDesigns(e),this.designSavedListeners.forEach((e=>e(t)))}async renameDesign(t,e){const A=await this.getSavedDesigns(),i=A.find((e=>e.transactionId===t));if(!i)throw new Error(`No saved design for transaction ${t}.`);i.title=e,await this.setDesigns(A)}async removeDesign(t){const e=await this.getSavedDesigns();await this.setDesigns(e.filter((e=>e.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==To.Local)throw new Aa("Unexpected storage method requested");ca.set(this.localPersistenceKey,JSON.stringify(t))}};function Lo(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var i=A.call(t,e||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class zo{constructor(t,e){if(Lo(this,"client",void 0),Lo(this,"commandContext",void 0),Lo(this,"workflowManager",void 0),Lo(this,"isReadOnly",void 0),Lo(this,"renderableScenes",[]),Lo(this,"renderableSceneCallbacks",[]),Lo(this,"debouncedSavedDesignUpdate",S(I)((async()=>{await Jo.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Lo(this,"getCanvasObjectURLAsync",(async t=>new Promise(((e,A)=>{try{t.toBlob((t=>{if(t){const A=URL.createObjectURL(t);e(A)}}))}catch(t){A(t)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const A=e.layouts;this.commandContext=new Ui,this.commandContext.initialize(A,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Eo(e.workflow,e.product.profanities?.map((t=>t.word))||[],A,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(t)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly,e.modelContainer),this.workflowManager.addSelectionCallback((t=>{const e=t.traversableScenes.map((t=>{const e=t.renderableSteps.map((t=>t.stepName));return{id:t.name,title:t.title,renderableSteps:e}}));this.renderableScenes=e,this.renderableSceneCallbacks.forEach((t=>t(e)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(t){await Ca.getShadowGraphqlClient().mutate({mutation:Ys,variables:{transactionId:this.workflowManager.getTransaction().id,updates:t.map((t=>({recordNumber:t.recordNumber,values:t.values.map((t=>({aspect:t.aspect,stepName:t.stepName,value:t.value})))})))}})}async createPreviewImage(t,e){const A=this.workflowManager.getWorkflow(),i=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!i)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,i))||""}const n=document.createElement("canvas");let a=2048;e&&e<=2048&&(a=e),n.width=a,n.height=a;const r=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,o=A.panels[s],c=r.find((t=>t.layoutState?.layout.panelId===o?.name))||r[0],l=c.layoutState.layout.previewRegion?{x:c.layoutState.layout.previewRegion.left,y:c.layoutState.layout.previewRegion.top,width:c.layoutState.layout.previewRegion.width,height:c.layoutState.layout.previewRegion.height}:{x:0,y:0,width:c.layoutState.layout.width,height:c.layoutState.layout.height},g=this.commandContext.getLayoutById(c.layoutState.layout.id),h=n.getContext("2d");if(!h)throw new aa("Failed to obtain 2D context for preview image creation");const d=Ti(g.layoutState.layout,g.layoutState.elements,{renderingConfiguration:{purpose:Ve.Print,region:{left:l.x,top:l.y,width:l.width,height:l.height}}}),u=S(Q).renderToStaticMarkup(d),B=await ke.from(h,u,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await B.render();const w=await this.getCanvasObjectURLAsync(n);return n.toDataURL(w)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return Po.get(this.getWorkflowManager(),e)}getSteps(){return this.getScenes().flatMap((t=>this.getStepsByScene(t)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((t=>({id:t.id,name:t.name,stepIds:t.stepNames})))}getSelectionPriceSubunits(){const t=this.getWorkflowManager().getWorkflowSelections();let e=0;return Object.values(t).forEach((t=>{e+=t.selections.map((t=>t.priceModifier)).reduce(((t,e)=>t+e))})),e}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,e={type:nA.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Rs(this.getWorkflowManager().getWorkflow())},conditions:[]};return Po.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return Po.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>Po.get(this.getWorkflowManager(),t)))}getStepsByScene(t){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((e=>e.name===t.name)))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return t.stepIds.map((t=>this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t)))).filter((t=>this.stepHasHandle(t))).map((t=>Po.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const e=(await Ca.getShadowGraphqlClient().mutate({mutation:yo,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((e=>e.customer?.emailAddress===t.emailAddress));if(e?.customer){this.getWorkflowManager().setTransactionCustomer(e.customer);const t=ca.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,e.customer.id),ca.setMap("transactionCustomerIds",t)}}attachRenderableSceneListener(t){this.renderableSceneCallbacks.push(t),t(this.renderableScenes)}detachRenderableSceneListener(t){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((e=>e!==t))}async save(t){if(!this.getCommandContext().getState())throw new Aa("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await Jo.getSavedDesigns()).find((t=>t.transactionId===e))?.title;return A||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Jo.addDesign(e),e}async copy(){const t=S(e)(this.getCommandContext().getState());if(!t)throw new Aa("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),i=this.getWorkflowManager().getWorkflow(),n=new Bc({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new Aa("Integration product id is undefined!");await n.initFromIntegrationProduct(a);return await n.getWorkflowExperience(i.id,A,void 0)}async onDesignFinished(t){return Go(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,t||(()=>{}),(t=>this.updateVariationRecords(t)),this.workflowManager.getVariationRecords(),(t=>this.createPreviewImage(t)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==nA.SilentIllustration&&t.type!==nA.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!i)return;t.has(i.stepTitle)||t.set(i.stepTitle,{});const n=e[A];Object.keys(n).forEach((e=>{t.get(i.stepTitle)[e]=n[e]}))})),Object.keys(A)?.forEach((e=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));i&&(t.has(i.stepTitle)||t.set(i.stepTitle,{}),t.get(i.stepTitle).selection=A[e].selections[0].name)})),t}}const jo=M.gql`
|
|
492
495
|
query GetBundle($id: String!) {
|
|
493
496
|
bundles(ids: [$id]) {
|
|
494
497
|
id
|
|
@@ -704,6 +707,7 @@ var t=require("@apollo/client"),e=require("lodash.clonedeep"),A=require("react/j
|
|
|
704
707
|
clearColor
|
|
705
708
|
disableActionBar
|
|
706
709
|
disableAutomaticOrientation
|
|
710
|
+
enableAR
|
|
707
711
|
environmentFile
|
|
708
712
|
idleTimeBeforeRotation
|
|
709
713
|
lowerAlphaLimitDeg
|