@spiffcommerce/core 11.2.0 → 11.4.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/module.js CHANGED
@@ -459,7 +459,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
459
459
  id
460
460
  }
461
461
  }
462
- `;class xi extends yi{constructor(A,t){super(A,t),Mi(this,"transaction",this.manager.getTransaction())}selectVariant(){throw new Error("Bulk step does not support variants.")}async setDesignName(A){await ft.getShadowGraphqlClient().mutate({mutation:Yi,variables:{transactionId:this.manager.getTransaction().id,designName:A}});const t=this.manager.getTransaction();this.manager.setTransaction({...t,designName:A})}addVariationRecord(){const A=this.manager.addVariationRecord({transactionId:this.transaction.id,values:[]});return this.manager.setCurrentVariationRecord(A),A}updateBulkIsConnected(A){this.manager.updateStorage(this.getId(),{bulkIsConnected:A})}openBulkSourceUrl(){window.open(this.transaction.bulkSourceUrl,"_blank")}async sendGoogleSheetLinkToEmail(A){await ft.getShadowGraphqlClient().mutate({mutation:Fi,variables:{id:this.transaction.id,details:{emailAddress:A},type:"Owner"}}),this.openBulkSourceUrl()}deleteVariationRecord(A){this.manager.removeVariationRecord(A)}getAspects(){return this.step.data.aspects}}class Si extends yi{constructor(A,t){super(A,t)}async selectVariant(A){if(this.getCurrentVariant()!==A)return ai.selectVariant(this.step,A.getResource(),this.manager.getRegionElements(this.step.stepName)||[],(A=>this.setUpdateState(A)),this.manager)}getColors(){const A=this.manager.getRegionElements(this.step.stepName)||[];if(0!==A.length)try{return y(A[0].id,this.manager.getAllLayoutData()).colors}catch(A){console.error(A)}}setColor(A,t){const e=new Map;return e.set(A,t),ai.changeColors(this.step,this.manager.getRegionElements(this.step.stepName),this.manager,(()=>this.manager.getCommandContext().getAllLayouts()),e)}async getColorOption(){return this.step.data.colorOption}getAvailableColors(){return this.step.data.colorPickerEnabled?ai.availableColors(this.step,this.manager):Promise.resolve([])}hasVaryingSelection(){return this.step.data.varySelection}hasVaryingColors(){return this.step.data.varyColors}isColorPickerEnabled(){return this.step.data.colorPickerEnabled}}class vi extends yi{constructor(A,t){super(A,t)}selectVariant(A){return oi.selectVariant(this.step,A.getResource(),this.manager,(A=>this.setUpdateState(A)))}}class Ni extends yi{constructor(A,t){super(A,t)}selectVariant(A){return ri.selectVariant(this.step,A.getResource(),this.manager,(A=>this.setUpdateState(A)))}}class Ri extends yi{constructor(A,t){super(A,t)}selectVariant(A){return ci.selectVariant(this.step,A.getResource(),this.manager,(A=>this.setUpdateState(A)))}}class Hi extends yi{constructor(A,t){super(A,t)}async selectVariant(A){if(!A.getId())throw new Error("Unable to select variant with a null ID");await gi.selectVariant(this.step,A.getId(),this.manager)}getDisplayType(){return this.step.option?.displayType}}class Ui extends yi{constructor(A,t){super(A,t)}selectVariant(A){return Promise.resolve()}setColor(A){return li.selectVariant(this.step,A,this.manager.getRegionElements(this.step.stepName)||[],this.manager)}getColors(){return li.availableColours(this.step)}}class Pi extends yi{constructor(A,t){super(A,t)}async selectVariant(A){hi.selectVariant(this.step,A.getResource(),this.manager,(A=>{if(A)this.manager.setInformationResults([...this.manager.getInformationResults(),{message:"An issue has occured with test",messageType:Ci.Error,stepID:this.step.stepName}]);else{const A=this.manager.getInformationResults().filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}}),(A=>{}))}getAvailableFillColors(){return this.step.data.colorPickerEnabled?hi.availableFillColors(this.step):[]}async setFillColor(A){const t=this.manager.getRegionElements(this.step.stepName);await hi.changeFillColor(this.step,A,t,this.manager)}getFillColor(){return this.manager.getStepStorage(this.step.stepName)?.color||"#000000"}getAvailableFillImages(){return hi.availableFillImages(this.step)}async setFillImage(A){const t=this.manager.getRegionElements(this.step.stepName);await hi.changeFillImage(this.step,A,t,this.manager)}getFillImage(){return this.manager.getStepStorage(this.step.stepName)?.fillImage}setFullTextCustomization(A){const t=this.manager.getStepStorage(this.step.stepName)?.inputText||"",e=void 0!==this.step.data.replaceableText?this.step.data.replaceableText.replace("{{}}",t):t,n=A?e:this.step.data.defaultText;this.manager.updateStorage(this.step.stepName,{customiseAllText:A,text:n,defaultCleared:!1});return this.setText(n)}setText(A){const t={input:A},e=hi.findLayoutElements(this.manager,this.step),n=hi.filterUnsupportedCharacters(A,e[0]?.fontData);!!this.step.data&&!!this.step.data.maxLength&&n.length>this.step.data.maxLength||(t.input=n);const i=e.length<=0,a=i?{inputText:n,text:n}:{inputText:n};if(this.manager.updateStorage(this.step.stepName,a),this.manager.updateMetadata(this.step.stepName,{text:n}),i)return t;const{command:o,errors:r,helperText:s}=hi.updateInputText(n,e,this.step,this.manager);o&&this.manager.getCommandDispatcher()(o);const c=this.manager.getInformationResults(),g=r[0]?.localizationKey;if(g)this.manager.setInformationResults([...c,{message:`${g} - ${this.step.stepTitle}`,messageType:Ci.Error,stepID:this.step.stepName}]);else{const A=c.filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}return t.helperText=g||s,t.errorText=g,t}getText(){const A=this.step.data.defaultText;return this.manager.getStepStorage(this.step.stepName)?.text||A||""}isReplaceable(){return this.step.data.userCanReplaceText}clearDefaultTextIfNecessary(){if(!this.manager.getStepStorage(this.step.stepName)?.defaultCleared&&this.step.data.deleteDefaultOnFocus){const A=this.setText("");return this.manager.updateStorage(this.step.stepName,{defaultCleared:!0,inputText:""}),A}}hasVaryingText(){return this.step.data.varyText}hasVaryingColor(){return this.step.data.varyColor}hasVaryingSelection(){return this.step.data.varySelection}hasColorPicker(){return this.step.data.colorPickerEnabled}getRegions(){return this.step.data.regions}getCharacterLimit(){return this.step.data.maxLength}getCharactersRemaining(){const A=this.step.data.maxLength;if(void 0===A)return;return A-this.getText().length}}class Gi{static get(A,t){switch(t.type){case D.Question:return new Hi(A,t);case D.Text:return new Pi(A,t);case D.Illustration:return new Si(A,t);case D.Picture:return new Ri(A,t);case D.Shape:return new Ui(A,t);case D.Material:return new vi(A,t);case D.Model:return new Ni(A,t);case D.Frame:return new Ca(A,t);case D.Bulk:return new xi(A,t);default:throw new ot(`Step type ${t.type} not yet supported in Core SDK`)}}}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}const bi=IA`
462
+ `;class xi extends yi{constructor(A,t){super(A,t),Mi(this,"transaction",this.manager.getTransaction())}selectVariant(){throw new Error("Bulk step does not support variants.")}async setDesignName(A){await ft.getShadowGraphqlClient().mutate({mutation:Yi,variables:{transactionId:this.manager.getTransaction().id,designName:A}});const t=this.manager.getTransaction();this.manager.setTransaction({...t,designName:A})}addVariationRecord(){const A=this.manager.addVariationRecord({transactionId:this.transaction.id,values:[]});return this.manager.setCurrentVariationRecord(A),A}updateBulkIsConnected(A){this.manager.updateStorage(this.getId(),{bulkIsConnected:A})}openBulkSourceUrl(){window.open(this.transaction.bulkSourceUrl,"_blank")}async sendGoogleSheetLinkToEmail(A){await ft.getShadowGraphqlClient().mutate({mutation:Fi,variables:{id:this.transaction.id,details:{emailAddress:A},type:"Owner"}}),this.openBulkSourceUrl()}deleteVariationRecord(A){this.manager.removeVariationRecord(A)}getAspects(){return this.step.data.aspects}}class Si extends yi{constructor(A,t){super(A,t)}async selectVariant(A){if(this.getCurrentVariant()!==A)return ai.selectVariant(this.step,A.getResource(),this.manager.getRegionElements(this.step.stepName)||[],(A=>this.setUpdateState(A)),this.manager)}getColors(){const A=this.manager.getRegionElements(this.step.stepName)||[];if(0!==A.length)try{return y(A[0].id,this.manager.getAllLayoutData()).colors}catch(A){console.error(A)}}setColor(A,t){const e=new Map;return e.set(A,t),ai.changeColors(this.step,this.manager.getRegionElements(this.step.stepName),this.manager,(()=>this.manager.getCommandContext().getAllLayouts()),e)}async getColorOption(){return this.step.data.colorOption}getAvailableColors(){return this.step.data.colorPickerEnabled?ai.availableColors(this.step,this.manager):Promise.resolve([])}hasVaryingSelection(){return this.step.data.varySelection}hasVaryingColors(){return this.step.data.varyColors}isColorPickerEnabled(){return this.step.data.colorPickerEnabled}}class vi extends yi{constructor(A,t){super(A,t)}selectVariant(A){return oi.selectVariant(this.step,A.getResource(),this.manager,(A=>this.setUpdateState(A)))}}class Ni extends yi{constructor(A,t){super(A,t)}selectVariant(A){return ri.selectVariant(this.step,A.getResource(),this.manager,(A=>this.setUpdateState(A)))}}class Ri extends yi{constructor(A,t){super(A,t)}selectVariant(A){return ci.selectVariant(this.step,A.getResource(),this.manager,(A=>this.setUpdateState(A)))}}class Hi extends yi{constructor(A,t){super(A,t)}async selectVariant(A){if(!A.getId())throw new Error("Unable to select variant with a null ID");await gi.selectVariant(this.step,A.getId(),this.manager)}getDisplayType(){return this.step.option?.displayType}}class Ui extends yi{constructor(A,t){super(A,t)}selectVariant(A){return Promise.resolve()}setColor(A){return li.selectVariant(this.step,A,this.manager.getRegionElements(this.step.stepName)||[],this.manager)}getColors(){return li.availableColours(this.step)}}class Pi extends yi{constructor(A,t){super(A,t)}async selectVariant(A){hi.selectVariant(this.step,A.getResource(),this.manager,(A=>{if(A)this.manager.setInformationResults([...this.manager.getInformationResults(),{message:"An issue has occured with test",messageType:Ci.Error,stepID:this.step.stepName}]);else{const A=this.manager.getInformationResults().filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}}),(A=>{}))}getAvailableFillColors(){return this.step.data.colorPickerEnabled?hi.availableFillColors(this.step):[]}async setFillColor(A){const t=this.manager.getRegionElements(this.step.stepName);await hi.changeFillColor(this.step,A,t,this.manager)}getFillColor(){return this.manager.getStepStorage(this.step.stepName)?.color||"#000000"}getAvailableFillImages(){return hi.availableFillImages(this.step)}async setFillImage(A){const t=this.manager.getRegionElements(this.step.stepName);await hi.changeFillImage(this.step,A,t,this.manager)}getFillImage(){return this.manager.getStepStorage(this.step.stepName)?.fillImage}setFullTextCustomization(A){const t=this.manager.getStepStorage(this.step.stepName)?.inputText||"",e=void 0!==this.step.data.replaceableText?this.step.data.replaceableText.replace("{{}}",t):t,n=A?e:this.step.data.defaultText;this.manager.updateStorage(this.step.stepName,{customiseAllText:A,text:n,defaultCleared:!1});return this.setText(n)}setText(A){const t={input:A},e=hi.findLayoutElements(this.manager,this.step),n=hi.filterUnsupportedCharacters(A,e[0]?.fontData);!!this.step.data&&!!this.step.data.maxLength&&n.length>this.step.data.maxLength||(t.input=n);const i=e.length<=0,a=i?{inputText:n,text:n}:{inputText:n};if(this.manager.updateStorage(this.step.stepName,a),this.manager.updateMetadata(this.step.stepName,{text:n}),i)return t;const{command:o,errors:r,helperText:s}=hi.updateInputText(n,e,this.step,this.manager);o&&this.manager.getCommandDispatcher()(o);const c=this.manager.getInformationResults(),g=r[0]?.localizationKey;if(g)this.manager.setInformationResults([...c,{message:`${g} - ${this.step.stepTitle}`,messageType:Ci.Error,stepID:this.step.stepName}]);else{const A=c.filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}return t.helperText=g||s,t.errorText=g,t}getText(){const A=this.step.data.defaultText;return this.manager.getStepStorage(this.step.stepName)?.text||A||""}isReplaceable(){return this.step.data.userCanReplaceText}clearDefaultTextIfNecessary(){if(!this.manager.getStepStorage(this.step.stepName)?.defaultCleared&&this.step.data.deleteDefaultOnFocus){const A=this.setText("");return this.manager.updateStorage(this.step.stepName,{defaultCleared:!0,inputText:""}),A}}hasVaryingText(){return this.step.data.varyText}hasVaryingColor(){return this.step.data.varyColor}hasVaryingSelection(){return this.step.data.varySelection}hasColorPicker(){return this.step.data.colorPickerEnabled}getRegions(){return this.step.data.regions}getCharacterLimit(){return this.step.data.maxLength}getCharactersRemaining(){const A=this.step.data.maxLength;if(void 0===A)return;return A-this.getText().length}}class Gi{static get(A,t){switch(t.type){case D.Question:return new Hi(A,t);case D.Text:return new Pi(A,t);case D.Illustration:return new Si(A,t);case D.Picture:return new Ri(A,t);case D.Shape:return new Ui(A,t);case D.Material:return new vi(A,t);case D.Model:return new Ni(A,t);case D.Frame:return new Da(A,t);case D.Bulk:return new xi(A,t);default:throw new ot(`Step type ${t.type} not yet supported in Core SDK`)}}}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}const bi=IA`
463
463
  mutation CreateDesign(
464
464
  $name: String!
465
465
  $layouts: [LayoutInput]!
@@ -488,7 +488,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
488
488
  }
