@burdenoff/microfe-store 2026.624.6 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,13 +44,18 @@ function E(e) {
44
44
  clientId: n.clientId
45
45
  } : {};
46
46
  }
47
- function D({ children: e }) {
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 }) {
48
53
  return /* @__PURE__ */ y("div", {
49
54
  className: "rounded-xl border border-border-default bg-bg-surface p-5",
50
55
  children: e
51
56
  });
52
57
  }
53
- function O({ icon: e, title: t }) {
58
+ function k({ icon: e, title: t }) {
54
59
  return /* @__PURE__ */ b("div", {
55
60
  className: "mb-4 flex items-center gap-2",
56
61
  children: [/* @__PURE__ */ y("span", {
@@ -62,7 +67,7 @@ function O({ icon: e, title: t }) {
62
67
  })]
63
68
  });
64
69
  }
65
- function k({ label: e, value: t }) {
70
+ function A({ label: e, value: t }) {
66
71
  return /* @__PURE__ */ b("div", {
67
72
  className: "flex items-start justify-between gap-4 py-2",
68
73
  children: [/* @__PURE__ */ y("span", {
@@ -74,10 +79,10 @@ function k({ label: e, value: t }) {
74
79
  })]
75
80
  });
76
81
  }
77
- function A({ installation: e }) {
78
- let t = C(e), r = E(e), i = e.status === n.Active;
79
- return /* @__PURE__ */ b(D, { children: [
80
- /* @__PURE__ */ y(O, {
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, {
81
86
  icon: /* @__PURE__ */ y(f, { className: "size-5" }),
82
87
  title: "Connection"
83
88
  }),
@@ -111,8 +116,8 @@ function A({ installation: e }) {
111
116
  /* @__PURE__ */ b("div", {
112
117
  className: "flex flex-wrap gap-3",
113
118
  children: [
114
- !t.connected && i && r.authorizationUrl && /* @__PURE__ */ b("a", {
115
- href: r.authorizationUrl,
119
+ !t.connected && a && s && /* @__PURE__ */ b("a", {
120
+ href: s,
116
121
  target: "_blank",
117
122
  rel: "noopener noreferrer",
118
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",
@@ -122,8 +127,8 @@ function A({ installation: e }) {
122
127
  /* @__PURE__ */ y(l, { className: "size-3.5" })
123
128
  ]
124
129
  }),
125
- t.connected && /* @__PURE__ */ b(v, { children: [r.authorizationUrl && /* @__PURE__ */ b("a", {
126
- href: r.authorizationUrl,
130
+ t.connected && /* @__PURE__ */ b(v, { children: [s && /* @__PURE__ */ b("a", {
131
+ href: s,
127
132
  target: "_blank",
128
133
  rel: "noopener noreferrer",
129
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",
@@ -133,7 +138,7 @@ function A({ installation: e }) {
133
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",
134
139
  children: [/* @__PURE__ */ y(p, { className: "size-4" }), "Revoke access"]
135
140
  })] }),
136
- !t.connected && !r.authorizationUrl && /* @__PURE__ */ y("p", {
141
+ !t.connected && !s && /* @__PURE__ */ y("p", {
137
142
  className: "text-xs text-text-muted",
138
143
  children: "OAuth URL not configured. Contact the app developer to complete the setup."
139
144
  })
@@ -145,10 +150,10 @@ function A({ installation: e }) {
145
150
  })
146
151
  ] });
147
152
  }
148
- function j({ installation: e }) {
153
+ function M({ installation: e }) {
149
154
  let t = w(e);
150
- return t.length === 0 ? null : /* @__PURE__ */ b(D, { children: [
151
- /* @__PURE__ */ y(O, {
155
+ return t.length === 0 ? null : /* @__PURE__ */ b(O, { children: [
156
+ /* @__PURE__ */ y(k, {
152
157
  icon: /* @__PURE__ */ y(h, { className: "size-5" }),
153
158
  title: "Granted Permissions"
154
159
  }),
@@ -165,9 +170,9 @@ function j({ installation: e }) {
165
170
  })
166
171
  ] });
167
172
  }
168
- function M({ installation: e }) {
173
+ function N({ installation: e }) {
169
174
  let t = T(e);
170
- return t.length === 0 ? null : /* @__PURE__ */ b(D, { children: [/* @__PURE__ */ y(O, {
175
+ return t.length === 0 ? null : /* @__PURE__ */ b(O, { children: [/* @__PURE__ */ y(k, {
171
176
  icon: /* @__PURE__ */ y(g, { className: "size-5" }),
172
177
  title: "Event Subscriptions"
173
178
  }), /* @__PURE__ */ y("ul", {
@@ -187,51 +192,51 @@ function M({ installation: e }) {
187
192
  }, t))
188
193
  })] });
189
194
  }
190
- function N({ installation: e }) {
191
- return /* @__PURE__ */ b(D, { children: [/* @__PURE__ */ y(O, {
195
+ function P({ installation: e }) {
196
+ return /* @__PURE__ */ b(O, { children: [/* @__PURE__ */ y(k, {
192
197
  icon: /* @__PURE__ */ y(u, { className: "size-5" }),
193
198
  title: "Installation Details"
194
199
  }), /* @__PURE__ */ b("div", {
195
200
  className: "divide-y divide-border-default",
196
201
  children: [
197
- /* @__PURE__ */ y(k, {
202
+ /* @__PURE__ */ y(A, {
198
203
  label: "Product ID",
199
204
  value: e.productId
200
205
  }),
201
- e.version && /* @__PURE__ */ y(k, {
206
+ e.version && /* @__PURE__ */ y(A, {
202
207
  label: "Version",
203
208
  value: `v${e.version}`
204
209
  }),
205
- /* @__PURE__ */ y(k, {
210
+ /* @__PURE__ */ y(A, {
206
211
  label: "Status",
207
212
  value: e.status
208
213
  }),
209
- /* @__PURE__ */ y(k, {
214
+ /* @__PURE__ */ y(A, {
210
215
  label: "Workspace",
211
216
  value: e.workspaceName ?? e.workspaceId
212
217
  }),
213
- /* @__PURE__ */ y(k, {
218
+ /* @__PURE__ */ y(A, {
214
219
  label: "Installed",
215
220
  value: new Date(e.installedAt).toLocaleString()
216
221
  }),
217
- /* @__PURE__ */ y(k, {
222
+ /* @__PURE__ */ y(A, {
218
223
  label: "Last updated",
219
224
  value: new Date(e.updatedAt).toLocaleString()
220
225
  }),
221
- e.organizationId && /* @__PURE__ */ y(k, {
226
+ e.organizationId && /* @__PURE__ */ y(A, {
222
227
  label: "Organization",
223
228
  value: e.organizationId
224
229
  }),
225
- /* @__PURE__ */ y(k, {
230
+ /* @__PURE__ */ y(A, {
226
231
  label: "Installed by",
227
232
  value: e.installedById
228
233
  })
229
234
  ]
230
235
  })] });
231
236
  }
232
- function P({ installation: e }) {
237
+ function F({ installation: e }) {
233
238
  let [t, n] = r(!1);
234
- 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(D, { children: [/* @__PURE__ */ b("button", {
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", {
235
240
  type: "button",
236
241
  onClick: () => n((e) => !e),
237
242
  className: "flex w-full cursor-pointer items-center justify-between text-left",
@@ -259,7 +264,7 @@ function P({ installation: e }) {
259
264
  })] })]
260
265
  })] }) : null;
261
266
  }
262
- var F = () => {
267
+ var I = () => {
263
268
  let n = x(), { basePath: r } = e(), { installationId: o } = S(), { installation: s, loading: c, error: l } = t(o), { t: u } = i();
264
269
  return /* @__PURE__ */ b("div", {
265
270
  className: "flex h-full flex-col",
@@ -296,11 +301,11 @@ var F = () => {
296
301
  }) : s ? /* @__PURE__ */ b("div", {
297
302
  className: "space-y-4",
298
303
  children: [
299
- /* @__PURE__ */ y(A, { installation: s }),
300
304
  /* @__PURE__ */ y(j, { installation: s }),
301
305
  /* @__PURE__ */ y(M, { installation: s }),
302
306
  /* @__PURE__ */ y(N, { installation: s }),
303
307
  /* @__PURE__ */ y(P, { installation: s }),
308
+ /* @__PURE__ */ y(F, { installation: s }),
304
309
  /* @__PURE__ */ b("div", {
305
310
  className: "flex flex-wrap gap-3 pt-2",
306
311
  children: [/* @__PURE__ */ y("button", {
@@ -325,6 +330,6 @@ var F = () => {
325
330
  });
326
331
  };
327
332
  //#endregion
328
- export { F as AppSettingsPage };
333
+ export { I as AppSettingsPage };
329
334
 
330
335
  //# 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\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 isActive = installation.status === StoreInstallationStatus.Active;\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 && oauth.authorizationUrl && (\n <a\n href={oauth.authorizationUrl}\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 {oauth.authorizationUrl && (\n <a\n href={oauth.authorizationUrl}\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 && !oauth.authorizationUrl && (\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, 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-store",
3
- "version": "2026.624.6",
3
+ "version": "2026.625.2",
4
4
  "description": "Store microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [