@machinemetrics/mm-react-embeddable 1.4.0-0 → 1.4.0-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),w=require("prop-types"),q=require("styled-components"),Z=e.createContext(null),B={},_=async n=>{let i;try{if(i=new URL(n).origin,B[i]!==void 0)return B[i];const l=await(await fetch(`${i}/mm-app-manifest.json`)).json();if(!l.version)throw new Error("Invalid manifest");return B[i]=l,l}catch{}return i&&(B[i]=!1),!1},V=async n=>!!await _(n),v=e.createContext({pending:[],authorize:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),se=2e4,A=n=>{try{return new URL(n).origin}catch{return null}},K=n=>{if(!n||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(n)||n.includes(":"))return n;const i=n.split(".");return i.length<=2?n:i.slice(-2).join(".")},G=(n,i)=>{try{const o=new URL(n),l=new URL(i);return o.protocol!==l.protocol?!0:K(o.hostname)!==K(l.hostname)}catch{return!0}},J=(n,{onBlocked:i,onClosed:o})=>{const l=window.open(n.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!l)return i(),()=>{};const m=setInterval(()=>{l.closed&&(clearInterval(m),o())},1e3);return()=>clearInterval(m)},Q=({children:n,launcher:i})=>{const o=e.useContext(Z),[l,m]=e.useState({}),[R,g]=e.useState({}),[p,z]=e.useState({}),[$,x]=e.useState({}),y=e.useRef(p);y.current=p;const b=e.useRef(null),M=e.useRef({}),S=e.useCallback((t,r)=>{_(r).then(s=>{if(!s||!s.name)return;const f=k=>k[t]?{...k,[t]:{...k[t],name:s.name}}:k;m(f),x(f)})},[]),O=e.useCallback((t,r)=>{const s=A(t==null?void 0:t.authUrl);s&&(x(f=>f[s]?f:{...f,[s]:{origin:s,reason:r,name:null}}),S(s,t.authUrl))},[S]),L=e.useCallback((t,{v2:r=!1}={})=>{const s=A(t==null?void 0:t.authUrl);s&&(r&&y.current[s]||(m(f=>f[s]?f:{...f,[s]:{origin:s,authUrl:t.authUrl,silentUrl:t.silentUrl||null,status:r&&t.silentUrl?"silent":"interactive",v2:r,name:null,popupBlocked:!1}}),S(s,t.authUrl)))},[S]),C=e.useCallback(t=>{m(r=>{if(!r[t])return r;const s={...r};return delete s[t],s})},[]),T=e.useCallback(t=>{t&&(C(t),g(r=>({...r,[t]:(r[t]||0)+1})))},[C]),u=e.useCallback(t=>{m(r=>!r[t]||r[t].status==="interactive"?r:{...r,[t]:{...r[t],status:"interactive"}})},[]),d=e.useCallback(t=>{C(t.origin)},[C]),c=e.useCallback(t=>{const r=A(t==null?void 0:t.authUrl);if(r&&G(r,window.location.origin)){O(t,"cross-site-legacy");return}L(t)},[L,O]);e.useEffect(()=>{if(!o)return;const t=[o.addListener("*","authorize",c),o.addListener("*","login",c),o.addListener("*","credential-request",r=>L(r,{v2:!0})),o.addListener("*","authorized",r=>{r!=null&&r.accessToken||T(A(r==null?void 0:r.authUrl))})];return()=>t.forEach(r=>r())},[o,c,L,T]),e.useEffect(()=>{const t=r=>{const s=r==null?void 0:r.data;if(!s||s.type!=="authorized"&&s.type!=="authorize-failed")return;const f=A(s.authUrl);if(!(!f||r.origin!==f)){if(s.type==="authorized"&&s.accessToken){z(k=>({...k,[f]:{accessToken:s.accessToken}})),C(f);return}s.type==="authorize-failed"&&u(f)}};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)},[C,u]),e.useEffect(()=>{const t=M.current;Object.values(l).forEach(r=>{r.status==="silent"&&!t[r.origin]&&(t[r.origin]=setTimeout(()=>{delete t[r.origin],u(r.origin)},se))}),Object.keys(t).forEach(r=>{(!l[r]||l[r].status!=="silent")&&(clearTimeout(t[r]),delete t[r])})},[l,u]),e.useEffect(()=>()=>{b.current&&b.current(),Object.values(M.current).forEach(clearTimeout)},[]);const a=e.useCallback(t=>{b.current&&(b.current(),b.current=null);const r=i||J;b.current=r(t,{onBlocked:()=>{m(s=>s[t.origin]?{...s,[t.origin]:{...s[t.origin],popupBlocked:!0}}:s)},onClosed:()=>{if(t.v2){m(s=>!s[t.origin]||!s[t.origin].silentUrl?s:{...s,[t.origin]:{...s[t.origin],status:"silent"}});return}T(t.origin)}})},[i,T]),h={pending:Object.values(l).filter(t=>t.status==="interactive"),authorize:a,dismiss:d,originEpochs:R,credentials:p,unsupported:$},E=Object.values(l).filter(t=>t.status==="silent"&&t.silentUrl);return e.createElement(v.Provider,{value:h},n,E.map(t=>e.createElement("iframe",{key:`mm-silent-auth-${t.origin}`,src:t.silentUrl,title:`MachineMetrics silent authorization (${t.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};Q.propTypes={children:w.node,launcher:w.func};const X=()=>e.useContext(v),Y=n=>{const{originEpochs:i}=e.useContext(v),o=A(n);return o&&i[o]||0},N=n=>{const{credentials:i}=e.useContext(v),o=A(n);return o&&i[o]||null},ee=n=>{const{unsupported:i}=e.useContext(v),o=A(n);return o&&i[o]||null},te=({children:n,authorizationLauncher:i})=>{const[o,l]=e.useState({}),[m,R]=e.useState({}),g=e.useRef({}),p=e.useRef({}),z=e.useRef({}),$=e.useCallback((u,d)=>{var c;return!!((c=z.current[u])!=null&&c.has(d))},[]),x=e.useCallback((u,d,c)=>{l(a=>({...a,[u]:{origin:d,frameRef:c}}))},[]),y=e.useCallback(u=>{l(d=>{const c={...d};return delete c[u],c}),R(d=>{const c={...d};return delete c[u],c}),delete z.current[u]},[]);e.useEffect(()=>{const u=(c=[],a)=>{c.forEach(h=>h(a))},d=c=>{var t,r,s,f,k;if(!((t=c==null?void 0:c.data)!=null&&t.instanceId))return;const{instanceId:a,type:h}=c.data,E=g.current;if(h==="response"){const{callbackId:I,response:P,error:F}=c.data,U=p.current[I];U&&(U(P,F),delete p.current[I]);return}if(h==="mark-registered"){const{requestType:I}=c.data;z.current[a]||(z.current[a]=new Set),z.current[a].add(I);return}h==="ready"&&R(I=>({...I,[a]:!0})),u((r=E[a])==null?void 0:r[h],c.data),u((s=E["*"])==null?void 0:s[h],c.data),u((f=E[a])==null?void 0:f["*"],c.data),u((k=E["*"])==null?void 0:k["*"],c.data)};return window.addEventListener("message",d),()=>{window.removeEventListener("message",d)}},[o]);const b=e.useCallback((u,d,c)=>{var h,E;const a=o[u];if(!a){console.warn(`Origin not set for id: ${u}. Unable to send message.`);return}(E=(h=a==null?void 0:a.frameRef)==null?void 0:h.current)!=null&&E.contentWindow&&a.frameRef.current.contentWindow.postMessage({type:d,...c,instanceId:u},a.origin)},[o]),M=e.useRef(0),S=e.useCallback(()=>`${Date.now()}-${++M.current}`,[]),O=e.useCallback(async(u,d,c={})=>new Promise((a,h)=>{const E=S(),t=(r,s)=>{delete p.current[E],s?h(s):a(r)};p.current[E]=t,b(u,"request",{callbackId:E,requestType:d,data:c})}),[b]),L=e.useCallback((u,d)=>{b(u,"load-options",d)},[b]),C=e.useCallback((u,d)=>{b(u,"validate",d)},[b]),T=e.useMemo(()=>({registerFrame:x,unregisterFrame:y,sendMessage:b,sendRequest:O,loadOptions:L,validate:C,hasHandler:$,readyFrames:m,addListener:(u,d,c)=>(g.current[u]||(g.current[u]={}),g.current[u][d]||(g.current[u][d]=[]),g.current[u][d].push(c),()=>{g.current[u][d]=g.current[u][d].filter(a=>a!==c)})}),[x,y,b,O,L,C,$,m]);return e.createElement(Z.Provider,{value:T},e.createElement(Q,{launcher:i},n))},j=(n,i,o)=>{const l=e.useContext(Z);if(l===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const m=e.useRef(o);e.useEffect(()=>{m.current=o},[o]),e.useEffect(()=>{if(!(!n||!i)){if(i.startsWith("key:")){const R=i.substring(4);return l.readyFrames[n]&&l.sendMessage(n,"subscribe-key",{keyChord:R}),l.addListener(n,`key-pressed:${R}`,(...p)=>m.current(...p))}return l.addListener(n,i,(...R)=>m.current(...R))}},[l,n,i])};te.propTypes={children:w.node.isRequired,authorizationLauncher:w.func};const D=q.default||q,oe=1e4,ie="credentials",W=(n,i)=>`${n}/mm-embedded-interop?id=${i}&origin=${window.location.origin}&caps=${ie}`,ue=D.iframe`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),E=require("prop-types"),j=require("styled-components"),v=e.createContext(null),Z=e.createContext({pending:[],authorize:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ee=2e4,F=r=>{try{return new URL(r).origin}catch{return null}},W=r=>{if(!r||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(r)||r.includes(":"))return r;const u=r.split(".");return u.length<=2?r:u.slice(-2).join(".")},D=(r,u)=>{try{const s=new URL(r),d=new URL(u);return s.protocol!==d.protocol?!0:W(s.hostname)!==W(d.hostname)}catch{return!0}},H=(r,{onBlocked:u,onClosed:s})=>{const d=window.open(r.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!d)return u(),()=>{};const g=setInterval(()=>{d.closed&&(clearInterval(g),s())},1e3);return()=>clearInterval(g)},K=({children:r,launcher:u})=>{const s=e.useContext(v),[d,g]=e.useState({}),[R,p]=e.useState({}),[x,T]=e.useState({}),[I,w]=e.useState({}),y=e.useRef(x);y.current=x;const b=e.useRef(null),k=e.useRef({}),P=e.useRef({}),C=e.useCallback(t=>{const n=P.current[t];if(!n)return;const o=f=>f[t]?{...f,[t]:{...f[t],name:n}}:f;g(o),w(o)},[]),O=e.useCallback((t,n)=>{const o=F(t==null?void 0:t.authUrl);o&&(w(f=>f[o]?f:{...f,[o]:{origin:o,reason:n,name:null}}),C(o))},[C]),z=e.useCallback((t,{v2:n=!1}={})=>{const o=F(t==null?void 0:t.authUrl);o&&(n&&y.current[o]||(g(f=>f[o]?f:{...f,[o]:{origin:o,authUrl:t.authUrl,silentUrl:t.silentUrl||null,status:n&&t.silentUrl?"silent":"interactive",v2:n,name:null,popupBlocked:!1}}),C(o)))},[C]),S=e.useCallback(t=>{g(n=>{if(!n[t])return n;const o={...n};return delete o[t],o})},[]),i=e.useCallback(t=>{t&&(S(t),p(n=>({...n,[t]:(n[t]||0)+1})))},[S]),l=e.useCallback(t=>{g(n=>!n[t]||n[t].status==="interactive"?n:{...n,[t]:{...n[t],status:"interactive"}})},[]),c=e.useCallback(t=>{S(t.origin)},[S]),a=e.useCallback(t=>{const n=F(t==null?void 0:t.authUrl);if(n&&D(n,window.location.origin)){O(t,"cross-site-legacy");return}z(t)},[z,O]);e.useEffect(()=>{if(!s)return;const t=[s.addListener("*","init",n=>{n!=null&&n.origin&&n.name&&(P.current[n.origin]=n.name,C(n.origin))}),s.addListener("*","authorize",a),s.addListener("*","login",a),s.addListener("*","credential-request",n=>z(n,{v2:!0})),s.addListener("*","authorized",n=>{n!=null&&n.accessToken||i(F(n==null?void 0:n.authUrl))})];return()=>t.forEach(n=>n())},[s,a,z,i,C]),e.useEffect(()=>{const t=n=>{const o=n==null?void 0:n.data;if(!o||o.type!=="authorized"&&o.type!=="authorize-failed")return;const f=F(o.authUrl);if(!(!f||n.origin!==f)){if(o.type==="authorized"&&o.accessToken){T(M=>({...M,[f]:{accessToken:o.accessToken}})),S(f);return}o.type==="authorize-failed"&&l(f)}};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)},[S,l]),e.useEffect(()=>{const t=k.current;Object.values(d).forEach(n=>{n.status==="silent"&&!t[n.origin]&&(t[n.origin]=setTimeout(()=>{delete t[n.origin],l(n.origin)},ee))}),Object.keys(t).forEach(n=>{(!d[n]||d[n].status!=="silent")&&(clearTimeout(t[n]),delete t[n])})},[d,l]),e.useEffect(()=>()=>{b.current&&b.current(),Object.values(k.current).forEach(clearTimeout)},[]);const h=e.useCallback(t=>{b.current&&(b.current(),b.current=null);const n=u||H;b.current=n(t,{onBlocked:()=>{g(o=>o[t.origin]?{...o,[t.origin]:{...o[t.origin],popupBlocked:!0}}:o)},onClosed:()=>{if(t.v2){g(o=>!o[t.origin]||!o[t.origin].silentUrl?o:{...o,[t.origin]:{...o[t.origin],status:"silent"}});return}i(t.origin)}})},[u,i]),m={pending:Object.values(d).filter(t=>t.status==="interactive"),authorize:h,dismiss:c,originEpochs:R,credentials:x,unsupported:I},U=Object.values(d).filter(t=>t.status==="silent"&&t.silentUrl);return e.createElement(Z.Provider,{value:m},r,U.map(t=>e.createElement("iframe",{key:`mm-silent-auth-${t.origin}`,src:t.silentUrl,title:`MachineMetrics silent authorization (${t.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};K.propTypes={children:E.node,launcher:E.func};const V=()=>e.useContext(Z),G=r=>{const{originEpochs:u}=e.useContext(Z),s=F(r);return s&&u[s]||0},J=r=>{const{credentials:u}=e.useContext(Z),s=F(r);return s&&u[s]||null},Q=r=>{const{unsupported:u}=e.useContext(Z),s=F(r);return s&&u[s]||null},X=({children:r,authorizationLauncher:u})=>{const[s,d]=e.useState({}),[g,R]=e.useState({}),p=e.useRef({}),x=e.useRef({}),T=e.useRef({}),I=e.useCallback((i,l)=>{var c;return!!((c=T.current[i])!=null&&c.has(l))},[]),w=e.useCallback((i,l,c)=>{d(a=>({...a,[i]:{origin:l,frameRef:c}}))},[]),y=e.useCallback(i=>{d(l=>{const c={...l};return delete c[i],c}),R(l=>{const c={...l};return delete c[i],c}),delete T.current[i]},[]);e.useEffect(()=>{const i=(c=[],a)=>{c.forEach(h=>h(a))},l=c=>{var U,t,n,o,f;if(!((U=c==null?void 0:c.data)!=null&&U.instanceId))return;const{instanceId:a,type:h}=c.data,m=p.current;if(h==="response"){const{callbackId:M,response:$,error:A}=c.data,L=x.current[M];L&&(L($,A),delete x.current[M]);return}if(h==="mark-registered"){const{requestType:M}=c.data;T.current[a]||(T.current[a]=new Set),T.current[a].add(M);return}h==="ready"&&R(M=>({...M,[a]:!0})),i((t=m[a])==null?void 0:t[h],c.data),i((n=m["*"])==null?void 0:n[h],c.data),i((o=m[a])==null?void 0:o["*"],c.data),i((f=m["*"])==null?void 0:f["*"],c.data)};return window.addEventListener("message",l),()=>{window.removeEventListener("message",l)}},[s]);const b=e.useCallback((i,l,c)=>{var h,m;const a=s[i];if(!a){console.warn(`Origin not set for id: ${i}. Unable to send message.`);return}(m=(h=a==null?void 0:a.frameRef)==null?void 0:h.current)!=null&&m.contentWindow&&a.frameRef.current.contentWindow.postMessage({type:l,...c,instanceId:i},a.origin)},[s]),k=e.useRef(0),P=e.useCallback(()=>`${Date.now()}-${++k.current}`,[]),C=e.useCallback(async(i,l,c={})=>new Promise((a,h)=>{const m=P(),U=(t,n)=>{delete x.current[m],n?h(n):a(t)};x.current[m]=U,b(i,"request",{callbackId:m,requestType:l,data:c})}),[b]),O=e.useCallback((i,l)=>{b(i,"load-options",l)},[b]),z=e.useCallback((i,l)=>{b(i,"validate",l)},[b]),S=e.useMemo(()=>({registerFrame:w,unregisterFrame:y,sendMessage:b,sendRequest:C,loadOptions:O,validate:z,hasHandler:I,readyFrames:g,addListener:(i,l,c)=>(p.current[i]||(p.current[i]={}),p.current[i][l]||(p.current[i][l]=[]),p.current[i][l].push(c),()=>{p.current[i][l]=p.current[i][l].filter(a=>a!==c)})}),[w,y,b,C,O,z,I,g]);return e.createElement(v.Provider,{value:S},e.createElement(K,{launcher:u},r))},q=(r,u,s)=>{const d=e.useContext(v);if(d===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const g=e.useRef(s);e.useEffect(()=>{g.current=s},[s]),e.useEffect(()=>{if(!(!r||!u)){if(u.startsWith("key:")){const R=u.substring(4);return d.readyFrames[r]&&d.sendMessage(r,"subscribe-key",{keyChord:R}),d.addListener(r,`key-pressed:${R}`,(...x)=>g.current(...x))}return d.addListener(r,u,(...R)=>g.current(...R))}},[d,r,u])};X.propTypes={children:E.node.isRequired,authorizationLauncher:E.func};const B=j.default||j,te=1e4,ne="credentials",_=(r,u)=>`${r}/mm-embedded-interop?id=${u}&origin=${window.location.origin}&caps=${ne}`,re=B.iframe`
2
2
  width: 100%;
3
3
  height: 100%;
4
4
  border: none;
5
- visibility: ${n=>n.$isReady?"visible":"hidden"};
6
- `,ce=D.div`
5
+ visibility: ${r=>r.$isReady?"visible":"hidden"};
6
+ `,se=B.div`
7
7
  width: 100%;
8
8
  height: 100%;
9
9
  display: flex;
@@ -16,13 +16,13 @@
16
16
  text-align: center;
17
17
  color: #555;
18
18
  font-size: 14px;
19
- `,ne=({entry:n})=>e.createElement(ce,null,e.createElement("div",{style:{fontWeight:600}},n&&(n.name||n.origin)||"This app"," can’t be embedded here"),e.createElement("div",{style:{fontSize:12,color:"#888"}},"It needs an update to support embedding from a different domain."));ne.propTypes={entry:w.shape({origin:w.string,name:w.string,reason:w.string})};const ae=D.div`
19
+ `,Y=({entry:r})=>e.createElement(se,null,e.createElement("div",{style:{fontWeight:600}},r&&(r.name||r.origin)||"This app"," can’t be embedded here"),e.createElement("div",{style:{fontSize:12,color:"#888"}},"It needs an update to support embedding from a different domain."));Y.propTypes={entry:E.shape({origin:E.string,name:E.string,reason:E.string})};const oe=B.div`
20
20
  height: 100%;
21
21
  display: flex;
22
22
  flex: 1;
23
23
  align-items: center;
24
24
  justify-content: center;
25
- `,re=({id:n,src:i,path:o,onInit:l=()=>{},onTimeout:m,context:R={},params:g={},skipManifestCheck:p=!1,renderUnsupported:z,...$})=>{if("isConfiguring"in $)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in R)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in R)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const x=e.useRef(),[y,b]=e.useState(),[M,S]=e.useState(0),[O,L]=e.useState(!1),C=Y(i),T=N(i),u=ee(i);e.useEffect(()=>{C>0&&S(0)},[C]);const{registerFrame:d,unregisterFrame:c,sendMessage:a}=e.useContext(Z),[h,E]=e.useState(!0),[t,r]=e.useState(),s=e.useRef(),f=e.useRef(m),k=e.useRef(l),I=e.useRef(!1);e.useEffect(()=>{f.current=m},[m]),e.useEffect(()=>{k.current=l},[l]),e.useEffect(()=>{M&&a(n,"set-context",{context:{...R,colorMode:g.colorMode,isFullScreen:g.isFullScreen}})},[R,g.colorMode,g.isFullScreen,n,M]),e.useEffect(()=>{M&&(a(n,"set-params",{params:g}),a(n,"set-configuring",{isConfiguring:g.isConfiguring}))},[g,n,M]),e.useEffect(()=>{o!==void 0&&r((o==null?void 0:o.indexOf("/"))===0?o:`/${o}`)},[o]),e.useEffect(()=>{t===void 0||!M||a(n,"navigate",{path:t})},[t,M,n,a]),e.useEffect(()=>{if(!(!i||!n||!x)){if(p){const U=new URL(i);E(!0),d(n,U.origin,x),k.current(),b(W(U.origin,n))}else(async()=>{const U=await V(i);if(E(U),U){const H=new URL(i);d(n,H.origin,x),k.current(),b(W(H.origin,n))}})();return()=>{c(n)}}},[i,n,d,x,p]),e.useEffect(()=>{if(!(!p||!y||I.current))return s.current=setTimeout(()=>{f.current&&f.current()},oe),()=>clearTimeout(s.current)},[y,p]);const P=e.useCallback(()=>{I.current=!0,clearTimeout(s.current)},[]);j(n,"init",P),j(n,"authorize",P),j(n,"login",P),j(n,"credential-request",()=>{P(),L(!0)}),e.useEffect(()=>{!O||!T||a(n,"credential",{accessToken:T.accessToken})},[O,T,n,a]),j(n,"ready",()=>{P(),S(U=>U+1)});const F=e.useRef();return j(n,"heartbeat",()=>{F.current&&clearTimeout(F.current),F.current=setTimeout(()=>{if(x.current){const U=new URL(i);x.current.src=W(U.origin,n)}},6e3)}),e.useEffect(()=>()=>{F.current&&clearTimeout(F.current)},[]),!p&&!h?e.createElement(ae,null,e.createElement("div",{style:{textAlign:"center"}},"Application must adhere to the MM App Manifest specification to be embedded.")):u?z?z(u):e.createElement(ne,{entry:u}):e.createElement(ue,{key:`auth-epoch-${C}`,$isReady:M,ref:x,src:y,...$})};re.propTypes={id:w.string,src:w.string.isRequired,path:w.string,onInit:w.func,onTimeout:w.func,skipManifestCheck:w.bool,renderUnsupported:w.func};const le=q.div`
25
+ `,ie=()=>e.createElement(oe,null,e.createElement("div",{style:{textAlign:"center"}},"This app couldn’t be loaded as an embeddable widget.")),N=({id:r,src:u,path:s,onInit:d=()=>{},onTimeout:g,context:R={},params:p={},renderUnsupported:x,renderTimeout:T,...I})=>{if("isConfiguring"in I)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in R)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in R)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const w=e.useRef(),[y,b]=e.useState(),[k,P]=e.useState(0),[C,O]=e.useState(!1),[z,S]=e.useState(!1),i=G(u),l=J(u),c=Q(u);e.useEffect(()=>{i>0&&P(0)},[i]);const{registerFrame:a,unregisterFrame:h,sendMessage:m}=e.useContext(v),[U,t]=e.useState(),n=e.useRef(),o=e.useRef(g),f=e.useRef(d),M=e.useRef(!1);e.useEffect(()=>{o.current=g},[g]),e.useEffect(()=>{f.current=d},[d]),e.useEffect(()=>{k&&m(r,"set-context",{context:{...R,colorMode:p.colorMode,isFullScreen:p.isFullScreen}})},[R,p.colorMode,p.isFullScreen,r,k]),e.useEffect(()=>{k&&(m(r,"set-params",{params:p}),m(r,"set-configuring",{isConfiguring:p.isConfiguring}))},[p,r,k]),e.useEffect(()=>{s!==void 0&&t((s==null?void 0:s.indexOf("/"))===0?s:`/${s}`)},[s]),e.useEffect(()=>{U===void 0||!k||m(r,"navigate",{path:U})},[U,k,r,m]),e.useEffect(()=>{if(!u||!r||!w)return;const L=new URL(u);return a(r,L.origin,w),f.current(),b(_(L.origin,r)),()=>{h(r)}},[u,r,a,w]),e.useEffect(()=>{if(!(!y||M.current))return n.current=setTimeout(()=>{O(!0),o.current&&o.current()},te),()=>clearTimeout(n.current)},[y]);const $=e.useCallback(()=>{M.current=!0,clearTimeout(n.current),O(!1)},[]);q(r,"init",$),q(r,"authorize",$),q(r,"login",$),q(r,"credential-request",()=>{$(),S(!0)}),e.useEffect(()=>{!z||!l||m(r,"credential",{accessToken:l.accessToken})},[z,l,r,m]),q(r,"ready",()=>{$(),P(L=>L+1)});const A=e.useRef();return q(r,"heartbeat",()=>{A.current&&clearTimeout(A.current),A.current=setTimeout(()=>{if(w.current){const L=new URL(u);w.current.src=_(L.origin,r)}},6e3)}),e.useEffect(()=>()=>{A.current&&clearTimeout(A.current)},[]),c?x?x(c):e.createElement(Y,{entry:c}):C&&!k?T?T():e.createElement(ie,null):e.createElement(re,{key:`auth-epoch-${i}`,$isReady:k,ref:w,src:y,...I})};N.propTypes={id:E.string,src:E.string.isRequired,path:E.string,onInit:E.func,onTimeout:E.func,renderUnsupported:E.func,renderTimeout:E.func};const ue=j.div`
26
26
  position: fixed;
27
27
  inset: 0;
28
28
  background: rgba(0, 0, 0, 0.45);
@@ -30,7 +30,7 @@
30
30
  align-items: center;
31
31
  justify-content: center;
32
32
  z-index: 10000;
33
- `,de=q.div`
33
+ `,ce=j.div`
34
34
  background: #fff;
35
35
  border-radius: 8px;
36
36
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2);
@@ -39,13 +39,13 @@
39
39
  max-width: calc(100vw - 32px);
40
40
  font-family: sans-serif;
41
41
  color: #222;
42
- `,fe=q.div`
42
+ `,le=j.div`
43
43
  display: flex;
44
44
  align-items: center;
45
45
  justify-content: space-between;
46
46
  padding: 10px 0;
47
47
  gap: 16px;
48
- `,me=q.button`
48
+ `,ae=j.button`
49
49
  background: #16a500;
50
50
  color: #fff;
51
51
  border: none;
@@ -54,8 +54,8 @@
54
54
  font-size: 14px;
55
55
  cursor: pointer;
56
56
  white-space: nowrap;
57
- `,ge=q.p`
57
+ `,de=j.p`
58
58
  color: #b3261e;
59
59
  font-size: 13px;
60
60
  margin: 4px 0 0;
61
- `,be=()=>{const{pending:n,authorize:i}=X();return n.length===0?null:e.createElement(le,null,e.createElement(de,null,e.createElement("h3",{style:{margin:"0 0 8px"}},"Authorization Required"),e.createElement("p",{style:{margin:"0 0 12px",fontSize:14,color:"#555"}},"The following apps need you to sign in and authorize them before they can load."),n.map(o=>e.createElement("div",{key:o.origin},e.createElement(fe,null,e.createElement("div",null,e.createElement("div",{style:{fontWeight:600}},o.name||o.origin),o.name&&e.createElement("div",{style:{fontSize:12,color:"#888"}},o.origin)),e.createElement(me,{onClick:()=>i(o)},"Authorize")),o.popupBlocked&&e.createElement(ge,null,"The sign-in window was blocked. Allow popups for this site, then try again.")))))};exports.EmbeddedAuthorizationContext=v;exports.EmbeddedAuthorizationPrompt=be;exports.MMEmbeddableZone=re;exports.MMEmbeddableZoneContext=Z;exports.MMEmbeddableZoneProvider=te;exports.getAppInfo=_;exports.isCrossSite=G;exports.popupAuthorizationLauncher=J;exports.testIsEmbeddable=V;exports.useEmbeddedAuthorizations=X;exports.useEmbeddedCredential=N;exports.useEmbeddedEffect=j;exports.useEmbeddedOriginEpoch=Y;exports.useEmbeddedUnsupported=ee;
61
+ `,fe=()=>{const{pending:r,authorize:u}=V();return r.length===0?null:e.createElement(ue,null,e.createElement(ce,null,e.createElement("h3",{style:{margin:"0 0 8px"}},"Authorization Required"),e.createElement("p",{style:{margin:"0 0 12px",fontSize:14,color:"#555"}},"The following apps need you to sign in and authorize them before they can load."),r.map(s=>e.createElement("div",{key:s.origin},e.createElement(le,null,e.createElement("div",null,e.createElement("div",{style:{fontWeight:600}},s.name||s.origin),s.name&&e.createElement("div",{style:{fontSize:12,color:"#888"}},s.origin)),e.createElement(ae,{onClick:()=>u(s)},"Authorize")),s.popupBlocked&&e.createElement(de,null,"The sign-in window was blocked. Allow popups for this site, then try again.")))))};exports.EmbeddedAuthorizationContext=Z;exports.EmbeddedAuthorizationPrompt=fe;exports.MMEmbeddableZone=N;exports.MMEmbeddableZoneContext=v;exports.MMEmbeddableZoneProvider=X;exports.isCrossSite=D;exports.popupAuthorizationLauncher=H;exports.useEmbeddedAuthorizations=V;exports.useEmbeddedCredential=J;exports.useEmbeddedEffect=q;exports.useEmbeddedOriginEpoch=G;exports.useEmbeddedUnsupported=Q;
@@ -1,19 +1,7 @@
1
- import f, { createContext as X, useContext as Z, useState as I, useRef as T, useCallback as b, useEffect as h, useMemo as te } from "react";
2
- import R from "prop-types";
1
+ import f, { createContext as J, useContext as Z, useState as L, useRef as R, useCallback as b, useEffect as h, useMemo as Y } from "react";
2
+ import x from "prop-types";
3
3
  import W from "styled-components";
4
- const K = X(null), H = {}, Y = async (t) => {
5
- let o;
6
- try {
7
- if (o = new URL(t).origin, H[o] !== void 0)
8
- return H[o];
9
- const a = await (await fetch(`${o}/mm-app-manifest.json`)).json();
10
- if (!a.version)
11
- throw new Error("Invalid manifest");
12
- return H[o] = a, a;
13
- } catch {
14
- }
15
- return o && (H[o] = !1), !1;
16
- }, ne = async (t) => !!await Y(t), D = X({
4
+ const H = J(null), D = J({
17
5
  pending: [],
18
6
  authorize: () => {
19
7
  },
@@ -22,196 +10,202 @@ const K = X(null), H = {}, Y = async (t) => {
22
10
  originEpochs: {},
23
11
  credentials: {},
24
12
  unsupported: {}
25
- }), re = 2e4, j = (t) => {
13
+ }), N = 2e4, A = (n) => {
26
14
  try {
27
- return new URL(t).origin;
15
+ return new URL(n).origin;
28
16
  } catch {
29
17
  return null;
30
18
  }
31
- }, Q = (t) => {
32
- if (!t || /^\d{1,3}(?:\.\d{1,3}){3}$/.test(t) || t.includes(":"))
33
- return t;
34
- const o = t.split(".");
35
- return o.length <= 2 ? t : o.slice(-2).join(".");
36
- }, se = (t, o) => {
19
+ }, V = (n) => {
20
+ if (!n || /^\d{1,3}(?:\.\d{1,3}){3}$/.test(n) || n.includes(":"))
21
+ return n;
22
+ const o = n.split(".");
23
+ return o.length <= 2 ? n : o.slice(-2).join(".");
24
+ }, ee = (n, o) => {
37
25
  try {
38
- const s = new URL(t), a = new URL(o);
39
- return s.protocol !== a.protocol ? !0 : Q(s.hostname) !== Q(a.hostname);
26
+ const r = new URL(n), a = new URL(o);
27
+ return r.protocol !== a.protocol ? !0 : V(r.hostname) !== V(a.hostname);
40
28
  } catch {
41
29
  return !0;
42
30
  }
43
- }, oe = (t, { onBlocked: o, onClosed: s }) => {
31
+ }, te = (n, { onBlocked: o, onClosed: r }) => {
44
32
  const a = window.open(
45
- t.authUrl,
33
+ n.authUrl,
46
34
  "mm-embed-auth",
47
35
  "popup,width=600,height=700"
48
36
  );
49
37
  if (!a)
50
38
  return o(), () => {
51
39
  };
52
- const m = setInterval(() => {
53
- a.closed && (clearInterval(m), s());
40
+ const g = setInterval(() => {
41
+ a.closed && (clearInterval(g), r());
54
42
  }, 1e3);
55
- return () => clearInterval(m);
56
- }, N = ({ children: t, launcher: o }) => {
57
- const s = Z(K), [a, m] = I({}), [U, g] = I({}), [E, O] = I({}), [q, M] = I({}), $ = T(E);
58
- $.current = E;
59
- const p = T(null), k = T({}), C = b((e, n) => {
60
- Y(n).then((r) => {
61
- if (!r || !r.name)
62
- return;
63
- const d = (y) => y[e] ? { ...y, [e]: { ...y[e], name: r.name } } : y;
64
- m(d), M(d);
65
- });
43
+ return () => clearInterval(g);
44
+ }, Q = ({ children: n, launcher: o }) => {
45
+ const r = Z(H), [a, g] = L({}), [T, p] = L({}), [M, C] = L({}), [j, z] = L({}), I = R(M);
46
+ I.current = M;
47
+ const E = R(null), k = R({}), q = R({}), U = b((e) => {
48
+ const t = q.current[e];
49
+ if (!t)
50
+ return;
51
+ const s = (d) => d[e] ? { ...d, [e]: { ...d[e], name: t } } : d;
52
+ g(s), z(s);
66
53
  }, []), P = b(
67
- (e, n) => {
68
- const r = j(e == null ? void 0 : e.authUrl);
69
- r && (M((d) => d[r] ? d : {
54
+ (e, t) => {
55
+ const s = A(e == null ? void 0 : e.authUrl);
56
+ s && (z((d) => d[s] ? d : {
70
57
  ...d,
71
- [r]: { origin: r, reason: n, name: null }
72
- }), C(r, e.authUrl));
58
+ [s]: { origin: s, reason: t, name: null }
59
+ }), U(s));
73
60
  },
74
- [C]
75
- ), F = b(
76
- (e, { v2: n = !1 } = {}) => {
77
- const r = j(e == null ? void 0 : e.authUrl);
78
- r && (n && $.current[r] || (m((d) => d[r] ? d : {
61
+ [U]
62
+ ), O = b(
63
+ (e, { v2: t = !1 } = {}) => {
64
+ const s = A(e == null ? void 0 : e.authUrl);
65
+ s && (t && I.current[s] || (g((d) => d[s] ? d : {
79
66
  ...d,
80
- [r]: {
81
- origin: r,
67
+ [s]: {
68
+ origin: s,
82
69
  authUrl: e.authUrl,
83
70
  silentUrl: e.silentUrl || null,
84
71
  // v2 entries try the invisible silent resolver first; legacy
85
72
  // signals go straight to the host's interactive UI.
86
- status: n && e.silentUrl ? "silent" : "interactive",
87
- v2: n,
73
+ status: t && e.silentUrl ? "silent" : "interactive",
74
+ v2: t,
88
75
  name: null,
89
76
  popupBlocked: !1
90
77
  }
91
- }), C(r, e.authUrl)));
78
+ }), U(s)));
92
79
  },
93
- [C]
94
- ), z = b((e) => {
95
- m((n) => {
96
- if (!n[e])
97
- return n;
98
- const r = { ...n };
99
- return delete r[e], r;
80
+ [U]
81
+ ), S = b((e) => {
82
+ g((t) => {
83
+ if (!t[e])
84
+ return t;
85
+ const s = { ...t };
86
+ return delete s[e], s;
100
87
  });
101
- }, []), S = b(
88
+ }, []), i = b(
102
89
  (e) => {
103
- e && (z(e), g((n) => ({
104
- ...n,
105
- [e]: (n[e] || 0) + 1
90
+ e && (S(e), p((t) => ({
91
+ ...t,
92
+ [e]: (t[e] || 0) + 1
106
93
  })));
107
94
  },
108
- [z]
109
- ), i = b((e) => {
110
- m((n) => !n[e] || n[e].status === "interactive" ? n : {
111
- ...n,
112
- [e]: { ...n[e], status: "interactive" }
95
+ [S]
96
+ ), u = b((e) => {
97
+ g((t) => !t[e] || t[e].status === "interactive" ? t : {
98
+ ...t,
99
+ [e]: { ...t[e], status: "interactive" }
113
100
  });
114
- }, []), l = b(
101
+ }, []), c = b(
115
102
  (e) => {
116
- z(e.origin);
103
+ S(e.origin);
117
104
  },
118
- [z]
119
- ), c = b(
105
+ [S]
106
+ ), l = b(
120
107
  (e) => {
121
- const n = j(e == null ? void 0 : e.authUrl);
122
- if (n && se(n, window.location.origin)) {
108
+ const t = A(e == null ? void 0 : e.authUrl);
109
+ if (t && ee(t, window.location.origin)) {
123
110
  P(e, "cross-site-legacy");
124
111
  return;
125
112
  }
126
- F(e);
113
+ O(e);
127
114
  },
128
- [F, P]
115
+ [O, P]
129
116
  );
130
117
  h(() => {
131
- if (!s)
118
+ if (!r)
132
119
  return;
133
120
  const e = [
134
- s.addListener("*", "authorize", c),
135
- s.addListener("*", "login", c),
136
- s.addListener(
121
+ // `init` carries the app's display name (v2 apps). Cache it by app origin
122
+ // and enrich any entry already showing for that origin. `init` is posted
123
+ // before the authorize/login/credential-request signals, so the name is
124
+ // usually cached by the time an entry is created.
125
+ r.addListener("*", "init", (t) => {
126
+ t != null && t.origin && t.name && (q.current[t.origin] = t.name, U(t.origin));
127
+ }),
128
+ r.addListener("*", "authorize", l),
129
+ r.addListener("*", "login", l),
130
+ r.addListener(
137
131
  "*",
138
132
  "credential-request",
139
- (n) => F(n, { v2: !0 })
133
+ (t) => O(t, { v2: !0 })
140
134
  ),
141
- s.addListener("*", "authorized", (n) => {
142
- n != null && n.accessToken || S(j(n == null ? void 0 : n.authUrl));
135
+ r.addListener("*", "authorized", (t) => {
136
+ t != null && t.accessToken || i(A(t == null ? void 0 : t.authUrl));
143
137
  })
144
138
  ];
145
- return () => e.forEach((n) => n());
146
- }, [s, c, F, S]), h(() => {
147
- const e = (n) => {
148
- const r = n == null ? void 0 : n.data;
149
- if (!r || r.type !== "authorized" && r.type !== "authorize-failed")
139
+ return () => e.forEach((t) => t());
140
+ }, [r, l, O, i, U]), h(() => {
141
+ const e = (t) => {
142
+ const s = t == null ? void 0 : t.data;
143
+ if (!s || s.type !== "authorized" && s.type !== "authorize-failed")
150
144
  return;
151
- const d = j(r.authUrl);
152
- if (!(!d || n.origin !== d)) {
153
- if (r.type === "authorized" && r.accessToken) {
154
- O((y) => ({
145
+ const d = A(s.authUrl);
146
+ if (!(!d || t.origin !== d)) {
147
+ if (s.type === "authorized" && s.accessToken) {
148
+ C((y) => ({
155
149
  ...y,
156
- [d]: { accessToken: r.accessToken }
157
- })), z(d);
150
+ [d]: { accessToken: s.accessToken }
151
+ })), S(d);
158
152
  return;
159
153
  }
160
- r.type === "authorize-failed" && i(d);
154
+ s.type === "authorize-failed" && u(d);
161
155
  }
162
156
  };
163
157
  return window.addEventListener("message", e), () => window.removeEventListener("message", e);
164
- }, [z, i]), h(() => {
158
+ }, [S, u]), h(() => {
165
159
  const e = k.current;
166
- Object.values(a).forEach((n) => {
167
- n.status === "silent" && !e[n.origin] && (e[n.origin] = setTimeout(() => {
168
- delete e[n.origin], i(n.origin);
169
- }, re));
170
- }), Object.keys(e).forEach((n) => {
171
- (!a[n] || a[n].status !== "silent") && (clearTimeout(e[n]), delete e[n]);
160
+ Object.values(a).forEach((t) => {
161
+ t.status === "silent" && !e[t.origin] && (e[t.origin] = setTimeout(() => {
162
+ delete e[t.origin], u(t.origin);
163
+ }, N));
164
+ }), Object.keys(e).forEach((t) => {
165
+ (!a[t] || a[t].status !== "silent") && (clearTimeout(e[t]), delete e[t]);
172
166
  });
173
- }, [a, i]), h(() => () => {
174
- p.current && p.current(), Object.values(k.current).forEach(clearTimeout);
167
+ }, [a, u]), h(() => () => {
168
+ E.current && E.current(), Object.values(k.current).forEach(clearTimeout);
175
169
  }, []);
176
- const u = b(
170
+ const w = b(
177
171
  (e) => {
178
- p.current && (p.current(), p.current = null);
179
- const n = o || oe;
180
- p.current = n(e, {
172
+ E.current && (E.current(), E.current = null);
173
+ const t = o || te;
174
+ E.current = t(e, {
181
175
  onBlocked: () => {
182
- m((r) => r[e.origin] ? {
183
- ...r,
184
- [e.origin]: { ...r[e.origin], popupBlocked: !0 }
185
- } : r);
176
+ g((s) => s[e.origin] ? {
177
+ ...s,
178
+ [e.origin]: { ...s[e.origin], popupBlocked: !0 }
179
+ } : s);
186
180
  },
187
181
  onClosed: () => {
188
182
  if (e.v2) {
189
- m((r) => !r[e.origin] || !r[e.origin].silentUrl ? r : {
190
- ...r,
191
- [e.origin]: { ...r[e.origin], status: "silent" }
183
+ g((s) => !s[e.origin] || !s[e.origin].silentUrl ? s : {
184
+ ...s,
185
+ [e.origin]: { ...s[e.origin], status: "silent" }
192
186
  });
193
187
  return;
194
188
  }
195
- S(e.origin);
189
+ i(e.origin);
196
190
  }
197
191
  });
198
192
  },
199
- [o, S]
200
- ), w = {
193
+ [o, i]
194
+ ), m = {
201
195
  // Hosts render UI for interactive entries only; silent resolution is
202
196
  // invisible by design.
203
197
  pending: Object.values(a).filter(
204
198
  (e) => e.status === "interactive"
205
199
  ),
206
- authorize: u,
207
- dismiss: l,
208
- originEpochs: U,
209
- credentials: E,
210
- unsupported: q
211
- }, x = Object.values(a).filter(
200
+ authorize: w,
201
+ dismiss: c,
202
+ originEpochs: T,
203
+ credentials: M,
204
+ unsupported: j
205
+ }, F = Object.values(a).filter(
212
206
  (e) => e.status === "silent" && e.silentUrl
213
207
  );
214
- return /* @__PURE__ */ f.createElement(D.Provider, { value: w }, t, x.map((e) => /* @__PURE__ */ f.createElement(
208
+ return /* @__PURE__ */ f.createElement(D.Provider, { value: m }, n, F.map((e) => /* @__PURE__ */ f.createElement(
215
209
  "iframe",
216
210
  {
217
211
  key: `mm-silent-auth-${e.origin}`,
@@ -223,159 +217,159 @@ const K = X(null), H = {}, Y = async (t) => {
223
217
  }
224
218
  )));
225
219
  };
226
- N.propTypes = {
227
- children: R.node,
228
- launcher: R.func
220
+ Q.propTypes = {
221
+ children: x.node,
222
+ launcher: x.func
229
223
  };
230
- const ie = () => Z(D), ce = (t) => {
231
- const { originEpochs: o } = Z(D), s = j(t);
232
- return s && o[s] || 0;
233
- }, ue = (t) => {
234
- const { credentials: o } = Z(D), s = j(t);
235
- return s && o[s] || null;
236
- }, ae = (t) => {
237
- const { unsupported: o } = Z(D), s = j(t);
238
- return s && o[s] || null;
239
- }, le = ({ children: t, authorizationLauncher: o }) => {
240
- const [s, a] = I({}), [m, U] = I({}), g = T({}), E = T({}), O = T({}), q = b((i, l) => {
224
+ const ne = () => Z(D), re = (n) => {
225
+ const { originEpochs: o } = Z(D), r = A(n);
226
+ return r && o[r] || 0;
227
+ }, se = (n) => {
228
+ const { credentials: o } = Z(D), r = A(n);
229
+ return r && o[r] || null;
230
+ }, ie = (n) => {
231
+ const { unsupported: o } = Z(D), r = A(n);
232
+ return r && o[r] || null;
233
+ }, oe = ({ children: n, authorizationLauncher: o }) => {
234
+ const [r, a] = L({}), [g, T] = L({}), p = R({}), M = R({}), C = R({}), j = b((i, u) => {
241
235
  var c;
242
- return !!((c = O.current[i]) != null && c.has(l));
243
- }, []), M = b((i, l, c) => {
244
- a((u) => ({ ...u, [i]: { origin: l, frameRef: c } }));
245
- }, []), $ = b((i) => {
246
- a((l) => {
247
- const c = { ...l };
236
+ return !!((c = C.current[i]) != null && c.has(u));
237
+ }, []), z = b((i, u, c) => {
238
+ a((l) => ({ ...l, [i]: { origin: u, frameRef: c } }));
239
+ }, []), I = b((i) => {
240
+ a((u) => {
241
+ const c = { ...u };
248
242
  return delete c[i], c;
249
- }), U((l) => {
250
- const c = { ...l };
243
+ }), T((u) => {
244
+ const c = { ...u };
251
245
  return delete c[i], c;
252
- }), delete O.current[i];
246
+ }), delete C.current[i];
253
247
  }, []);
254
248
  h(() => {
255
- const i = (c = [], u) => {
256
- c.forEach((w) => w(u));
257
- }, l = (c) => {
258
- var e, n, r, d, y;
259
- if (!((e = c == null ? void 0 : c.data) != null && e.instanceId))
249
+ const i = (c = [], l) => {
250
+ c.forEach((w) => w(l));
251
+ }, u = (c) => {
252
+ var F, e, t, s, d;
253
+ if (!((F = c == null ? void 0 : c.data) != null && F.instanceId))
260
254
  return;
261
- const { instanceId: u, type: w } = c.data, x = g.current;
255
+ const { instanceId: l, type: w } = c.data, m = p.current;
262
256
  if (w === "response") {
263
- const { callbackId: A, response: v, error: B } = c.data, L = E.current[A];
264
- L && (L(v, B), delete E.current[A]);
257
+ const { callbackId: y, response: B, error: v } = c.data, $ = M.current[y];
258
+ $ && ($(B, v), delete M.current[y]);
265
259
  return;
266
260
  }
267
261
  if (w === "mark-registered") {
268
- const { requestType: A } = c.data;
269
- O.current[u] || (O.current[u] = /* @__PURE__ */ new Set()), O.current[u].add(A);
262
+ const { requestType: y } = c.data;
263
+ C.current[l] || (C.current[l] = /* @__PURE__ */ new Set()), C.current[l].add(y);
270
264
  return;
271
265
  }
272
- w === "ready" && U((A) => ({ ...A, [u]: !0 })), i((n = x[u]) == null ? void 0 : n[w], c.data), i((r = x["*"]) == null ? void 0 : r[w], c.data), i((d = x[u]) == null ? void 0 : d["*"], c.data), i((y = x["*"]) == null ? void 0 : y["*"], c.data);
266
+ w === "ready" && T((y) => ({ ...y, [l]: !0 })), i((e = m[l]) == null ? void 0 : e[w], c.data), i((t = m["*"]) == null ? void 0 : t[w], c.data), i((s = m[l]) == null ? void 0 : s["*"], c.data), i((d = m["*"]) == null ? void 0 : d["*"], c.data);
273
267
  };
274
- return window.addEventListener("message", l), () => {
275
- window.removeEventListener("message", l);
268
+ return window.addEventListener("message", u), () => {
269
+ window.removeEventListener("message", u);
276
270
  };
277
- }, [s]);
278
- const p = b(
279
- (i, l, c) => {
280
- var w, x;
281
- const u = s[i];
282
- if (!u) {
271
+ }, [r]);
272
+ const E = b(
273
+ (i, u, c) => {
274
+ var w, m;
275
+ const l = r[i];
276
+ if (!l) {
283
277
  console.warn(`Origin not set for id: ${i}. Unable to send message.`);
284
278
  return;
285
279
  }
286
- (x = (w = u == null ? void 0 : u.frameRef) == null ? void 0 : w.current) != null && x.contentWindow && u.frameRef.current.contentWindow.postMessage(
287
- { type: l, ...c, instanceId: i },
288
- u.origin
280
+ (m = (w = l == null ? void 0 : l.frameRef) == null ? void 0 : w.current) != null && m.contentWindow && l.frameRef.current.contentWindow.postMessage(
281
+ { type: u, ...c, instanceId: i },
282
+ l.origin
289
283
  );
290
284
  },
291
- [s]
292
- ), k = T(0), C = b(() => `${Date.now()}-${++k.current}`, []), P = b(
293
- async (i, l, c = {}) => new Promise((u, w) => {
294
- const x = C(), e = (n, r) => {
295
- delete E.current[x], r ? w(r) : u(n);
285
+ [r]
286
+ ), k = R(0), q = b(() => `${Date.now()}-${++k.current}`, []), U = b(
287
+ async (i, u, c = {}) => new Promise((l, w) => {
288
+ const m = q(), F = (e, t) => {
289
+ delete M.current[m], t ? w(t) : l(e);
296
290
  };
297
- E.current[x] = e, p(i, "request", { callbackId: x, requestType: l, data: c });
291
+ M.current[m] = F, E(i, "request", { callbackId: m, requestType: u, data: c });
298
292
  }),
299
- [p]
300
- ), F = b(
301
- (i, l) => {
302
- p(i, "load-options", l);
293
+ [E]
294
+ ), P = b(
295
+ (i, u) => {
296
+ E(i, "load-options", u);
303
297
  },
304
- [p]
305
- ), z = b(
306
- (i, l) => {
307
- p(i, "validate", l);
298
+ [E]
299
+ ), O = b(
300
+ (i, u) => {
301
+ E(i, "validate", u);
308
302
  },
309
- [p]
310
- ), S = te(
303
+ [E]
304
+ ), S = Y(
311
305
  () => ({
312
- registerFrame: M,
313
- unregisterFrame: $,
314
- sendMessage: p,
315
- sendRequest: P,
316
- loadOptions: F,
317
- validate: z,
318
- hasHandler: q,
319
- readyFrames: m,
320
- addListener: (i, l, c) => (g.current[i] || (g.current[i] = {}), g.current[i][l] || (g.current[i][l] = []), g.current[i][l].push(c), () => {
321
- g.current[i][l] = g.current[i][l].filter((u) => u !== c);
306
+ registerFrame: z,
307
+ unregisterFrame: I,
308
+ sendMessage: E,
309
+ sendRequest: U,
310
+ loadOptions: P,
311
+ validate: O,
312
+ hasHandler: j,
313
+ readyFrames: g,
314
+ addListener: (i, u, c) => (p.current[i] || (p.current[i] = {}), p.current[i][u] || (p.current[i][u] = []), p.current[i][u].push(c), () => {
315
+ p.current[i][u] = p.current[i][u].filter((l) => l !== c);
322
316
  })
323
317
  }),
324
318
  [
325
- M,
326
- $,
327
- p,
328
- P,
329
- F,
330
319
  z,
331
- q,
332
- m
320
+ I,
321
+ E,
322
+ U,
323
+ P,
324
+ O,
325
+ j,
326
+ g
333
327
  ]
334
328
  );
335
- return /* @__PURE__ */ f.createElement(K.Provider, { value: S }, /* @__PURE__ */ f.createElement(N, { launcher: o }, t));
336
- }, _ = (t, o, s) => {
337
- const a = Z(K);
329
+ return /* @__PURE__ */ f.createElement(H.Provider, { value: S }, /* @__PURE__ */ f.createElement(Q, { launcher: o }, n));
330
+ }, _ = (n, o, r) => {
331
+ const a = Z(H);
338
332
  if (a === null)
339
333
  throw new Error(
340
334
  "useEmbeddedEffect must be used within a MMEmbeddableZoneProvider"
341
335
  );
342
- const m = T(s);
336
+ const g = R(r);
343
337
  h(() => {
344
- m.current = s;
345
- }, [s]), h(() => {
346
- if (!(!t || !o)) {
338
+ g.current = r;
339
+ }, [r]), h(() => {
340
+ if (!(!n || !o)) {
347
341
  if (o.startsWith("key:")) {
348
- const U = o.substring(4);
349
- return a.readyFrames[t] && a.sendMessage(t, "subscribe-key", { keyChord: U }), a.addListener(
350
- t,
351
- `key-pressed:${U}`,
352
- (...E) => m.current(...E)
342
+ const T = o.substring(4);
343
+ return a.readyFrames[n] && a.sendMessage(n, "subscribe-key", { keyChord: T }), a.addListener(
344
+ n,
345
+ `key-pressed:${T}`,
346
+ (...M) => g.current(...M)
353
347
  );
354
348
  }
355
349
  return a.addListener(
356
- t,
350
+ n,
357
351
  o,
358
- (...U) => m.current(...U)
352
+ (...T) => g.current(...T)
359
353
  );
360
354
  }
361
- }, [a, t, o]);
355
+ }, [a, n, o]);
362
356
  };
363
- le.propTypes = {
364
- children: R.node.isRequired,
357
+ oe.propTypes = {
358
+ children: x.node.isRequired,
365
359
  /**
366
360
  * Optional interactive-step launcher for embedded authorizations,
367
361
  * `(entry, { onBlocked, onClosed }) => cleanup`. Defaults to a top-level
368
362
  * popup. Hosts that cannot open windows (Android WebView shells) drive
369
363
  * their own UI from useEmbeddedAuthorizations() instead.
370
364
  */
371
- authorizationLauncher: R.func
365
+ authorizationLauncher: x.func
372
366
  };
373
- const G = W.default || W, de = 1e4, fe = "credentials", V = (t, o) => `${t}/mm-embedded-interop?id=${o}&origin=${window.location.origin}&caps=${fe}`, me = G.iframe`
367
+ const K = W.default || W, ce = 1e4, ue = "credentials", G = (n, o) => `${n}/mm-embedded-interop?id=${o}&origin=${window.location.origin}&caps=${ue}`, le = K.iframe`
374
368
  width: 100%;
375
369
  height: 100%;
376
370
  border: none;
377
- visibility: ${(t) => t.$isReady ? "visible" : "hidden"};
378
- `, ge = G.div`
371
+ visibility: ${(n) => n.$isReady ? "visible" : "hidden"};
372
+ `, ae = K.div`
379
373
  width: 100%;
380
374
  height: 100%;
381
375
  display: flex;
@@ -388,140 +382,135 @@ const G = W.default || W, de = 1e4, fe = "credentials", V = (t, o) => `${t}/mm-e
388
382
  text-align: center;
389
383
  color: #555;
390
384
  font-size: 14px;
391
- `, ee = ({ entry: t }) => /* @__PURE__ */ f.createElement(ge, null, /* @__PURE__ */ f.createElement("div", { style: { fontWeight: 600 } }, t && (t.name || t.origin) || "This app", " can’t be embedded here"), /* @__PURE__ */ f.createElement("div", { style: { fontSize: 12, color: "#888" } }, "It needs an update to support embedding from a different domain."));
392
- ee.propTypes = {
393
- entry: R.shape({
394
- origin: R.string,
395
- name: R.string,
396
- reason: R.string
385
+ `, X = ({ entry: n }) => /* @__PURE__ */ f.createElement(ae, null, /* @__PURE__ */ f.createElement("div", { style: { fontWeight: 600 } }, n && (n.name || n.origin) || "This app", " can’t be embedded here"), /* @__PURE__ */ f.createElement("div", { style: { fontSize: 12, color: "#888" } }, "It needs an update to support embedding from a different domain."));
386
+ X.propTypes = {
387
+ entry: x.shape({
388
+ origin: x.string,
389
+ name: x.string,
390
+ reason: x.string
397
391
  })
398
392
  };
399
- const pe = G.div`
393
+ const de = K.div`
400
394
  height: 100%;
401
395
  display: flex;
402
396
  flex: 1;
403
397
  align-items: center;
404
398
  justify-content: center;
405
- `, he = ({
406
- id: t,
399
+ `, fe = () => /* @__PURE__ */ f.createElement(de, null, /* @__PURE__ */ f.createElement("div", { style: { textAlign: "center" } }, "This app couldn’t be loaded as an embeddable widget.")), me = ({
400
+ id: n,
407
401
  src: o,
408
- path: s,
402
+ path: r,
409
403
  onInit: a = () => {
410
404
  },
411
- onTimeout: m,
412
- context: U = {},
413
- params: g = {},
414
- skipManifestCheck: E = !1,
415
- renderUnsupported: O,
416
- ...q
405
+ onTimeout: g,
406
+ context: T = {},
407
+ params: p = {},
408
+ renderUnsupported: M,
409
+ renderTimeout: C,
410
+ ...j
417
411
  }) => {
418
- if ("isConfiguring" in q)
412
+ if ("isConfiguring" in j)
419
413
  return console.error(
420
414
  "isConfiguring must be passed via the params prop to MMEmbeddableZone"
421
415
  ), null;
422
- if ("colorMode" in U)
416
+ if ("colorMode" in T)
423
417
  return console.error(
424
418
  "colorMode must be passed via the params prop to MMEmbeddableZone"
425
419
  ), null;
426
- if ("isFullScreen" in U)
420
+ if ("isFullScreen" in T)
427
421
  return console.error(
428
422
  "isFullScreen must be passed via the params prop to MMEmbeddableZone"
429
423
  ), null;
430
- const M = T(), [$, p] = I(), [k, C] = I(0), [P, F] = I(!1), z = ce(o), S = ue(o), i = ae(o);
424
+ const z = R(), [I, E] = L(), [k, q] = L(0), [U, P] = L(!1), [O, S] = L(!1), i = re(o), u = se(o), c = ie(o);
431
425
  h(() => {
432
- z > 0 && C(0);
433
- }, [z]);
434
- const { registerFrame: l, unregisterFrame: c, sendMessage: u } = Z(
435
- K
436
- ), [w, x] = I(!0), [e, n] = I(), r = T(), d = T(m), y = T(a), A = T(!1);
426
+ i > 0 && q(0);
427
+ }, [i]);
428
+ const { registerFrame: l, unregisterFrame: w, sendMessage: m } = Z(
429
+ H
430
+ ), [F, e] = L(), t = R(), s = R(g), d = R(a), y = R(!1);
437
431
  h(() => {
438
- d.current = m;
439
- }, [m]), h(() => {
440
- y.current = a;
432
+ s.current = g;
433
+ }, [g]), h(() => {
434
+ d.current = a;
441
435
  }, [a]), h(() => {
442
- k && u(t, "set-context", {
436
+ k && m(n, "set-context", {
443
437
  context: {
444
- ...U,
438
+ ...T,
445
439
  // TODO: Remove this once everything is migrated to params
446
- colorMode: g.colorMode,
447
- isFullScreen: g.isFullScreen
440
+ colorMode: p.colorMode,
441
+ isFullScreen: p.isFullScreen
448
442
  }
449
443
  });
450
- }, [U, g.colorMode, g.isFullScreen, t, k]), h(() => {
451
- k && (u(t, "set-params", { params: g }), u(t, "set-configuring", { isConfiguring: g.isConfiguring }));
452
- }, [g, t, k]), h(() => {
453
- s !== void 0 && n((s == null ? void 0 : s.indexOf("/")) === 0 ? s : `/${s}`);
454
- }, [s]), h(() => {
455
- e === void 0 || !k || u(t, "navigate", { path: e });
456
- }, [e, k, t, u]), h(() => {
457
- if (!(!o || !t || !M)) {
458
- if (E) {
459
- const L = new URL(o);
460
- x(!0), l(t, L.origin, M), y.current(), p(V(L.origin, t));
461
- } else
462
- (async () => {
463
- const L = await ne(o);
464
- if (x(L), L) {
465
- const J = new URL(o);
466
- l(t, J.origin, M), y.current(), p(V(J.origin, t));
467
- }
468
- })();
469
- return () => {
470
- c(t);
471
- };
472
- }
473
- }, [o, t, l, M, E]), h(() => {
474
- if (!(!E || !$ || A.current))
475
- return r.current = setTimeout(() => {
476
- d.current && d.current();
477
- }, de), () => clearTimeout(r.current);
478
- }, [$, E]);
479
- const v = b(() => {
480
- A.current = !0, clearTimeout(r.current);
444
+ }, [T, p.colorMode, p.isFullScreen, n, k]), h(() => {
445
+ k && (m(n, "set-params", { params: p }), m(n, "set-configuring", { isConfiguring: p.isConfiguring }));
446
+ }, [p, n, k]), h(() => {
447
+ r !== void 0 && e((r == null ? void 0 : r.indexOf("/")) === 0 ? r : `/${r}`);
448
+ }, [r]), h(() => {
449
+ F === void 0 || !k || m(n, "navigate", { path: F });
450
+ }, [F, k, n, m]), h(() => {
451
+ if (!o || !n || !z)
452
+ return;
453
+ const $ = new URL(o);
454
+ return l(n, $.origin, z), d.current(), E(G($.origin, n)), () => {
455
+ w(n);
456
+ };
457
+ }, [o, n, l, z]), h(() => {
458
+ if (!(!I || y.current))
459
+ return t.current = setTimeout(() => {
460
+ P(!0), s.current && s.current();
461
+ }, ce), () => clearTimeout(t.current);
462
+ }, [I]);
463
+ const B = b(() => {
464
+ y.current = !0, clearTimeout(t.current), P(!1);
481
465
  }, []);
482
- _(t, "init", v), _(t, "authorize", v), _(t, "login", v), _(t, "credential-request", () => {
483
- v(), F(!0);
466
+ _(n, "init", B), _(n, "authorize", B), _(n, "login", B), _(n, "credential-request", () => {
467
+ B(), S(!0);
484
468
  }), h(() => {
485
- !P || !S || u(t, "credential", { accessToken: S.accessToken });
486
- }, [P, S, t, u]), _(t, "ready", () => {
487
- v(), C((L) => L + 1);
469
+ !O || !u || m(n, "credential", { accessToken: u.accessToken });
470
+ }, [O, u, n, m]), _(n, "ready", () => {
471
+ B(), q(($) => $ + 1);
488
472
  });
489
- const B = T();
490
- return _(t, "heartbeat", () => {
491
- B.current && clearTimeout(B.current), B.current = setTimeout(() => {
492
- if (M.current) {
493
- const L = new URL(o);
494
- M.current.src = V(L.origin, t);
473
+ const v = R();
474
+ return _(n, "heartbeat", () => {
475
+ v.current && clearTimeout(v.current), v.current = setTimeout(() => {
476
+ if (z.current) {
477
+ const $ = new URL(o);
478
+ z.current.src = G($.origin, n);
495
479
  }
496
480
  }, 6e3);
497
481
  }), h(() => () => {
498
- B.current && clearTimeout(B.current);
499
- }, []), !E && !w ? /* @__PURE__ */ f.createElement(pe, null, /* @__PURE__ */ f.createElement("div", { style: { textAlign: "center" } }, "Application must adhere to the MM App Manifest specification to be embedded.")) : i ? O ? O(i) : /* @__PURE__ */ f.createElement(ee, { entry: i }) : /* @__PURE__ */ f.createElement(
500
- me,
482
+ v.current && clearTimeout(v.current);
483
+ }, []), c ? M ? M(c) : /* @__PURE__ */ f.createElement(X, { entry: c }) : U && !k ? C ? C() : /* @__PURE__ */ f.createElement(fe, null) : /* @__PURE__ */ f.createElement(
484
+ le,
501
485
  {
502
- key: `auth-epoch-${z}`,
486
+ key: `auth-epoch-${i}`,
503
487
  $isReady: k,
504
- ref: M,
505
- src: $,
506
- ...q
488
+ ref: z,
489
+ src: I,
490
+ ...j
507
491
  }
508
492
  );
509
493
  };
510
- he.propTypes = {
511
- id: R.string,
512
- src: R.string.isRequired,
513
- path: R.string,
514
- onInit: R.func,
515
- onTimeout: R.func,
516
- skipManifestCheck: R.bool,
494
+ me.propTypes = {
495
+ id: x.string,
496
+ src: x.string.isRequired,
497
+ path: x.string,
498
+ onInit: x.func,
499
+ onTimeout: x.func,
517
500
  /**
518
501
  * Optional host-styled renderer for the structurally-unsupported embed
519
502
  * state (legacy app on a cross-site origin), `(entry) => ReactNode`. Falls
520
503
  * back to a minimal built-in placeholder.
521
504
  */
522
- renderUnsupported: R.func
505
+ renderUnsupported: x.func,
506
+ /**
507
+ * Optional host-styled renderer for the handshake-timeout failure state
508
+ * (the app is not embeddable / could not load), `() => ReactNode`. Falls
509
+ * back to a minimal centered message.
510
+ */
511
+ renderTimeout: x.func
523
512
  };
524
- const be = W.div`
513
+ const ge = W.div`
525
514
  position: fixed;
526
515
  inset: 0;
527
516
  background: rgba(0, 0, 0, 0.45);
@@ -529,7 +518,7 @@ const be = W.div`
529
518
  align-items: center;
530
519
  justify-content: center;
531
520
  z-index: 10000;
532
- `, Ee = W.div`
521
+ `, pe = W.div`
533
522
  background: #fff;
534
523
  border-radius: 8px;
535
524
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2);
@@ -538,13 +527,13 @@ const be = W.div`
538
527
  max-width: calc(100vw - 32px);
539
528
  font-family: sans-serif;
540
529
  color: #222;
541
- `, we = W.div`
530
+ `, he = W.div`
542
531
  display: flex;
543
532
  align-items: center;
544
533
  justify-content: space-between;
545
534
  padding: 10px 0;
546
535
  gap: 16px;
547
- `, xe = W.button`
536
+ `, be = W.button`
548
537
  background: #16a500;
549
538
  color: #fff;
550
539
  border: none;
@@ -553,27 +542,25 @@ const be = W.div`
553
542
  font-size: 14px;
554
543
  cursor: pointer;
555
544
  white-space: nowrap;
556
- `, Re = W.p`
545
+ `, Ee = W.p`
557
546
  color: #b3261e;
558
547
  font-size: 13px;
559
548
  margin: 4px 0 0;
560
- `, ze = () => {
561
- const { pending: t, authorize: o } = ie();
562
- return t.length === 0 ? null : /* @__PURE__ */ f.createElement(be, null, /* @__PURE__ */ f.createElement(Ee, null, /* @__PURE__ */ f.createElement("h3", { style: { margin: "0 0 8px" } }, "Authorization Required"), /* @__PURE__ */ f.createElement("p", { style: { margin: "0 0 12px", fontSize: 14, color: "#555" } }, "The following apps need you to sign in and authorize them before they can load."), t.map((s) => /* @__PURE__ */ f.createElement("div", { key: s.origin }, /* @__PURE__ */ f.createElement(we, null, /* @__PURE__ */ f.createElement("div", null, /* @__PURE__ */ f.createElement("div", { style: { fontWeight: 600 } }, s.name || s.origin), s.name && /* @__PURE__ */ f.createElement("div", { style: { fontSize: 12, color: "#888" } }, s.origin)), /* @__PURE__ */ f.createElement(xe, { onClick: () => o(s) }, "Authorize")), s.popupBlocked && /* @__PURE__ */ f.createElement(Re, null, "The sign-in window was blocked. Allow popups for this site, then try again.")))));
549
+ `, Te = () => {
550
+ const { pending: n, authorize: o } = ne();
551
+ return n.length === 0 ? null : /* @__PURE__ */ f.createElement(ge, null, /* @__PURE__ */ f.createElement(pe, null, /* @__PURE__ */ f.createElement("h3", { style: { margin: "0 0 8px" } }, "Authorization Required"), /* @__PURE__ */ f.createElement("p", { style: { margin: "0 0 12px", fontSize: 14, color: "#555" } }, "The following apps need you to sign in and authorize them before they can load."), n.map((r) => /* @__PURE__ */ f.createElement("div", { key: r.origin }, /* @__PURE__ */ f.createElement(he, null, /* @__PURE__ */ f.createElement("div", null, /* @__PURE__ */ f.createElement("div", { style: { fontWeight: 600 } }, r.name || r.origin), r.name && /* @__PURE__ */ f.createElement("div", { style: { fontSize: 12, color: "#888" } }, r.origin)), /* @__PURE__ */ f.createElement(be, { onClick: () => o(r) }, "Authorize")), r.popupBlocked && /* @__PURE__ */ f.createElement(Ee, null, "The sign-in window was blocked. Allow popups for this site, then try again.")))));
563
552
  };
564
553
  export {
565
554
  D as EmbeddedAuthorizationContext,
566
- ze as EmbeddedAuthorizationPrompt,
567
- he as MMEmbeddableZone,
568
- K as MMEmbeddableZoneContext,
569
- le as MMEmbeddableZoneProvider,
570
- Y as getAppInfo,
571
- se as isCrossSite,
572
- oe as popupAuthorizationLauncher,
573
- ne as testIsEmbeddable,
574
- ie as useEmbeddedAuthorizations,
575
- ue as useEmbeddedCredential,
555
+ Te as EmbeddedAuthorizationPrompt,
556
+ me as MMEmbeddableZone,
557
+ H as MMEmbeddableZoneContext,
558
+ oe as MMEmbeddableZoneProvider,
559
+ ee as isCrossSite,
560
+ te as popupAuthorizationLauncher,
561
+ ne as useEmbeddedAuthorizations,
562
+ se as useEmbeddedCredential,
576
563
  _ as useEmbeddedEffect,
577
- ce as useEmbeddedOriginEpoch,
578
- ae as useEmbeddedUnsupported
564
+ re as useEmbeddedOriginEpoch,
565
+ ie as useEmbeddedUnsupported
579
566
  };
@@ -1,9 +1,9 @@
1
- (function(m,e){typeof exports=="object"&&typeof module!="undefined"?e(exports,require("react"),require("prop-types"),require("styled-components")):typeof define=="function"&&define.amd?define(["exports","react","prop-types","styled-components"],e):(m=typeof globalThis!="undefined"?globalThis:m||self,e(m["mm-react-embeddable"]={},m.React,m.PropTypes,m.styled))})(this,(function(m,e,C,q){"use strict";const _=e.createContext(null),D={},H=async t=>{let o;try{if(o=new URL(t).origin,D[o]!==void 0)return D[o];const d=await(await fetch(`${o}/mm-app-manifest.json`)).json();if(!d.version)throw new Error("Invalid manifest");return D[o]=d,d}catch{}return o&&(D[o]=!1),!1},V=async t=>!!await H(t),W=e.createContext({pending:[],authorize:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ie=2e4,F=t=>{try{return new URL(t).origin}catch{return null}},G=t=>{if(!t||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(t)||t.includes(":"))return t;const o=t.split(".");return o.length<=2?t:o.slice(-2).join(".")},J=(t,o)=>{try{const i=new URL(t),d=new URL(o);return i.protocol!==d.protocol?!0:G(i.hostname)!==G(d.hostname)}catch{return!0}},Q=(t,{onBlocked:o,onClosed:i})=>{const d=window.open(t.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!d)return o(),()=>{};const g=setInterval(()=>{d.closed&&(clearInterval(g),i())},1e3);return()=>clearInterval(g)},X=({children:t,launcher:o})=>{const i=e.useContext(_),[d,g]=e.useState({}),[k,b]=e.useState({}),[E,L]=e.useState({}),[v,x]=e.useState({}),I=e.useRef(E);I.current=E;const h=e.useRef(null),z=e.useRef({}),O=e.useCallback((n,r)=>{H(r).then(s=>{if(!s||!s.name)return;const f=U=>U[n]?{...U,[n]:{...U[n],name:s.name}}:U;g(f),x(f)})},[]),j=e.useCallback((n,r)=>{const s=F(n==null?void 0:n.authUrl);s&&(x(f=>f[s]?f:{...f,[s]:{origin:s,reason:r,name:null}}),O(s,n.authUrl))},[O]),A=e.useCallback((n,{v2:r=!1}={})=>{const s=F(n==null?void 0:n.authUrl);s&&(r&&I.current[s]||(g(f=>f[s]?f:{...f,[s]:{origin:s,authUrl:n.authUrl,silentUrl:n.silentUrl||null,status:r&&n.silentUrl?"silent":"interactive",v2:r,name:null,popupBlocked:!1}}),O(s,n.authUrl)))},[O]),M=e.useCallback(n=>{g(r=>{if(!r[n])return r;const s={...r};return delete s[n],s})},[]),T=e.useCallback(n=>{n&&(M(n),b(r=>({...r,[n]:(r[n]||0)+1})))},[M]),u=e.useCallback(n=>{g(r=>!r[n]||r[n].status==="interactive"?r:{...r,[n]:{...r[n],status:"interactive"}})},[]),a=e.useCallback(n=>{M(n.origin)},[M]),c=e.useCallback(n=>{const r=F(n==null?void 0:n.authUrl);if(r&&J(r,window.location.origin)){j(n,"cross-site-legacy");return}A(n)},[A,j]);e.useEffect(()=>{if(!i)return;const n=[i.addListener("*","authorize",c),i.addListener("*","login",c),i.addListener("*","credential-request",r=>A(r,{v2:!0})),i.addListener("*","authorized",r=>{r!=null&&r.accessToken||T(F(r==null?void 0:r.authUrl))})];return()=>n.forEach(r=>r())},[i,c,A,T]),e.useEffect(()=>{const n=r=>{const s=r==null?void 0:r.data;if(!s||s.type!=="authorized"&&s.type!=="authorize-failed")return;const f=F(s.authUrl);if(!(!f||r.origin!==f)){if(s.type==="authorized"&&s.accessToken){L(U=>({...U,[f]:{accessToken:s.accessToken}})),M(f);return}s.type==="authorize-failed"&&u(f)}};return window.addEventListener("message",n),()=>window.removeEventListener("message",n)},[M,u]),e.useEffect(()=>{const n=z.current;Object.values(d).forEach(r=>{r.status==="silent"&&!n[r.origin]&&(n[r.origin]=setTimeout(()=>{delete n[r.origin],u(r.origin)},ie))}),Object.keys(n).forEach(r=>{(!d[r]||d[r].status!=="silent")&&(clearTimeout(n[r]),delete n[r])})},[d,u]),e.useEffect(()=>()=>{h.current&&h.current(),Object.values(z.current).forEach(clearTimeout)},[]);const l=e.useCallback(n=>{h.current&&(h.current(),h.current=null);const r=o||Q;h.current=r(n,{onBlocked:()=>{g(s=>s[n.origin]?{...s,[n.origin]:{...s[n.origin],popupBlocked:!0}}:s)},onClosed:()=>{if(n.v2){g(s=>!s[n.origin]||!s[n.origin].silentUrl?s:{...s,[n.origin]:{...s[n.origin],status:"silent"}});return}T(n.origin)}})},[o,T]),p={pending:Object.values(d).filter(n=>n.status==="interactive"),authorize:l,dismiss:a,originEpochs:k,credentials:E,unsupported:v},w=Object.values(d).filter(n=>n.status==="silent"&&n.silentUrl);return e.createElement(W.Provider,{value:p},t,w.map(n=>e.createElement("iframe",{key:`mm-silent-auth-${n.origin}`,src:n.silentUrl,title:`MachineMetrics silent authorization (${n.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};X.propTypes={children:C.node,launcher:C.func};const Y=()=>e.useContext(W),N=t=>{const{originEpochs:o}=e.useContext(W),i=F(t);return i&&o[i]||0},R=t=>{const{credentials:o}=e.useContext(W),i=F(t);return i&&o[i]||null},ee=t=>{const{unsupported:o}=e.useContext(W),i=F(t);return i&&o[i]||null},ne=({children:t,authorizationLauncher:o})=>{const[i,d]=e.useState({}),[g,k]=e.useState({}),b=e.useRef({}),E=e.useRef({}),L=e.useRef({}),v=e.useCallback((u,a)=>{var c;return!!((c=L.current[u])!=null&&c.has(a))},[]),x=e.useCallback((u,a,c)=>{d(l=>({...l,[u]:{origin:a,frameRef:c}}))},[]),I=e.useCallback(u=>{d(a=>{const c={...a};return delete c[u],c}),k(a=>{const c={...a};return delete c[u],c}),delete L.current[u]},[]);e.useEffect(()=>{const u=(c=[],l)=>{c.forEach(p=>p(l))},a=c=>{var n,r,s,f,U;if(!((n=c==null?void 0:c.data)!=null&&n.instanceId))return;const{instanceId:l,type:p}=c.data,w=b.current;if(p==="response"){const{callbackId:y,response:Z,error:B}=c.data,S=E.current[y];S&&(S(Z,B),delete E.current[y]);return}if(p==="mark-registered"){const{requestType:y}=c.data;L.current[l]||(L.current[l]=new Set),L.current[l].add(y);return}p==="ready"&&k(y=>({...y,[l]:!0})),u((r=w[l])==null?void 0:r[p],c.data),u((s=w["*"])==null?void 0:s[p],c.data),u((f=w[l])==null?void 0:f["*"],c.data),u((U=w["*"])==null?void 0:U["*"],c.data)};return window.addEventListener("message",a),()=>{window.removeEventListener("message",a)}},[i]);const h=e.useCallback((u,a,c)=>{var p,w;const l=i[u];if(!l){console.warn(`Origin not set for id: ${u}. Unable to send message.`);return}(w=(p=l==null?void 0:l.frameRef)==null?void 0:p.current)!=null&&w.contentWindow&&l.frameRef.current.contentWindow.postMessage({type:a,...c,instanceId:u},l.origin)},[i]),z=e.useRef(0),O=e.useCallback(()=>`${Date.now()}-${++z.current}`,[]),j=e.useCallback(async(u,a,c={})=>new Promise((l,p)=>{const w=O(),n=(r,s)=>{delete E.current[w],s?p(s):l(r)};E.current[w]=n,h(u,"request",{callbackId:w,requestType:a,data:c})}),[h]),A=e.useCallback((u,a)=>{h(u,"load-options",a)},[h]),M=e.useCallback((u,a)=>{h(u,"validate",a)},[h]),T=e.useMemo(()=>({registerFrame:x,unregisterFrame:I,sendMessage:h,sendRequest:j,loadOptions:A,validate:M,hasHandler:v,readyFrames:g,addListener:(u,a,c)=>(b.current[u]||(b.current[u]={}),b.current[u][a]||(b.current[u][a]=[]),b.current[u][a].push(c),()=>{b.current[u][a]=b.current[u][a].filter(l=>l!==c)})}),[x,I,h,j,A,M,v,g]);return e.createElement(_.Provider,{value:T},e.createElement(X,{launcher:o},t))},$=(t,o,i)=>{const d=e.useContext(_);if(d===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const g=e.useRef(i);e.useEffect(()=>{g.current=i},[i]),e.useEffect(()=>{if(!(!t||!o)){if(o.startsWith("key:")){const k=o.substring(4);return d.readyFrames[t]&&d.sendMessage(t,"subscribe-key",{keyChord:k}),d.addListener(t,`key-pressed:${k}`,(...E)=>g.current(...E))}return d.addListener(t,o,(...k)=>g.current(...k))}},[d,t,o])};ne.propTypes={children:C.node.isRequired,authorizationLauncher:C.func};const P=q.default||q,oe=1e4,ue="credentials",K=(t,o)=>`${t}/mm-embedded-interop?id=${o}&origin=${window.location.origin}&caps=${ue}`,ce=P.iframe`
1
+ (function(g,e){typeof exports=="object"&&typeof module!="undefined"?e(exports,require("react"),require("prop-types"),require("styled-components")):typeof define=="function"&&define.amd?define(["exports","react","prop-types","styled-components"],e):(g=typeof globalThis!="undefined"?globalThis:g||self,e(g["mm-react-embeddable"]={},g.React,g.PropTypes,g.styled))})(this,(function(g,e,k,j){"use strict";const _=e.createContext(null),W=e.createContext({pending:[],authorize:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ne=2e4,A=r=>{try{return new URL(r).origin}catch{return null}},H=r=>{if(!r||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(r)||r.includes(":"))return r;const u=r.split(".");return u.length<=2?r:u.slice(-2).join(".")},P=(r,u)=>{try{const s=new URL(r),f=new URL(u);return s.protocol!==f.protocol?!0:H(s.hostname)!==H(f.hostname)}catch{return!0}},K=(r,{onBlocked:u,onClosed:s})=>{const f=window.open(r.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!f)return u(),()=>{};const b=setInterval(()=>{f.closed&&(clearInterval(b),s())},1e3);return()=>clearInterval(b)},V=({children:r,launcher:u})=>{const s=e.useContext(_),[f,b]=e.useState({}),[w,h]=e.useState({}),[C,U]=e.useState({}),[Z,M]=e.useState({}),F=e.useRef(C);F.current=C;const E=e.useRef(null),x=e.useRef({}),$=e.useRef({}),z=e.useCallback(n=>{const t=$.current[n];if(!t)return;const i=a=>a[n]?{...a,[n]:{...a[n],name:t}}:a;b(i),M(i)},[]),y=e.useCallback((n,t)=>{const i=A(n==null?void 0:n.authUrl);i&&(M(a=>a[i]?a:{...a,[i]:{origin:i,reason:t,name:null}}),z(i))},[z]),T=e.useCallback((n,{v2:t=!1}={})=>{const i=A(n==null?void 0:n.authUrl);i&&(t&&F.current[i]||(b(a=>a[i]?a:{...a,[i]:{origin:i,authUrl:n.authUrl,silentUrl:n.silentUrl||null,status:t&&n.silentUrl?"silent":"interactive",v2:t,name:null,popupBlocked:!1}}),z(i)))},[z]),L=e.useCallback(n=>{b(t=>{if(!t[n])return t;const i={...t};return delete i[n],i})},[]),o=e.useCallback(n=>{n&&(L(n),h(t=>({...t,[n]:(t[n]||0)+1})))},[L]),l=e.useCallback(n=>{b(t=>!t[n]||t[n].status==="interactive"?t:{...t,[n]:{...t[n],status:"interactive"}})},[]),c=e.useCallback(n=>{L(n.origin)},[L]),d=e.useCallback(n=>{const t=A(n==null?void 0:n.authUrl);if(t&&P(t,window.location.origin)){y(n,"cross-site-legacy");return}T(n)},[T,y]);e.useEffect(()=>{if(!s)return;const n=[s.addListener("*","init",t=>{t!=null&&t.origin&&t.name&&($.current[t.origin]=t.name,z(t.origin))}),s.addListener("*","authorize",d),s.addListener("*","login",d),s.addListener("*","credential-request",t=>T(t,{v2:!0})),s.addListener("*","authorized",t=>{t!=null&&t.accessToken||o(A(t==null?void 0:t.authUrl))})];return()=>n.forEach(t=>t())},[s,d,T,o,z]),e.useEffect(()=>{const n=t=>{const i=t==null?void 0:t.data;if(!i||i.type!=="authorized"&&i.type!=="authorize-failed")return;const a=A(i.authUrl);if(!(!a||t.origin!==a)){if(i.type==="authorized"&&i.accessToken){U(S=>({...S,[a]:{accessToken:i.accessToken}})),L(a);return}i.type==="authorize-failed"&&l(a)}};return window.addEventListener("message",n),()=>window.removeEventListener("message",n)},[L,l]),e.useEffect(()=>{const n=x.current;Object.values(f).forEach(t=>{t.status==="silent"&&!n[t.origin]&&(n[t.origin]=setTimeout(()=>{delete n[t.origin],l(t.origin)},ne))}),Object.keys(n).forEach(t=>{(!f[t]||f[t].status!=="silent")&&(clearTimeout(n[t]),delete n[t])})},[f,l]),e.useEffect(()=>()=>{E.current&&E.current(),Object.values(x.current).forEach(clearTimeout)},[]);const p=e.useCallback(n=>{E.current&&(E.current(),E.current=null);const t=u||K;E.current=t(n,{onBlocked:()=>{b(i=>i[n.origin]?{...i,[n.origin]:{...i[n.origin],popupBlocked:!0}}:i)},onClosed:()=>{if(n.v2){b(i=>!i[n.origin]||!i[n.origin].silentUrl?i:{...i,[n.origin]:{...i[n.origin],status:"silent"}});return}o(n.origin)}})},[u,o]),m={pending:Object.values(f).filter(n=>n.status==="interactive"),authorize:p,dismiss:c,originEpochs:w,credentials:C,unsupported:Z},O=Object.values(f).filter(n=>n.status==="silent"&&n.silentUrl);return e.createElement(W.Provider,{value:m},r,O.map(n=>e.createElement("iframe",{key:`mm-silent-auth-${n.origin}`,src:n.silentUrl,title:`MachineMetrics silent authorization (${n.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};V.propTypes={children:k.node,launcher:k.func};const G=()=>e.useContext(W),J=r=>{const{originEpochs:u}=e.useContext(W),s=A(r);return s&&u[s]||0},Q=r=>{const{credentials:u}=e.useContext(W),s=A(r);return s&&u[s]||null},X=r=>{const{unsupported:u}=e.useContext(W),s=A(r);return s&&u[s]||null},Y=({children:r,authorizationLauncher:u})=>{const[s,f]=e.useState({}),[b,w]=e.useState({}),h=e.useRef({}),C=e.useRef({}),U=e.useRef({}),Z=e.useCallback((o,l)=>{var c;return!!((c=U.current[o])!=null&&c.has(l))},[]),M=e.useCallback((o,l,c)=>{f(d=>({...d,[o]:{origin:l,frameRef:c}}))},[]),F=e.useCallback(o=>{f(l=>{const c={...l};return delete c[o],c}),w(l=>{const c={...l};return delete c[o],c}),delete U.current[o]},[]);e.useEffect(()=>{const o=(c=[],d)=>{c.forEach(p=>p(d))},l=c=>{var O,n,t,i,a;if(!((O=c==null?void 0:c.data)!=null&&O.instanceId))return;const{instanceId:d,type:p}=c.data,m=h.current;if(p==="response"){const{callbackId:S,response:v,error:B}=c.data,I=C.current[S];I&&(I(v,B),delete C.current[S]);return}if(p==="mark-registered"){const{requestType:S}=c.data;U.current[d]||(U.current[d]=new Set),U.current[d].add(S);return}p==="ready"&&w(S=>({...S,[d]:!0})),o((n=m[d])==null?void 0:n[p],c.data),o((t=m["*"])==null?void 0:t[p],c.data),o((i=m[d])==null?void 0:i["*"],c.data),o((a=m["*"])==null?void 0:a["*"],c.data)};return window.addEventListener("message",l),()=>{window.removeEventListener("message",l)}},[s]);const E=e.useCallback((o,l,c)=>{var p,m;const d=s[o];if(!d){console.warn(`Origin not set for id: ${o}. Unable to send message.`);return}(m=(p=d==null?void 0:d.frameRef)==null?void 0:p.current)!=null&&m.contentWindow&&d.frameRef.current.contentWindow.postMessage({type:l,...c,instanceId:o},d.origin)},[s]),x=e.useRef(0),$=e.useCallback(()=>`${Date.now()}-${++x.current}`,[]),z=e.useCallback(async(o,l,c={})=>new Promise((d,p)=>{const m=$(),O=(n,t)=>{delete C.current[m],t?p(t):d(n)};C.current[m]=O,E(o,"request",{callbackId:m,requestType:l,data:c})}),[E]),y=e.useCallback((o,l)=>{E(o,"load-options",l)},[E]),T=e.useCallback((o,l)=>{E(o,"validate",l)},[E]),L=e.useMemo(()=>({registerFrame:M,unregisterFrame:F,sendMessage:E,sendRequest:z,loadOptions:y,validate:T,hasHandler:Z,readyFrames:b,addListener:(o,l,c)=>(h.current[o]||(h.current[o]={}),h.current[o][l]||(h.current[o][l]=[]),h.current[o][l].push(c),()=>{h.current[o][l]=h.current[o][l].filter(d=>d!==c)})}),[M,F,E,z,y,T,Z,b]);return e.createElement(_.Provider,{value:L},e.createElement(V,{launcher:u},r))},q=(r,u,s)=>{const f=e.useContext(_);if(f===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const b=e.useRef(s);e.useEffect(()=>{b.current=s},[s]),e.useEffect(()=>{if(!(!r||!u)){if(u.startsWith("key:")){const w=u.substring(4);return f.readyFrames[r]&&f.sendMessage(r,"subscribe-key",{keyChord:w}),f.addListener(r,`key-pressed:${w}`,(...C)=>b.current(...C))}return f.addListener(r,u,(...w)=>b.current(...w))}},[f,r,u])};Y.propTypes={children:k.node.isRequired,authorizationLauncher:k.func};const D=j.default||j,te=1e4,re="credentials",N=(r,u)=>`${r}/mm-embedded-interop?id=${u}&origin=${window.location.origin}&caps=${re}`,se=D.iframe`
2
2
  width: 100%;
3
3
  height: 100%;
4
4
  border: none;
5
- visibility: ${t=>t.$isReady?"visible":"hidden"};
6
- `,le=P.div`
5
+ visibility: ${r=>r.$isReady?"visible":"hidden"};
6
+ `,ie=D.div`
7
7
  width: 100%;
8
8
  height: 100%;
9
9
  display: flex;
@@ -16,13 +16,13 @@
16
16
  text-align: center;
17
17
  color: #555;
18
18
  font-size: 14px;
19
- `,te=({entry:t})=>e.createElement(le,null,e.createElement("div",{style:{fontWeight:600}},t&&(t.name||t.origin)||"This app"," can’t be embedded here"),e.createElement("div",{style:{fontSize:12,color:"#888"}},"It needs an update to support embedding from a different domain."));te.propTypes={entry:C.shape({origin:C.string,name:C.string,reason:C.string})};const de=P.div`
19
+ `,R=({entry:r})=>e.createElement(ie,null,e.createElement("div",{style:{fontWeight:600}},r&&(r.name||r.origin)||"This app"," can’t be embedded here"),e.createElement("div",{style:{fontSize:12,color:"#888"}},"It needs an update to support embedding from a different domain."));R.propTypes={entry:k.shape({origin:k.string,name:k.string,reason:k.string})};const oe=D.div`
20
20
  height: 100%;
21
21
  display: flex;
22
22
  flex: 1;
23
23
  align-items: center;
24
24
  justify-content: center;
25
- `,re=({id:t,src:o,path:i,onInit:d=()=>{},onTimeout:g,context:k={},params:b={},skipManifestCheck:E=!1,renderUnsupported:L,...v})=>{if("isConfiguring"in v)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in k)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in k)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const x=e.useRef(),[I,h]=e.useState(),[z,O]=e.useState(0),[j,A]=e.useState(!1),M=N(o),T=R(o),u=ee(o);e.useEffect(()=>{M>0&&O(0)},[M]);const{registerFrame:a,unregisterFrame:c,sendMessage:l}=e.useContext(_),[p,w]=e.useState(!0),[n,r]=e.useState(),s=e.useRef(),f=e.useRef(g),U=e.useRef(d),y=e.useRef(!1);e.useEffect(()=>{f.current=g},[g]),e.useEffect(()=>{U.current=d},[d]),e.useEffect(()=>{z&&l(t,"set-context",{context:{...k,colorMode:b.colorMode,isFullScreen:b.isFullScreen}})},[k,b.colorMode,b.isFullScreen,t,z]),e.useEffect(()=>{z&&(l(t,"set-params",{params:b}),l(t,"set-configuring",{isConfiguring:b.isConfiguring}))},[b,t,z]),e.useEffect(()=>{i!==void 0&&r((i==null?void 0:i.indexOf("/"))===0?i:`/${i}`)},[i]),e.useEffect(()=>{n===void 0||!z||l(t,"navigate",{path:n})},[n,z,t,l]),e.useEffect(()=>{if(!(!o||!t||!x)){if(E){const S=new URL(o);w(!0),a(t,S.origin,x),U.current(),h(K(S.origin,t))}else(async()=>{const S=await V(o);if(w(S),S){const se=new URL(o);a(t,se.origin,x),U.current(),h(K(se.origin,t))}})();return()=>{c(t)}}},[o,t,a,x,E]),e.useEffect(()=>{if(!(!E||!I||y.current))return s.current=setTimeout(()=>{f.current&&f.current()},oe),()=>clearTimeout(s.current)},[I,E]);const Z=e.useCallback(()=>{y.current=!0,clearTimeout(s.current)},[]);$(t,"init",Z),$(t,"authorize",Z),$(t,"login",Z),$(t,"credential-request",()=>{Z(),A(!0)}),e.useEffect(()=>{!j||!T||l(t,"credential",{accessToken:T.accessToken})},[j,T,t,l]),$(t,"ready",()=>{Z(),O(S=>S+1)});const B=e.useRef();return $(t,"heartbeat",()=>{B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{if(x.current){const S=new URL(o);x.current.src=K(S.origin,t)}},6e3)}),e.useEffect(()=>()=>{B.current&&clearTimeout(B.current)},[]),!E&&!p?e.createElement(de,null,e.createElement("div",{style:{textAlign:"center"}},"Application must adhere to the MM App Manifest specification to be embedded.")):u?L?L(u):e.createElement(te,{entry:u}):e.createElement(ce,{key:`auth-epoch-${M}`,$isReady:z,ref:x,src:I,...v})};re.propTypes={id:C.string,src:C.string.isRequired,path:C.string,onInit:C.func,onTimeout:C.func,skipManifestCheck:C.bool,renderUnsupported:C.func};const ae=q.div`
25
+ `,ue=()=>e.createElement(oe,null,e.createElement("div",{style:{textAlign:"center"}},"This app couldn’t be loaded as an embeddable widget.")),ee=({id:r,src:u,path:s,onInit:f=()=>{},onTimeout:b,context:w={},params:h={},renderUnsupported:C,renderTimeout:U,...Z})=>{if("isConfiguring"in Z)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in w)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in w)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const M=e.useRef(),[F,E]=e.useState(),[x,$]=e.useState(0),[z,y]=e.useState(!1),[T,L]=e.useState(!1),o=J(u),l=Q(u),c=X(u);e.useEffect(()=>{o>0&&$(0)},[o]);const{registerFrame:d,unregisterFrame:p,sendMessage:m}=e.useContext(_),[O,n]=e.useState(),t=e.useRef(),i=e.useRef(b),a=e.useRef(f),S=e.useRef(!1);e.useEffect(()=>{i.current=b},[b]),e.useEffect(()=>{a.current=f},[f]),e.useEffect(()=>{x&&m(r,"set-context",{context:{...w,colorMode:h.colorMode,isFullScreen:h.isFullScreen}})},[w,h.colorMode,h.isFullScreen,r,x]),e.useEffect(()=>{x&&(m(r,"set-params",{params:h}),m(r,"set-configuring",{isConfiguring:h.isConfiguring}))},[h,r,x]),e.useEffect(()=>{s!==void 0&&n((s==null?void 0:s.indexOf("/"))===0?s:`/${s}`)},[s]),e.useEffect(()=>{O===void 0||!x||m(r,"navigate",{path:O})},[O,x,r,m]),e.useEffect(()=>{if(!u||!r||!M)return;const I=new URL(u);return d(r,I.origin,M),a.current(),E(N(I.origin,r)),()=>{p(r)}},[u,r,d,M]),e.useEffect(()=>{if(!(!F||S.current))return t.current=setTimeout(()=>{y(!0),i.current&&i.current()},te),()=>clearTimeout(t.current)},[F]);const v=e.useCallback(()=>{S.current=!0,clearTimeout(t.current),y(!1)},[]);q(r,"init",v),q(r,"authorize",v),q(r,"login",v),q(r,"credential-request",()=>{v(),L(!0)}),e.useEffect(()=>{!T||!l||m(r,"credential",{accessToken:l.accessToken})},[T,l,r,m]),q(r,"ready",()=>{v(),$(I=>I+1)});const B=e.useRef();return q(r,"heartbeat",()=>{B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{if(M.current){const I=new URL(u);M.current.src=N(I.origin,r)}},6e3)}),e.useEffect(()=>()=>{B.current&&clearTimeout(B.current)},[]),c?C?C(c):e.createElement(R,{entry:c}):z&&!x?U?U():e.createElement(ue,null):e.createElement(se,{key:`auth-epoch-${o}`,$isReady:x,ref:M,src:F,...Z})};ee.propTypes={id:k.string,src:k.string.isRequired,path:k.string,onInit:k.func,onTimeout:k.func,renderUnsupported:k.func,renderTimeout:k.func};const ce=j.div`
26
26
  position: fixed;
27
27
  inset: 0;
28
28
  background: rgba(0, 0, 0, 0.45);
@@ -30,7 +30,7 @@
30
30
  align-items: center;
31
31
  justify-content: center;
32
32
  z-index: 10000;
33
- `,fe=q.div`
33
+ `,le=j.div`
34
34
  background: #fff;
35
35
  border-radius: 8px;
36
36
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2);
@@ -39,13 +39,13 @@
39
39
  max-width: calc(100vw - 32px);
40
40
  font-family: sans-serif;
41
41
  color: #222;
42
- `,me=q.div`
42
+ `,de=j.div`
43
43
  display: flex;
44
44
  align-items: center;
45
45
  justify-content: space-between;
46
46
  padding: 10px 0;
47
47
  gap: 16px;
48
- `,ge=q.button`
48
+ `,fe=j.button`
49
49
  background: #16a500;
50
50
  color: #fff;
51
51
  border: none;
@@ -54,8 +54,8 @@
54
54
  font-size: 14px;
55
55
  cursor: pointer;
56
56
  white-space: nowrap;
57
- `,be=q.p`
57
+ `,ae=j.p`
58
58
  color: #b3261e;
59
59
  font-size: 13px;
60
60
  margin: 4px 0 0;
61
- `,he=()=>{const{pending:t,authorize:o}=Y();return t.length===0?null:e.createElement(ae,null,e.createElement(fe,null,e.createElement("h3",{style:{margin:"0 0 8px"}},"Authorization Required"),e.createElement("p",{style:{margin:"0 0 12px",fontSize:14,color:"#555"}},"The following apps need you to sign in and authorize them before they can load."),t.map(i=>e.createElement("div",{key:i.origin},e.createElement(me,null,e.createElement("div",null,e.createElement("div",{style:{fontWeight:600}},i.name||i.origin),i.name&&e.createElement("div",{style:{fontSize:12,color:"#888"}},i.origin)),e.createElement(ge,{onClick:()=>o(i)},"Authorize")),i.popupBlocked&&e.createElement(be,null,"The sign-in window was blocked. Allow popups for this site, then try again.")))))};m.EmbeddedAuthorizationContext=W,m.EmbeddedAuthorizationPrompt=he,m.MMEmbeddableZone=re,m.MMEmbeddableZoneContext=_,m.MMEmbeddableZoneProvider=ne,m.getAppInfo=H,m.isCrossSite=J,m.popupAuthorizationLauncher=Q,m.testIsEmbeddable=V,m.useEmbeddedAuthorizations=Y,m.useEmbeddedCredential=R,m.useEmbeddedEffect=$,m.useEmbeddedOriginEpoch=N,m.useEmbeddedUnsupported=ee,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})}));
61
+ `,me=()=>{const{pending:r,authorize:u}=G();return r.length===0?null:e.createElement(ce,null,e.createElement(le,null,e.createElement("h3",{style:{margin:"0 0 8px"}},"Authorization Required"),e.createElement("p",{style:{margin:"0 0 12px",fontSize:14,color:"#555"}},"The following apps need you to sign in and authorize them before they can load."),r.map(s=>e.createElement("div",{key:s.origin},e.createElement(de,null,e.createElement("div",null,e.createElement("div",{style:{fontWeight:600}},s.name||s.origin),s.name&&e.createElement("div",{style:{fontSize:12,color:"#888"}},s.origin)),e.createElement(fe,{onClick:()=>u(s)},"Authorize")),s.popupBlocked&&e.createElement(ae,null,"The sign-in window was blocked. Allow popups for this site, then try again.")))))};g.EmbeddedAuthorizationContext=W,g.EmbeddedAuthorizationPrompt=me,g.MMEmbeddableZone=ee,g.MMEmbeddableZoneContext=_,g.MMEmbeddableZoneProvider=Y,g.isCrossSite=P,g.popupAuthorizationLauncher=K,g.useEmbeddedAuthorizations=G,g.useEmbeddedCredential=Q,g.useEmbeddedEffect=q,g.useEmbeddedOriginEpoch=J,g.useEmbeddedUnsupported=X,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@machinemetrics/mm-react-embeddable",
3
- "version": "1.4.0-0",
3
+ "version": "1.4.0-1",
4
4
  "license": "MIT",
5
5
  "module": "dist/mm-react-embeddable.es.js",
6
6
  "main": "dist/mm-react-embeddable.cjs.js",