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

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