@burdenoff/microfe-channel 2026.624.3 → 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.
Files changed (29) hide show
  1. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +134 -134
  2. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
  3. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +287 -277
  4. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -1
  5. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +140 -131
  6. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -1
  7. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +169 -169
  8. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
  9. package/dist/channel/modules/channels/pages/ChannelsListPage.js +204 -209
  10. package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -1
  11. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +161 -155
  12. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
  13. package/dist/channel/modules/channels/pages/ConnectionsListPage.js +141 -148
  14. package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -1
  15. package/dist/channel/modules/channels/pages/CreateChannelPage.js +27 -24
  16. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
  17. package/dist/channel/modules/channels/pages/CreateConnectionPage.js +161 -156
  18. package/dist/channel/modules/channels/pages/CreateConnectionPage.js.map +1 -1
  19. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +177 -192
  20. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -1
  21. package/dist/channel/modules/channels/pages/EditChannelPage.js +130 -122
  22. package/dist/channel/modules/channels/pages/EditChannelPage.js.map +1 -1
  23. package/dist/channel/modules/channels/pages/EditConnectionPage.js +137 -132
  24. package/dist/channel/modules/channels/pages/EditConnectionPage.js.map +1 -1
  25. package/dist/channel/modules/channels/pages/SendMessagePage.js +87 -84
  26. package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -1
  27. package/dist/channel/modules/channels/pages/WebhookEventsPage.js +185 -183
  28. package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -1
  29. package/package.json +2 -2
@@ -2,13 +2,14 @@ import { useChannel as e } from "../../../providers/ChannelProvider.js";
2
2
  import { useChannel as t } from "../../../hooks/useChannels.js";
3
3
  import { PermissionGuard as n } from "../../../components/PermissionGuard.js";
4
4
  import { CHANNEL_PERMISSIONS as r } from "../../../constants/permissions.js";
5
- import { useExportChannelUsers as i } from "../hooks/useExport.js";
6
- import { useCallback as a, useEffect as o, useRef as s, useState as c } from "react";
7
- import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { AlertCircle as u, ArrowLeft as d, Bell as f, BellOff as p, CheckCircle2 as m, ChevronLeft as h, ChevronRight as g, Clock as _, Download as v, Loader2 as y, RefreshCw as ee, User as te, UserCheck as ne, XCircle as b } from "lucide-react";
9
- import { useNavigate as x, useParams as S } from "react-router-dom";
10
- import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
11
- import { ResponsiveTable as E } from "@burdenoff/fe-libs/ui";
5
+ import { useExportChannelUsers as ee } from "../hooks/useExport.js";
6
+ import { useCallback as i, useEffect as a, useRef as o, useState as s } from "react";
7
+ import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { AlertCircle as l, ArrowLeft as u, Bell as d, BellOff as f, CheckCircle2 as p, ChevronLeft as m, ChevronRight as h, Clock as g, Download as te, Loader2 as _, RefreshCw as ne, User as re, UserCheck as v, XCircle as y } from "lucide-react";
9
+ import { useNavigate as b, useParams as ie } from "react-router-dom";
10
+ import { usePermissions as x } from "@burdenoff/fe-libs/shared/providers/shell";
11
+ import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
12
+ import { CTAOverflowMenu as T, GlassCard as E, IllustratedEmptyState as ae, ResponsiveTable as oe } from "@burdenoff/fe-libs/ui";
12
13
  //#region src/channel/modules/channels/pages/ChannelUsersPage.tsx