489
489
  }
490
490
  }
491
- `,Ji=(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},Li=(A,t,e,n,i,a,o,r,s)=>{const c=(wt.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},Oi=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=Ji(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 Li(A,t,r,s,a,c,o,n,i)},Ti=async(A,t,e,n,i,a,o,r,s,c,g,l,B)=>{s("workflow.steps.finish.finalize.buildingLayouts"),await A.outstandingRequestsPromise();const w=ft.getShadowGraphqlClient();await w.resetStore();const d=await w.query({query:bn,variables:{id:a.id},errorPolicy:"all"}),E=d.data?.transactions[0].workflowState;!d.errors&&E||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),d.errors&&d.errors.forEach((A=>{d.errors&&console.log("Server Error:",A.message)})),await A.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const h=A.getPreviewService(),Q=t?.finalizeStepConfig?.lookAtAnimation,C=h&&100===h.getSceneInitializationProgress()&&t.showModelOnFinishStep&&!!Q,u=B&&Ji(B,t,!0),m=B&&Ji(B,t,!1),D=async A=>{const e={};let n=0;if(Object.keys(o).length>0)for(const i of Object.keys(o)){const a=o[i],r=t.steps.find((A=>A.stepName===i));for(let t=0;t<a.selections.length;++t){const i=a.selections[t];if(r&&(!A||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;e[A]?e[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}n+=i.priceModifier}}return[e,n]},[p]=await D(!0),I=Object.fromEntries(Object.keys(p).map((A=>[A,p[A].map((A=>A.id))]))),[f]=await D(!1),y=Object.fromEntries(Object.keys(f).map((A=>[A,f[A].map((A=>A.id))]))),M=await l(C);s("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await c(g);const F=await(async A=>(await ft.getShadowGraphqlClient().mutate({mutation:bi,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 A={name:r,layouts:e.map((A=>({index:A.index,panelId:A.panelId}))),workflowId:t.id,transactionId:a.id,useThreeDimPreview:C,previewImage:M};if(m){const t=[];for(const[A,e]of Object.entries(m))t.push({key:A,value:e});A.metadata=t}if(I){const t=[];for(const[A,e]of Object.entries(y))t.push({key:A,ids:e});A.selectedVariants=t}return A})()),Y=F?.transaction?.previewImageLink;s("workflow.steps.finish.finalize.updatingTransaction");const x=(await ft.getShadowGraphqlClient().query({query:kn,variables:{id:a.id}})).data.transactions[0];return a.bulk?((A,t,e)=>{const n=(A.product?.basePrice||0)*(A.variationsCount||0),i=A.priceModifierTotal||0,a={items:{value:A.variationsCount?`${A.variationsCount}`:"0",priceModifier:0}};return Li(A,t,n,i,void 0,a,e)})(x,i,Y):await Oi(x,i,t,p,F?.sku,u,Y)};let zi;var ji;(ji=zi||(zi={})).Local="Local",ji.Remote="Remote";const Ki=new class{constructor(){ki(this,"localPersistenceKey","designTransactions"),ki(this,"storageMethod",zi.Local),ki(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){if(this.storageMethod===zi.Local){const A=wt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new ot("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!==zi.Local)throw new ot("Unexpected storage method requested");wt.set(this.localPersistenceKey,JSON.stringify(A))}};function Vi(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 Wi{constructor(t,e){if(Vi(this,"client",void 0),Vi(this,"commandContext",void 0),Vi(this,"workflowManager",void 0),Vi(this,"isReadOnly",void 0),Vi(this,"renderableScenes",[]),Vi(this,"renderableSceneCallbacks",[]),Vi(this,"debouncedSavedDesignUpdate",WA((async()=>{await Ki.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Vi(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||!!e.readOnly,this.workflowManager=new Di(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 ft.getShadowGraphqlClient().mutate({mutation:Gn,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},l=this.commandContext.getLayoutById(c.layoutState.layout.id),B=i.getContext("2d");if(!B)throw new ct("Failed to obtain 2D context for preview image creation");const w=R(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=jA.renderToStaticMarkup(w),E=await zA.from(B,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await E.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 Gi.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:D.Bulk,stepName:"Bulk",stepTitle:A?.stepTitle??"workflow.steps.bulk.title",helpText:A?.helpText,data:{aspects:Jn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Gi.get(this.getWorkflowManager(),t)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Gi.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Gi.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=>Gi.get(this.getWorkflowManager(),A)))}async attachCustomerDetails(A){return this.assignCustomerDetails({emailAddress:A.email})}async assignCustomerDetails(A){const t=(await ft.getShadowGraphqlClient().mutate({mutation:Fi,variables:{id:this.getWorkflowManager().getTransaction().id,details:A,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((t=>t.customer?.emailAddress===A.emailAddress));if(t?.customer){this.getWorkflowManager().setTransactionCustomer(t.customer);const A=wt.getMap("transactionCustomerIds")||new Map;A.set(this.getWorkflowManager().getTransaction().id,t.customer.id),wt.setMap("transactionCustomerIds",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 ot("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await Ki.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 Ki.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new ot("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new Ba({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new ot("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0)}async onDesignFinished(A){return Ti(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,A||(()=>{}),(A=>this.updateVariationRecords(A)),this.workflowManager.getVariationRecords(),(A=>this.createPreviewImage(A)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(A){return A.type!==D.SilentIllustration&&A.type!==D.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}}const Xi=qA`
491
+ `,Ji=(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},Li=(A,t,e,n,i,a,o,r,s)=>{const c=(wt.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},Oi=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=Ji(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 Li(A,t,r,s,a,c,o,n,i)},Ti=async(A,t,e,n,i,a,o,r,s,c,g,l,B)=>{s("workflow.steps.finish.finalize.buildingLayouts"),await A.outstandingRequestsPromise();const w=ft.getShadowGraphqlClient();await w.resetStore();const d=await w.query({query:bn,variables:{id:a.id},errorPolicy:"all"}),E=d.data?.transactions[0].workflowState;!d.errors&&E||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),d.errors&&d.errors.forEach((A=>{d.errors&&console.log("Server Error:",A.message)})),await A.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const h=A.getPreviewService(),Q=t?.finalizeStepConfig?.lookAtAnimation,C=h&&100===h.getSceneInitializationProgress()&&t.showModelOnFinishStep&&!!Q,u=B&&Ji(B,t,!0),m=B&&Ji(B,t,!1),D=async A=>{const e={};let n=0;if(Object.keys(o).length>0)for(const i of Object.keys(o)){const a=o[i],r=t.steps.find((A=>A.stepName===i));for(let t=0;t<a.selections.length;++t){const i=a.selections[t];if(r&&(!A||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;e[A]?e[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}n+=i.priceModifier}}return[e,n]},[p]=await D(!0),I=Object.fromEntries(Object.keys(p).map((A=>[A,p[A].map((A=>A.id))]))),[f]=await D(!1),y=Object.fromEntries(Object.keys(f).map((A=>[A,f[A].map((A=>A.id))]))),M=await l(C);s("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await c(g);const F=await(async A=>(await ft.getShadowGraphqlClient().mutate({mutation:bi,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 A={name:r,layouts:e.map((A=>({index:A.index,panelId:A.panelId}))),workflowId:t.id,transactionId:a.id,useThreeDimPreview:C,previewImage:M};if(m){const t=[];for(const[A,e]of Object.entries(m))t.push({key:A,value:e});A.metadata=t}if(I){const t=[];for(const[A,e]of Object.entries(y))t.push({key:A,ids:e});A.selectedVariants=t}return A})()),Y=F?.transaction?.previewImageLink;s("workflow.steps.finish.finalize.updatingTransaction");const x=(await ft.getShadowGraphqlClient().query({query:kn,variables:{id:a.id}})).data.transactions[0];return a.bulk?((A,t,e)=>{const n=(A.product?.basePrice||0)*(A.variationsCount||0),i=A.priceModifierTotal||0,a={items:{value:A.variationsCount?`${A.variationsCount}`:"0",priceModifier:0}};return Li(A,t,n,i,void 0,a,e)})(x,i,Y):await Oi(x,i,t,p,F?.sku,u,Y)};let zi;var ji;(ji=zi||(zi={})).Local="Local",ji.Remote="Remote";const Ki=new class{constructor(){ki(this,"localPersistenceKey","designTransactions"),ki(this,"storageMethod",zi.Local),ki(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){if(this.storageMethod===zi.Local){const A=wt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new ot("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!==zi.Local)throw new ot("Unexpected storage method requested");wt.set(this.localPersistenceKey,JSON.stringify(A))}};function Vi(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 Wi{constructor(t,e){if(Vi(this,"client",void 0),Vi(this,"commandContext",void 0),Vi(this,"workflowManager",void 0),Vi(this,"isReadOnly",void 0),Vi(this,"renderableScenes",[]),Vi(this,"renderableSceneCallbacks",[]),Vi(this,"debouncedSavedDesignUpdate",WA((async()=>{await Ki.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Vi(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||!!e.readOnly,this.workflowManager=new Di(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 ft.getShadowGraphqlClient().mutate({mutation:Gn,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},l=this.commandContext.getLayoutById(c.layoutState.layout.id),B=i.getContext("2d");if(!B)throw new ct("Failed to obtain 2D context for preview image creation");const w=R(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=jA.renderToStaticMarkup(w),E=await zA.from(B,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await E.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 Gi.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:D.Bulk,stepName:"Bulk",stepTitle:A?.stepTitle??"workflow.steps.bulk.title",helpText:A?.helpText,data:{aspects:Jn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Gi.get(this.getWorkflowManager(),t)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Gi.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Gi.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=>Gi.get(this.getWorkflowManager(),A)))}async attachCustomerDetails(A){return this.assignCustomerDetails({emailAddress:A.email})}async assignCustomerDetails(A){const t=(await ft.getShadowGraphqlClient().mutate({mutation:Fi,variables:{id:this.getWorkflowManager().getTransaction().id,details:A,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((t=>t.customer?.emailAddress===A.emailAddress));if(t?.customer){this.getWorkflowManager().setTransactionCustomer(t.customer);const A=wt.getMap("transactionCustomerIds")||new Map;A.set(this.getWorkflowManager().getTransaction().id,t.customer.id),wt.setMap("transactionCustomerIds",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 ot("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await Ki.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 Ki.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new ot("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new Ea({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new ot("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0)}async onDesignFinished(A){return Ti(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,A||(()=>{}),(A=>this.updateVariationRecords(A)),this.workflowManager.getVariationRecords(),(A=>this.createPreviewImage(A)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(A){return A.type!==D.SilentIllustration&&A.type!==D.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}}const Xi=qA`
492
492
  query GetBundle($id: String!) {
493
493
  bundles(ids: [$id]) {
494
494
  id
@@ -501,6 +501,19 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
501
501
  }
502
502
  }
