@valiantys/atlassian-app-frontend 1.0.0

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.
Files changed (66) hide show
  1. package/README.md +726 -0
  2. package/atlassian-app-forge-CTaVjJLt.js +1 -0
  3. package/atlassian-app-forge-DdtDadi2.mjs +117 -0
  4. package/atlassian-app-frontend.api.json +8829 -0
  5. package/atlassian-app-frontend.api.md +740 -0
  6. package/atlassian-app-standalone-DJOVbfp6.js +1 -0
  7. package/atlassian-app-standalone-DyyH6WPO.mjs +111 -0
  8. package/examples/backend/index.ts +44 -0
  9. package/examples/backend/lib/forge-functions.d.ts +3 -0
  10. package/examples/backend/lib/forge-functions.ts +23 -0
  11. package/examples/backend/lib/handler-functions.d.ts +58 -0
  12. package/examples/backend/lib/handler-functions.ts +72 -0
  13. package/examples/backend/lib/standalone-functions.d.ts +3 -0
  14. package/examples/backend/lib/standalone-functions.ts +17 -0
  15. package/examples/client-sample-.env +5 -0
  16. package/examples/hello-world/app.d.ts +2 -0
  17. package/examples/hello-world/app.tsx +77 -0
  18. package/examples/hello-world/example-box.d.ts +8 -0
  19. package/examples/hello-world/example-box.tsx +22 -0
  20. package/examples/hello-world/example-components/forge-storage-example.d.ts +1 -0
  21. package/examples/hello-world/example-components/forge-storage-example.tsx +66 -0
  22. package/examples/hello-world/example-components/hello-with-loading-spinner.d.ts +1 -0
  23. package/examples/hello-world/example-components/hello-with-loading-spinner.tsx +24 -0
  24. package/examples/hello-world/example-components/hello.d.ts +1 -0
  25. package/examples/hello-world/example-components/hello.spec.tsx +39 -0
  26. package/examples/hello-world/example-components/hello.tsx +13 -0
  27. package/examples/hello-world/example-components/host-router-example.d.ts +1 -0
  28. package/examples/hello-world/example-components/host-router-example.tsx +13 -0
  29. package/examples/hello-world/example-components/issue-types-example-backend.d.ts +4 -0
  30. package/examples/hello-world/example-components/issue-types-example-backend.tsx +37 -0
  31. package/examples/hello-world/example-components/issue-types-example.d.ts +4 -0
  32. package/examples/hello-world/example-components/issue-types-example.tsx +40 -0
  33. package/examples/hello-world/example-components/list-assets.d.ts +1 -0
  34. package/examples/hello-world/example-components/list-assets.tsx +38 -0
  35. package/examples/hello-world/example-components/open-modal-example.d.ts +1 -0
  36. package/examples/hello-world/example-components/open-modal-example.tsx +47 -0
  37. package/examples/hello-world/example-components/view-context-example.d.ts +1 -0
  38. package/examples/hello-world/example-components/view-context-example.tsx +17 -0
  39. package/examples/hello-world/example-components/who-am-i.d.ts +1 -0
  40. package/examples/hello-world/example-components/who-am-i.tsx +13 -0
  41. package/examples/hello-world/main.d.ts +0 -0
  42. package/examples/hello-world/main.tsx +11 -0
  43. package/examples/hello-world/styles.css +1 -0
  44. package/examples/hello-world-modal/app.d.ts +2 -0
  45. package/examples/hello-world-modal/app.tsx +30 -0
  46. package/examples/hello-world-modal/hello.d.ts +1 -0
  47. package/examples/hello-world-modal/hello.tsx +15 -0
  48. package/examples/hello-world-modal/main.d.ts +0 -0
  49. package/examples/hello-world-modal/main.tsx +11 -0
  50. package/examples/hello-world-modal/styles.css +1 -0
  51. package/examples/hello-world-remote/app.d.ts +2 -0
  52. package/examples/hello-world-remote/app.tsx +23 -0
  53. package/examples/hello-world-remote/invoke-remote-example.d.ts +13 -0
  54. package/examples/hello-world-remote/invoke-remote-example.tsx +40 -0
  55. package/examples/hello-world-remote/main.d.ts +0 -0
  56. package/examples/hello-world-remote/main.tsx +11 -0
  57. package/examples/hello-world-remote/styles.css +1 -0
  58. package/examples/manifest.yml.example +49 -0
  59. package/index-CBKhl1FP.mjs +22 -0
  60. package/index-CP8emE0q.js +1 -0
  61. package/index.d.ts +654 -0
  62. package/index.js +2 -0
  63. package/index.mjs +1145 -0
  64. package/package.json +54 -0
  65. package/style.css +1 -0
  66. package/tsdoc-metadata.json +11 -0
