@salla.sa/embedded-sdk 0.2.5 → 0.2.6

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.
@@ -425,34 +425,65 @@ declare interface LoadingSubModule {
425
425
 
426
426
  /** Result of addItem promise */
427
427
  declare interface NavItemAddResult {
428
+ value: string;
429
+ /**
430
+ * @deprecated Same string as `value`. Prefer `value` for update/remove/click handling.
431
+ */
428
432
  id: string;
433
+ }
434
+
435
+ /**
436
+ * One submenu row; must not include nested `children`.
437
+ */
438
+ export declare interface NavItemChildInput {
439
+ title: string;
429
440
  value: string;
441
+ url: string;
442
+ disabled?: boolean;
443
+ active?: boolean;
430
444
  }
431
445
 
432
446
  /** Callback when injected nav item is clicked */
433
447
  declare type NavItemClickCallback = (payload: {
434
- id: string;
435
448
  value: string;
436
449
  url: string;
450
+ /**
451
+ * @deprecated Same string as `value`.
452
+ */
453
+ id: string;
437
454
  }) => void;
438
455
 
439
- /** Input for injecting one host sub-navigation item */
440
- declare interface NavItemInput {
456
+ /** @alias NavItemNodeInput root add payload */
457
+ export declare type NavItemInput = NavItemNodeInput;
458
+
459
+ /**
460
+ * Sub-navigation node injected into the host sub-nav.
461
+ * Optional `children` renders as a single hover/click dropdown level (host UI).
462
+ * Nested children under a child are not supported.
463
+ */
464
+ export declare interface NavItemNodeInput {
441
465
  title: string;
442
466
  value: string;
443
467
  url: string;
444
468
  disabled?: boolean;
445
469
  active?: boolean;
470
+ /** One level of submenu items only; must not contain further `children`. */
471
+ children?: NavItemChildInput[];
446
472
  }
447
473
 
448
- /** Patch for an injected item (identified by opaque id from addItem response) */
474
+ /**
475
+ * Patch for an injected parent or child row.
476
+ * Identified by `value` (immutable). Optional `children` replaces the full
477
+ * dropdown list when patching a parent; ignored for child rows.
478
+ */
449
479
  declare interface NavItemPatchInput {
450
- id: string;
480
+ value: string;
451
481
  title?: string;
452
- value?: string;
453
482
  url?: string;
454
483
  disabled?: boolean;
455
484
  active?: boolean;
485
+ /** Parent only: replaces entire children list when set. */
486
+ children?: NavItemChildInput[];
456
487
  }
457
488
 
458
489
  /**
@@ -513,9 +544,9 @@ export declare interface NavModule {
513
544
  */
514
545
  onActionClick(callback: ActionClickCallback): Unsubscribe;
515
546
  /**
516
- * Inject one sub-navigation item beside API-driven items. Resolves with an
517
- * opaque `id` you must keep if you intend to update or remove the item later.
518
- * Rejects after 2s if the host does not acknowledge.
547
+ * Inject one sub-navigation item beside API-driven items. Resolves with the
548
+ * item's `value` (and deprecated `id` equal to `value`). Rejects after 2s if
549
+ * the host does not acknowledge.
519
550
  *
520
551
  * @example
521
552
  * ```typescript
@@ -524,36 +555,37 @@ export declare interface NavModule {
524
555
  * value: 'reports',
525
556
  * url: '/apps/installed/my-app/reports',
526
557
  * });
527
- * console.log(tab.id); // opaque id, store it
558
+ * console.log(tab.value); // use for update/remove
528
559
  * ```
529
560
  */
530
561
  addNavItem(item: NavItemInput): Promise<NavItemAddResult>;
531
562
  /**
532
- * Patch a previously injected item disable, rename, mark active, etc.
533
- * Unknown ids are silently ignored by the host.
563
+ * Patch a previously injected parent or child by `value` (unknown values are
564
+ * ignored by the host). Optional `children` on a parent replaces the full list.
534
565
  *
535
566
  * @example
536
567
  * ```typescript
537
- * embedded.nav.updateNavItem({ id: tab.id, disabled: true });
538
- * embedded.nav.updateNavItem({ id: tab.id, title: 'Updated title' });
568
+ * embedded.nav.updateNavItem({ value: 'reports', disabled: true });
569
+ * embedded.nav.updateNavItem({ value: 'reports', title: 'Updated title' });
539
570
  * ```
540
571
  */
541
572
  updateNavItem(item: NavItemPatchInput): void;
542
573
  /**
543
- * Remove an injected item by its opaque id (unknown ids are ignored).
574
+ * Remove an injected parent or child by its `value` (unknown values are ignored).
575
+ * Removing a parent removes its children.
544
576
  *
545
577
  * @example
546
578
  * ```typescript
547
- * embedded.nav.removeNavItem(tab.id);
579
+ * embedded.nav.removeNavItem('reports');
548
580
  * ```
549
581
  */
550
- removeNavItem(id: string): void;
582
+ removeNavItem(value: string): void;
551
583
  /**
552
584
  * Subscribe to clicks on injected sub-nav items from the merchant dashboard chrome.
553
585
  *
554
586
  * @example
555
587
  * ```typescript
556
- * const unsubscribe = embedded.nav.onNavItemClick(({ id, value, url }) => {
588
+ * const unsubscribe = embedded.nav.onNavItemClick(({ value, url }) => {
557
589
  * console.log('clicked tab', value, '->', url);
558
590
  * });
559
591
  * ```
package/dist/umd/index.js CHANGED
@@ -1,4 +1,4 @@
1
- (function(f,a){typeof exports=="object"&&typeof module<"u"?a(exports):typeof define=="function"&&define.amd?define(["exports"],a):(f=typeof globalThis<"u"?globalThis:f||self,a(f.SallaEmbeddedSDK={}))})(this,(function(f){"use strict";const a="embedded::",C={INIT:`${a}iframe.ready`,READY:`${a}ready`,DESTROY:`${a}destroy`},x={PROVIDE:`${a}context.provide`,THEME_CHANGE:`${a}theme.change`},p={LOADING:`${a}ui.loading`,BREADCRUMBS:`${a}ui.breadcrumbs`,TOAST:`${a}ui.toast`,CONFIRM:`${a}ui.confirm`,CONFIRM_RESPONSE:`${a}ui.confirm.response`},B={},k={REFRESH:`${a}auth.refresh`},v={NAVIGATE:`${a}page.navigate`,REDIRECT:`${a}page.redirect`,SET_TITLE:`${a}page.setTitle`},c={SET_ACTION:`${a}nav.setAction`,CLEAR_ACTION:`${a}nav.clearAction`,ACTION_CLICK:`${a}nav.actionClick`,ADD_ITEM:`${a}nav.addItem`,ADD_ITEM_RESPONSE:`${a}nav.addItem.response`,UPDATE_ITEM:`${a}nav.updateItem`,REMOVE_ITEM:`${a}nav.removeItem`,ITEM_CLICK:`${a}nav.itemClick`},b={CREATE:`${a}checkout.create`,RESPONSE:`${a}checkout.response`,GET_ADDONS:`${a}checkout.getAddons`,GET_ADDONS_RESPONSE:`${a}checkout.getAddons.response`,RESET_CACHE:`${a}checkout.resetCache`},I=B.version||"",X=1e4,W=["localhost","merchants.workers.dev","s.salla.sa",".salla.group",".salla.sa"],Y=new Set(["ar","he","fa","ur","ps","sd","yi"]);function Q(t){const e=(t??"ar").toLowerCase().split(/[-_]/)[0];return Y.has(e)?"rtl":"ltr"}let A={showVersion:!0,debug:!1};function J(t){A={...A,...t}}function q(t){return`%c${t}`}function P(t,e="#fff"){return`background-color: ${t}; color: ${e}; padding: 2px 6px; border-radius: 3px; font-weight: 500; font-size: 11px;`}function T(t,...e){if(t==="debug"&&!A.debug)return;const r=[],i=[];r.push(q("EmbeddedSDK")),i.push(P("#10b981","#fff")),A.showVersion&&(r.push(q(`v${I}`)),i.push(P("#6b7280","#fff")));const n=r.join("").trim();(console[t]||console.log)(n,...i,...e)}const o={log:(...t)=>{T("log",...t)},warn:(...t)=>{T("warn",...t)},error:(...t)=>{T("error",...t)},info:(...t)=>{T("info",...t)},debug:(...t)=>{T("debug",...t)}};function Z(t){try{const r=new URL(t).hostname;return W.some(i=>i.startsWith(".")?r.endsWith(i)||r===i.slice(1):r===i||r.startsWith(`${i}:`))}catch{return!1}}function ee(){return typeof window>"u"||window.parent===window?null:window.parent}function u(t,e,r="*",i,n){const s=ee();if(!s){o.warn("Not running in an iframe, cannot post to host");return}const d={event:t,payload:e||{},timestamp:Date.now(),source:"embedded-app",...i&&{requestId:i},metadata:{version:I}};s.postMessage(d,r)}const m=new Map;let R=!1;function z(t){if(process.env.NODE_ENV==="production"&&!Z(t.origin))return;const e=t.data;if(!e||typeof e.event!="string"||!e.payload||typeof e.timestamp!="number"||!e.source){o.warn("Invalid message structure received:",e);return}const r=m.get(e.event);r&&r.forEach(n=>{try{n(e)}catch(s){o.error("Error in message handler:",s)}});const i=m.get("*");i&&i.forEach(n=>{try{n(e)}catch(s){o.error("Error in wildcard handler:",s)}})}function te(){R||typeof window>"u"||(window.addEventListener("message",z),R=!0)}function g(t,e){te(),m.has(t)||m.set(t,new Set);const r=m.get(t);return r.add(e),()=>{r.delete(e),r.size===0&&m.delete(t)}}function re(t,e=X){return new Promise((r,i)=>{const n=setTimeout(()=>{s(),i(new Error(`[EmbeddedSDK] Timeout waiting for "${t}" message`))},e),s=g(t,d=>{clearTimeout(n),s(),r(d)})})}function ie(){m.clear(),R&&typeof window<"u"&&(window.removeEventListener("message",z),R=!1)}function ne(){return typeof window>"u"?!1:window.parent!==window}function se(t,e,r){const i={event:t,payload:e,timestamp:Date.now(),source:"merchant-dashboard",...r,metadata:{version:I,synthetic:!0}};m.get(t)?.forEach(s=>{try{s(i)}catch(d){o.error("Error in message handler:",d)}})}const E=new Map,ae=3e4;function U(){const t=Date.now(),e=Math.random().toString(36).slice(2,9);return`req_${t}_${e}`}function _(t,e={},r=ae){const i=U();return new Promise((n,s)=>{const d=setTimeout(()=>{E.get(i)&&(E.delete(i),s(new Error(`[EmbeddedSDK] Request "${t}" timed out after ${r}ms`)))},r);E.set(i,{resolve:n,reject:s,timeout:d,event:t}),u(t,e,"*",i)})}function $(t,e,r){const i=E.get(t);if(!i){o.warn(`Received response for unknown request: ${t}`);return}clearTimeout(i.timeout),E.delete(t),i.resolve(e)}function oe(t="SDK cleanup"){E.forEach((e,r)=>{clearTimeout(e.timeout),e.reject(new Error(`[EmbeddedSDK] Request ${r} cancelled: ${t}`))}),E.clear()}function w(){const t=new Set;return{subscribe(e){return t.add(e),()=>{t.delete(e)}},notify(...e){t.forEach(r=>{try{r(...e)}catch(i){o.error("Error in subscription callback:",i)}})},clear(){t.clear()},size(){return t.size}}}const ue="https://api.salla.dev";class S extends Error{constructor(e,r,i){super(e),this.status=r,this.response=i,this.name="ApiError"}}async function de(t,e={}){const{method:r="GET",headers:i={},body:n,timeout:s=3e4}=e,d=`${ue}${t}`,L=new AbortController,K=setTimeout(()=>{L.abort()},s);try{const l=await fetch(d,{method:r,headers:{"Content-Type":"application/json",...i},body:n?JSON.stringify(n):void 0,signal:L.signal});clearTimeout(K);let N;if(l.headers.get("content-type")?.includes("application/json")?N=await l.json():N=await l.text(),!l.ok)throw new S(`API request failed: ${l.statusText}`,l.status,N);return N}catch(l){throw clearTimeout(K),l instanceof S?l:l instanceof Error?l.name==="AbortError"?new S(`Request timeout after ${s}ms`):new S(`Request failed: ${l.message}`):new S("Unknown error occurred")}}function D(t){return{isVerified:!1,isError:!0,error:t,data:null}}async function ce(t){const{token:e,appId:r,refreshOnError:i=!0}=t;if(!e){const n="Token is required. Provide it as a parameter or in URL as ?token=XXX";return o.error("Error in introspect:",n),D(n)}if(!r){const n="App ID is required. Provide it as a parameter or in URL as ?app_id=XXX";return o.error("Error in introspect:",n),D(n)}try{const n=await de("/exchange-authority/v1/introspect",{method:"POST",headers:{"S-Source":r,"Content-Type":"application/json"},body:{env:"prod",token:e,iss:"merchant-dashboard",subject:"embedded-page"}}),s=n.success;return{isVerified:s,isError:!s,error:s?void 0:"API request failed",data:s?n.data:null}}catch(n){i&&(M().ui.toast.error(n?.toString()??"Introspect error"),u(k.REFRESH,{})),o.error("Error in introspect:",n);const s=n instanceof Error?n.message:n;return D(s)}}function le(t){return{getToken(){return new URLSearchParams(window.location.search).get("token")},getAppId(){return new URLSearchParams(window.location.search).get("app_id")},refresh(){u(k.REFRESH,{})},async introspect(e={}){const r=e.token??this.getToken()??"",i=e.appId??this.getAppId()??"";return ce({token:r,appId:i,refreshOnError:e.refreshOnError})}}}const V=["success","error","warning","info"];function fe(t){const e=[];return t.type===void 0||t.type===null?e.push("Toast type is required"):(typeof t.type!="string"||!V.includes(t.type))&&e.push(`Invalid toast type "${t.type}". Expected: ${V.join(" | ")}`),t.message===void 0||t.message===null?e.push("Toast message is required"):typeof t.message!="string"?e.push("Toast message must be a string"):t.message.trim()===""&&e.push("Toast message cannot be empty"),t.duration!==void 0&&t.duration!==null&&(typeof t.duration!="number"?e.push("Toast duration must be a number"):t.duration<0&&e.push("Toast duration cannot be negative")),{valid:e.length===0,errors:e}}function j(t,e){const r=[];return typeof t!="object"||t===null?(r.push(`${e} must be an object`),r):((typeof t.type!="string"||t.type.trim()==="")&&r.push(`${e} must have a valid type`),(typeof t.slug!="string"||t.slug.trim()==="")&&r.push(`${e} must have a valid slug`),t.quantity!==void 0&&(typeof t.quantity!="number"||t.quantity<1)&&r.push(`${e} must have a quantity >= 1`),r)}function he(t){const e=[];if(typeof t!="object"||t===null)return e.push("Checkout options must be an object"),{valid:!1,errors:e};const r="item"in t,i="items"in t;if(!r&&!i)return e.push("Checkout requires either 'item' or 'items'"),{valid:!1,errors:e};if(r){const n=j(t.item,"Item");return e.push(...n),{valid:e.length===0,errors:e}}return Array.isArray(t.items)?t.items.length===0?(e.push("At least one item is required"),{valid:!1,errors:e}):(t.items.forEach((n,s)=>{const d=j(n,`Item at index ${s}`);e.push(...d)}),{valid:e.length===0,errors:e}):(e.push("Checkout items must be an array"),{valid:!1,errors:e})}function pe(t){const e=[];return t.path===void 0||t.path===null?e.push("Navigation path is required"):typeof t.path!="string"?e.push("Navigation path must be a string"):t.path.trim()===""&&e.push("Navigation path cannot be empty"),t.replace!==void 0&&typeof t.replace!="boolean"&&e.push("Navigation replace option must be a boolean"),{valid:e.length===0,errors:e}}function me(t){const e=[];if(t.url===void 0||t.url===null)e.push("Redirect URL is required");else if(typeof t.url!="string")e.push("Redirect URL must be a string");else if(t.url.trim()==="")e.push("Redirect URL cannot be empty");else try{new URL(t.url)}catch{e.push(`Invalid redirect URL: "${t.url}"`)}return{valid:e.length===0,errors:e}}function ge(t){const e=[];return t.title?typeof t.title!="string"&&e.push("Nav action title must be a string"):e.push("Nav action title is required"),t.value?typeof t.value!="string"&&e.push("Nav action value must be a string"):e.push("Nav action value is required"),t.subTitle!==void 0&&t.subTitle!==null&&typeof t.subTitle!="string"&&e.push("Nav action subTitle must be a string"),t.icon!==void 0&&t.icon!==null&&typeof t.icon!="string"&&e.push("Nav action icon must be a string"),t.disabled!==void 0&&t.disabled!==null&&typeof t.disabled!="boolean"&&e.push("Nav action disabled must be a boolean"),t.extendedActions!==void 0&&t.extendedActions!==null&&(Array.isArray(t.extendedActions)?t.extendedActions.forEach((r,i)=>{if(typeof r!="object"||r===null){e.push(`Extended action at index ${i} must be an object`);return}const n=r;(!n.title||typeof n.title!="string")&&e.push(`Extended action at index ${i} is missing required "title" property`),(!n.value||typeof n.value!="string")&&e.push(`Extended action at index ${i} is missing required "value" property`),n.subTitle!==void 0&&typeof n.subTitle!="string"&&e.push(`Extended action at index ${i} subTitle must be a string`),n.icon!==void 0&&typeof n.icon!="string"&&e.push(`Extended action at index ${i} icon must be a string`),n.disabled!==void 0&&typeof n.disabled!="boolean"&&e.push(`Extended action at index ${i} disabled must be a boolean`)}):e.push("Nav action extendedActions must be an array")),{valid:e.length===0,errors:e}}function be(t){const e=[];if(typeof t!="object"||t===null)return e.push("Nav addItem expects an object item"),{valid:!1,errors:e};const r=t;return["title","value","url"].forEach(i=>{(typeof r[i]!="string"||!String(r[i]).trim())&&e.push(`Sub-nav addItem "${i}" must be non-empty string`)}),r.disabled!==void 0&&typeof r.disabled!="boolean"&&e.push('Sub-nav addItem "disabled" must be boolean'),r.active!==void 0&&typeof r.active!="boolean"&&e.push('Sub-nav addItem "active" must be boolean'),{valid:e.length===0,errors:e}}function Ee(t){const e=[];if(typeof t!="object"||t===null)return e.push("Nav updateItem expects an object item"),{valid:!1,errors:e};const r=t;if(typeof r.id!="string"||!r.id.trim())return e.push('Sub-nav updateItem requires string "id"'),{valid:!1,errors:e};let i=0;return r.title!==void 0&&i++,r.value!==void 0&&i++,r.url!==void 0&&i++,r.disabled!==void 0&&i++,r.active!==void 0&&i++,i===0?(e.push("Sub-nav updateItem must include at least one of title, value, url, disabled, active"),{valid:!1,errors:e}):(["title","value","url"].forEach(n=>{r[n]!==void 0&&(typeof r[n]!="string"||!r[n].trim())&&e.push(`Sub-nav updateItem "${n}" must be non-empty`)}),r.disabled!==void 0&&typeof r.disabled!="boolean"&&e.push('Sub-nav updateItem "disabled" must be boolean'),r.active!==void 0&&typeof r.active!="boolean"&&e.push('Sub-nav updateItem "active" must be boolean'),{valid:e.length===0,errors:e})}function ve(t){const e=[];return(typeof t!="string"||!t.trim())&&e.push("Nav removeItem id must be non-empty string"),{valid:e.length===0,errors:e}}const F=["danger","warning","info"];function ye(t){const e=[];return t.title===void 0||t.title===null?e.push("Confirm dialog title is required"):typeof t.title!="string"?e.push("Confirm dialog title must be a string"):t.title.trim()===""&&e.push("Confirm dialog title cannot be empty"),t.message===void 0||t.message===null?e.push("Confirm dialog message is required"):typeof t.message!="string"?e.push("Confirm dialog message must be a string"):t.message.trim()===""&&e.push("Confirm dialog message cannot be empty"),t.confirmText!==void 0&&t.confirmText!==null&&typeof t.confirmText!="string"&&e.push("Confirm dialog confirmText must be a string"),t.cancelText!==void 0&&t.cancelText!==null&&typeof t.cancelText!="string"&&e.push("Confirm dialog cancelText must be a string"),t.variant!==void 0&&t.variant!==null&&(typeof t.variant!="string"||!F.includes(t.variant))&&e.push(`Invalid confirm variant "${t.variant}". Expected: ${F.join(" | ")}`),{valid:e.length===0,errors:e}}function h(t,e){o.error(`Validation failed for ${t}:
1
+ (function(p,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(p=typeof globalThis<"u"?globalThis:p||self,o(p.SallaEmbeddedSDK={}))})(this,(function(p){"use strict";const o="embedded::",O={INIT:`${o}iframe.ready`,READY:`${o}ready`,DESTROY:`${o}destroy`},j={PROVIDE:`${o}context.provide`,THEME_CHANGE:`${o}theme.change`},v={LOADING:`${o}ui.loading`,BREADCRUMBS:`${o}ui.breadcrumbs`,TOAST:`${o}ui.toast`,CONFIRM:`${o}ui.confirm`,CONFIRM_RESPONSE:`${o}ui.confirm.response`},te={},F={REFRESH:`${o}auth.refresh`},S={NAVIGATE:`${o}page.navigate`,REDIRECT:`${o}page.redirect`,SET_TITLE:`${o}page.setTitle`},h={SET_ACTION:`${o}nav.setAction`,CLEAR_ACTION:`${o}nav.clearAction`,ACTION_CLICK:`${o}nav.actionClick`,ADD_ITEM:`${o}nav.addItem`,ADD_ITEM_RESPONSE:`${o}nav.addItem.response`,UPDATE_ITEM:`${o}nav.updateItem`,REMOVE_ITEM:`${o}nav.removeItem`,ITEM_CLICK:`${o}nav.itemClick`},E={CREATE:`${o}checkout.create`,RESPONSE:`${o}checkout.response`,GET_ADDONS:`${o}checkout.getAddons`,GET_ADDONS_RESPONSE:`${o}checkout.getAddons.response`,RESET_CACHE:`${o}checkout.resetCache`},N=te.version||"",re=1e4,ie=["localhost","merchants.workers.dev","s.salla.sa",".salla.group",".salla.sa"],ne=new Set(["ar","he","fa","ur","ps","sd","yi"]);function se(t){const e=(t??"ar").toLowerCase().split(/[-_]/)[0];return ne.has(e)?"rtl":"ltr"}let $={showVersion:!0,debug:!1};function ae(t){$={...$,...t}}function H(t){return`%c${t}`}function K(t,e="#fff"){return`background-color: ${t}; color: ${e}; padding: 2px 6px; border-radius: 3px; font-weight: 500; font-size: 11px;`}function w(t,...e){if(t==="debug"&&!$.debug)return;const r=[],i=[];r.push(H("EmbeddedSDK")),i.push(K("#10b981","#fff")),$.showVersion&&(r.push(H(`v${N}`)),i.push(K("#6b7280","#fff")));const n=r.join("").trim();(console[t]||console.log)(n,...i,...e)}const u={log:(...t)=>{w("log",...t)},warn:(...t)=>{w("warn",...t)},error:(...t)=>{w("error",...t)},info:(...t)=>{w("info",...t)},debug:(...t)=>{w("debug",...t)}};function oe(t){try{const r=new URL(t).hostname;return ie.some(i=>i.startsWith(".")?r.endsWith(i)||r===i.slice(1):r===i||r.startsWith(`${i}:`))}catch{return!1}}function ue(){return typeof window>"u"||window.parent===window?null:window.parent}function c(t,e,r="*",i,n){const s=ue();if(!s){u.warn("Not running in an iframe, cannot post to host");return}const a={event:t,payload:e||{},timestamp:Date.now(),source:"embedded-app",...i&&{requestId:i},metadata:{version:N}};s.postMessage(a,r)}const b=new Map;let C=!1;function G(t){if(process.env.NODE_ENV==="production"&&!oe(t.origin))return;const e=t.data;if(!e||typeof e.event!="string"||!e.payload||typeof e.timestamp!="number"||!e.source){u.warn("Invalid message structure received:",e);return}const r=b.get(e.event);r&&r.forEach(n=>{try{n(e)}catch(s){u.error("Error in message handler:",s)}});const i=b.get("*");i&&i.forEach(n=>{try{n(e)}catch(s){u.error("Error in wildcard handler:",s)}})}function de(){C||typeof window>"u"||(window.addEventListener("message",G),C=!0)}function y(t,e){de(),b.has(t)||b.set(t,new Set);const r=b.get(t);return r.add(e),()=>{r.delete(e),r.size===0&&b.delete(t)}}function ce(t,e=re){return new Promise((r,i)=>{const n=setTimeout(()=>{s(),i(new Error(`[EmbeddedSDK] Timeout waiting for "${t}" message`))},e),s=y(t,a=>{clearTimeout(n),s(),r(a)})})}function le(){b.clear(),C&&typeof window<"u"&&(window.removeEventListener("message",G),C=!1)}function fe(){return typeof window>"u"?!1:window.parent!==window}function he(t,e,r){const i={event:t,payload:e,timestamp:Date.now(),source:"merchant-dashboard",...r,metadata:{version:N,synthetic:!0}};b.get(t)?.forEach(s=>{try{s(i)}catch(a){u.error("Error in message handler:",a)}})}const T=new Map,me=3e4;function B(){const t=Date.now(),e=Math.random().toString(36).slice(2,9);return`req_${t}_${e}`}function L(t,e={},r=me){const i=B();return new Promise((n,s)=>{const a=setTimeout(()=>{T.get(i)&&(T.delete(i),s(new Error(`[EmbeddedSDK] Request "${t}" timed out after ${r}ms`)))},r);T.set(i,{resolve:n,reject:s,timeout:a,event:t}),c(t,e,"*",i)})}function _(t,e,r){const i=T.get(t);if(!i){u.warn(`Received response for unknown request: ${t}`);return}clearTimeout(i.timeout),T.delete(t),r?i.reject(new Error(r)):i.resolve(e)}function pe(t="SDK cleanup"){T.forEach((e,r)=>{clearTimeout(e.timeout),e.reject(new Error(`[EmbeddedSDK] Request ${r} cancelled: ${t}`))}),T.clear()}function A(){const t=new Set;return{subscribe(e){return t.add(e),()=>{t.delete(e)}},notify(...e){t.forEach(r=>{try{r(...e)}catch(i){u.error("Error in subscription callback:",i)}})},clear(){t.clear()},size(){return t.size}}}const ge="https://api.salla.dev";class R extends Error{constructor(e,r,i){super(e),this.status=r,this.response=i,this.name="ApiError"}}async function ve(t,e={}){const{method:r="GET",headers:i={},body:n,timeout:s=3e4}=e,a=`${ge}${t}`,l=new AbortController,f=setTimeout(()=>{l.abort()},s);try{const d=await fetch(a,{method:r,headers:{"Content-Type":"application/json",...i},body:n?JSON.stringify(n):void 0,signal:l.signal});clearTimeout(f);let m;if(d.headers.get("content-type")?.includes("application/json")?m=await d.json():m=await d.text(),!d.ok)throw new R(`API request failed: ${d.statusText}`,d.status,m);return m}catch(d){throw clearTimeout(f),d instanceof R?d:d instanceof Error?d.name==="AbortError"?new R(`Request timeout after ${s}ms`):new R(`Request failed: ${d.message}`):new R("Unknown error occurred")}}function q(t){return{isVerified:!1,isError:!0,error:t,data:null}}async function be(t){const{token:e,appId:r,refreshOnError:i=!0}=t;if(!e){const n="Token is required. Provide it as a parameter or in URL as ?token=XXX";return u.error("Error in introspect:",n),q(n)}if(!r){const n="App ID is required. Provide it as a parameter or in URL as ?app_id=XXX";return u.error("Error in introspect:",n),q(n)}try{const n=await ve("/exchange-authority/v1/introspect",{method:"POST",headers:{"S-Source":r,"Content-Type":"application/json"},body:{env:"prod",token:e,iss:"merchant-dashboard",subject:"embedded-page"}}),s=n.success;return{isVerified:s,isError:!s,error:s?void 0:"API request failed",data:s?n.data:null}}catch(n){i&&(z().ui.toast.error(n?.toString()??"Introspect error"),c(F.REFRESH,{})),u.error("Error in introspect:",n);const s=n instanceof Error?n.message:n;return q(s)}}function ye(t){return{getToken(){return new URLSearchParams(window.location.search).get("token")},getAppId(){return new URLSearchParams(window.location.search).get("app_id")},refresh(){c(F.REFRESH,{})},async introspect(e={}){const r=e.token??this.getToken()??"",i=e.appId??this.getAppId()??"";return be({token:r,appId:i,refreshOnError:e.refreshOnError})}}}const X=["success","error","warning","info"];function Ee(t){const e=[];return t.type===void 0||t.type===null?e.push("Toast type is required"):(typeof t.type!="string"||!X.includes(t.type))&&e.push(`Invalid toast type "${t.type}". Expected: ${X.join(" | ")}`),t.message===void 0||t.message===null?e.push("Toast message is required"):typeof t.message!="string"?e.push("Toast message must be a string"):t.message.trim()===""&&e.push("Toast message cannot be empty"),t.duration!==void 0&&t.duration!==null&&(typeof t.duration!="number"?e.push("Toast duration must be a number"):t.duration<0&&e.push("Toast duration cannot be negative")),{valid:e.length===0,errors:e}}function W(t,e){const r=[];return typeof t!="object"||t===null?(r.push(`${e} must be an object`),r):((typeof t.type!="string"||t.type.trim()==="")&&r.push(`${e} must have a valid type`),(typeof t.slug!="string"||t.slug.trim()==="")&&r.push(`${e} must have a valid slug`),t.quantity!==void 0&&(typeof t.quantity!="number"||t.quantity<1)&&r.push(`${e} must have a quantity >= 1`),r)}function Te(t){const e=[];if(typeof t!="object"||t===null)return e.push("Checkout options must be an object"),{valid:!1,errors:e};const r="item"in t,i="items"in t;if(!r&&!i)return e.push("Checkout requires either 'item' or 'items'"),{valid:!1,errors:e};if(r){const n=W(t.item,"Item");return e.push(...n),{valid:e.length===0,errors:e}}return Array.isArray(t.items)?t.items.length===0?(e.push("At least one item is required"),{valid:!1,errors:e}):(t.items.forEach((n,s)=>{const a=W(n,`Item at index ${s}`);e.push(...a)}),{valid:e.length===0,errors:e}):(e.push("Checkout items must be an array"),{valid:!1,errors:e})}function Se(t){const e=[];return t.path===void 0||t.path===null?e.push("Navigation path is required"):typeof t.path!="string"?e.push("Navigation path must be a string"):t.path.trim()===""&&e.push("Navigation path cannot be empty"),t.replace!==void 0&&typeof t.replace!="boolean"&&e.push("Navigation replace option must be a boolean"),{valid:e.length===0,errors:e}}function Ie(t){const e=[];if(t.url===void 0||t.url===null)e.push("Redirect URL is required");else if(typeof t.url!="string")e.push("Redirect URL must be a string");else if(t.url.trim()==="")e.push("Redirect URL cannot be empty");else try{new URL(t.url)}catch{e.push(`Invalid redirect URL: "${t.url}"`)}return{valid:e.length===0,errors:e}}function we(t){const e=[];return t.title?typeof t.title!="string"&&e.push("Nav action title must be a string"):e.push("Nav action title is required"),t.value?typeof t.value!="string"&&e.push("Nav action value must be a string"):e.push("Nav action value is required"),t.subTitle!==void 0&&t.subTitle!==null&&typeof t.subTitle!="string"&&e.push("Nav action subTitle must be a string"),t.icon!==void 0&&t.icon!==null&&typeof t.icon!="string"&&e.push("Nav action icon must be a string"),t.disabled!==void 0&&t.disabled!==null&&typeof t.disabled!="boolean"&&e.push("Nav action disabled must be a boolean"),t.extendedActions!==void 0&&t.extendedActions!==null&&(Array.isArray(t.extendedActions)?t.extendedActions.forEach((r,i)=>{if(typeof r!="object"||r===null){e.push(`Extended action at index ${i} must be an object`);return}const n=r;(!n.title||typeof n.title!="string")&&e.push(`Extended action at index ${i} is missing required "title" property`),(!n.value||typeof n.value!="string")&&e.push(`Extended action at index ${i} is missing required "value" property`),n.subTitle!==void 0&&typeof n.subTitle!="string"&&e.push(`Extended action at index ${i} subTitle must be a string`),n.icon!==void 0&&typeof n.icon!="string"&&e.push(`Extended action at index ${i} icon must be a string`),n.disabled!==void 0&&typeof n.disabled!="boolean"&&e.push(`Extended action at index ${i} disabled must be a boolean`)}):e.push("Nav action extendedActions must be an array")),{valid:e.length===0,errors:e}}const D=50;function M(t,e){return t?`${t}.${e}`:e}function Ae(t,e){const r=[];["title","value","url"].forEach(s=>{(typeof t[s]!="string"||!String(t[s]).trim())&&r.push(`Sub-nav addItem "${M(e,s)}" must be non-empty string`)});const i=M(e,"disabled"),n=M(e,"active");return t.disabled!==void 0&&typeof t.disabled!="boolean"&&r.push(`Sub-nav addItem "${i}" must be boolean`),t.active!==void 0&&typeof t.active!="boolean"&&r.push(`Sub-nav addItem "${n}" must be boolean`),r}function k(t,e,r){if(typeof t!="object"||t===null)return[`Sub-nav addItem "${e||"item"}" must be an object`];const i=t,n=Ae(i,e),s=M(e,"children");return i.children===void 0?n:r?Array.isArray(i.children)?i.children.length>D?(n.push(`Sub-nav addItem "${s}" must have at most ${D} items`),n):(i.children.forEach((a,l)=>{const f=e?`${e}.children[${l}]`:`children[${l}]`;n.push(...k(a,f,!1))}),n):(n.push(`Sub-nav addItem "${s}" must be an array`),n):(Array.isArray(i.children)&&i.children.length===0||n.push(`Sub-nav addItem "${s}" is not supported on submenu rows (only one dropdown level)`),n)}function Y(t,e,r,i){if(typeof t!="object"||t===null)return i;const n=t;return typeof n.value=="string"&&n.value.trim()&&i.push(n.value.trim()),!r||!Array.isArray(n.children)||n.children.forEach((s,a)=>{const l=e?`${e}.children[${a}]`:`children[${a}]`;Y(s,l,!1,i)}),i}function Re(t){const e=Y(t,"",!0,[]),r=new Set,i=[];for(const n of e)r.has(n)&&i.push(n),r.add(n);return i.length===0?[]:[`Sub-nav addItem "value" must be globally unique within the item tree (duplicate: ${[...new Set(i)].join(", ")})`]}function Ne(t){if(typeof t!="object"||t===null)return{valid:!1,errors:["Nav addItem expects an object item"]};const e=[...k(t,"",!0),...Re(t)];return{valid:e.length===0,errors:e}}function $e(t){const e=[];if(typeof t!="object"||t===null)return e.push("Nav updateItem expects an object item"),{valid:!1,errors:e};const r=t,i=typeof r.value=="string"&&String(r.value).trim().length>0,n=typeof r.id=="string"&&String(r.id).trim().length>0,s=i?String(r.value).trim():"",a=n?String(r.id).trim():"";if(!i&&!n)return e.push('Sub-nav updateItem requires non-empty string "value"'),{valid:!1,errors:e};if(i&&n&&s!==a)return e.push('Sub-nav updateItem must not specify different "id" and "value"; "value" is the immutable row key and cannot be renamed via patch'),{valid:!1,errors:e};const l=s||a;let f=0;if(r.title!==void 0&&f++,r.url!==void 0&&f++,r.disabled!==void 0&&f++,r.active!==void 0&&f++,r.children!==void 0&&f++,f===0)return e.push("Sub-nav updateItem must include at least one of title, url, disabled, active, children"),{valid:!1,errors:e};if(["title","url"].forEach(d=>{r[d]!==void 0&&(typeof r[d]!="string"||!r[d].trim())&&e.push(`Sub-nav updateItem "${d}" must be non-empty`)}),r.disabled!==void 0&&typeof r.disabled!="boolean"&&e.push('Sub-nav updateItem "disabled" must be boolean'),r.active!==void 0&&typeof r.active!="boolean"&&e.push('Sub-nav updateItem "active" must be boolean'),r.children!==void 0)if(!Array.isArray(r.children))e.push('Sub-nav updateItem "children" must be an array');else if(r.children.length>D)e.push(`Sub-nav updateItem "children" must have at most ${D} items`);else{const d=new Set;r.children.forEach((m,ee)=>{const x=`children[${ee}]`;if(e.push(...k(m,x,!1)),typeof m=="object"&&m!==null){const U=m.value;if(typeof U=="string"&&U.trim()){const P=U.trim();P===l&&e.push(`Sub-nav updateItem "${x}.value" must not equal the parent row identifier`),d.has(P)&&e.push(`Sub-nav updateItem "${x}.value" must be unique within children`),d.add(P)}}})}return{valid:e.length===0,errors:e}}function Ce(t){const e=[];return(typeof t!="string"||!t.trim())&&e.push("Nav removeItem value must be non-empty string"),{valid:e.length===0,errors:e}}const Q=["danger","warning","info"];function _e(t){const e=[];return t.title===void 0||t.title===null?e.push("Confirm dialog title is required"):typeof t.title!="string"?e.push("Confirm dialog title must be a string"):t.title.trim()===""&&e.push("Confirm dialog title cannot be empty"),t.message===void 0||t.message===null?e.push("Confirm dialog message is required"):typeof t.message!="string"?e.push("Confirm dialog message must be a string"):t.message.trim()===""&&e.push("Confirm dialog message cannot be empty"),t.confirmText!==void 0&&t.confirmText!==null&&typeof t.confirmText!="string"&&e.push("Confirm dialog confirmText must be a string"),t.cancelText!==void 0&&t.cancelText!==null&&typeof t.cancelText!="string"&&e.push("Confirm dialog cancelText must be a string"),t.variant!==void 0&&t.variant!==null&&(typeof t.variant!="string"||!Q.includes(t.variant))&&e.push(`Invalid confirm variant "${t.variant}". Expected: ${Q.join(" | ")}`),{valid:e.length===0,errors:e}}function g(t,e){u.error(`Validation failed for ${t}:
2
2
  `+e.map(r=>` • ${r}`).join(`
3
- `))}function Te(){return{resize:i=>{},autoResize:()=>{},stopAutoResize:()=>{}}}function we(){const{resize:t,autoResize:e,stopAutoResize:r}=Te();return{navigate(i,n){const s=pe({path:i,...n});if(!s.valid){h(v.NAVIGATE,s.errors);return}u(v.NAVIGATE,{path:i,state:n?.state,replace:n?.replace})},redirect(i){const n=me({url:i});if(!n.valid){h(v.REDIRECT,n.errors);return}u(v.REDIRECT,{url:i})},navTo(i,n){if(i.startsWith("http://")||i.startsWith("https://")){this.redirect(i);return}this.navigate(i,n)},setTitle(i){if(typeof i!="string"||!i.trim()){h(v.SET_TITLE,["Title must be a non-empty string"]);return}u(v.SET_TITLE,{title:i})},resize:t,autoResize:e,stopAutoResize:r}}function Se(){const t=w(),e=w(),r=[];return r.push(g(c.ACTION_CLICK,i=>{t.notify(i.payload.value)})),r.push(g(c.ADD_ITEM_RESPONSE,i=>{const n=i.payload.item;i.requestId&&n&&typeof n.id=="string"&&typeof n.value=="string"&&$(i.requestId,n)})),r.push(g(c.ITEM_CLICK,i=>{e.notify(i.payload)})),{setAction(i){const n=ge(i);if(!n.valid){h(c.SET_ACTION,n.errors);return}u(c.SET_ACTION,{title:i.title,value:i.value,subTitle:i.subTitle,icon:i.icon,disabled:i.disabled,extendedActions:i.extendedActions?.map(s=>({title:s.title,value:s.value,subTitle:s.subTitle,icon:s.icon,disabled:s.disabled}))})},clearAction(){u(c.CLEAR_ACTION,{})},onActionClick(i){return t.subscribe(i)},addNavItem(i){const n=be(i);return n.valid?_(c.ADD_ITEM,{item:i},2e3):(h(c.ADD_ITEM,n.errors),Promise.reject(new Error(n.errors[0])))},updateNavItem(i){const n=Ee(i);if(!n.valid){h(c.UPDATE_ITEM,n.errors);return}u(c.UPDATE_ITEM,{item:i})},removeNavItem(i){const n=ve(i);if(!n.valid){h(c.REMOVE_ITEM,n.errors);return}u(c.REMOVE_ITEM,{id:i})},onNavItemClick(i){return e.subscribe(i)},destroy(){r.forEach(i=>i()),r.length=0,t.clear(),e.clear()}}}function Ie(){return{show(){u(p.LOADING,{action:"show"})},hide(){u(p.LOADING,{action:"hide"})}}}function Ae(){return{hide(){u(p.BREADCRUMBS,{action:"hide"})},show(){u(p.BREADCRUMBS,{action:"show"})}}}function Re(){const t=e=>{const r=fe(e);if(!r.valid){h(p.TOAST,r.errors);return}u(p.TOAST,{type:e.type,message:e.message,duration:e.duration})};return{show:t,success(e,r){t({type:"success",message:e,duration:r})},error(e,r){t({type:"error",message:e,duration:r})},warning(e,r){t({type:"warning",message:e,duration:r})},info(e,r){t({type:"info",message:e,duration:r})}}}function Ne(){return async t=>{const e=ye(t);return e.valid?_(p.CONFIRM,{title:t.title,message:t.message,confirmText:t.confirmText??"Confirm",cancelText:t.cancelText??"Cancel",variant:t.variant??"info"}):(h(p.CONFIRM,e.errors),Promise.reject(new Error(e.errors.join(", "))))}}function Ce(){return{loading:Ie(),breadcrumbs:Ae(),toast:Re(),confirm:Ne()}}function _e(){const t=w(),e=[];return e.push(g(b.RESPONSE,r=>{t.notify({success:r.payload.success,order_id:r.payload.order_id,status:r.payload.status,error:r.payload.error,context:r.payload.context})})),e.push(g(b.GET_ADDONS_RESPONSE,r=>{r.requestId&&$(r.requestId,{success:r.payload.success,addons:r.payload.addons,error:r.payload.error})})),{create(r,i){const n=Array.isArray(r)?r:[r],s=he({items:n});if(!s.valid)throw h(b.CREATE,s.errors),new Error(s.errors[0]);u(b.CREATE,{items:n.map(d=>({type:d.type,slug:d.slug,quantity:d.quantity??1})),...i?.context!==void 0&&{context:i.context}},"*",U())},onResult(r){return t.subscribe(r)},async getAddons(){try{return await _(b.GET_ADDONS,{},3e4)}catch(r){return{success:!1,error:{code:"REQUEST_FAILED",message:r instanceof Error?r.message:"Unknown error"}}}},resetCache(){u(b.RESET_CACHE,{},"*")},destroy(){e.forEach(r=>r()),e.length=0,t.clear()}}}const H={theme:"light",dir:"rtl",width:0,locale:"ar",currency:"SAR"};class G{constructor(){this.initialized=!1,this.initializing=!1,this.debugMode=!1,this.appReady=!1,this.layout={...H},this.postInitHooks=[],this.themeSubscription=w(),this.initSubscription=w(),this.auth=le(),this.page=we(),this.nav=Se(),this.ui=Ce(),this.checkout=_e(),this.registerPostInitHook(e=>{const r=e.payload.pendingCheckoutResult;r&&(o.debug("Dispatching pending checkout result:",r),queueMicrotask(()=>{se(b.RESPONSE,{success:r.success,status:r.status,error:r.error,context:r.context})}))}),this.setupListeners()}registerPostInitHook(e){this.postInitHooks.push(e)}setupListeners(){g(x.THEME_CHANGE,e=>{this.layout.theme=e.payload.theme,o.debug("Theme changed:",e.payload.theme),this.themeSubscription.notify(e.payload.theme)}),g(p.CONFIRM_RESPONSE,e=>{o.debug("Received confirm response:",e),e.requestId&&$(e.requestId,{confirmed:e.payload.confirmed})})}getState(){return{ready:this.initialized,initializing:this.initializing,layout:{...this.layout}}}isReady(){return this.initialized}onThemeChange(e){return this.themeSubscription.subscribe(e)}onInit(e){if(this.initialized)try{e(this.getState())}catch(r){o.error("Error in init callback:",r)}return this.initSubscription.subscribe(e)}ready(){if(this.appReady){o.debug("App already signaled as ready");return}if(!this.initialized){o.warn("Cannot signal ready before init() is called");return}this.appReady=!0,u(C.READY,{}),o.debug("Sent ready signal to host")}async init(e={}){if(this.initialized)return o.debug("Already initialized, returning current layout"),{layout:{...this.layout}};if(this.initializing)return o.warn("Initialization already in progress"),new Promise(r=>{const i=this.onInit(n=>{i(),r({layout:{...n.layout}})})});this.initializing=!0,this.debugMode=e.debug??!1,J({debug:this.debugMode}),ne()||o.warn("Not running in an iframe. Some features may not work."),o.debug("Initializing SDK...");try{u(C.INIT,{height:document.documentElement.scrollHeight}),o.debug("Sent iframe.ready message, waiting for context...");const r=await re(x.PROVIDE);o.debug("Received context from host:",r);const{layout:i}=r.payload;return this.layout={theme:i?.theme??"light",dir:i?.dir??Q(i?.locale),width:i?.width??0,locale:i?.locale??"ar",currency:i?.currency??"SAR"},this.postInitHooks.forEach(n=>{try{n(r)}catch(s){o.error("Error in post-init hook:",s)}}),this.initialized=!0,this.initializing=!1,o.debug("Initialization complete. Layout:",this.layout),this.initSubscription.notify(this.getState()),{layout:{...this.layout}}}catch(r){throw this.initializing=!1,r}}destroy(){o.debug("Destroying SDK instance"),this.initialized&&(u(C.DESTROY,{}),o.debug("Sent destroy event to host")),this.checkout.destroy(),this.nav.destroy(),oe("SDK destroyed"),ie(),this.themeSubscription.clear(),this.initSubscription.clear(),this.postInitHooks=[],this.initialized=!1,this.initializing=!1,this.appReady=!1,this.layout={...H}}}let y=null;function M(){return y||(y=new G),y}function $e(){y&&(y.destroy(),y=null)}const O=M(),De=I;typeof window<"u"&&(window.salla=window.salla||window.Salla||{},window.Salla=window.salla,window.salla.embedded||(window.salla.embedded=O),window.Salla.embedded||(window.Salla.embedded=O)),f.EmbeddedApp=G,f.embedded=O,f.getEmbeddedApp=M,f.resetEmbeddedApp=$e,f.version=De,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})}));
3
+ `))}function De(){return{resize:i=>{},autoResize:()=>{},stopAutoResize:()=>{}}}function Me(){const{resize:t,autoResize:e,stopAutoResize:r}=De();return{navigate(i,n){const s=Se({path:i,...n});if(!s.valid){g(S.NAVIGATE,s.errors);return}c(S.NAVIGATE,{path:i,state:n?.state,replace:n?.replace})},redirect(i){const n=Ie({url:i});if(!n.valid){g(S.REDIRECT,n.errors);return}c(S.REDIRECT,{url:i})},navTo(i,n){if(i.startsWith("http://")||i.startsWith("https://")){this.redirect(i);return}this.navigate(i,n)},setTitle(i){if(typeof i!="string"||!i.trim()){g(S.SET_TITLE,["Title must be a non-empty string"]);return}c(S.SET_TITLE,{title:i})},resize:t,autoResize:e,stopAutoResize:r}}function Oe(){const t=A(),e=A(),r=[];return r.push(y(h.ACTION_CLICK,i=>{t.notify(i.payload.value)})),r.push(y(h.ADD_ITEM_RESPONSE,i=>{if(!i.requestId)return;const n=i.payload;if(typeof n.error=="string"&&n.error.trim()){const a=n.error.trim();u.warn(`embedded::nav.addItem failed: ${a}`),_(i.requestId,{},a);return}const s=n.item;if(s&&typeof s.value=="string"&&s.value.trim()){const a=s.value.trim(),l={value:a,id:a};_(i.requestId,l)}})),r.push(y(h.ITEM_CLICK,i=>{const n=i.payload,s=typeof n.value=="string"&&n.value.trim()?n.value.trim():typeof n.id=="string"&&n.id.trim()?n.id.trim():"";if(!s){e.notify(n);return}e.notify({...n,value:s,id:s})})),{setAction(i){const n=we(i);if(!n.valid){g(h.SET_ACTION,n.errors);return}c(h.SET_ACTION,{title:i.title,value:i.value,subTitle:i.subTitle,icon:i.icon,disabled:i.disabled,extendedActions:i.extendedActions?.map(s=>({title:s.title,value:s.value,subTitle:s.subTitle,icon:s.icon,disabled:s.disabled}))})},clearAction(){c(h.CLEAR_ACTION,{})},onActionClick(i){return t.subscribe(i)},addNavItem(i){const n=Ne(i);return n.valid?L(h.ADD_ITEM,{item:i},2e3):(g(h.ADD_ITEM,n.errors),Promise.reject(new Error(n.errors[0])))},updateNavItem(i){const n=$e(i);if(!n.valid){g(h.UPDATE_ITEM,n.errors);return}const s=i,a=typeof s.value=="string"?s.value.trim():"",l=typeof s.id=="string"?s.id.trim():"",f=a||l,{id:d,...m}=s;c(h.UPDATE_ITEM,{item:{...m,value:f}})},removeNavItem(i){const n=Ce(i);if(!n.valid){g(h.REMOVE_ITEM,n.errors);return}c(h.REMOVE_ITEM,{value:i})},onNavItemClick(i){return e.subscribe(i)},destroy(){r.forEach(i=>i()),r.length=0,t.clear(),e.clear()}}}function Le(){return{show(){c(v.LOADING,{action:"show"})},hide(){c(v.LOADING,{action:"hide"})}}}function qe(){return{hide(){c(v.BREADCRUMBS,{action:"hide"})},show(){c(v.BREADCRUMBS,{action:"show"})}}}function ke(){const t=e=>{const r=Ee(e);if(!r.valid){g(v.TOAST,r.errors);return}c(v.TOAST,{type:e.type,message:e.message,duration:e.duration})};return{show:t,success(e,r){t({type:"success",message:e,duration:r})},error(e,r){t({type:"error",message:e,duration:r})},warning(e,r){t({type:"warning",message:e,duration:r})},info(e,r){t({type:"info",message:e,duration:r})}}}function ze(){return async t=>{const e=_e(t);return e.valid?L(v.CONFIRM,{title:t.title,message:t.message,confirmText:t.confirmText??"Confirm",cancelText:t.cancelText??"Cancel",variant:t.variant??"info"}):(g(v.CONFIRM,e.errors),Promise.reject(new Error(e.errors.join(", "))))}}function Ve(){return{loading:Le(),breadcrumbs:qe(),toast:ke(),confirm:ze()}}function xe(){const t=A(),e=[];return e.push(y(E.RESPONSE,r=>{t.notify({success:r.payload.success,order_id:r.payload.order_id,status:r.payload.status,error:r.payload.error,context:r.payload.context})})),e.push(y(E.GET_ADDONS_RESPONSE,r=>{r.requestId&&_(r.requestId,{success:r.payload.success,addons:r.payload.addons,error:r.payload.error})})),{create(r,i){const n=Array.isArray(r)?r:[r],s=Te({items:n});if(!s.valid)throw g(E.CREATE,s.errors),new Error(s.errors[0]);c(E.CREATE,{items:n.map(a=>({type:a.type,slug:a.slug,quantity:a.quantity??1})),...i?.context!==void 0&&{context:i.context}},"*",B())},onResult(r){return t.subscribe(r)},async getAddons(){try{return await L(E.GET_ADDONS,{},3e4)}catch(r){return{success:!1,error:{code:"REQUEST_FAILED",message:r instanceof Error?r.message:"Unknown error"}}}},resetCache(){c(E.RESET_CACHE,{},"*")},destroy(){e.forEach(r=>r()),e.length=0,t.clear()}}}const J={theme:"light",dir:"rtl",width:0,locale:"ar",currency:"SAR"};class Z{constructor(){this.initialized=!1,this.initializing=!1,this.debugMode=!1,this.appReady=!1,this.layout={...J},this.postInitHooks=[],this.themeSubscription=A(),this.initSubscription=A(),this.auth=ye(),this.page=Me(),this.nav=Oe(),this.ui=Ve(),this.checkout=xe(),this.registerPostInitHook(e=>{const r=e.payload.pendingCheckoutResult;r&&(u.debug("Dispatching pending checkout result:",r),queueMicrotask(()=>{he(E.RESPONSE,{success:r.success,status:r.status,error:r.error,context:r.context})}))}),this.setupListeners()}registerPostInitHook(e){this.postInitHooks.push(e)}setupListeners(){y(j.THEME_CHANGE,e=>{this.layout.theme=e.payload.theme,u.debug("Theme changed:",e.payload.theme),this.themeSubscription.notify(e.payload.theme)}),y(v.CONFIRM_RESPONSE,e=>{u.debug("Received confirm response:",e),e.requestId&&_(e.requestId,{confirmed:e.payload.confirmed})})}getState(){return{ready:this.initialized,initializing:this.initializing,layout:{...this.layout}}}isReady(){return this.initialized}onThemeChange(e){return this.themeSubscription.subscribe(e)}onInit(e){if(this.initialized)try{e(this.getState())}catch(r){u.error("Error in init callback:",r)}return this.initSubscription.subscribe(e)}ready(){if(this.appReady){u.debug("App already signaled as ready");return}if(!this.initialized){u.warn("Cannot signal ready before init() is called");return}this.appReady=!0,c(O.READY,{}),u.debug("Sent ready signal to host")}async init(e={}){if(this.initialized)return u.debug("Already initialized, returning current layout"),{layout:{...this.layout}};if(this.initializing)return u.warn("Initialization already in progress"),new Promise(r=>{const i=this.onInit(n=>{i(),r({layout:{...n.layout}})})});this.initializing=!0,this.debugMode=e.debug??!1,ae({debug:this.debugMode}),fe()||u.warn("Not running in an iframe. Some features may not work."),u.debug("Initializing SDK...");try{c(O.INIT,{height:document.documentElement.scrollHeight}),u.debug("Sent iframe.ready message, waiting for context...");const r=await ce(j.PROVIDE);u.debug("Received context from host:",r);const{layout:i}=r.payload;return this.layout={theme:i?.theme??"light",dir:i?.dir??se(i?.locale),width:i?.width??0,locale:i?.locale??"ar",currency:i?.currency??"SAR"},this.postInitHooks.forEach(n=>{try{n(r)}catch(s){u.error("Error in post-init hook:",s)}}),this.initialized=!0,this.initializing=!1,u.debug("Initialization complete. Layout:",this.layout),this.initSubscription.notify(this.getState()),{layout:{...this.layout}}}catch(r){throw this.initializing=!1,r}}destroy(){u.debug("Destroying SDK instance"),this.initialized&&(c(O.DESTROY,{}),u.debug("Sent destroy event to host")),this.checkout.destroy(),this.nav.destroy(),pe("SDK destroyed"),le(),this.themeSubscription.clear(),this.initSubscription.clear(),this.postInitHooks=[],this.initialized=!1,this.initializing=!1,this.appReady=!1,this.layout={...J}}}let I=null;function z(){return I||(I=new Z),I}function Ue(){I&&(I.destroy(),I=null)}const V=z(),Pe=N;typeof window<"u"&&(window.salla=window.salla||window.Salla||{},window.Salla=window.salla,window.salla.embedded||(window.salla.embedded=V),window.Salla.embedded||(window.Salla.embedded=V)),p.EmbeddedApp=Z,p.embedded=V,p.getEmbeddedApp=z,p.resetEmbeddedApp=Ue,p.version=Pe,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
4
4
  //# sourceMappingURL=index.js.map