503
503
  `,qi=qA`
504
+ query GetBundleStakeholders($id: String!) {
505
+ bundles(ids: [$id]) {
506
+ id
507
+ bundleStakeholders {
508
+ id
509
+ customer {
510
+ id
511
+ }
512
+ type
513
+ }
514
+ }
515
+ }
516
+ `,Zi=qA`
504
517
  mutation CreateBundle($configurationId: String!) {
505
518
  bundleCreate(configurationId: $configurationId) {
506
519
  id
@@ -509,25 +522,31 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
509
522
  }
510
523
  }
511
524
  }
512
- `,Zi=qA`
525
+ `,$i=qA`
513
526
  mutation BundleAddTransaction($id: String!, $transactionId: String!) {
514
527
  bundleAddTransaction(id: $id, transactionId: $transactionId) {
515
528
  id
516
529
  }
517
530
  }
518
- `,$i=qA`
531
+ `,_i=qA`
519
532
  mutation BundleRemoveTransaction($id: String!, $transactionId: String!) {
520
533
  bundleRemoveTransaction(id: $id, transactionId: $transactionId) {
521
534
  id
522
535
  }
523
536
  }
524
- `;qA`
537
+ `,Aa=qA`
525
538
  mutation BundleAddStakeholder($id: String!, $details: CustomerDetailsInput!) {
526
539
  bundleAddStakeholder(id: $id, details: $details) {
527
540
  id
528
541
  }
529
542
  }
