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

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