@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.
- package/dist/{chunk-R5RNRH62.js → chunk-3E5ANY55.js} +14 -5
- package/dist/chunk-3E5ANY55.js.map +1 -0
- package/dist/{chunk-WJBPLMBX.js → chunk-5BNWGK6D.js} +2 -2
- package/dist/{chunk-6RZYJICV.cjs → chunk-P5EE2VJX.cjs} +1 -1
- package/dist/chunk-P5EE2VJX.cjs.map +1 -0
- package/dist/{chunk-ATEUJQKU.js → chunk-QKFBZLIR.js} +2 -2
- package/dist/{chunk-MDTIOPVS.cjs → chunk-VTUIMMHO.cjs} +24 -24
- package/dist/{chunk-MDTIOPVS.cjs.map → chunk-VTUIMMHO.cjs.map} +1 -1
- package/dist/{chunk-TWKPYZNQ.cjs → chunk-WI76ZUBE.cjs} +26 -17
- package/dist/chunk-WI76ZUBE.cjs.map +1 -0
- package/dist/{chunk-VBFOCTMD.cjs → chunk-ZFBLC5GV.cjs} +17 -17
- package/dist/{chunk-VBFOCTMD.cjs.map → chunk-ZFBLC5GV.cjs.map} +1 -1
- package/dist/{chunk-7L4DWM7P.js → chunk-ZG2YY5E7.js} +1 -1
- package/dist/chunk-ZG2YY5E7.js.map +1 -0
- package/dist/components/chat/hooks/use-chat-identity.d.ts +3 -3
- package/dist/components/chat/hooks/use-chat-identity.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +3 -3
- package/dist/components/chat/index.js +2 -2
- package/dist/components/contact/index.cjs +4 -4
- package/dist/components/contact/index.js +3 -3
- package/dist/components/features/index.cjs +3 -3
- package/dist/components/features/index.js +2 -2
- package/dist/components/footer-waitlist-button.d.ts +21 -2
- package/dist/components/footer-waitlist-button.d.ts.map +1 -1
- package/dist/components/index.cjs +87 -91
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +12 -16
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +3 -3
- package/dist/components/navigation/index.js +2 -2
- package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
- package/dist/components/tickets/help-center-card.d.ts.map +1 -1
- package/dist/components/tickets/index.cjs +139 -98
- package/dist/components/tickets/index.cjs.map +1 -1
- package/dist/components/tickets/index.js +95 -54
- package/dist/components/tickets/index.js.map +1 -1
- package/dist/components/tickets/ticket-row.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +3 -3
- package/dist/components/ui/index.js +2 -2
- package/dist/contexts/chat-runtime-context.d.ts +6 -3
- package/dist/contexts/chat-runtime-context.d.ts.map +1 -1
- package/dist/contexts/index.cjs +2 -2
- package/dist/contexts/index.js +1 -1
- package/dist/index.cjs +5 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -2
- package/dist/utils/index.cjs +10 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +10 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/scroll-into-view.d.ts +63 -0
- package/dist/utils/scroll-into-view.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/chat/hooks/use-chat-identity.ts +8 -7
- package/src/components/footer-waitlist-button.tsx +33 -16
- package/src/components/navigation/sticky-section-nav.tsx +6 -4
- package/src/components/tickets/help-center-card.tsx +55 -1
- package/src/components/tickets/help-center-list.tsx +9 -1
- package/src/components/tickets/ticket-detail-drawer.tsx +19 -4
- package/src/components/tickets/ticket-row.tsx +30 -19
- package/src/contexts/chat-runtime-context.tsx +6 -3
- package/src/stories/EmbeddableChat.stories.tsx +1 -1
- package/src/utils/index.ts +12 -0
- package/src/utils/scroll-into-view.ts +74 -0
- package/dist/chunk-6RZYJICV.cjs.map +0 -1
- package/dist/chunk-7L4DWM7P.js.map +0 -1
- package/dist/chunk-R5RNRH62.js.map +0 -1
- package/dist/chunk-TWKPYZNQ.cjs.map +0 -1
- /package/dist/{chunk-WJBPLMBX.js.map → chunk-5BNWGK6D.js.map} +0 -0
- /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-
|
|
12
|
+
} from "../../chunk-QKFBZLIR.js";
|
|
13
13
|
import "../../chunk-4XLJWX2N.js";
|
|
14
14
|
import {
|
|
15
15
|
ContactForm
|
|
16
|
-
} from "../../chunk-
|
|
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-
|
|
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-
|
|
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
|
|
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 {
|
|
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:
|
|
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
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
rowRef.current
|
|
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
|
-
}, [
|
|
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-
|
|
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 :
|
|
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
|
|
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 =
|
|
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 =
|
|
786
|
+
const isRowBusy = useCallback2((id) => busyRows.has(id), [busyRows]);
|
|
778
787
|
const watcherControllersRef = useRef2(/* @__PURE__ */ new Map());
|
|
779
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1152
|
+
const prependOptimistic = useCallback3((placeholder) => {
|
|
1144
1153
|
setOptimisticTickets((prev) => [placeholder, ...prev]);
|
|
1145
1154
|
}, []);
|
|
1146
|
-
const removeOptimistic =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 ?
|
|
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 =
|
|
1552
|
+
const prependOptimistic = useCallback5((placeholder) => {
|
|
1522
1553
|
setOptimisticTickets((prev) => [placeholder, ...prev]);
|
|
1523
1554
|
}, []);
|
|
1524
|
-
const removeOptimistic =
|
|
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 =
|
|
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 =
|
|
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
|
-
) :
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
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 });
|