530
- `;function _i(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 Aa{constructor(A,t){_i(this,"client",void 0),_i(this,"id",void 0),_i(this,"workflowExperiences",[]),this.client=A,this.id=t}getClient(){return this.client}getId(){return this.id}hasGlobalProperties(){throw new Error("Method not implemented.")}getGlobalProperties(){throw new Error("Method not implemented.")}async addWorkflowExperience(A){const t=A.getWorkflowManager().getTransaction().id;if(this.workflowExperiences.find((A=>A.getWorkflowManager().getTransaction().id===t)))throw new Error("Unable to add transaction to bundle - Already Exists!");await ft.getShadowGraphqlClient().mutate({mutation:Zi,variables:{id:this.id,transactionId:t}}),this.workflowExperiences.push(A)}async removeWorkflowExperience(A){const t=this.workflowExperiences.indexOf(A);if(!(t>-1))throw new Error("Unable to remove workflow experience from bundle - Not Found!");await ft.getShadowGraphqlClient().mutate({mutation:$i,variables:{id:this.id,transactionId:A.getWorkflowManager().getTransaction().id}}),this.workflowExperiences.splice(t,1)}sortWorkflowExperiences(A){this.workflowExperiences=this.workflowExperiences.sort(A)}getWorkflowExperienceCount(){return this.workflowExperiences.length}}function ta(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 ea=IA`
543
+ `,ta=qA`
544
+ mutation BundleUpdateStakeholders($id: String!, $input: [BundleStakeholderInput!]!) {
545
+ bundleUpdateStakeholders(id: $id, input: $input) {
546
+ id
547
+ }
548
+ }
549
+ `;function ea(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 na{constructor(A,t){ea(this,"client",void 0),ea(this,"id",void 0),ea(this,"workflowExperiences",[]),this.client=A,this.id=t}getClient(){return this.client}getId(){return this.id}hasGlobalProperties(){throw new Error("Method not implemented.")}getGlobalProperties(){throw new Error("Method not implemented.")}async addWorkflowExperience(A){const t=A.getWorkflowManager().getTransaction().id;if(this.workflowExperiences.find((A=>A.getWorkflowManager().getTransaction().id===t)))throw new Error("Unable to add transaction to bundle - Already Exists!");await ft.getShadowGraphqlClient().mutate({mutation:$i,variables:{id:this.id,transactionId:t}}),this.workflowExperiences.push(A)}async removeWorkflowExperience(A){const t=this.workflowExperiences.indexOf(A);if(!(t>-1))throw new Error("Unable to remove workflow experience from bundle - Not Found!");await ft.getShadowGraphqlClient().mutate({mutation:_i,variables:{id:this.id,transactionId:A.getWorkflowManager().getTransaction().id}}),this.workflowExperiences.splice(t,1)}sortWorkflowExperiences(A){this.workflowExperiences=this.workflowExperiences.sort(A)}getWorkflowExperienceCount(){return this.workflowExperiences.length}async addStakeholder(A,t){await ft.getShadowGraphqlClient().mutate({mutation:Aa,variables:{id:this.id,details:A,type:t||ae.Owner}})}async updateStakeholders(A){await ft.getShadowGraphqlClient().mutate({mutation:ta,variables:{id:this.id,input:A}})}async getAllStakeholders(){const A=await ft.getShadowGraphqlClient().query({query:qi,errorPolicy:"all",variables:{id:this.id}});if(!A.data.bundles||0===A.data.bundles.length)throw new Error("Bundle not found!");return A.data.bundles[0].bundleStakeholders||[]}}function ia(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 aa=IA`
531
550
  ${Mt}
532
551
  ${Yt}
533
552
  ${Pt}
@@ -1042,12 +1061,14 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1042
1061
  }
1043
1062
  }
1044
1063
  }
1045
- `,na=IA`
1064
+ `,oa=IA`
1046
1065
  query GetTransactionForPartner($id: String!) {
1047
1066
  transactions(ids: [$id]) {
1048
1067
  id
1068
+ bundle {
1069
+ id
1070
+ }
1049
1071
  customLogoLink
1050
- designName
1051
1072
  isOrdered
1052
1073
  product {
1053
1074
  id
@@ -1055,11 +1076,9 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1055
1076
  id
1056
1077
  }
1057
1078
  }
1058
- workflowId
1059
- workflowViewerReadOnlyLink
1060
1079
  }
