@spiffcommerce/core 7.3.5 → 8.0.0
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 +1 -1
- package/dist/module.js +1 -1
- package/dist/types.d.ts +4 -0
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -531,7 +531,7 @@ var t=require("@apollo/client"),e=require("lodash.clonedeep"),A=require("react/j
|
|
|
531
531
|
}
|
|
532
532
|
}
|
|
533
533
|
}
|
|
534
|
-
`,uo=(t,e,A)=>{const n={};return e.steps.forEach((e=>{Object.assign(n,(e=>{const n={};if("Frame"===e.type){const i=t[e.stepName],a=e.data;if(!i||a.hideImageInCart&&A)return n;n[`${e.stepTitle} image`]=i.image}if("Illustration"===e.type){const i=t[e.stepName],a=e.data;if(!i||a.hideColorsInCart&&A||!i.colors)return n;if(i.colors.length>0){const t=i.colors.join(", ").toUpperCase();n[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const i=t[e.stepName],a=e.data;if(!i||a.hideTextInCart&&A)return n;n[`${e.stepTitle} text`]=i.text}if("Text"===e.type){const i=t[e.stepName];if(!i)return n;const a=e.data;a.hideTextInCart&&A||(n[`${e.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&A||(n[`${e.stepTitle} color`]=i.color)}return n})(e))})),n},Qo=(t,e,A,n,i,a,o,r,s)=>{const c=(XA.getMap("transactionOwnerIds")||new Map).get(t.id),g={event:"onComplete",lineItemImageUrl:o||"",transactionId:t.id,designProductVariantId:t.externalDesignProductVariantId,designProductId:t.externalDesignProductId,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,baseCost:A,weight:e.weight,optionsCost:n,exportedData:a,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return i&&(g.metadata=i),r&&(g.selectedVariants=r),s&&(g.sku=s),g},Co=async(t,e,A,n,i,a,o)=>{const r=t.product?.basePrice||0,s=t.priceModifierTotal||0,c=((t,e,A,n)=>{const i={};let a;if(A){a=uo(A,e,!1);for(const t of Object.keys(a))i[t]={value:a[t],priceModifier:0}}else if(n){a=n;for(const t of Object.keys(a))i[t]={value:a[t],priceModifier:0}}for(const A of Object.keys(t)){const n=t[A],a=e.steps.find((t=>t.stepTitle===A));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let t=0;t<n.length;t++)i[`${a?.stepTitle} selection ${t+1}`]={value:n[t].name,priceModifier:n[t].priceModifier}}return i})(n,A,void 0,a);return Qo(t,e,r,s,a,c,o,n,i)},mo=async(t,e,A,n)=>{e("workflow.steps.finish.finalize.buildingLayouts");const i=t.getWorkflow(),a=t.getTransaction(),o=t.getWorkflowSelections(),r=t.getWorkflowMetadata();await t.outstandingRequestsPromise();const s=(await en.getShadowGraphqlClient().query({query:wa,variables:{id:a.id},errorPolicy:"all"})).data.transactions[0],c=r&&uo(r,i,!0),g=r&&uo(r,i,!1),l=async t=>{const e={};let A=0;if(Object.keys(o).length>0)for(const n of Object.keys(o)){const a=o[n],r=i.steps.find((t=>t.stepName===n));for(let n=0;n<a.selections.length;++n){const i=a.selections[n];if(r&&(!t||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const t=r.stepTitle;e[t]?e[t].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[t]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}A+=i.priceModifier}}return[e,A]},[B]=await l(!0),w=Object.fromEntries(Object.keys(B).map((t=>[t,B[t].map((t=>t.id))]))),[h]=await l(!1),d=Object.fromEntries(Object.keys(h).map((t=>[t,h[t].map((t=>t.id))]))),E=(t=>{const e=t.getPreviewService(),A=t.getWorkflow(),n=A.finalizeStepConfig?.lookAtAnimation;return e&&100===e.getSceneInitializationProgress()&&A.showModelOnFinishStep&&!!n})(t),u=await n(E);e("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await A(t.getVariationRecords());const Q=await(async t=>(await en.getShadowGraphqlClient().mutate({mutation:Eo,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 e={name:i.name,layouts:t.getLayouts().map((t=>({index:t.index,panelId:t.panelId}))),workflowId:i.id,transactionId:a.id,useThreeDimPreview:E,previewImage:u};if(g){const t=[];for(const[e,A]of Object.entries(g))t.push({key:e,value:A});e.metadata=t}if(w){const t=[];for(const[e,A]of Object.entries(d))t.push({key:e,ids:A});e.selectedVariants=t}return e})()),C=Q?.transaction?.previewImageLink;e("workflow.steps.finish.finalize.updatingTransaction");const m=t.getProduct();return a.bulk?((t,e,A,n)=>{const i=(t.product?.basePrice||0)*(t.variationsCount||0),a=t.priceModifierTotal||0;return Qo(t,e,i,a,void 0,{items:{value:`${A}`,priceModifier:0}},n)})(s,m,t.getVariationRecords().length,C):await Co(s,m,i,B,Q?.sku,c,C)};let po;var fo;(fo=po||(po={})).Local="Local",fo.Remote="Remote";const Do=new class{constructor(){ho(this,"localPersistenceKey","designTransactions"),ho(this,"storageMethod",po.Local),ho(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){return await this.getDesigns()}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.notifyDesignSaved(t)}async removeDesign(t){const e=await this.getSavedDesigns();await this.setDesigns(e.filter((e=>e.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==po.Local)throw new OA("Unexpected storage method requested");XA.set(this.localPersistenceKey,JSON.stringify(t))}async getDesigns(){if(this.storageMethod===po.Local){const t=XA.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new OA("Unexpected storage method requested")}notifyDesignSaved(t){this.designSavedListeners.forEach((e=>e(t)))}};function Io(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 n=A.call(t,e||"default");if("object"!=typeof n)return n;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 yo{constructor(t,e){if(Io(this,"client",void 0),Io(this,"commandContext",void 0),Io(this,"workflowManager",void 0),Io(this,"isReadOnly",void 0),Io(this,"renderableScenes",[]),Io(this,"renderableSceneCallbacks",[]),Io(this,"debouncedSavedDesignUpdate",I(p)((async()=>{await Do.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Io(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 Me,this.commandContext.initialize(A,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!XA.getMap("transactionOwnerIds")?.get(e.transaction.id)||!!e.readOnly,this.workflowManager=new Za(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),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 en.getShadowGraphqlClient().mutate({mutation:Ba,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(),n=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const i=document.createElement("canvas");let a=2048;e&&e<=2048&&(a=e),i.width=a,i.height=a;const o=this.commandContext.getAllLayouts(),r=A.defaultPreviewPanelIndex||0,s=A.panels[r],c=o.find((t=>t.layoutState?.layout.panelId===s?.name))||o[0],g=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},l=this.commandContext.getLayoutById(c.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new jA("Failed to obtain 2D context for preview image creation");const h=Fe(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:H.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=I(Q).renderToStaticMarkup(h),E=await B.Canvg.from(w,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await E.render();const u=await this.getCanvasObjectURLAsync(i);return i.toDataURL(u)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return wo.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})))}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,e={type:K.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:ha(this.getWorkflowManager().getWorkflow())},conditions:[]};return wo.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return wo.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>wo.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=>wo.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){await en.getShadowGraphqlClient().mutate({mutation:no,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}}),this.getWorkflowManager().setTransactionCustomer(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 OA("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await Do.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 Do.addDesign(e),e}async copy(){const t=I(e)(this.getCommandContext().getState());if(!t)throw new OA("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),n=this.getWorkflowManager().getWorkflow(),i=new No({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new OA("Integration product id is undefined!");await i.initFromIntegrationProduct(a);return await i.getWorkflowExperience(n.id,A,void 0)}async onDesignFinished(t){return mo(this.workflowManager,t||(()=>{}),(t=>this.updateVariationRecords(t)),(t=>this.createPreviewImage(t)))}stepHasHandle(t){return t.type!==K.SilentIllustration&&t.type!==K.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!n)return;t.has(n.stepTitle)||t.set(n.stepTitle,{});const i=e[A];Object.keys(i).forEach((e=>{t.get(n.stepTitle)[e]=i[e]}))})),Object.keys(A)?.forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));n&&(t.has(n.stepTitle)||t.set(n.stepTitle,{}),t.get(n.stepTitle).selection=A[e].selections[0].name)})),t}}function Mo(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 n=A.call(t,e||"default");if("object"!=typeof n)return n;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}const xo=t.gql`
|
|
534
|
+
`,uo=(t,e,A)=>{const n={};return e.steps.forEach((e=>{Object.assign(n,(e=>{const n={};if("Frame"===e.type){const i=t[e.stepName],a=e.data;if(!i||a.hideImageInCart&&A)return n;n[`${e.stepTitle} image`]=i.image}if("Illustration"===e.type){const i=t[e.stepName],a=e.data;if(!i||a.hideColorsInCart&&A||!i.colors)return n;if(i.colors.length>0){const t=i.colors.join(", ").toUpperCase();n[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const i=t[e.stepName],a=e.data;if(!i||a.hideTextInCart&&A)return n;n[`${e.stepTitle} text`]=i.text}if("Text"===e.type){const i=t[e.stepName];if(!i)return n;const a=e.data;a.hideTextInCart&&A||(n[`${e.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&A||(n[`${e.stepTitle} color`]=i.color)}return n})(e))})),n},Qo=(t,e,A,n,i,a,o,r,s)=>{const c=(XA.getMap("transactionOwnerIds")||new Map).get(t.id),g={event:"onComplete",lineItemImageUrl:o||"",transactionId:t.id,designProductVariantId:t.externalDesignProductVariantId,designProductId:t.externalDesignProductId,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,baseCost:A,weight:e.weight,optionsCost:n,exportedData:a,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return i&&(g.metadata=i),r&&(g.selectedVariants=r),s&&(g.sku=s),g},Co=async(t,e,A,n,i,a,o)=>{const r=t.product?.basePrice||0,s=t.priceModifierTotal||0,c=((t,e,A,n)=>{const i={};let a;if(A){a=uo(A,e,!1);for(const t of Object.keys(a))i[t]={value:a[t],priceModifier:0}}else if(n){a=n;for(const t of Object.keys(a))i[t]={value:a[t],priceModifier:0}}for(const A of Object.keys(t)){const n=t[A],a=e.steps.find((t=>t.stepTitle===A));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let t=0;t<n.length;t++)i[`${a?.stepTitle} selection ${t+1}`]={value:n[t].name,priceModifier:n[t].priceModifier}}return i})(n,A,void 0,a);return Qo(t,e,r,s,a,c,o,n,i)},mo=async(t,e,A,n)=>{e("workflow.steps.finish.finalize.buildingLayouts");const i=t.getWorkflow(),a=t.getTransaction(),o=t.getWorkflowSelections(),r=t.getWorkflowMetadata();await t.outstandingRequestsPromise();const s=(await en.getShadowGraphqlClient().query({query:wa,variables:{id:a.id},errorPolicy:"all"})).data.transactions[0],c=r&&uo(r,i,!0),g=r&&uo(r,i,!1),l=async t=>{const e={};let A=0;if(Object.keys(o).length>0)for(const n of Object.keys(o)){const a=o[n],r=i.steps.find((t=>t.stepName===n));for(let n=0;n<a.selections.length;++n){const i=a.selections[n];if(r&&(!t||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const t=r.stepTitle;e[t]?e[t].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[t]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}A+=i.priceModifier}}return[e,A]},[B]=await l(!0),w=Object.fromEntries(Object.keys(B).map((t=>[t,B[t].map((t=>t.id))]))),[h]=await l(!1),d=Object.fromEntries(Object.keys(h).map((t=>[t,h[t].map((t=>t.id))]))),E=(t=>{const e=t.getPreviewService(),A=t.getWorkflow(),n=A.finalizeStepConfig?.lookAtAnimation;return e&&100===e.getSceneInitializationProgress()&&A.showModelOnFinishStep&&!!n})(t),u=await n(E);e("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await A(t.getVariationRecords());const Q=await(async t=>(await en.getShadowGraphqlClient().mutate({mutation:Eo,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 e={name:i.name,layouts:t.getLayouts().map((t=>({index:t.index,panelId:t.panelId}))),workflowId:i.id,transactionId:a.id,useThreeDimPreview:E,previewImage:u};if(g){const t=[];for(const[e,A]of Object.entries(g))t.push({key:e,value:A});e.metadata=t}if(w){const t=[];for(const[e,A]of Object.entries(d))t.push({key:e,ids:A});e.selectedVariants=t}return e})()),C=Q?.transaction?.previewImageLink;e("workflow.steps.finish.finalize.updatingTransaction");const m=t.getProduct();return a.bulk?((t,e,A,n)=>{const i=(t.product?.basePrice||0)*(t.variationsCount||0),a=t.priceModifierTotal||0;return Qo(t,e,i,a,void 0,{items:{value:`${A}`,priceModifier:0}},n)})(s,m,t.getVariationRecords().length,C):await Co(s,m,i,B,Q?.sku,c,C)};let po;var fo;(fo=po||(po={})).Local="Local",fo.Remote="Remote";const Do=new class{constructor(){ho(this,"localPersistenceKey","designTransactions"),ho(this,"storageMethod",po.Local),ho(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===po.Local){const t=XA.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new OA("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(),n=A.find((e=>e.transactionId===t));if(!n)throw new Error(`No saved design for transaction ${t}.`);n.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!==po.Local)throw new OA("Unexpected storage method requested");XA.set(this.localPersistenceKey,JSON.stringify(t))}};function Io(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 n=A.call(t,e||"default");if("object"!=typeof n)return n;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 yo{constructor(t,e){if(Io(this,"client",void 0),Io(this,"commandContext",void 0),Io(this,"workflowManager",void 0),Io(this,"isReadOnly",void 0),Io(this,"renderableScenes",[]),Io(this,"renderableSceneCallbacks",[]),Io(this,"debouncedSavedDesignUpdate",I(p)((async()=>{await Do.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Io(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 Me,this.commandContext.initialize(A,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!XA.getMap("transactionOwnerIds")?.get(e.transaction.id)||!!e.readOnly,this.workflowManager=new Za(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),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 en.getShadowGraphqlClient().mutate({mutation:Ba,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(),n=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const i=document.createElement("canvas");let a=2048;e&&e<=2048&&(a=e),i.width=a,i.height=a;const o=this.commandContext.getAllLayouts(),r=A.defaultPreviewPanelIndex||0,s=A.panels[r],c=o.find((t=>t.layoutState?.layout.panelId===s?.name))||o[0],g=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},l=this.commandContext.getLayoutById(c.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new jA("Failed to obtain 2D context for preview image creation");const h=Fe(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:H.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=I(Q).renderToStaticMarkup(h),E=await B.Canvg.from(w,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await E.render();const u=await this.getCanvasObjectURLAsync(i);return i.toDataURL(u)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return wo.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})))}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,e={type:K.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:ha(this.getWorkflowManager().getWorkflow())},conditions:[]};return wo.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return wo.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>wo.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=>wo.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){await en.getShadowGraphqlClient().mutate({mutation:no,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}}),this.getWorkflowManager().setTransactionCustomer(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 OA("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await Do.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 Do.addDesign(e),e}async copy(){const t=I(e)(this.getCommandContext().getState());if(!t)throw new OA("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),n=this.getWorkflowManager().getWorkflow(),i=new No({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new OA("Integration product id is undefined!");await i.initFromIntegrationProduct(a);return await i.getWorkflowExperience(n.id,A,void 0)}async onDesignFinished(t){return mo(this.workflowManager,t||(()=>{}),(t=>this.updateVariationRecords(t)),(t=>this.createPreviewImage(t)))}stepHasHandle(t){return t.type!==K.SilentIllustration&&t.type!==K.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!n)return;t.has(n.stepTitle)||t.set(n.stepTitle,{});const i=e[A];Object.keys(i).forEach((e=>{t.get(n.stepTitle)[e]=i[e]}))})),Object.keys(A)?.forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));n&&(t.has(n.stepTitle)||t.set(n.stepTitle,{}),t.get(n.stepTitle).selection=A[e].selections[0].name)})),t}}function Mo(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 n=A.call(t,e||"default");if("object"!=typeof n)return n;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}const xo=t.gql`
|
|
535
535
|
fragment RegionFields on Region {
|
|
536
536
|
width
|
|
537
537
|
top
|
package/dist/module.js
CHANGED
|
@@ -531,7 +531,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
|
|
|
531
531
|
}
|
|
532
532
|
}
|
|
533
533
|
}
|
|
534
|
-
`,vi=(A,t,e)=>{const n={};return t.steps.forEach((t=>{Object.assign(n,(t=>{const n={};if("Frame"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideImageInCart&&e)return n;n[`${t.stepTitle} image`]=i.image}if("Illustration"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideColorsInCart&&e||!i.colors)return n;if(i.colors.length>0){const A=i.colors.join(", ").toUpperCase();n[`${t.stepTitle} colors`]=A}}if("Module"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideTextInCart&&e)return n;n[`${t.stepTitle} text`]=i.text}if("Text"===t.type){const i=A[t.stepName];if(!i)return n;const a=t.data;a.hideTextInCart&&e||(n[`${t.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&e||(n[`${t.stepTitle} color`]=i.color)}return n})(t))})),n},Ni=(A,t,e,n,i,a,o,r,s)=>{const c=(gt.getMap("transactionOwnerIds")||new Map).get(A.id),g={event:"onComplete",lineItemImageUrl:o||"",transactionId:A.id,designProductVariantId:A.externalDesignProductVariantId,designProductId:A.externalDesignProductId,externalCartProductId:A.externalCartProductId,externalCartProductVariantId:A.externalCartProductVariantId,baseCost:e,weight:t.weight,optionsCost:n,exportedData:a,workflowViewerLink:A.workflowViewerLink||"",workflowViewerReadOnlyLink:A.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return i&&(g.metadata=i),r&&(g.selectedVariants=r),s&&(g.sku=s),g},Ri=async(A,t,e,n,i,a,o)=>{const r=A.product?.basePrice||0,s=A.priceModifierTotal||0,c=((A,t,e,n)=>{const i={};let a;if(e){a=vi(e,t,!1);for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}else if(n){a=n;for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}for(const e of Object.keys(A)){const n=A[e],a=t.steps.find((A=>A.stepTitle===e));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let A=0;A<n.length;A++)i[`${a?.stepTitle} selection ${A+1}`]={value:n[A].name,priceModifier:n[A].priceModifier}}return i})(n,e,void 0,a);return Ni(A,t,r,s,a,c,o,n,i)},Hi=async(A,t,e,n)=>{t("workflow.steps.finish.finalize.buildingLayouts");const i=A.getWorkflow(),a=A.getTransaction(),o=A.getWorkflowSelections(),r=A.getWorkflowMetadata();await A.outstandingRequestsPromise();const s=(await ht.getShadowGraphqlClient().query({query:Yn,variables:{id:a.id},errorPolicy:"all"})).data.transactions[0],c=r&&vi(r,i,!0),g=r&&vi(r,i,!1),B=async A=>{const t={};let e=0;if(Object.keys(o).length>0)for(const n of Object.keys(o)){const a=o[n],r=i.steps.find((A=>A.stepName===n));for(let n=0;n<a.selections.length;++n){const i=a.selections[n];if(r&&(!A||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;t[A]?t[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):t[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}e+=i.priceModifier}}return[t,e]},[l]=await B(!0),w=Object.fromEntries(Object.keys(l).map((A=>[A,l[A].map((A=>A.id))]))),[E]=await B(!1),d=Object.fromEntries(Object.keys(E).map((A=>[A,E[A].map((A=>A.id))]))),h=(A=>{const t=A.getPreviewService(),e=A.getWorkflow(),n=e.finalizeStepConfig?.lookAtAnimation;return t&&100===t.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!n})(A),Q=await n(h);t("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await e(A.getVariationRecords());const C=await(async A=>(await ht.getShadowGraphqlClient().mutate({mutation:Si,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}})).data?.designCreate)((()=>{const t={name:i.name,layouts:A.getLayouts().map((A=>({index:A.index,panelId:A.panelId}))),workflowId:i.id,transactionId:a.id,useThreeDimPreview:h,previewImage:Q};if(g){const A=[];for(const[t,e]of Object.entries(g))A.push({key:t,value:e});t.metadata=A}if(w){const A=[];for(const[t,e]of Object.entries(d))A.push({key:t,ids:e});t.selectedVariants=A}return t})()),u=C?.transaction?.previewImageLink;t("workflow.steps.finish.finalize.updatingTransaction");const D=A.getProduct();return a.bulk?((A,t,e,n)=>{const i=(A.product?.basePrice||0)*(A.variationsCount||0),a=A.priceModifierTotal||0;return Ni(A,t,i,a,void 0,{items:{value:`${e}`,priceModifier:0}},n)})(s,D,A.getVariationRecords().length,u):await Ri(s,D,i,l,C?.sku,c,u)};let Ui;var Pi;(Pi=Ui||(Ui={})).Local="Local",Pi.Remote="Remote";const Gi=new class{constructor(){xi(this,"localPersistenceKey","designTransactions"),xi(this,"storageMethod",Ui.Local),xi(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){return await this.getDesigns()}async getSavedDesignByTransaction(A){return(await this.getSavedDesigns()).find((t=>t.transactionId===A))}async addDesign(A){const t=(await this.getSavedDesigns()).filter((t=>t.transactionId!==A.transactionId));t.unshift(A),await this.setDesigns(t),this.notifyDesignSaved(A)}async removeDesign(A){const t=await this.getSavedDesigns();await this.setDesigns(t.filter((t=>t.transactionId!==A)))}async setDesigns(A){if(this.storageMethod!==Ui.Local)throw new nt("Unexpected storage method requested");gt.set(this.localPersistenceKey,JSON.stringify(A))}async getDesigns(){if(this.storageMethod===Ui.Local){const A=gt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new nt("Unexpected storage method requested")}notifyDesignSaved(A){this.designSavedListeners.forEach((t=>t(A)))}};function ki(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Ji{constructor(t,e){if(ki(this,"client",void 0),ki(this,"commandContext",void 0),ki(this,"workflowManager",void 0),ki(this,"isReadOnly",void 0),ki(this,"renderableScenes",[]),ki(this,"renderableSceneCallbacks",[]),ki(this,"debouncedSavedDesignUpdate",VA((async()=>{await Gi.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),ki(this,"getCanvasObjectURLAsync",(async A=>new Promise(((t,e)=>{try{A.toBlob((A=>{if(A){const e=URL.createObjectURL(A);t(e)}}))}catch(A){e(A)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const n=e.layouts;this.commandContext=new A,this.commandContext.initialize(n,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!gt.getMap("transactionOwnerIds")?.get(e.transaction.id)||!!e.readOnly,this.workflowManager=new li(e.workflow,e.product.profanities?.map((A=>A.word))||[],n,this.commandContext,(A=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(A)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly),this.workflowManager.addSelectionCallback((A=>{const t=A.traversableScenes.map((A=>{const t=A.renderableSteps.map((A=>A.stepName));return{id:A.name,title:A.title,renderableSteps:t}}));this.renderableScenes=t,this.renderableSceneCallbacks.forEach((A=>A(t)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(A){await ht.getShadowGraphqlClient().mutate({mutation:Fn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:A.map((A=>({recordNumber:A.recordNumber,values:A.values.map((A=>({aspect:A.aspect,stepName:A.stepName,value:A.value})))})))}})}async createPreviewImage(A,t){const e=this.workflowManager.getWorkflow(),n=e?.finalizeStepConfig?.lookAtAnimation;if(A){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const i=document.createElement("canvas");let a=2048;t&&t<=2048&&(a=t),i.width=a,i.height=a;const o=this.commandContext.getAllLayouts(),r=e.defaultPreviewPanelIndex||0,s=e.panels[r],c=o.find((A=>A.layoutState?.layout.panelId===s?.name))||o[0],g=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},B=this.commandContext.getLayoutById(c.layoutState.layout.id),l=i.getContext("2d");if(!l)throw new ot("Failed to obtain 2D context for preview image creation");const w=R(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),E=zA.renderToStaticMarkup(w),d=await OA.from(l,E,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await d.render();const h=await this.getCanvasObjectURLAsync(i);return i.toDataURL(h)}getStepById(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A));if(t&&this.stepHasHandle(t))return Yi.get(this.getWorkflowManager(),t)}getSteps(){return this.getScenes().flatMap((A=>this.getStepsByScene(A)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((A=>({id:A.id,name:A.name,stepIds:A.stepNames})))}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const A=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:m.Bulk,stepName:"Bulk",stepTitle:A?.stepTitle??"workflow.steps.bulk.title",helpText:A?.helpText,data:{aspects:xn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Yi.get(this.getWorkflowManager(),t)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Yi.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Yi.get(this.getWorkflowManager(),A)))}getStepsByScene(A){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((t=>t.name===A.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 A.stepIds.map((A=>this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A)))).filter((A=>this.stepHasHandle(A))).map((A=>Yi.get(this.getWorkflowManager(),A)))}async attachCustomerDetails(A){return this.assignCustomerDetails({emailAddress:A.email})}async assignCustomerDetails(A){await ht.getShadowGraphqlClient().mutate({mutation:Ci,variables:{id:this.getWorkflowManager().getTransaction().id,details:A,type:"Owner"}}),this.getWorkflowManager().setTransactionCustomer(A)}attachRenderableSceneListener(A){this.renderableSceneCallbacks.push(A),A(this.renderableScenes)}detachRenderableSceneListener(A){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((t=>t!==A))}async save(A){if(!this.getCommandContext().getState())throw new nt("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await Gi.getSavedDesigns()).find((A=>A.transactionId===t))?.title;return e||"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 Gi.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new nt("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new zi({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new nt("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0)}async onDesignFinished(A){return Hi(this.workflowManager,A||(()=>{}),(A=>this.updateVariationRecords(A)),(A=>this.createPreviewImage(A)))}stepHasHandle(A){return A.type!==m.SilentIllustration&&A.type!==m.ProductOverlay}getExportedData(){const A=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),e=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===e));if(!n)return;A.has(n.stepTitle)||A.set(n.stepTitle,{});const i=t[e];Object.keys(i).forEach((t=>{A.get(n.stepTitle)[t]=i[t]}))})),Object.keys(e)?.forEach((t=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===t));n&&(A.has(n.stepTitle)||A.set(n.stepTitle,{}),A.get(n.stepTitle).selection=e[t].selections[0].name)})),A}}function bi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Li=pA`
|
|
534
|
+
`,vi=(A,t,e)=>{const n={};return t.steps.forEach((t=>{Object.assign(n,(t=>{const n={};if("Frame"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideImageInCart&&e)return n;n[`${t.stepTitle} image`]=i.image}if("Illustration"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideColorsInCart&&e||!i.colors)return n;if(i.colors.length>0){const A=i.colors.join(", ").toUpperCase();n[`${t.stepTitle} colors`]=A}}if("Module"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideTextInCart&&e)return n;n[`${t.stepTitle} text`]=i.text}if("Text"===t.type){const i=A[t.stepName];if(!i)return n;const a=t.data;a.hideTextInCart&&e||(n[`${t.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&e||(n[`${t.stepTitle} color`]=i.color)}return n})(t))})),n},Ni=(A,t,e,n,i,a,o,r,s)=>{const c=(gt.getMap("transactionOwnerIds")||new Map).get(A.id),g={event:"onComplete",lineItemImageUrl:o||"",transactionId:A.id,designProductVariantId:A.externalDesignProductVariantId,designProductId:A.externalDesignProductId,externalCartProductId:A.externalCartProductId,externalCartProductVariantId:A.externalCartProductVariantId,baseCost:e,weight:t.weight,optionsCost:n,exportedData:a,workflowViewerLink:A.workflowViewerLink||"",workflowViewerReadOnlyLink:A.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return i&&(g.metadata=i),r&&(g.selectedVariants=r),s&&(g.sku=s),g},Ri=async(A,t,e,n,i,a,o)=>{const r=A.product?.basePrice||0,s=A.priceModifierTotal||0,c=((A,t,e,n)=>{const i={};let a;if(e){a=vi(e,t,!1);for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}else if(n){a=n;for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}for(const e of Object.keys(A)){const n=A[e],a=t.steps.find((A=>A.stepTitle===e));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let A=0;A<n.length;A++)i[`${a?.stepTitle} selection ${A+1}`]={value:n[A].name,priceModifier:n[A].priceModifier}}return i})(n,e,void 0,a);return Ni(A,t,r,s,a,c,o,n,i)},Hi=async(A,t,e,n)=>{t("workflow.steps.finish.finalize.buildingLayouts");const i=A.getWorkflow(),a=A.getTransaction(),o=A.getWorkflowSelections(),r=A.getWorkflowMetadata();await A.outstandingRequestsPromise();const s=(await ht.getShadowGraphqlClient().query({query:Yn,variables:{id:a.id},errorPolicy:"all"})).data.transactions[0],c=r&&vi(r,i,!0),g=r&&vi(r,i,!1),B=async A=>{const t={};let e=0;if(Object.keys(o).length>0)for(const n of Object.keys(o)){const a=o[n],r=i.steps.find((A=>A.stepName===n));for(let n=0;n<a.selections.length;++n){const i=a.selections[n];if(r&&(!A||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;t[A]?t[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):t[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}e+=i.priceModifier}}return[t,e]},[l]=await B(!0),w=Object.fromEntries(Object.keys(l).map((A=>[A,l[A].map((A=>A.id))]))),[E]=await B(!1),d=Object.fromEntries(Object.keys(E).map((A=>[A,E[A].map((A=>A.id))]))),h=(A=>{const t=A.getPreviewService(),e=A.getWorkflow(),n=e.finalizeStepConfig?.lookAtAnimation;return t&&100===t.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!n})(A),Q=await n(h);t("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await e(A.getVariationRecords());const C=await(async A=>(await ht.getShadowGraphqlClient().mutate({mutation:Si,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}})).data?.designCreate)((()=>{const t={name:i.name,layouts:A.getLayouts().map((A=>({index:A.index,panelId:A.panelId}))),workflowId:i.id,transactionId:a.id,useThreeDimPreview:h,previewImage:Q};if(g){const A=[];for(const[t,e]of Object.entries(g))A.push({key:t,value:e});t.metadata=A}if(w){const A=[];for(const[t,e]of Object.entries(d))A.push({key:t,ids:e});t.selectedVariants=A}return t})()),u=C?.transaction?.previewImageLink;t("workflow.steps.finish.finalize.updatingTransaction");const D=A.getProduct();return a.bulk?((A,t,e,n)=>{const i=(A.product?.basePrice||0)*(A.variationsCount||0),a=A.priceModifierTotal||0;return Ni(A,t,i,a,void 0,{items:{value:`${e}`,priceModifier:0}},n)})(s,D,A.getVariationRecords().length,u):await Ri(s,D,i,l,C?.sku,c,u)};let Ui;var Pi;(Pi=Ui||(Ui={})).Local="Local",Pi.Remote="Remote";const Gi=new class{constructor(){xi(this,"localPersistenceKey","designTransactions"),xi(this,"storageMethod",Ui.Local),xi(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){if(this.storageMethod===Ui.Local){const A=gt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new nt("Unexpected storage method requested")}async getSavedDesignByTransaction(A){return(await this.getSavedDesigns()).find((t=>t.transactionId===A))}async addDesign(A){const t=(await this.getSavedDesigns()).filter((t=>t.transactionId!==A.transactionId));t.unshift(A),await this.setDesigns(t),this.designSavedListeners.forEach((t=>t(A)))}async renameDesign(A,t){const e=await this.getSavedDesigns(),n=e.find((t=>t.transactionId===A));if(!n)throw new Error(`No saved design for transaction ${A}.`);n.title=t,await this.setDesigns(e)}async removeDesign(A){const t=await this.getSavedDesigns();await this.setDesigns(t.filter((t=>t.transactionId!==A)))}async setDesigns(A){if(this.storageMethod!==Ui.Local)throw new nt("Unexpected storage method requested");gt.set(this.localPersistenceKey,JSON.stringify(A))}};function ki(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Ji{constructor(t,e){if(ki(this,"client",void 0),ki(this,"commandContext",void 0),ki(this,"workflowManager",void 0),ki(this,"isReadOnly",void 0),ki(this,"renderableScenes",[]),ki(this,"renderableSceneCallbacks",[]),ki(this,"debouncedSavedDesignUpdate",VA((async()=>{await Gi.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),ki(this,"getCanvasObjectURLAsync",(async A=>new Promise(((t,e)=>{try{A.toBlob((A=>{if(A){const e=URL.createObjectURL(A);t(e)}}))}catch(A){e(A)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const n=e.layouts;this.commandContext=new A,this.commandContext.initialize(n,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!gt.getMap("transactionOwnerIds")?.get(e.transaction.id)||!!e.readOnly,this.workflowManager=new li(e.workflow,e.product.profanities?.map((A=>A.word))||[],n,this.commandContext,(A=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(A)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly),this.workflowManager.addSelectionCallback((A=>{const t=A.traversableScenes.map((A=>{const t=A.renderableSteps.map((A=>A.stepName));return{id:A.name,title:A.title,renderableSteps:t}}));this.renderableScenes=t,this.renderableSceneCallbacks.forEach((A=>A(t)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(A){await ht.getShadowGraphqlClient().mutate({mutation:Fn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:A.map((A=>({recordNumber:A.recordNumber,values:A.values.map((A=>({aspect:A.aspect,stepName:A.stepName,value:A.value})))})))}})}async createPreviewImage(A,t){const e=this.workflowManager.getWorkflow(),n=e?.finalizeStepConfig?.lookAtAnimation;if(A){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const i=document.createElement("canvas");let a=2048;t&&t<=2048&&(a=t),i.width=a,i.height=a;const o=this.commandContext.getAllLayouts(),r=e.defaultPreviewPanelIndex||0,s=e.panels[r],c=o.find((A=>A.layoutState?.layout.panelId===s?.name))||o[0],g=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},B=this.commandContext.getLayoutById(c.layoutState.layout.id),l=i.getContext("2d");if(!l)throw new ot("Failed to obtain 2D context for preview image creation");const w=R(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),E=zA.renderToStaticMarkup(w),d=await OA.from(l,E,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await d.render();const h=await this.getCanvasObjectURLAsync(i);return i.toDataURL(h)}getStepById(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A));if(t&&this.stepHasHandle(t))return Yi.get(this.getWorkflowManager(),t)}getSteps(){return this.getScenes().flatMap((A=>this.getStepsByScene(A)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((A=>({id:A.id,name:A.name,stepIds:A.stepNames})))}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const A=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:m.Bulk,stepName:"Bulk",stepTitle:A?.stepTitle??"workflow.steps.bulk.title",helpText:A?.helpText,data:{aspects:xn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Yi.get(this.getWorkflowManager(),t)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Yi.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Yi.get(this.getWorkflowManager(),A)))}getStepsByScene(A){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((t=>t.name===A.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 A.stepIds.map((A=>this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A)))).filter((A=>this.stepHasHandle(A))).map((A=>Yi.get(this.getWorkflowManager(),A)))}async attachCustomerDetails(A){return this.assignCustomerDetails({emailAddress:A.email})}async assignCustomerDetails(A){await ht.getShadowGraphqlClient().mutate({mutation:Ci,variables:{id:this.getWorkflowManager().getTransaction().id,details:A,type:"Owner"}}),this.getWorkflowManager().setTransactionCustomer(A)}attachRenderableSceneListener(A){this.renderableSceneCallbacks.push(A),A(this.renderableScenes)}detachRenderableSceneListener(A){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((t=>t!==A))}async save(A){if(!this.getCommandContext().getState())throw new nt("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await Gi.getSavedDesigns()).find((A=>A.transactionId===t))?.title;return e||"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 Gi.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new nt("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new zi({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new nt("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0)}async onDesignFinished(A){return Hi(this.workflowManager,A||(()=>{}),(A=>this.updateVariationRecords(A)),(A=>this.createPreviewImage(A)))}stepHasHandle(A){return A.type!==m.SilentIllustration&&A.type!==m.ProductOverlay}getExportedData(){const A=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),e=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===e));if(!n)return;A.has(n.stepTitle)||A.set(n.stepTitle,{});const i=t[e];Object.keys(i).forEach((t=>{A.get(n.stepTitle)[t]=i[t]}))})),Object.keys(e)?.forEach((t=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===t));n&&(A.has(n.stepTitle)||A.set(n.stepTitle,{}),A.get(n.stepTitle).selection=e[t].selections[0].name)})),A}}function bi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Li=pA`
|
|
535
535
|
${Ct}
|
|
536
536
|
${Dt}
|
|
537
537
|
${Yt}
|
package/dist/types.d.ts
CHANGED
|
@@ -1653,6 +1653,10 @@ declare class DesignService {
|
|
|
1653
1653
|
* @param design The design to save.
|
|
1654
1654
|
*/
|
|
1655
1655
|
addDesign(design: SavedDesign): Promise<void>;
|
|
1656
|
+
/**
|
|
1657
|
+
* Change the user's name of the given saved design.
|
|
1658
|
+
*/
|
|
1659
|
+
renameDesign(transactionId: string, title: string): Promise<void>;
|
|
1656
1660
|
/**
|
|
1657
1661
|
* Removes a given design from storage.
|
|
1658
1662
|
* @param transactionId
|