@burdenoff/microfe-channel 2026.830.1 → 2026.1013.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/channel/ChannelRoot.d.ts.map +1 -1
  2. package/dist/channel/ChannelRoot.js +32 -35
  3. package/dist/channel/ChannelRoot.js.map +1 -1
  4. package/dist/channel/components/AdapterCredentialsForm.d.ts.map +1 -1
  5. package/dist/channel/components/AdapterCredentialsForm.js +52 -58
  6. package/dist/channel/components/AdapterCredentialsForm.js.map +1 -1
  7. package/dist/channel/components/FeatureNotEnabled.d.ts.map +1 -1
  8. package/dist/channel/components/FeatureNotEnabled.js +27 -22
  9. package/dist/channel/components/FeatureNotEnabled.js.map +1 -1
  10. package/dist/channel/components/MarkdownEditor.d.ts.map +1 -1
  11. package/dist/channel/components/MarkdownEditor.js +78 -77
  12. package/dist/channel/components/MarkdownEditor.js.map +1 -1
  13. package/dist/channel/components/PermissionGuard.d.ts.map +1 -1
  14. package/dist/channel/components/PermissionGuard.js +6 -9
  15. package/dist/channel/components/PermissionGuard.js.map +1 -1
  16. package/dist/channel/hooks/useTr.d.ts +17 -0
  17. package/dist/channel/hooks/useTr.d.ts.map +1 -0
  18. package/dist/channel/hooks/useTr.js +14 -0
  19. package/dist/channel/hooks/useTr.js.map +1 -0
  20. package/dist/channel/modules/channels/i18n.js +24 -24
  21. package/dist/channel/modules/channels/i18n.js.map +1 -1
  22. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +2 -2
  23. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
  24. package/dist/channel/modules/channels/pages/ChannelSettingsPage.d.ts.map +1 -1
  25. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +232 -226
  26. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -1
  27. package/dist/channel/modules/channels/pages/ChannelUsersPage.d.ts.map +1 -1
  28. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +152 -146
  29. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
  30. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.d.ts.map +1 -1
  31. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +112 -114
  32. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
  33. package/dist/channel/modules/channels/pages/CreateChannelPage.d.ts.map +1 -1
  34. package/dist/channel/modules/channels/pages/CreateChannelPage.js +300 -269
  35. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
  36. package/dist/channel/modules/channels/pages/CreateConnectionPage.d.ts.map +1 -1
  37. package/dist/channel/modules/channels/pages/CreateConnectionPage.js +108 -102
  38. package/dist/channel/modules/channels/pages/CreateConnectionPage.js.map +1 -1
  39. package/dist/channel/modules/channels/pages/EditChannelPage.d.ts.map +1 -1
  40. package/dist/channel/modules/channels/pages/EditChannelPage.js +384 -343
  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 +170 -156
  44. package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -1
  45. package/dist/channel/pages/ChannelLandingPage.d.ts.map +1 -1
  46. package/dist/channel/pages/ChannelLandingPage.js +47 -50
  47. package/dist/channel/pages/ChannelLandingPage.js.map +1 -1
  48. package/dist/translations/en.d.ts +271 -4
  49. package/dist/translations/en.d.ts.map +1 -1
  50. package/package.json +1 -1
@@ -1,102 +1,122 @@
1
- import { useChannel as e } from "../../../providers/ChannelProvider.js";
2
- import { useChannel as t } from "../../../hooks/useChannels.js";
3
- import { PermissionGuard as n } from "../../../components/PermissionGuard.js";
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 ee, ChevronRight as te, Clock as h, Download as ne, Loader2 as g, RefreshCw as _, User as v, UserCheck as y, XCircle as b } from "lucide-react";
9
- import { useNavigate as re, useParams as x } from "react-router";
1
+ import { useTr as e } from "../../../hooks/useTr.js";
2
+ import { useChannel as t } from "../../../providers/ChannelProvider.js";
3
+ import { useChannel as n } from "../../../hooks/useChannels.js";
4
+ import { PermissionGuard as r } from "../../../components/PermissionGuard.js";
5
+ import { CHANNEL_PERMISSIONS as i } from "../../../constants/permissions.js";
6
+ import { useExportChannelUsers as a } from "../hooks/useExport.js";
7
+ import { useCallback as ee, useEffect as o, useMemo as s, useRef as c, useState as l } from "react";
8
+ import { AlertCircle as u, ArrowLeft as d, Bell as f, BellOff as p, CheckCircle2 as m, ChevronLeft as h, ChevronRight as te, Clock as ne, Download as re, Loader2 as g, RefreshCw as ie, User as _, UserCheck as v, XCircle as y } from "lucide-react";
9
+ import { useNavigate as b, useParams as x } from "react-router";
10
10
  import { usePermissions as S } from "@burdenoff/fe-libs/shared/providers/shell";