1061
1080
  }
1062
- `,ia=IA`
1081
+ `,ra=IA`
1063
1082
  ${Mt}
1064
1083
  query GetWorkflowForTheme($id: String!) {
1065
1084
  workflow(id: $id) {
@@ -1081,21 +1100,21 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1081
1100
  }
1082
1101
  }
1083
1102
  }
1084
- `,aa=IA`
1103
+ `,sa=IA`
1085
1104
  query GetCustomer($emailAddress: String!) {
1086
1105
  customer(emailAddress: [$emailAddress]) {
1087
1106
  id
1088
1107
  emailAddress
1089
1108
  }
1090
1109
  }
1091
- `,oa=IA`
1110
+ `,ca=IA`
1092
1111
  mutation CustomerCreate($details: CustomerDetailsInput!) {
1093
1112
  customerCreate(details: $details) {
1094
1113
  id
1095
1114
  emailAddress
1096
1115
  }
1097
1116
  }
1098
- `,ra=IA`
1117
+ `,ga=IA`
1099
1118
  mutation CustomerAuthenticate($loginToken: String!) {
1100
1119
  customerAuthenticate(loginToken: $loginToken) {
1101
1120
  id
@@ -1105,17 +1124,25 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1105
1124
  type
1106
1125
  transaction {
1107
1126
  id
1108
- designName
1109
- workflowViewerReadOnlyLink
1127
+ }
1128
+ }
1129
+ bundleStakeholders {
1130
+ id
1131
+ type
1132
+ bundle {
1133
+ id
1134
+ transactions {
1135
+ id
1136
+ }
1110
1137
  }
1111
1138
  }
1112
1139
  }
1113
1140
  }
1114
- `,sa=IA`
1141
+ `,la=IA`
1115
1142
  mutation CustomerGenerateVerificationCode($emailAddress: String!) {
1116
1143
  customerGenerateVerificationCode(emailAddress: $emailAddress)
1117
1144
  }
1118
- `,ca=IA`
1145
+ `,Ba=IA`
1119
1146
  mutation CustomerVerifyCode($emailAddress: String!, $verificationCode: String!) {
1120
1147
  customerVerifyCode(
1121
1148
  emailAddress: $emailAddress
@@ -1132,11 +1159,19 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1132
1159
  type
1133
1160
  transaction {
1134
1161
  id
1135
- designName
1136
- workflowViewerReadOnlyLink
1162
+ }
1163
+ }
1164
+ bundleStakeholders {
1165
+ id
1166
+ type
1167
+ bundle {
1168
+ id
1169
+ transactions {
1170
+ id
1171
+ }
1137
1172
  }
1138
1173
  }
1139
1174
  }
1140
1175
  }
