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