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