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

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