@burdenoff/microfe-store 2026.625.5 → 2026.626.1
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/StoreRoutes.js +3 -3
- package/dist/StoreRoutes.js.map +1 -1
- package/dist/components/AccessDenied.js +3 -3
- package/dist/components/AccessDenied.js.map +1 -1
- package/dist/components/InstallAppModal.js +175 -255
- package/dist/components/InstallAppModal.js.map +1 -1
- package/dist/components/cart/CartDrawer.js +10 -10
- package/dist/components/cart/CartDrawer.js.map +1 -1
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/errors/CombinedGraphQLErrors.js +1 -1
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/errors/utils.js +1 -1
- package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/link/core/ApolloLink.js +2 -2
- package/dist/node_modules/@apollo/client/link/core/ApolloLink.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/link/subscriptions/index.js +2 -2
- package/dist/node_modules/@apollo/client/link/subscriptions/index.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/link/utils/createOperation.js +1 -1
- package/dist/node_modules/@apollo/client/link/utils/createOperation.js.map +1 -0
- package/dist/node_modules/@apollo/client/utilities/caching/sizes.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/graphql/print.js +1 -1
- package/dist/node_modules/@apollo/client/utilities/graphql/print.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/caches.js +2 -2
- package/dist/node_modules/@apollo/client/utilities/internal/caches.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/checkDocument.js +1 -1
- package/dist/node_modules/@apollo/client/utilities/internal/checkDocument.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/getMainDefinition.js +1 -1
- 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/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/getOperationDefinition.js +1 -1
- 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/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/globals/global.js +1 -1
- 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/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/makeUniqueId.js +1 -1
- package/dist/node_modules/@apollo/client/utilities/internal/makeUniqueId.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/memoize.js +2 -2
- package/dist/node_modules/@apollo/client/utilities/internal/memoize.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/stringifyForDisplay.js +1 -1
- package/dist/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js.map +1 -0
- package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/invariant/index.js +1 -1
- 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/{.bun/@wry_caches@1.0.1/node_modules/@wry → @wry}/caches/lib/weak.js +1 -1
- package/dist/node_modules/@wry/caches/lib/weak.js.map +1 -0
- package/dist/node_modules/{.bun/@wry_trie@0.5.0/node_modules/@wry → @wry}/trie/lib/index.js +1 -1
- package/dist/node_modules/@wry/trie/lib/index.js.map +1 -0
- package/dist/node_modules/{.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws → graphql-ws}/dist/client.js +1 -1
- package/dist/node_modules/graphql-ws/dist/client.js.map +1 -0
- package/dist/node_modules/{.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws → graphql-ws}/dist/common-CGW11Fyb.js +1 -1
- package/dist/node_modules/graphql-ws/dist/common-CGW11Fyb.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/NotificationFactories.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/Observable.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/Observable.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/Subscriber.js +2 -2
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscriber.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/Subscription.js +2 -2
- package/dist/node_modules/rxjs/dist/esm5/internal/Subscription.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/config.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/config.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/observable/empty.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/observable/empty.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/scheduler/timeoutProvider.js +2 -2
- package/dist/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/symbol/observable.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/symbol/observable.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/UnsubscriptionError.js +1 -1
- 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/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/createErrorClass.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/errorContext.js +1 -1
- 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/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/pipe.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/util/pipe.js.map +1 -0
- package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/reportUnhandledError.js +1 -1
- package/dist/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js.map +1 -0
- package/dist/node_modules/{.bun/tslib@2.8.1 → rxjs}/node_modules/tslib/tslib.es6.js +1 -1
- package/dist/node_modules/rxjs/node_modules/tslib/tslib.es6.js.map +1 -0
- package/dist/pages/AdminDashboardPage.js +118 -91
- package/dist/pages/AdminDashboardPage.js.map +1 -1
- package/dist/pages/AdminReviewModerationPage.js +67 -61
- package/dist/pages/AdminReviewModerationPage.js.map +1 -1
- package/dist/pages/AdminStoresPage.js +424 -371
- package/dist/pages/AdminStoresPage.js.map +1 -1
- package/dist/pages/AdminSubmissionsQueuePage.js +303 -286
- package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -1
- package/dist/pages/AppDetailPage.js +172 -135
- package/dist/pages/AppDetailPage.js.map +1 -1
- package/dist/pages/AppSettingsPage.js +83 -300
- package/dist/pages/AppSettingsPage.js.map +1 -1
- package/dist/pages/CartPage.js +71 -79
- package/dist/pages/CartPage.js.map +1 -1
- package/dist/pages/InstalledAppsPage.js +120 -337
- package/dist/pages/InstalledAppsPage.js.map +1 -1
- package/dist/pages/MarketplaceHomePage.js +196 -205
- package/dist/pages/MarketplaceHomePage.js.map +1 -1
- package/dist/pages/MyLicensesPage.js +70 -75
- package/dist/pages/MyLicensesPage.js.map +1 -1
- package/dist/pages/OrderConfirmationPage.js +70 -37
- package/dist/pages/OrderConfirmationPage.js.map +1 -1
- package/dist/pages/OrdersPage.js +60 -68
- package/dist/pages/OrdersPage.js.map +1 -1
- package/dist/pages/ProductDetailPage.js +794 -752
- package/dist/pages/ProductDetailPage.js.map +1 -1
- package/dist/pages/ProductReviewsPage.js +24 -19
- package/dist/pages/ProductReviewsPage.js.map +1 -1
- package/dist/pages/PublisherDashboardPage.js +134 -99
- package/dist/pages/PublisherDashboardPage.js.map +1 -1
- package/dist/pages/PublisherRevenuePage.js +65 -63
- package/dist/pages/PublisherRevenuePage.js.map +1 -1
- package/dist/pages/PublisherSubmissionsPage.js +120 -111
- package/dist/pages/PublisherSubmissionsPage.js.map +1 -1
- package/dist/pages/PublisherSubmitPage.js +197 -184
- package/dist/pages/PublisherSubmitPage.js.map +1 -1
- package/dist/providers/StoreProvider.js +3 -3
- package/package.json +2 -2
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/errors/utils.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/link/core/ApolloLink.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/link/subscriptions/index.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/link/utils/createOperation.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/caching/sizes.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/graphql/print.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/caches.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/checkDocument.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getMainDefinition.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js +0 -9
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getOperationName.js +0 -8
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getOperationName.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/globals/global.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/globals/maybe.js +0 -10
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/globals/maybe.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/isNonNullObject.js +0 -8
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/isNonNullObject.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/makeUniqueId.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/memoize.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/invariant/index.js.map +0 -1
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/version.js +0 -6
- package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/version.js.map +0 -1
- package/dist/node_modules/.bun/@wry_caches@1.0.1/node_modules/@wry/caches/lib/weak.js.map +0 -1
- package/dist/node_modules/.bun/@wry_trie@0.5.0/node_modules/@wry/trie/lib/index.js.map +0 -1
- package/dist/node_modules/.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws/dist/client.js.map +0 -1
- package/dist/node_modules/.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws/dist/common-CGW11Fyb.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/Observable.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/Subscriber.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/Subscription.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/config.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/observable/empty.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/symbol/observable.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js +0 -11
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/errorContext.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/identity.js +0 -8
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/identity.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +0 -8
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/noop.js +0 -6
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/noop.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/pipe.js.map +0 -1
- package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js.map +0 -1
- package/dist/node_modules/.bun/tslib@2.8.1/node_modules/tslib/tslib.es6.js.map +0 -1
- /package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/caching/sizes.js +0 -0
|
@@ -1,335 +1,118 @@
|
|
|
1
1
|
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
2
|
import { useInstallation as t } from "../hooks/useInstallations.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { useNavigate as x, useParams as S } from "react-router-dom";
|
|
3
|
+
import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
+
import { ArrowLeft as r, Settings as i } from "lucide-react";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { useNavigate as s, useParams as c } from "react-router-dom";
|
|
7
|
+
import { EmphasisPanel as l, IllustratedEmptyState as u, PagePurpose as d, ShowMore as f } from "@burdenoff/fe-libs/ui";
|
|
9
8
|
//#region src/pages/AppSettingsPage.tsx
|
|
10
|
-
|
|
11
|
-
let t =
|
|
12
|
-
|
|
13
|
-
let n = t.connected === !0 || !!t.accessToken || !!t.oauth?.accessToken || t.connection?.status === "connected", r = t.account, i = t.oauth;
|
|
14
|
-
return {
|
|
15
|
-
connected: n,
|
|
16
|
-
accountName: r?.name ?? t.accountName ?? i?.accountName,
|
|
17
|
-
accountEmail: r?.email ?? t.accountEmail ?? i?.email,
|
|
18
|
-
connectedAt: t.connectedAt ?? i?.connectedAt,
|
|
19
|
-
expiresAt: t.expiresAt ?? i?.expiresAt
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function w(e) {
|
|
23
|
-
let t = e.manifest, n = e.context, r = t?.permissions ?? n?.scopes ?? n?.oauth?.scopes;
|
|
24
|
-
return r ? Array.isArray(r) ? r.map(String) : typeof r == "string" ? r.split(/[\s,]+/).filter(Boolean) : [] : [];
|
|
25
|
-
}
|
|
26
|
-
function T(e) {
|
|
27
|
-
let t = e.manifest, n = e.context, r = t?.webhooks ?? n?.webhooks ?? t?.events;
|
|
28
|
-
return !r || !Array.isArray(r) ? [] : r.map((e) => {
|
|
29
|
-
if (typeof e == "string") return { event: e };
|
|
30
|
-
let t = e;
|
|
31
|
-
return {
|
|
32
|
-
event: String(t.event ?? t.name ?? t.type ?? "Unknown event"),
|
|
33
|
-
endpoint: t.endpoint,
|
|
34
|
-
active: t.active !== !1
|
|
35
|
-
};
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function E(e) {
|
|
39
|
-
let t = e.manifest, n = t?.oauth ?? t?.auth;
|
|
40
|
-
return n ? {
|
|
41
|
-
authorizationUrl: n.authorizationUrl,
|
|
42
|
-
tokenUrl: n.tokenUrl,
|
|
43
|
-
redirectUri: n.redirectUri,
|
|
44
|
-
clientId: n.clientId
|
|
45
|
-
} : {};
|
|
46
|
-
}
|
|
47
|
-
function D(e, t) {
|
|
48
|
-
if (!e.authorizationUrl) return;
|
|
49
|
-
let n = new URL(e.authorizationUrl);
|
|
50
|
-
return e.clientId && n.searchParams.set("client_id", e.clientId), e.redirectUri && n.searchParams.set("redirect_uri", e.redirectUri), t.length > 0 && n.searchParams.set("scope", t.join(" ")), n.searchParams.set("response_type", "code"), n.searchParams.set("state", Math.random().toString(36).slice(2)), n.toString();
|
|
51
|
-
}
|
|
52
|
-
function O({ children: e }) {
|
|
53
|
-
return /* @__PURE__ */ y("div", {
|
|
54
|
-
className: "rounded-xl border border-border-default bg-bg-surface p-5",
|
|
55
|
-
children: e
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
function k({ icon: e, title: t }) {
|
|
59
|
-
return /* @__PURE__ */ b("div", {
|
|
60
|
-
className: "mb-4 flex items-center gap-2",
|
|
61
|
-
children: [/* @__PURE__ */ y("span", {
|
|
62
|
-
className: "text-text-muted",
|
|
63
|
-
children: e
|
|
64
|
-
}), /* @__PURE__ */ y("h2", {
|
|
65
|
-
className: "text-base font-semibold text-text-primary",
|
|
66
|
-
children: t
|
|
67
|
-
})]
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
function A({ label: e, value: t }) {
|
|
71
|
-
return /* @__PURE__ */ b("div", {
|
|
72
|
-
className: "flex items-start justify-between gap-4 py-2",
|
|
73
|
-
children: [/* @__PURE__ */ y("span", {
|
|
74
|
-
className: "text-sm text-text-muted",
|
|
75
|
-
children: e
|
|
76
|
-
}), /* @__PURE__ */ y("span", {
|
|
77
|
-
className: "text-right text-sm font-medium text-text-primary",
|
|
78
|
-
children: t
|
|
79
|
-
})]
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
function j({ installation: e }) {
|
|
83
|
-
let t = C(e), r = E(e), i = w(e), a = e.status === n.Active, s = D(r, i);
|
|
84
|
-
return /* @__PURE__ */ b(O, { children: [
|
|
85
|
-
/* @__PURE__ */ y(k, {
|
|
86
|
-
icon: /* @__PURE__ */ y(f, { className: "size-5" }),
|
|
87
|
-
title: "Connection"
|
|
88
|
-
}),
|
|
89
|
-
/* @__PURE__ */ y("div", {
|
|
90
|
-
className: "mb-4 flex items-center gap-3 rounded-lg bg-bg-sunken px-4 py-3",
|
|
91
|
-
children: t.connected ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(o, { className: "size-5 shrink-0 text-status-success-text" }), /* @__PURE__ */ b("div", { children: [
|
|
92
|
-
/* @__PURE__ */ y("p", {
|
|
93
|
-
className: "text-sm font-medium text-text-primary",
|
|
94
|
-
children: "Connected"
|
|
95
|
-
}),
|
|
96
|
-
t.accountName && /* @__PURE__ */ b("p", {
|
|
97
|
-
className: "text-xs text-text-muted",
|
|
98
|
-
children: [t.accountName, t.accountEmail ? ` · ${t.accountEmail}` : ""]
|
|
99
|
-
}),
|
|
100
|
-
t.connectedAt && /* @__PURE__ */ b("p", {
|
|
101
|
-
className: "text-xs text-text-muted",
|
|
102
|
-
children: ["Since ", new Date(t.connectedAt).toLocaleDateString()]
|
|
103
|
-
})
|
|
104
|
-
] })] }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(p, { className: "size-5 shrink-0 text-text-muted" }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
105
|
-
className: "text-sm font-medium text-text-primary",
|
|
106
|
-
children: "Not connected"
|
|
107
|
-
}), /* @__PURE__ */ y("p", {
|
|
108
|
-
className: "text-xs text-text-muted",
|
|
109
|
-
children: "Authorize this integration to start using it"
|
|
110
|
-
})] })] })
|
|
111
|
-
}),
|
|
112
|
-
t.expiresAt && /* @__PURE__ */ b("p", {
|
|
113
|
-
className: "mb-3 text-xs text-text-muted",
|
|
114
|
-
children: ["Token expires: ", new Date(t.expiresAt).toLocaleString()]
|
|
115
|
-
}),
|
|
116
|
-
/* @__PURE__ */ b("div", {
|
|
117
|
-
className: "flex flex-wrap gap-3",
|
|
118
|
-
children: [
|
|
119
|
-
!t.connected && a && s && /* @__PURE__ */ b("a", {
|
|
120
|
-
href: s,
|
|
121
|
-
target: "_blank",
|
|
122
|
-
rel: "noopener noreferrer",
|
|
123
|
-
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90",
|
|
124
|
-
children: [
|
|
125
|
-
/* @__PURE__ */ y(_, { className: "size-4" }),
|
|
126
|
-
"Connect",
|
|
127
|
-
/* @__PURE__ */ y(l, { className: "size-3.5" })
|
|
128
|
-
]
|
|
129
|
-
}),
|
|
130
|
-
t.connected && /* @__PURE__ */ b(v, { children: [s && /* @__PURE__ */ b("a", {
|
|
131
|
-
href: s,
|
|
132
|
-
target: "_blank",
|
|
133
|
-
rel: "noopener noreferrer",
|
|
134
|
-
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
135
|
-
children: [/* @__PURE__ */ y(m, { className: "size-4" }), "Reconnect"]
|
|
136
|
-
}), /* @__PURE__ */ b("button", {
|
|
137
|
-
type: "button",
|
|
138
|
-
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg border border-status-error-border px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle",
|
|
139
|
-
children: [/* @__PURE__ */ y(p, { className: "size-4" }), "Revoke access"]
|
|
140
|
-
})] }),
|
|
141
|
-
!t.connected && !s && /* @__PURE__ */ y("p", {
|
|
142
|
-
className: "text-xs text-text-muted",
|
|
143
|
-
children: "OAuth URL not configured. Contact the app developer to complete the setup."
|
|
144
|
-
})
|
|
145
|
-
]
|
|
146
|
-
}),
|
|
147
|
-
r.clientId && /* @__PURE__ */ b("p", {
|
|
148
|
-
className: "mt-3 text-xs text-text-muted",
|
|
149
|
-
children: ["Client ID: ", r.clientId]
|
|
150
|
-
})
|
|
151
|
-
] });
|
|
152
|
-
}
|
|
153
|
-
function M({ installation: e }) {
|
|
154
|
-
let t = w(e);
|
|
155
|
-
return t.length === 0 ? null : /* @__PURE__ */ b(O, { children: [
|
|
156
|
-
/* @__PURE__ */ y(k, {
|
|
157
|
-
icon: /* @__PURE__ */ y(h, { className: "size-5" }),
|
|
158
|
-
title: "Granted Permissions"
|
|
159
|
-
}),
|
|
160
|
-
/* @__PURE__ */ y("div", {
|
|
161
|
-
className: "flex flex-wrap gap-2",
|
|
162
|
-
children: t.map((e) => /* @__PURE__ */ b("span", {
|
|
163
|
-
className: "inline-flex items-center gap-1.5 rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary",
|
|
164
|
-
children: [/* @__PURE__ */ y(d, { className: "size-3 text-text-muted" }), e]
|
|
165
|
-
}, e))
|
|
166
|
-
}),
|
|
167
|
-
/* @__PURE__ */ y("p", {
|
|
168
|
-
className: "mt-3 text-xs text-text-muted",
|
|
169
|
-
children: "These are the scopes this integration is allowed to access in your workspace."
|
|
170
|
-
})
|
|
171
|
-
] });
|
|
172
|
-
}
|
|
173
|
-
function N({ installation: e }) {
|
|
174
|
-
let t = T(e);
|
|
175
|
-
return t.length === 0 ? null : /* @__PURE__ */ b(O, { children: [/* @__PURE__ */ y(k, {
|
|
176
|
-
icon: /* @__PURE__ */ y(g, { className: "size-5" }),
|
|
177
|
-
title: "Event Subscriptions"
|
|
178
|
-
}), /* @__PURE__ */ y("ul", {
|
|
179
|
-
className: "space-y-2",
|
|
180
|
-
children: t.map((e, t) => /* @__PURE__ */ b("li", {
|
|
181
|
-
className: "flex items-center justify-between rounded-lg bg-bg-sunken px-4 py-3",
|
|
182
|
-
children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
183
|
-
className: "text-sm font-medium text-text-primary",
|
|
184
|
-
children: e.event
|
|
185
|
-
}), e.endpoint && /* @__PURE__ */ y("p", {
|
|
186
|
-
className: "mt-0.5 font-mono text-xs text-text-muted",
|
|
187
|
-
children: e.endpoint
|
|
188
|
-
})] }), /* @__PURE__ */ y("span", {
|
|
189
|
-
className: `rounded-full px-2 py-0.5 text-xs font-medium ${e.active === !1 ? "bg-bg-sunken text-text-muted" : "bg-status-success-bg-subtle text-status-success-text"}`,
|
|
190
|
-
children: e.active === !1 ? "Inactive" : "Active"
|
|
191
|
-
})]
|
|
192
|
-
}, t))
|
|
193
|
-
})] });
|
|
194
|
-
}
|
|
195
|
-
function P({ installation: e }) {
|
|
196
|
-
return /* @__PURE__ */ b(O, { children: [/* @__PURE__ */ y(k, {
|
|
197
|
-
icon: /* @__PURE__ */ y(u, { className: "size-5" }),
|
|
198
|
-
title: "Installation Details"
|
|
199
|
-
}), /* @__PURE__ */ b("div", {
|
|
200
|
-
className: "divide-y divide-border-default",
|
|
201
|
-
children: [
|
|
202
|
-
/* @__PURE__ */ y(A, {
|
|
203
|
-
label: "Product ID",
|
|
204
|
-
value: e.productId
|
|
205
|
-
}),
|
|
206
|
-
e.version && /* @__PURE__ */ y(A, {
|
|
207
|
-
label: "Version",
|
|
208
|
-
value: `v${e.version}`
|
|
209
|
-
}),
|
|
210
|
-
/* @__PURE__ */ y(A, {
|
|
211
|
-
label: "Status",
|
|
212
|
-
value: e.status
|
|
213
|
-
}),
|
|
214
|
-
/* @__PURE__ */ y(A, {
|
|
215
|
-
label: "Workspace",
|
|
216
|
-
value: e.workspaceName ?? e.workspaceId
|
|
217
|
-
}),
|
|
218
|
-
/* @__PURE__ */ y(A, {
|
|
219
|
-
label: "Installed",
|
|
220
|
-
value: new Date(e.installedAt).toLocaleString()
|
|
221
|
-
}),
|
|
222
|
-
/* @__PURE__ */ y(A, {
|
|
223
|
-
label: "Last updated",
|
|
224
|
-
value: new Date(e.updatedAt).toLocaleString()
|
|
225
|
-
}),
|
|
226
|
-
e.organizationId && /* @__PURE__ */ y(A, {
|
|
227
|
-
label: "Organization",
|
|
228
|
-
value: e.organizationId
|
|
229
|
-
}),
|
|
230
|
-
/* @__PURE__ */ y(A, {
|
|
231
|
-
label: "Installed by",
|
|
232
|
-
value: e.installedById
|
|
233
|
-
})
|
|
234
|
-
]
|
|
235
|
-
})] });
|
|
236
|
-
}
|
|
237
|
-
function F({ installation: e }) {
|
|
238
|
-
let [t, n] = r(!1);
|
|
239
|
-
return e.manifest && Object.keys(e.manifest).length > 0 || e.metadata && Object.keys(e.metadata).length > 0 || e.context && Object.keys(e.context).length > 0 ? /* @__PURE__ */ b(O, { children: [/* @__PURE__ */ b("button", {
|
|
240
|
-
type: "button",
|
|
241
|
-
onClick: () => n((e) => !e),
|
|
242
|
-
className: "flex w-full cursor-pointer items-center justify-between text-left",
|
|
243
|
-
children: [/* @__PURE__ */ y("span", {
|
|
244
|
-
className: "text-base font-semibold text-text-primary",
|
|
245
|
-
children: "Raw configuration"
|
|
246
|
-
}), y(t ? s : c, { className: "size-4 text-text-muted" })]
|
|
247
|
-
}), t && /* @__PURE__ */ b("div", {
|
|
248
|
-
className: "mt-4 grid gap-4 lg:grid-cols-2",
|
|
249
|
-
children: [e.manifest && Object.keys(e.manifest).length > 0 && /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
250
|
-
className: "mb-2 text-xs font-medium uppercase tracking-wide text-text-muted",
|
|
251
|
-
children: "Manifest"
|
|
252
|
-
}), /* @__PURE__ */ y("pre", {
|
|
253
|
-
className: "overflow-x-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-xs text-text-muted",
|
|
254
|
-
children: JSON.stringify(e.manifest, null, 2)
|
|
255
|
-
})] }), (e.metadata || e.context) && /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
256
|
-
className: "mb-2 text-xs font-medium uppercase tracking-wide text-text-muted",
|
|
257
|
-
children: "Runtime state"
|
|
258
|
-
}), /* @__PURE__ */ y("pre", {
|
|
259
|
-
className: "overflow-x-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-xs text-text-muted",
|
|
260
|
-
children: JSON.stringify({
|
|
261
|
-
metadata: e.metadata ?? {},
|
|
262
|
-
context: e.context ?? {}
|
|
263
|
-
}, null, 2)
|
|
264
|
-
})] })]
|
|
265
|
-
})] }) : null;
|
|
266
|
-
}
|
|
267
|
-
var I = () => {
|
|
268
|
-
let n = x(), { basePath: r } = e(), { installationId: o } = S(), { installation: s, loading: c, error: l } = t(o), { t: u } = i();
|
|
269
|
-
return /* @__PURE__ */ b("div", {
|
|
9
|
+
var p = () => {
|
|
10
|
+
let p = s(), { basePath: m } = e(), { installationId: h } = c(), { installation: g, loading: _, error: v } = t(h), { t: y } = n();
|
|
11
|
+
return /* @__PURE__ */ o("div", {
|
|
270
12
|
className: "flex h-full flex-col",
|
|
271
|
-
children: [/* @__PURE__ */
|
|
272
|
-
className: "border-b border-border-
|
|
273
|
-
children: /* @__PURE__ */
|
|
13
|
+
children: [/* @__PURE__ */ a("header", {
|
|
14
|
+
className: "border-b border-border-seam bg-bg-surface px-6 py-4",
|
|
15
|
+
children: /* @__PURE__ */ o("div", {
|
|
274
16
|
className: "mx-auto flex max-w-4xl items-center gap-3",
|
|
275
|
-
children: [/* @__PURE__ */
|
|
17
|
+
children: [/* @__PURE__ */ a("button", {
|
|
276
18
|
type: "button",
|
|
277
|
-
onClick: () =>
|
|
19
|
+
onClick: () => p(-1),
|
|
278
20
|
"aria-label": "Go back",
|
|
279
21
|
className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
|
|
280
|
-
children: /* @__PURE__ */
|
|
281
|
-
}), /* @__PURE__ */
|
|
22
|
+
children: /* @__PURE__ */ a(r, { className: "size-5" })
|
|
23
|
+
}), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
|
|
282
24
|
className: "text-2xl font-bold text-text-primary",
|
|
283
|
-
children:
|
|
284
|
-
}), /* @__PURE__ */
|
|
25
|
+
children: y("pages.appSettings.title", { defaultValue: "App Settings" })
|
|
26
|
+
}), /* @__PURE__ */ a("p", {
|
|
285
27
|
className: "text-sm text-text-muted",
|
|
286
|
-
children:
|
|
28
|
+
children: y("pages.appSettings.subtitle", { defaultValue: "Review current installation configuration" })
|
|
287
29
|
})] })]
|
|
288
30
|
})
|
|
289
|
-
}), /* @__PURE__ */
|
|
31
|
+
}), /* @__PURE__ */ a("main", {
|
|
290
32
|
className: "flex-1 overflow-y-auto p-6",
|
|
291
|
-
children: /* @__PURE__ */
|
|
33
|
+
children: /* @__PURE__ */ o("div", {
|
|
292
34
|
className: "mx-auto max-w-4xl",
|
|
293
|
-
children:
|
|
35
|
+
children: [/* @__PURE__ */ a(d, {
|
|
36
|
+
className: "mb-4",
|
|
37
|
+
children: "A read-only snapshot of how this app is configured in the workspace — its manifest, runtime metadata and context. Use it to verify what an installation is actually running (handy when an app behaves unexpectedly) before changing anything inside the product itself."
|
|
38
|
+
}), _ ? /* @__PURE__ */ a("p", {
|
|
294
39
|
role: "status",
|
|
295
40
|
className: "text-sm text-text-muted",
|
|
296
41
|
children: "Loading settings…"
|
|
297
|
-
}) :
|
|
42
|
+
}) : v ? /* @__PURE__ */ a("p", {
|
|
298
43
|
role: "alert",
|
|
299
44
|
className: "text-sm text-status-error-text",
|
|
300
|
-
children:
|
|
301
|
-
}) :
|
|
45
|
+
children: v.message
|
|
46
|
+
}) : g ? /* @__PURE__ */ o(l, {
|
|
302
47
|
className: "space-y-4",
|
|
303
48
|
children: [
|
|
304
|
-
/* @__PURE__ */
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
49
|
+
/* @__PURE__ */ o("div", {
|
|
50
|
+
className: "flex items-center gap-2",
|
|
51
|
+
children: [/* @__PURE__ */ a(i, { className: "size-5 text-text-primary" }), /* @__PURE__ */ a("h2", {
|
|
52
|
+
className: "text-lg font-semibold text-text-primary",
|
|
53
|
+
children: y("pages.appSettings.configSnapshot", { defaultValue: "Configuration snapshot" })
|
|
54
|
+
})]
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ a("p", {
|
|
57
|
+
className: "text-sm text-text-muted",
|
|
58
|
+
children: y("pages.appSettings.configDescription", { defaultValue: "Store-level configuration for this installation is read-only here." })
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ a(f, {
|
|
61
|
+
collapsedHeight: 140,
|
|
62
|
+
label: "configuration details",
|
|
63
|
+
children: /* @__PURE__ */ o("div", {
|
|
64
|
+
className: "grid gap-4 lg:grid-cols-2",
|
|
65
|
+
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
66
|
+
className: "mb-2 text-sm font-medium text-text-primary",
|
|
67
|
+
children: "Manifest"
|
|
68
|
+
}), /* @__PURE__ */ a("pre", {
|
|
69
|
+
className: "overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-sunken p-3 text-xs text-text-muted",
|
|
70
|
+
children: JSON.stringify(g.manifest ?? {}, null, 2)
|
|
71
|
+
})] }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
72
|
+
className: "mb-2 text-sm font-medium text-text-primary",
|
|
73
|
+
children: "Metadata & Context"
|
|
74
|
+
}), /* @__PURE__ */ a("pre", {
|
|
75
|
+
className: "overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-sunken p-3 text-xs text-text-muted",
|
|
76
|
+
children: JSON.stringify({
|
|
77
|
+
metadata: g.metadata ?? {},
|
|
78
|
+
context: g.context ?? {},
|
|
79
|
+
version: g.version,
|
|
80
|
+
status: g.status
|
|
81
|
+
}, null, 2)
|
|
82
|
+
})] })]
|
|
83
|
+
})
|
|
84
|
+
}),
|
|
85
|
+
/* @__PURE__ */ o("div", {
|
|
86
|
+
className: "flex flex-wrap gap-3",
|
|
87
|
+
children: [/* @__PURE__ */ a("button", {
|
|
312
88
|
type: "button",
|
|
313
|
-
onClick: () =>
|
|
89
|
+
onClick: () => p(`${m}/installed/${g.id}`),
|
|
314
90
|
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
315
|
-
children:
|
|
316
|
-
}), /* @__PURE__ */
|
|
91
|
+
children: y("pages.appSettings.viewInstallation", { defaultValue: "View Installation" })
|
|
92
|
+
}), /* @__PURE__ */ a("button", {
|
|
317
93
|
type: "button",
|
|
318
|
-
onClick: () =>
|
|
94
|
+
onClick: () => p(`${m}/marketplace/product/${g.productId}`),
|
|
319
95
|
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90",
|
|
320
|
-
children:
|
|
96
|
+
children: y("pages.appDetail.viewProduct", { defaultValue: "View Product" })
|
|
321
97
|
})]
|
|
322
98
|
})
|
|
323
99
|
]
|
|
324
|
-
}) : /* @__PURE__ */
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
100
|
+
}) : /* @__PURE__ */ a(u, {
|
|
101
|
+
illustration: "empty-generic",
|
|
102
|
+
title: "Installation not found",
|
|
103
|
+
description: "There's no configuration to show — this installation may have been removed. Return to your installed apps to pick another.",
|
|
104
|
+
action: /* @__PURE__ */ a("button", {
|
|
105
|
+
type: "button",
|
|
106
|
+
onClick: () => p(`${m}/installed`),
|
|
107
|
+
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
108
|
+
children: "Back to installed apps"
|
|
109
|
+
})
|
|
110
|
+
})]
|
|
328
111
|
})
|
|
329
112
|
})]
|
|
330
113
|
});
|
|
331
114
|
};
|
|
332
115
|
//#endregion
|
|
333
|
-
export {
|
|
116
|
+
export { p as AppSettingsPage };
|
|
334
117
|
|
|
335
118
|
//# sourceMappingURL=AppSettingsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSettingsPage.js","names":[],"sources":["../../src/pages/AppSettingsPage.tsx"],"sourcesContent":["import { type FC, useState } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n CheckCircle2,\n ChevronDown,\n ChevronRight,\n ExternalLink,\n Globe,\n Key,\n Link2,\n Link2Off,\n RefreshCw,\n ShieldCheck,\n Webhook,\n Zap,\n} from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { StoreInstallationStatus } from '../generated/global-types';\nimport type { InstalledApp } from '../hooks/useInstallations';\n\n// ---------------------------------------------------------------------------\n// Helpers to parse free-form manifest / context JSON\n// ---------------------------------------------------------------------------\n\nfunction getConnectionState(installation: InstalledApp): {\n connected: boolean;\n accountName?: string;\n accountEmail?: string;\n connectedAt?: string;\n expiresAt?: string;\n} {\n const ctx = installation.context as Record<string, unknown> | null | undefined;\n if (!ctx) return { connected: false };\n\n const connected =\n ctx['connected'] === true ||\n Boolean(ctx['accessToken']) ||\n Boolean((ctx['oauth'] as Record<string, unknown> | undefined)?.['accessToken']) ||\n (ctx['connection'] as Record<string, unknown> | undefined)?.['status'] === 'connected';\n\n const account = ctx['account'] as Record<string, unknown> | undefined;\n const oauth = ctx['oauth'] as Record<string, unknown> | undefined;\n\n return {\n connected,\n accountName:\n (account?.['name'] as string | undefined) ??\n (ctx['accountName'] as string | undefined) ??\n (oauth?.['accountName'] as string | undefined),\n accountEmail:\n (account?.['email'] as string | undefined) ??\n (ctx['accountEmail'] as string | undefined) ??\n (oauth?.['email'] as string | undefined),\n connectedAt:\n (ctx['connectedAt'] as string | undefined) ??\n (oauth?.['connectedAt'] as string | undefined),\n expiresAt:\n (ctx['expiresAt'] as string | undefined) ?? (oauth?.['expiresAt'] as string | undefined),\n };\n}\n\nfunction getPermissions(installation: InstalledApp): string[] {\n const manifest = installation.manifest as Record<string, unknown> | null | undefined;\n const ctx = installation.context as Record<string, unknown> | null | undefined;\n\n const raw =\n (manifest?.['permissions'] as unknown[] | undefined) ??\n (ctx?.['scopes'] as unknown[] | undefined) ??\n (ctx?.['oauth'] as Record<string, unknown> | undefined)?.['scopes'];\n\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.map(String);\n if (typeof raw === 'string') return raw.split(/[\\s,]+/).filter(Boolean);\n return [];\n}\n\nfunction getWebhooks(\n installation: InstalledApp\n): Array<{ event: string; endpoint?: string; active?: boolean }> {\n const manifest = installation.manifest as Record<string, unknown> | null | undefined;\n const ctx = installation.context as Record<string, unknown> | null | undefined;\n\n const raw =\n (manifest?.['webhooks'] as unknown[] | undefined) ??\n (ctx?.['webhooks'] as unknown[] | undefined) ??\n (manifest?.['events'] as unknown[] | undefined);\n\n if (!raw || !Array.isArray(raw)) return [];\n\n return raw.map((item) => {\n if (typeof item === 'string') return { event: item };\n const obj = item as Record<string, unknown>;\n return {\n event: String(obj['event'] ?? obj['name'] ?? obj['type'] ?? 'Unknown event'),\n endpoint: obj['endpoint'] as string | undefined,\n active: obj['active'] !== false,\n };\n });\n}\n\nfunction getOAuthEndpoints(installation: InstalledApp): {\n authorizationUrl?: string;\n tokenUrl?: string;\n redirectUri?: string;\n clientId?: string;\n} {\n const manifest = installation.manifest as Record<string, unknown> | null | undefined;\n const oauth =\n (manifest?.['oauth'] as Record<string, unknown> | undefined) ??\n (manifest?.['auth'] as Record<string, unknown> | undefined);\n if (!oauth) return {};\n return {\n authorizationUrl: oauth['authorizationUrl'] as string | undefined,\n tokenUrl: oauth['tokenUrl'] as string | undefined,\n redirectUri: oauth['redirectUri'] as string | undefined,\n clientId: oauth['clientId'] as string | undefined,\n };\n}\n\nfunction buildOAuthUrl(endpoints: ReturnType<typeof getOAuthEndpoints>, scopes: string[]): string | undefined {\n if (!endpoints.authorizationUrl) return undefined;\n const url = new URL(endpoints.authorizationUrl);\n if (endpoints.clientId) url.searchParams.set('client_id', endpoints.clientId);\n if (endpoints.redirectUri) url.searchParams.set('redirect_uri', endpoints.redirectUri);\n if (scopes.length > 0) url.searchParams.set('scope', scopes.join(' '));\n url.searchParams.set('response_type', 'code');\n // Simple state token for CSRF mitigation in this demo context\n url.searchParams.set('state', Math.random().toString(36).slice(2));\n return url.toString();\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction SectionCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-5\">{children}</div>\n );\n}\n\nfunction SectionTitle({ icon, title }: { icon: React.ReactNode; title: string }) {\n return (\n <div className=\"mb-4 flex items-center gap-2\">\n <span className=\"text-text-muted\">{icon}</span>\n <h2 className=\"text-base font-semibold text-text-primary\">{title}</h2>\n </div>\n );\n}\n\nfunction InfoRow({ label, value }: { label: string; value: React.ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-2\">\n <span className=\"text-sm text-text-muted\">{label}</span>\n <span className=\"text-right text-sm font-medium text-text-primary\">{value}</span>\n </div>\n );\n}\n\nfunction ConnectionSection({ installation }: { installation: InstalledApp }) {\n const conn = getConnectionState(installation);\n const oauth = getOAuthEndpoints(installation);\n const permissions = getPermissions(installation);\n const isActive = installation.status === StoreInstallationStatus.Active;\n const oauthUrl = buildOAuthUrl(oauth, permissions);\n\n return (\n <SectionCard>\n <SectionTitle icon={<Link2 className=\"size-5\" />} title=\"Connection\" />\n\n <div className=\"mb-4 flex items-center gap-3 rounded-lg bg-bg-sunken px-4 py-3\">\n {conn.connected ? (\n <>\n <CheckCircle2 className=\"size-5 shrink-0 text-status-success-text\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Connected</p>\n {conn.accountName && (\n <p className=\"text-xs text-text-muted\">\n {conn.accountName}\n {conn.accountEmail ? ` · ${conn.accountEmail}` : ''}\n </p>\n )}\n {conn.connectedAt && (\n <p className=\"text-xs text-text-muted\">\n Since {new Date(conn.connectedAt).toLocaleDateString()}\n </p>\n )}\n </div>\n </>\n ) : (\n <>\n <Link2Off className=\"size-5 shrink-0 text-text-muted\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Not connected</p>\n <p className=\"text-xs text-text-muted\">\n Authorize this integration to start using it\n </p>\n </div>\n </>\n )}\n </div>\n\n {conn.expiresAt && (\n <p className=\"mb-3 text-xs text-text-muted\">\n Token expires: {new Date(conn.expiresAt).toLocaleString()}\n </p>\n )}\n\n <div className=\"flex flex-wrap gap-3\">\n {!conn.connected && isActive && oauthUrl && (\n <a\n href={oauthUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90\"\n >\n <Zap className=\"size-4\" />\n Connect\n <ExternalLink className=\"size-3.5\" />\n </a>\n )}\n {conn.connected && (\n <>\n {oauthUrl && (\n <a\n href={oauthUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n <RefreshCw className=\"size-4\" />\n Reconnect\n </a>\n )}\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-status-error-border px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle\"\n >\n <Link2Off className=\"size-4\" />\n Revoke access\n </button>\n </>\n )}\n {!conn.connected && !oauthUrl && (\n <p className=\"text-xs text-text-muted\">\n OAuth URL not configured. Contact the app developer to complete the setup.\n </p>\n )}\n </div>\n\n {oauth.clientId && (\n <p className=\"mt-3 text-xs text-text-muted\">Client ID: {oauth.clientId}</p>\n )}\n </SectionCard>\n );\n}\n\nfunction PermissionsSection({ installation }: { installation: InstalledApp }) {\n const permissions = getPermissions(installation);\n if (permissions.length === 0) return null;\n\n return (\n <SectionCard>\n <SectionTitle icon={<ShieldCheck className=\"size-5\" />} title=\"Granted Permissions\" />\n <div className=\"flex flex-wrap gap-2\">\n {permissions.map((perm) => (\n <span\n key={perm}\n className=\"inline-flex items-center gap-1.5 rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary\"\n >\n <Key className=\"size-3 text-text-muted\" />\n {perm}\n </span>\n ))}\n </div>\n <p className=\"mt-3 text-xs text-text-muted\">\n These are the scopes this integration is allowed to access in your workspace.\n </p>\n </SectionCard>\n );\n}\n\nfunction WebhooksSection({ installation }: { installation: InstalledApp }) {\n const webhooks = getWebhooks(installation);\n if (webhooks.length === 0) return null;\n\n return (\n <SectionCard>\n <SectionTitle icon={<Webhook className=\"size-5\" />} title=\"Event Subscriptions\" />\n <ul className=\"space-y-2\">\n {webhooks.map((wh, idx) => (\n <li\n key={idx}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken px-4 py-3\"\n >\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{wh.event}</p>\n {wh.endpoint && (\n <p className=\"mt-0.5 font-mono text-xs text-text-muted\">{wh.endpoint}</p>\n )}\n </div>\n <span\n className={`rounded-full px-2 py-0.5 text-xs font-medium ${\n wh.active !== false\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-bg-sunken text-text-muted'\n }`}\n >\n {wh.active !== false ? 'Active' : 'Inactive'}\n </span>\n </li>\n ))}\n </ul>\n </SectionCard>\n );\n}\n\nfunction InstallationDetailsSection({ installation }: { installation: InstalledApp }) {\n return (\n <SectionCard>\n <SectionTitle icon={<Globe className=\"size-5\" />} title=\"Installation Details\" />\n <div className=\"divide-y divide-border-default\">\n <InfoRow label=\"Product ID\" value={installation.productId} />\n {installation.version && <InfoRow label=\"Version\" value={`v${installation.version}`} />}\n <InfoRow label=\"Status\" value={installation.status} />\n <InfoRow label=\"Workspace\" value={installation.workspaceName ?? installation.workspaceId} />\n <InfoRow label=\"Installed\" value={new Date(installation.installedAt).toLocaleString()} />\n <InfoRow label=\"Last updated\" value={new Date(installation.updatedAt).toLocaleString()} />\n {installation.organizationId && (\n <InfoRow label=\"Organization\" value={installation.organizationId} />\n )}\n <InfoRow label=\"Installed by\" value={installation.installedById} />\n </div>\n </SectionCard>\n );\n}\n\nfunction RawConfigSection({ installation }: { installation: InstalledApp }) {\n const [open, setOpen] = useState(false);\n\n const hasData =\n (installation.manifest && Object.keys(installation.manifest).length > 0) ||\n (installation.metadata && Object.keys(installation.metadata).length > 0) ||\n (installation.context && Object.keys(installation.context).length > 0);\n\n if (!hasData) return null;\n\n return (\n <SectionCard>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex w-full cursor-pointer items-center justify-between text-left\"\n >\n <span className=\"text-base font-semibold text-text-primary\">Raw configuration</span>\n {open ? (\n <ChevronDown className=\"size-4 text-text-muted\" />\n ) : (\n <ChevronRight className=\"size-4 text-text-muted\" />\n )}\n </button>\n\n {open && (\n <div className=\"mt-4 grid gap-4 lg:grid-cols-2\">\n {installation.manifest && Object.keys(installation.manifest).length > 0 && (\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-muted\">\n Manifest\n </p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-xs text-text-muted\">\n {JSON.stringify(installation.manifest, null, 2)}\n </pre>\n </div>\n )}\n {(installation.metadata || installation.context) && (\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-muted\">\n Runtime state\n </p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata ?? {},\n context: installation.context ?? {},\n },\n null,\n 2\n )}\n </pre>\n </div>\n )}\n </div>\n )}\n </SectionCard>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport const AppSettingsPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { installationId } = useParams<{ installationId: string }>();\n const { installation, loading, error } = useInstallation(installationId);\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-default bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.appSettings.title', { defaultValue: 'Integration Settings' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appSettings.subtitle', {\n defaultValue: 'Manage your connection, permissions and webhook events',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading settings…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : !installation ? (\n <p className=\"text-sm text-text-muted\">Installation not found.</p>\n ) : (\n <div className=\"space-y-4\">\n <ConnectionSection installation={installation} />\n <PermissionsSection installation={installation} />\n <WebhooksSection installation={installation} />\n <InstallationDetailsSection installation={installation} />\n <RawConfigSection installation={installation} />\n\n <div className=\"flex flex-wrap gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed/${installation.id}`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n {t('pages.appSettings.viewInstallation', { defaultValue: 'View Installation' })}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`)\n }\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90\"\n >\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </div>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppSettingsPage.js","names":[],"sources":["../../src/pages/AppSettingsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Settings } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n EmphasisPanel,\n ShowMore,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\n\nexport const AppSettingsPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { installationId } = useParams<{ installationId: string }>();\n const { installation, loading, error } = useInstallation(installationId);\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-seam bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.appSettings.title', { defaultValue: 'App Settings' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appSettings.subtitle', {\n defaultValue: 'Review current installation configuration',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n <PagePurpose className=\"mb-4\">\n A read-only snapshot of how this app is configured in the workspace — its manifest,\n runtime metadata and context. Use it to verify what an installation is actually running\n (handy when an app behaves unexpectedly) before changing anything inside the product\n itself.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading settings…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : !installation ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"Installation not found\"\n description=\"There's no configuration to show — this installation may have been removed. Return to your installed apps to pick another.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n Back to installed apps\n </button>\n }\n />\n ) : (\n <EmphasisPanel className=\"space-y-4\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"size-5 text-text-primary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('pages.appSettings.configSnapshot', {\n defaultValue: 'Configuration snapshot',\n })}\n </h2>\n </div>\n\n <p className=\"text-sm text-text-muted\">\n {t('pages.appSettings.configDescription', {\n defaultValue:\n 'Store-level configuration for this installation is read-only here.',\n })}\n </p>\n\n <ShowMore collapsedHeight={140} label=\"configuration details\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <div>\n <p className=\"mb-2 text-sm font-medium text-text-primary\">Manifest</p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-sunken p-3 text-xs text-text-muted\">\n {JSON.stringify(installation.manifest ?? {}, null, 2)}\n </pre>\n </div>\n\n <div>\n <p className=\"mb-2 text-sm font-medium text-text-primary\">\n Metadata & Context\n </p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-sunken p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata ?? {},\n context: installation.context ?? {},\n version: installation.version,\n status: installation.status,\n },\n null,\n 2\n )}\n </pre>\n </div>\n </div>\n </ShowMore>\n\n <div className=\"flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed/${installation.id}`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n {t('pages.appSettings.viewInstallation', { defaultValue: 'View Installation' })}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`)\n }\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90\"\n >\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </EmphasisPanel>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|