package/index.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),L=require("@atlaskit/button"),D=require("@atlaskit/button/new"),x=require("@atlaskit/form"),h=require("@atlaskit/primitives"),F=require("@atlaskit/section-message"),H=require("@atlaskit/select"),i=require("react"),_=require("@atlaskit/heading"),Re=require("@atlaskit/spinner"),g=require("react-router-dom"),P=require("@atlaskit/flag"),Se=require("@atlaskit/icon/glyph/check-circle"),ye=require("@atlaskit/icon/glyph/error"),Pe=require("@atlaskit/icon/glyph/info"),Ee=require("@atlaskit/icon/glyph/warning"),A=require("@atlaskit/tokens"),B=class B{};B.getOauthToken="get-token";let b=B;class J{constructor(t){this.message=t}}function S(e,t){const r={Authorization:e.startsWith("Bearer ")?e:`Bearer ${e}`};return t?{...t,...r}:r}async function N(e,t,r){const c=S(e,r.headers||{});return fetch(t,{...r,headers:c})}async function C(e,t,r,c,o="json",n={}){return I(t,r,S(e,n),c,o)}async function I(e,t,r,c,o="json"){const n={...r||{},Accept:o==="json"?"application/json":"text/html","Content-Type":o==="json"?"application/json":"text/html"},u=c?JSON.stringify(c):void 0,a=await fetch(e,{method:t,headers:n,body:u});if(a.ok)return t==="DELETE"?void 0:o==="text"?await a.text():await a.json();{let l="";try{l=await a.text()}catch{}const p=`${a.status} ${a.statusText} - ${t} ${e}
2
+ ${l}`;throw console.error(p),new J(p)}}class V{constructor(t){this.value_=t}set value(t){throw new Error("modification of a Route is not allowed")}get value(){return this.value_}}function W(e){return e instanceof V}const be=["..",".%2e","%2e.","%2e%2e",".%2E","%2E.","%2E%2e"],Fe=["/","\\"],z=["?","#"];function R(e,t){return e.some(r=>t.includes(r))}function Ie(e,t){switch(t){case"path":if(W(e))return e.value;if(e=String(e),R(be,e)||R(z,e)||R(Fe,e))throw new Error("Disallowing path manipulation attempt. For more information see: https://go.atlassian.com/product-fetch-api-route");return e;case"query":return W(e)?encodeURIComponent(e.value):e instanceof URLSearchParams?e.toString():encodeURIComponent(e)}}function G(e,...t){let r="path",c="";for(let o=0;o<e.length;o++){const n=e[o];if(R(z,n)&&(r="query"),c+=n,o>=t.length)break;c+=Ie(t[o],r)}return new V(c)}function E(e,t){if(t){const r=e.startsWith("/")?e.slice(1):e;return`${t}/${r}`}else return e}function y(e,t,r){return{productType:r,fetch:({url:c,method:o,responseType:n="json",allowExperimental:u=!1},a)=>C(e,E(c.value,t),o,a,n,{"X-ExperimentalApi":u?"opt-in":""}),route:G,rawFetch:(c,o)=>N(e,E(c.value,t),o),fullUrl:c=>E(c,t)}}function qe(e,t){return y(e,`https://api.atlassian.com/ex/jira/${t}`,"jira")}function Oe(e,t){return y(e,`https://api.atlassian.com/ex/confluence/${t}`,"confluence")}function Ue(e){return y(e,"https://api.bitbucket.org","bitbucket")}async function Be(e){return C(e,"https://api.atlassian.com/me","GET")}async function We(e,t,r,c,o){return I("https://auth.atlassian.com/oauth/token","POST",void 0,{grant_type:e,client_id:t,client_secret:r,code:c,redirect_uri:o})}class K extends Error{constructor(t){super(t)}}class $e{constructor(){this.userResourcesUrl="https://api.atlassian.com/oauth/token/accessible-resources"}async getAtlassianUserResources(t){return await C(t,this.userResourcesUrl,"GET")}async checkUserChosenResource(t,r){const o=(await this.getAtlassianUserResources(t)).filter((n,u,a)=>a.findIndex(l=>l.id===n.id)===u).map(n=>({name:n.name,id:n.id}));if(o.length>1){if(r){const n=o.find(u=>u.id===r);if(n)return{hasChosen:!0,resource:n}}return{hasChosen:!1,resources:o}}else{if(o.length===1)return{hasChosen:!0,resource:o[0]};throw new K("Provided token does not have permissions for any resources")}}}class X{constructor(t){this.fetchSvc=t,this.workspaceApiUrl="/rest/servicedeskapi/assets/workspace"}async getAllUserWorkspaces(){const t=[];let r=!0;const c=50;let o=0;for(;r;){const n=await this.fetchSvc.fetch({url:this.fetchSvc.route`/rest/servicedeskapi/assets/workspace?start=${o}&limit=${c}`,method:"GET"});t.push(...n.values),o+=c,n.isLastPage&&(r=!1)}return t}async checkUserChosenWorkspace(t){const r=await this.getAllUserWorkspaces();if(r.length>1){if(t){const c=r.find(o=>o.workspaceId===t);if(c)return{hasChosen:!0,workspace:c.workspaceId}}return{hasChosen:!1,workspaces:r}}else{if(r.length===1)return{hasChosen:!0,workspace:r[0].workspaceId};throw new K("Provided token does not have permissions for any workspaces")}}}const Y=i.createContext(null),Me=()=>{const e=i.useContext(Y);if(!e)throw new Error("useRequestBitbucket must be used within a RequestBitbucketProvider");return e};function Q({children:e,requestBitbucketImplementation:t}){return s.jsx(Y.Provider,{value:t,children:e})}const Z=i.createContext(null),Te=()=>{const e=i.useContext(Z);if(!e)throw new Error("useRequestConfluence must be used within a RequestConfluenceProvider");return e};function ee({children:e,requestConfluenceImplementation:t}){return s.jsx(Z.Provider,{value:t,children:e})}const te=i.createContext(null),re=()=>{const e=i.useContext(te);if(!e)throw new Error("useRequestJira must be used within a RequestJiraProvider");return e};function se({children:e,requestJiraImplementation:t}){return s.jsx(te.Provider,{value:t,children:e})}function j({label:e,loadingError:t,labelSize:r}){return s.jsxs(h.Flex,{direction:"column",children:[s.jsx(_,{size:r||"large",children:e}),t?s.jsx(F,{appearance:"error",children:t}):s.jsx(Re,{interactionName:"load"})]})}const oe=i.createContext(void 0),Le=()=>i.useContext(oe);function q({children:e,workspaceId:t}){return s.jsx(oe.Provider,{value:t,children:e})}const $=h.xcss({maxWidth:"max-content",paddingBlockStart:"space.1000"});function De({appName:e,children:t}){const[r,c]=i.useState(!1),[o,n]=i.useState(null),[u,a]=i.useState(""),[l,p]=i.useState(),f=re(),d=i.useCallback(async m=>{try{a("");const w=m??(e&&localStorage.getItem(`${e}-user-workspace-id`))??"",k=await new X(f).checkUserChosenWorkspace(w);k.hasChosen?(e&&localStorage.setItem(`${e}-user-workspace-id`,k.workspace),c(!0),p(k.workspace)):n(k.workspaces)}catch(w){w instanceof Error?a(`Error Occurred: ${w.message}`):a("Uncaught error occurred!")}},[e,f]);i.useEffect(()=>{d()},[d]);async function v({selectedWorkspace:m}){return d(m.value)}if(r)return s.jsx(q,{workspaceId:l,children:t});if(o){const m=o.map(w=>({label:w.workspaceId,value:w.workspaceId}));return s.jsx(h.Flex,{justifyContent:"center",children:s.jsx(h.Box,{xcss:$,children:s.jsx(x,{onSubmit:v,children:({formProps:w,submitting:k})=>s.jsxs("form",{...w,children:[s.jsx(x.FormHeader,{title:"Choose Workspace",children:u?s.jsx(F,{appearance:"error",children:u}):null}),s.jsx(x.FormSection,{children:s.jsx(x.Field,{"aria-required":!0,name:"selectedWorkspace",label:"Workspace",isRequired:!0,children:({fieldProps:Ae})=>s.jsx("div",{"data-testid":"workspace-select-component",children:s.jsx(H,{...Ae,options:m})})})}),s.jsx(x.FormFooter,{align:"start",children:s.jsx(L.ButtonGroup,{label:"Form submit options",children:s.jsx(D,{type:"submit",appearance:"primary",isLoading:k,children:"Submit"})})})]})})})})}else return s.jsx(h.Flex,{justifyContent:"center",xcss:$,children:s.jsx(j,{label:"",loadingError:u})})}const ne=i.createContext(null),He=()=>{const e=i.useContext(ne);if(!e)throw new Error("useBackendAdapter must be used within a BackendAdapterProvider");return e};function ce({children:e,invokeImplementation:t}){return s.jsx(ne.Provider,{value:{invoke:t},children:e})}function _e(e,t,r){return async(c,o)=>C(t,e+c,"POST",{...o},"json",{"resource-id":r})}class Je{navigate(t){return window.location.href=t,Promise.resolve()}open(t){return window.open(t,"_blank"),Promise.resolve()}reload(){return window.location.reload(),Promise.resolve()}}const ie=i.createContext(null),Ne=()=>{const e=i.useContext(ie);if(!e)throw new Error("useHostRouter must be used within a HostRouterProvider");return e};function ae({children:e,hostRouter:t}){return s.jsx(ie.Provider,{value:t,children:e})}const ue=i.createContext(null),Ve=()=>{const e=i.useContext(ue);if(!e)throw new Error("useRemoteAdapter must be used within a RemoteAdapterProvider");return e};function le({children:e,invokeRemoteImplementation:t}){return s.jsx(ue.Provider,{value:{invokeRemote:t},children:e})}function ze(e,t){return async r=>{const c=`${e}${r.path}`,o=await fetch(c,{method:r.method,headers:t?S(t,r.headers||{}):r.headers,body:r.body?JSON.stringify(r.body):void 0}),n={};return o.headers.forEach((a,l)=>{n[l]=a}),{body:await o.json(),headers:n,status:o.status}}}const de=i.createContext(null),he=()=>{const e=i.useContext(de);if(!e)throw new Error("useViewContext must be used within a ViewContextProvider");return e};function pe({children:e,viewContext:t}){return s.jsx(de.Provider,{value:t,children:e})}class O{constructor(t){this.context=t,this.theme={enable(){return Promise.resolve()}}}close(t){return Promise.resolve()}submit(t){return Promise.resolve()}getContext(){return Promise.resolve(this.context)}createHistory(){throw new Error("Method not implemented.")}refresh(){return Promise.resolve()}}function Ge({mockContext:e,invoke:t,invokeRemote:r,jiraFetchService:c,confluenceFetchService:o,bitbucketFetchService:n,hostRouter:u,children:a}){let l=s.jsx(q,{workspaceId:"test-workspace",children:s.jsx(ce,{invokeImplementation:t,children:s.jsx(le,{invokeRemoteImplementation:r,children:s.jsx(ae,{hostRouter:u,children:s.jsx(pe,{viewContext:new O(e),children:a})})})})});return c&&(l=s.jsx(se,{requestJiraImplementation:c,children:l})),o&&(l=s.jsx(ee,{requestConfluenceImplementation:o,children:l})),n&&(l=s.jsx(Q,{requestBitbucketImplementation:n,children:l})),l}function Ke(e){return{mockContext:{accountId:"testAccount",cloudId:"testSite",workspaceId:"testWorkspace",siteUrl:"https://expiumdev.atlassian.net",extension:{type:"jira:globalPage"},timezone:"America/Chicago",locale:"en-US",localId:"devId",moduleKey:"TestApp",environmentId:"TEST",environmentType:"DEVELOPMENT"},invoke:e(),invokeRemote:e(),hostRouter:{navigate:e(),open:e(),reload:e()}}}function Xe(e){const r=new URLSearchParams(window.location.search).get("code");return i.useEffect(()=>{r&&(async()=>{const c=await fetch(e.codeTokenExchangeUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({code:r,redirect_uri:e.redirectUri})});if(c.ok){const o=await c.json(),n=Date.now()+o.expires_in*1e3;e.setAuth({token:o.access_token,expiresAt:n})}})()}),s.jsx(j,{label:"Fetching auth token with provided code"})}function fe(e,t,r){const c=new URLSearchParams({audience:"api.atlassian.com",client_id:e,scope:r.join(" "),redirect_uri:t,state:Ye(),response_type:"code",prompt:"consent"}).toString();window.location.href=`https://auth.atlassian.com/authorize?${c}`}function Ye(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}function Qe(e){return fe(e.clientId,e.redirectUri,e.oAuthScopes),s.jsx(j,{label:"Redirecting to Atlassian Authentication System"})}const Ze=h.xcss({paddingBlockStart:"space.1000"}),xe=i.createContext(null),et=()=>{const e=i.useContext(xe);return e||(console.warn("No OAuth provider"),{getAuthToken:()=>""})};function we({children:e,...t}){const[r,c]=i.useState(localStorage.getItem(`${t.appName}-auth-token`)),o=localStorage.getItem(`${t.appName}-auth-expires-at`),[n,u]=i.useState(o?Number(o):null),a=window.location.protocol+"//"+window.location.hostname+(window.location.port?`:${window.location.port}`:""),l=a+"/callback";function p(){return n&&r&&!M(n)?r:(fe(t.clientId,l,t.oAuthScopes),"")}function f(d){c(d.token),localStorage.setItem(`${t.appName}-auth-token`,d.token),u(d.expiresAt),localStorage.setItem(`${t.appName}-auth-expires-at`,d.expiresAt.toString()),localStorage.removeItem(`${t.appName}-user-resource-id`),localStorage.removeItem(`${t.appName}-user-workspace-id`),window.location.href=a}return!r||!n||M(n)?s.jsx(h.Flex,{justifyContent:"center",xcss:Ze,children:s.jsx(g.BrowserRouter,{children:s.jsxs(g.Routes,{children:[s.jsx(g.Route,{path:"/",element:s.jsx(Qe,{clientId:t.clientId,redirectUri:l,oAuthScopes:t.oAuthScopes})}),s.jsx(g.Route,{path:"/callback",element:s.jsx(Xe,{setAuth:f,redirectUri:l,codeTokenExchangeUrl:t.codeTokenExchangeUrl})}),s.jsx(g.Route,{path:"/*",element:s.jsx(g.Navigate,{to:"/",replace:!0})})]})})}):s.jsx(xe.Provider,{value:{getAuthToken:p},children:e})}function M(e){return e<Date.now()}const tt=i.lazy(()=>Promise.resolve().then(()=>require("./atlassian-app-forge-CTaVjJLt.js"))),rt=i.lazy(()=>Promise.resolve().then(()=>require("./atlassian-app-standalone-DJOVbfp6.js"))),me=window.self===window.top;function st({children:e,appName:t,doCheckWorkspace:r,embeddedConfig:c,standaloneConfig:o}){var n;if(me)if(o){const u=s.jsx(rt,{appName:t,backendUrl:o.backendUrl,remoteUrl:o.remoteUrl,initialMockViewContext:o.initialMockViewContext,modalOpenerConfig:o.modalOpenerConfig,modalContextConfig:o.modalContextConfig,doCheckWorkspace:o.oauthConfig&&r,doCheckResource:((n=o.oauthConfig)==null?void 0:n.doCheckResource)!==!1,children:e});return o.oauthConfig?s.jsx(we,{clientId:o.oauthConfig.clientId,codeTokenExchangeUrl:o.oauthConfig.codeTokenExchangeUrl,appName:t,oAuthScopes:o.oauthConfig.oAuthScopes,children:u}):u}else return s.jsx("div",{children:"Not configured for standalone mode."});else return s.jsx(tt,{appName:t,doCheckWorkspace:r,invokeRemoteImpl:c==null?void 0:c.invokeRemoteImpl,children:e})}const T=h.xcss({maxWidth:"max-content",paddingBlockStart:"space.1000"});function ot({checkResource:e,children:t}){const[r,c]=i.useState(!1),[o,n]=i.useState(null),[u,a]=i.useState(""),l=i.useCallback(async f=>{try{a("");const d=await e(f);d.hasChosen?c(!0):n(d.resources)}catch(d){d instanceof Error?a(`Error Occurred: ${d.message}`):a("Uncaught error occurred!")}},[e]);i.useEffect(()=>{l()},[l]);function p({selectedResource:f}){return l(f.value)}if(r)return t;if(o){const f=o.map(d=>({label:d.name,value:d.id}));return s.jsx(h.Flex,{justifyContent:"center",children:s.jsx(h.Box,{xcss:T,children:s.jsx(x,{onSubmit:p,children:({formProps:d,submitting:v})=>s.jsxs("form",{...d,children:[s.jsx(x.FormHeader,{title:"Choose Resource",children:u?s.jsx(F,{appearance:"error",children:u}):null}),s.jsx(x.FormSection,{children:s.jsx(x.Field,{"aria-required":!0,name:"selectedResource",label:"Resource",isRequired:!0,children:({fieldProps:m})=>s.jsx(H,{...m,options:f})})}),s.jsx(x.FormFooter,{align:"start",children:s.jsx(L.ButtonGroup,{label:"Form submit options",children:s.jsx(D,{type:"submit",appearance:"primary",isLoading:v,children:"Submit"})})})]})})})})}else return s.jsx(h.Flex,{justifyContent:"center",xcss:T,children:s.jsx(j,{label:"",loadingError:u})})}const U=i.createContext(void 0);function ve(){return i.useContext(U)}function nt(){const e=ve();function t(o){e({type:"add",id:o.id,props:o})}function r(o){e({type:"remove",id:o})}function c(o,n,u,a){t({id:o,isAutoDismiss:!1,type:"error",title:n,description:u instanceof Error?u.message:typeof u=="string"?u:"Uncaught error occurred!",actions:a})}return{addFlag:t,removeFlag:r,addErrorFlag:c}}function ct({children:e}){const[t,r]=i.useReducer(at,[]);function c(n){r({type:"remove",id:n})}function o(n){switch(n){case"info":return s.jsx(Pe,{label:"Info",primaryColor:A.token("color.icon.information"),size:"large"});case"warning":return s.jsx(Ee,{label:"Warning",primaryColor:A.token("color.icon.warning"),size:"large"});case"error":return s.jsx(ye,{label:"Error",primaryColor:A.token("color.icon.danger"),size:"large"});case"success":return s.jsx(Se,{primaryColor:A.token("color.icon.success"),label:"Success",size:"large"})}}return s.jsxs(U.Provider,{value:r,children:[e,s.jsx(P.FlagGroup,{onDismissed:c,children:t.map(n=>n.isAutoDismiss?s.jsx(P.AutoDismissFlag,{id:n.id,icon:o(n.type||"success"),title:n.title},n.id):s.jsx(P,{appearance:n.appearance||"normal",icon:o(n.type||"success"),id:n.id,title:n.title,description:n.description,actions:it(n.actions)},n.id))})]})}function it(e){return e==null?void 0:e.map(t=>({...t,content:t.text}))}function at(e,t){switch(t.type){case"add":if(t.props){const r=e.filter(c=>c.id!==t.id);return r.push(t.props),r}else return console.error("invalid flag action: ",JSON.stringify(t)),e;case"remove":return e.filter(r=>r.id!==t.id);default:throw Error("Unknown action: "+t.type)}}function ke(e,t,r){i.useEffect(()=>(window.addEventListener(e,t,r),()=>{window.removeEventListener(e,t,r)}),[e,t,r])}const ge=i.createContext({close:()=>{}});function Ce(){return i.useContext(ge)}function ut({children:e}){const[t,r]=i.useState(),c=he(),o=i.useCallback(()=>{c.close()},[c]);return ke("unload",o),i.useEffect(()=>{(async()=>{const n=await c.getContext();r(n.extension.modal)})()},[c]),s.jsx(ge.Provider,{value:{modalContextData:t,close:c.close},children:e})}const lt={"modal-content-iframe-wrapper":"_modal-content-iframe-wrapper_9wuab_1"};function dt({messageCallback:e,closeOnMouseOut:t}){const[r,c]=i.useState(),o=i.useRef(!1),n=i.useRef(!1),u=i.useRef(null),{modalContextData:a,close:l}=Ce(),p=i.useCallback(f=>{var d;if(f.source===((d=u.current)==null?void 0:d.contentWindow)&&e){const v=e(f.data,a);v.newHeight&&c(v.newHeight)}},[e,a]);return ke("message",p),i.useEffect(()=>{(async()=>a!=null&&a.height&&c(a.height))()},[a]),i.useEffect(()=>{(async()=>{var f;!n.current&&((f=u.current)!=null&&f.contentWindow)&&(u.current.contentWindow.focus(),n.current=!0)})()}),s.jsx("div",{className:lt["modal-content-iframe-wrapper"],children:s.jsx("iframe",{title:a==null?void 0:a.title,ref:u,width:a==null?void 0:a.width,height:r,src:a==null?void 0:a.link,onMouseEnter:()=>o.current=!0,onMouseOut:()=>{o.current&&t&&(l==null||l())}})})}class ht{constructor(t,r={}){this.defaultUrl=t,this.resourceMap=r}open(t){const r=t.resource&&this.resourceMap[t.resource]||this.defaultUrl,c=this.features(t.size||"small"),o=window.open(r,"_blank",c),n=u=>{var a,l;if(u.source===o&&(a=u.data)!=null&&a.closing){const p=u.data;window.removeEventListener("message",n),(l=t.onClose)==null||l.call(t,p.payload)}};return window.addEventListener("message",n),Promise.resolve()}features(t){switch(t){case"small":return"popup,width=400,height=320";case"medium":return"popup,width=600,height=520";case"large":return"popup,width=800,height=720";case"xlarge":return"popup,width=968,height=900";case"max":return""}}}const je=i.createContext(null),pt=()=>{const e=i.useContext(je);if(!e)throw new Error("useModalService must be used within a ModalServiceProvider");return e};function ft({children:e,modalService:t}){return s.jsx(je.Provider,{value:t,children:e})}class xt extends O{constructor(t,r="http://localhost:4200"){super(t),this.context=t,this.openerOrigin=r,this.close=c=>{var n;const o={closing:!0,payload:c};return(n=window.opener)==null||n.postMessage(o,this.openerOrigin),window.close(),Promise.resolve()}}}function wt({title:e,buttonGroup:t,children:r}){return s.jsxs(h.Flex,{direction:"column",xcss:h.xcss({height:"100%",padding:"space.300"}),children:[s.jsx(h.Box,{children:s.jsx(_,{size:"medium",children:e})}),s.jsx(h.Box,{paddingBlockStart:"space.200",xcss:h.xcss({flexGrow:2}),children:r}),s.jsx(h.Box,{paddingBlockStart:"space.200",children:s.jsx(h.Flex,{justifyContent:"end",alignItems:"center",children:t})})]})}function mt(e){return console.error(e),`Error Occurred: ${e.message||e}`}function vt(e,t=mt){const[r,c]=i.useState(),[o,n]=i.useState(!0),[u,a]=i.useState(),l=i.useCallback(async()=>{n(!0);try{const p=await e();return c(p),p}catch(p){a(t(p))}finally{n(!1)}},[e,t]);return i.useEffect(()=>{l()},[l]),{data:r,loading:o,error:u,setData:c,setLoading:n,setError:a,manualTrigger:()=>l()}}exports.AppFlagsDispatchContext=U;exports.AppFlagsProviderAtlasKit=ct;exports.AtlassianApp=st;exports.AtlassianAppTest=Ge;exports.AtlassianUserResourceService=$e;exports.AtlassianUserWorkspaceService=X;exports.BackendAdapterProvider=ce;exports.CommonResolverPaths=b;exports.FeatureChosenResourceCheck=ot;exports.FeatureChosenWorkspaceCheck=De;exports.FetchError=J;exports.HostRouterProvider=ae;exports.IS_STANDALONE=me;exports.JiraWorkspaceProvider=q;exports.MockViewContext=O;exports.ModalContent=ut;exports.ModalContentIframe=dt;exports.ModalDialogLayout=wt;exports.ModalServiceProvider=ft;exports.ModalViewContext=xt;exports.OAuthProvider=we;exports.PageLoadingView=j;exports.RemoteAdapterProvider=le;exports.RequestBitbucketProvider=Q;exports.RequestConfluenceProvider=ee;exports.RequestJiraProvider=se;exports.ViewContextProvider=pe;exports.WindowHostRouter=Je;exports.WindowModalService=ht;exports.addAuthHeader=S;exports.atlassianOAuthBitbucketFetch=Ue;exports.atlassianOAuthConfluenceFetch=Oe;exports.atlassianOAuthJiraFetch=qe;exports.atlassianOAuthRawFetch=y;exports.bearerAuthFetch=C;exports.bearerAuthFetchRaw=N;exports.defaultProps=Ke;exports.getAtlassianOAuthToken=We;exports.getAtlassianUserDetails=Be;exports.getOauthFetchInvokeImpl=_e;exports.jsonFetch=I;exports.oauthFetchInvokeRemote=ze;exports.route=G;exports.useAppFlagsDispatch=ve;exports.useAppFlagsDispatchMethods=nt;exports.useBackendAdapter=He;exports.useHostRouter=Ne;exports.useLoadDataEffect=vt;exports.useModalContentService=Ce;exports.useModalService=pt;exports.useOAuth=et;exports.useRemoteAdapter=Ve;exports.useRequestBitbucket=Me;exports.useRequestConfluence=Te;exports.useRequestJira=re;exports.useViewContext=he;exports.useWorkspaceId=Le;