1141
- `,ga=async A=>{const t=(await ft.getShadowGraphqlClient().query({query:ea,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}})).data.workflow;return t.steps.forEach((A=>{delete A.data.__typename})),t},la=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:F(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class Ba{constructor(A){var t;ta(this,"options",void 0),ta(this,"initialized",void 0),ta(this,"experienceOptions",void 0),ta(this,"currencyCode",void 0),ta(this,"customer",void 0),ta(this,"updateTransactionState",(async A=>{try{return ft.getShadowGraphqlClient().mutate({...A,mutation:Un})}catch(A){throw console.error(A),new st("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A,this.options.applicationKey&&(t=this.options.applicationKey,It=t)}getAssetManager(){return Ht}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateTransactionFromLocalStorage(A){const t=ft.getShadowGraphqlClient(),e=await t.query({query:na,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${A}`);const n=e.data.transactions[0],i=n.product?.partner?.id;if(!i)throw new Error(`Unable to read transaction: ${A}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const a=wt.getMap("transactionOwnerIds");if(a?.has(A)){const t=a.get(A);return Ct(t),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const o=wt.getMap("transactionCustomerIds");if(o?.has(A)){const t=o.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}const r=(await t.query({query:ia,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(A){const t=wt.getMap("transactionCustomerIds");t?.has(A)&&(t.delete(A),wt.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(A){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return t.type}async getOrCreateCustomer(A){this.customer=void 0;const t=ft.getShadowGraphqlClient(),e=(await t.query({query:aa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A}})).data.customer;if(!e.id){const e=(await t.mutate({mutation:oa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:A}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(A){const t=ft.getShadowGraphqlClient(),e=wt.getMap("customerTokens");if(!e?.has(A))return!1;const n=e.get(A);if(!n)return!1;const i=(await t.mutate({mutation:ra,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!i&&(pt(n),this.customer=i,!0)}async generateVerificationCode(A){await ft.getShadowGraphqlClient().mutate({mutation:sa,variables:{emailAddress:A}})}async verifyCode(A,t){const e=await ft.getShadowGraphqlClient().mutate({mutation:ca,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A,verificationCode:t}});if(e.data?.customerVerifyCode.loginToken){if(!e.data.customerVerifyCode.partner?.id)throw new Error(`Unable to find customer: ${A}`);const t=wt.getMap("customerTokens")||new Map;return t.set(e.data.customerVerifyCode.id,e.data.customerVerifyCode.loginToken),wt.setMap("customerTokens",t),pt(e.data.customerVerifyCode.loginToken),this.customer={...e.data.customerVerifyCode,loginToken:void 0},!0}return!1}async getNewBundle(){const A=(await ft.getShadowGraphqlClient().mutate({mutation:qi})).data?.bundleCreate;if(!A)throw new Error("Unable to create bundle");mt(A.bundleOwnerId);const t=wt.getMap("bundleOwnerIds")||new Map;return t.set(A.id,A.bundleOwnerId),wt.setMap("bundleOwnerIds",t),new Aa(this,A.id)}async getExistingBundle(A){const t=await ft.getShadowGraphqlClient().query({query:Xi,variables:{id:A}});if(!t.data?.bundles||0===t.data?.bundles.length||!t.data?.bundles[0])throw new Error(`Unable to find bundle: ${A}`);const e=t.data?.bundles[0],n=wt.getMap("bundleOwnerIds");return n?.has(e.id)&&mt(n.get(e.id)),new Aa(this,e.id)}async getWorkflowExperience(A,t,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(A,t,e);const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},{transaction:a,workflow:o,readOnly:r}=await(async()=>{const A=ft.getShadowGraphqlClient();if(await A.resetStore(),"transaction"===n.type){const{transactionId:t,readOnly:e}=n,i=await A.query({query:Hn,variables:{id:t},errorPolicy:"all"});if(!i.data?.transactions||0===i.data.transactions.length)throw new st("Existing transaction not found.");const a=i.data?.transactions[0];if(!a.workflowId)throw new st("Existing transaction has no workflow ID.");const o=await ga(a.workflowId);if(!a.product)throw new st("Failed to load transaction, product not available.");return{transaction:a,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const t=async()=>{const t="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await A.mutate({mutation:Nn,variables:{...t,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const i=e.data.transactionCreate;if(!i.product)throw new st("Failed to create transaction, product not available.");return i},e=ga(n.workflowId),[i,a]=await Promise.all([t(),e]);return{transaction:i,workflow:a}}throw new st("No workflow ID provided.")})();if(this.currencyCode=a.product.partner?.currencyCode,this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:r?async()=>{throw new ot("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o},"transaction"===n.type&&a.workflowState){const A=JSON.parse(a.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else if(!r&&n.workflowState){const A=JSON.parse(n.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=la(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=e&&e(o),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService),"transaction"!==n.type){const A=wt.getMap("transactionOwnerIds")||new Map;A.set(a.id,a.transactionOwnerId),Ct(a.transactionOwnerId||""),wt.setMap("transactionOwnerIds",A)}else{const A=(wt.getMap("transactionOwnerIds")||new Map).get(a.id);A&&Ct(A)}this.initialized=!0;const s=new Wi(this,this.experienceOptions);return await s.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await s.attachCustomerDetails({email:this.customer.emailAddress}),s}async initFromIntegrationProduct(A){if(""===A)throw new st("No integration product ID provided.");const t=ft.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:Nn,variables:{integrationProductId:A,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new st("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const i=wt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Ct(n.transactionOwnerId||""),wt.setMap("transactionOwnerIds",i),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new st("No transaction ID provided.");const e=ft.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new ot("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=wt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Ct(i);const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Rn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new st("Failed to read transaction.");if(!i.product)throw new st("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Ct(i.transactionOwnerId),wt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new st("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(A,t,e){if(!this.initialized||!this.experienceOptions)throw new st("Cannot launch experience: Not initialized.");const n=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const A=await ga(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new Wi(this,this.experienceOptions);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const i=ft.getShadowGraphqlClient().mutate({mutation:Pn,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),a=ga(A);if(await Promise.all([i,a]),this.experienceOptions.workflow=await a,t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=la(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await a),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const o=new Wi(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new st("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function wa(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 da{constructor(){wa(this,"getProduct",void 0),wa(this,"getCommandContext",void 0),wa(this,"getAllLayoutData",void 0),wa(this,"getMetadata",void 0),wa(this,"getWorkflowMetadata",void 0),wa(this,"getStepStorage",void 0),wa(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function Ea(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}let ha;var Qa;(Qa=ha||(ha={})).SelectFrame="SelectFrame",Qa.SelectImage="SelectImage",Qa.Position="Position";class Ca extends yi{constructor(A,t){super(A,t),Ea(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return ii.selectVariant(this.step,A.getResource(),t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return ii.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?ha.SelectFrame:t||e||this.getImageData()?ha.Position:ha.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const ua=A=>{const t=kA(null),e=kA(void 0),[n,i]=NA(void 0),{addEvent:a,removeEvent:o,updateEvent:r,eventCache:s}=Jt(),[c,g]=NA(!1),[l,B]=NA(!1),{state:w,uiDispatcher:d}=qt(),E=RA((A=>{const t=A;d(new Xt({zoom:Math.max(.1,Math.min(t,w.maxZoom))}))}),[d,w.maxZoom]),h=RA((A=>{o(A),1===s.length&&(e.current=void 0),2===s.length&&i(void 0);"touch"===A.pointerType&&s.length>1&&s.length-1==1&&(B(!1),g(!1))}),[o,s.length]),Q=RA((A=>{a(A);"touch"===A.pointerType&&1===s.length&&(d(new Xt({selectedElement:void 0})),B(!0),g(!0))}),[a,s.length,d]),C=RA((A=>{r(A);const t=1===s.length&&"touch"!==s[0].pointerType,a=2===s.length&&"touch"===s[0].pointerType;if(c&&a){const[A,t]=s,e=Math.abs(A.clientX-t.clientX),a=n;a&&E(w.zoom-.0055*(a-e)),i(e)}if(l&&(t||a)&&A.isPrimary){const t=(e?.current?.x||A.screenX)-A.screenX,n=(e?.current?.y||A.screenY)-A.screenY;d(new Xt({selectedElement:void 0,xTranslation:w.xTranslation-t/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}A.isPrimary&&(e.current={x:A.screenX,y:A.screenY})}),[r,s,c,l,n,E,w.zoom,w.xTranslation,w.yTranslation,d]),u=RA((A=>{c&&E(w.zoom-.035*Math.sign(A.deltaY))}),[E,w.zoom,c]);UA((()=>{if(!t.current||0===s.length)return;const A=s[0].pointerId,e=t.current.hasPointerCapture(A);l&&!e&&t.current.setPointerCapture(A),!l&&e&&t.current.releasePointerCapture(A)}),[t,l,s]),be([" "],(()=>{B(!0),d(new Xt({selectedElement:void 0}))}),(()=>B(!1))),be(["Control"],(()=>g(!0)),(()=>g(!1)));const m=GA((()=>({cursor:l&&0===s.length?"grab":l&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[l,c,s]);return bA("div",{ref:t,className:"transform-wrapper",onWheel:u,onPointerDown:Q,onPointerUp:h,onPointerCancel:h,onPointerLeave:h,onPointerMove:C,style:m,children:A.children})};export{Ba as SpiffCommerceClient,A as CommandContext,Et as spiffCoreConfiguration,Te as PromiseQueue,Oe as QueueablePromise,da as MockWorkflowManager,Ci as InformationMessageType,yi as StepHandle,Pi as TextStepHandle,Ca as FrameStepHandle,xi as BulkStepHandle,Ui as ShapeStepHandle,Si as IllustrationStepHandle,vi as MaterialStepHandle,Ni as ModelStepHandle,Ri as PictureStepHandle,Hi as QuestionStepHandle,_t as BulkPriceCalculationStrategy,Ii as Variant,At as OptionNotFoundError,tt as LayoutNotFoundError,et as AssetNotFoundError,nt as ResourceNotFoundError,it as MisconfigurationError,rt as ParseError,ot as UnhandledBehaviorError,Ht as assetService,Ki as designService,Ti as createDesign,kt as optionService,wt as persistenceService,ft as graphQlManager,ce as toast,qn as FrameService,Wn as getBoundedOffsets,ii as frameStepService,ri as modelStepService,oi as materialStepService,li as shapeStepService,gi as questionStepService,ei as digitalContentStepService,si as moduleStepService,ci as pictureStepService,hi as textStepService,ai as illustrationStepService,Zt as ProductCameraRig,ha as FrameStep,te as ConversionLocation,ne as ConversionDataType,ga as getWorkflow,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,B as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,E as LayoutElementType,h as MoveCommand,Q as ResizeCommand,C as RotateCommand,u as SendBackwardsCommand,ae as StakeholderType,m as StepAspectType,D as StepType,p as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,x as generateSVGWithUnknownColors,S as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,H as loadFontFromDataUrl,U as loadFontFromExternalUrl,P as determineCorrectFontSizeAndLines,G as patternImageDataCache,Dn as generateCommands,k as registerJSDOM,Pe as minZoom,vn as AdvancedEditor,ua as TransformWrapper,Sn as EditorCore,Lt as useLayouts,qt as useEditorState,ke as useEditorInteraction,be as useShortcutCombination,Kt as commandReducer,jt as getDefaultState,bt as CommandContextContext,Wt as AdvancedEditorStateProvider,Vt as AdvancedEditorContext,Xt as UICommand,Tt as EditorSubMenu,ge as ElementEventType,Be as KeyEvent,Jn as gatherVaryingStepAspects};
1176
+ `,wa=async A=>{const t=(await ft.getShadowGraphqlClient().query({query:aa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}})).data.workflow;return t.steps.forEach((A=>{delete A.data.__typename})),t},da=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:F(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class Ea{constructor(A){var t;ia(this,"options",void 0),ia(this,"initialized",void 0),ia(this,"experienceOptions",void 0),ia(this,"currencyCode",void 0),ia(this,"customer",void 0),ia(this,"updateTransactionState",(async A=>{try{return ft.getShadowGraphqlClient().mutate({...A,mutation:Un})}catch(A){throw console.error(A),new st("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A,this.options.applicationKey&&(t=this.options.applicationKey,It=t)}getAssetManager(){return Ht}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(A){const t=wt.getMap("bundleOwnerIds");if(t?.has(A)){const e=t.get(A);return mt(e),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const e=wt.getMap("bundleCustomerIds");if(e?.has(A)){const t=e.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.bundleStakeholders?.find((t=>t.bundle?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(A){const t=ft.getShadowGraphqlClient(),e=await t.query({query:oa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${A}`);const n=e.data.transactions[0],i=n.product?.partner?.id;if(!i)throw new Error(`Unable to read transaction: ${A}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const a=wt.getMap("transactionOwnerIds");if(a?.has(A)){const t=a.get(A);return Ct(t),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const o=wt.getMap("transactionCustomerIds");if(o?.has(A)){const t=o.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.bundleStakeholders?.find((t=>t.bundle?.transactions?.some((t=>t.id===A))))||this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}const r=(await t.query({query:ra,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(A){const t=wt.getMap("transactionCustomerIds");t?.has(A)&&(t.delete(A),wt.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(A){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return t.type}async getOrCreateCustomer(A){this.customer=void 0;const t=ft.getShadowGraphqlClient(),e=(await t.query({query:sa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A}})).data.customer;if(!e.id){const e=(await t.mutate({mutation:ca,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:A}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(A){const t=ft.getShadowGraphqlClient(),e=wt.getMap("customerTokens");if(!e?.has(A))return!1;const n=e.get(A);if(!n)return!1;const i=(await t.mutate({mutation:ga,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!i&&(pt(n),this.customer=i,!0)}async generateVerificationCode(A){await ft.getShadowGraphqlClient().mutate({mutation:la,variables:{emailAddress:A}})}async verifyCode(A,t){const e=(await ft.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A,verificationCode:t}})).data?.customerVerifyCode;if(e?.loginToken){if(!e.partner?.id)throw new Error(`Unable to find customer: ${A}`);const t=wt.getMap("customerTokens")||new Map;return t.set(e.id,e.loginToken),wt.setMap("customerTokens",t),pt(e.loginToken),this.customer={...e,loginToken:void 0},!0}return!1}async getNewBundle(){const A=(await ft.getShadowGraphqlClient().mutate({mutation:Zi})).data?.bundleCreate;if(!A)throw new Error("Unable to create bundle");mt(A.bundleOwnerId);const t=wt.getMap("bundleOwnerIds")||new Map;return t.set(A.id,A.bundleOwnerId),wt.setMap("bundleOwnerIds",t),new na(this,A.id)}async getExistingBundle(A){const t=await ft.getShadowGraphqlClient().query({query:Xi,variables:{id:A}});if(!t.data?.bundles||0===t.data?.bundles.length||!t.data?.bundles[0])throw new Error(`Unable to find bundle: ${A}`);const e=t.data?.bundles[0],n=wt.getMap("bundleOwnerIds");return n?.has(e.id)&&mt(n.get(e.id)),new na(this,e.id)}async getWorkflowExperience(A,t,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(A,t,e);const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},{transaction:a,workflow:o,readOnly:r}=await(async()=>{const A=ft.getShadowGraphqlClient();if(await A.resetStore(),"transaction"===n.type){const{transactionId:t,readOnly:e}=n,i=await A.query({query:Hn,variables:{id:t},errorPolicy:"all"});if(!i.data?.transactions||0===i.data.transactions.length)throw new st("Existing transaction not found.");const a=i.data?.transactions[0];if(!a.workflowId)throw new st("Existing transaction has no workflow ID.");const o=await wa(a.workflowId);if(!a.product)throw new st("Failed to load transaction, product not available.");return{transaction:a,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const t=async()=>{const t="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await A.mutate({mutation:Nn,variables:{...t,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const i=e.data.transactionCreate;if(!i.product)throw new st("Failed to create transaction, product not available.");return i},e=wa(n.workflowId),[i,a]=await Promise.all([t(),e]);return{transaction:i,workflow:a}}throw new st("No workflow ID provided.")})();if(this.currencyCode=a.product.partner?.currencyCode,this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:r?async()=>{throw new ot("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o},"transaction"===n.type&&a.workflowState){const A=JSON.parse(a.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else if(!r&&n.workflowState){const A=JSON.parse(n.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=da(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=e&&e(o),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService),"transaction"!==n.type){const A=wt.getMap("transactionOwnerIds")||new Map;A.set(a.id,a.transactionOwnerId),Ct(a.transactionOwnerId||""),wt.setMap("transactionOwnerIds",A)}else{const A=(wt.getMap("transactionOwnerIds")||new Map).get(a.id);A&&Ct(A)}this.initialized=!0;const s=new Wi(this,this.experienceOptions);return await s.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await s.attachCustomerDetails({email:this.customer.emailAddress}),s}async initFromIntegrationProduct(A){if(""===A)throw new st("No integration product ID provided.");const t=ft.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:Nn,variables:{integrationProductId:A,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new st("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const i=wt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Ct(n.transactionOwnerId||""),wt.setMap("transactionOwnerIds",i),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new st("No transaction ID provided.");const e=ft.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new ot("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=wt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Ct(i);const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Rn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new st("Failed to read transaction.");if(!i.product)throw new st("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Ct(i.transactionOwnerId),wt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new st("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(A,t,e){if(!this.initialized||!this.experienceOptions)throw new st("Cannot launch experience: Not initialized.");const n=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const A=await wa(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new Wi(this,this.experienceOptions);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const i=ft.getShadowGraphqlClient().mutate({mutation:Pn,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),a=wa(A);if(await Promise.all([i,a]),this.experienceOptions.workflow=await a,t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=da(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await a),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const o=new Wi(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new st("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function ha(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 Qa{constructor(){ha(this,"getProduct",void 0),ha(this,"getCommandContext",void 0),ha(this,"getAllLayoutData",void 0),ha(this,"getMetadata",void 0),ha(this,"getWorkflowMetadata",void 0),ha(this,"getStepStorage",void 0),ha(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function Ca(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}let ua;var ma;(ma=ua||(ua={})).SelectFrame="SelectFrame",ma.SelectImage="SelectImage",ma.Position="Position";class Da extends yi{constructor(A,t){super(A,t),Ca(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return ii.selectVariant(this.step,A.getResource(),t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return ii.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?ua.SelectFrame:t||e||this.getImageData()?ua.Position:ua.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const pa=A=>{const t=kA(null),e=kA(void 0),[n,i]=NA(void 0),{addEvent:a,removeEvent:o,updateEvent:r,eventCache:s}=Jt(),[c,g]=NA(!1),[l,B]=NA(!1),{state:w,uiDispatcher:d}=qt(),E=RA((A=>{const t=A;d(new Xt({zoom:Math.max(.1,Math.min(t,w.maxZoom))}))}),[d,w.maxZoom]),h=RA((A=>{o(A),1===s.length&&(e.current=void 0),2===s.length&&i(void 0);"touch"===A.pointerType&&s.length>1&&s.length-1==1&&(B(!1),g(!1))}),[o,s.length]),Q=RA((A=>{a(A);"touch"===A.pointerType&&1===s.length&&(d(new Xt({selectedElement:void 0})),B(!0),g(!0))}),[a,s.length,d]),C=RA((A=>{r(A);const t=1===s.length&&"touch"!==s[0].pointerType,a=2===s.length&&"touch"===s[0].pointerType;if(c&&a){const[A,t]=s,e=Math.abs(A.clientX-t.clientX),a=n;a&&E(w.zoom-.0055*(a-e)),i(e)}if(l&&(t||a)&&A.isPrimary){const t=(e?.current?.x||A.screenX)-A.screenX,n=(e?.current?.y||A.screenY)-A.screenY;d(new Xt({selectedElement:void 0,xTranslation:w.xTranslation-t/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}A.isPrimary&&(e.current={x:A.screenX,y:A.screenY})}),[r,s,c,l,n,E,w.zoom,w.xTranslation,w.yTranslation,d]),u=RA((A=>{c&&E(w.zoom-.035*Math.sign(A.deltaY))}),[E,w.zoom,c]);UA((()=>{if(!t.current||0===s.length)return;const A=s[0].pointerId,e=t.current.hasPointerCapture(A);l&&!e&&t.current.setPointerCapture(A),!l&&e&&t.current.releasePointerCapture(A)}),[t,l,s]),be([" "],(()=>{B(!0),d(new Xt({selectedElement:void 0}))}),(()=>B(!1))),be(["Control"],(()=>g(!0)),(()=>g(!1)));const m=GA((()=>({cursor:l&&0===s.length?"grab":l&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[l,c,s]);return bA("div",{ref:t,className:"transform-wrapper",onWheel:u,onPointerDown:Q,onPointerUp:h,onPointerCancel:h,onPointerLeave:h,onPointerMove:C,style:m,children:A.children})};export{Ea as SpiffCommerceClient,A as CommandContext,Et as spiffCoreConfiguration,Te as PromiseQueue,Oe as QueueablePromise,Qa as MockWorkflowManager,Ci as InformationMessageType,yi as StepHandle,Pi as TextStepHandle,Da as FrameStepHandle,xi as BulkStepHandle,Ui as ShapeStepHandle,Si as IllustrationStepHandle,vi as MaterialStepHandle,Ni as ModelStepHandle,Ri as PictureStepHandle,Hi as QuestionStepHandle,_t as BulkPriceCalculationStrategy,Ii as Variant,At as OptionNotFoundError,tt as LayoutNotFoundError,et as AssetNotFoundError,nt as ResourceNotFoundError,it as MisconfigurationError,rt as ParseError,ot as UnhandledBehaviorError,Ht as assetService,Ki as designService,Ti as createDesign,kt as optionService,wt as persistenceService,ft as graphQlManager,ce as toast,qn as FrameService,Wn as getBoundedOffsets,ii as frameStepService,ri as modelStepService,oi as materialStepService,li as shapeStepService,gi as questionStepService,ei as digitalContentStepService,si as moduleStepService,ci as pictureStepService,hi as textStepService,ai as illustrationStepService,Zt as ProductCameraRig,ua as FrameStep,te as ConversionLocation,ne as ConversionDataType,wa as getWorkflow,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,B as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,E as LayoutElementType,h as MoveCommand,Q as ResizeCommand,C as RotateCommand,u as SendBackwardsCommand,ae as StakeholderType,m as StepAspectType,D as StepType,p as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,x as generateSVGWithUnknownColors,S as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,H as loadFontFromDataUrl,U as loadFontFromExternalUrl,P as determineCorrectFontSizeAndLines,G as patternImageDataCache,Dn as generateCommands,k as registerJSDOM,Pe as minZoom,vn as AdvancedEditor,pa as TransformWrapper,Sn as EditorCore,Lt as useLayouts,qt as useEditorState,ke as useEditorInteraction,be as useShortcutCombination,Kt as commandReducer,jt as getDefaultState,bt as CommandContextContext,Wt as AdvancedEditorStateProvider,Vt as AdvancedEditorContext,Xt as UICommand,Tt as EditorSubMenu,ge as ElementEventType,Be as KeyEvent,Jn as gatherVaryingStepAspects};
1142
1177
  //# sourceMappingURL=module.js.map
package/dist/types.d.ts CHANGED
@@ -985,6 +985,7 @@ export interface Customer {
985
985
  loginToken?: string;
986
986
  partner?: Partner;
987
987
  stakeholders?: Stakeholder[];
988
+ bundleStakeholders?: BundleStakeholder[];
988
989
  }
989
990
  export interface CustomerDetailsInput {
990
991
  emailAddress: string;
@@ -1004,6 +1005,23 @@ export interface Stakeholder {
1004
1005
  transaction?: Transaction;
1005
1006
  customer?: Customer;
1006
1007
  }
1008
+ interface Bundle {
1009
+ id?: string;
1010
+ bundleOwnerId?: string;
1011
+ bundleStakeholders?: BundleStakeholder[];
1012
+ partner?: Partner;
1013
+ transactions?: Transaction[];
1014
+ }
1015
+ interface BundleStakeholder {
1016
+ id: string;
1017
+ bundle?: Bundle;
1018
+ customer?: Customer;
1019
+ type?: StakeholderType;
1020
+ }
1021
+ interface BundleStakeholderInput {
1022
+ type: StakeholderType;
1023
+ customerDetails: CustomerDetailsInput;
1024
+ }
1007
1025
  interface StorageService {
1008
1026
  /**
1009
1027
  * Get a value.
@@ -1812,7 +1830,7 @@ export interface WorkflowExperience {
1812
1830
  /**
1813
1831
  * A bundle serves as a container for a set of workflow experience.
1814
1832
  */
1815
- interface Bundle {
1833
+ interface _Bundle1 {
1816
1834
  /**
1817
1835
  * @returns The client that this bundle is associated with.
1818
1836
  */
@@ -1848,6 +1866,21 @@ interface Bundle {
1848
1866
  * @returns The number of workflow experiences in this bundle.
1849
1867
  */
1850
1868
  getWorkflowExperienceCount(): number;
1869
+ /**
1870
+ * Add a stakeholder to this bundle. If the stakeholder already exists, it will be updated. Write access to the bundle is required.
1871
+ * @param customerDetails The details of the customer to add. The emailAddress field is required.
1872
+ * @param stakeholderType The type of stakeholder to add. Defaults to Owner.
1873
+ */
1874
+ addStakeholder(customerDetails: CustomerDetailsInput, stakeholderType?: StakeholderType): Promise<void>;
1875
+ /**
1876
+ * Updates all stakeholders associated with this bundle. Write access to the bundle is required.
1877
+ * @param stakeholders An array of stakeholders to update. Unknown stakeholders will be added, and absent stakeholders will be removed.
1878
+ */
1879
+ updateStakeholders(stakeholders: BundleStakeholderInput[]): Promise<void>;
1880
+ /**
1881
+ * Retrieves all stakeholders associated with this bundle.
1882
+ */
1883
+ getAllStakeholders(): Promise<BundleStakeholder[]>;
1851
1884
  }
1852
1885
  export const getWorkflow: (id: string) => Promise<_Workflow1>;
1853
1886
  /**
@@ -1910,6 +1943,15 @@ export class SpiffCommerceClient {
1910
1943
  */
1911
1944
  getAssetManager(): AssetManager;
1912
1945
  getCurrencyCode(): string;
1946
+ /**
1947
+ * Attempts to load persisted authentication information from local storage, and authenticate with the Spiff Commerce API.
1948
+ * @param bundleId The ID of the bundle you intend to load.
1949
+ * @returns An object containing the success status of the authentication attempt, and the type of stakeholder when successful.
1950
+ */
1951
+ authenticateBundleFromLocalStorage(bundleId: string): Promise<{
1952
+ stakeholderType?: StakeholderType;
1953
+ success: boolean;
1954
+ }>;
1913
1955
  /**
1914
1956
  * Attempts to load persisted authentication information from local storage, and authenticate with the Spiff Commerce API.
1915
1957
  * @param transactionId The ID of the transaction that the user is attempting to load.
@@ -1950,12 +1992,12 @@ export class SpiffCommerceClient {
1950
1992
  * @param configurationId The id of the configuration to be used for the bundle.
1951
1993
  * @returns A bundle to be used for grouping and operating on large amounts of workflow experiences.
1952
1994
  */
1953
- getNewBundle(): Promise<Bundle>;
1995
+ getNewBundle(): Promise<_Bundle1>;
1954
1996
  /**
1955
1997
  * Retrieves an existing bundle from the API, by id.
1956
1998
  * @returns A bundle to be used for grouping and operating on large amounts of workflow experiences.
1957
1999
  */
1958
- getExistingBundle(bundleId: string): Promise<Bundle>;
2000
+ getExistingBundle(bundleId: string): Promise<_Bundle1>;
1959
2001
  /**
1960
2002
  * Creates a new instance of WorkflowExperience. A high level wrapper for workflows.
1961
2003
  * @param workflowId The id of the workflow to be run. Deprecated: Provide options instead.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "11.2.0",
3
+ "version": "11.4.0",
4
4
  "description": "Core client API for interacting with the Spiff Commerce backend.",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/main.js",