@burdenoff/microfe-store 2026.830.1 → 2026.831.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/components/InstallAppModal.js +145 -150
- package/dist/components/InstallAppModal.js.map +1 -1
- package/dist/components/MarkdownEditor.js +71 -70
- package/dist/components/MarkdownEditor.js.map +1 -1
- package/dist/components/cart/CartDrawer.js +179 -175
- package/dist/components/cart/CartDrawer.js.map +1 -1
- package/dist/pages/AppDetailPage.js +110 -119
- package/dist/pages/AppDetailPage.js.map +1 -1
- package/dist/pages/AppSettingsPage.js +60 -59
- package/dist/pages/AppSettingsPage.js.map +1 -1
- package/dist/pages/CartPage.js +122 -121
- package/dist/pages/CartPage.js.map +1 -1
- package/dist/pages/InstalledAppsPage.js +188 -197
- package/dist/pages/InstalledAppsPage.js.map +1 -1
- package/dist/pages/MarketplaceHomePage.js +380 -376
- package/dist/pages/MarketplaceHomePage.js.map +1 -1
- package/dist/pages/MyLicensesPage.js +68 -67
- package/dist/pages/MyLicensesPage.js.map +1 -1
- package/dist/pages/OrderConfirmationPage.js +117 -129
- package/dist/pages/OrderConfirmationPage.js.map +1 -1
- package/dist/pages/OrdersPage.js +87 -90
- package/dist/pages/OrdersPage.js.map +1 -1
- package/dist/pages/ProductDetailPage.js +600 -606
- package/dist/pages/ProductDetailPage.js.map +1 -1
- package/dist/shared/hooks/useTr.d.ts +16 -0
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/dist/translations/en.d.ts +327 -10
- package/dist/translations/en.js +343 -26
- package/dist/translations/en.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,246 +1,237 @@
|
|
|
1
1
|
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { useTr as t } from "../shared/hooks/useTr.js";
|
|
3
|
+
import { useInstallation as n } from "../hooks/useInstallations.js";
|
|
4
|
+
import { useNavigate as r, useParams as i } from "react-router";
|
|
5
|
+
import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { ArrowLeft as o, ExternalLink as s, Info as c, Settings as l } from "lucide-react";
|
|
7
|
+
import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
8
|
+
import { EmphasisPanel as p, IllustratedEmptyState as m, NextSteps as h, PagePurpose as g, ShowMore as _ } from "@burdenoff/fe-libs/ui";
|
|
8
9
|
//#region src/pages/AppDetailPage.tsx
|
|
9
|
-
var
|
|
10
|
-
let
|
|
11
|
-
return /* @__PURE__ */
|
|
10
|
+
var v = () => {
|
|
11
|
+
let v = r(), { basePath: y } = e(), { installationId: b } = i(), { installation: x, loading: S, error: C } = n(b), { t: w } = a(), T = t();
|
|
12
|
+
return /* @__PURE__ */ f("div", {
|
|
12
13
|
className: "flex h-full flex-col",
|
|
13
|
-
children: [/* @__PURE__ */
|
|
14
|
+
children: [/* @__PURE__ */ d("header", {
|
|
14
15
|
className: "border-b border-border-seam bg-bg-surface px-6 py-4",
|
|
15
|
-
children: /* @__PURE__ */
|
|
16
|
+
children: /* @__PURE__ */ f("div", {
|
|
16
17
|
className: "mx-auto flex max-w-4xl items-center gap-3",
|
|
17
|
-
children: [/* @__PURE__ */
|
|
18
|
+
children: [/* @__PURE__ */ d("button", {
|
|
18
19
|
type: "button",
|
|
19
|
-
onClick: () =>
|
|
20
|
+
onClick: () => v(-1),
|
|
20
21
|
"aria-label": "Go back",
|
|
21
22
|
className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
|
|
22
|
-
children: /* @__PURE__ */
|
|
23
|
-
}), /* @__PURE__ */
|
|
23
|
+
children: /* @__PURE__ */ d(o, { className: "size-5" })
|
|
24
|
+
}), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
|
|
24
25
|
className: "text-2xl font-bold text-text-primary",
|
|
25
|
-
children:
|
|
26
|
-
}), /* @__PURE__ */
|
|
26
|
+
children: w("pages.appDetail.title", { defaultValue: "Installed App Details" })
|
|
27
|
+
}), /* @__PURE__ */ d("p", {
|
|
27
28
|
className: "text-sm text-text-muted",
|
|
28
|
-
children:
|
|
29
|
+
children: w("pages.appDetail.subtitle", { defaultValue: "Inspect installation status and metadata" })
|
|
29
30
|
})] })]
|
|
30
31
|
})
|
|
31
|
-
}), /* @__PURE__ */
|
|
32
|
+
}), /* @__PURE__ */ d("main", {
|
|
32
33
|
className: "flex-1 overflow-y-auto p-6",
|
|
33
|
-
children: /* @__PURE__ */
|
|
34
|
+
children: /* @__PURE__ */ f("div", {
|
|
34
35
|
className: "mx-auto max-w-4xl",
|
|
35
|
-
children: [/* @__PURE__ */
|
|
36
|
+
children: [/* @__PURE__ */ d(g, {
|
|
36
37
|
className: "mb-4",
|
|
37
38
|
children: "The full record of one app installed into a workspace — its status, version, who installed it and when, plus its runtime metadata. Come here to confirm an app is healthy, dig into a failed install, or jump to its configuration before troubleshooting."
|
|
38
|
-
}),
|
|
39
|
+
}), S ? /* @__PURE__ */ d("p", {
|
|
39
40
|
role: "status",
|
|
40
41
|
className: "text-sm text-text-muted",
|
|
41
|
-
children: "Loading installation…"
|
|
42
|
-
}) :
|
|
42
|
+
children: T("pages.appDetail.loading", "Loading installation…")
|
|
43
|
+
}) : C ? /* @__PURE__ */ d("p", {
|
|
43
44
|
role: "alert",
|
|
44
45
|
className: "text-sm text-status-error-text",
|
|
45
|
-
children:
|
|
46
|
-
}) :
|
|
47
|
-
let e =
|
|
48
|
-
return /* @__PURE__ */
|
|
46
|
+
children: C.message
|
|
47
|
+
}) : x ? /* @__PURE__ */ d(u, { children: (() => {
|
|
48
|
+
let e = x.manifest, t = e?.type, n = t === "INTEGRATION" || t === "API_INTEGRATION", r = e?.installationId, i = e?.name ?? (e?.slug)?.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") ?? x.productId;
|
|
49
|
+
return /* @__PURE__ */ f(u, { children: [n ? /* @__PURE__ */ f("div", {
|
|
49
50
|
className: "mb-4 flex items-start gap-3 rounded-xl border border-border-default bg-bg-surface p-4",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
51
|
+
children: [/* @__PURE__ */ d(c, { className: "mt-0.5 size-5 shrink-0 text-text-muted" }), /* @__PURE__ */ f("div", {
|
|
51
52
|
className: "text-sm",
|
|
52
53
|
children: [
|
|
53
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ d("p", {
|
|
54
55
|
className: "font-medium text-text-primary",
|
|
55
|
-
children: "Configuration is managed on the third-party's side"
|
|
56
|
+
children: T("pages.appDetail.integrationConfigTitle", "Configuration is managed on the third-party's side")
|
|
56
57
|
}),
|
|
57
58
|
/* @__PURE__ */ d("p", {
|
|
58
59
|
className: "mt-1 text-text-muted",
|
|
59
|
-
children:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
/* @__PURE__ */ u("strong", { children: "Uninstall" }),
|
|
64
|
-
"."
|
|
65
|
-
]
|
|
60
|
+
children: T("pages.appDetail.integrationConfigDescription", "{{appName}} is an external integration connected via OAuth. All settings (webhooks, scopes, data mapping) are configured in the third-party dashboard — not here. To revoke access, use {{uninstall}}.", {
|
|
61
|
+
appName: i,
|
|
62
|
+
uninstall: T("pages.appDetail.uninstall", "Uninstall")
|
|
63
|
+
})
|
|
66
64
|
}),
|
|
67
65
|
r && /* @__PURE__ */ d("p", {
|
|
68
66
|
className: "mt-2 rounded-lg bg-bg-sunken px-3 py-2 font-mono text-xs text-text-muted",
|
|
69
|
-
children:
|
|
70
|
-
"Installation ID:",
|
|
71
|
-
" ",
|
|
72
|
-
/* @__PURE__ */ u("span", {
|
|
73
|
-
className: "select-all text-text-primary",
|
|
74
|
-
children: r
|
|
75
|
-
})
|
|
76
|
-
]
|
|
67
|
+
children: T("pages.appDetail.installationId", "Installation ID: {{id}}", { id: r })
|
|
77
68
|
})
|
|
78
69
|
]
|
|
79
70
|
})]
|
|
80
|
-
}) : /* @__PURE__ */
|
|
71
|
+
}) : /* @__PURE__ */ d(h, {
|
|
81
72
|
className: "mb-4",
|
|
82
73
|
storageKey: "store-app-detail",
|
|
83
74
|
steps: [
|
|
84
75
|
{
|
|
85
76
|
id: "configure",
|
|
86
|
-
label: "Manage configuration",
|
|
87
|
-
description: "Adjust this installation's settings for the workspace.",
|
|
88
|
-
icon: /* @__PURE__ */
|
|
89
|
-
onClick: () =>
|
|
77
|
+
label: T("pages.appDetail.manageConfig", "Manage configuration"),
|
|
78
|
+
description: T("pages.appDetail.manageConfigDescription", "Adjust this installation's settings for the workspace."),
|
|
79
|
+
icon: /* @__PURE__ */ d(l, { className: "size-4" }),
|
|
80
|
+
onClick: () => v(`${y}/installed/${x.id}/settings`)
|
|
90
81
|
},
|
|
91
82
|
{
|
|
92
83
|
id: "view-product",
|
|
93
|
-
label: "Open the product page",
|
|
94
|
-
description: "See the latest version, changelog and reviews.",
|
|
95
|
-
onClick: () =>
|
|
84
|
+
label: T("pages.appDetail.openProductPage", "Open the product page"),
|
|
85
|
+
description: T("pages.appDetail.openProductPageDescription", "See the latest version, changelog and reviews."),
|
|
86
|
+
onClick: () => v(`${y}/marketplace/product/${x.productId}`)
|
|
96
87
|
},
|
|
97
88
|
{
|
|
98
89
|
id: "back",
|
|
99
|
-
label: "Back to installed apps",
|
|
100
|
-
description: "Return to the full list of apps in your workspaces.",
|
|
101
|
-
onClick: () =>
|
|
90
|
+
label: T("pages.appDetail.backToInstalled", "Back to installed apps"),
|
|
91
|
+
description: T("pages.appDetail.backToInstalledDescription", "Return to the full list of apps in your workspaces."),
|
|
92
|
+
onClick: () => v(`${y}/installed`)
|
|
102
93
|
}
|
|
103
94
|
]
|
|
104
|
-
}), /* @__PURE__ */
|
|
105
|
-
/* @__PURE__ */
|
|
95
|
+
}), /* @__PURE__ */ f(p, { children: [
|
|
96
|
+
/* @__PURE__ */ f("div", {
|
|
106
97
|
className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
107
|
-
children: [/* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
98
|
+
children: [/* @__PURE__ */ f("div", { children: [
|
|
99
|
+
/* @__PURE__ */ d("h2", {
|
|
109
100
|
className: "text-lg font-semibold text-text-primary",
|
|
110
101
|
children: i
|
|
111
102
|
}),
|
|
112
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ f("p", {
|
|
113
104
|
className: "mt-1 text-sm text-text-muted",
|
|
114
|
-
children: ["Workspace: ",
|
|
105
|
+
children: ["Workspace: ", x.workspaceName ?? x.workspaceId]
|
|
115
106
|
}),
|
|
116
|
-
t && /* @__PURE__ */
|
|
107
|
+
t && /* @__PURE__ */ d("span", {
|
|
117
108
|
className: "mt-1 inline-block rounded bg-bg-sunken px-2 py-0.5 text-xs font-medium uppercase tracking-wide text-text-muted",
|
|
118
109
|
children: t
|
|
119
110
|
})
|
|
120
|
-
] }), /* @__PURE__ */
|
|
111
|
+
] }), /* @__PURE__ */ d("span", {
|
|
121
112
|
className: "inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary",
|
|
122
|
-
children:
|
|
113
|
+
children: x.status
|
|
123
114
|
})]
|
|
124
115
|
}),
|
|
125
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ f("div", {
|
|
126
117
|
className: "mt-4 grid gap-4 md:grid-cols-2",
|
|
127
|
-
children: [/* @__PURE__ */
|
|
118
|
+
children: [/* @__PURE__ */ f("div", {
|
|
128
119
|
className: "rounded-lg bg-bg-sunken p-4 text-sm text-text-muted",
|
|
129
120
|
children: [
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ f("p", { children: [
|
|
122
|
+
/* @__PURE__ */ f("span", {
|
|
132
123
|
className: "font-medium text-text-primary",
|
|
133
|
-
children: "Version:"
|
|
124
|
+
children: [T("pages.appDetail.version", "Version"), ":"]
|
|
134
125
|
}),
|
|
135
126
|
" ",
|
|
136
|
-
|
|
127
|
+
x.version ?? T("common.notProvided", "Not provided")
|
|
137
128
|
] }),
|
|
138
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ f("p", {
|
|
139
130
|
className: "mt-2",
|
|
140
131
|
children: [
|
|
141
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ f("span", {
|
|
142
133
|
className: "font-medium text-text-primary",
|
|
143
|
-
children: "Installed at:"
|
|
134
|
+
children: [T("pages.appDetail.installedAt", "Installed at"), ":"]
|
|
144
135
|
}),
|
|
145
136
|
" ",
|
|
146
|
-
new Date(
|
|
137
|
+
new Date(x.installedAt).toLocaleString()
|
|
147
138
|
]
|
|
148
139
|
}),
|
|
149
|
-
/* @__PURE__ */
|
|
140
|
+
/* @__PURE__ */ f("p", {
|
|
150
141
|
className: "mt-2",
|
|
151
142
|
children: [
|
|
152
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ f("span", {
|
|
153
144
|
className: "font-medium text-text-primary",
|
|
154
|
-
children: "Updated at:"
|
|
145
|
+
children: [T("pages.appDetail.updatedAt", "Updated at"), ":"]
|
|
155
146
|
}),
|
|
156
147
|
" ",
|
|
157
|
-
new Date(
|
|
148
|
+
new Date(x.updatedAt).toLocaleString()
|
|
158
149
|
]
|
|
159
150
|
}),
|
|
160
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ f("p", {
|
|
161
152
|
className: "mt-2",
|
|
162
153
|
children: [
|
|
163
|
-
/* @__PURE__ */
|
|
154
|
+
/* @__PURE__ */ f("span", {
|
|
164
155
|
className: "font-medium text-text-primary",
|
|
165
|
-
children: "Workspace ID:"
|
|
156
|
+
children: [T("pages.appDetail.workspaceId", "Workspace ID"), ":"]
|
|
166
157
|
}),
|
|
167
158
|
" ",
|
|
168
|
-
|
|
159
|
+
x.workspaceId
|
|
169
160
|
]
|
|
170
161
|
}),
|
|
171
|
-
/* @__PURE__ */
|
|
162
|
+
/* @__PURE__ */ f("p", {
|
|
172
163
|
className: "mt-2",
|
|
173
164
|
children: [
|
|
174
|
-
/* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ f("span", {
|
|
175
166
|
className: "font-medium text-text-primary",
|
|
176
|
-
children: "Organization ID:"
|
|
167
|
+
children: [T("pages.appDetail.organizationId", "Organization ID"), ":"]
|
|
177
168
|
}),
|
|
178
169
|
" ",
|
|
179
|
-
|
|
170
|
+
x.organizationId ?? T("common.notApplicable", "N/A")
|
|
180
171
|
]
|
|
181
172
|
}),
|
|
182
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ f("p", {
|
|
183
174
|
className: "mt-2",
|
|
184
175
|
children: [
|
|
185
|
-
/* @__PURE__ */
|
|
176
|
+
/* @__PURE__ */ f("span", {
|
|
186
177
|
className: "font-medium text-text-primary",
|
|
187
|
-
children: "Installed by:"
|
|
178
|
+
children: [T("pages.appDetail.installedBy", "Installed by"), ":"]
|
|
188
179
|
}),
|
|
189
180
|
" ",
|
|
190
|
-
|
|
181
|
+
x.installedById
|
|
191
182
|
]
|
|
192
183
|
})
|
|
193
184
|
]
|
|
194
|
-
}), /* @__PURE__ */
|
|
185
|
+
}), /* @__PURE__ */ f("div", {
|
|
195
186
|
className: "rounded-lg bg-bg-sunken p-4 text-sm text-text-muted",
|
|
196
|
-
children: [/* @__PURE__ */
|
|
187
|
+
children: [/* @__PURE__ */ d("p", {
|
|
197
188
|
className: "font-medium text-text-primary",
|
|
198
|
-
children: "Runtime metadata"
|
|
199
|
-
}), /* @__PURE__ */
|
|
189
|
+
children: T("pages.appDetail.runtimeMetadata", "Runtime metadata")
|
|
190
|
+
}), /* @__PURE__ */ d(_, {
|
|
200
191
|
collapsedHeight: 120,
|
|
201
|
-
label: "metadata",
|
|
192
|
+
label: T("pages.appDetail.metadata", "metadata"),
|
|
202
193
|
className: "mt-3",
|
|
203
|
-
children: /* @__PURE__ */
|
|
194
|
+
children: /* @__PURE__ */ d("pre", {
|
|
204
195
|
className: "overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-surface p-3 text-xs text-text-muted",
|
|
205
196
|
children: JSON.stringify({
|
|
206
|
-
metadata:
|
|
207
|
-
context:
|
|
208
|
-
uninstalledAt:
|
|
209
|
-
uninstalledById:
|
|
197
|
+
metadata: x.metadata,
|
|
198
|
+
context: x.context,
|
|
199
|
+
uninstalledAt: x.uninstalledAt,
|
|
200
|
+
uninstalledById: x.uninstalledById
|
|
210
201
|
}, null, 2)
|
|
211
202
|
})
|
|
212
203
|
})]
|
|
213
204
|
})]
|
|
214
205
|
}),
|
|
215
|
-
/* @__PURE__ */
|
|
206
|
+
/* @__PURE__ */ f("div", {
|
|
216
207
|
className: "mt-4 flex flex-wrap gap-3",
|
|
217
|
-
children: [n ? /* @__PURE__ */
|
|
208
|
+
children: [n ? /* @__PURE__ */ f("button", {
|
|
218
209
|
type: "button",
|
|
219
|
-
onClick: () =>
|
|
210
|
+
onClick: () => v(`${y}/installed`),
|
|
220
211
|
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",
|
|
221
|
-
children: [/* @__PURE__ */
|
|
222
|
-
}) : /* @__PURE__ */
|
|
212
|
+
children: [/* @__PURE__ */ d(o, { className: "size-4" }), T("pages.appDetail.backToInstalled", "Back to installed apps")]
|
|
213
|
+
}) : /* @__PURE__ */ f("button", {
|
|
223
214
|
type: "button",
|
|
224
|
-
onClick: () =>
|
|
215
|
+
onClick: () => v(`${y}/installed/${x.id}/settings`),
|
|
225
216
|
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",
|
|
226
|
-
children: [/* @__PURE__ */
|
|
227
|
-
}), /* @__PURE__ */
|
|
217
|
+
children: [/* @__PURE__ */ d(l, { className: "size-4" }), w("pages.appDetail.manageConfig", { defaultValue: "Manage Configuration" })]
|
|
218
|
+
}), /* @__PURE__ */ f("button", {
|
|
228
219
|
type: "button",
|
|
229
|
-
onClick: () =>
|
|
220
|
+
onClick: () => v(`${y}/marketplace/product/${x.productId}`),
|
|
230
221
|
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
231
|
-
children: [/* @__PURE__ */
|
|
222
|
+
children: [/* @__PURE__ */ d(s, { className: "size-4" }), w("pages.appDetail.viewProduct", { defaultValue: "View Product" })]
|
|
232
223
|
})]
|
|
233
224
|
})
|
|
234
225
|
] })] });
|
|
235
|
-
})() }) : /* @__PURE__ */
|
|
226
|
+
})() }) : /* @__PURE__ */ d(m, {
|
|
236
227
|
illustration: "empty-generic",
|
|
237
|
-
title: "Installation not found",
|
|
238
|
-
description: "This installation may have been uninstalled or never existed. Head back to your installed apps to find another.",
|
|
239
|
-
action: /* @__PURE__ */
|
|
228
|
+
title: T("pages.appDetail.notFound", "Installation not found"),
|
|
229
|
+
description: T("pages.appDetail.notFoundDescription", "This installation may have been uninstalled or never existed. Head back to your installed apps to find another."),
|
|
230
|
+
action: /* @__PURE__ */ d("button", {
|
|
240
231
|
type: "button",
|
|
241
|
-
onClick: () =>
|
|
232
|
+
onClick: () => v(`${y}/installed`),
|
|
242
233
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
243
|
-
children: "Back to installed apps"
|
|
234
|
+
children: T("pages.appDetail.backToInstalled", "Back to installed apps")
|
|
244
235
|
})
|
|
245
236
|
})]
|
|
246
237
|
})
|
|
@@ -248,6 +239,6 @@ var _ = () => {
|
|
|
248
239
|
});
|
|
249
240
|
};
|
|
250
241
|
//#endregion
|
|
251
|
-
export {
|
|
242
|
+
export { v as AppDetailPage };
|
|
252
243
|
|
|
253
244
|
//# sourceMappingURL=AppDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppDetailPage.js","names":[],"sources":["../../src/pages/AppDetailPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router';\nimport { ArrowLeft, Settings, ExternalLink, Info } 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 NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\n\nexport const AppDetailPage: 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.appDetail.title', { defaultValue: 'Installed App Details' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appDetail.subtitle', {\n defaultValue: 'Inspect installation status and metadata',\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 The full record of one app installed into a workspace — its status, version, who\n installed it and when, plus its runtime metadata. Come here to confirm an app is\n healthy, dig into a failed install, or jump to its configuration before troubleshooting.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading installation…\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=\"This installation may have been uninstalled or never existed. Head back to your installed apps to find 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 <>\n {(() => {\n const manifest = installation.manifest as Record<string, unknown> | null;\n const appType = manifest?.type as string | undefined;\n const isIntegration = appType === 'INTEGRATION' || appType === 'API_INTEGRATION';\n const installationId = manifest?.installationId as string | undefined;\n const appName =\n (manifest?.name as string | undefined) ??\n (manifest?.slug as string | undefined)\n ?.split('-')\n .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ') ??\n installation.productId;\n\n return (\n <>\n {isIntegration ? (\n <div className=\"mb-4 flex items-start gap-3 rounded-xl border border-border-default bg-bg-surface p-4\">\n <Info className=\"mt-0.5 size-5 shrink-0 text-text-muted\" />\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n Configuration is managed on the third-party's side\n </p>\n <p className=\"mt-1 text-text-muted\">\n <strong>{appName}</strong> is an external integration connected via\n OAuth. All settings (webhooks, scopes, data mapping) are configured in\n the third-party's dashboard — not here. To revoke access, use{' '}\n <strong>Uninstall</strong>.\n </p>\n {installationId && (\n <p className=\"mt-2 rounded-lg bg-bg-sunken px-3 py-2 font-mono text-xs text-text-muted\">\n Installation ID:{' '}\n <span className=\"select-all text-text-primary\">{installationId}</span>\n </p>\n )}\n </div>\n </div>\n ) : (\n <NextSteps\n className=\"mb-4\"\n storageKey=\"store-app-detail\"\n steps={[\n {\n id: 'configure',\n label: 'Manage configuration',\n description: \"Adjust this installation's settings for the workspace.\",\n icon: <Settings className=\"size-4\" />,\n onClick: () =>\n navigate(`${basePath}/installed/${installation.id}/settings`),\n },\n {\n id: 'view-product',\n label: 'Open the product page',\n description: 'See the latest version, changelog and reviews.',\n onClick: () =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`),\n },\n {\n id: 'back',\n label: 'Back to installed apps',\n description: 'Return to the full list of apps in your workspaces.',\n onClick: () => navigate(`${basePath}/installed`),\n },\n ]}\n />\n )}\n\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">{appName}</h2>\n <p className=\"mt-1 text-sm text-text-muted\">\n Workspace: {installation.workspaceName ?? installation.workspaceId}\n </p>\n {appType && (\n <span className=\"mt-1 inline-block rounded bg-bg-sunken px-2 py-0.5 text-xs font-medium uppercase tracking-wide text-text-muted\">\n {appType}\n </span>\n )}\n </div>\n <span className=\"inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary\">\n {installation.status}\n </span>\n </div>\n\n <div className=\"mt-4 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p>\n <span className=\"font-medium text-text-primary\">Version:</span>{' '}\n {installation.version ?? 'Not provided'}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Installed at:</span>{' '}\n {new Date(installation.installedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Updated at:</span>{' '}\n {new Date(installation.updatedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Workspace ID:</span>{' '}\n {installation.workspaceId}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Organization ID:</span>{' '}\n {installation.organizationId ?? 'N/A'}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Installed by:</span>{' '}\n {installation.installedById}\n </p>\n </div>\n\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p className=\"font-medium text-text-primary\">Runtime metadata</p>\n <ShowMore collapsedHeight={120} label=\"metadata\" className=\"mt-3\">\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-surface p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata,\n context: installation.context,\n uninstalledAt: installation.uninstalledAt,\n uninstalledById: installation.uninstalledById,\n },\n null,\n 2\n )}\n </pre>\n </ShowMore>\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-wrap gap-3\">\n {isIntegration ? (\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\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 <ArrowLeft className=\"size-4\" />\n Back to Installed Apps\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/installed/${installation.id}/settings`)\n }\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 <Settings className=\"size-4\" />\n {t('pages.appDetail.manageConfig', {\n defaultValue: 'Manage Configuration',\n })}\n </button>\n )}\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-medium text-action-primary-text hover:opacity-90\"\n >\n <ExternalLink className=\"size-4\" />\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </EmphasisPanel>\n </>\n );\n })()}\n </>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppDetailPage.js","names":[],"sources":["../../src/pages/AppDetailPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router';\nimport { ArrowLeft, Settings, ExternalLink, Info } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useTr } from '../shared/hooks/useTr';\nimport {\n EmphasisPanel,\n ShowMore,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\n\nexport const AppDetailPage: 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 const tr = useTr();\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.appDetail.title', { defaultValue: 'Installed App Details' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appDetail.subtitle', {\n defaultValue: 'Inspect installation status and metadata',\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 The full record of one app installed into a workspace — its status, version, who\n installed it and when, plus its runtime metadata. Come here to confirm an app is\n healthy, dig into a failed install, or jump to its configuration before troubleshooting.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n {tr('pages.appDetail.loading', 'Loading installation…')}\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={tr('pages.appDetail.notFound', 'Installation not found')}\n description={tr(\n 'pages.appDetail.notFoundDescription',\n 'This installation may have been uninstalled or never existed. Head back to your installed apps to find another.'\n )}\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 {tr('pages.appDetail.backToInstalled', 'Back to installed apps')}\n </button>\n }\n />\n ) : (\n <>\n {(() => {\n const manifest = installation.manifest as Record<string, unknown> | null;\n const appType = manifest?.type as string | undefined;\n const isIntegration = appType === 'INTEGRATION' || appType === 'API_INTEGRATION';\n const installationId = manifest?.installationId as string | undefined;\n const appName =\n (manifest?.name as string | undefined) ??\n (manifest?.slug as string | undefined)\n ?.split('-')\n .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ') ??\n installation.productId;\n\n return (\n <>\n {isIntegration ? (\n <div className=\"mb-4 flex items-start gap-3 rounded-xl border border-border-default bg-bg-surface p-4\">\n <Info className=\"mt-0.5 size-5 shrink-0 text-text-muted\" />\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n {tr(\n 'pages.appDetail.integrationConfigTitle',\n \"Configuration is managed on the third-party's side\"\n )}\n </p>\n <p className=\"mt-1 text-text-muted\">\n {tr(\n 'pages.appDetail.integrationConfigDescription',\n '{{appName}} is an external integration connected via OAuth. All settings (webhooks, scopes, data mapping) are configured in the third-party dashboard — not here. To revoke access, use {{uninstall}}.',\n { appName, uninstall: tr('pages.appDetail.uninstall', 'Uninstall') }\n )}\n </p>\n {installationId && (\n <p className=\"mt-2 rounded-lg bg-bg-sunken px-3 py-2 font-mono text-xs text-text-muted\">\n {tr('pages.appDetail.installationId', 'Installation ID: {{id}}', {\n id: installationId,\n })}\n </p>\n )}\n </div>\n </div>\n ) : (\n <NextSteps\n className=\"mb-4\"\n storageKey=\"store-app-detail\"\n steps={[\n {\n id: 'configure',\n label: tr('pages.appDetail.manageConfig', 'Manage configuration'),\n description: tr(\n 'pages.appDetail.manageConfigDescription',\n \"Adjust this installation's settings for the workspace.\"\n ),\n icon: <Settings className=\"size-4\" />,\n onClick: () =>\n navigate(`${basePath}/installed/${installation.id}/settings`),\n },\n {\n id: 'view-product',\n label: tr('pages.appDetail.openProductPage', 'Open the product page'),\n description: tr(\n 'pages.appDetail.openProductPageDescription',\n 'See the latest version, changelog and reviews.'\n ),\n onClick: () =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`),\n },\n {\n id: 'back',\n label: tr('pages.appDetail.backToInstalled', 'Back to installed apps'),\n description: tr(\n 'pages.appDetail.backToInstalledDescription',\n 'Return to the full list of apps in your workspaces.'\n ),\n onClick: () => navigate(`${basePath}/installed`),\n },\n ]}\n />\n )}\n\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">{appName}</h2>\n <p className=\"mt-1 text-sm text-text-muted\">\n Workspace: {installation.workspaceName ?? installation.workspaceId}\n </p>\n {appType && (\n <span className=\"mt-1 inline-block rounded bg-bg-sunken px-2 py-0.5 text-xs font-medium uppercase tracking-wide text-text-muted\">\n {appType}\n </span>\n )}\n </div>\n <span className=\"inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary\">\n {installation.status}\n </span>\n </div>\n\n <div className=\"mt-4 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p>\n <span className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.version', 'Version')}:\n </span>{' '}\n {installation.version ?? tr('common.notProvided', 'Not provided')}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.installedAt', 'Installed at')}:\n </span>{' '}\n {new Date(installation.installedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.updatedAt', 'Updated at')}:\n </span>{' '}\n {new Date(installation.updatedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.workspaceId', 'Workspace ID')}:\n </span>{' '}\n {installation.workspaceId}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.organizationId', 'Organization ID')}:\n </span>{' '}\n {installation.organizationId ?? tr('common.notApplicable', 'N/A')}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.installedBy', 'Installed by')}:\n </span>{' '}\n {installation.installedById}\n </p>\n </div>\n\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p className=\"font-medium text-text-primary\">\n {tr('pages.appDetail.runtimeMetadata', 'Runtime metadata')}\n </p>\n <ShowMore\n collapsedHeight={120}\n label={tr('pages.appDetail.metadata', 'metadata')}\n className=\"mt-3\"\n >\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-surface p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata,\n context: installation.context,\n uninstalledAt: installation.uninstalledAt,\n uninstalledById: installation.uninstalledById,\n },\n null,\n 2\n )}\n </pre>\n </ShowMore>\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-wrap gap-3\">\n {isIntegration ? (\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\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 <ArrowLeft className=\"size-4\" />\n {tr('pages.appDetail.backToInstalled', 'Back to installed apps')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/installed/${installation.id}/settings`)\n }\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 <Settings className=\"size-4\" />\n {t('pages.appDetail.manageConfig', {\n defaultValue: 'Manage Configuration',\n })}\n </button>\n )}\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-medium text-action-primary-text hover:opacity-90\"\n >\n <ExternalLink className=\"size-4\" />\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </EmphasisPanel>\n </>\n );\n })()}\n </>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|