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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- (function(m,t){typeof exports=="object"&&typeof module!="undefined"?t(exports,require("react"),require("prop-types"),require("styled-components")):typeof define=="function"&&define.amd?define(["exports","react","prop-types","styled-components"],t):(m=typeof globalThis!="undefined"?globalThis:m||self,t(m["mm-react-embeddable"]={},m.React,m.PropTypes,m.styled))})(this,(function(m,t,me,ge){"use strict";const Q=n=>n&&n.__esModule?n:{default:n},g=Q(t),w=Q(me),B=Q(ge),N=t.createContext(null),H=t.createContext({pending:[],authorize:()=>{},approve:()=>{},complete:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ee="access_token",X=n=>n?n.kind?n:n.accessToken?{kind:ee,accessToken:n.accessToken,expiresAt:n.expiresAt||null}:null:null,Ee=new Set(["host_not_allowed","invalid_token","provider_unavailable"]),J=typeof window!="undefined"&&window.location.protocol==="https:",ke=8e3,V=n=>{try{return new URL(n).origin}catch{return null}},te=(n,o)=>{const u=o==null?void 0:o.origin;return!u||V(n==null?void 0:n.authUrl)!==u?null:u},ne=n=>{if(!n||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(n)||n.includes(":"))return n;const o=n.split(".");return o.length<=2?n:o.slice(-2).join(".")},re=(n,o)=>{try{const u=new URL(n),f=new URL(o);return u.protocol!==f.protocol?!0:ne(u.hostname)!==ne(f.hostname)}catch{return!0}},se=(n,{onBlocked:o,onClosed:u})=>{const f=window.open(n.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!f)return o(),()=>{};const p=setInterval(()=>{f.closed&&(clearInterval(p),u())},1e3);return()=>clearInterval(p)},oe=({children:n,launcher:o,broker:u})=>{const f=t.useContext(N),[p,E]=t.useState({}),[v,x]=t.useState({}),[_,M]=t.useState({}),[U,A]=t.useState({}),Z=t.useRef(_);Z.current=_;const k=t.useRef(p);k.current=p;const S=t.useRef(null),K=t.useRef({}),y=t.useRef({}),q=t.useRef({}),F=t.useRef(u);F.current=u;const z=t.useCallback(e=>{const r=y.current[e];if(!r)return;const s=a=>!a[e]||a[e].clientId?a:{...a,[e]:{...a[e],clientId:r}};E(s),A(s)},[]),l=t.useCallback((e,r)=>{e&&(A(s=>s[e]?s:{...s,[e]:{origin:e,reason:r,clientId:y.current[e]||null}}),z(e))},[z]),c=t.useCallback((e,{v2:r=!1,origin:s=null}={})=>{s&&(r&&Z.current[s]||(E(a=>a[s]?a:{...a,[s]:{origin:s,authUrl:e.authUrl,silentUrl:e.silentUrl||null,status:r&&F.current?"broker":r&&e.silentUrl&&J?"silent":"interactive",v2:r,scope:e.scope||null,acceptsCredentials:q.current[s]||null,consent:null,error:null,clientId:e.clientId||y.current[s]||null,popupBlocked:!1}}),z(s)))},[z]),i=t.useCallback(e=>{E(r=>{if(!r[e])return r;const s={...r};return delete s[e],s})},[]),d=t.useCallback(e=>{e&&(i(e),x(r=>({...r,[e]:(r[e]||0)+1})))},[i]),b=t.useCallback(e=>{E(r=>!r[e]||r[e].status==="interactive"?r:{...r,[e]:{...r[e],status:"interactive"}})},[]),C=t.useCallback(e=>{i(e.origin)},[i]),O=t.useCallback((e,r)=>{const s=te(e,r);if(s){if(re(s,window.location.origin)){l(s,"cross-site-legacy");return}c(e,{origin:s})}},[c,l]);t.useEffect(()=>{if(!f)return;const e=[f.addListener("*","init",(r,s)=>{s!=null&&s.origin&&(r!=null&&r.clientId)&&(y.current[s.origin]=r.clientId,z(s.origin)),s!=null&&s.origin&&Array.isArray(r==null?void 0:r.acceptsCredentials)&&(q.current[s.origin]=r.acceptsCredentials)}),f.addListener("*","authorize",O),f.addListener("*","login",O),f.addListener("*","credential-request",(r,s)=>c(r,{v2:!0,origin:te(r,s)}))];return()=>e.forEach(r=>r())},[f,O,c,z]),t.useEffect(()=>{const e=r=>{const s=r==null?void 0:r.data;if(!s||s.type!=="authorized"&&s.type!=="authorize-failed")return;const a=V(s.authUrl);if(!(!a||r.origin!==a)){if(s.type==="authorized"){if(s.accessToken){if(!k.current[a])return;M(h=>({...h,[a]:X({accessToken:s.accessToken})})),i(a)}else d(a);return}b(a)}};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[i,d,b]);const I=t.useCallback((e,r)=>{const s=e==null?void 0:e.origin,a=X(r);!s||!a||(M(h=>({...h,[s]:a})),i(s))},[i]),T=t.useCallback((e,r)=>{E(s=>s[e]?{...s,[e]:{...s[e],...r}}:s)},[]),L=t.useCallback(async(e,{approve:r}={})=>{const s=F.current,{origin:a}=e;let h;try{h=await s({origin:a,clientId:e.clientId,scope:e.scope,authUrl:e.authUrl},{approve:r})}catch{r?T(a,{error:{reason:"broker_unavailable"}}):T(a,{status:e.silentUrl&&J?"silent":"interactive"});return}if((h==null?void 0:h.status)===200&&h.credential){I(e,h.credential);return}if((h==null?void 0:h.status)===409&&h.consentRequired){T(a,{status:"interactive",consent:{client:h.client||null,stepUp:!!h.stepUp,scope:h.scope||e.scope},error:null});return}const R=(h==null?void 0:h.error)||"broker_error";if(!r&&Ee.has(R)){T(a,{status:e.silentUrl&&J?"silent":"interactive"});return}if(r&&R==="consent_denied"){T(a,{error:null});return}i(a),A(he=>({...he,[a]:{origin:a,reason:`broker:${R}`,detail:h||null,clientId:e.clientId||y.current[a]||null}}))},[I,T,i]),j=t.useRef({});t.useEffect(()=>{Object.values(p).forEach(e=>{e.status!=="broker"||j.current[e.origin]||(j.current[e.origin]=!0,L(e).finally(()=>{delete j.current[e.origin]}))})},[p,L]);const $=t.useCallback(e=>!F.current||!(e!=null&&e.consent)?Promise.resolve():L(e,{approve:!0}),[L]);t.useEffect(()=>{const e=K.current;Object.values(p).forEach(r=>{r.status==="silent"&&!e[r.origin]&&(e[r.origin]=setTimeout(()=>{delete e[r.origin],b(r.origin)},ke))}),Object.keys(e).forEach(r=>{(!p[r]||p[r].status!=="silent")&&(clearTimeout(e[r]),delete e[r])})},[p,b]),t.useEffect(()=>()=>{S.current&&S.current(),Object.values(K.current).forEach(clearTimeout)},[]);const D=t.useCallback(e=>{S.current&&(S.current(),S.current=null);const r=o||se;S.current=r(e,{onBlocked:()=>{E(s=>s[e.origin]?{...s,[e.origin]:{...s[e.origin],popupBlocked:!0}}:s)},onClosed:()=>{if(e.v2){J&&E(s=>!s[e.origin]||!s[e.origin].silentUrl?s:{...s,[e.origin]:{...s[e.origin],status:"silent"}});return}d(e.origin)}})},[o,d]),G={pending:Object.values(p).filter(e=>e.status==="interactive"),authorize:D,approve:$,complete:I,dismiss:C,originEpochs:v,credentials:_,unsupported:U},P=Object.values(p).filter(e=>e.status==="silent"&&e.silentUrl);return g.default.createElement(H.Provider,{value:G},n,P.map(e=>g.default.createElement("iframe",{key:`mm-silent-auth-${e.origin}`,src:e.silentUrl,title:`MachineMetrics silent authorization (${e.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};oe.propTypes={children:w.default.node,launcher:w.default.func,broker:w.default.func};const ie=()=>t.useContext(H),ue=n=>{const{originEpochs:o}=t.useContext(H),u=V(n);return u&&o[u]||0},le=n=>{const{credentials:o}=t.useContext(H),u=V(n);return u&&o[u]||null},ce=n=>{const{unsupported:o}=t.useContext(H),u=V(n);return u&&o[u]||null},ae=({children:n,authorizationLauncher:o,credentialBroker:u})=>{const[f,p]=t.useState({}),[E,v]=t.useState({}),x=t.useRef({}),_=t.useRef({}),M=t.useRef({}),U=t.useCallback((l,c)=>{var i;return!!((i=M.current[l])!=null&&i.has(c))},[]),A=t.useCallback((l,c,i)=>{p(d=>({...d,[l]:{origin:c,frameRef:i}}))},[]),Z=t.useCallback(l=>{p(c=>{const i={...c};return delete i[l],i}),v(c=>{const i={...c};return delete i[l],i}),delete M.current[l]},[]);t.useEffect(()=>{const l=(i=[],d,b)=>{i.forEach(C=>C(d,b))},c=i=>{var L,j,$,D,G,P,e;if(!((L=i==null?void 0:i.data)!=null&&L.instanceId))return;const{instanceId:d,type:b}=i.data,C=f[d],O=($=(j=C==null?void 0:C.frameRef)==null?void 0:j.current)==null?void 0:$.contentWindow;if(!O||i.source!==O||i.origin!==C.origin)return;const I={origin:i.origin},T=x.current;if(b==="response"){const{callbackId:r,response:s,error:a}=i.data,h=_.current[r];h&&(h(s,a),delete _.current[r]);return}if(b==="mark-registered"){const{requestType:r}=i.data;M.current[d]||(M.current[d]=new Set),M.current[d].add(r);return}b==="ready"&&v(r=>({...r,[d]:!0})),l((D=T[d])==null?void 0:D[b],i.data,I),l((G=T["*"])==null?void 0:G[b],i.data,I),l((P=T[d])==null?void 0:P["*"],i.data,I),l((e=T["*"])==null?void 0:e["*"],i.data,I)};return window.addEventListener("message",c),()=>{window.removeEventListener("message",c)}},[f]);const k=t.useCallback((l,c,i)=>{var b,C;const d=f[l];if(!d){console.warn(`Origin not set for id: ${l}. Unable to send message.`);return}(C=(b=d==null?void 0:d.frameRef)==null?void 0:b.current)!=null&&C.contentWindow&&d.frameRef.current.contentWindow.postMessage({type:c,...i,instanceId:l},d.origin)},[f]),S=t.useRef(0),K=t.useCallback(()=>`${Date.now()}-${++S.current}`,[]),y=t.useCallback(async(l,c,i={})=>new Promise((d,b)=>{const C=K(),O=(I,T)=>{delete _.current[C],T?b(T):d(I)};_.current[C]=O,k(l,"request",{callbackId:C,requestType:c,data:i})}),[k]),q=t.useCallback((l,c)=>{k(l,"load-options",c)},[k]),F=t.useCallback((l,c)=>{k(l,"validate",c)},[k]),z=t.useMemo(()=>({registerFrame:A,unregisterFrame:Z,sendMessage:k,sendRequest:y,loadOptions:q,validate:F,hasHandler:U,readyFrames:E,addListener:(l,c,i)=>(x.current[l]||(x.current[l]={}),x.current[l][c]||(x.current[l][c]=[]),x.current[l][c].push(i),()=>{x.current[l][c]=x.current[l][c].filter(d=>d!==i)})}),[A,Z,k,y,q,F,U,E]);return g.default.createElement(N.Provider,{value:z},g.default.createElement(oe,{launcher:o,broker:u},n))},W=(n,o,u)=>{const f=t.useContext(N);if(f===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const p=t.useRef(u);t.useEffect(()=>{p.current=u},[u]),t.useEffect(()=>{if(!(!n||!o)){if(o.startsWith("key:")){const E=o.substring(4);return f.readyFrames[n]&&f.sendMessage(n,"subscribe-key",{keyChord:E}),f.addListener(n,`key-pressed:${E}`,(...x)=>p.current(...x))}return f.addListener(n,o,(...E)=>p.current(...E))}},[f,n,o])};ae.propTypes={children:w.default.node.isRequired,authorizationLauncher:w.default.func,credentialBroker:w.default.func};const Y=B.default.default||B.default,Ce=1e4,we="credentials",de=(n,o)=>`${n}/mm-embedded-interop?id=${encodeURIComponent(o)}&origin=${encodeURIComponent(window.location.origin)}&caps=${we}`,Te=Y.iframe`
1
+ (function(g,t){typeof exports=="object"&&typeof module!="undefined"?t(exports,require("react"),require("prop-types"),require("styled-components")):typeof define=="function"&&define.amd?define(["exports","react","prop-types","styled-components"],t):(g=typeof globalThis!="undefined"?globalThis:g||self,t(g["mm-react-embeddable"]={},g.React,g.PropTypes,g.styled))})(this,(function(g,t,ge,Ee){"use strict";const Q=n=>n&&n.__esModule?n:{default:n},E=Q(t),y=Q(ge),W=Q(Ee),N=t.createContext(null),H=t.createContext({pending:[],authorize:()=>{},approve:()=>{},complete:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ee="access_token",X=n=>n?n.kind?n:n.accessToken?{kind:ee,accessToken:n.accessToken,expiresAt:n.expiresAt||null}:null:null,ke=new Set(["host_not_allowed","invalid_token","provider_unavailable"]),J=typeof window!="undefined"&&window.location.protocol==="https:",Ce=8e3,V=n=>{try{return new URL(n).origin}catch{return null}},te=(n,o)=>{const l=o==null?void 0:o.origin;return!l||V(n==null?void 0:n.authUrl)!==l?null:l},ne=n=>{if(!n||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(n)||n.includes(":"))return n;const o=n.split(".");return o.length<=2?n:o.slice(-2).join(".")},re=(n,o)=>{try{const l=new URL(n),a=new URL(o);return l.protocol!==a.protocol?!0:ne(l.hostname)!==ne(a.hostname)}catch{return!0}},se=(n,{onBlocked:o,onClosed:l})=>{const a=window.open(n.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!a)return o(),()=>{};const m=setInterval(()=>{a.closed&&(clearInterval(m),l())},1e3);return()=>clearInterval(m)},oe=({children:n,launcher:o,broker:l})=>{const a=t.useContext(N),[m,b]=t.useState({}),[M,T]=t.useState({}),[I,f]=t.useState({}),[x,S]=t.useState({}),P=t.useRef(I);P.current=I;const k=t.useRef(m);k.current=m;const O=t.useRef(null),G=t.useRef({}),A=t.useRef({}),q=t.useRef({}),F=t.useRef(l);F.current=l;const _=t.useCallback(e=>{const r=A.current[e];if(!r)return;const s=u=>!u[e]||u[e].clientId?u:{...u,[e]:{...u[e],clientId:r}};b(s),S(s)},[]),c=t.useCallback((e,r)=>{e&&(S(s=>s[e]?s:{...s,[e]:{origin:e,reason:r,clientId:A.current[e]||null}}),_(e))},[_]),d=t.useCallback((e,{v2:r=!1,origin:s=null}={})=>{s&&(r&&P.current[s]||(b(u=>u[s]?u:{...u,[s]:{origin:s,authUrl:e.authUrl,silentUrl:e.silentUrl||null,status:r&&F.current?"broker":r&&e.silentUrl&&J?"silent":"interactive",v2:r,scope:e.scope||null,acceptsCredentials:q.current[s]||null,consent:null,error:null,clientId:e.clientId||A.current[s]||null,popupBlocked:!1}}),_(s)))},[_]),i=t.useCallback(e=>{b(r=>{if(!r[e])return r;const s={...r};return delete s[e],s})},[]),p=t.useCallback(e=>{e&&(i(e),T(r=>({...r,[e]:(r[e]||0)+1})))},[i]),w=t.useCallback(e=>{b(r=>!r[e]||r[e].status==="interactive"?r:{...r,[e]:{...r[e],status:"interactive"}})},[]),z=t.useCallback(e=>{i(e.origin)},[i]),L=t.useCallback((e,r)=>{const s=te(e,r);if(s){if(re(s,window.location.origin)){c(s,"cross-site-legacy");return}d(e,{origin:s})}},[d,c]);t.useEffect(()=>{if(!a)return;const e=[a.addListener("*","init",(r,s)=>{s!=null&&s.origin&&(r!=null&&r.clientId)&&(A.current[s.origin]=r.clientId,_(s.origin)),s!=null&&s.origin&&Array.isArray(r==null?void 0:r.acceptsCredentials)&&(q.current[s.origin]=r.acceptsCredentials)}),a.addListener("*","authorize",L),a.addListener("*","login",L),a.addListener("*","credential-request",(r,s)=>d(r,{v2:!0,origin:te(r,s)}))];return()=>e.forEach(r=>r())},[a,L,d,_]),t.useEffect(()=>{const e=r=>{const s=r==null?void 0:r.data;if(!s||s.type!=="authorized"&&s.type!=="authorize-failed")return;const u=V(s.authUrl);if(!(!u||r.origin!==u)){if(s.type==="authorized"){if(s.accessToken){if(!k.current[u])return;f(h=>({...h,[u]:X({accessToken:s.accessToken})})),i(u)}else p(u);return}w(u)}};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[i,p,w]);const U=t.useCallback((e,r)=>{const s=e==null?void 0:e.origin,u=X(r);!s||!u||(f(h=>({...h,[s]:u})),i(s))},[i]),C=t.useCallback((e,r)=>{b(s=>s[e]?{...s,[e]:{...s[e],...r}}:s)},[]),$=t.useCallback(async(e,{approve:r}={})=>{const s=F.current,{origin:u}=e;let h;try{h=await s({origin:u,clientId:e.clientId,scope:e.scope,authUrl:e.authUrl},{approve:r})}catch{r?C(u,{error:{reason:"broker_unavailable"}}):C(u,{status:e.silentUrl&&J?"silent":"interactive"});return}if((h==null?void 0:h.status)===200&&h.credential){U(e,h.credential);return}if((h==null?void 0:h.status)===409&&h.consentRequired){C(u,{status:"interactive",consent:{client:h.client||null,stepUp:!!h.stepUp,scope:h.scope||e.scope},error:null});return}const R=(h==null?void 0:h.error)||"broker_error";if(!r&&ke.has(R)){C(u,{status:e.silentUrl&&J?"silent":"interactive"});return}if(r&&R==="consent_denied"){C(u,{error:null});return}i(u),S(he=>({...he,[u]:{origin:u,reason:`broker:${R}`,detail:h||null,clientId:e.clientId||A.current[u]||null}}))},[U,C,i]),B=t.useRef({});t.useEffect(()=>{Object.values(m).forEach(e=>{e.status!=="broker"||B.current[e.origin]||(B.current[e.origin]=!0,$(e).finally(()=>{delete B.current[e.origin]}))})},[m,$]);const v=t.useCallback(e=>!F.current||!(e!=null&&e.consent)?Promise.resolve():$(e,{approve:!0}),[$]);t.useEffect(()=>{const e=G.current;Object.values(m).forEach(r=>{r.status==="silent"&&!e[r.origin]&&(e[r.origin]=setTimeout(()=>{delete e[r.origin],w(r.origin)},Ce))}),Object.keys(e).forEach(r=>{(!m[r]||m[r].status!=="silent")&&(clearTimeout(e[r]),delete e[r])})},[m,w]),t.useEffect(()=>()=>{O.current&&O.current(),Object.values(G.current).forEach(clearTimeout)},[]);const j=t.useCallback(e=>{O.current&&(O.current(),O.current=null);const r=o||se;O.current=r(e,{onBlocked:()=>{b(s=>s[e.origin]?{...s,[e.origin]:{...s[e.origin],popupBlocked:!0}}:s)},onClosed:()=>{if(e.v2){J&&b(s=>!s[e.origin]||!s[e.origin].silentUrl?s:{...s,[e.origin]:{...s[e.origin],status:"silent"}});return}p(e.origin)}})},[o,p]),K={pending:Object.values(m).filter(e=>e.status==="interactive"),authorize:j,approve:v,complete:U,dismiss:z,originEpochs:M,credentials:I,unsupported:x},D=Object.values(m).filter(e=>e.status==="silent"&&e.silentUrl);return E.default.createElement(H.Provider,{value:K},n,D.map(e=>E.default.createElement("iframe",{key:`mm-silent-auth-${e.origin}`,src:e.silentUrl,title:`MachineMetrics silent authorization (${e.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};oe.propTypes={children:y.default.node,launcher:y.default.func,broker:y.default.func};const ie=()=>t.useContext(H),ue=n=>{const{originEpochs:o}=t.useContext(H),l=V(n);return l&&o[l]||0},le=n=>{const{credentials:o}=t.useContext(H),l=V(n);return l&&o[l]||null},ce=n=>{const{unsupported:o}=t.useContext(H),l=V(n);return l&&o[l]||null},ae=({children:n,authorizationLauncher:o,credentialBroker:l})=>{const[a,m]=t.useState({}),[b,M]=t.useState({}),T=t.useRef({}),I=t.useRef({}),f=t.useRef({}),x=t.useCallback((c,d)=>{var i;return!!((i=f.current[c])!=null&&i.has(d))},[]),S=t.useCallback((c,d,i)=>{m(p=>({...p,[c]:{origin:d,frameRef:i}}))},[]),P=t.useCallback(c=>{m(d=>{const i={...d};return delete i[c],i}),M(d=>{const i={...d};return delete i[c],i}),delete f.current[c]},[]);t.useEffect(()=>{const c=(i=[],p,w)=>{i.forEach(z=>z(p,w))},d=i=>{var $,B,v,j,K,D,e;if(!(($=i==null?void 0:i.data)!=null&&$.instanceId))return;const{instanceId:p,type:w}=i.data,z=a[p],L=(v=(B=z==null?void 0:z.frameRef)==null?void 0:B.current)==null?void 0:v.contentWindow;if(!L||i.source!==L||i.origin!==z.origin)return;const U={origin:i.origin},C=T.current;if(w==="response"){const{callbackId:r,response:s,error:u}=i.data,h=I.current[r];h&&(h(s,u),delete I.current[r]);return}if(w==="mark-registered"){const{requestType:r}=i.data;f.current[p]||(f.current[p]=new Set),f.current[p].add(r);return}w==="ready"&&M(r=>({...r,[p]:!0})),c((j=C[p])==null?void 0:j[w],i.data,U),c((K=C["*"])==null?void 0:K[w],i.data,U),c((D=C[p])==null?void 0:D["*"],i.data,U),c((e=C["*"])==null?void 0:e["*"],i.data,U)};return window.addEventListener("message",d),()=>{window.removeEventListener("message",d)}},[a]);const k=t.useCallback((c,d,i)=>{var w,z;const p=a[c];if(!p){console.warn(`Origin not set for id: ${c}. Unable to send message.`);return}(z=(w=p==null?void 0:p.frameRef)==null?void 0:w.current)!=null&&z.contentWindow&&p.frameRef.current.contentWindow.postMessage({type:d,...i,instanceId:c},p.origin)},[a]),O=t.useRef(0),G=t.useCallback(()=>`${Date.now()}-${++O.current}`,[]),A=t.useCallback(async(c,d,i={})=>new Promise((p,w)=>{const z=G(),L=(U,C)=>{delete I.current[z],C?w(C):p(U)};I.current[z]=L,k(c,"request",{callbackId:z,requestType:d,data:i})}),[k]),q=t.useCallback((c,d)=>{k(c,"load-options",d)},[k]),F=t.useCallback((c,d)=>{k(c,"validate",d)},[k]),_=t.useMemo(()=>({registerFrame:S,unregisterFrame:P,sendMessage:k,sendRequest:A,loadOptions:q,validate:F,hasHandler:x,readyFrames:b,addListener:(c,d,i)=>(T.current[c]||(T.current[c]={}),T.current[c][d]||(T.current[c][d]=[]),T.current[c][d].push(i),()=>{T.current[c][d]=T.current[c][d].filter(p=>p!==i)})}),[S,P,k,A,q,F,x,b]);return E.default.createElement(N.Provider,{value:_},E.default.createElement(oe,{launcher:o,broker:l},n))},Z=(n,o,l)=>{const a=t.useContext(N);if(a===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const m=t.useRef(l);t.useEffect(()=>{m.current=l},[l]),t.useEffect(()=>{if(!(!n||!o)){if(o.startsWith("key:")){const b=o.substring(4);return a.readyFrames[n]&&a.sendMessage(n,"subscribe-key",{keyChord:b}),a.addListener(n,`key-pressed:${b}`,(...T)=>m.current(...T))}return a.addListener(n,o,(...b)=>m.current(...b))}},[a,n,o])};ae.propTypes={children:y.default.node.isRequired,authorizationLauncher:y.default.func,credentialBroker:y.default.func};const Y=W.default.default||W.default,we=1e4,Te="credentials",ye=(n,o)=>`${n}/mm-embedded-interop?id=${encodeURIComponent(o)}&origin=${encodeURIComponent(window.location.origin)}&caps=${Te}`,xe=Y.iframe`
2
2
  width: 100%;
3
3
  height: 100%;
4
4
  border: none;
5
5
  visibility: ${n=>n.$isReady?"visible":"hidden"};
6
- `,xe=Y.div`
6
+ `,ze=Y.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
- `,fe=n=>{const o=n&&n.origin||"This app",u=n&&n.reason||"";switch(u){case"broker:scope_above_ceiling":return{title:`${o} can’t be authorized here`,detail:"It asks for permissions your role doesn’t have."};case"broker:origin_mismatch":case"broker:unknown_client":return{title:`${o} can’t be authorized here`,detail:"It isn’t registered to run at this address."};case"broker:cross_company_principal":return{title:`${o} can’t be authorized here`,detail:"It can’t be authorized for this account."};default:return u.startsWith("broker:")?{title:`${o} can’t be authorized here`,detail:"Authorization was refused."}:{title:`${o} can’t be embedded here`,detail:"It needs an update to support embedding from a different domain."}}},pe=({entry:n})=>{const o=fe(n);return g.default.createElement(xe,{"data-reason":n&&n.reason||void 0},g.default.createElement("div",{style:{fontWeight:600}},o.title),g.default.createElement("div",{style:{fontSize:12,color:"#888"}},o.detail))};pe.propTypes={entry:w.default.shape({origin:w.default.string,name:w.default.string,reason:w.default.string,detail:w.default.object})};const Ie=Y.div`
19
+ `,de=n=>{const o=n&&n.origin||"This app",l=n&&n.reason||"";switch(l){case"broker:scope_above_ceiling":return{title:`${o} can’t be authorized here`,detail:"It asks for permissions your role doesn’t have."};case"broker:origin_mismatch":case"broker:unknown_client":return{title:`${o} can’t be authorized here`,detail:"It isn’t registered to run at this address."};case"broker:cross_company_principal":return{title:`${o} can’t be authorized here`,detail:"It can’t be authorized for this account."};default:return l.startsWith("broker:")?{title:`${o} can’t be authorized here`,detail:"Authorization was refused."}:{title:`${o} can’t be embedded here`,detail:"It needs an update to support embedding from a different domain."}}},fe=({entry:n})=>{const o=de(n);return E.default.createElement(ze,{"data-reason":n&&n.reason||void 0},E.default.createElement("div",{style:{fontWeight:600}},o.title),E.default.createElement("div",{style:{fontSize:12,color:"#888"}},o.detail))};fe.propTypes={entry:y.default.shape({origin:y.default.string,name:y.default.string,reason:y.default.string,detail:y.default.object})};const Ie=Y.div`
20
20
  height: 100%;
21
21
  display: flex;
22
22
  flex: 1;
23
23
  align-items: center;
24
24
  justify-content: center;
25
- `,ze=()=>g.default.createElement(Ie,null,g.default.createElement("div",{style:{textAlign:"center"}},"This app couldn’t be loaded as an embeddable widget.")),be=({id:n,src:o,path:u,onInit:f=()=>{},onTimeout:p,context:E={},params:v={},renderUnsupported:x,renderTimeout:_,...M})=>{if("isConfiguring"in M)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 U=t.useRef(),[A,Z]=t.useState(),[k,S]=t.useState(0),[K,y]=t.useState(!1),[q,F]=t.useState(!1),z=ue(o),l=le(o),c=ce(o);t.useEffect(()=>{z>0&&S(0)},[z]);const{registerFrame:i,unregisterFrame:d,sendMessage:b}=t.useContext(N),[C,O]=t.useState(),I=t.useRef(),T=t.useRef(p),L=t.useRef(f),j=t.useRef(!1);t.useEffect(()=>{T.current=p},[p]),t.useEffect(()=>{L.current=f},[f]),t.useEffect(()=>{k&&b(n,"set-context",{context:{...E}})},[E,n,k]),t.useEffect(()=>{k&&b(n,"set-params",{params:v})},[v,n,k]),t.useEffect(()=>{u!==void 0&&O((u==null?void 0:u.indexOf("/"))===0?u:`/${u}`)},[u]),t.useEffect(()=>{C===void 0||!k||b(n,"navigate",{path:C})},[C,k,n,b]),t.useEffect(()=>{if(!o||!n||!U)return;const e=new URL(o);return i(n,e.origin,U),L.current(),Z(de(e.origin,n)),()=>{d(n)}},[o,n,i,U]),t.useEffect(()=>{if(!(!A||j.current))return I.current=setTimeout(()=>{y(!0),T.current&&T.current()},Ce),()=>clearTimeout(I.current)},[A]);const $=t.useCallback(()=>{j.current=!0,clearTimeout(I.current),y(!1)},[]),[D,G]=t.useState(null);W(n,"init",e=>{$(),Array.isArray(e==null?void 0:e.acceptsCredentials)&&G(e.acceptsCredentials)}),W(n,"authorize",$),W(n,"login",$),W(n,"credential-request",()=>{$(),F(!0)}),t.useEffect(()=>{if(!q||!l)return;const e=D;if(Array.isArray(e)&&!e.includes(l.kind))return;const r=l.kind==="access_token"?{accessToken:l.accessToken}:{};b(n,"credential",{...r,credential:l})},[q,l,D,n,b]),W(n,"ready",()=>{$(),S(e=>e+1)});const P=t.useRef();return W(n,"heartbeat",()=>{P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{if(U.current){const e=new URL(o);U.current.src=de(e.origin,n)}},6e3)}),t.useEffect(()=>()=>{P.current&&clearTimeout(P.current)},[]),c?x?x(c):g.default.createElement(pe,{entry:c}):K&&!k?_?_():g.default.createElement(ze,null):g.default.createElement(Te,{key:`auth-epoch-${z}`,$isReady:k,ref:U,src:A,...M})};be.propTypes={id:w.default.string,src:w.default.string.isRequired,path:w.default.string,onInit:w.default.func,onTimeout:w.default.func,renderUnsupported:w.default.func,renderTimeout:w.default.func};const _e=B.default.div`
25
+ `,Se=()=>E.default.createElement(Ie,null,E.default.createElement("div",{style:{textAlign:"center"}},"This app couldn’t be loaded as an embeddable widget.")),pe=({id:n,src:o,path:l,onInit:a=()=>{},onTimeout:m,context:b={},params:M={},renderUnsupported:T,renderTimeout:I,...f})=>{if("isConfiguring"in f)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in b)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in b)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const x=t.useRef(),[S,P]=t.useState(),[k,O]=t.useState(0),[G,A]=t.useState(!1),[q,F]=t.useState(!1),_=ue(o),c=le(o),d=ce(o),[i,p]=t.useState(0),[w,z]=t.useState(null),{registerFrame:L,unregisterFrame:U,sendMessage:C}=t.useContext(N),[$,B]=t.useState(),v=t.useRef(),j=t.useRef(m),K=t.useRef(a),D=t.useRef(!1),e=t.useCallback(()=>{D.current=!1,clearTimeout(v.current),O(0),A(!1),F(!1),z(null)},[]);t.useEffect(()=>{(_>0||i>0)&&e()},[_,i,e]),t.useEffect(()=>{j.current=m},[m]),t.useEffect(()=>{K.current=a},[a]),t.useEffect(()=>{k&&C(n,"set-context",{context:{...b}})},[b,n,k]),t.useEffect(()=>{k&&C(n,"set-params",{params:M})},[M,n,k]),t.useEffect(()=>{l!==void 0&&B((l==null?void 0:l.indexOf("/"))===0?l:`/${l}`)},[l]),t.useEffect(()=>{$===void 0||!k||C(n,"navigate",{path:$})},[$,k,n,C]),t.useEffect(()=>{if(!o||!n||!x)return;e();const u=new URL(o);return L(n,u.origin,x),K.current(),P(ye(u.origin,n)),()=>{U(n)}},[o,n,L,x,e]),t.useEffect(()=>{if(!(!S||D.current))return v.current=setTimeout(()=>{A(!0),j.current&&j.current()},we),()=>clearTimeout(v.current)},[S,o,_,i]);const r=t.useCallback(()=>{D.current=!0,clearTimeout(v.current),A(!1)},[]);Z(n,"init",u=>{r(),Array.isArray(u==null?void 0:u.acceptsCredentials)&&z(u.acceptsCredentials)}),Z(n,"authorize",r),Z(n,"login",r),Z(n,"credential-request",()=>{r(),F(!0)}),t.useEffect(()=>{if(!q||!c)return;const u=w;if(Array.isArray(u)&&!u.includes(c.kind))return;const h=c.kind==="access_token"?{accessToken:c.accessToken}:{};C(n,"credential",{...h,credential:c})},[q,c,w,n,C]),Z(n,"ready",()=>{r(),O(u=>u+1)});const s=t.useRef();return Z(n,"heartbeat",()=>{s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{p(u=>u+1)},6e3)}),t.useEffect(()=>()=>{s.current&&clearTimeout(s.current)},[]),d?T?T(d):E.default.createElement(fe,{entry:d}):G&&!k?I?I():E.default.createElement(Se,null):E.default.createElement(xe,{key:`auth-epoch-${_}-frame-${i}`,$isReady:k,ref:x,src:S,...f})};pe.propTypes={id:y.default.string,src:y.default.string.isRequired,path:y.default.string,onInit:y.default.func,onTimeout:y.default.func,renderUnsupported:y.default.func,renderTimeout:y.default.func};const _e=W.default.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
- `,Me=B.default.div`
33
+ `,Ae=W.default.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
- `,Ue=B.default.div`
42
+ `,Ue=W.default.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
- `,Se=B.default.button`
48
+ `,Me=W.default.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
- `,ye=B.default.p`
57
+ `,Oe=W.default.p`
58
58
  color: #b3261e;
59
59
  font-size: 13px;
60
60
  margin: 4px 0 0;
61
- `,Ae=()=>{const{pending:n,authorize:o}=ie();return n.length===0?null:g.default.createElement(_e,null,g.default.createElement(Me,null,g.default.createElement("h3",{style:{margin:"0 0 8px"}},"Authorization Required"),g.default.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(u=>g.default.createElement("div",{key:u.origin},g.default.createElement(Ue,null,g.default.createElement("div",null,g.default.createElement("div",{style:{fontWeight:600}},u.origin)),g.default.createElement(Se,{onClick:()=>o(u)},"Authorize")),u.popupBlocked&&g.default.createElement(ye,null,"The sign-in window was blocked. Allow popups for this site, then try again.")))))};m.CREDENTIAL_KIND_ACCESS_TOKEN=ee,m.EmbeddedAuthorizationContext=H,m.EmbeddedAuthorizationPrompt=Ae,m.MMEmbeddableZone=be,m.MMEmbeddableZoneContext=N,m.MMEmbeddableZoneProvider=ae,m.isCrossSite=re,m.normalizeCredential=X,m.popupAuthorizationLauncher=se,m.unsupportedCopy=fe,m.useEmbeddedAuthorizations=ie,m.useEmbeddedCredential=le,m.useEmbeddedEffect=W,m.useEmbeddedOriginEpoch=ue,m.useEmbeddedUnsupported=ce,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})}));
61
+ `,me='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';let be=!1;const Le=()=>{const{pending:n,authorize:o,dismiss:l}=ie(),a=n.filter(f=>!f.consent),m=n.length-a.length,b=t.useRef(null),M=t.useRef(null),T=a.length>0;if(t.useEffect(()=>{m>0&&!be&&(be=!0,console.error("[mm-react-embeddable] EmbeddedAuthorizationPrompt received a brokered consent entry. A host with a credentialBroker must render its own consent UI (useEmbeddedAuthorizations: approve/dismiss); this default prompt only handles the popup path."))},[m]),t.useEffect(()=>{if(!T||!b.current)return;M.current=document.activeElement;const f=b.current.querySelector(me);return f&&f.focus(),()=>{const x=M.current;x&&typeof x.focus=="function"&&x.focus()}},[T]),!T)return null;const I=f=>{if(f.key==="Escape"){f.preventDefault(),a.forEach(k=>l(k));return}if(f.key!=="Tab"||!b.current)return;const x=Array.from(b.current.querySelectorAll(me));if(x.length===0)return;const S=x[0],P=x[x.length-1];f.shiftKey&&document.activeElement===S?(f.preventDefault(),P.focus()):!f.shiftKey&&document.activeElement===P&&(f.preventDefault(),S.focus())};return E.default.createElement(_e,null,E.default.createElement(Ae,{ref:b,role:"dialog","aria-modal":"true","aria-labelledby":"mm-embedded-authorization-title",onKeyDown:I},E.default.createElement("h3",{id:"mm-embedded-authorization-title",style:{margin:"0 0 8px"}},"Authorization Required"),E.default.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."),a.map(f=>E.default.createElement("div",{key:f.origin},E.default.createElement(Ue,null,E.default.createElement("div",null,E.default.createElement("div",{style:{fontWeight:600}},f.origin)),E.default.createElement(Me,{onClick:()=>o(f)},"Authorize")),f.popupBlocked&&E.default.createElement(Oe,null,"The sign-in window was blocked. Allow popups for this site, then try again.")))))};g.CREDENTIAL_KIND_ACCESS_TOKEN=ee,g.EmbeddedAuthorizationContext=H,g.EmbeddedAuthorizationPrompt=Le,g.MMEmbeddableZone=pe,g.MMEmbeddableZoneContext=N,g.MMEmbeddableZoneProvider=ae,g.isCrossSite=re,g.normalizeCredential=X,g.popupAuthorizationLauncher=se,g.unsupportedCopy=de,g.useEmbeddedAuthorizations=ie,g.useEmbeddedCredential=le,g.useEmbeddedEffect=Z,g.useEmbeddedOriginEpoch=ue,g.useEmbeddedUnsupported=ce,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@machinemetrics/mm-react-embeddable",
3
- "version": "2.0.0-0",
3
+ "version": "2.0.0-2",
4
4
  "license": "MIT",
5
5
  "module": "dist/mm-react-embeddable.es.js",
6
6
  "main": "dist/mm-react-embeddable.cjs.js",