@valiantys/atlassian-app-frontend 1.0.0 → 2.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.
- package/atlassian-app-forge-BwFXF-6M.js +3 -0
- package/atlassian-app-forge-DG01gNAI.mjs +139 -0
- package/atlassian-app-frontend.api.json +966 -186
- package/atlassian-app-frontend.api.md +89 -32
- package/index-BePJjrLy.js +1 -0
- package/{index-CBKhl1FP.mjs → index-ZJX0bAUh.mjs} +1 -0
- package/index.d.ts +96 -48
- package/index.js +2 -2
- package/index.mjs +635 -477
- package/package.json +2 -2
- package/style.css +1 -1
- package/valiantys-atlassian-app-frontend-2.0.0.tgz +0 -0
- package/atlassian-app-forge-CTaVjJLt.js +0 -1
- package/atlassian-app-forge-DdtDadi2.mjs +0 -117
- package/atlassian-app-standalone-DJOVbfp6.js +0 -1
- package/atlassian-app-standalone-DyyH6WPO.mjs +0 -111
- package/index-CP8emE0q.js +0 -1
|
@@ -13,6 +13,8 @@ import { FlagOptions } from '@forge/bridge/out/flag/flag';
|
|
|
13
13
|
import { FullContext } from '@forge/bridge/out/types';
|
|
14
14
|
import { HeadingSize } from '@atlaskit/heading/dist/types/heading.partial';
|
|
15
15
|
import { History as History_2 } from 'history';
|
|
16
|
+
import { IconButtonAppearance } from '@atlaskit/button/new';
|
|
17
|
+
import { IconProp } from '@atlaskit/button/new';
|
|
16
18
|
import { JSX as JSX_2 } from 'react/jsx-runtime';
|
|
17
19
|
import { PropsWithChildren } from 'react';
|
|
18
20
|
import { ReactElement } from 'react';
|
|
@@ -74,23 +76,32 @@ export interface AtlassianAppConfig {
|
|
|
74
76
|
invokeRemoteImpl?: InvokeRemoteSignature;
|
|
75
77
|
useAtlasKitFlags?: boolean;
|
|
76
78
|
};
|
|
77
|
-
standaloneConfig?:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
79
|
+
standaloneConfig?: AtlassianAppStandaloneConfig;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// @public (undocumented)
|
|
83
|
+
export function AtlassianAppStandalone({ initialMockViewContext, backendUrl, remoteUrl, doCheckWorkspace, appName, doCheckResource, modalOpenerConfig, modalContextConfig, children, }: PropsWithChildren<JiraStandaloneAppWrapperProps>): JSX_2.Element;
|
|
84
|
+
|
|
85
|
+
// @public (undocumented)
|
|
86
|
+
export interface AtlassianAppStandaloneConfig {
|
|
87
|
+
backendUrl?: string;
|
|
88
|
+
initialMockViewContext?: Partial<FullContext>;
|
|
89
|
+
modalContextConfig?: {
|
|
90
|
+
openerOrigin: string;
|
|
91
|
+
};
|
|
92
|
+
modalOpenerConfig?: {
|
|
93
|
+
resourceMap?: Record<string, string>;
|
|
94
|
+
defaultUrl: string;
|
|
91
95
|
};
|
|
96
|
+
oauthConfig?: AtlassianAppStandaloneOauthConfig;
|
|
97
|
+
remoteUrl?: string;
|
|
92
98
|
}
|
|
93
99
|
|
|
100
|
+
// @public (undocumented)
|
|
101
|
+
export type AtlassianAppStandaloneOauthConfig = OAuthProviderProps & {
|
|
102
|
+
doCheckResource?: boolean;
|
|
103
|
+
};
|
|
104
|
+
|
|
94
105
|
// @public (undocumented)
|
|
95
106
|
export function AtlassianAppTest({ mockContext, invoke, invokeRemote, jiraFetchService, confluenceFetchService, bitbucketFetchService, hostRouter, children, }: PropsWithChildren<AtlassianAppTestProps>): JSX_2.Element;
|
|
96
107
|
|
|
@@ -125,18 +136,18 @@ export function atlassianOAuthJiraFetch(authToken: string, cloudId: string): Atl
|
|
|
125
136
|
export function atlassianOAuthRawFetch<P extends Product>(authToken: string, domain: string, productType: P): AtlassianProductFetchService<P>;
|
|
126
137
|
|
|
127
138
|
// @public (undocumented)
|
|
128
|
-
export type AtlassianOAuthScopes = 'read:me' | 'read:jira-user' | 'read:jira-work' | 'read:servicedesk-request' | 'write:servicedesk-request' | 'read:cmdb-schema:jira' | 'write:cmdb-schema:jira' | 'read:cmdb-type:jira' | 'write:cmdb-type:jira' | 'read:cmdb-object:jira' | 'write:cmdb-object:jira' | 'delete:cmdb-object:jira' | 'read:cmdb-attribute:jira' | 'write:cmdb-attribute:jira' | 'read:cmdb-icon:jira';
|
|
139
|
+
export type AtlassianOAuthScopes = 'read:me' | 'read:jira-user' | 'read:jira-work' | 'write:jira-work' | 'read:servicedesk-request' | 'write:servicedesk-request' | 'read:cmdb-schema:jira' | 'write:cmdb-schema:jira' | 'read:cmdb-type:jira' | 'write:cmdb-type:jira' | 'read:cmdb-object:jira' | 'write:cmdb-object:jira' | 'delete:cmdb-object:jira' | 'read:cmdb-attribute:jira' | 'write:cmdb-attribute:jira' | 'read:cmdb-icon:jira';
|
|
129
140
|
|
|
130
141
|
// @public (undocumented)
|
|
131
142
|
export interface AtlassianProductFetchService<P extends Product> {
|
|
132
143
|
// (undocumented)
|
|
133
|
-
fetch:
|
|
144
|
+
fetch: FetchSignature;
|
|
134
145
|
// (undocumented)
|
|
135
146
|
fullUrl: (path: string) => string;
|
|
136
147
|
// (undocumented)
|
|
137
148
|
productType: P;
|
|
138
149
|
// (undocumented)
|
|
139
|
-
rawFetch:
|
|
150
|
+
rawFetch: RequestProductMethod;
|
|
140
151
|
// (undocumented)
|
|
141
152
|
route: (template: TemplateStringsArray, ...parameters: (string | number | URLSearchParams | FetchRoute)[]) => FetchRoute;
|
|
142
153
|
}
|
|
@@ -262,6 +273,9 @@ export type FetchRoute = {
|
|
|
262
273
|
readonly value: string;
|
|
263
274
|
};
|
|
264
275
|
|
|
276
|
+
// @public (undocumented)
|
|
277
|
+
export type FetchSignature = <T>(request: FetchRequest, body?: Record<string, any>) => Promise<T>;
|
|
278
|
+
|
|
265
279
|
// @public (undocumented)
|
|
266
280
|
export interface ForgeRequest<T, U extends AccountContext = AccountContext> {
|
|
267
281
|
// (undocumented)
|
|
@@ -315,21 +329,37 @@ export interface HostRouter {
|
|
|
315
329
|
reload(): Promise<void>;
|
|
316
330
|
}
|
|
317
331
|
|
|
332
|
+
// @public (undocumented)
|
|
333
|
+
export function HostRouterLink({ url, action, label, linkStyle, buttonIcon, buttonAppearance, }: HostRouterLinkProps): JSX_2.Element;
|
|
334
|
+
|
|
335
|
+
// @public (undocumented)
|
|
336
|
+
export interface HostRouterLinkProps {
|
|
337
|
+
// (undocumented)
|
|
338
|
+
action: 'navigate' | 'open';
|
|
339
|
+
// (undocumented)
|
|
340
|
+
buttonAppearance?: IconButtonAppearance;
|
|
341
|
+
// (undocumented)
|
|
342
|
+
buttonIcon?: IconProp;
|
|
343
|
+
label: string;
|
|
344
|
+
// (undocumented)
|
|
345
|
+
linkStyle: 'link' | 'button';
|
|
346
|
+
// (undocumented)
|
|
347
|
+
url: string;
|
|
348
|
+
}
|
|
349
|
+
|
|
318
350
|
// Warning: (ae-forgotten-export) The symbol "HostRouterProviderProps" needs to be exported by the entry point index.d.ts
|
|
319
351
|
//
|
|
320
352
|
// @public (undocumented)
|
|
321
353
|
export function HostRouterProvider({ children, hostRouter, }: HostRouterProviderProps): JSX_2.Element;
|
|
322
354
|
|
|
323
355
|
// @public (undocumented)
|
|
324
|
-
export interface
|
|
325
|
-
// (
|
|
326
|
-
|
|
327
|
-
// (undocumented)
|
|
328
|
-
link: string;
|
|
356
|
+
export interface IframeModalContextData {
|
|
357
|
+
// Warning: (ae-forgotten-export) The symbol "IframeProps" needs to be exported by the entry point index.d.ts
|
|
358
|
+
//
|
|
329
359
|
// (undocumented)
|
|
330
|
-
|
|
360
|
+
iframeProps: IframeProps;
|
|
331
361
|
// (undocumented)
|
|
332
|
-
|
|
362
|
+
modalHeader?: string;
|
|
333
363
|
}
|
|
334
364
|
|
|
335
365
|
// @public (undocumented)
|
|
@@ -356,7 +386,7 @@ export type InvokeRemoteSignature = <T, U>(input: {
|
|
|
356
386
|
}) => Promise<InvokeRemoteResponse<T>>;
|
|
357
387
|
|
|
358
388
|
// @public (undocumented)
|
|
359
|
-
export type InvokeSignature = <T = unknown, U = InvokePayload>(action:
|
|
389
|
+
export type InvokeSignature = <T = unknown, U = InvokePayload, A extends string = string>(action: A, data?: U) => Promise<T>;
|
|
360
390
|
|
|
361
391
|
// @public (undocumented)
|
|
362
392
|
export const IS_STANDALONE: boolean;
|
|
@@ -390,6 +420,30 @@ export interface JiraIssueExtensionData {
|
|
|
390
420
|
type: string;
|
|
391
421
|
}
|
|
392
422
|
|
|
423
|
+
// @public (undocumented)
|
|
424
|
+
export interface JiraStandaloneAppWrapperProps {
|
|
425
|
+
// (undocumented)
|
|
426
|
+
appName: string;
|
|
427
|
+
// (undocumented)
|
|
428
|
+
backendUrl?: string;
|
|
429
|
+
// (undocumented)
|
|
430
|
+
doCheckResource?: boolean;
|
|
431
|
+
doCheckWorkspace?: boolean;
|
|
432
|
+
// (undocumented)
|
|
433
|
+
initialMockViewContext?: Partial<FullContext>;
|
|
434
|
+
// (undocumented)
|
|
435
|
+
modalContextConfig?: {
|
|
436
|
+
openerOrigin: string;
|
|
437
|
+
};
|
|
438
|
+
// (undocumented)
|
|
439
|
+
modalOpenerConfig?: {
|
|
440
|
+
resourceMap?: Record<string, string>;
|
|
441
|
+
defaultUrl: string;
|
|
442
|
+
};
|
|
443
|
+
// (undocumented)
|
|
444
|
+
remoteUrl?: string;
|
|
445
|
+
}
|
|
446
|
+
|
|
393
447
|
// @public (undocumented)
|
|
394
448
|
export function JiraWorkspaceProvider({ children, workspaceId, }: PropsWithChildren<{
|
|
395
449
|
workspaceId?: string;
|
|
@@ -420,7 +474,7 @@ export class MockViewContext implements ViewContext {
|
|
|
420
474
|
}
|
|
421
475
|
|
|
422
476
|
// @public (undocumented)
|
|
423
|
-
export function ModalContent
|
|
477
|
+
export function ModalContent({ children }: PropsWithChildren): JSX_2.Element;
|
|
424
478
|
|
|
425
479
|
// @public (undocumented)
|
|
426
480
|
export function ModalContentIframe<T>({ messageCallback, closeOnMouseOut, }: {
|
|
@@ -431,11 +485,11 @@ export function ModalContentIframe<T>({ messageCallback, closeOnMouseOut, }: {
|
|
|
431
485
|
}): JSX_2.Element;
|
|
432
486
|
|
|
433
487
|
// @public (undocumented)
|
|
434
|
-
export interface ModalContentService<
|
|
488
|
+
export interface ModalContentService<C, P> {
|
|
435
489
|
// (undocumented)
|
|
436
|
-
close: (payload?:
|
|
490
|
+
close: (payload?: P) => void;
|
|
437
491
|
// (undocumented)
|
|
438
|
-
modalContextData?:
|
|
492
|
+
modalContextData?: C;
|
|
439
493
|
}
|
|
440
494
|
|
|
441
495
|
// @public
|
|
@@ -444,9 +498,9 @@ export function ModalDialogLayout({ title, buttonGroup, children, }: PropsWithCh
|
|
|
444
498
|
// @public (undocumented)
|
|
445
499
|
export interface ModalDialogLayoutProps {
|
|
446
500
|
// (undocumented)
|
|
447
|
-
buttonGroup
|
|
501
|
+
buttonGroup?: default_2.ReactNode;
|
|
448
502
|
// (undocumented)
|
|
449
|
-
title
|
|
503
|
+
title?: string;
|
|
450
504
|
}
|
|
451
505
|
|
|
452
506
|
// @public (undocumented)
|
|
@@ -606,6 +660,9 @@ export type RequestPayload = {
|
|
|
606
660
|
[key in number | string]: unknown;
|
|
607
661
|
};
|
|
608
662
|
|
|
663
|
+
// @public (undocumented)
|
|
664
|
+
export type RequestProductMethod = (url: FetchRoute, init: RequestInit) => Promise<APIResponse>;
|
|
665
|
+
|
|
609
666
|
// Warning: (ae-forgotten-export) The symbol "Response_2" needs to be exported by the entry point index.d.ts
|
|
610
667
|
//
|
|
611
668
|
// @public (undocumented)
|
|
@@ -660,7 +717,7 @@ export function useLoadDataEffect<T>(requestFunc: () => Promise<T>, errorHandler
|
|
|
660
717
|
};
|
|
661
718
|
|
|
662
719
|
// @public (undocumented)
|
|
663
|
-
export function useModalContentService<
|
|
720
|
+
export function useModalContentService<C = unknown, P = unknown>(): ModalContentService<C, P>;
|
|
664
721
|
|
|
665
722
|
// @public (undocumented)
|
|
666
723
|
export const useModalService: () => ModalService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index.js");require("react/jsx-runtime");require("@atlaskit/button");require("@atlaskit/button/new");require("@atlaskit/form");require("@atlaskit/primitives");require("@atlaskit/section-message");require("@atlaskit/select");require("react");require("@atlaskit/heading");require("@atlaskit/spinner");require("@atlaskit/app-provider");require("react-router-dom");require("@atlaskit/flag");require("@atlaskit/icon/glyph/check-circle");require("@atlaskit/icon/glyph/error");require("@atlaskit/icon/glyph/info");require("@atlaskit/icon/glyph/warning");require("@atlaskit/tokens");exports.FeatureChosenResourceCheck=e.FeatureChosenResourceCheck;exports.default=e.FeatureChosenResourceCheck;
|
package/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ import { FlagOptions } from '@forge/bridge/out/flag/flag';
|
|
|
7
7
|
import { FullContext } from '@forge/bridge/out/types';
|
|
8
8
|
import { HeadingSize } from '@atlaskit/heading/dist/types/heading.partial';
|
|
9
9
|
import { History as History_2 } from 'history';
|
|
10
|
+
import { IconButtonAppearance } from '@atlaskit/button/new';
|
|
11
|
+
import { IconProp } from '@atlaskit/button/new';
|
|
10
12
|
import { JSX as JSX_2 } from 'react/jsx-runtime';
|
|
11
13
|
import { PropsWithChildren } from 'react';
|
|
12
14
|
import { ReactElement } from 'react';
|
|
@@ -80,51 +82,57 @@ export declare interface AtlassianAppConfig {
|
|
|
80
82
|
/**
|
|
81
83
|
* Configuration needed when app is running in standalone mode, outside of jira.
|
|
82
84
|
*/
|
|
83
|
-
standaloneConfig?:
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
standaloneConfig?: AtlassianAppStandaloneConfig;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export declare function AtlassianAppStandalone({ initialMockViewContext, backendUrl, remoteUrl, doCheckWorkspace, appName, doCheckResource, modalOpenerConfig, modalContextConfig, children, }: PropsWithChildren<JiraStandaloneAppWrapperProps>): JSX_2.Element;
|
|
89
|
+
|
|
90
|
+
export declare interface AtlassianAppStandaloneConfig {
|
|
91
|
+
/**
|
|
92
|
+
* OAuth configuration for authenticating users against Jira.
|
|
93
|
+
*/
|
|
94
|
+
oauthConfig?: AtlassianAppStandaloneOauthConfig;
|
|
95
|
+
/**
|
|
96
|
+
* Mock data for the context normally returned by @forge/bridge View.getContext()
|
|
97
|
+
*/
|
|
98
|
+
initialMockViewContext?: Partial<FullContext>;
|
|
99
|
+
/**
|
|
100
|
+
* Url for invoking backend functions
|
|
101
|
+
*/
|
|
102
|
+
backendUrl?: string;
|
|
103
|
+
/**
|
|
104
|
+
* Url for invoking remote APIs
|
|
105
|
+
*/
|
|
106
|
+
remoteUrl?: string;
|
|
107
|
+
/**
|
|
108
|
+
* config for an app that opens @forge/bridge Modals
|
|
109
|
+
*/
|
|
110
|
+
modalOpenerConfig?: {
|
|
98
111
|
/**
|
|
99
|
-
*
|
|
112
|
+
* If the app opens multiple Forge resources in Jira Modals,
|
|
113
|
+
* then supply a map of resource names to local URLs.
|
|
100
114
|
*/
|
|
101
|
-
|
|
115
|
+
resourceMap?: Record<string, string>;
|
|
102
116
|
/**
|
|
103
|
-
*
|
|
117
|
+
* default URL to open in the modal (ex. http://localhost:4201)
|
|
104
118
|
*/
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* default URL to open in the modal (ex. http://localhost:4201)
|
|
113
|
-
*/
|
|
114
|
-
defaultUrl: string;
|
|
115
|
-
};
|
|
119
|
+
defaultUrl: string;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* config for an app that is opened in a @forge/bridge Modal
|
|
123
|
+
*/
|
|
124
|
+
modalContextConfig?: {
|
|
116
125
|
/**
|
|
117
|
-
*
|
|
126
|
+
* Standalone URL of the app that opened the modal. (ex. http://localhost:4200)
|
|
118
127
|
*/
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Standalone URL of the app that opened the modal. (ex. http://localhost:4200)
|
|
122
|
-
*/
|
|
123
|
-
openerOrigin: string;
|
|
124
|
-
};
|
|
128
|
+
openerOrigin: string;
|
|
125
129
|
};
|
|
126
130
|
}
|
|
127
131
|
|
|
132
|
+
export declare type AtlassianAppStandaloneOauthConfig = OAuthProviderProps & {
|
|
133
|
+
doCheckResource?: boolean;
|
|
134
|
+
};
|
|
135
|
+
|
|
128
136
|
export declare function AtlassianAppTest({ mockContext, invoke, invokeRemote, jiraFetchService, confluenceFetchService, bitbucketFetchService, hostRouter, children, }: PropsWithChildren<AtlassianAppTestProps>): JSX_2.Element;
|
|
129
137
|
|
|
130
138
|
export declare interface AtlassianAppTestProps {
|
|
@@ -145,13 +153,13 @@ export declare function atlassianOAuthJiraFetch(authToken: string, cloudId: stri
|
|
|
145
153
|
|
|
146
154
|
export declare function atlassianOAuthRawFetch<P extends Product>(authToken: string, domain: string, productType: P): AtlassianProductFetchService<P>;
|
|
147
155
|
|
|
148
|
-
export declare type AtlassianOAuthScopes = 'read:me' | 'read:jira-user' | 'read:jira-work' | 'read:servicedesk-request' | 'write:servicedesk-request' | 'read:cmdb-schema:jira' | 'write:cmdb-schema:jira' | 'read:cmdb-type:jira' | 'write:cmdb-type:jira' | 'read:cmdb-object:jira' | 'write:cmdb-object:jira' | 'delete:cmdb-object:jira' | 'read:cmdb-attribute:jira' | 'write:cmdb-attribute:jira' | 'read:cmdb-icon:jira';
|
|
156
|
+
export declare type AtlassianOAuthScopes = 'read:me' | 'read:jira-user' | 'read:jira-work' | 'write:jira-work' | 'read:servicedesk-request' | 'write:servicedesk-request' | 'read:cmdb-schema:jira' | 'write:cmdb-schema:jira' | 'read:cmdb-type:jira' | 'write:cmdb-type:jira' | 'read:cmdb-object:jira' | 'write:cmdb-object:jira' | 'delete:cmdb-object:jira' | 'read:cmdb-attribute:jira' | 'write:cmdb-attribute:jira' | 'read:cmdb-icon:jira';
|
|
149
157
|
|
|
150
158
|
export declare interface AtlassianProductFetchService<P extends Product> {
|
|
151
159
|
productType: P;
|
|
152
|
-
fetch:
|
|
160
|
+
fetch: FetchSignature;
|
|
153
161
|
route: (template: TemplateStringsArray, ...parameters: (string | number | URLSearchParams | FetchRoute)[]) => FetchRoute;
|
|
154
|
-
rawFetch:
|
|
162
|
+
rawFetch: RequestProductMethod;
|
|
155
163
|
fullUrl: (path: string) => string;
|
|
156
164
|
}
|
|
157
165
|
|
|
@@ -253,6 +261,8 @@ export declare type FetchRoute = {
|
|
|
253
261
|
readonly value: string;
|
|
254
262
|
};
|
|
255
263
|
|
|
264
|
+
export declare type FetchSignature = <T>(request: FetchRequest, body?: Record<string, any>) => Promise<T>;
|
|
265
|
+
|
|
256
266
|
export declare interface ForgeRequest<T, U extends AccountContext = AccountContext> {
|
|
257
267
|
payload: T;
|
|
258
268
|
context: U;
|
|
@@ -286,6 +296,18 @@ export declare interface HostRouter {
|
|
|
286
296
|
reload(): Promise<void>;
|
|
287
297
|
}
|
|
288
298
|
|
|
299
|
+
export declare function HostRouterLink({ url, action, label, linkStyle, buttonIcon, buttonAppearance, }: HostRouterLinkProps): JSX_2.Element;
|
|
300
|
+
|
|
301
|
+
export declare interface HostRouterLinkProps {
|
|
302
|
+
url: string;
|
|
303
|
+
action: 'navigate' | 'open';
|
|
304
|
+
/** anchor text or button label **/
|
|
305
|
+
label: string;
|
|
306
|
+
linkStyle: 'link' | 'button';
|
|
307
|
+
buttonIcon?: IconProp;
|
|
308
|
+
buttonAppearance?: IconButtonAppearance;
|
|
309
|
+
}
|
|
310
|
+
|
|
289
311
|
export declare function HostRouterProvider({ children, hostRouter, }: HostRouterProviderProps): JSX_2.Element;
|
|
290
312
|
|
|
291
313
|
declare interface HostRouterProviderProps {
|
|
@@ -293,7 +315,12 @@ declare interface HostRouterProviderProps {
|
|
|
293
315
|
hostRouter: HostRouter;
|
|
294
316
|
}
|
|
295
317
|
|
|
296
|
-
export declare interface
|
|
318
|
+
export declare interface IframeModalContextData {
|
|
319
|
+
iframeProps: IframeProps;
|
|
320
|
+
modalHeader?: string;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
declare interface IframeProps {
|
|
297
324
|
link: string;
|
|
298
325
|
title?: string;
|
|
299
326
|
width?: string;
|
|
@@ -330,7 +357,7 @@ export declare type InvokeRemoteSignature = <T, U>(input: {
|
|
|
330
357
|
body?: U;
|
|
331
358
|
}) => Promise<InvokeRemoteResponse<T>>;
|
|
332
359
|
|
|
333
|
-
export declare type InvokeSignature = <T = unknown, U = InvokePayload>(action:
|
|
360
|
+
export declare type InvokeSignature = <T = unknown, U = InvokePayload, A extends string = string>(action: A, data?: U) => Promise<T>;
|
|
334
361
|
|
|
335
362
|
export declare const IS_STANDALONE: boolean;
|
|
336
363
|
|
|
@@ -357,6 +384,25 @@ export declare interface JiraIssueExtensionData {
|
|
|
357
384
|
type: string;
|
|
358
385
|
}
|
|
359
386
|
|
|
387
|
+
export declare interface JiraStandaloneAppWrapperProps {
|
|
388
|
+
initialMockViewContext?: Partial<FullContext>;
|
|
389
|
+
backendUrl?: string;
|
|
390
|
+
remoteUrl?: string;
|
|
391
|
+
doCheckResource?: boolean;
|
|
392
|
+
/**
|
|
393
|
+
* Select workspace when calling JSM Assets APIs
|
|
394
|
+
*/
|
|
395
|
+
doCheckWorkspace?: boolean;
|
|
396
|
+
modalOpenerConfig?: {
|
|
397
|
+
resourceMap?: Record<string, string>;
|
|
398
|
+
defaultUrl: string;
|
|
399
|
+
};
|
|
400
|
+
modalContextConfig?: {
|
|
401
|
+
openerOrigin: string;
|
|
402
|
+
};
|
|
403
|
+
appName: string;
|
|
404
|
+
}
|
|
405
|
+
|
|
360
406
|
export declare function JiraWorkspaceProvider({ children, workspaceId, }: PropsWithChildren<{
|
|
361
407
|
workspaceId?: string;
|
|
362
408
|
}>): JSX_2.Element;
|
|
@@ -376,7 +422,7 @@ export declare class MockViewContext implements ViewContext {
|
|
|
376
422
|
refresh(): Promise<void>;
|
|
377
423
|
}
|
|
378
424
|
|
|
379
|
-
export declare function ModalContent
|
|
425
|
+
export declare function ModalContent({ children }: PropsWithChildren): JSX_2.Element;
|
|
380
426
|
|
|
381
427
|
export declare function ModalContentIframe<T>({ messageCallback, closeOnMouseOut, }: {
|
|
382
428
|
messageCallback?: (eventData: T, iframeProps?: IframeProps) => {
|
|
@@ -385,9 +431,9 @@ export declare function ModalContentIframe<T>({ messageCallback, closeOnMouseOut
|
|
|
385
431
|
closeOnMouseOut?: boolean;
|
|
386
432
|
}): JSX_2.Element;
|
|
387
433
|
|
|
388
|
-
export declare interface ModalContentService<
|
|
389
|
-
modalContextData?:
|
|
390
|
-
close: (payload?:
|
|
434
|
+
export declare interface ModalContentService<C, P> {
|
|
435
|
+
modalContextData?: C;
|
|
436
|
+
close: (payload?: P) => void;
|
|
391
437
|
}
|
|
392
438
|
|
|
393
439
|
/**
|
|
@@ -400,8 +446,8 @@ export declare interface ModalContentService<T> {
|
|
|
400
446
|
export declare function ModalDialogLayout({ title, buttonGroup, children, }: PropsWithChildren<ModalDialogLayoutProps>): JSX_2.Element;
|
|
401
447
|
|
|
402
448
|
export declare interface ModalDialogLayoutProps {
|
|
403
|
-
title
|
|
404
|
-
buttonGroup
|
|
449
|
+
title?: string;
|
|
450
|
+
buttonGroup?: default_2.ReactNode;
|
|
405
451
|
}
|
|
406
452
|
|
|
407
453
|
export declare interface ModalOptions<C, P> {
|
|
@@ -531,6 +577,8 @@ export declare type RequestPayload = {
|
|
|
531
577
|
[key in number | string]: unknown;
|
|
532
578
|
};
|
|
533
579
|
|
|
580
|
+
export declare type RequestProductMethod = (url: FetchRoute, init: RequestInit) => Promise<APIResponse>;
|
|
581
|
+
|
|
534
582
|
export declare type ResolverFunction = (request: RequestObject) => Promise<Response_2> | Response_2;
|
|
535
583
|
|
|
536
584
|
export declare interface Resource {
|
|
@@ -585,7 +633,7 @@ export declare function useLoadDataEffect<T>(requestFunc: () => Promise<T>, erro
|
|
|
585
633
|
manualTrigger: () => Promise<T | undefined>;
|
|
586
634
|
};
|
|
587
635
|
|
|
588
|
-
export declare function useModalContentService<
|
|
636
|
+
export declare function useModalContentService<C = unknown, P = unknown>(): ModalContentService<C, P>;
|
|
589
637
|
|
|
590
638
|
export declare const useModalService: () => ModalService;
|
|
591
639
|
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),
|
|
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;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),re=require("@atlaskit/button"),E=require("@atlaskit/button/new"),v=require("@atlaskit/form"),p=require("@atlaskit/primitives"),T=require("@atlaskit/section-message"),se=require("@atlaskit/select"),i=require("react"),L=require("@atlaskit/heading"),Ne=require("@atlaskit/spinner"),Ve=require("@atlaskit/app-provider"),g=require("react-router-dom"),B=require("@atlaskit/flag"),Ge=require("@atlaskit/icon/glyph/check-circle"),Ke=require("@atlaskit/icon/glyph/error"),Xe=require("@atlaskit/icon/glyph/info"),Ye=require("@atlaskit/icon/glyph/warning"),y=require("@atlaskit/tokens"),X=class X{};X.getOauthToken="get-token";let W=X;class ne{constructor(t){this.message=t}}function b(e,t){const r={Authorization:e.startsWith("Bearer ")?e:`Bearer ${e}`};return t?{...t,...r}:r}async function oe(e,t,r){const c=b(e,r.headers||{});return fetch(t,{...r,headers:c})}async function C(e,t,r,c,n="json",o={}){return D(t,r,b(e,o),c,n)}async function D(e,t,r,c,n="json"){const o={...r||{},Accept:n==="json"?"application/json":"text/html","Content-Type":n==="json"?"application/json":"text/html"},a=c?JSON.stringify(c):void 0,u=await fetch(e,{method:t,headers:o,body:a});if(u.ok)return t==="DELETE"||u.status===204?void 0:n==="text"?await u.text():await u.json();{let d="";try{d=await u.text()}catch{}const x=`${u.status} ${u.statusText} - ${t} ${e}
|
|
2
|
+
${d}`;throw console.error(x),new ne(x)}}class ce{constructor(t){this.value_=t}set value(t){throw new Error("modification of a Route is not allowed")}get value(){return this.value_}}function Q(e){return e instanceof ce}const Qe=["..",".%2e","%2e.","%2e%2e",".%2E","%2E.","%2E%2e"],Ze=["/","\\"],ie=["?","#"];function I(e,t){return e.some(r=>t.includes(r))}function et(e,t){switch(t){case"path":if(Q(e))return e.value;if(e=String(e),I(Qe,e)||I(ie,e)||I(Ze,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 Q(e)?encodeURIComponent(e.value):e instanceof URLSearchParams?e.toString():encodeURIComponent(e)}}function ae(e,...t){let r="path",c="";for(let n=0;n<e.length;n++){const o=e[n];if(I(ie,o)&&(r="query"),c+=o,n>=t.length)break;c+=et(t[n],r)}return new ce(c)}function U(e,t){if(t){const r=e.startsWith("/")?e.slice(1):e;return`${t}/${r}`}else return e}function F(e,t,r){return{productType:r,fetch:({url:c,method:n,responseType:o="json",allowExperimental:a=!1},l)=>C(e,U(c.value,t),n,l,o,{"X-ExperimentalApi":a?"opt-in":""}),route:ae,rawFetch:(c,n)=>oe(e,U(c.value,t),n),fullUrl:c=>U(c,t)}}function ue(e,t){return F(e,`https://api.atlassian.com/ex/jira/${t}`,"jira")}function le(e,t){return F(e,`https://api.atlassian.com/ex/confluence/${t}`,"confluence")}function de(e){return F(e,"https://api.bitbucket.org","bitbucket")}async function tt(e){return C(e,"https://api.atlassian.com/me","GET")}async function rt(e,t,r,c,n){return D("https://auth.atlassian.com/oauth/token","POST",void 0,{grant_type:e,client_id:t,client_secret:r,code:c,redirect_uri:n})}class he extends Error{constructor(t){super(t)}}class pe{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 n=(await this.getAtlassianUserResources(t)).filter((o,a,l)=>l.findIndex(u=>u.id===o.id)===a).map(o=>({name:o.name,id:o.id}));if(n.length>1){if(r){const o=n.find(a=>a.id===r);if(o)return{hasChosen:!0,resource:o}}return{hasChosen:!1,resources:n}}else{if(n.length===1)return{hasChosen:!0,resource:n[0]};throw new he("Provided token does not have permissions for any resources")}}}class xe{constructor(t){this.fetchSvc=t,this.workspaceApiUrl="/rest/servicedeskapi/assets/workspace"}async getAllUserWorkspaces(){const t=[];let r=!0;const c=50;let n=0;for(;r;){const o=await this.fetchSvc.fetch({url:this.fetchSvc.route`/rest/servicedeskapi/assets/workspace?start=${n}&limit=${c}`,method:"GET"});t.push(...o.values),n+=c,o.isLastPage&&(r=!1)}return t}async checkUserChosenWorkspace(t){const r=await this.getAllUserWorkspaces();if(r.length>1){if(t){const c=r.find(n=>n.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 he("Provided token does not have permissions for any workspaces")}}}const fe=i.createContext(null),st=()=>{const e=i.useContext(fe);if(!e)throw new Error("useRequestBitbucket must be used within a RequestBitbucketProvider");return e};function M({children:e,requestBitbucketImplementation:t}){return s.jsx(fe.Provider,{value:t,children:e})}const we=i.createContext(null),nt=()=>{const e=i.useContext(we);if(!e)throw new Error("useRequestConfluence must be used within a RequestConfluenceProvider");return e};function H({children:e,requestConfluenceImplementation:t}){return s.jsx(we.Provider,{value:t,children:e})}const me=i.createContext(null),ve=()=>{const e=i.useContext(me);if(!e)throw new Error("useRequestJira must be used within a RequestJiraProvider");return e};function _({children:e,requestJiraImplementation:t}){return s.jsx(me.Provider,{value:t,children:e})}function A({label:e,loadingError:t,labelSize:r}){return s.jsxs(p.Flex,{direction:"column",children:[s.jsx(L,{size:r||"large",children:e}),t?s.jsx(T,{appearance:"error",children:t}):s.jsx(Ne,{interactionName:"load"})]})}const ke=i.createContext(void 0),ot=()=>i.useContext(ke);function J({children:e,workspaceId:t}){return s.jsx(ke.Provider,{value:t,children:e})}const Z=p.xcss({maxWidth:"max-content",paddingBlockStart:"space.1000"});function ge({appName:e,children:t}){const[r,c]=i.useState(!1),[n,o]=i.useState(null),[a,l]=i.useState(""),[u,d]=i.useState(),x=ve(),h=i.useCallback(async f=>{try{l("");const m=f??(e&&localStorage.getItem(`${e}-user-workspace-id`))??"",k=await new xe(x).checkUserChosenWorkspace(m);k.hasChosen?(e&&localStorage.setItem(`${e}-user-workspace-id`,k.workspace),c(!0),d(k.workspace)):o(k.workspaces)}catch(m){m instanceof Error?l(`Error Occurred: ${m.message}`):l("Uncaught error occurred!")}},[e,x]);i.useEffect(()=>{h()},[h]);async function j({selectedWorkspace:f}){return h(f.value)}if(r)return s.jsx(J,{workspaceId:u,children:t});if(n){const f=n.map(m=>({label:m.workspaceId,value:m.workspaceId}));return s.jsx(p.Flex,{justifyContent:"center",children:s.jsx(p.Box,{xcss:Z,children:s.jsx(v,{onSubmit:j,children:({formProps:m,submitting:k})=>s.jsxs("form",{...m,children:[s.jsx(v.FormHeader,{title:"Choose Workspace",children:a?s.jsx(T,{appearance:"error",children:a}):null}),s.jsx(v.FormSection,{children:s.jsx(v.Field,{"aria-required":!0,name:"selectedWorkspace",label:"Workspace",isRequired:!0,children:({fieldProps:q})=>s.jsx("div",{"data-testid":"workspace-select-component",children:s.jsx(se,{...q,options:f})})})}),s.jsx(v.FormFooter,{align:"start",children:s.jsx(re.ButtonGroup,{label:"Form submit options",children:s.jsx(E,{type:"submit",appearance:"primary",isLoading:k,children:"Submit"})})})]})})})})}else return s.jsx(p.Flex,{justifyContent:"center",xcss:Z,children:s.jsx(A,{label:"",loadingError:a})})}const je=i.createContext(null),ct=()=>{const e=i.useContext(je);if(!e)throw new Error("useBackendAdapter must be used within a BackendAdapterProvider");return e};function z({children:e,invokeImplementation:t}){return s.jsx(je.Provider,{value:{invoke:t},children:e})}function Ce(e,t,r){return async(c,n)=>C(t,e+c,"POST",{...n},"json",{"resource-id":r})}class Ae{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 Re=i.createContext(null),Se=()=>{const e=i.useContext(Re);if(!e)throw new Error("useHostRouter must be used within a HostRouterProvider");return e};function N({children:e,hostRouter:t}){return s.jsx(Re.Provider,{value:t,children:e})}function it({url:e,action:t,label:r,linkStyle:c,buttonIcon:n,buttonAppearance:o}){const a=Se(),l=i.useCallback(u=>{u.preventDefault(),t==="open"?a.open(e):a.navigate(e)},[t,a,e]);return c==="link"?s.jsx("a",{href:e,target:"_blank",rel:"noreferrer",onClick:l,children:r}):n?s.jsx(E.IconButton,{icon:n,label:r,appearance:o||"subtle",onClick:l}):s.jsx(E,{appearance:o||"subtle",onClick:l,children:r})}const ye=i.createContext(null),at=()=>{const e=i.useContext(ye);if(!e)throw new Error("useRemoteAdapter must be used within a RemoteAdapterProvider");return e};function V({children:e,invokeRemoteImplementation:t}){return s.jsx(ye.Provider,{value:{invokeRemote:t},children:e})}function Ie(e,t){return async r=>{const c=`${e}${r.path}`,n=await fetch(c,{method:r.method,headers:t?b(t,r.headers||{}):r.headers,body:r.body?JSON.stringify(r.body):void 0}),o={};return n.headers.forEach((l,u)=>{o[u]=l}),{body:await n.json(),headers:o,status:n.status}}}const Ee=i.createContext(null),be=()=>{const e=i.useContext(Ee);if(!e)throw new Error("useViewContext must be used within a ViewContextProvider");return e};function G({children:e,viewContext:t}){return s.jsx(Ee.Provider,{value:t,children:e})}class P{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 ut({mockContext:e,invoke:t,invokeRemote:r,jiraFetchService:c,confluenceFetchService:n,bitbucketFetchService:o,hostRouter:a,children:l}){let u=s.jsx(J,{workspaceId:"test-workspace",children:s.jsx(z,{invokeImplementation:t,children:s.jsx(V,{invokeRemoteImplementation:r,children:s.jsx(N,{hostRouter:a,children:s.jsx(G,{viewContext:new P(e),children:l})})})})});return c&&(u=s.jsx(_,{requestJiraImplementation:c,children:u})),n&&(u=s.jsx(H,{requestConfluenceImplementation:n,children:u})),o&&(u=s.jsx(M,{requestBitbucketImplementation:o,children:u})),u}function lt(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 dt(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 n=await c.json(),o=Date.now()+n.expires_in*1e3;e.setAuth({token:n.access_token,expiresAt:o})}})()}),s.jsx(A,{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:ht(),response_type:"code",prompt:"consent"}).toString();window.location.href=`https://auth.atlassian.com/authorize?${c}`}function ht(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}function pt(e){return Fe(e.clientId,e.redirectUri,e.oAuthScopes),s.jsx(A,{label:"Redirecting to Atlassian Authentication System"})}const xt=p.xcss({paddingBlockStart:"space.1000"}),Pe=i.createContext(null),qe=()=>{const e=i.useContext(Pe);return e||(console.warn("No OAuth provider"),{getAuthToken:()=>""})};function Oe({children:e,...t}){const[r,c]=i.useState(localStorage.getItem(`${t.appName}-auth-token`)),n=localStorage.getItem(`${t.appName}-auth-expires-at`),[o,a]=i.useState(n?Number(n):null),l=window.location.protocol+"//"+window.location.hostname+(window.location.port?`:${window.location.port}`:""),u=l+"/callback";function d(){return o&&r&&!ee(o)?r:(Fe(t.clientId,u,t.oAuthScopes),"")}function x(h){c(h.token),localStorage.setItem(`${t.appName}-auth-token`,h.token),a(h.expiresAt),localStorage.setItem(`${t.appName}-auth-expires-at`,h.expiresAt.toString()),localStorage.removeItem(`${t.appName}-user-resource-id`),localStorage.removeItem(`${t.appName}-user-workspace-id`),window.location.href=l}return!r||!o||ee(o)?s.jsx(p.Flex,{justifyContent:"center",xcss:xt,children:s.jsx(g.BrowserRouter,{children:s.jsxs(g.Routes,{children:[s.jsx(g.Route,{path:"/",element:s.jsx(pt,{clientId:t.clientId,redirectUri:u,oAuthScopes:t.oAuthScopes})}),s.jsx(g.Route,{path:"/callback",element:s.jsx(dt,{setAuth:x,redirectUri:u,codeTokenExchangeUrl:t.codeTokenExchangeUrl})}),s.jsx(g.Route,{path:"/*",element:s.jsx(g.Navigate,{to:"/",replace:!0})})]})})}):s.jsx(Pe.Provider,{value:{getAuthToken:d},children:e})}function ee(e){return e<Date.now()}const K=i.createContext(void 0);function Be(){return i.useContext(K)}function ft(){const e=Be();function t(n){e({type:"add",id:n.id,props:n})}function r(n){e({type:"remove",id:n})}function c(n,o,a,l){t({id:n,isAutoDismiss:!1,type:"error",title:o,description:a instanceof Error?a.message:typeof a=="string"?a:"Uncaught error occurred!",actions:l})}return{addFlag:t,removeFlag:r,addErrorFlag:c}}function Ue({children:e}){const[t,r]=i.useReducer(mt,[]);function c(o){r({type:"remove",id:o})}function n(o){switch(o){case"info":return s.jsx(Xe,{label:"Info",primaryColor:y.token("color.icon.information"),size:"large"});case"warning":return s.jsx(Ye,{label:"Warning",primaryColor:y.token("color.icon.warning"),size:"large"});case"error":return s.jsx(Ke,{label:"Error",primaryColor:y.token("color.icon.danger"),size:"large"});case"success":return s.jsx(Ge,{primaryColor:y.token("color.icon.success"),label:"Success",size:"large"})}}return s.jsxs(K.Provider,{value:r,children:[e,s.jsx(B.FlagGroup,{onDismissed:c,children:t.map(o=>o.isAutoDismiss?s.jsx(B.AutoDismissFlag,{id:o.id,icon:n(o.type||"success"),title:o.title},o.id):s.jsx(B,{appearance:o.appearance||"normal",icon:n(o.type||"success"),id:o.id,title:o.title,description:o.description,actions:wt(o.actions)},o.id))})]})}function wt(e){return e==null?void 0:e.map(t=>({...t,content:t.text}))}function mt(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 We(e,t,r){i.useEffect(()=>(window.addEventListener(e,t,r),()=>{window.removeEventListener(e,t,r)}),[e,t,r])}const $e=i.createContext({close:()=>{}});function Te(){return i.useContext($e)}function vt({children:e}){const[t,r]=i.useState(),c=be(),n=i.useCallback(()=>{c.close()},[c]);return We("unload",n),i.useEffect(()=>{(async()=>{const o=await c.getContext();r(o.extension.modal)})()},[c]),s.jsx($e.Provider,{value:{modalContextData:t,close:c.close},children:e})}const kt={"iframe-wrapper":"_iframe-wrapper_c8hdk_1"};function gt({iframeProps:e,messageCallback:t,onMouseOut:r}){const[c,n]=i.useState(),o=i.useRef(!1),a=i.useRef(!1),l=i.useRef(null),u=i.useCallback(d=>{var x;d.source===((x=l.current)==null?void 0:x.contentWindow)&&t&&t(d.data)},[t]);return We("message",u),i.useEffect(()=>{(async()=>e!=null&&e.height&&n(e.height))()},[e]),i.useEffect(()=>{(async()=>{var d;!a.current&&((d=l.current)!=null&&d.contentWindow)&&(l.current.contentWindow.focus(),a.current=!0)})()}),s.jsx("div",{className:kt["iframe-wrapper"],children:s.jsx("iframe",{title:e==null?void 0:e.title,ref:l,width:e==null?void 0:e.width,height:c,src:e==null?void 0:e.link,onMouseEnter:()=>o.current=!0,onMouseOut:()=>{o.current&&r&&r()}})})}function jt({messageCallback:e,closeOnMouseOut:t}){const{modalContextData:r,close:c}=Te(),[n,o]=i.useState();i.useEffect(()=>{r&&o({...r.iframeProps})},[r]);const a=i.useCallback(u=>{if(e&&n){const d=e(u.data,r==null?void 0:r.iframeProps);d.newHeight&&o({...n,height:d.newHeight})}},[n,e,r]);if(!n)return s.jsx("div",{});const l=s.jsx(gt,{messageCallback:a,iframeProps:n,onMouseOut:()=>{t&&(c==null||c())}});return r!=null&&r.modalHeader?s.jsxs(p.Flex,{gap:"space.200",direction:"column",children:[s.jsx(p.Box,{paddingInline:"space.200",children:s.jsx(L,{size:"medium",children:r.modalHeader})}),l]}):l}class Le{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"),n=window.open(r,"_blank",c),o=a=>{var l,u;if(a.source===n&&(l=a.data)!=null&&l.closing){const d=a.data;window.removeEventListener("message",o),(u=t.onClose)==null||u.call(t,d.payload)}};return window.addEventListener("message",o),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 De=i.createContext(null),Ct=()=>{const e=i.useContext(De);if(!e)throw new Error("useModalService must be used within a ModalServiceProvider");return e};function Me({children:e,modalService:t}){return s.jsx(De.Provider,{value:t,children:e})}class He extends P{constructor(t,r="http://localhost:4200"){super(t),this.context=t,this.openerOrigin=r,this.close=c=>{var o;const n={closing:!0,payload:c};return(o=window.opener)==null||o.postMessage(n,this.openerOrigin),window.close(),Promise.resolve()}}}function At({title:e,buttonGroup:t,children:r}){return s.jsxs(p.Flex,{direction:"column",xcss:p.xcss({height:"100%",padding:"space.300"}),children:[e&&s.jsx(p.Box,{paddingBlockEnd:"space.200",children:s.jsx(L,{size:"medium",children:e})}),s.jsx(p.Box,{xcss:p.xcss({flexGrow:2}),children:r}),t&&s.jsx(p.Box,{paddingBlockStart:"space.200",children:s.jsx(p.Flex,{justifyContent:"end",alignItems:"center",children:t})})]})}const Rt=i.lazy(()=>Promise.resolve().then(()=>require("./index-BePJjrLy.js")));function $({initialMockViewContext:e,backendUrl:t,remoteUrl:r,doCheckWorkspace:c,appName:n,doCheckResource:o,modalOpenerConfig:a,modalContextConfig:l,children:u}){const[d,x]=i.useState(),[h,j]=i.useState(),{getAuthToken:f}=qe(),m=i.useCallback(()=>ue(f(),d??""),[f,d]),k=i.useCallback(()=>le(f(),d??""),[f,d]),q=i.useCallback(()=>de(f()),[f]),Je=i.useCallback(async R=>{if(t&&o){const O=R??localStorage.getItem(`${n}-user-resource-id`)??"",S=await new pe().checkUserChosenResource(f(),O);return S.hasChosen&&(localStorage.setItem(`${n}-user-resource-id`,S.resource.id),x(S.resource.id)),S}else return{hasChosen:!0}},[t,f,n,o]);i.useEffect(()=>{const R=d??(e==null?void 0:e.cloudId)??"";if(!h||h.cloudId!==R){const O={...h||e,cloudId:R};j(O)}},[e,d,h]);const ze=i.useCallback(()=>t?Ce(t,f(),d??""):void 0,[d,f,t]);let w=u;c&&(w=s.jsx(ge,{appName:n,children:w})),a&&(w=s.jsx(Me,{modalService:new Le(a.defaultUrl,a.resourceMap),children:w})),h&&(w=s.jsx(G,{viewContext:l?new He(h,l.openerOrigin):new P(h),children:w})),w=s.jsx(N,{hostRouter:new Ae,children:s.jsx(M,{requestBitbucketImplementation:q(),children:s.jsx(H,{requestConfluenceImplementation:k(),children:s.jsx(_,{requestJiraImplementation:m(),children:w})})})});const Y=ze();return Y&&(w=s.jsx(z,{invokeImplementation:Y,children:w})),r&&(w=s.jsx(V,{invokeRemoteImplementation:Ie(r),children:w})),o&&(w=s.jsx(Rt,{checkResource:Je,children:w})),s.jsx(Ve,{children:s.jsx(Ue,{children:w})})}const St=Object.freeze(Object.defineProperty({__proto__:null,AtlassianAppStandalone:$,default:$},Symbol.toStringTag,{value:"Module"})),yt=i.lazy(()=>Promise.resolve().then(()=>require("./atlassian-app-forge-BwFXF-6M.js"))),It=i.lazy(()=>Promise.resolve().then(()=>St)),_e=window.self===window.top;function Et({children:e,appName:t,doCheckWorkspace:r,embeddedConfig:c,standaloneConfig:n}){var o;if(_e)if(n){const a=s.jsx(It,{appName:t,backendUrl:n.backendUrl,remoteUrl:n.remoteUrl,initialMockViewContext:n.initialMockViewContext,modalOpenerConfig:n.modalOpenerConfig,modalContextConfig:n.modalContextConfig,doCheckWorkspace:n.oauthConfig&&r,doCheckResource:((o=n.oauthConfig)==null?void 0:o.doCheckResource)!==!1,children:e});return n.oauthConfig?s.jsx(Oe,{clientId:n.oauthConfig.clientId,codeTokenExchangeUrl:n.oauthConfig.codeTokenExchangeUrl,appName:t,oAuthScopes:n.oauthConfig.oAuthScopes,children:a}):a}else return s.jsx("div",{children:"Not configured for standalone mode."});else return s.jsx(yt,{appName:t,doCheckWorkspace:r,invokeRemoteImpl:c==null?void 0:c.invokeRemoteImpl,children:e})}const te=p.xcss({maxWidth:"max-content",paddingBlockStart:"space.1000"});function bt({checkResource:e,children:t}){const[r,c]=i.useState(!1),[n,o]=i.useState(null),[a,l]=i.useState(""),u=i.useCallback(async x=>{try{l("");const h=await e(x);h.hasChosen?c(!0):o(h.resources)}catch(h){h instanceof Error?l(`Error Occurred: ${h.message}`):l("Uncaught error occurred!")}},[e]);i.useEffect(()=>{u()},[u]);function d({selectedResource:x}){return u(x.value)}if(r)return t;if(n){const x=n.map(h=>({label:h.name,value:h.id}));return s.jsx(p.Flex,{justifyContent:"center",children:s.jsx(p.Box,{xcss:te,children:s.jsx(v,{onSubmit:d,children:({formProps:h,submitting:j})=>s.jsxs("form",{...h,children:[s.jsx(v.FormHeader,{title:"Choose Resource",children:a?s.jsx(T,{appearance:"error",children:a}):null}),s.jsx(v.FormSection,{children:s.jsx(v.Field,{"aria-required":!0,name:"selectedResource",label:"Resource",isRequired:!0,children:({fieldProps:f})=>s.jsx(se,{...f,options:x})})}),s.jsx(v.FormFooter,{align:"start",children:s.jsx(re.ButtonGroup,{label:"Form submit options",children:s.jsx(E,{type:"submit",appearance:"primary",isLoading:j,children:"Submit"})})})]})})})})}else return s.jsx(p.Flex,{justifyContent:"center",xcss:te,children:s.jsx(A,{label:"",loadingError:a})})}function Ft(e){return console.error(e),`Error Occurred: ${e.message||e}`}function Pt(e,t=Ft){const[r,c]=i.useState(),[n,o]=i.useState(!0),[a,l]=i.useState(),u=i.useCallback(async()=>{o(!0);try{const d=await e();return c(d),d}catch(d){l(t(d))}finally{o(!1)}},[e,t]);return i.useEffect(()=>{u()},[u]),{data:r,loading:n,error:a,setData:c,setLoading:o,setError:l,manualTrigger:()=>u()}}exports.AppFlagsDispatchContext=K;exports.AppFlagsProviderAtlasKit=Ue;exports.AtlassianApp=Et;exports.AtlassianAppStandalone=$;exports.AtlassianAppTest=ut;exports.AtlassianUserResourceService=pe;exports.AtlassianUserWorkspaceService=xe;exports.BackendAdapterProvider=z;exports.CommonResolverPaths=W;exports.FeatureChosenResourceCheck=bt;exports.FeatureChosenWorkspaceCheck=ge;exports.FetchError=ne;exports.HostRouterLink=it;exports.HostRouterProvider=N;exports.IS_STANDALONE=_e;exports.JiraWorkspaceProvider=J;exports.MockViewContext=P;exports.ModalContent=vt;exports.ModalContentIframe=jt;exports.ModalDialogLayout=At;exports.ModalServiceProvider=Me;exports.ModalViewContext=He;exports.OAuthProvider=Oe;exports.PageLoadingView=A;exports.RemoteAdapterProvider=V;exports.RequestBitbucketProvider=M;exports.RequestConfluenceProvider=H;exports.RequestJiraProvider=_;exports.ViewContextProvider=G;exports.WindowHostRouter=Ae;exports.WindowModalService=Le;exports.addAuthHeader=b;exports.atlassianOAuthBitbucketFetch=de;exports.atlassianOAuthConfluenceFetch=le;exports.atlassianOAuthJiraFetch=ue;exports.atlassianOAuthRawFetch=F;exports.bearerAuthFetch=C;exports.bearerAuthFetchRaw=oe;exports.defaultProps=lt;exports.getAtlassianOAuthToken=rt;exports.getAtlassianUserDetails=tt;exports.getOauthFetchInvokeImpl=Ce;exports.jsonFetch=D;exports.oauthFetchInvokeRemote=Ie;exports.route=ae;exports.useAppFlagsDispatch=Be;exports.useAppFlagsDispatchMethods=ft;exports.useBackendAdapter=ct;exports.useHostRouter=Se;exports.useLoadDataEffect=Pt;exports.useModalContentService=Te;exports.useModalService=Ct;exports.useOAuth=qe;exports.useRemoteAdapter=at;exports.useRequestBitbucket=st;exports.useRequestConfluence=nt;exports.useRequestJira=ve;exports.useViewContext=be;exports.useWorkspaceId=ot;
|