11
11
  import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
12
- import { CTAOverflowMenu as ie, EmphasisPanel as ae, IllustratedEmptyState as oe, PagePurpose as se, ResponsiveTable as ce } from "@burdenoff/fe-libs/ui";
12
+ import { CTAOverflowMenu as ae, EmphasisPanel as oe, IllustratedEmptyState as se, PagePurpose as ce, ResponsiveTable as le } from "@burdenoff/fe-libs/ui";
13
13
  //#region src/channel/modules/channels/pages/ChannelUsersPage.tsx
14
- var E = {
15
- ONLINE: {
16
- label: "Online",
17
- color: "text-status-success-text"
18
- },
19
- OFFLINE: {
20
- label: "Offline",
21
- color: "text-text-secondary"
22
- },
23
- AWAY: {
24
- label: "Away",
25
- color: "text-status-warning-text"
26
- },
27
- DND: {
28
- label: "Do Not Disturb",
29
- color: "text-status-error-text"
30
- }
31
- }, D = {
32
- PENDING: {
33
- label: "Pending",
34
- color: "text-status-warning-text bg-status-warning-bg-subtle",
35
- icon: h
36
- },
37
- APPROVED: {
38
- label: "Approved",
39
- color: "text-status-success-text bg-status-success-bg-subtle",
40
- icon: m
41
- },
42
- EXPIRED: {
43
- label: "Expired",
44
- color: "text-text-secondary bg-bg-sunken",
45
- icon: b
46
- }
47
- };
48
- function O() {
49
- let { channelId: m } = x(), h = re(), { hasPermission: O } = S(), k = O(r.CHANNEL_USER_EXPORT), { t: A } = l(), j = (e, t) => {
50
- let n = A(e);
51
- return n === e ? t : n;
52
- }, { organizationId: M } = e(), { triggerExport: N, isExporting: P, exportError: F } = i(M ?? void 0, m), [I, L] = c(!0), [R, z] = c([]), [B, V] = c(25), [H, U] = c(0), [W, G] = c(0), { channel: K, isLoading: le, error: q, fetchUserPlatformConnections: J } = t(m), Y = a(async (e = 0) => {
53
- if (m) {
54
- L(!0);
14
+ function E() {
15
+ let { channelId: E } = x(), D = b(), { hasPermission: O } = S(), k = O(i.CHANNEL_USER_EXPORT), A = e(), j = s(() => ({
16
+ ONLINE: {
17
+ labelKey: "channel.presence.online",
18
+ labelFallback: "Online",
19
+ color: "text-status-success-text"
20
+ },
21
+ OFFLINE: {
22
+ labelKey: "channel.presence.offline",
23
+ labelFallback: "Offline",
24
+ color: "text-text-secondary"
25
+ },
26
+ AWAY: {
27
+ labelKey: "channel.presence.away",
28
+ labelFallback: "Away",
29
+ color: "text-status-warning-text"
30
+ },
31
+ DND: {
32
+ labelKey: "channel.presence.dnd",
33
+ labelFallback: "Do Not Disturb",
34
+ color: "text-status-error-text"
35
+ }
36
+ }), []), M = s(() => ({
37
+ PENDING: {
38
+ labelKey: "channel.pairingLabel.pending",
39
+ labelFallback: "Pending",
40
+ color: "text-status-warning-text bg-status-warning-bg-subtle",
41
+ icon: ne
42
+ },
43
+ APPROVED: {
44
+ labelKey: "channel.pairingLabel.approved",
45
+ labelFallback: "Approved",
46
+ color: "text-status-success-text bg-status-success-bg-subtle",
47
+ icon: m
48
+ },
49
+ EXPIRED: {
50
+ labelKey: "channel.pairingLabel.expired",
51
+ labelFallback: "Expired",
52
+ color: "text-text-secondary bg-bg-sunken",
53
+ icon: y
54
+ }
55
+ }), []), N = s(() => [
56
+ {
57
+ value: 10,
58
+ label: A("channel.resultsPerPage", "{{count}} results", { count: 10 })
59
+ },
60
+ {
61
+ value: 25,
62
+ label: A("channel.resultsPerPage", "{{count}} results", { count: 25 })
63
+ },
64
+ {
65
+ value: 50,
66
+ label: A("channel.resultsPerPage", "{{count}} results", { count: 50 })
67
+ },
68
+ {
69
+ value: 100,
70
+ label: A("channel.resultsPerPage", "{{count}} results", { count: 100 })
71
+ }
72
+ ], [A]), { organizationId: P } = t(), { triggerExport: F, isExporting: I, exportError: L } = a(P ?? void 0, E), [R, z] = l(!0), [B, V] = l([]), [H, ue] = l(25), [U, de] = l(0), [W, G] = l(0), { channel: K, isLoading: fe, error: q, fetchUserPlatformConnections: J } = n(E), Y = ee(async (e = 0) => {
73
+ if (E) {
74
+ z(!0);
55
75
  try {
56
- let t = await J(B, e * B);
57
- z(t.items), U(t.total);
76
+ let t = await J(H, e * H);
77
+ V(t.items), de(t.total);
58
78
  } finally {
59
- L(!1);
79
+ z(!1);
60
80
  }
61
81
  }
62
82
  }, [
63
- m,
83
+ E,
64
84
  J,
65
- B
66
- ]), X = s(Y);
85
+ H
86
+ ]), X = c(Y);
67
87
  o(() => {
68
88
  X.current = Y;
69
89
  });
70
- let Z = s(!0), Q = s(!1);
90
+ let Z = c(!0), Q = c(!1);
71
91
  o(() => {
72
92
  Promise.resolve().then(() => {
73
93
  Q.current = !0, G(0), X.current(0).finally(() => {
74
94
  Q.current = !1;
75
95
  });
76
96
  });
77
- }, [B]), o(() => {
97
+ }, [H]), o(() => {
78
98
  if (Z.current) {
79
99
  Z.current = !1;
80
100
  return;
81
101
  }
82
102
  Q.current || Promise.resolve().then(() => X.current(W));
83
103
  }, [W]);
84
- let $ = Math.max(1, Math.ceil(H / B)), ue = W > 0, de = W < $ - 1, fe = (e) => E[e] || E.OFFLINE, pe = (e) => D[e] || D.EXPIRED, me = [
104
+ let $ = Math.max(1, Math.ceil(U / H)), pe = W > 0, me = W < $ - 1, he = (e) => j[e] || j.OFFLINE, ge = (e) => M[e] || M.EXPIRED, _e = [
85
105
  {
86
106
  key: "user",
87
- header: j("channel.user", "User"),
107
+ header: A("channel.user", "User"),
88
108
  priority: "primary",
89
109
  cell: (e) => /* @__PURE__ */ T("div", {
90
110
  className: "flex items-center gap-3",
91
111
  children: [/* @__PURE__ */ w("div", {
92
112
  className: "size-8 bg-accent-primary/10 rounded-full flex items-center justify-center",
93
- children: /* @__PURE__ */ w(v, {
113
+ children: /* @__PURE__ */ w(_, {
94
114
  size: 16,
95
115
  className: "text-accent-primary"
96
116
  })
97
117
  }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
98
118
  className: "text-sm font-medium text-text-primary",
99
- children: e.externalDisplayName || "Unknown"
119
+ children: e.externalDisplayName || A("channel.unknownUser", "Unknown")
100
120
  }), e.externalUsername && /* @__PURE__ */ w("p", {
101
121
  className: "text-xs text-text-secondary",
102
122
  children: e.externalUsername
@@ -105,14 +125,14 @@ function O() {
105
125
  },
106
126
  {
107
127
  key: "platformId",
108
- header: j("channel.platformId", "Platform ID"),
128
+ header: A("channel.platformId", "Platform ID"),
109
129
  priority: "secondary",
110
130
  cellClassName: "text-sm font-mono text-text-secondary",
111
131
  cell: (e) => e.externalUserId
112
132
  },
113
133
  {
114
134
  key: "source",
115
- header: j("channel.source", "Source"),
135
+ header: A("channel.source", "Source"),
116
136
  priority: "secondary",
117
137
  cell: (e) => /* @__PURE__ */ w("span", {
118
138
  className: "text-xs text-text-secondary bg-bg-sunken px-2 py-1 rounded",
@@ -121,37 +141,37 @@ function O() {
121
141
  },
122
142
  {
123
143
  key: "status",
124
- header: j("channel.status", "Status"),
144
+ header: A("channel.status", "Status"),
125
145
  priority: "primary",
126
146
  cell: (e) => {
127
- let t = fe(e.presenceStatus);
147
+ let t = he(e.presenceStatus);
128
148
  return /* @__PURE__ */ T("div", {
129
149
  className: "flex items-center gap-2",
130
150
  children: [/* @__PURE__ */ w("span", { className: `w-2 h-2 rounded-full ${t.color.replace("text-", "bg-")}` }), /* @__PURE__ */ w("span", {
131
151
  className: `text-sm ${t.color}`,
132
- children: t.label
152
+ children: A(t.labelKey, t.labelFallback)
133
153
  })]
134
154
  });
135
155
  }
136
156
  },
137
157
  {
138
158
  key: "pairing",
139
- header: j("channel.pairing", "Pairing"),
159
+ header: A("channel.pairing", "Pairing"),
140
160
  priority: "secondary",
141
161
  cell: (e) => {
142
- let t = e.pairingStatus ? pe(e.pairingStatus) : null, n = t?.icon ?? b;
162
+ let t = e.pairingStatus ? ge(e.pairingStatus) : null, n = t?.icon ?? y;
143
163
  return e.pairingStatus && t ? /* @__PURE__ */ T("span", {
144
164
  className: `inline-flex items-center gap-1 text-xs px-2 py-1 rounded ${t.color}`,
145
- children: [/* @__PURE__ */ w(n, { size: 12 }), t.label]
165
+ children: [/* @__PURE__ */ w(n, { size: 12 }), A(t.labelKey, t.labelFallback)]
146
166
  }) : /* @__PURE__ */ w("span", {
147
167
  className: "text-xs text-text-secondary",
148
- children: "-"
168
+ children: A("channel.noPairing", "-")
149
169
  });
150
170
  }
151
171
  },
152
172
  {
153
173
  key: "notifications",
154
- header: j("channel.notifications", "Notifications"),
174
+ header: A("channel.notifications", "Notifications"),
155
175
  priority: "secondary",
156
176
  cell: (e) => e.notificationsEnabled ? /* @__PURE__ */ T("span", {
157
177
  className: "inline-flex items-center gap-1",
@@ -161,7 +181,7 @@ function O() {
161
181
  "aria-hidden": "true"
162
182
  }), /* @__PURE__ */ w("span", {
163
183
  className: "sr-only",
164
- children: j("channel.enabled", "Enabled")
184
+ children: A("channel.enabled", "Enabled")
165
185
  })]
166
186
  }) : /* @__PURE__ */ T("span", {
167
187
  className: "inline-flex items-center gap-1",
@@ -171,24 +191,24 @@ function O() {
171
191
  "aria-hidden": "true"
172
192
  }), /* @__PURE__ */ w("span", {
173
193
  className: "sr-only",
174
- children: j("channel.disabled", "Disabled")
194
+ children: A("channel.disabled", "Disabled")
175
195
  })]
176
196
  })
177
197
  },
178
198
  {
179
199
  key: "dmAllowed",
180
- header: j("channel.dmAllowed", "DM Allowed"),
200
+ header: A("channel.dmAllowed", "DM Allowed"),
181
201
  priority: "secondary",
182
202
  cell: (e) => e.dmAllowed ? /* @__PURE__ */ T("span", {
183
203
  className: "inline-flex items-center gap-1 text-sm text-status-success-text",
184
- children: [/* @__PURE__ */ w(y, { size: 16 }), j("channel.allowed", "Allowed")]
204
+ children: [/* @__PURE__ */ w(v, { size: 16 }), A("channel.allowed", "Allowed")]
185
205
  }) : /* @__PURE__ */ T("span", {
186
206
  className: "inline-flex items-center gap-1 text-sm text-text-secondary",
187
- children: [/* @__PURE__ */ w(b, { size: 16 }), j("channel.blocked", "Blocked")]
207
+ children: [/* @__PURE__ */ w(y, { size: 16 }), A("channel.blocked", "Blocked")]
188
208
  })
189
209
  }
190
210
  ];
191
- return le ? /* @__PURE__ */ w("div", {
211
+ return fe ? /* @__PURE__ */ w("div", {
192
212
  className: "flex items-center justify-center min-h-screen",
193
213
  children: /* @__PURE__ */ w(g, {
194
214
  size: 32,
@@ -205,18 +225,18 @@ function O() {
205
225
  }),
206
226
  /* @__PURE__ */ w("div", { children: /* @__PURE__ */ w("p", {
207
227
  className: "text-sm font-medium text-status-error-text",
208
- children: q || "Channel not found"
228
+ children: q || A("channel.channelNotFound", "Channel not found")
209
229
  }) }),
210
230
  /* @__PURE__ */ w("button", {
211
231
  type: "button",
212
- onClick: () => h(`/channels/${m}`),
232
+ onClick: () => D(`/channels/${E}`),
213
233
  className: "ml-auto px-3 py-1 text-sm text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors",
214
- children: "Go Back"
234
+ children: A("channel.goBack", "Go Back")
215
235
  })
216
236
  ]
217
237
  })
218
- }) : /* @__PURE__ */ w(n, {
219
- permission: r.USER_PLATFORM_CONNECTION_READ,
238
+ }) : /* @__PURE__ */ w(r, {
239
+ permission: i.USER_PLATFORM_CONNECTION_READ,
220
240
  children: /* @__PURE__ */ T("div", {
221
241
  className: "space-y-6 p-3 sm:p-6",
222
242
  children: [
@@ -226,8 +246,8 @@ function O() {
226
246
  className: "flex items-center gap-3",
227
247
  children: [/* @__PURE__ */ w("button", {
228
248
  type: "button",
229
- onClick: () => h(`/channels/${m}`),
230
- "aria-label": j("channel.backToChannel", "Back to channel"),
249
+ onClick: () => D(`/channels/${E}`),
250
+ "aria-label": A("channel.backToChannel", "Back to channel"),
231
251
  className: "p-2 text-text-secondary hover:text-text-primary hover:bg-bg-sunken rounded-lg transition-colors",
232
252
  children: /* @__PURE__ */ w(d, {
233
253
  size: 20,
@@ -235,81 +255,67 @@ function O() {
235
255
  })
236
256
  }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h1", {
237
257
  className: "text-xl sm:text-2xl font-bold text-text-primary",
238
- children: j("channel.channelUsers", "Channel Users")
239
- }), /* @__PURE__ */ T("p", {
258
+ children: A("channel.channelUsers", "Channel Users")
259
+ }), /* @__PURE__ */ w("p", {
240
260
  className: "text-sm text-text-secondary mt-1",
241
- children: [K.name, " - User connections"]
261
+ children: A("channel.usersPageSubtitle", "{{channelName}} - User connections", { channelName: K.name })
242
262
  })] })]
243
263
  }), /* @__PURE__ */ T("div", {
244
264
  className: "flex items-center gap-3",
245
- children: [/* @__PURE__ */ T("select", {
246
- value: B,
247
- onChange: (e) => V(Number(e.target.value)),
265
+ children: [/* @__PURE__ */ w("select", {
266
+ value: H,
267
+ onChange: (e) => ue(Number(e.target.value)),
248
268
  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
- ]
267
- }), /* @__PURE__ */ w(ie, { actions: [{
268
- label: j("channel.refresh", "Refresh"),
269
- icon: /* @__PURE__ */ w(_, {
269
+ children: N.map((e) => /* @__PURE__ */ w("option", {
270
+ value: e.value,
271
+ children: e.label
272
+ }, e.value))
273
+ }), /* @__PURE__ */ w(ae, { actions: [{
274
+ label: A("channel.refresh", "Refresh"),
275
+ icon: /* @__PURE__ */ w(ie, {
270
276
  size: 16,
271
- className: I ? "animate-spin" : "",
277
+ className: R ? "animate-spin" : "",
272
278
  "aria-hidden": "true"
273
279
  }),
274
- disabled: I,
280
+ disabled: R,
275
281
  onSelect: () => void Y(W)
276
282
  }, ...k ? [{
277
- label: j("channel.export", "Export"),
278
- icon: P ? /* @__PURE__ */ w(g, {
283
+ label: A("channel.export", "Export"),
284
+ icon: I ? /* @__PURE__ */ w(g, {
279
285
  size: 16,
280
286
  className: "animate-spin",
281
287
  "aria-hidden": "true"
282
- }) : /* @__PURE__ */ w(ne, {
288
+ }) : /* @__PURE__ */ w(re, {
283
289
  size: 16,
284
290
  "aria-hidden": "true"
285
291
  }),
286
- disabled: P,
287
- onSelect: () => void N()
292
+ disabled: I,
293
+ onSelect: () => void F()
288
294
  }] : []] })]
289
295
  })]
290
296
  }),
291
- /* @__PURE__ */ w(se, {
292
- icon: /* @__PURE__ */ w(v, {
297
+ /* @__PURE__ */ w(ce, {
298
+ icon: /* @__PURE__ */ w(_, {
293
299
  size: 15,
294
300
  "aria-hidden": "true"
295
301
  }),
296
- children: j("channel.usersPurpose", "The people reachable through this channel — linked via OAuth or a pairing code on platforms like Slack, Teams or WhatsApp. See who is online, whether their pairing is approved, and whether they have opted into notifications and direct messages. Use it to verify a recipient is actually connected before you target them, or to audit who can receive messages here.")
302
+ children: A("channel.usersPurpose", "The people reachable through this channel — linked via OAuth or a pairing code on platforms like Slack, Teams or WhatsApp. See who is online, whether their pairing is approved, and whether they have opted into notifications and direct messages. Use it to verify a recipient is actually connected before you target them, or to audit who can receive messages here.")
297
303
  }),
298
- F && /* @__PURE__ */ T("div", {
304
+ L && /* @__PURE__ */ T("div", {
299
305
  className: "p-4 bg-status-error-bg-subtle border border-status-error-border rounded-lg flex items-center gap-3",
300
306
  children: [/* @__PURE__ */ w(u, {
301
307
  size: 20,
302
308
  className: "text-status-error-text"
303
309
  }), /* @__PURE__ */ w("p", {
304
310
  className: "text-sm text-status-error-text flex-1",
305
- children: F
311
+ children: L
306
312
  })]
307
313
  }),
308
- /* @__PURE__ */ T(ae, {
314
+ /* @__PURE__ */ T(oe, {
309
315
  className: "flex items-center gap-3 p-4",
310
316
  children: [/* @__PURE__ */ w("span", {
311
317
  className: "rounded-lg bg-accent-blue-subtle p-2",
312
- children: /* @__PURE__ */ w(y, {
318
+ children: /* @__PURE__ */ w(v, {
313
319
  size: 18,
314
320
  className: "text-accent-blue",
315
321
  "aria-hidden": "true"
@@ -317,22 +323,22 @@ function O() {
317
323
  }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("p", {
318
324
  className: "text-sm font-semibold text-text-primary",
319
325
  children: [
320
- H,
326
+ U,
321
327
  " ",
322
- H === 1 ? j("channel.connectedUserSingular", "connected user") : j("channel.connectedUsersPlural", "connected users")
328
+ U === 1 ? A("channel.connectedUserSingular", "connected user") : A("channel.connectedUsersPlural", "connected users")
323
329
  ]
324
330
  }), /* @__PURE__ */ w("p", {
325
331
  className: "text-sm text-text-secondary",
326
- children: j("channel.usersBannerHint", "Users connected to this channel through OAuth or pairing. Notification preferences and DM authorization are managed per user.")
332
+ children: A("channel.usersBannerHint", "Users connected to this channel through OAuth or pairing. Notification preferences and DM authorization are managed per user.")
327
333
  })] })]
328
334
  }),
329
- /* @__PURE__ */ w(ce, {
330
- columns: me,
331
- data: R,
335
+ /* @__PURE__ */ w(le, {
336
+ columns: _e,
337
+ data: B,
332
338
  rowKey: (e) => e.id,
333
- emptyState: /* @__PURE__ */ w(oe, {
339
+ emptyState: /* @__PURE__ */ w(se, {
334
340
  illustration: "empty-people",
335
- title: j("channel.noUsersConnected", "No users connected to this channel")
341
+ title: A("channel.noUsersConnected", "No users connected to this channel")
336
342
  }),
337
343
  className: "bg-surface border border-border-seam rounded-lg"
338
344
  }),
@@ -340,23 +346,23 @@ function O() {
340
346
  className: "flex items-center justify-between",
341
347
  children: [/* @__PURE__ */ w("p", {
342
348
  className: "text-sm text-text-secondary",
343
- children: H > 0 && /* @__PURE__ */ T(C, { children: [
344
- j("channel.showing", "Showing"),
349
+ children: U > 0 && /* @__PURE__ */ T(C, { children: [
350
+ A("channel.showing", "Showing"),
345
351
  " ",
346
352
  /* @__PURE__ */ T("span", {
347
353
  className: "font-medium",
348
354
  children: [
349
- W * B + 1,
355
+ W * H + 1,
350
356
  "–",
351
- Math.min((W + 1) * B, H)
357
+ Math.min((W + 1) * H, U)
352
358
  ]
353
359
  }),
354
360
  " ",
355
- j("channel.of", "of"),
361
+ A("channel.of", "of"),
356
362
  " ",
357
363
  /* @__PURE__ */ w("span", {
358
364
  className: "font-medium",
359
- children: H
365
+ children: U
360
366
  })
361
367
  ] })
362
368
  }), /* @__PURE__ */ T("div", {
@@ -365,9 +371,9 @@ function O() {
365
371
  /* @__PURE__ */ T("button", {
366
372
  type: "button",
367
373
  onClick: () => G((e) => Math.max(0, e - 1)),
368
- disabled: !ue || I,
374
+ disabled: !pe || R,
369
375
  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",
370
- children: [/* @__PURE__ */ w(ee, { size: 16 }), j("channel.previous", "Previous")]
376
+ children: [/* @__PURE__ */ w(h, { size: 16 }), A("channel.previous", "Previous")]
371
377
  }),
372
378
  /* @__PURE__ */ T("span", {
373
379
  className: "text-sm text-text-secondary",
@@ -380,9 +386,9 @@ function O() {
380
386
  /* @__PURE__ */ T("button", {
381
387
  type: "button",
382
388
  onClick: () => G((e) => Math.min($ - 1, e + 1)),
383
- disabled: !de || I,
389
+ disabled: !me || R,
384
390
  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",
385
- children: [j("channel.next", "Next"), /* @__PURE__ */ w(te, { size: 16 })]
391
+ children: [A("channel.next", "Next"), /* @__PURE__ */ w(te, { size: 16 })]
386
392
  })
387
393
  ]
388
394
  })]
@@ -392,6 +398,6 @@ function O() {
392
398
  });
393
399
  }
394
400
  //#endregion
395
- export { O as ChannelUsersPage };
401
+ export { E as ChannelUsersPage };
396
402
 
397
403
  //# sourceMappingURL=ChannelUsersPage.js.map