@flamingo-stack/openframe-frontend-core 0.0.210 → 0.0.211

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 (72) hide show
  1. package/dist/{chunk-R5RNRH62.js → chunk-3E5ANY55.js} +14 -5
  2. package/dist/chunk-3E5ANY55.js.map +1 -0
  3. package/dist/{chunk-WJBPLMBX.js → chunk-5BNWGK6D.js} +2 -2
  4. package/dist/{chunk-6RZYJICV.cjs → chunk-P5EE2VJX.cjs} +1 -1
  5. package/dist/chunk-P5EE2VJX.cjs.map +1 -0
  6. package/dist/{chunk-ATEUJQKU.js → chunk-QKFBZLIR.js} +2 -2
  7. package/dist/{chunk-MDTIOPVS.cjs → chunk-VTUIMMHO.cjs} +24 -24
  8. package/dist/{chunk-MDTIOPVS.cjs.map → chunk-VTUIMMHO.cjs.map} +1 -1
  9. package/dist/{chunk-TWKPYZNQ.cjs → chunk-WI76ZUBE.cjs} +26 -17
  10. package/dist/chunk-WI76ZUBE.cjs.map +1 -0
  11. package/dist/{chunk-VBFOCTMD.cjs → chunk-ZFBLC5GV.cjs} +17 -17
  12. package/dist/{chunk-VBFOCTMD.cjs.map → chunk-ZFBLC5GV.cjs.map} +1 -1
  13. package/dist/{chunk-7L4DWM7P.js → chunk-ZG2YY5E7.js} +1 -1
  14. package/dist/chunk-ZG2YY5E7.js.map +1 -0
  15. package/dist/components/chat/hooks/use-chat-identity.d.ts +3 -3
  16. package/dist/components/chat/hooks/use-chat-identity.d.ts.map +1 -1
  17. package/dist/components/chat/index.cjs +3 -3
  18. package/dist/components/chat/index.js +2 -2
  19. package/dist/components/contact/index.cjs +4 -4
  20. package/dist/components/contact/index.js +3 -3
  21. package/dist/components/features/index.cjs +3 -3
  22. package/dist/components/features/index.js +2 -2
  23. package/dist/components/footer-waitlist-button.d.ts +21 -2
  24. package/dist/components/footer-waitlist-button.d.ts.map +1 -1
  25. package/dist/components/index.cjs +87 -91
  26. package/dist/components/index.cjs.map +1 -1
  27. package/dist/components/index.js +12 -16
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/components/navigation/index.cjs +3 -3
  30. package/dist/components/navigation/index.js +2 -2
  31. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  32. package/dist/components/tickets/help-center-card.d.ts.map +1 -1
  33. package/dist/components/tickets/index.cjs +139 -98
  34. package/dist/components/tickets/index.cjs.map +1 -1
  35. package/dist/components/tickets/index.js +95 -54
  36. package/dist/components/tickets/index.js.map +1 -1
  37. package/dist/components/tickets/ticket-row.d.ts.map +1 -1
  38. package/dist/components/ui/index.cjs +3 -3
  39. package/dist/components/ui/index.js +2 -2
  40. package/dist/contexts/chat-runtime-context.d.ts +6 -3
  41. package/dist/contexts/chat-runtime-context.d.ts.map +1 -1
  42. package/dist/contexts/index.cjs +2 -2
  43. package/dist/contexts/index.js +1 -1
  44. package/dist/index.cjs +5 -3
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.js +4 -2
  47. package/dist/utils/index.cjs +10 -0
  48. package/dist/utils/index.cjs.map +1 -1
  49. package/dist/utils/index.d.ts +1 -0
  50. package/dist/utils/index.d.ts.map +1 -1
  51. package/dist/utils/index.js +10 -1
  52. package/dist/utils/index.js.map +1 -1
  53. package/dist/utils/scroll-into-view.d.ts +63 -0
  54. package/dist/utils/scroll-into-view.d.ts.map +1 -0
  55. package/package.json +1 -1
  56. package/src/components/chat/hooks/use-chat-identity.ts +8 -7
  57. package/src/components/footer-waitlist-button.tsx +33 -16
  58. package/src/components/navigation/sticky-section-nav.tsx +6 -4
  59. package/src/components/tickets/help-center-card.tsx +55 -1
  60. package/src/components/tickets/help-center-list.tsx +9 -1
  61. package/src/components/tickets/ticket-detail-drawer.tsx +19 -4
  62. package/src/components/tickets/ticket-row.tsx +30 -19
  63. package/src/contexts/chat-runtime-context.tsx +6 -3
  64. package/src/stories/EmbeddableChat.stories.tsx +1 -1
  65. package/src/utils/index.ts +12 -0
  66. package/src/utils/scroll-into-view.ts +74 -0
  67. package/dist/chunk-6RZYJICV.cjs.map +0 -1
  68. package/dist/chunk-7L4DWM7P.js.map +0 -1
  69. package/dist/chunk-R5RNRH62.js.map +0 -1
  70. package/dist/chunk-TWKPYZNQ.cjs.map +0 -1
  71. /package/dist/{chunk-WJBPLMBX.js.map → chunk-5BNWGK6D.js.map} +0 -0
  72. /package/dist/{chunk-ATEUJQKU.js.map → chunk-QKFBZLIR.js.map} +0 -0