13
14
  var D = {
14
15
  ONLINE: {
@@ -31,72 +32,72 @@ var D = {
31
32
  PENDING: {
32
33
  label: "Pending",
33
34
  color: "text-status-warning-text bg-status-warning-bg-subtle",
34
- icon: _
35
+ icon: g
35
36
  },
36
37
  APPROVED: {
37
38
  label: "Approved",
38
39
  color: "text-status-success-text bg-status-success-bg-subtle",
39
- icon: m
40
+ icon: p
40
41
  },
41
42
  EXPIRED: {
42
43
  label: "Expired",
43
44
  color: "text-text-secondary bg-bg-sunken",
44
- icon: b
45
+ icon: y
45
46
  }
46
47
  };
47
48
  function k() {
48
- let { channelId: m } = S(), _ = x(), { t: k } = l(), A = (e, t) => {
49
- let n = k(e);
49
+ let { channelId: p } = ie(), g = b(), { hasPermission: k } = x(), A = k(r.CHANNEL_USER_EXPORT), { t: j } = c(), M = (e, t) => {
50
+ let n = j(e);
50
51
  return n === e ? t : n;
51
- }, { organizationId: j } = e(), { triggerExport: re, isExporting: M, exportError: N } = i(j ?? void 0, m), [P, F] = c(!0), [I, L] = c([]), [R, z] = c(25), [B, V] = c(0), [H, U] = c(0), { channel: W, isLoading: G, error: K, fetchUserPlatformConnections: q } = t(m), J = a(async (e = 0) => {
52
- if (m) {
53
- F(!0);
52
+ }, { organizationId: N } = e(), { triggerExport: P, isExporting: F, exportError: I } = ee(N ?? void 0, p), [L, R] = s(!0), [z, B] = s([]), [V, H] = s(25), [U, se] = s(0), [W, G] = s(0), { channel: K, isLoading: ce, error: q, fetchUserPlatformConnections: J } = t(p), Y = i(async (e = 0) => {
53
+ if (p) {
54
+ R(!0);
54
55
  try {
55
- let t = await q(R, e * R);
56
- L(t.items), V(t.total);
56
+ let t = await J(V, e * V);
57
+ B(t.items), se(t.total);
57
58
  } finally {
58
- F(!1);
59
+ R(!1);
59
60
  }
60
61
  }
61
62
  }, [
62
- m,
63
- q,
64
- R
65
- ]), Y = s(J);
66
- o(() => {
67
- Y.current = J;
63
+ p,
64
+ J,
65
+ V
66
+ ]), X = o(Y);
67
+ a(() => {
68
+ X.current = Y;
68
69
  });
69
- let X = s(!0), Z = s(!1);
70
- o(() => {
70
+ let Z = o(!0), Q = o(!1);
71
+ a(() => {
71
72
  Promise.resolve().then(() => {
72
- Z.current = !0, U(0), Y.current(0).finally(() => {
73
- Z.current = !1;
73
+ Q.current = !0, G(0), X.current(0).finally(() => {
74
+ Q.current = !1;
74
75
  });
75
76
  });
76
- }, [R]), o(() => {
77
- if (X.current) {
78
- X.current = !1;
77
+ }, [V]), a(() => {
78
+ if (Z.current) {
79
+ Z.current = !1;
79
80
  return;
80
81
  }
81
- Z.current || Promise.resolve().then(() => Y.current(H));
82
- }, [H]);
83
- let Q = Math.max(1, Math.ceil(B / R)), $ = H > 0, ie = H < Q - 1, ae = (e) => D[e] || D.OFFLINE, oe = (e) => O[e] || O.EXPIRED, se = [
82
+ Q.current || Promise.resolve().then(() => X.current(W));
83
+ }, [W]);
84
+ let $ = Math.max(1, Math.ceil(U / V)), le = W > 0, ue = W < $ - 1, de = (e) => D[e] || D.OFFLINE, fe = (e) => O[e] || O.EXPIRED, pe = [
84
85
  {
85
86
  key: "user",
86
- header: A("channel.user", "User"),
87
+ header: M("channel.user", "User"),
87
88
  priority: "primary",
88
- cell: (e) => /* @__PURE__ */ T("div", {
89
+ cell: (e) => /* @__PURE__ */ w("div", {
89
90
  className: "flex items-center gap-3",
90
- children: [/* @__PURE__ */ w("div", {
91
+ children: [/* @__PURE__ */ C("div", {
91
92
  className: "size-8 bg-accent-primary/10 rounded-full flex items-center justify-center",
92
- children: /* @__PURE__ */ w(te, {
93
+ children: /* @__PURE__ */ C(re, {
93
94
  size: 16,
94
95
  className: "text-accent-primary"
95
96
  })
96
- }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
97
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
97
98
  className: "text-sm font-medium text-text-primary",
98
99
  children: e.externalDisplayName || "Unknown"
99
- }), e.externalUsername && /* @__PURE__ */ w("p", {
100
+ }), e.externalUsername && /* @__PURE__ */ C("p", {
100
101
  className: "text-xs text-text-secondary",
101
102
  children: e.externalUsername
102
103
  })] })]
@@ -104,29 +105,29 @@ function k() {
104
105
  },
105
106
  {
106
107
  key: "platformId",
107
- header: A("channel.platformId", "Platform ID"),
108
+ header: M("channel.platformId", "Platform ID"),
108
109
  priority: "secondary",
109
110
  cellClassName: "text-sm font-mono text-text-secondary",
110
111
  cell: (e) => e.externalUserId
111
112
  },
112
113
  {
113
114
  key: "source",
114
- header: A("channel.source", "Source"),
115
+ header: M("channel.source", "Source"),
115
116
  priority: "secondary",
116
- cell: (e) => /* @__PURE__ */ w("span", {
117
+ cell: (e) => /* @__PURE__ */ C("span", {
117
118
  className: "text-xs text-text-secondary bg-bg-sunken px-2 py-1 rounded",
118
119
  children: e.source
119
120
  })
120
121
  },
121
122
  {
122
123
  key: "status",
123
- header: A("channel.status", "Status"),
124
+ header: M("channel.status", "Status"),
124
125
  priority: "primary",
125
126
  cell: (e) => {
126
- let t = ae(e.presenceStatus);
127
- return /* @__PURE__ */ T("div", {
127
+ let t = de(e.presenceStatus);
128
+ return /* @__PURE__ */ w("div", {
128
129
  className: "flex items-center gap-2",
129
- children: [/* @__PURE__ */ w("span", { className: `w-2 h-2 rounded-full ${t.color.replace("text-", "bg-")}` }), /* @__PURE__ */ w("span", {
130
+ children: [/* @__PURE__ */ C("span", { className: `w-2 h-2 rounded-full ${t.color.replace("text-", "bg-")}` }), /* @__PURE__ */ C("span", {
130
131
  className: `text-sm ${t.color}`,
131
132
  children: t.label
132
133
  })]
@@ -135,14 +136,14 @@ function k() {
135
136
  },
136
137
  {
137
138
  key: "pairing",
138
- header: A("channel.pairing", "Pairing"),
139
+ header: M("channel.pairing", "Pairing"),
139
140
  priority: "secondary",
140
141
  cell: (e) => {
141
- let t = e.pairingStatus ? oe(e.pairingStatus) : null, n = t?.icon ?? b;
142
- return e.pairingStatus && t ? /* @__PURE__ */ T("span", {
142
+ let t = e.pairingStatus ? fe(e.pairingStatus) : null, n = t?.icon ?? y;
143
+ return e.pairingStatus && t ? /* @__PURE__ */ w("span", {
143
144
  className: `inline-flex items-center gap-1 text-xs px-2 py-1 rounded ${t.color}`,
144
- children: [/* @__PURE__ */ w(n, { size: 12 }), t.label]
145
- }) : /* @__PURE__ */ w("span", {
145
+ children: [/* @__PURE__ */ C(n, { size: 12 }), t.label]
146
+ }) : /* @__PURE__ */ C("span", {
146
147
  className: "text-xs text-text-secondary",
147
148
  children: "-"
148
149
  });
@@ -150,219 +151,218 @@ function k() {
150
151
  },
151
152
  {
152
153
  key: "notifications",
153
- header: A("channel.notifications", "Notifications"),
154
+ header: M("channel.notifications", "Notifications"),
154
155
  priority: "secondary",
155
- cell: (e) => e.notificationsEnabled ? /* @__PURE__ */ T("span", {
156
+ cell: (e) => e.notificationsEnabled ? /* @__PURE__ */ w("span", {
156
157
  className: "inline-flex items-center gap-1",
157
- children: [/* @__PURE__ */ w(f, {
158
+ children: [/* @__PURE__ */ C(d, {
158
159
  size: 16,
159
160
  className: "text-status-success-text",
160
161
  "aria-hidden": "true"
161
- }), /* @__PURE__ */ w("span", {
162
+ }), /* @__PURE__ */ C("span", {
162
163
  className: "sr-only",
163
- children: A("channel.enabled", "Enabled")
164
+ children: M("channel.enabled", "Enabled")
164
165
  })]
165
- }) : /* @__PURE__ */ T("span", {
166
+ }) : /* @__PURE__ */ w("span", {
166
167
  className: "inline-flex items-center gap-1",
167
- children: [/* @__PURE__ */ w(p, {
168
+ children: [/* @__PURE__ */ C(f, {
168
169
  size: 16,
169
170
  className: "text-text-secondary",
170
171
  "aria-hidden": "true"
171
- }), /* @__PURE__ */ w("span", {
172
+ }), /* @__PURE__ */ C("span", {
172
173
  className: "sr-only",
173
- children: A("channel.disabled", "Disabled")
174
+ children: M("channel.disabled", "Disabled")
174
175
  })]
175
176
  })
176
177
  },
177
178
  {
178
179
  key: "dmAllowed",
179
- header: A("channel.dmAllowed", "DM Allowed"),
180
+ header: M("channel.dmAllowed", "DM Allowed"),
180
181
  priority: "secondary",
181
- cell: (e) => e.dmAllowed ? /* @__PURE__ */ T("span", {
182
+ cell: (e) => e.dmAllowed ? /* @__PURE__ */ w("span", {
182
183
  className: "inline-flex items-center gap-1 text-sm text-status-success-text",
183
- children: [/* @__PURE__ */ w(ne, { size: 16 }), A("channel.allowed", "Allowed")]
184
- }) : /* @__PURE__ */ T("span", {
184
+ children: [/* @__PURE__ */ C(v, { size: 16 }), M("channel.allowed", "Allowed")]
185
+ }) : /* @__PURE__ */ w("span", {
185
186
  className: "inline-flex items-center gap-1 text-sm text-text-secondary",
186
- children: [/* @__PURE__ */ w(b, { size: 16 }), A("channel.blocked", "Blocked")]
187
+ children: [/* @__PURE__ */ C(y, { size: 16 }), M("channel.blocked", "Blocked")]
187
188
  })
188
189
  }
189
190
  ];
190
- return G ? /* @__PURE__ */ w("div", {
191
+ return ce ? /* @__PURE__ */ C("div", {
191
192
  className: "flex items-center justify-center min-h-screen",
192
- children: /* @__PURE__ */ w(y, {
193
+ children: /* @__PURE__ */ C(_, {
193
194
  size: 32,
194
195
  className: "animate-spin text-accent-primary"
195
196
  })
196
- }) : K || !W ? /* @__PURE__ */ w("div", {
197
+ }) : q || !K ? /* @__PURE__ */ C("div", {
197
198
  className: "p-6",
198
- children: /* @__PURE__ */ T("div", {
199
+ children: /* @__PURE__ */ w("div", {
199
200
  className: "flex items-center gap-3 p-4 bg-status-error-bg-subtle border border-status-error-border rounded-lg",
200
201
  children: [
201
- /* @__PURE__ */ w(u, {
202
+ /* @__PURE__ */ C(l, {
202
203
  size: 20,
203
204
  className: "text-status-error-text"
204
205
  }),
205
- /* @__PURE__ */ w("div", { children: /* @__PURE__ */ w("p", {
206
+ /* @__PURE__ */ C("div", { children: /* @__PURE__ */ C("p", {
206
207
  className: "text-sm font-medium text-status-error-text",
207
- children: K || "Channel not found"
208
+ children: q || "Channel not found"
208
209
  }) }),
209
- /* @__PURE__ */ w("button", {
210
+ /* @__PURE__ */ C("button", {
210
211
  type: "button",
211
- onClick: () => _(`/channels/${m}`),
212
+ onClick: () => g(`/channels/${p}`),
212
213
  className: "ml-auto px-3 py-1 text-sm text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors",
213
214
  children: "Go Back"
214
215
  })
215
216
  ]
216
217
  })
217
- }) : /* @__PURE__ */ w(n, {
218
+ }) : /* @__PURE__ */ C(n, {
218
219
  permission: r.USER_PLATFORM_CONNECTION_READ,
219
- children: /* @__PURE__ */ T("div", {
220
+ children: /* @__PURE__ */ w("div", {
220
221
  className: "space-y-6 p-3 sm:p-6",
221
222
  children: [
222
- /* @__PURE__ */ T("div", {
223
+ /* @__PURE__ */ w("div", {
223
224
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
224
- children: [/* @__PURE__ */ T("div", {
225
+ children: [/* @__PURE__ */ w("div", {
225
226
  className: "flex items-center gap-3",
226
- children: [/* @__PURE__ */ w("button", {
227
+ children: [/* @__PURE__ */ C("button", {
227
228
  type: "button",
228
- onClick: () => _(`/channels/${m}`),
229
- "aria-label": A("channel.backToChannel", "Back to channel"),
229
+ onClick: () => g(`/channels/${p}`),
230
+ "aria-label": M("channel.backToChannel", "Back to channel"),
230
231
  className: "p-2 text-text-secondary hover:text-text-primary hover:bg-bg-sunken rounded-lg transition-colors",
231
- children: /* @__PURE__ */ w(d, {
232
+ children: /* @__PURE__ */ C(u, {
232
233
  size: 20,
233
234
  "aria-hidden": "true"
234
235
  })
235
- }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h1", {
236
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("h1", {
236
237
  className: "text-xl sm:text-2xl font-bold text-text-primary",
237
- children: A("channel.channelUsers", "Channel Users")
238
- }), /* @__PURE__ */ T("p", {
238
+ children: M("channel.channelUsers", "Channel Users")
239
+ }), /* @__PURE__ */ w("p", {
239
240
  className: "text-sm text-text-secondary mt-1",
240
- children: [W.name, " - User connections"]
241
+ children: [K.name, " - User connections"]
241
242
  })] })]
242
- }), /* @__PURE__ */ T("div", {
243
+ }), /* @__PURE__ */ w("div", {
243
244
  className: "flex items-center gap-3",
244
- children: [
245
- /* @__PURE__ */ T("select", {
246
- value: R,
247
- onChange: (e) => z(Number(e.target.value)),
248
- className: "px-3 py-2 text-sm bg-surface border border-border-subtle rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary/50 text-text-primary",
249
- children: [
250
- /* @__PURE__ */ w("option", {
251
- value: 10,
252
- children: "10 results"
253
- }),
254
- /* @__PURE__ */ w("option", {
255
- value: 25,
256
- children: "25 results"
257
- }),
258
- /* @__PURE__ */ w("option", {
259
- value: 50,
260
- children: "50 results"
261
- }),
262
- /* @__PURE__ */ w("option", {
263
- value: 100,
264
- children: "100 results"
265
- })
266
- ]
245
+ children: [/* @__PURE__ */ w("select", {
246
+ value: V,
247
+ onChange: (e) => H(Number(e.target.value)),
248
+ className: "px-3 py-2 text-sm bg-surface border border-border-subtle rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary/50 text-text-primary",
249
+ children: [
250
+ /* @__PURE__ */ C("option", {
251
+ value: 10,
252
+ children: "10 results"
253
+ }),
254
+ /* @__PURE__ */ C("option", {
255
+ value: 25,
256
+ children: "25 results"
257
+ }),
258
+ /* @__PURE__ */ C("option", {
259
+ value: 50,
260
+ children: "50 results"
261
+ }),
262
+ /* @__PURE__ */ C("option", {
263
+ value: 100,
264
+ children: "100 results"
265
+ })
266
+ ]
267
+ }), /* @__PURE__ */ C(T, { actions: [{
268
+ label: M("channel.refresh", "Refresh"),
269
+ icon: /* @__PURE__ */ C(ne, {
270
+ size: 16,
271
+ className: L ? "animate-spin" : "",
272
+ "aria-hidden": "true"
267
273
  }),
268
- /* @__PURE__ */ T("button", {
269
- type: "button",
270
- onClick: () => void J(H),
271
- disabled: P,
272
- className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-text-secondary hover:text-text-primary hover:bg-bg-sunken rounded-lg transition-colors disabled:opacity-50",
273
- children: [/* @__PURE__ */ w(ee, {
274
- size: 16,
275
- className: P ? "animate-spin" : ""
276
- }), A("channel.refresh", "Refresh")]
274
+ disabled: L,
275
+ onSelect: () => void Y(W)
276
+ }, ...A ? [{
277
+ label: M("channel.export", "Export"),
278
+ icon: F ? /* @__PURE__ */ C(_, {
279
+ size: 16,
280
+ className: "animate-spin",
281
+ "aria-hidden": "true"
282
+ }) : /* @__PURE__ */ C(te, {
283
+ size: 16,
284
+ "aria-hidden": "true"
277
285
  }),
278
- /* @__PURE__ */ w(n, {
279
- permission: r.CHANNEL_USER_EXPORT,
280
- children: /* @__PURE__ */ T("button", {
281
- type: "button",
282
- onClick: () => void re(),
283
- disabled: M,
284
- className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-fg border border-border-subtle hover:bg-bg-elevated rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
285
- title: A("channel.exportCSV", "Export to CSV"),
286
- children: [M ? /* @__PURE__ */ w(y, {
287
- size: 16,
288
- className: "animate-spin"
289
- }) : /* @__PURE__ */ w(v, { size: 16 }), A("channel.export", "Export")]
290
- })
291
- })
292
- ]
286
+ disabled: F,
287
+ onSelect: () => void P()
288
+ }] : []] })]
293
289
  })]
294
290
  }),
295
- N && /* @__PURE__ */ T("div", {
291
+ I && /* @__PURE__ */ w("div", {
296
292
  className: "p-4 bg-status-error-bg-subtle border border-status-error-border rounded-lg flex items-center gap-3",
297
- children: [/* @__PURE__ */ w(u, {
293
+ children: [/* @__PURE__ */ C(l, {
298
294
  size: 20,
299
295
  className: "text-status-error-text"
300
- }), /* @__PURE__ */ w("p", {
296
+ }), /* @__PURE__ */ C("p", {
301
297
  className: "text-sm text-status-error-text flex-1",
302
- children: N
298
+ children: I
303
299
  })]
304
300
  }),
305
- /* @__PURE__ */ w("div", {
306
- className: "p-4 bg-surface border border-border-subtle rounded-lg",
307
- children: /* @__PURE__ */ w("p", {
301
+ /* @__PURE__ */ C(E, {
302
+ treatment: "insight",
303
+ className: "p-4 border-border-seam",
304
+ children: /* @__PURE__ */ C("p", {
308
305
  className: "text-sm text-text-secondary",
309
306
  children: "Users connected to this channel through OAuth or pairing. Manage notification preferences and DM authorization here."
310
307
  })
311
308
  }),
312
- /* @__PURE__ */ w(E, {
313
- columns: se,
314
- data: I,
309
+ /* @__PURE__ */ C(oe, {
310
+ columns: pe,
311
+ data: z,
315
312
  rowKey: (e) => e.id,
316
- emptyState: A("channel.noUsersConnected", "No users connected to this channel"),
317
- className: "bg-surface border border-border-subtle rounded-lg"
313
+ emptyState: /* @__PURE__ */ C(ae, {
314
+ illustration: "empty-people",
315
+ title: M("channel.noUsersConnected", "No users connected to this channel")
316
+ }),
317
+ className: "bg-surface border border-border-seam rounded-lg"
318
318
  }),
319
- /* @__PURE__ */ T("div", {
319
+ /* @__PURE__ */ w("div", {
320
320
  className: "flex items-center justify-between",
321
- children: [/* @__PURE__ */ w("p", {
321
+ children: [/* @__PURE__ */ C("p", {
322
322
  className: "text-sm text-text-secondary",
323
- children: B > 0 && /* @__PURE__ */ T(C, { children: [
324
- A("channel.showing", "Showing"),
323
+ children: U > 0 && /* @__PURE__ */ w(S, { children: [
324
+ M("channel.showing", "Showing"),
325
325
  " ",
326
- /* @__PURE__ */ T("span", {
326
+ /* @__PURE__ */ w("span", {
327
327
  className: "font-medium",
328
328
  children: [
329
- H * R + 1,
329
+ W * V + 1,
330
330
  "–",
331
- Math.min((H + 1) * R, B)
331
+ Math.min((W + 1) * V, U)
332
332
  ]
333
333
  }),
334
334
  " ",
335
- A("channel.of", "of"),
335
+ M("channel.of", "of"),
336
336
  " ",
337
- /* @__PURE__ */ w("span", {
337
+ /* @__PURE__ */ C("span", {
338
338
  className: "font-medium",
339
- children: B
339
+ children: U
340
340
  })
341
341
  ] })
342
- }), /* @__PURE__ */ T("div", {
342
+ }), /* @__PURE__ */ w("div", {
343
343
  className: "flex items-center gap-2",
344
344
  children: [
345
- /* @__PURE__ */ T("button", {
345
+ /* @__PURE__ */ w("button", {
346
346
  type: "button",
347
- onClick: () => U((e) => Math.max(0, e - 1)),
348
- disabled: !$ || P,
347
+ onClick: () => G((e) => Math.max(0, e - 1)),
348
+ disabled: !le || L,
349
349
  className: "flex items-center gap-1 px-3 py-1.5 text-sm border border-border-subtle rounded-lg hover:bg-bg-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
350
- children: [/* @__PURE__ */ w(h, { size: 16 }), A("channel.previous", "Previous")]
350
+ children: [/* @__PURE__ */ C(m, { size: 16 }), M("channel.previous", "Previous")]
351
351
  }),
352
- /* @__PURE__ */ T("span", {
352
+ /* @__PURE__ */ w("span", {
353
353
  className: "text-sm text-text-secondary",
354
354
  children: [
355
- H + 1,
355
+ W + 1,
356
356
  " / ",
357
- Q
357
+ $
358
358
  ]
359
359
  }),
360
- /* @__PURE__ */ T("button", {
360
+ /* @__PURE__ */ w("button", {
361
361
  type: "button",
362
- onClick: () => U((e) => Math.min(Q - 1, e + 1)),
363
- disabled: !ie || P,
362
+ onClick: () => G((e) => Math.min($ - 1, e + 1)),
363
+ disabled: !ue || L,
364
364
  className: "flex items-center gap-1 px-3 py-1.5 text-sm border border-border-subtle rounded-lg hover:bg-bg-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
365
- children: [A("channel.next", "Next"), /* @__PURE__ */ w(g, { size: 16 })]
365
+ children: [M("channel.next", "Next"), /* @__PURE__ */ C(h, { size: 16 })]
366
366
  })
367
367
  ]
368
368
  })]