@burdenoff/microfe-devportal 2026.608.1 → 2026.609.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/devportal/DevportalRoutes.js +9 -5
- package/dist/devportal/DevportalRoutes.js.map +1 -1
- package/dist/devportal/hooks/useGraphQL.js +49 -36
- package/dist/devportal/hooks/useGraphQL.js.map +1 -1
- package/dist/devportal/pages/DashboardPage.js +152 -134
- package/dist/devportal/pages/DashboardPage.js.map +1 -1
- package/dist/devportal/pages/SetupPage.js +501 -0
- package/dist/devportal/pages/SetupPage.js.map +1 -0
- package/dist/devportal/pages/StoreSubmissionPage.js +98 -76
- package/dist/devportal/pages/StoreSubmissionPage.js.map +1 -1
- package/dist/node_modules/@apollo/client/link/core/ApolloLink.js +52 -0
- package/dist/node_modules/@apollo/client/link/core/ApolloLink.js.map +1 -0
- package/dist/node_modules/@apollo/client/link/subscriptions/index.js +41 -0
- package/dist/node_modules/@apollo/client/link/subscriptions/index.js.map +1 -0
- package/dist/node_modules/@apollo/client/link/utils/createOperation.js +34 -0
- package/dist/node_modules/@apollo/client/link/utils/createOperation.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/caching/sizes.js +6 -0
- package/dist/node_modules/@apollo/client/utilities/caching/sizes.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/graphql/print.js +16 -0
- package/dist/node_modules/@apollo/client/utilities/graphql/print.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/caches.js +19 -0
- package/dist/node_modules/@apollo/client/utilities/internal/caches.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/checkDocument.js +21 -0
- package/dist/node_modules/@apollo/client/utilities/internal/checkDocument.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMainDefinition.js +17 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMainDefinition.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js +9 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js +9 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationName.js +8 -0
- package/dist/node_modules/@apollo/client/utilities/internal/getOperationName.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/global.js +9 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/global.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/maybe.js +10 -0
- package/dist/node_modules/@apollo/client/utilities/internal/globals/maybe.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/isNonNullObject.js +8 -0
- package/dist/node_modules/@apollo/client/utilities/internal/isNonNullObject.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/makeUniqueId.js +10 -0
- package/dist/node_modules/@apollo/client/utilities/internal/makeUniqueId.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/memoize.js +23 -0
- package/dist/node_modules/@apollo/client/utilities/internal/memoize.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js +10 -0
- package/dist/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/invariant/index.js +57 -0
- package/dist/node_modules/@apollo/client/utilities/invariant/index.js.map +1 -0
- package/dist/node_modules/@apollo/client/version.js +6 -0
- package/dist/node_modules/@apollo/client/version.js.map +1 -0
- package/dist/node_modules/@wry/caches/lib/weak.js +67 -0
- package/dist/node_modules/@wry/caches/lib/weak.js.map +1 -0
- package/dist/node_modules/@wry/trie/lib/index.js +53 -0
- package/dist/node_modules/@wry/trie/lib/index.js.map +1 -0
- package/dist/node_modules/graphql-ws/dist/client.js +272 -0
- package/dist/node_modules/graphql-ws/dist/client.js.map +1 -0
- package/dist/node_modules/graphql-ws/dist/common-CGW11Fyb.js +62 -0
- package/dist/node_modules/graphql-ws/dist/common-CGW11Fyb.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js +21 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Observable.js +78 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Observable.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscriber.js +117 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscriber.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscription.js +93 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscription.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/config.js +12 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/config.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/observable/empty.js +9 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/observable/empty.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js +16 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/symbol/observable.js +8 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/symbol/observable.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js +13 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js +11 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js +11 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/errorContext.js +22 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/errorContext.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/identity.js +8 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/identity.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +8 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/noop.js +6 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/noop.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/pipe.js +13 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/pipe.js.map +1 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js +14 -0
- package/dist/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js.map +1 -0
- package/dist/node_modules/rxjs/node_modules/tslib/tslib.es6.js +52 -0
- package/dist/node_modules/rxjs/node_modules/tslib/tslib.es6.js.map +1 -0
- package/package.json +2 -1
|
@@ -8,9 +8,11 @@ import { AlertTriangle as o, ArrowLeft as s, CheckCircle2 as c, Clock as l, Refr
|
|
|
8
8
|
import { useNavigate as p, useParams as m } from "react-router-dom";
|
|
9
9
|
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
10
10
|
import { graphqlFetch as _ } from "@burdenoff/fe-libs/shared/graphql";
|
|
11
|
+
import { useApolloClient as v } from "@apollo/client/react";
|
|
12
|
+
import { gql as y } from "@apollo/client/core";
|
|
11
13
|
//#region src/devportal/pages/StoreSubmissionPage.tsx
|
|
12
|
-
var
|
|
13
|
-
function
|
|
14
|
+
var b = "\n query DevportalAppForSubmission($id: ID!) {\n application(id: $id) {\n id\n name\n slug\n status\n reviewStatus\n iconUrl\n metadata\n }\n }\n", x = "\n mutation DevportalSubmitForReview($id: ID!, $notes: String) {\n submitApplicationForReview(id: $id, notes: $notes) {\n id\n status\n submittedAt\n metadata\n }\n }\n";
|
|
15
|
+
function S(e) {
|
|
14
16
|
if (!e) return null;
|
|
15
17
|
let t = e.metadata ?? {}, n = typeof t.storeProductId == "string" ? t.storeProductId : "", r = typeof t.storeSubmissionStatus == "string" ? t.storeSubmissionStatus : null;
|
|
16
18
|
return {
|
|
@@ -23,7 +25,7 @@ function b(e) {
|
|
|
23
25
|
rejectedReason: null
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
var
|
|
28
|
+
var C = {
|
|
27
29
|
DRAFT: {
|
|
28
30
|
i18nKey: "devportal.storeSubmission.status.draft",
|
|
29
31
|
fallback: "Draft",
|
|
@@ -54,53 +56,73 @@ var x = {
|
|
|
54
56
|
icon: o,
|
|
55
57
|
tone: "text-text-tertiary"
|
|
56
58
|
}
|
|
57
|
-
},
|
|
58
|
-
let { appId: o } = m(), f = p(),
|
|
59
|
+
}, w = () => {
|
|
60
|
+
let { appId: o } = m(), f = p(), w = e(), T = r(), E = n(t.APP_SUBMIT), [D, O] = a(null), [k, A] = a(!0), [j, M] = a(null), [N, P] = a(!1), [F, I] = a(""), L = v(), R = async () => {
|
|
59
61
|
if (o) {
|
|
60
|
-
|
|
62
|
+
A(!0), M(null);
|
|
61
63
|
try {
|
|
62
64
|
let e = await _({
|
|
63
65
|
gateway: "global",
|
|
64
|
-
query:
|
|
66
|
+
query: b,
|
|
65
67
|
variables: { id: o }
|
|
66
68
|
});
|
|
67
|
-
if (e.errors?.length) throw Error(e.errors[0]?.message ??
|
|
68
|
-
|
|
69
|
+
if (e.errors?.length) throw Error(e.errors[0]?.message ?? T("devportal.storeSubmission.errors.loadFailed", "Failed to load application"));
|
|
70
|
+
O(e.data?.application ?? null);
|
|
69
71
|
} catch (e) {
|
|
70
|
-
|
|
72
|
+
M(e instanceof Error ? e.message : T("devportal.storeSubmission.errors.loadFailed", "Failed to load application"));
|
|
71
73
|
} finally {
|
|
72
|
-
|
|
74
|
+
A(!1);
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
77
|
};
|
|
76
78
|
i(() => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
R();
|
|
80
|
+
}, [o]), i(() => {
|
|
81
|
+
if (!o) return;
|
|
82
|
+
let e = L.subscribe({
|
|
83
|
+
query: y`
|
|
84
|
+
subscription ApplicationStoreStatusChanged($applicationId: ID!) {
|
|
85
|
+
applicationStoreStatusChanged(applicationId: $applicationId) {
|
|
86
|
+
applicationId
|
|
87
|
+
status
|
|
88
|
+
reviewNotes
|
|
89
|
+
rejectedReason
|
|
90
|
+
updatedAt
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
`,
|
|
94
|
+
variables: { applicationId: o }
|
|
95
|
+
}).subscribe({
|
|
96
|
+
next: () => {
|
|
97
|
+
R();
|
|
98
|
+
},
|
|
99
|
+
error: (e) => {
|
|
100
|
+
console.warn("[StoreSubmissionPage] subscription error:", e);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
return () => e.unsubscribe();
|
|
104
|
+
}, [o, L]);
|
|
105
|
+
let z = async () => {
|
|
84
106
|
if (o) {
|
|
85
|
-
|
|
107
|
+
P(!0), M(null);
|
|
86
108
|
try {
|
|
87
109
|
let e = await _({
|
|
88
110
|
gateway: "global",
|
|
89
|
-
query:
|
|
111
|
+
query: x,
|
|
90
112
|
variables: {
|
|
91
113
|
id: o,
|
|
92
|
-
notes:
|
|
114
|
+
notes: F || null
|
|
93
115
|
}
|
|
94
116
|
});
|
|
95
|
-
if (e.errors?.length) throw Error(e.errors[0]?.message ??
|
|
96
|
-
|
|
117
|
+
if (e.errors?.length) throw Error(e.errors[0]?.message ?? T("devportal.storeSubmission.errors.submitFailed", "Submission failed"));
|
|
118
|
+
w.emit("devportal.app.submitted", { appId: o }), await R();
|
|
97
119
|
} catch (e) {
|
|
98
|
-
|
|
120
|
+
M(e instanceof Error ? e.message : T("devportal.storeSubmission.errors.submitFailed", "Submission failed"));
|
|
99
121
|
} finally {
|
|
100
|
-
|
|
122
|
+
P(!1);
|
|
101
123
|
}
|
|
102
124
|
}
|
|
103
|
-
},
|
|
125
|
+
}, B = S(D), V = B ? C[B.status] : C.UNKNOWN, H = V.icon;
|
|
104
126
|
return /* @__PURE__ */ g("main", {
|
|
105
127
|
className: "min-h-screen bg-surface-default",
|
|
106
128
|
"aria-labelledby": "store-submission-heading",
|
|
@@ -117,7 +139,7 @@ var x = {
|
|
|
117
139
|
children: [/* @__PURE__ */ h(s, {
|
|
118
140
|
className: "h-4 w-4",
|
|
119
141
|
"aria-hidden": "true"
|
|
120
|
-
}),
|
|
142
|
+
}), T("devportal.common.back", "Back")]
|
|
121
143
|
}), /* @__PURE__ */ g("div", {
|
|
122
144
|
className: "flex items-center gap-2",
|
|
123
145
|
children: [/* @__PURE__ */ h(d, {
|
|
@@ -126,23 +148,23 @@ var x = {
|
|
|
126
148
|
}), /* @__PURE__ */ h("h1", {
|
|
127
149
|
id: "store-submission-heading",
|
|
128
150
|
className: "text-xl font-semibold text-text-primary",
|
|
129
|
-
children:
|
|
151
|
+
children: T("devportal.storeSubmission.title", "Store submission")
|
|
130
152
|
})]
|
|
131
153
|
})]
|
|
132
154
|
})
|
|
133
155
|
})
|
|
134
156
|
}), /* @__PURE__ */ g("div", {
|
|
135
157
|
className: "mx-auto max-w-3xl px-6 py-6",
|
|
136
|
-
children: [
|
|
158
|
+
children: [j && /* @__PURE__ */ h("div", {
|
|
137
159
|
role: "alert",
|
|
138
160
|
className: "mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger",
|
|
139
|
-
children:
|
|
140
|
-
}),
|
|
161
|
+
children: j
|
|
162
|
+
}), k && !D ? /* @__PURE__ */ h("div", {
|
|
141
163
|
className: "py-16 text-center text-text-secondary",
|
|
142
164
|
role: "status",
|
|
143
165
|
"aria-live": "polite",
|
|
144
|
-
children:
|
|
145
|
-
}) :
|
|
166
|
+
children: T("devportal.storeSubmission.loading", "Loading application…")
|
|
167
|
+
}) : D ? /* @__PURE__ */ g("div", {
|
|
146
168
|
className: "space-y-4",
|
|
147
169
|
children: [
|
|
148
170
|
/* @__PURE__ */ h("div", {
|
|
@@ -150,49 +172,49 @@ var x = {
|
|
|
150
172
|
children: /* @__PURE__ */ g("div", {
|
|
151
173
|
className: "flex items-center gap-3",
|
|
152
174
|
children: [
|
|
153
|
-
|
|
154
|
-
src:
|
|
175
|
+
D.iconUrl ? /* @__PURE__ */ h("img", {
|
|
176
|
+
src: D.iconUrl,
|
|
155
177
|
alt: "",
|
|
156
178
|
className: "h-14 w-14 flex-shrink-0 rounded-md object-cover"
|
|
157
179
|
}) : /* @__PURE__ */ h("div", {
|
|
158
180
|
className: "flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-md bg-surface-muted text-text-secondary",
|
|
159
|
-
children:
|
|
181
|
+
children: D.name.slice(0, 2).toUpperCase()
|
|
160
182
|
}),
|
|
161
183
|
/* @__PURE__ */ g("div", {
|
|
162
184
|
className: "min-w-0 flex-1",
|
|
163
185
|
children: [/* @__PURE__ */ h("h2", {
|
|
164
186
|
className: "text-lg font-semibold text-text-primary",
|
|
165
|
-
children:
|
|
187
|
+
children: D.name
|
|
166
188
|
}), /* @__PURE__ */ h("p", {
|
|
167
189
|
className: "font-mono text-xs text-text-tertiary",
|
|
168
|
-
children:
|
|
190
|
+
children: D.slug
|
|
169
191
|
})]
|
|
170
192
|
}),
|
|
171
193
|
/* @__PURE__ */ g("div", {
|
|
172
|
-
className: `flex items-center gap-1.5 ${
|
|
194
|
+
className: `flex items-center gap-1.5 ${V.tone}`,
|
|
173
195
|
role: "status",
|
|
174
|
-
children: [/* @__PURE__ */ h(
|
|
196
|
+
children: [/* @__PURE__ */ h(H, {
|
|
175
197
|
className: "h-5 w-5",
|
|
176
198
|
"aria-hidden": "true"
|
|
177
199
|
}), /* @__PURE__ */ h("span", {
|
|
178
200
|
className: "text-sm font-medium",
|
|
179
|
-
children:
|
|
201
|
+
children: T(V.i18nKey, V.fallback)
|
|
180
202
|
})]
|
|
181
203
|
})
|
|
182
204
|
]
|
|
183
205
|
})
|
|
184
206
|
}),
|
|
185
|
-
|
|
207
|
+
B && B.status !== "UNKNOWN" && /* @__PURE__ */ g("div", {
|
|
186
208
|
className: "rounded-lg border border-border-default bg-surface-raised p-4",
|
|
187
209
|
children: [
|
|
188
210
|
/* @__PURE__ */ h("h3", {
|
|
189
211
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
190
|
-
children:
|
|
212
|
+
children: T("devportal.storeSubmission.timeline", "Submission timeline")
|
|
191
213
|
}),
|
|
192
214
|
/* @__PURE__ */ g("ul", {
|
|
193
215
|
className: "space-y-2 text-sm",
|
|
194
216
|
children: [
|
|
195
|
-
|
|
217
|
+
B.submittedAt && /* @__PURE__ */ g("li", {
|
|
196
218
|
className: "flex items-center gap-2",
|
|
197
219
|
children: [
|
|
198
220
|
/* @__PURE__ */ h(l, {
|
|
@@ -201,15 +223,15 @@ var x = {
|
|
|
201
223
|
}),
|
|
202
224
|
/* @__PURE__ */ h("span", {
|
|
203
225
|
className: "text-text-secondary",
|
|
204
|
-
children:
|
|
226
|
+
children: T("devportal.storeSubmission.submitted", "Submitted:")
|
|
205
227
|
}),
|
|
206
228
|
/* @__PURE__ */ h("span", {
|
|
207
229
|
className: "text-text-primary",
|
|
208
|
-
children: new Date(
|
|
230
|
+
children: new Date(B.submittedAt).toLocaleString()
|
|
209
231
|
})
|
|
210
232
|
]
|
|
211
233
|
}),
|
|
212
|
-
|
|
234
|
+
B.reviewedAt && /* @__PURE__ */ g("li", {
|
|
213
235
|
className: "flex items-center gap-2",
|
|
214
236
|
children: [
|
|
215
237
|
/* @__PURE__ */ h(c, {
|
|
@@ -218,15 +240,15 @@ var x = {
|
|
|
218
240
|
}),
|
|
219
241
|
/* @__PURE__ */ h("span", {
|
|
220
242
|
className: "text-text-secondary",
|
|
221
|
-
children:
|
|
243
|
+
children: T("devportal.storeSubmission.reviewed", "Reviewed:")
|
|
222
244
|
}),
|
|
223
245
|
/* @__PURE__ */ h("span", {
|
|
224
246
|
className: "text-text-primary",
|
|
225
|
-
children: new Date(
|
|
247
|
+
children: new Date(B.reviewedAt).toLocaleString()
|
|
226
248
|
})
|
|
227
249
|
]
|
|
228
250
|
}),
|
|
229
|
-
|
|
251
|
+
B.publishedAt && /* @__PURE__ */ g("li", {
|
|
230
252
|
className: "flex items-center gap-2",
|
|
231
253
|
children: [
|
|
232
254
|
/* @__PURE__ */ h(c, {
|
|
@@ -235,99 +257,99 @@ var x = {
|
|
|
235
257
|
}),
|
|
236
258
|
/* @__PURE__ */ h("span", {
|
|
237
259
|
className: "text-text-secondary",
|
|
238
|
-
children:
|
|
260
|
+
children: T("devportal.storeSubmission.published", "Published:")
|
|
239
261
|
}),
|
|
240
262
|
/* @__PURE__ */ h("span", {
|
|
241
263
|
className: "text-text-primary",
|
|
242
|
-
children: new Date(
|
|
264
|
+
children: new Date(B.publishedAt).toLocaleString()
|
|
243
265
|
})
|
|
244
266
|
]
|
|
245
267
|
})
|
|
246
268
|
]
|
|
247
269
|
}),
|
|
248
|
-
|
|
270
|
+
B.reviewNotes && /* @__PURE__ */ g("div", {
|
|
249
271
|
className: "mt-3 rounded-md bg-surface-muted p-3",
|
|
250
272
|
children: [/* @__PURE__ */ h("p", {
|
|
251
273
|
className: "text-xs font-medium text-text-secondary",
|
|
252
|
-
children:
|
|
274
|
+
children: T("devportal.storeSubmission.reviewerNotes", "Reviewer notes")
|
|
253
275
|
}), /* @__PURE__ */ h("p", {
|
|
254
276
|
className: "mt-1 text-sm text-text-primary",
|
|
255
|
-
children:
|
|
277
|
+
children: B.reviewNotes
|
|
256
278
|
})]
|
|
257
279
|
}),
|
|
258
|
-
|
|
280
|
+
B.rejectedReason && /* @__PURE__ */ g("div", {
|
|
259
281
|
className: "mt-3 rounded-md border border-border-danger bg-surface-danger-muted p-3",
|
|
260
282
|
role: "alert",
|
|
261
283
|
children: [/* @__PURE__ */ h("p", {
|
|
262
284
|
className: "text-xs font-medium text-text-danger",
|
|
263
|
-
children:
|
|
285
|
+
children: T("devportal.storeSubmission.rejectionReason", "Rejection reason")
|
|
264
286
|
}), /* @__PURE__ */ h("p", {
|
|
265
287
|
className: "mt-1 text-sm text-text-primary",
|
|
266
|
-
children:
|
|
288
|
+
children: B.rejectedReason
|
|
267
289
|
})]
|
|
268
290
|
})
|
|
269
291
|
]
|
|
270
292
|
}),
|
|
271
|
-
(!
|
|
293
|
+
(!B || B.status === "UNKNOWN" || B.status === "DRAFT" || B.status === "REJECTED") && /* @__PURE__ */ g("div", {
|
|
272
294
|
className: "rounded-lg border border-border-default bg-surface-raised p-4",
|
|
273
295
|
children: [
|
|
274
296
|
/* @__PURE__ */ h("h3", {
|
|
275
297
|
className: "mb-2 text-sm font-semibold text-text-primary",
|
|
276
|
-
children:
|
|
298
|
+
children: B?.status === "REJECTED" ? T("devportal.storeSubmission.resubmitForReview", "Resubmit for review") : T("devportal.storeSubmission.submitForReview", "Submit for review")
|
|
277
299
|
}),
|
|
278
300
|
/* @__PURE__ */ h("p", {
|
|
279
301
|
className: "mb-3 text-sm text-text-secondary",
|
|
280
|
-
children:
|
|
302
|
+
children: T("devportal.storeSubmission.help", "Your application will be sent to the store's review queue. Whether it's auto-published or requires admin approval depends on the target store's configuration.")
|
|
281
303
|
}),
|
|
282
304
|
/* @__PURE__ */ h("label", {
|
|
283
305
|
className: "block",
|
|
284
306
|
htmlFor: "store-submission-notes",
|
|
285
307
|
children: /* @__PURE__ */ h("span", {
|
|
286
308
|
className: "sr-only",
|
|
287
|
-
children:
|
|
309
|
+
children: T("devportal.storeSubmission.notesLabel", "Notes for the reviewer (optional)")
|
|
288
310
|
})
|
|
289
311
|
}),
|
|
290
312
|
/* @__PURE__ */ h("textarea", {
|
|
291
313
|
id: "store-submission-notes",
|
|
292
|
-
value:
|
|
293
|
-
onChange: (e) =>
|
|
314
|
+
value: F,
|
|
315
|
+
onChange: (e) => I(e.target.value),
|
|
294
316
|
rows: 3,
|
|
295
|
-
placeholder:
|
|
317
|
+
placeholder: T("devportal.storeSubmission.notesLabel", "Notes for the reviewer (optional)"),
|
|
296
318
|
className: "mb-3 w-full rounded-md border border-border-default bg-surface-default px-3 py-2 text-sm text-text-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"
|
|
297
319
|
}),
|
|
298
320
|
/* @__PURE__ */ g("button", {
|
|
299
321
|
type: "button",
|
|
300
|
-
onClick: () => void
|
|
301
|
-
disabled:
|
|
302
|
-
"aria-disabled":
|
|
303
|
-
title:
|
|
322
|
+
onClick: () => void z(),
|
|
323
|
+
disabled: N || !E.allowed,
|
|
324
|
+
"aria-disabled": N || !E.allowed,
|
|
325
|
+
title: E.allowed ? void 0 : T("devportal.common.noPermission", "You do not have permission to perform this action"),
|
|
304
326
|
className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90 disabled:opacity-60 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",
|
|
305
|
-
children: [
|
|
327
|
+
children: [N && /* @__PURE__ */ h(u, {
|
|
306
328
|
className: "h-4 w-4 animate-spin",
|
|
307
329
|
"aria-hidden": "true"
|
|
308
|
-
}),
|
|
330
|
+
}), B?.status === "REJECTED" ? T("devportal.storeSubmission.resubmit", "Resubmit") : T("devportal.storeSubmission.submitForReview", "Submit for review")]
|
|
309
331
|
})
|
|
310
332
|
]
|
|
311
333
|
}),
|
|
312
|
-
|
|
334
|
+
B?.productId && /* @__PURE__ */ g("div", {
|
|
313
335
|
className: "rounded-lg border border-border-default bg-surface-raised p-4",
|
|
314
336
|
children: [/* @__PURE__ */ h("p", {
|
|
315
337
|
className: "text-xs font-medium text-text-secondary",
|
|
316
|
-
children:
|
|
338
|
+
children: T("devportal.storeSubmission.storeProductId", "Store product ID")
|
|
317
339
|
}), /* @__PURE__ */ h("code", {
|
|
318
340
|
className: "mt-1 block break-all font-mono text-xs text-text-primary",
|
|
319
|
-
children:
|
|
341
|
+
children: B.productId
|
|
320
342
|
})]
|
|
321
343
|
})
|
|
322
344
|
]
|
|
323
345
|
}) : /* @__PURE__ */ h("div", {
|
|
324
346
|
className: "py-16 text-center text-text-secondary",
|
|
325
|
-
children:
|
|
347
|
+
children: T("devportal.storeSubmission.notFound", "Application not found.")
|
|
326
348
|
})]
|
|
327
349
|
})]
|
|
328
350
|
});
|
|
329
351
|
};
|
|
330
352
|
//#endregion
|
|
331
|
-
export {
|
|
353
|
+
export { w as StoreSubmissionPage };
|
|
332
354
|
|
|
333
355
|
//# sourceMappingURL=StoreSubmissionPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreSubmissionPage.js","names":[],"sources":["../../../src/devportal/pages/StoreSubmissionPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport {\n ArrowLeft,\n CheckCircle2,\n Clock,\n RefreshCw,\n XCircle,\n AlertTriangle,\n Store as StoreIcon,\n} from \"lucide-react\";\nimport { graphqlFetch } from \"@burdenoff/fe-libs/shared/graphql\";\nimport { useDevportalEventBus } from \"../events\";\nimport { useTr } from \"../utils/i18n\";\nimport { useDevportalPermission } from \"../hooks\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\n\ntype SubmissionStatus =\n | \"DRAFT\"\n | \"PENDING_REVIEW\"\n | \"PUBLISHED\"\n | \"REJECTED\"\n | \"UNKNOWN\";\n\ntype StoreSubmission = {\n productId: string;\n status: SubmissionStatus;\n submittedAt: string | null;\n reviewedAt: string | null;\n publishedAt: string | null;\n reviewNotes: string | null;\n rejectedReason: string | null;\n};\n\ntype Application = {\n id: string;\n name: string;\n slug: string;\n status: string;\n reviewStatus: string;\n iconUrl: string | null;\n metadata: Record<string, unknown> | null;\n};\n\nconst APP_QUERY = /* GraphQL */ `\n query DevportalAppForSubmission($id: ID!) {\n application(id: $id) {\n id\n name\n slug\n status\n reviewStatus\n iconUrl\n metadata\n }\n }\n`;\n\nconst SUBMIT_MUTATION = /* GraphQL */ `\n mutation DevportalSubmitForReview($id: ID!, $notes: String) {\n submitApplicationForReview(id: $id, notes: $notes) {\n id\n status\n submittedAt\n metadata\n }\n }\n`;\n\nfunction inferSubmission(app: Application | null): StoreSubmission | null {\n if (!app) return null;\n const metadata = (app.metadata ?? {}) as Record<string, unknown>;\n const productId =\n typeof metadata.storeProductId === \"string\" ? metadata.storeProductId : \"\";\n const rawStatus =\n typeof metadata.storeSubmissionStatus === \"string\"\n ? metadata.storeSubmissionStatus\n : null;\n const status: SubmissionStatus =\n rawStatus === \"PENDING_REVIEW\" ||\n rawStatus === \"PUBLISHED\" ||\n rawStatus === \"REJECTED\" ||\n rawStatus === \"DRAFT\"\n ? rawStatus\n : \"UNKNOWN\";\n return {\n productId,\n status,\n submittedAt:\n typeof metadata.storeSubmissionAt === \"string\"\n ? metadata.storeSubmissionAt\n : null,\n reviewedAt: null,\n publishedAt: null,\n reviewNotes: null,\n rejectedReason: null,\n };\n}\n\ntype StatusMeta = {\n i18nKey: string;\n fallback: string;\n icon: typeof CheckCircle2;\n tone: string;\n};\n\nconst statusLabels: Record<SubmissionStatus, StatusMeta> = {\n DRAFT: {\n i18nKey: \"devportal.storeSubmission.status.draft\",\n fallback: \"Draft\",\n icon: Clock,\n tone: \"text-text-secondary\",\n },\n PENDING_REVIEW: {\n i18nKey: \"devportal.storeSubmission.status.pending\",\n fallback: \"Pending review\",\n icon: Clock,\n tone: \"text-status-warning-text\",\n },\n PUBLISHED: {\n i18nKey: \"devportal.storeSubmission.status.published\",\n fallback: \"Published\",\n icon: CheckCircle2,\n tone: \"text-status-success-text\",\n },\n REJECTED: {\n i18nKey: \"devportal.storeSubmission.status.rejected\",\n fallback: \"Rejected\",\n icon: XCircle,\n tone: \"text-status-danger-text\",\n },\n UNKNOWN: {\n i18nKey: \"devportal.storeSubmission.status.unknown\",\n fallback: \"Not yet submitted\",\n icon: AlertTriangle,\n tone: \"text-text-tertiary\",\n },\n};\n\nexport const StoreSubmissionPage: FC = () => {\n const { appId } = useParams<{ appId: string }>();\n const navigate = useNavigate();\n const bus = useDevportalEventBus();\n const tr = useTr();\n const submitPerm = useDevportalPermission(DEVPORTAL_PERMISSIONS.APP_SUBMIT);\n const [app, setApp] = useState<Application | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [notes, setNotes] = useState(\"\");\n\n const load = async () => {\n if (!appId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await graphqlFetch<{ application: Application | null }>({\n gateway: \"global\",\n query: APP_QUERY,\n variables: { id: appId },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr(\n \"devportal.storeSubmission.errors.loadFailed\",\n \"Failed to load application\",\n ),\n );\n }\n setApp(result.data?.application ?? null);\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : tr(\n \"devportal.storeSubmission.errors.loadFailed\",\n \"Failed to load application\",\n ),\n );\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void load();\n // TODO(phase1-backend): wire `appReviewStatusChanged` GraphQL subscription\n // here once `global-devportal-svc` ships it. Until then the page refreshes\n // on tab focus to avoid wasteful polling (was: 15s setInterval).\n const onFocus = (): void => {\n void load();\n };\n window.addEventListener(\"focus\", onFocus);\n return () => window.removeEventListener(\"focus\", onFocus);\n }, [appId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const submit = async () => {\n if (!appId) return;\n setSubmitting(true);\n setError(null);\n try {\n const result = await graphqlFetch({\n gateway: \"global\",\n query: SUBMIT_MUTATION,\n variables: { id: appId, notes: notes || null },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr(\n \"devportal.storeSubmission.errors.submitFailed\",\n \"Submission failed\",\n ),\n );\n }\n bus.emit(\"devportal.app.submitted\", { appId });\n await load();\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : tr(\n \"devportal.storeSubmission.errors.submitFailed\",\n \"Submission failed\",\n ),\n );\n } finally {\n setSubmitting(false);\n }\n };\n\n const submission = inferSubmission(app);\n const statusMeta = submission\n ? statusLabels[submission.status]\n : statusLabels.UNKNOWN;\n const StatusIcon = statusMeta.icon;\n\n return (\n <main\n className=\"min-h-screen bg-surface-default\"\n aria-labelledby=\"store-submission-heading\"\n >\n <div className=\"border-b border-border-default bg-surface-raised\">\n <div className=\"mx-auto max-w-3xl px-6 py-4\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n className=\"inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-sm text-text-secondary hover:bg-surface-hover hover:text-text-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden=\"true\" />\n {tr(\"devportal.common.back\", \"Back\")}\n </button>\n <div className=\"flex items-center gap-2\">\n <StoreIcon\n className=\"h-5 w-5 text-text-primary\"\n aria-hidden=\"true\"\n />\n <h1\n id=\"store-submission-heading\"\n className=\"text-xl font-semibold text-text-primary\"\n >\n {tr(\"devportal.storeSubmission.title\", \"Store submission\")}\n </h1>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mx-auto max-w-3xl px-6 py-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger\"\n >\n {error}\n </div>\n )}\n\n {loading && !app ? (\n <div\n className=\"py-16 text-center text-text-secondary\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {tr(\"devportal.storeSubmission.loading\", \"Loading application…\")}\n </div>\n ) : !app ? (\n <div className=\"py-16 text-center text-text-secondary\">\n {tr(\"devportal.storeSubmission.notFound\", \"Application not found.\")}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* App header */}\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <div className=\"flex items-center gap-3\">\n {app.iconUrl ? (\n <img\n src={app.iconUrl}\n alt=\"\"\n className=\"h-14 w-14 flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-md bg-surface-muted text-text-secondary\">\n {app.name.slice(0, 2).toUpperCase()}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {app.name}\n </h2>\n <p className=\"font-mono text-xs text-text-tertiary\">\n {app.slug}\n </p>\n </div>\n <div\n className={`flex items-center gap-1.5 ${statusMeta.tone}`}\n role=\"status\"\n >\n <StatusIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n <span className=\"text-sm font-medium\">\n {tr(statusMeta.i18nKey, statusMeta.fallback)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Timeline */}\n {submission && submission.status !== \"UNKNOWN\" && (\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">\n {tr(\n \"devportal.storeSubmission.timeline\",\n \"Submission timeline\",\n )}\n </h3>\n <ul className=\"space-y-2 text-sm\">\n {submission.submittedAt && (\n <li className=\"flex items-center gap-2\">\n <Clock\n className=\"h-4 w-4 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <span className=\"text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.submitted\",\n \"Submitted:\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {new Date(submission.submittedAt).toLocaleString()}\n </span>\n </li>\n )}\n {submission.reviewedAt && (\n <li className=\"flex items-center gap-2\">\n <CheckCircle2\n className=\"h-4 w-4 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <span className=\"text-text-secondary\">\n {tr(\"devportal.storeSubmission.reviewed\", \"Reviewed:\")}\n </span>\n <span className=\"text-text-primary\">\n {new Date(submission.reviewedAt).toLocaleString()}\n </span>\n </li>\n )}\n {submission.publishedAt && (\n <li className=\"flex items-center gap-2\">\n <CheckCircle2\n className=\"h-4 w-4 text-status-success-text\"\n aria-hidden=\"true\"\n />\n <span className=\"text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.published\",\n \"Published:\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {new Date(submission.publishedAt).toLocaleString()}\n </span>\n </li>\n )}\n </ul>\n {submission.reviewNotes && (\n <div className=\"mt-3 rounded-md bg-surface-muted p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.reviewerNotes\",\n \"Reviewer notes\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {submission.reviewNotes}\n </p>\n </div>\n )}\n {submission.rejectedReason && (\n <div\n className=\"mt-3 rounded-md border border-border-danger bg-surface-danger-muted p-3\"\n role=\"alert\"\n >\n <p className=\"text-xs font-medium text-text-danger\">\n {tr(\n \"devportal.storeSubmission.rejectionReason\",\n \"Rejection reason\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {submission.rejectedReason}\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* Submit / resubmit */}\n {(!submission ||\n submission.status === \"UNKNOWN\" ||\n submission.status === \"DRAFT\" ||\n submission.status === \"REJECTED\") && (\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {submission?.status === \"REJECTED\"\n ? tr(\n \"devportal.storeSubmission.resubmitForReview\",\n \"Resubmit for review\",\n )\n : tr(\n \"devportal.storeSubmission.submitForReview\",\n \"Submit for review\",\n )}\n </h3>\n <p className=\"mb-3 text-sm text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.help\",\n \"Your application will be sent to the store's review queue. Whether it's auto-published or requires admin approval depends on the target store's configuration.\",\n )}\n </p>\n <label className=\"block\" htmlFor=\"store-submission-notes\">\n <span className=\"sr-only\">\n {tr(\n \"devportal.storeSubmission.notesLabel\",\n \"Notes for the reviewer (optional)\",\n )}\n </span>\n </label>\n <textarea\n id=\"store-submission-notes\"\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n rows={3}\n placeholder={tr(\n \"devportal.storeSubmission.notesLabel\",\n \"Notes for the reviewer (optional)\",\n )}\n className=\"mb-3 w-full rounded-md border border-border-default bg-surface-default px-3 py-2 text-sm text-text-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <button\n type=\"button\"\n onClick={() => void submit()}\n disabled={submitting || !submitPerm.allowed}\n aria-disabled={submitting || !submitPerm.allowed}\n title={\n !submitPerm.allowed\n ? tr(\n \"devportal.common.noPermission\",\n \"You do not have permission to perform this action\",\n )\n : undefined\n }\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90 disabled:opacity-60 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n {submitting && (\n <RefreshCw\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n )}\n {submission?.status === \"REJECTED\"\n ? tr(\"devportal.storeSubmission.resubmit\", \"Resubmit\")\n : tr(\n \"devportal.storeSubmission.submitForReview\",\n \"Submit for review\",\n )}\n </button>\n </div>\n )}\n\n {submission?.productId && (\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <p className=\"text-xs font-medium text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.storeProductId\",\n \"Store product ID\",\n )}\n </p>\n <code className=\"mt-1 block break-all font-mono text-xs text-text-primary\">\n {submission.productId}\n </code>\n </div>\n )}\n </div>\n )}\n </div>\n </main>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StoreSubmissionPage.js","names":[],"sources":["../../../src/devportal/pages/StoreSubmissionPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport {\n ArrowLeft,\n CheckCircle2,\n Clock,\n RefreshCw,\n XCircle,\n AlertTriangle,\n Store as StoreIcon,\n} from \"lucide-react\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport { gql } from \"@apollo/client/core\";\nimport { graphqlFetch } from \"@burdenoff/fe-libs/shared/graphql\";\nimport { useDevportalEventBus } from \"../events\";\nimport { useTr } from \"../utils/i18n\";\nimport { useDevportalPermission } from \"../hooks\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\n\ntype SubmissionStatus =\n | \"DRAFT\"\n | \"PENDING_REVIEW\"\n | \"PUBLISHED\"\n | \"REJECTED\"\n | \"UNKNOWN\";\n\ntype StoreSubmission = {\n productId: string;\n status: SubmissionStatus;\n submittedAt: string | null;\n reviewedAt: string | null;\n publishedAt: string | null;\n reviewNotes: string | null;\n rejectedReason: string | null;\n};\n\ntype Application = {\n id: string;\n name: string;\n slug: string;\n status: string;\n reviewStatus: string;\n iconUrl: string | null;\n metadata: Record<string, unknown> | null;\n};\n\nconst APP_QUERY = /* GraphQL */ `\n query DevportalAppForSubmission($id: ID!) {\n application(id: $id) {\n id\n name\n slug\n status\n reviewStatus\n iconUrl\n metadata\n }\n }\n`;\n\nconst SUBMIT_MUTATION = /* GraphQL */ `\n mutation DevportalSubmitForReview($id: ID!, $notes: String) {\n submitApplicationForReview(id: $id, notes: $notes) {\n id\n status\n submittedAt\n metadata\n }\n }\n`;\n\nfunction inferSubmission(app: Application | null): StoreSubmission | null {\n if (!app) return null;\n const metadata = (app.metadata ?? {}) as Record<string, unknown>;\n const productId =\n typeof metadata.storeProductId === \"string\" ? metadata.storeProductId : \"\";\n const rawStatus =\n typeof metadata.storeSubmissionStatus === \"string\"\n ? metadata.storeSubmissionStatus\n : null;\n const status: SubmissionStatus =\n rawStatus === \"PENDING_REVIEW\" ||\n rawStatus === \"PUBLISHED\" ||\n rawStatus === \"REJECTED\" ||\n rawStatus === \"DRAFT\"\n ? rawStatus\n : \"UNKNOWN\";\n return {\n productId,\n status,\n submittedAt:\n typeof metadata.storeSubmissionAt === \"string\"\n ? metadata.storeSubmissionAt\n : null,\n reviewedAt: null,\n publishedAt: null,\n reviewNotes: null,\n rejectedReason: null,\n };\n}\n\ntype StatusMeta = {\n i18nKey: string;\n fallback: string;\n icon: typeof CheckCircle2;\n tone: string;\n};\n\nconst statusLabels: Record<SubmissionStatus, StatusMeta> = {\n DRAFT: {\n i18nKey: \"devportal.storeSubmission.status.draft\",\n fallback: \"Draft\",\n icon: Clock,\n tone: \"text-text-secondary\",\n },\n PENDING_REVIEW: {\n i18nKey: \"devportal.storeSubmission.status.pending\",\n fallback: \"Pending review\",\n icon: Clock,\n tone: \"text-status-warning-text\",\n },\n PUBLISHED: {\n i18nKey: \"devportal.storeSubmission.status.published\",\n fallback: \"Published\",\n icon: CheckCircle2,\n tone: \"text-status-success-text\",\n },\n REJECTED: {\n i18nKey: \"devportal.storeSubmission.status.rejected\",\n fallback: \"Rejected\",\n icon: XCircle,\n tone: \"text-status-danger-text\",\n },\n UNKNOWN: {\n i18nKey: \"devportal.storeSubmission.status.unknown\",\n fallback: \"Not yet submitted\",\n icon: AlertTriangle,\n tone: \"text-text-tertiary\",\n },\n};\n\nexport const StoreSubmissionPage: FC = () => {\n const { appId } = useParams<{ appId: string }>();\n const navigate = useNavigate();\n const bus = useDevportalEventBus();\n const tr = useTr();\n const submitPerm = useDevportalPermission(DEVPORTAL_PERMISSIONS.APP_SUBMIT);\n const [app, setApp] = useState<Application | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [notes, setNotes] = useState(\"\");\n const storeClient = useApolloClient();\n\n const load = async () => {\n if (!appId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await graphqlFetch<{ application: Application | null }>({\n gateway: \"global\",\n query: APP_QUERY,\n variables: { id: appId },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr(\n \"devportal.storeSubmission.errors.loadFailed\",\n \"Failed to load application\",\n ),\n );\n }\n setApp(result.data?.application ?? null);\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : tr(\n \"devportal.storeSubmission.errors.loadFailed\",\n \"Failed to load application\",\n ),\n );\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void load();\n }, [appId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (!appId) return;\n const sub = storeClient.subscribe({\n query: gql`\n subscription ApplicationStoreStatusChanged($applicationId: ID!) {\n applicationStoreStatusChanged(applicationId: $applicationId) {\n applicationId\n status\n reviewNotes\n rejectedReason\n updatedAt\n }\n }\n `,\n variables: { applicationId: appId },\n });\n const subscription = sub.subscribe({\n next: () => {\n void load();\n },\n error: (err: unknown) => {\n console.warn(\"[StoreSubmissionPage] subscription error:\", err);\n },\n });\n return () => subscription.unsubscribe();\n }, [appId, storeClient]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const submit = async () => {\n if (!appId) return;\n setSubmitting(true);\n setError(null);\n try {\n const result = await graphqlFetch({\n gateway: \"global\",\n query: SUBMIT_MUTATION,\n variables: { id: appId, notes: notes || null },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr(\n \"devportal.storeSubmission.errors.submitFailed\",\n \"Submission failed\",\n ),\n );\n }\n bus.emit(\"devportal.app.submitted\", { appId });\n await load();\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : tr(\n \"devportal.storeSubmission.errors.submitFailed\",\n \"Submission failed\",\n ),\n );\n } finally {\n setSubmitting(false);\n }\n };\n\n const submission = inferSubmission(app);\n const statusMeta = submission\n ? statusLabels[submission.status]\n : statusLabels.UNKNOWN;\n const StatusIcon = statusMeta.icon;\n\n return (\n <main\n className=\"min-h-screen bg-surface-default\"\n aria-labelledby=\"store-submission-heading\"\n >\n <div className=\"border-b border-border-default bg-surface-raised\">\n <div className=\"mx-auto max-w-3xl px-6 py-4\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n className=\"inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-sm text-text-secondary hover:bg-surface-hover hover:text-text-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden=\"true\" />\n {tr(\"devportal.common.back\", \"Back\")}\n </button>\n <div className=\"flex items-center gap-2\">\n <StoreIcon\n className=\"h-5 w-5 text-text-primary\"\n aria-hidden=\"true\"\n />\n <h1\n id=\"store-submission-heading\"\n className=\"text-xl font-semibold text-text-primary\"\n >\n {tr(\"devportal.storeSubmission.title\", \"Store submission\")}\n </h1>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mx-auto max-w-3xl px-6 py-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger\"\n >\n {error}\n </div>\n )}\n\n {loading && !app ? (\n <div\n className=\"py-16 text-center text-text-secondary\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {tr(\"devportal.storeSubmission.loading\", \"Loading application…\")}\n </div>\n ) : !app ? (\n <div className=\"py-16 text-center text-text-secondary\">\n {tr(\"devportal.storeSubmission.notFound\", \"Application not found.\")}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* App header */}\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <div className=\"flex items-center gap-3\">\n {app.iconUrl ? (\n <img\n src={app.iconUrl}\n alt=\"\"\n className=\"h-14 w-14 flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-md bg-surface-muted text-text-secondary\">\n {app.name.slice(0, 2).toUpperCase()}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {app.name}\n </h2>\n <p className=\"font-mono text-xs text-text-tertiary\">\n {app.slug}\n </p>\n </div>\n <div\n className={`flex items-center gap-1.5 ${statusMeta.tone}`}\n role=\"status\"\n >\n <StatusIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n <span className=\"text-sm font-medium\">\n {tr(statusMeta.i18nKey, statusMeta.fallback)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Timeline */}\n {submission && submission.status !== \"UNKNOWN\" && (\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">\n {tr(\n \"devportal.storeSubmission.timeline\",\n \"Submission timeline\",\n )}\n </h3>\n <ul className=\"space-y-2 text-sm\">\n {submission.submittedAt && (\n <li className=\"flex items-center gap-2\">\n <Clock\n className=\"h-4 w-4 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <span className=\"text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.submitted\",\n \"Submitted:\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {new Date(submission.submittedAt).toLocaleString()}\n </span>\n </li>\n )}\n {submission.reviewedAt && (\n <li className=\"flex items-center gap-2\">\n <CheckCircle2\n className=\"h-4 w-4 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <span className=\"text-text-secondary\">\n {tr(\"devportal.storeSubmission.reviewed\", \"Reviewed:\")}\n </span>\n <span className=\"text-text-primary\">\n {new Date(submission.reviewedAt).toLocaleString()}\n </span>\n </li>\n )}\n {submission.publishedAt && (\n <li className=\"flex items-center gap-2\">\n <CheckCircle2\n className=\"h-4 w-4 text-status-success-text\"\n aria-hidden=\"true\"\n />\n <span className=\"text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.published\",\n \"Published:\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {new Date(submission.publishedAt).toLocaleString()}\n </span>\n </li>\n )}\n </ul>\n {submission.reviewNotes && (\n <div className=\"mt-3 rounded-md bg-surface-muted p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.reviewerNotes\",\n \"Reviewer notes\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {submission.reviewNotes}\n </p>\n </div>\n )}\n {submission.rejectedReason && (\n <div\n className=\"mt-3 rounded-md border border-border-danger bg-surface-danger-muted p-3\"\n role=\"alert\"\n >\n <p className=\"text-xs font-medium text-text-danger\">\n {tr(\n \"devportal.storeSubmission.rejectionReason\",\n \"Rejection reason\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {submission.rejectedReason}\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* Submit / resubmit */}\n {(!submission ||\n submission.status === \"UNKNOWN\" ||\n submission.status === \"DRAFT\" ||\n submission.status === \"REJECTED\") && (\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {submission?.status === \"REJECTED\"\n ? tr(\n \"devportal.storeSubmission.resubmitForReview\",\n \"Resubmit for review\",\n )\n : tr(\n \"devportal.storeSubmission.submitForReview\",\n \"Submit for review\",\n )}\n </h3>\n <p className=\"mb-3 text-sm text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.help\",\n \"Your application will be sent to the store's review queue. Whether it's auto-published or requires admin approval depends on the target store's configuration.\",\n )}\n </p>\n <label className=\"block\" htmlFor=\"store-submission-notes\">\n <span className=\"sr-only\">\n {tr(\n \"devportal.storeSubmission.notesLabel\",\n \"Notes for the reviewer (optional)\",\n )}\n </span>\n </label>\n <textarea\n id=\"store-submission-notes\"\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n rows={3}\n placeholder={tr(\n \"devportal.storeSubmission.notesLabel\",\n \"Notes for the reviewer (optional)\",\n )}\n className=\"mb-3 w-full rounded-md border border-border-default bg-surface-default px-3 py-2 text-sm text-text-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <button\n type=\"button\"\n onClick={() => void submit()}\n disabled={submitting || !submitPerm.allowed}\n aria-disabled={submitting || !submitPerm.allowed}\n title={\n !submitPerm.allowed\n ? tr(\n \"devportal.common.noPermission\",\n \"You do not have permission to perform this action\",\n )\n : undefined\n }\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90 disabled:opacity-60 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n {submitting && (\n <RefreshCw\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n )}\n {submission?.status === \"REJECTED\"\n ? tr(\"devportal.storeSubmission.resubmit\", \"Resubmit\")\n : tr(\n \"devportal.storeSubmission.submitForReview\",\n \"Submit for review\",\n )}\n </button>\n </div>\n )}\n\n {submission?.productId && (\n <div className=\"rounded-lg border border-border-default bg-surface-raised p-4\">\n <p className=\"text-xs font-medium text-text-secondary\">\n {tr(\n \"devportal.storeSubmission.storeProductId\",\n \"Store product ID\",\n )}\n </p>\n <code className=\"mt-1 block break-all font-mono text-xs text-text-primary\">\n {submission.productId}\n </code>\n </div>\n )}\n </div>\n )}\n </div>\n </main>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EMPTY as e } from "../../../../rxjs/dist/esm5/internal/observable/empty.js";
|
|
2
|
+
import { newInvariantError as t } from "../../utilities/invariant/index.js";
|
|
3
|
+
import { createOperation as n } from "../utils/createOperation.js";
|
|
4
|
+
//#region node_modules/@apollo/client/link/core/ApolloLink.js
|
|
5
|
+
var r = class r {
|
|
6
|
+
static empty() {
|
|
7
|
+
return new r(() => e);
|
|
8
|
+
}
|
|
9
|
+
static from(e) {
|
|
10
|
+
if (e.length === 0) return r.empty();
|
|
11
|
+
let [t, ...n] = e;
|
|
12
|
+
return t.concat(...n);
|
|
13
|
+
}
|
|
14
|
+
static split(e, t, n = new r((e, t) => t(e))) {
|
|
15
|
+
let i = new r((r, i) => e(r) ? t.request(r, i) : n.request(r, i));
|
|
16
|
+
return Object.assign(i, {
|
|
17
|
+
left: t,
|
|
18
|
+
right: n
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static execute(t, r, i) {
|
|
22
|
+
return t.request(n(r, i), () => e);
|
|
23
|
+
}
|
|
24
|
+
static concat(...e) {
|
|
25
|
+
return r.from(e);
|
|
26
|
+
}
|
|
27
|
+
constructor(e) {
|
|
28
|
+
e && (this.request = e);
|
|
29
|
+
}
|
|
30
|
+
split(e, t, n) {
|
|
31
|
+
return this.concat(r.split(e, t, n));
|
|
32
|
+
}
|
|
33
|
+
concat(...e) {
|
|
34
|
+
return e.length === 0 ? this : e.reduce(this.combine.bind(this), this);
|
|
35
|
+
}
|
|
36
|
+
combine(e, t) {
|
|
37
|
+
let n = new r((n, r) => e.request(n, (e) => t.request(e, r)));
|
|
38
|
+
return Object.assign(n, {
|
|
39
|
+
left: e,
|
|
40
|
+
right: t
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
request(e, n) {
|
|
44
|
+
throw t(65);
|
|
45
|
+
}
|
|
46
|
+
left;
|
|
47
|
+
right;
|
|
48
|
+
};
|
|
49
|
+
//#endregion
|
|
50
|
+
export { r as ApolloLink };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=ApolloLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApolloLink.js","names":[],"sources":["../../../../../../node_modules/@apollo/client/link/core/ApolloLink.js"],"sourcesContent":["import { EMPTY } from \"rxjs\";\nimport { createOperation } from \"@apollo/client/link/utils\";\nimport { __DEV__ } from \"@apollo/client/utilities/environment\";\nimport { invariant, newInvariantError, } from \"@apollo/client/utilities/invariant\";\n/**\n * The base class for all links in Apollo Client. A link represents either a\n * self-contained modification to a GraphQL operation or a side effect (such as\n * logging).\n *\n * @remarks\n *\n * Links enable you to customize Apollo Client's request flow by composing\n * together different pieces of functionality into a chain of links. Each\n * link represents a specific capability, such as adding authentication headers,\n * retrying failed requests, batching operations, or sending requests to a\n * GraphQL server.\n *\n * Every link must define a request handler via its constructor or by extending\n * this class and implementing the `request` method.\n *\n * @example\n *\n * ```ts\n * import { ApolloLink } from \"@apollo/client\";\n *\n * const link = new ApolloLink((operation, forward) => {\n * console.log(\"Operation:\", operation.operationName);\n * return forward(operation);\n * });\n * ```\n */\nexport class ApolloLink {\n /**\n * Creates a link that completes immediately and does not emit a result.\n *\n * @example\n *\n * ```ts\n * const link = ApolloLink.empty();\n * ```\n */\n static empty() {\n return new ApolloLink(() => EMPTY);\n }\n /**\n * Composes multiple links into a single composed link that executes each\n * provided link in serial order.\n *\n * @example\n *\n * ```ts\n * import { from, HttpLink, ApolloLink } from \"@apollo/client\";\n * import { RetryLink } from \"@apollo/client/link/retry\";\n * import MyAuthLink from \"../auth\";\n *\n * const link = ApolloLink.from([\n * new RetryLink(),\n * new MyAuthLink(),\n * new HttpLink({ uri: \"http://localhost:4000/graphql\" }),\n * ]);\n * ```\n *\n * @param links - An array of `ApolloLink` instances or request handlers that\n * are executed in serial order.\n */\n static from(links) {\n if (links.length === 0)\n return ApolloLink.empty();\n const [first, ...rest] = links;\n return first.concat(...rest);\n }\n /**\n * Creates a link that conditionally routes a request to different links.\n *\n * @example\n *\n * ```ts\n * import { ApolloLink, HttpLink } from \"@apollo/client\";\n *\n * const link = ApolloLink.split(\n * (operation) => operation.getContext().version === 1,\n * new HttpLink({ uri: \"http://localhost:4000/v1/graphql\" }),\n * new HttpLink({ uri: \"http://localhost:4000/v2/graphql\" })\n * );\n * ```\n *\n * @param test - A predicate function that receives the current `operation`\n * and returns a boolean indicating which link to execute. Returning `true`\n * executes the `left` link. Returning `false` executes the `right` link.\n *\n * @param left - The link that executes when the `test` function returns\n * `true`.\n *\n * @param right - The link that executes when the `test` function returns\n * `false`. If the `right` link is not provided, the request is forwarded to\n * the next link in the chain.\n */\n static split(test, left, right = new ApolloLink((op, forward) => forward(op))) {\n const link = new ApolloLink((operation, forward) => {\n const result = test(operation);\n if (__DEV__) {\n if (typeof result !== \"boolean\") {\n __DEV__ && invariant.warn(63, result);\n }\n }\n return result ?\n left.request(operation, forward)\n : right.request(operation, forward);\n });\n return Object.assign(link, { left, right });\n }\n /**\n * Executes a GraphQL request against a link. The `execute` function begins\n * the request by calling the request handler of the link.\n *\n * @example\n *\n * ```ts\n * const observable = ApolloLink.execute(link, { query, variables }, { client });\n *\n * observable.subscribe({\n * next(value) {\n * console.log(\"Received\", value);\n * },\n * error(error) {\n * console.error(\"Oops got error\", error);\n * },\n * complete() {\n * console.log(\"Request complete\");\n * },\n * });\n * ```\n *\n * @param link - The `ApolloLink` instance to execute the request.\n *\n * @param request - The GraphQL request details, such as the `query` and\n * `variables`.\n *\n * @param context - The execution context for the request, such as the\n * `client` making the request.\n */\n static execute(link, request, context) {\n return link.request(createOperation(request, context), () => {\n if (__DEV__) {\n __DEV__ && invariant.warn(64);\n }\n return EMPTY;\n });\n }\n /**\n * Combines multiple links into a single composed link.\n *\n * @example\n *\n * ```ts\n * const link = ApolloLink.concat(firstLink, secondLink, thirdLink);\n * ```\n *\n * @param links - The links to concatenate into a single link. Each link will\n * execute in serial order.\n *\n * @deprecated Use `ApolloLink.from` instead. `ApolloLink.concat` will be\n * removed in a future major version.\n */\n static concat(...links) {\n return ApolloLink.from(links);\n }\n constructor(request) {\n if (request)\n this.request = request;\n }\n /**\n * Concatenates a link that conditionally routes a request to different links.\n *\n * @example\n *\n * ```ts\n * import { ApolloLink, HttpLink } from \"@apollo/client\";\n *\n * const previousLink = new ApolloLink((operation, forward) => {\n * // Handle the request\n *\n * return forward(operation);\n * });\n *\n * const link = previousLink.split(\n * (operation) => operation.getContext().version === 1,\n * new HttpLink({ uri: \"http://localhost:4000/v1/graphql\" }),\n * new HttpLink({ uri: \"http://localhost:4000/v2/graphql\" })\n * );\n * ```\n *\n * @param test - A predicate function that receives the current `operation`\n * and returns a boolean indicating which link to execute. Returning `true`\n * executes the `left` link. Returning `false` executes the `right` link.\n *\n * @param left - The link that executes when the `test` function returns\n * `true`.\n *\n * @param right - The link that executes when the `test` function returns\n * `false`. If the `right` link is not provided, the request is forwarded to\n * the next link in the chain.\n */\n split(test, left, right) {\n return this.concat(ApolloLink.split(test, left, right));\n }\n /**\n * Combines the link with other links into a single composed link.\n *\n * @example\n *\n * ```ts\n * import { ApolloLink, HttpLink } from \"@apollo/client\";\n *\n * const previousLink = new ApolloLink((operation, forward) => {\n * // Handle the request\n *\n * return forward(operation);\n * });\n *\n * const link = previousLink.concat(\n * link1,\n * link2,\n * new HttpLink({ uri: \"http://localhost:4000/graphql\" })\n * );\n * ```\n */\n concat(...links) {\n if (links.length === 0) {\n return this;\n }\n return links.reduce(this.combine.bind(this), this);\n }\n combine(left, right) {\n const link = new ApolloLink((operation, forward) => {\n return left.request(operation, (op) => right.request(op, forward));\n });\n return Object.assign(link, { left, right });\n }\n /**\n * Runs the request handler for the provided operation.\n *\n * > [!NOTE]\n * > This is called by the `ApolloLink.execute` function for you and should\n * > not be called directly. Prefer using `ApolloLink.execute` to make the\n * > request instead.\n */\n request(operation, forward) {\n throw newInvariantError(65);\n }\n /**\n * @internal\n * Used to iterate through all links that are concatenations or `split` links.\n * \n * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.\n */\n left;\n /**\n * @internal\n * Used to iterate through all links that are concatenations or `split` links.\n * \n * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.\n */\n right;\n}\n//# sourceMappingURL=ApolloLink.js.map\n"],"x_google_ignoreList":[0],"mappings":";;;;AA+BA,IAAa,IAAb,MAAa,EAAW;CAUpB,OAAO,QAAQ;AACX,SAAO,IAAI,QAAiB,EAAM;;CAuBtC,OAAO,KAAK,GAAO;AACf,MAAI,EAAM,WAAW,EACjB,QAAO,EAAW,OAAO;EAC7B,IAAM,CAAC,GAAO,GAAG,KAAQ;AACzB,SAAO,EAAM,OAAO,GAAG,EAAK;;CA4BhC,OAAO,MAAM,GAAM,GAAM,IAAQ,IAAI,GAAY,GAAI,MAAY,EAAQ,EAAG,CAAC,EAAE;EAC3E,IAAM,IAAO,IAAI,GAAY,GAAW,MACrB,EAAK,EAAU,GAO1B,EAAK,QAAQ,GAAW,EAAQ,GAC9B,EAAM,QAAQ,GAAW,EAAQ,CACzC;AACF,SAAO,OAAO,OAAO,GAAM;GAAE;GAAM;GAAO,CAAC;;CAgC/C,OAAO,QAAQ,GAAM,GAAS,GAAS;AACnC,SAAO,EAAK,QAAQ,EAAgB,GAAS,EAAQ,QAI1C,EACT;;CAiBN,OAAO,OAAO,GAAG,GAAO;AACpB,SAAO,EAAW,KAAK,EAAM;;CAEjC,YAAY,GAAS;AACjB,EAAI,MACA,KAAK,UAAU;;CAkCvB,MAAM,GAAM,GAAM,GAAO;AACrB,SAAO,KAAK,OAAO,EAAW,MAAM,GAAM,GAAM,EAAM,CAAC;;CAuB3D,OAAO,GAAG,GAAO;AAIb,SAHI,EAAM,WAAW,IACV,OAEJ,EAAM,OAAO,KAAK,QAAQ,KAAK,KAAK,EAAE,KAAK;;CAEtD,QAAQ,GAAM,GAAO;EACjB,IAAM,IAAO,IAAI,GAAY,GAAW,MAC7B,EAAK,QAAQ,IAAY,MAAO,EAAM,QAAQ,GAAI,EAAQ,CAAC,CACpE;AACF,SAAO,OAAO,OAAO,GAAM;GAAE;GAAM;GAAO,CAAC;;CAU/C,QAAQ,GAAW,GAAS;AACxB,QAAM,EAAkB,GAAG;;CAQ/B;CAOA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CombinedGraphQLErrors as e } from "../../errors/CombinedGraphQLErrors.js";
|
|
2
|
+
import { Observable as t } from "../../../../rxjs/dist/esm5/internal/Observable.js";
|
|
3
|
+
import { isNonNullObject as n } from "../../utilities/internal/isNonNullObject.js";
|
|
4
|
+
import { ApolloLink as r } from "../core/ApolloLink.js";
|
|
5
|
+
import { print as i } from "../../utilities/graphql/print.js";
|
|
6
|
+
//#region node_modules/@apollo/client/link/subscriptions/index.js
|
|
7
|
+
function a(e) {
|
|
8
|
+
return n(e) && "code" in e && "reason" in e;
|
|
9
|
+
}
|
|
10
|
+
function o(e) {
|
|
11
|
+
return n(e) && e.target?.readyState === WebSocket.CLOSED;
|
|
12
|
+
}
|
|
13
|
+
var s = class extends r {
|
|
14
|
+
client;
|
|
15
|
+
constructor(e) {
|
|
16
|
+
super(), this.client = e;
|
|
17
|
+
}
|
|
18
|
+
request(n) {
|
|
19
|
+
return new t((t) => {
|
|
20
|
+
let { query: r, variables: s, operationName: c, extensions: l } = n;
|
|
21
|
+
return this.client.subscribe({
|
|
22
|
+
variables: s,
|
|
23
|
+
operationName: c,
|
|
24
|
+
extensions: l,
|
|
25
|
+
query: i(r)
|
|
26
|
+
}, {
|
|
27
|
+
next: t.next.bind(t),
|
|
28
|
+
complete: t.complete.bind(t),
|
|
29
|
+
error: (n) => {
|
|
30
|
+
if (n instanceof Error) return t.error(n);
|
|
31
|
+
let r = a(n);
|
|
32
|
+
return r || o(n) ? t.error(/* @__PURE__ */ Error(`Socket closed${r ? ` with event ${n.code}` : ""}${r ? ` ${n.reason}` : ""}`)) : t.error(new e({ errors: Array.isArray(n) ? n : [n] }));
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
//#endregion
|
|
39
|
+
export { s as GraphQLWsLink };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=index.js.map
|