@@ -9,11 +9,11 @@ import {
9
9
  EmptyState,
10
10
  UnifiedPagination,
11
11
  init_unified_pagination
12
- } from "../../chunk-ATEUJQKU.js";
12
+ } from "../../chunk-QKFBZLIR.js";
13
13
  import "../../chunk-4XLJWX2N.js";
14
14
  import {
15
15
  ContactForm
16
- } from "../../chunk-WJBPLMBX.js";
16
+ } from "../../chunk-5BNWGK6D.js";
17
17
  import {
18
18
  AlertDialog,
19
19
  AlertDialogAction,
@@ -33,16 +33,17 @@ import {
33
33
  embedAuthedFetch,
34
34
  formatRelativeTime,
35
35
  getStatusColorScheme,
36
+ scrollElementIntoView,
36
37
  useChatAttachments,
37
38
  useChatIdentity
38
- } from "../../chunk-R5RNRH62.js";
39
+ } from "../../chunk-3E5ANY55.js";
39
40
  import {
40
41
  toast
41
42
  } from "../../chunk-UYQOPC57.js";
42
43
  import "../../chunk-CIPO6DXK.js";
43
44
  import "../../chunk-EDW2NVRV.js";
44
45
  import "../../chunk-W72U7OU7.js";
45
- import "../../chunk-7L4DWM7P.js";
46
+ import "../../chunk-ZG2YY5E7.js";
46
47
  import "../../chunk-MJNXIEV2.js";
47
48
  import "../../chunk-EL5YVPD5.js";
