@burdenoff/microfe-channel 2026.519.1 → 2026.520.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.
Files changed (52) hide show
  1. package/dist/channel/ChannelRoot.d.ts.map +1 -1
  2. package/dist/channel/ChannelRoot.js +23 -29
  3. package/dist/channel/ChannelRoot.js.map +1 -1
  4. package/dist/channel/components/AdapterCredentialsForm.js +7 -7
  5. package/dist/channel/components/AdapterCredentialsForm.js.map +1 -1
  6. package/dist/channel/components/FeatureNotEnabled.d.ts +3 -0
  7. package/dist/channel/components/FeatureNotEnabled.d.ts.map +1 -1
  8. package/dist/channel/components/FeatureNotEnabled.js +31 -13
  9. package/dist/channel/components/FeatureNotEnabled.js.map +1 -1
  10. package/dist/channel/hooks/useChannels.d.ts +17 -3
  11. package/dist/channel/hooks/useChannels.d.ts.map +1 -1
  12. package/dist/channel/hooks/useChannels.js +64 -18
  13. package/dist/channel/hooks/useChannels.js.map +1 -1
  14. package/dist/channel/modules/channels/pages/ChannelDashboardPage.d.ts.map +1 -1
  15. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +312 -277
  16. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
  17. package/dist/channel/modules/channels/pages/ChannelDetailsPage.d.ts.map +1 -1
  18. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +33 -33
  19. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -1
  20. package/dist/channel/modules/channels/pages/ChannelSettingsPage.d.ts.map +1 -1
  21. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +24 -24
  22. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -1
  23. package/dist/channel/modules/channels/pages/ChannelUsersPage.d.ts.map +1 -1
  24. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +206 -142
  25. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
  26. package/dist/channel/modules/channels/pages/ChannelsListPage.d.ts.map +1 -1
  27. package/dist/channel/modules/channels/pages/ChannelsListPage.js +322 -248
  28. package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -1
  29. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.d.ts.map +1 -1
  30. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +6 -6
  31. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
  32. package/dist/channel/modules/channels/pages/ConnectionsListPage.d.ts.map +1 -1
  33. package/dist/channel/modules/channels/pages/ConnectionsListPage.js +160 -112
  34. package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -1
  35. package/dist/channel/modules/channels/pages/CreateChannelPage.js +4 -4
  36. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
  37. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.d.ts.map +1 -1
  38. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +201 -133
  39. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -1
  40. package/dist/channel/modules/channels/pages/EditChannelPage.js +9 -9
  41. package/dist/channel/modules/channels/pages/EditChannelPage.js.map +1 -1
  42. package/dist/channel/modules/channels/pages/SendMessagePage.d.ts.map +1 -1
  43. package/dist/channel/modules/channels/pages/SendMessagePage.js +89 -89
  44. package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -1
  45. package/dist/channel/modules/channels/pages/WebhookEventsPage.d.ts.map +1 -1
  46. package/dist/channel/modules/channels/pages/WebhookEventsPage.js +126 -58
  47. package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -1
  48. package/dist/generated/global-operations.d.ts +2 -0
  49. package/dist/generated/global-operations.d.ts.map +1 -1
  50. package/dist/generated/global-operations.js +2 -0
  51. package/dist/generated/global-operations.js.map +1 -1
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelRoot.d.ts","sourceRoot":"","sources":["../../src/channel/ChannelRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAOhC,OAAO,KAAK,EAAW,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAiG5C,CAAC"}
1
+ {"version":3,"file":"ChannelRoot.d.ts","sourceRoot":"","sources":["../../src/channel/ChannelRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAMhC,OAAO,KAAK,EAAW,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA+F5C,CAAC"}
@@ -5,77 +5,71 @@ import { ErrorBoundary as i } from "@burdenoff/fe-libs/shared/components";
5
5
  import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
6
  import { Cable as o, Radio as s, Send as c, Settings as l } from "lucide-react";
7
7
  import { jsx as u } from "react/jsx-runtime";
8
- import { FeatureFlagProvider as d } from "@burdenoff/fe-libs/shared/feature-flags";
9
8
  //#region src/channel/ChannelRoot.tsx
10
- var f = (f) => {
11
- let { registerNavItems: p, registerFooterItems: m, basePath: h = "/" } = f, { t: g } = a(), _ = n((e, t) => {
12
- let n = g(e);
9
+ var d = (d) => {
10
+ let { registerNavItems: f, registerFooterItems: p, basePath: m = "/" } = d, { t: h } = a(), g = n((e, t) => {
11
+ let n = h(e);
13
12
  return n === e ? t : n;
14
- }, [g]), v = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
13
+ }, [h]), _ = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
15
14
  return r(() => {
16
- if (p) return p([
15
+ if (f) return f([
17
16
  {
18
17
  id: "channel-channels",
19
- label: _("channel.channels", "Channels"),
20
- path: h === "/" ? "/" : v(h, "list"),
18
+ label: g("channel.channels", "Channels"),
19
+ path: m === "/" ? "/" : _(m, "list"),
21
20
  icon: /* @__PURE__ */ u(s, { size: 20 }),
22
21
  order: 100,
23
22
  group: "channel"
24
23
  },
25
24
  {
26
25
  id: "channel-connections",
27
- label: _("channel.connections", "Connections"),
28
- path: v(h, "connections"),
26
+ label: g("channel.connections", "Connections"),
27
+ path: _(m, "connections"),
29
28
  icon: /* @__PURE__ */ u(o, { size: 20 }),
30
29
  order: 110,
31
30
  group: "channel"
32
31
  },
33
32
  {
34
33
  id: "channel-send",
35
- label: _("channel.sendMessage", "Send Message"),
36
- path: v(h, "send"),
34
+ label: g("channel.sendMessage", "Send Message"),
35
+ path: _(m, "send"),
37
36
  icon: /* @__PURE__ */ u(c, { size: 20 }),
38
37
  order: 120,
39
38
  group: "channel"
40
39
  },
41
40
  {
42
41
  id: "channel-settings",
43
- label: _("channel.settings", "Settings"),
44
- path: v(h, "settings"),
42
+ label: g("channel.settings", "Settings"),
43
+ path: _(m, "settings"),
45
44
  icon: /* @__PURE__ */ u(l, { size: 20 }),
46
45
  order: 130,
47
46
  group: "channel"
48
47
  }
49
48
  ]);
50
49
  }, [
51
- p,
52
- h,
53
- _
50
+ f,
51
+ m,
52
+ g
54
53
  ]), r(() => {
55
- if (m) return m([{
54
+ if (p) return p([{
56
55
  id: "channel-status",
57
- label: _("channel.channelsReady", "Channels Ready"),
56
+ label: g("channel.channelsReady", "Channels Ready"),
58
57
  type: "status",
59
58
  order: 10,
60
59
  section: "left"
61
60
  }]);
62
- }, [m, _]), /* @__PURE__ */ u(i, {
61
+ }, [p, g]), /* @__PURE__ */ u(i, {
63
62
  fallback: /* @__PURE__ */ u("div", {
64
63
  className: "p-6 text-center text-text-secondary",
65
64
  children: "Something went wrong loading this module. Please refresh the page."
66
65
  }),
67
- children: /* @__PURE__ */ u(d, {
68
- workspaceId: null,
69
- gateway: "global",
70
- defaultEnabled: !1,
71
- children: /* @__PURE__ */ u(e, {
72
- ...f,
73
- children: /* @__PURE__ */ u(t, {})
74
- })
66
+ children: /* @__PURE__ */ u(e, {
67
+ ...d,
68
+ children: /* @__PURE__ */ u(t, {})
75
69
  })
76
70
  });
77
71
  };
78
72
  //#endregion
79
- export { f as ChannelRoot };
73
+ export { d as ChannelRoot };
80
74
 
81
75
  //# sourceMappingURL=ChannelRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelRoot.js","names":[],"sources":["../../src/channel/ChannelRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect, useCallback } from 'react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Radio, Cable, Send, Settings } from 'lucide-react';\nimport { ChannelProvider } from './providers/ChannelProvider';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport type { NavItem, ChannelRootProps } from './types';\nimport { ChannelRoutes } from './ChannelRoutes';\n\n/**\n * Root component for the Channel microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { ChannelRoot, type ChannelRootProps } from '@burdenoff/microfe-channel';\n *\n * function App() {\n * const props: ChannelRootProps = {\n * basePath: '/channels',\n * navigate: (path) => router.push(path),\n * currentUser: { id: '1', email: 'user@example.com', firstName: 'John', lastName: 'Doe' },\n * workspaceId: 'ws-123',\n * organizationId: 'org-123',\n * apiGatewayUrl: 'https://api.example.com/workspaces/graphql',\n * authToken: 'token',\n * registerNavItems: (items) => { return () => {}; },\n * };\n *\n * return <ChannelRoot {...props} />;\n * }\n * ```\n */\nexport const ChannelRoot: FC<ChannelRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'channel-channels',\n label: tr('channel.channels', 'Channels'),\n path: basePath === '/' ? '/' : joinPath(basePath, 'list'),\n icon: <Radio size={20} />,\n order: 100,\n group: 'channel',\n },\n {\n id: 'channel-connections',\n label: tr('channel.connections', 'Connections'),\n path: joinPath(basePath, 'connections'),\n icon: <Cable size={20} />,\n order: 110,\n group: 'channel',\n },\n {\n id: 'channel-send',\n label: tr('channel.sendMessage', 'Send Message'),\n path: joinPath(basePath, 'send'),\n icon: <Send size={20} />,\n order: 120,\n group: 'channel',\n },\n {\n id: 'channel-settings',\n label: tr('channel.settings', 'Settings'),\n path: joinPath(basePath, 'settings'),\n icon: <Settings size={20} />,\n order: 130,\n group: 'channel',\n },\n ];\n\n // Register and get cleanup function\n const cleanup = registerNavItems(navItems);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath, tr]);\n\n // Register footer items (example: Channel status indicator in left section)\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'channel-status',\n label: tr('channel.channelsReady', 'Channels Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, tr]);\n\n return (\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={false}>\n <ChannelProvider {...props}>\n <ChannelRoutes />\n </ChannelProvider>\n </FeatureFlagProvider>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;AAqCA,IAAa,KAAqC,MAAU;CAC1D,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,QAAQ,GAC5D,EAAE,SAAM,GAAS,EACjB,IAAK,GACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAGK,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAoEtD,QA/DA,QAAgB;AACT,QAyCL,QAHgB,EApCY;GAC1B;IACE,IAAI;IACJ,OAAO,EAAG,oBAAoB,WAAW;IACzC,MAAM,MAAa,MAAM,MAAM,EAAS,GAAU,OAAO;IACzD,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAG,uBAAuB,cAAc;IAC/C,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAG,uBAAuB,eAAe;IAChD,MAAM,EAAS,GAAU,OAAO;IAChC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAG,oBAAoB,WAAW;IACzC,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACF,CAGyC;IAIzC;EAAC;EAAkB;EAAU;EAAG,CAAC,EAGpC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO,EAAG,yBAAyB,iBAAiB;GACpD,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,GAAqB,EAAG,CAAC,EAG3B,kBAAC,GAAD;EACE,UACE,kBAAC,OAAD;GAAK,WAAU;aAAsC;GAE/C,CAAA;YAGR,kBAAC,GAAD;GAAqB,aAAa;GAAM,SAAQ;GAAS,gBAAgB;aACvE,kBAAC,GAAD;IAAiB,GAAI;cACnB,kBAAC,GAAD,EAAiB,CAAA;IACD,CAAA;GACE,CAAA;EACR,CAAA"}
1
+ {"version":3,"file":"ChannelRoot.js","names":[],"sources":["../../src/channel/ChannelRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect, useCallback } from 'react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Radio, Cable, Send, Settings } from 'lucide-react';\nimport { ChannelProvider } from './providers/ChannelProvider';\nimport type { NavItem, ChannelRootProps } from './types';\nimport { ChannelRoutes } from './ChannelRoutes';\n\n/**\n * Root component for the Channel microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { ChannelRoot, type ChannelRootProps } from '@burdenoff/microfe-channel';\n *\n * function App() {\n * const props: ChannelRootProps = {\n * basePath: '/channels',\n * navigate: (path) => router.push(path),\n * currentUser: { id: '1', email: 'user@example.com', firstName: 'John', lastName: 'Doe' },\n * workspaceId: 'ws-123',\n * organizationId: 'org-123',\n * apiGatewayUrl: 'https://api.example.com/workspaces/graphql',\n * authToken: 'token',\n * registerNavItems: (items) => { return () => {}; },\n * };\n *\n * return <ChannelRoot {...props} />;\n * }\n * ```\n */\nexport const ChannelRoot: FC<ChannelRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'channel-channels',\n label: tr('channel.channels', 'Channels'),\n path: basePath === '/' ? '/' : joinPath(basePath, 'list'),\n icon: <Radio size={20} />,\n order: 100,\n group: 'channel',\n },\n {\n id: 'channel-connections',\n label: tr('channel.connections', 'Connections'),\n path: joinPath(basePath, 'connections'),\n icon: <Cable size={20} />,\n order: 110,\n group: 'channel',\n },\n {\n id: 'channel-send',\n label: tr('channel.sendMessage', 'Send Message'),\n path: joinPath(basePath, 'send'),\n icon: <Send size={20} />,\n order: 120,\n group: 'channel',\n },\n {\n id: 'channel-settings',\n label: tr('channel.settings', 'Settings'),\n path: joinPath(basePath, 'settings'),\n icon: <Settings size={20} />,\n order: 130,\n group: 'channel',\n },\n ];\n\n // Register and get cleanup function\n const cleanup = registerNavItems(navItems);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath, tr]);\n\n // Register footer items (example: Channel status indicator in left section)\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'channel-status',\n label: tr('channel.channelsReady', 'Channels Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, tr]);\n\n return (\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <ChannelProvider {...props}>\n <ChannelRoutes />\n </ChannelProvider>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;AAoCA,IAAa,KAAqC,MAAU;CAC1D,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,QAAQ,GAC5D,EAAE,SAAM,GAAS,EACjB,IAAK,GACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAGK,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAoEtD,QA/DA,QAAgB;AACT,QAyCL,QAHgB,EApCY;GAC1B;IACE,IAAI;IACJ,OAAO,EAAG,oBAAoB,WAAW;IACzC,MAAM,MAAa,MAAM,MAAM,EAAS,GAAU,OAAO;IACzD,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAG,uBAAuB,cAAc;IAC/C,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAG,uBAAuB,eAAe;IAChD,MAAM,EAAS,GAAU,OAAO;IAChC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAG,oBAAoB,WAAW;IACzC,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACF,CAGyC;IAIzC;EAAC;EAAkB;EAAU;EAAG,CAAC,EAGpC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO,EAAG,yBAAyB,iBAAiB;GACpD,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,GAAqB,EAAG,CAAC,EAG3B,kBAAC,GAAD;EACE,UACE,kBAAC,OAAD;GAAK,WAAU;aAAsC;GAE/C,CAAA;YAGR,kBAAC,GAAD;GAAiB,GAAI;aACnB,kBAAC,GAAD,EAAiB,CAAA;GACD,CAAA;EACJ,CAAA"}
@@ -34,12 +34,12 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
34
34
  })
35
35
  });
36
36
  if (!T) return /* @__PURE__ */ f("div", {
37
- className: "p-4 bg-warning-100 border border-warning-300 rounded-lg",
37
+ className: "p-4 bg-status-warning-bg-subtle border border-warning-300 rounded-lg",
38
38
  children: /* @__PURE__ */ p("div", {
39
39
  className: "flex items-start gap-2",
40
40
  children: [/* @__PURE__ */ f(o, {
41
41
  size: 16,
42
- className: "text-warning-500 mt-0.5"
42
+ className: "text-status-warning-text mt-0.5"
43
43
  }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("p", {
44
44
  className: "text-sm font-medium text-warning-700",
45
45
  children: [
@@ -69,12 +69,12 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
69
69
  [e]: !t[e]
70
70
  }));
71
71
  }, k = (e) => {
72
- let t = m[e.key], n = C[e.key] && e.required && !t, r = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${n ? "border-error-500" : "border-border"}`;
72
+ let t = m[e.key], n = C[e.key] && e.required && !t, r = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${n ? "border-status-error-border" : "border-border"}`;
73
73
  return /* @__PURE__ */ p("div", { children: [
74
74
  /* @__PURE__ */ p("label", {
75
75
  className: "block text-sm font-medium text-foreground mb-1.5",
76
76
  children: [e.displayName, e.required && /* @__PURE__ */ f("span", {
77
- className: "text-error-500 ml-1",
77
+ className: "text-status-error-text ml-1",
78
78
  children: "*"
79
79
  })]
80
80
  }),
@@ -159,7 +159,7 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
159
159
  children: e.description
160
160
  }),
161
161
  n && /* @__PURE__ */ f("p", {
162
- className: "mt-1 text-xs text-error-500",
162
+ className: "mt-1 text-xs text-status-error-text",
163
163
  children: b("channel.fieldRequired", "This field is required")
164
164
  })
165
165
  ] }, e.key);
@@ -207,13 +207,13 @@ function h({ adapterType: e, credentials: t }) {
207
207
  if (!e) return null;
208
208
  let { valid: c, errors: l } = n(e, t);
209
209
  return c ? /* @__PURE__ */ p("div", {
210
- className: "flex items-center gap-1.5 text-success-500",
210
+ className: "flex items-center gap-1.5 text-status-success-text",
211
211
  children: [/* @__PURE__ */ f(s, { size: 14 }), /* @__PURE__ */ f("span", {
212
212
  className: "text-xs",
213
213
  children: i("channel.allRequiredFieldsFilled", "All required fields filled")
214
214
  })]
215
215
  }) : /* @__PURE__ */ p("div", {
216
- className: "flex items-center gap-1.5 text-warning-500",
216
+ className: "flex items-center gap-1.5 text-status-warning-text",
217
217
  children: [/* @__PURE__ */ f(o, { size: 14 }), /* @__PURE__ */ p("span", {
218
218
  className: "text-xs",
219
219
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterCredentialsForm.js","names":[],"sources":["../../../src/channel/components/AdapterCredentialsForm.tsx"],"sourcesContent":["/**\n * Adapter Credentials Form\n *\n * Dynamic form that renders credential fields based on the selected adapter type.\n * Field names match exactly what the backend adapters expect.\n */\n\nimport { useState, useEffect } from 'react';\nimport { ExternalLink, Eye, EyeOff, AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { AdapterType } from '../hooks/useChannels';\nimport {\n getAdapterCredentialSchema,\n getDefaultCredentials,\n validateCredentials,\n type CredentialField,\n} from '../config/adapterCredentials';\n\ninterface AdapterCredentialsFormProps {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n onChange: (credentials: Record<string, unknown>) => void;\n onValidationChange?: (isValid: boolean, errors: string[]) => void;\n disabled?: boolean;\n showPlatformMetadata?: boolean;\n}\n\nexport function AdapterCredentialsForm({\n adapterType,\n credentials,\n onChange,\n onValidationChange,\n disabled = false,\n showPlatformMetadata = true,\n}: AdapterCredentialsFormProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [showPasswords, setShowPasswords] = useState<Record<string, boolean>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n const schema = getAdapterCredentialSchema(adapterType);\n\n // Initialize with default values when adapter type changes\n useEffect(() => {\n if (adapterType) {\n const defaults = getDefaultCredentials(adapterType);\n const merged = { ...defaults, ...credentials };\n if (JSON.stringify(merged) !== JSON.stringify(credentials)) {\n onChange(merged);\n }\n }\n }, [adapterType]);\n\n // Validate on change\n useEffect(() => {\n if (onValidationChange && adapterType) {\n const { valid, errors } = validateCredentials(adapterType, credentials);\n onValidationChange(valid, errors);\n }\n }, [credentials, adapterType, onValidationChange]);\n\n if (!adapterType) {\n return (\n <div className=\"text-center py-6 text-muted-foreground\">\n <p className=\"text-sm\">\n {tr('channel.selectAdapterType', 'Select an adapter type to configure credentials')}\n </p>\n </div>\n );\n }\n\n if (!schema) {\n return (\n <div className=\"p-4 bg-warning-100 border border-warning-300 rounded-lg\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle size={16} className=\"text-warning-500 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-warning-700\">\n {tr('channel.noCredentialSchema', 'No credential schema defined for')} {adapterType}\n </p>\n <p className=\"text-xs text-warning-600 mt-1\">\n {tr(\n 'channel.enterCredentialsAsJson',\n 'You can still enter credentials as JSON in the raw format below.'\n )}\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n const handleFieldChange = (key: string, value: unknown) => {\n onChange({ ...credentials, [key]: value });\n };\n\n const handleFieldBlur = (key: string) => {\n setTouched((prev) => ({ ...prev, [key]: true }));\n };\n\n const togglePasswordVisibility = (key: string) => {\n setShowPasswords((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n const renderField = (field: CredentialField) => {\n const value = credentials[field.key];\n const fieldError = touched[field.key] && field.required && !value;\n\n const commonInputClasses = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${\n fieldError ? 'border-error-500' : 'border-border'\n }`;\n\n return (\n <div key={field.key}>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {field.displayName}\n {field.required && <span className=\"text-error-500 ml-1\">*</span>}\n </label>\n\n {field.type === 'text' && (\n <input\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'password' && (\n <div className=\"relative\">\n <input\n type={showPasswords[field.key] ? 'text' : 'password'}\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={`${commonInputClasses} pr-10`}\n />\n <button\n type=\"button\"\n onClick={() => togglePasswordVisibility(field.key)}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-muted-foreground hover:text-foreground\"\n tabIndex={-1}\n >\n {showPasswords[field.key] ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n )}\n\n {field.type === 'textarea' && (\n <textarea\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n rows={4}\n className={`${commonInputClasses} resize-none font-mono text-xs`}\n />\n )}\n\n {field.type === 'number' && (\n <input\n type=\"number\"\n value={(value as number) ?? field.defaultValue ?? ''}\n onChange={(e) =>\n handleFieldChange(field.key, e.target.value ? Number(e.target.value) : undefined)\n }\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'boolean' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={(value as boolean) ?? field.defaultValue ?? false}\n onChange={(e) => handleFieldChange(field.key, e.target.checked)}\n disabled={disabled}\n className=\"w-4 h-4 rounded border-border text-accent-primary focus:ring-accent-primary\"\n />\n <span className=\"text-sm text-muted-foreground\">{field.description}</span>\n </label>\n )}\n\n {field.type === 'select' && field.options && (\n <select\n value={(value as string) ?? field.defaultValue ?? ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n className={`${commonInputClasses} bg-bg-surface`}\n >\n <option value=\"\">\n {tr('channel.select', 'Select')} {field.displayName.toLowerCase()}\n </option>\n {field.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )}\n\n {field.type !== 'boolean' && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{field.description}</p>\n )}\n\n {fieldError && (\n <p className=\"mt-1 text-xs text-error-500\">\n {tr('channel.fieldRequired', 'This field is required')}\n </p>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Header with adapter info */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{schema.displayName}</h3>\n <p className=\"text-xs text-muted-foreground mt-0.5\">{schema.description}</p>\n </div>\n {schema.docUrl && (\n <a\n href={schema.docUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-xs text-accent-primary hover:text-accent-primary-hover\"\n >\n <span>{tr('channel.docs', 'Docs')}</span>\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n\n {/* Credential fields */}\n <div className=\"space-y-4\">\n {schema.credentials.length > 0 && (\n <div className=\"space-y-4\">{schema.credentials.map(renderField)}</div>\n )}\n\n {/* Platform metadata fields (optional settings) */}\n {showPlatformMetadata && schema.platformMetadata && schema.platformMetadata.length > 0 && (\n <>\n <div className=\"border-t border-border pt-4 mt-4\">\n <p className=\"text-xs font-medium text-muted-foreground mb-3\">\n {tr('channel.optionalSettings', 'Optional Settings')}\n </p>\n <div className=\"space-y-4\">{schema.platformMetadata.map(renderField)}</div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Compact validation status indicator\n */\nexport function CredentialValidationStatus({\n adapterType,\n credentials,\n}: {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n}) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n if (!adapterType) return null;\n\n const { valid, errors } = validateCredentials(adapterType, credentials);\n\n if (valid) {\n return (\n <div className=\"flex items-center gap-1.5 text-success-500\">\n <CheckCircle2 size={14} />\n <span className=\"text-xs\">\n {tr('channel.allRequiredFieldsFilled', 'All required fields filled')}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-warning-500\">\n <AlertCircle size={14} />\n <span className=\"text-xs\">\n {errors.length} {tr('channel.fieldsNeedAttention', 'field(s) need attention')}\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdapterCredentialsForm.js","names":[],"sources":["../../../src/channel/components/AdapterCredentialsForm.tsx"],"sourcesContent":["/**\n * Adapter Credentials Form\n *\n * Dynamic form that renders credential fields based on the selected adapter type.\n * Field names match exactly what the backend adapters expect.\n */\n\nimport { useState, useEffect } from 'react';\nimport { ExternalLink, Eye, EyeOff, AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { AdapterType } from '../hooks/useChannels';\nimport {\n getAdapterCredentialSchema,\n getDefaultCredentials,\n validateCredentials,\n type CredentialField,\n} from '../config/adapterCredentials';\n\ninterface AdapterCredentialsFormProps {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n onChange: (credentials: Record<string, unknown>) => void;\n onValidationChange?: (isValid: boolean, errors: string[]) => void;\n disabled?: boolean;\n showPlatformMetadata?: boolean;\n}\n\nexport function AdapterCredentialsForm({\n adapterType,\n credentials,\n onChange,\n onValidationChange,\n disabled = false,\n showPlatformMetadata = true,\n}: AdapterCredentialsFormProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [showPasswords, setShowPasswords] = useState<Record<string, boolean>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n const schema = getAdapterCredentialSchema(adapterType);\n\n // Initialize with default values when adapter type changes\n useEffect(() => {\n if (adapterType) {\n const defaults = getDefaultCredentials(adapterType);\n const merged = { ...defaults, ...credentials };\n if (JSON.stringify(merged) !== JSON.stringify(credentials)) {\n onChange(merged);\n }\n }\n }, [adapterType]);\n\n // Validate on change\n useEffect(() => {\n if (onValidationChange && adapterType) {\n const { valid, errors } = validateCredentials(adapterType, credentials);\n onValidationChange(valid, errors);\n }\n }, [credentials, adapterType, onValidationChange]);\n\n if (!adapterType) {\n return (\n <div className=\"text-center py-6 text-muted-foreground\">\n <p className=\"text-sm\">\n {tr('channel.selectAdapterType', 'Select an adapter type to configure credentials')}\n </p>\n </div>\n );\n }\n\n if (!schema) {\n return (\n <div className=\"p-4 bg-status-warning-bg-subtle border border-warning-300 rounded-lg\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle size={16} className=\"text-status-warning-text mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-warning-700\">\n {tr('channel.noCredentialSchema', 'No credential schema defined for')} {adapterType}\n </p>\n <p className=\"text-xs text-warning-600 mt-1\">\n {tr(\n 'channel.enterCredentialsAsJson',\n 'You can still enter credentials as JSON in the raw format below.'\n )}\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n const handleFieldChange = (key: string, value: unknown) => {\n onChange({ ...credentials, [key]: value });\n };\n\n const handleFieldBlur = (key: string) => {\n setTouched((prev) => ({ ...prev, [key]: true }));\n };\n\n const togglePasswordVisibility = (key: string) => {\n setShowPasswords((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n const renderField = (field: CredentialField) => {\n const value = credentials[field.key];\n const fieldError = touched[field.key] && field.required && !value;\n\n const commonInputClasses = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${\n fieldError ? 'border-status-error-border' : 'border-border'\n }`;\n\n return (\n <div key={field.key}>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {field.displayName}\n {field.required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n\n {field.type === 'text' && (\n <input\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'password' && (\n <div className=\"relative\">\n <input\n type={showPasswords[field.key] ? 'text' : 'password'}\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={`${commonInputClasses} pr-10`}\n />\n <button\n type=\"button\"\n onClick={() => togglePasswordVisibility(field.key)}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-muted-foreground hover:text-foreground\"\n tabIndex={-1}\n >\n {showPasswords[field.key] ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n )}\n\n {field.type === 'textarea' && (\n <textarea\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n rows={4}\n className={`${commonInputClasses} resize-none font-mono text-xs`}\n />\n )}\n\n {field.type === 'number' && (\n <input\n type=\"number\"\n value={(value as number) ?? field.defaultValue ?? ''}\n onChange={(e) =>\n handleFieldChange(field.key, e.target.value ? Number(e.target.value) : undefined)\n }\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'boolean' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={(value as boolean) ?? field.defaultValue ?? false}\n onChange={(e) => handleFieldChange(field.key, e.target.checked)}\n disabled={disabled}\n className=\"w-4 h-4 rounded border-border text-accent-primary focus:ring-accent-primary\"\n />\n <span className=\"text-sm text-muted-foreground\">{field.description}</span>\n </label>\n )}\n\n {field.type === 'select' && field.options && (\n <select\n value={(value as string) ?? field.defaultValue ?? ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n className={`${commonInputClasses} bg-bg-surface`}\n >\n <option value=\"\">\n {tr('channel.select', 'Select')} {field.displayName.toLowerCase()}\n </option>\n {field.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )}\n\n {field.type !== 'boolean' && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{field.description}</p>\n )}\n\n {fieldError && (\n <p className=\"mt-1 text-xs text-status-error-text\">\n {tr('channel.fieldRequired', 'This field is required')}\n </p>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Header with adapter info */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{schema.displayName}</h3>\n <p className=\"text-xs text-muted-foreground mt-0.5\">{schema.description}</p>\n </div>\n {schema.docUrl && (\n <a\n href={schema.docUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-xs text-accent-primary hover:text-accent-primary-hover\"\n >\n <span>{tr('channel.docs', 'Docs')}</span>\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n\n {/* Credential fields */}\n <div className=\"space-y-4\">\n {schema.credentials.length > 0 && (\n <div className=\"space-y-4\">{schema.credentials.map(renderField)}</div>\n )}\n\n {/* Platform metadata fields (optional settings) */}\n {showPlatformMetadata && schema.platformMetadata && schema.platformMetadata.length > 0 && (\n <>\n <div className=\"border-t border-border pt-4 mt-4\">\n <p className=\"text-xs font-medium text-muted-foreground mb-3\">\n {tr('channel.optionalSettings', 'Optional Settings')}\n </p>\n <div className=\"space-y-4\">{schema.platformMetadata.map(renderField)}</div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Compact validation status indicator\n */\nexport function CredentialValidationStatus({\n adapterType,\n credentials,\n}: {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n}) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n if (!adapterType) return null;\n\n const { valid, errors } = validateCredentials(adapterType, credentials);\n\n if (valid) {\n return (\n <div className=\"flex items-center gap-1.5 text-status-success-text\">\n <CheckCircle2 size={14} />\n <span className=\"text-xs\">\n {tr('channel.allRequiredFieldsFilled', 'All required fields filled')}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-status-warning-text\">\n <AlertCircle size={14} />\n <span className=\"text-xs\">\n {errors.length} {tr('channel.fieldsNeedAttention', 'field(s) need attention')}\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -4,6 +4,9 @@ interface FeatureNotEnabledProps {
4
4
  /**
5
5
  * Default fallback rendered when a feature flag is disabled. Behaves as a
6
6
  * "404-style" panel — never throws, never crashes the route.
7
+ *
8
+ * - The flag key is only shown to super admins (developer-facing detail).
9
+ * - The CTA links to Feature Previews so admins can enable the flag directly.
7
10
  */
8
11
  export declare function FeatureNotEnabled({ flag }: FeatureNotEnabledProps): import("react/jsx-runtime").JSX.Element;
9
12
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureNotEnabled.d.ts","sourceRoot":"","sources":["../../../src/channel/components/FeatureNotEnabled.tsx"],"names":[],"mappings":"AAEA,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,sBAAsB,2CAgBjE"}
1
+ {"version":3,"file":"FeatureNotEnabled.d.ts","sourceRoot":"","sources":["../../../src/channel/components/FeatureNotEnabled.tsx"],"names":[],"mappings":"AAGA,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,sBAAsB,2CAkCjE"}
@@ -1,32 +1,50 @@
1
1
  import { Lock as e } from "lucide-react";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
2
+ import { usePermissions as t } from "@burdenoff/fe-libs/shared/providers/shell";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
4
  //#region src/channel/components/FeatureNotEnabled.tsx
4
- function r({ flag: r }) {
5
- return /* @__PURE__ */ n("div", {
5
+ function i({ flag: i }) {
6
+ let { hasRole: a } = t(), o = a("SUPER_ADMIN");
7
+ return /* @__PURE__ */ r("div", {
6
8
  className: "flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6",
7
- children: [/* @__PURE__ */ t("div", {
9
+ children: [/* @__PURE__ */ n("div", {
8
10
  className: "p-3 rounded-full bg-bg-elevated",
9
- children: /* @__PURE__ */ t(e, { className: "h-8 w-8 text-fg-muted" })
10
- }), /* @__PURE__ */ n("div", {
11
+ children: /* @__PURE__ */ n(e, { className: "h-8 w-8 text-fg-muted" })
12
+ }), /* @__PURE__ */ r("div", {
11
13
  className: "space-y-2 max-w-md",
12
14
  children: [
13
- /* @__PURE__ */ t("h3", {
15
+ /* @__PURE__ */ n("h3", {
14
16
  className: "text-lg font-semibold text-fg",
15
17
  children: "Feature not enabled"
16
18
  }),
17
- /* @__PURE__ */ t("p", {
19
+ /* @__PURE__ */ n("p", {
18
20
  className: "text-sm text-fg-muted",
19
- children: "This feature is currently disabled for your workspace. Contact your administrator if you believe this is in error."
21
+ children: "This feature is currently disabled for your workspace."
20
22
  }),
21
- /* @__PURE__ */ n("p", {
22
- className: "text-xs text-fg-subtle font-mono",
23
- children: ["flag: ", r]
23
+ o ? /* @__PURE__ */ r("p", {
24
+ className: "text-sm text-fg-muted",
25
+ children: [
26
+ "You can enable it in",
27
+ " ",
28
+ /* @__PURE__ */ n("a", {
29
+ href: "/feature-previews",
30
+ className: "text-action-primary-text underline underline-offset-2 hover:text-action-primary-text-hover",
31
+ children: "Feature Previews"
32
+ }),
33
+ "."
34
+ ]
35
+ }) : /* @__PURE__ */ n("p", {
36
+ className: "text-sm text-fg-muted",
37
+ children: "Contact your administrator if you believe this is in error."
38
+ }),
39
+ o && /* @__PURE__ */ r("p", {
40
+ className: "text-xs text-fg-subtle font-mono mt-1",
41
+ children: ["flag: ", i]
24
42
  })
25
43
  ]
26
44
  })]
27
45
  });
28
46
  }
29
47
  //#endregion
30
- export { r as FeatureNotEnabled };
48
+ export { i as FeatureNotEnabled };
31
49
 
32
50
  //# sourceMappingURL=FeatureNotEnabled.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureNotEnabled.js","names":[],"sources":["../../../src/channel/components/FeatureNotEnabled.tsx"],"sourcesContent":["import { Lock } from 'lucide-react';\n\ninterface FeatureNotEnabledProps {\n flag: string;\n}\n\n/**\n * Default fallback rendered when a feature flag is disabled. Behaves as a\n * \"404-style\" panel — never throws, never crashes the route.\n */\nexport function FeatureNotEnabled({ flag }: FeatureNotEnabledProps) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6\">\n <div className=\"p-3 rounded-full bg-bg-elevated\">\n <Lock className=\"h-8 w-8 text-fg-muted\" />\n </div>\n <div className=\"space-y-2 max-w-md\">\n <h3 className=\"text-lg font-semibold text-fg\">Feature not enabled</h3>\n <p className=\"text-sm text-fg-muted\">\n This feature is currently disabled for your workspace. Contact your administrator if you\n believe this is in error.\n </p>\n <p className=\"text-xs text-fg-subtle font-mono\">flag: {flag}</p>\n </div>\n </div>\n );\n}\n"],"mappings":";;;AAUA,SAAgB,EAAkB,EAAE,WAAgC;AAClE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAM,WAAU,yBAA0B,CAAA;GACtC,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,MAAD;KAAI,WAAU;eAAgC;KAAwB,CAAA;IACtE,kBAAC,KAAD;KAAG,WAAU;eAAwB;KAGjC,CAAA;IACJ,kBAAC,KAAD;KAAG,WAAU;eAAb,CAAgD,UAAO,EAAS;;IAC5D;KACF"}
1
+ {"version":3,"file":"FeatureNotEnabled.js","names":[],"sources":["../../../src/channel/components/FeatureNotEnabled.tsx"],"sourcesContent":["import { Lock } from 'lucide-react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\n\ninterface FeatureNotEnabledProps {\n flag: string;\n}\n\n/**\n * Default fallback rendered when a feature flag is disabled. Behaves as a\n * \"404-style\" panel — never throws, never crashes the route.\n *\n * - The flag key is only shown to super admins (developer-facing detail).\n * - The CTA links to Feature Previews so admins can enable the flag directly.\n */\nexport function FeatureNotEnabled({ flag }: FeatureNotEnabledProps) {\n const { hasRole } = usePermissions();\n const isSuperAdmin = hasRole('SUPER_ADMIN');\n\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6\">\n <div className=\"p-3 rounded-full bg-bg-elevated\">\n <Lock className=\"h-8 w-8 text-fg-muted\" />\n </div>\n <div className=\"space-y-2 max-w-md\">\n <h3 className=\"text-lg font-semibold text-fg\">Feature not enabled</h3>\n <p className=\"text-sm text-fg-muted\">\n This feature is currently disabled for your workspace.\n </p>\n {isSuperAdmin ? (\n <p className=\"text-sm text-fg-muted\">\n You can enable it in{' '}\n <a\n href=\"/feature-previews\"\n className=\"text-action-primary-text underline underline-offset-2 hover:text-action-primary-text-hover\"\n >\n Feature Previews\n </a>\n .\n </p>\n ) : (\n <p className=\"text-sm text-fg-muted\">\n Contact your administrator if you believe this is in error.\n </p>\n )}\n {isSuperAdmin && <p className=\"text-xs text-fg-subtle font-mono mt-1\">flag: {flag}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AAcA,SAAgB,EAAkB,EAAE,WAAgC;CAClE,IAAM,EAAE,eAAY,GAAgB,EAC9B,IAAe,EAAQ,cAAc;AAE3C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAM,WAAU,yBAA0B,CAAA;GACtC,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,MAAD;KAAI,WAAU;eAAgC;KAAwB,CAAA;IACtE,kBAAC,KAAD;KAAG,WAAU;eAAwB;KAEjC,CAAA;IACH,IACC,kBAAC,KAAD;KAAG,WAAU;eAAb;MAAqC;MACd;MACrB,kBAAC,KAAD;OACE,MAAK;OACL,WAAU;iBACX;OAEG,CAAA;;MAEF;SAEJ,kBAAC,KAAD;KAAG,WAAU;eAAwB;KAEjC,CAAA;IAEL,KAAgB,kBAAC,KAAD;KAAG,WAAU;eAAb,CAAqD,UAAO,EAAS;;IAClF;KACF"}
@@ -202,9 +202,23 @@ export declare function useChannel(id: string | undefined): {
202
202
  subject?: string;
203
203
  html?: string;
204
204
  }) => Promise<ChannelDeliveryResult | null>;
205
- fetchDeliveryAttempts: (limit?: number) => Promise<DeliveryAttempt[]>;
206
- fetchWebhookEvents: (limit?: number) => Promise<WebhookEvent[]>;
207
- fetchUserPlatformConnections: (limit?: number) => Promise<UserPlatformConnection[]>;
205
+ fetchDeliveryAttempts: (limit?: number, cursor?: string) => Promise<{
206
+ items: DeliveryAttempt[];
207
+ nextCursor?: string;
208
+ hasMore: boolean;
209
+ total: number;
210
+ }>;
211
+ fetchWebhookEvents: (limit?: number, cursor?: string) => Promise<{
212
+ items: WebhookEvent[];
213
+ nextCursor?: string;
214
+ hasMore: boolean;
215
+ total: number;
216
+ }>;
217
+ fetchUserPlatformConnections: (limit?: number, offset?: number) => Promise<{
218
+ items: UserPlatformConnection[];
219
+ hasMore: boolean;
220
+ total: number;
221
+ }>;
208
222
  retryDelivery: (attemptId: string) => Promise<{
209
223
  success: boolean;
210
224
  error?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useChannels.d.ts","sourceRoot":"","sources":["../../../src/channel/hooks/useChannels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useChannels.d.ts","sourceRoot":"","sources":["../../../src/channel/hooks/useChannels.ts"],"names":[],"mappings":"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"}
@@ -313,20 +313,35 @@ function D(n) {
313
313
  } catch (e) {
314
314
  throw T(e, "Failed to send test message"), e;
315
315
  }
316
- }, [c, A]), z = S(async (e = 50) => {
317
- if (!n) return [];
316
+ }, [c, A]), z = S(async (e = 25, t) => {
317
+ if (!n) return {
318
+ items: [],
319
+ hasMore: !1,
320
+ total: 0
321
+ };
318
322
  try {
319
- return (await A().query({
323
+ let r = (await A().query({
320
324
  query: p,
321
325
  variables: {
322
326
  channelId: n,
323
- limit: e
327
+ limit: e,
328
+ cursor: t
324
329
  },
325
330
  fetchPolicy: "network-only"
326
- })).data?.getChannelDeliveryAttempts?.items ?? [];
331
+ })).data?.getChannelDeliveryAttempts;
332
+ return {
333
+ items: r?.items ?? [],
334
+ nextCursor: r?.nextCursor ?? void 0,
335
+ hasMore: r?.hasMore ?? !1,
336
+ total: r?.total ?? 0
337
+ };
327
338
  } catch (e) {
328
339
  let t = e instanceof Error ? e.message : "Failed to fetch delivery attempts";
329
- return T(e, "Failed to fetch delivery attempts"), k(t), [];
340
+ return T(e, "Failed to fetch delivery attempts"), k(t), {
341
+ items: [],
342
+ hasMore: !1,
343
+ total: 0
344
+ };
330
345
  }
331
346
  }, [n, A]);
332
347
  return {
@@ -342,36 +357,67 @@ function D(n) {
342
357
  testConnection: L,
343
358
  sendTestNotification: R,
344
359
  fetchDeliveryAttempts: z,
345
- fetchWebhookEvents: S(async (e = 50) => {
346
- if (!n) return [];
360
+ fetchWebhookEvents: S(async (e = 25, t) => {
361
+ if (!n) return {
362
+ items: [],
363
+ hasMore: !1,
364
+ total: 0
365
+ };
347
366
  try {
348
- return (await A().query({
367
+ let r = (await A().query({
349
368
  query: g,
350
369
  variables: {
351
370
  channelId: n,
352
- limit: e
371
+ limit: e,
372
+ cursor: t
353
373
  },
354
374
  fetchPolicy: "network-only"
355
- })).data?.getChannelWebhookEvents?.items ?? [];
375
+ })).data?.getChannelWebhookEvents;
376
+ return {
377
+ items: r?.items ?? [],
378
+ nextCursor: r?.nextCursor ?? void 0,
379
+ hasMore: r?.hasMore ?? !1,
380
+ total: r?.total ?? 0
381
+ };
356
382
  } catch (e) {
357
383
  let t = e instanceof Error ? e.message : "Failed to fetch webhook events";
358
- return T(e, "Failed to fetch webhook events"), k(t), [];
384
+ return T(e, "Failed to fetch webhook events"), k(t), {
385
+ items: [],
386
+ hasMore: !1,
387
+ total: 0
388
+ };
359
389
  }
360
390
  }, [n, A]),
361
- fetchUserPlatformConnections: S(async (e = 50) => {
362
- if (!n) return [];
391
+ fetchUserPlatformConnections: S(async (e = 25, t = 0) => {
392
+ if (!n) return {
393
+ items: [],
394
+ hasMore: !1,
395
+ total: 0
396
+ };
363
397
  try {
364
- return (await A().query({
398
+ let r = (await A().query({
365
399
  query: h,
366
400
  variables: {
367
401
  channelId: n,
368
- pagination: { limit: e }
402
+ pagination: {
403
+ limit: e,
404
+ offset: t
405
+ }
369
406
  },
370
407
  fetchPolicy: "network-only"
371
- })).data?.listUserPlatformConnectionsByChannel?.items ?? [];
408
+ })).data?.listUserPlatformConnectionsByChannel;
409
+ return {
410
+ items: r?.items ?? [],
411
+ hasMore: r?.hasMore ?? !1,
412
+ total: r?.total ?? 0
413
+ };
372
414
  } catch (e) {
373
415
  let t = e instanceof Error ? e.message : "Failed to fetch user platform connections";
374
- return T(e, "Failed to fetch user platform connections"), k(t), [];
416
+ return T(e, "Failed to fetch user platform connections"), k(t), {
417
+ items: [],
418
+ hasMore: !1,
419
+ total: 0
420
+ };
375
421
  }
376
422
  }, [n, A]),
377
423
  retryDelivery: S(async (e) => {