48
49
  import {
@@ -63,7 +64,7 @@ import "../../chunk-OHPI2HRK.js";
63
64
  import "../../chunk-GGWZFCYS.js";
64
65
 
65
66
  // src/components/tickets/ticket-center.tsx
66
- import { useCallback as useCallback2, useState as useState4 } from "react";
67
+ import { useCallback as useCallback3, useState as useState4 } from "react";
67
68
  import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
68
69
  init_button();
69
70
  import { RefreshCw } from "lucide-react";
@@ -212,7 +213,7 @@ function TicketOpenForm({
212
213
  }
213
214
 
214
215
  // src/components/tickets/ticket-row.tsx
215
- import { useEffect, useRef } from "react";
216
+ import { useCallback, useRef } from "react";
216
217
 
217
218
  // src/components/collapsible.tsx
218
219
  import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
@@ -405,7 +406,7 @@ function TicketTimelinePanel({ ticket }) {
405
406
  ConversationCardRow,
406
407
  {
407
408
  author,
408
- role: isCustomer ? "Reply" : "Note",
409
+ role: "Reply",
409
410
  avatarSrc,
410
411
  timestamp: eng.createdAt,
411
412
  body: stripAttachmentsPreamble(eng.body ?? ""),
@@ -605,14 +606,22 @@ function TicketRow({
605
606
  }) {
606
607
  const optimistic = isOptimistic(ticket);
607
608
  const rowRef = useRef(null);
608
- useEffect(() => {
609
- if (!expanded || optimistic) return;
610
- requestAnimationFrame(() => {
611
- requestAnimationFrame(() => {
612
- rowRef.current?.scrollIntoView({ behavior: "smooth", block: "start" });
613
- });
609
+ const handleClick = useCallback(() => {
610
+ onToggle(ticket.id);
611
+ scrollElementIntoView(rowRef.current, {
612
+ adjustTargetY: (raw) => {
613
+ if (!rowRef.current) return raw;
614
+ const expandedDrawer = document.querySelector(
615
+ 'div[id^="ticket-drawer-"]'
616
+ );
617
+ if (!(expandedDrawer instanceof HTMLElement)) return raw;
618
+ const drawerRect = expandedDrawer.getBoundingClientRect();
619
+ const myRect = rowRef.current.getBoundingClientRect();
620
+ if (drawerRect.bottom > myRect.top) return raw;
621
+ return raw - drawerRect.height;
622
+ }
614
623
  });
615
- }, [expanded, optimistic]);
624
+ }, [onToggle, ticket.id]);
616
625
  const tileData = {
617
626
  id: ticket.id,
618
627
  title: ticket.subject ?? "(untitled)",
@@ -633,7 +642,7 @@ function TicketRow({
633
642
  // when the task exists but its status hasn't synced yet.
634
643
  linkedTaskLabel: ticket.clickup ? ticket.clickup.status ? ticket.clickup.status.replace(/\b\w/g, (c) => c.toUpperCase()) : "Linked work" : void 0
635
644
  };
636
- return /* @__PURE__ */ jsx4("div", { ref: rowRef, className: "scroll-mt-4", children: /* @__PURE__ */ jsxs3(
645
+ return /* @__PURE__ */ jsx4("div", { ref: rowRef, className: "scroll-mt-24", children: /* @__PURE__ */ jsxs3(
637
646
  Collapsible,
638
647
  {
639
648
  open: expanded && !optimistic,
@@ -643,7 +652,7 @@ function TicketRow({
643
652
  ChatTicketItem,
644
653
  {
645
654
  ticket: tileData,
646
- onClick: optimistic ? void 0 : onToggle,
655
+ onClick: optimistic ? void 0 : handleClick,
647
656
  "aria-expanded": expanded && !optimistic,
648
657
  "aria-controls": `ticket-drawer-${ticket.id}`
649
658
  }
@@ -758,7 +767,7 @@ function useTicketsList(filters) {
758
767
  }
759
768
 
760
769
  // src/components/tickets/hooks/use-ticket-actions.ts
761
- import { useCallback, useEffect as useEffect2, useMemo, useRef as useRef2, useState as useState3 } from "react";
770
+ import { useCallback as useCallback2, useEffect, useMemo, useRef as useRef2, useState as useState3 } from "react";
762
771
  import { useQueryClient } from "@tanstack/react-query";
763
772
  var TICKET_ACTION_ENDPOINT = "/api/chat/agent/ticket-action";
764
773
  var MIRROR_SYNC_BACKOFF_MS = [3e3, 6e3, 12e3];
@@ -769,14 +778,14 @@ function useTicketActions(options) {
769
778
  const [isSubmittingForm, setIsSubmittingForm] = useState3(false);
770
779
  const busyRowsRef = useRef2(/* @__PURE__ */ new Set());
771
780
  const [busyRows, setBusyRows] = useState3(() => /* @__PURE__ */ new Set());
772
- const setRowBusy = useCallback((id, busy) => {
781
+ const setRowBusy = useCallback2((id, busy) => {
773
782
  if (busy) busyRowsRef.current.add(id);
774
783
  else busyRowsRef.current.delete(id);
775
784
  setBusyRows(new Set(busyRowsRef.current));
776
785
  }, []);
777
- const isRowBusy = useCallback((id) => busyRows.has(id), [busyRows]);
786
+ const isRowBusy = useCallback2((id) => busyRows.has(id), [busyRows]);
778
787
  const watcherControllersRef = useRef2(/* @__PURE__ */ new Map());
779
- useEffect2(() => {
788
+ useEffect(() => {
780
789
  return () => {
781
790
  for (const controller of watcherControllersRef.current.values()) {
782
791
  controller.abort();
@@ -785,12 +794,12 @@ function useTicketActions(options) {
785
794
  };
786
795
  }, []);
787
796
  const queueRef = useRef2(Promise.resolve());
788
- const enqueue = useCallback((work) => {
797
+ const enqueue = useCallback2((work) => {
789
798
  const next = queueRef.current.then(work, work);
790
799
  queueRef.current = next.catch(() => void 0);
791
800
  return next;
792
801
  }, []);
793
- const executeTicketAction = useCallback(
802
+ const executeTicketAction = useCallback2(
794
803
  async (toolName, args) => {
795
804
  const res = await embedAuthedFetch(TICKET_ACTION_ENDPOINT, {
796
805
  method: "POST",
@@ -806,7 +815,7 @@ function useTicketActions(options) {
806
815
  },
807
816
  []
808
817
  );
809
- const watchMirrorSync = useCallback(
818
+ const watchMirrorSync = useCallback2(
810
819
  (placeholderId, expectedTicketId) => {
811
820
  const prior = watcherControllersRef.current.get(placeholderId);
812
821
  if (prior) prior.abort();
@@ -852,7 +861,7 @@ function useTicketActions(options) {
852
861
  },
853
862
  [queryClient, removeOptimistic, toast2]
854
863
  );
855
- const surfaceError = useCallback(
864
+ const surfaceError = useCallback2(
856
865
  (err, action) => {
857
866
  const mapped = mapTicketActionError(err);
858
867
  if (mapped.supportSystemDown) onSupportSystemDown();
@@ -865,7 +874,7 @@ function useTicketActions(options) {
865
874
  },
866
875
  [toast2, onSupportSystemDown]
867
876
  );
868
- const submitTicket = useCallback(
877
+ const submitTicket = useCallback2(
869
878
  async (input) => {
870
879
  if (formInFlightRef.current) return false;
871
880
  formInFlightRef.current = true;
@@ -930,7 +939,7 @@ function useTicketActions(options) {
930
939
  surfaceError
931
940
  ]
932
941
  );
933
- const updateTicket = useCallback(
942
+ const updateTicket = useCallback2(
934
943
  async (ticket, serverArgs, successCopy, action) => {
935
944
  if (busyRowsRef.current.has(ticket.id)) return false;
936
945
  setRowBusy(ticket.id, true);
@@ -963,7 +972,7 @@ function useTicketActions(options) {
963
972
  // and cascade-recreate addNote/closeTicket/etc.
964
973
  [setRowBusy, enqueue, executeTicketAction, queryClient, toast2, surfaceError, removeTicketFromCache]
965
974
  );
966
- const sendMessage = useCallback(
975
+ const sendMessage = useCallback2(
967
976
  (ticket, text, attachments) => {
968
977
  const trimmed = text.trim();
969
978
  const hasText = trimmed.length > 0;
@@ -981,7 +990,7 @@ function useTicketActions(options) {
981
990
  },
982
991
  [updateTicket]
983
992
  );
984
- const closeTicket = useCallback(
993
+ const closeTicket = useCallback2(
985
994
  (ticket, resolution) => updateTicket(
986
995
  ticket,
987
996
  {
@@ -993,7 +1002,7 @@ function useTicketActions(options) {
993
1002
  ),
994
1003
  [updateTicket]
995
1004
  );
996
- const reopenTicket = useCallback(
1005
+ const reopenTicket = useCallback2(
997
1006
  (ticket) => updateTicket(ticket, { status: "OPEN" }, TOAST_COPY.reopen_success, "reopen ticket"),
998
1007
  [updateTicket]
999
1008
  );
@@ -1140,14 +1149,14 @@ function TicketCenterAuthed({
1140
1149
  const [optimisticTickets, setOptimisticTickets] = useState4([]);
1141
1150
  const [expandedTicketId, setExpandedTicketId] = useState4(null);
1142
1151
  const [supportSystemDown, setSupportSystemDown] = useState4(false);
1143
- const prependOptimistic = useCallback2((placeholder) => {
1152
+ const prependOptimistic = useCallback3((placeholder) => {
1144
1153
  setOptimisticTickets((prev) => [placeholder, ...prev]);
1145
1154
  }, []);
1146
- const removeOptimistic = useCallback2((placeholderId) => {
1155
+ const removeOptimistic = useCallback3((placeholderId) => {
1147
1156
  setOptimisticTickets((prev) => prev.filter((t) => t.id !== placeholderId));
1148
1157
  setExpandedTicketId((prev) => prev === placeholderId ? null : prev);
1149
1158
  }, []);
1150
- const removeTicketFromCache = useCallback2(
1159
+ const removeTicketFromCache = useCallback3(
1151
1160
  (ticketId) => {
1152
1161
  queryClient.setQueriesData(
1153
1162
  { queryKey: ["tickets"] },
@@ -1164,7 +1173,7 @@ function TicketCenterAuthed({
1164
1173
  toast: toast2,
1165
1174
  onSupportSystemDown: () => setSupportSystemDown(true)
1166
1175
  });
1167
- const toggleRow = useCallback2((id) => {
1176
+ const toggleRow = useCallback3((id) => {
1168
1177
  setExpandedTicketId((prev) => prev === id ? null : id);
1169
1178
  }, []);
1170
1179
  const merged = [...optimisticTickets, ...tickets];
@@ -1247,12 +1256,14 @@ function TicketListSkeleton() {
1247
1256
  }
1248
1257
 
1249
1258
  // src/components/tickets/help-center-list.tsx
1250
- import { useCallback as useCallback3, useState as useState6 } from "react";
1259
+ import { useCallback as useCallback5, useState as useState6 } from "react";
1251
1260
  import { useQueryClient as useQueryClient3 } from "@tanstack/react-query";
1252
1261
  init_unified_pagination();
1253
1262
 
1254
1263
  // src/components/tickets/help-center-card.tsx
1264
+ import { useCallback as useCallback4, useRef as useRef3 } from "react";
1255
1265
  import { Fragment, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1266
+ var STICKY_HEADER_OFFSET_PX = 96;
1256
1267
  function HelpCenterCard({
1257
1268
  ticket,
1258
1269
  expanded,
@@ -1273,6 +1284,24 @@ function HelpCenterCard({
1273
1284
  const description = ticket.preview ?? ticket.body ?? "";
1274
1285
  const isExpandable = !optimistic;
1275
1286
  const isExpanded = expanded && isExpandable;
1287
+ const rowRef = useRef3(null);
1288
+ const handleClick = useCallback4(() => {
1289
+ onToggle(ticket.id);
1290
+ scrollElementIntoView(rowRef.current, {
1291
+ headerOffset: STICKY_HEADER_OFFSET_PX,
1292
+ adjustTargetY: (raw) => {
1293
+ if (!rowRef.current) return raw;
1294
+ const expandedDrawer = document.querySelector(
1295
+ 'div[id^="help-center-drawer-"]'
1296
+ );
1297
+ if (!(expandedDrawer instanceof HTMLElement)) return raw;
1298
+ const drawerRect = expandedDrawer.getBoundingClientRect();
1299
+ const myRect = rowRef.current.getBoundingClientRect();
1300
+ if (drawerRect.bottom > myRect.top) return raw;
1301
+ return raw - drawerRect.height;
1302
+ }
1303
+ });
1304
+ }, [onToggle, ticket.id]);
1276
1305
  const rightBadges = /* @__PURE__ */ jsxs5(Fragment, { children: [
1277
1306
  /* @__PURE__ */ jsx6(
1278
1307
  StatusBadge,
@@ -1296,6 +1325,8 @@ function HelpCenterCard({
1296
1325
  return /* @__PURE__ */ jsxs5(
1297
1326
  "div",
1298
1327
  {
1328
+ ref: rowRef,
1329
+ style: { scrollMarginTop: STICKY_HEADER_OFFSET_PX },
1299
1330
  className: `border-b border-ods-border last:border-b-0 ${optimistic ? "opacity-60" : ""}`,
1300
1331
  "aria-busy": optimistic || void 0,
1301
1332
  children: [
@@ -1303,7 +1334,7 @@ function HelpCenterCard({
1303
1334
  "button",
1304
1335
  {
1305
1336
  type: "button",
1306
- onClick: isExpandable ? () => onToggle(ticket.id) : void 0,
1337
+ onClick: isExpandable ? handleClick : void 0,
1307
1338
  disabled: !isExpandable,
1308
1339
  "aria-expanded": isExpandable ? isExpanded : void 0,
1309
1340
  "aria-controls": isExpanded ? `help-center-drawer-${ticket.id}` : void 0,
@@ -1518,14 +1549,14 @@ function HelpCenterListAuthed({
1518
1549
  const [optimisticTickets, setOptimisticTickets] = useState6([]);
1519
1550
  const [expandedTicketId, setExpandedTicketId] = useState6(null);
1520
1551
  const [supportSystemDown, setSupportSystemDown] = useState6(false);
1521
- const prependOptimistic = useCallback3((placeholder) => {
1552
+ const prependOptimistic = useCallback5((placeholder) => {
1522
1553
  setOptimisticTickets((prev) => [placeholder, ...prev]);
1523
1554
  }, []);
1524
- const removeOptimistic = useCallback3((placeholderId) => {
1555
+ const removeOptimistic = useCallback5((placeholderId) => {
1525
1556
  setOptimisticTickets((prev) => prev.filter((t) => t.id !== placeholderId));
1526
1557
  setExpandedTicketId((prev) => prev === placeholderId ? null : prev);
1527
1558
  }, []);
1528
- const removeTicketFromCache = useCallback3(
1559
+ const removeTicketFromCache = useCallback5(
1529
1560
  (ticketId) => {
1530
1561
  queryClient.setQueriesData(
1531
1562
  { queryKey: ["tickets"] },
@@ -1542,7 +1573,7 @@ function HelpCenterListAuthed({
1542
1573
  toast: toast2,
1543
1574
  onSupportSystemDown: () => setSupportSystemDown(true)
1544
1575
  });
1545
- const toggleRow = useCallback3((id) => {
1576
+ const toggleRow = useCallback5((id) => {
1546
1577
  setExpandedTicketId((prev) => prev === id ? null : id);
1547
1578
  }, []);
1548
1579
  const merged = [...optimisticTickets, ...tickets];
@@ -1595,21 +1626,31 @@ function HelpCenterListAuthed({
1595
1626
  description: "Open one above to start the conversation with the support team.",
1596
1627
  showCTA: false
1597
1628
  }
1598
- ) : /* @__PURE__ */ jsx8("div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full", children: merged.map((ticket) => /* @__PURE__ */ jsx8(
1599
- HelpCenterCard,
1600
- {
1601
- ticket,
1602
- expanded: expandedTicketId === ticket.id,
1603
- onToggle: toggleRow,
1604
- busy: isOptimistic(ticket) ? false : actions.isRowBusy(ticket.id),
1605
- supportSystemDown,
1606
- onSendMessage: actions.sendMessage,
1607
- onClose: actions.closeTicket,
1608
- onReopen: actions.reopenTicket,
1609
- onActionCollapsed: () => setExpandedTicketId(null)
1610
- },
1611
- ticket.id
1612
- )) }) }),
1629
+ ) : (
1630
+ // `overflow-clip` (NOT `overflow-hidden`) — both visually
1631
+ // clip the rounded corners, but `hidden` makes the element
1632
+ // a "scroll container" per CSSOM spec, which causes
1633
+ // `scrollIntoView` calls inside (`<HelpCenterCard>` click
1634
+ // handlers) to try scrolling THIS div (can't, overflow
1635
+ // hidden) instead of bubbling up to the window. `clip`
1636
+ // keeps the visual clip but NOT the scroll-container
1637
+ // status, so click-to-scroll actually moves the page.
1638
+ /* @__PURE__ */ jsx8("div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-clip w-full", children: merged.map((ticket) => /* @__PURE__ */ jsx8(
1639
+ HelpCenterCard,
1640
+ {
1641
+ ticket,
1642
+ expanded: expandedTicketId === ticket.id,
1643
+ onToggle: toggleRow,
1644
+ busy: isOptimistic(ticket) ? false : actions.isRowBusy(ticket.id),
1645
+ supportSystemDown,
1646
+ onSendMessage: actions.sendMessage,
1647
+ onClose: actions.closeTicket,
1648
+ onReopen: actions.reopenTicket,
1649
+ onActionCollapsed: () => setExpandedTicketId(null)
1650
+ },
1651
+ ticket.id
1652
+ )) })
1653
+ ) }),
1613
1654
  !error && totalPages > 1 && /* @__PURE__ */ jsx8(UnifiedPagination, { currentPage: page, totalPages })
1614
1655
  ] });
1615
1656
  return /* @__PURE__ */ jsx8(DevSectionPage, { sectionKey: "tickets", preControls: form, children: body });