@flamingo-stack/openframe-frontend-core 0.0.215 → 0.0.216-snapshot.20260530192723
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-2V4SACHE.js +302 -0
- package/dist/chunk-2V4SACHE.js.map +1 -0
- package/dist/chunk-572WQWIX.cjs +348 -0
- package/dist/chunk-572WQWIX.cjs.map +1 -0
- package/dist/{chunk-WT5JV2GS.cjs → chunk-5V6MSE3B.cjs} +39 -39
- package/dist/chunk-5V6MSE3B.cjs.map +1 -0
- package/dist/{chunk-WQZP3JIZ.js → chunk-CDLYRFDE.js} +1894 -1472
- package/dist/chunk-CDLYRFDE.js.map +1 -0
- package/dist/chunk-GVNQAGXB.js +232 -0
- package/dist/chunk-GVNQAGXB.js.map +1 -0
- package/dist/{chunk-P5EE2VJX.cjs → chunk-HOHDXYPR.cjs} +1 -1
- package/dist/chunk-HOHDXYPR.cjs.map +1 -0
- package/dist/chunk-IH76P5R6.cjs +232 -0
- package/dist/chunk-IH76P5R6.cjs.map +1 -0
- package/dist/{chunk-24KCAECR.cjs → chunk-JJR27M56.cjs} +3 -3
- package/dist/{chunk-24KCAECR.cjs.map → chunk-JJR27M56.cjs.map} +1 -1
- package/dist/chunk-K4DFAVSO.cjs +302 -0
- package/dist/chunk-K4DFAVSO.cjs.map +1 -0
- package/dist/{chunk-HICZPTRR.js → chunk-LCLTCCXS.js} +14 -14
- package/dist/chunk-LCLTCCXS.js.map +1 -0
- package/dist/{chunk-VFKQMAUF.cjs → chunk-OB45JHDY.cjs} +3 -3
- package/dist/{chunk-VFKQMAUF.cjs.map → chunk-OB45JHDY.cjs.map} +1 -1
- package/dist/{chunk-4XLJWX2N.js → chunk-ORJREQ2W.js} +4 -4
- package/dist/{chunk-7PCP7YQR.js → chunk-QTKU6ULP.js} +6 -6
- package/dist/{chunk-CIPO6DXK.js → chunk-QY75VKAS.js} +5 -5
- package/dist/{chunk-ZG2YY5E7.js → chunk-RFONYT63.js} +1 -1
- package/dist/chunk-RFONYT63.js.map +1 -0
- package/dist/{chunk-NGFP4RVL.cjs → chunk-SMCG2CCC.cjs} +30 -30
- package/dist/{chunk-NGFP4RVL.cjs.map → chunk-SMCG2CCC.cjs.map} +1 -1
- package/dist/{chunk-MX5MIFWA.js → chunk-UEBM4PC4.js} +5 -5
- package/dist/chunk-VC3ND5RB.js +348 -0
- package/dist/chunk-VC3ND5RB.js.map +1 -0
- package/dist/{chunk-UXZ3ZJ3M.cjs → chunk-XDPSSE4O.cjs} +4 -4
- package/dist/{chunk-UXZ3ZJ3M.cjs.map → chunk-XDPSSE4O.cjs.map} +1 -1
- package/dist/{chunk-D4MNFY67.cjs → chunk-ZGTDUPTW.cjs} +1316 -894
- package/dist/chunk-ZGTDUPTW.cjs.map +1 -0
- package/dist/components/chat/entity-cards/blog-card.d.ts +1 -1
- package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/case-study-card.d.ts +1 -1
- package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/customer-interview-card.d.ts +1 -1
- package/dist/components/chat/entity-cards/customer-interview-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/investor-update-card.d.ts +1 -1
- package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts +1 -1
- package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/program-card.d.ts +1 -1
- package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/use-entity-card-link.d.ts +14 -0
- package/dist/components/chat/entity-cards/use-entity-card-link.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/use-entity-card-placeholder.d.ts +13 -0
- package/dist/components/chat/entity-cards/use-entity-card-placeholder.d.ts.map +1 -0
- package/dist/components/chat/index.cjs +11 -11
- package/dist/components/chat/index.js +10 -10
- package/dist/components/contact/index.cjs +12 -12
- package/dist/components/contact/index.js +11 -11
- package/dist/components/features/captions-url.d.ts +18 -0
- package/dist/components/features/captions-url.d.ts.map +1 -0
- package/dist/components/features/index.cjs +23 -11
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.d.ts +2 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +24 -12
- package/dist/components/features/mux-origins.cjs +10 -0
- package/dist/components/features/mux-origins.cjs.map +1 -0
- package/dist/components/features/mux-origins.d.ts +26 -0
- package/dist/components/features/mux-origins.d.ts.map +1 -0
- package/dist/components/features/mux-origins.js +7 -0
- package/dist/components/features/mux-origins.js.map +1 -0
- package/dist/components/features/notifications/index.d.ts +2 -0
- package/dist/components/features/notifications/index.d.ts.map +1 -1
- package/dist/components/features/notifications/notification-drawer.d.ts +2 -1
- package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
- package/dist/components/features/notifications/notification-popups.d.ts +10 -0
- package/dist/components/features/notifications/notification-popups.d.ts.map +1 -0
- package/dist/components/features/notifications/notifications-context.d.ts +8 -1
- package/dist/components/features/notifications/notifications-context.d.ts.map +1 -1
- package/dist/components/features/notifications/types.d.ts +1 -0
- package/dist/components/features/notifications/types.d.ts.map +1 -1
- package/dist/components/features/use-video-warmup.d.ts +53 -0
- package/dist/components/features/use-video-warmup.d.ts.map +1 -0
- package/dist/components/icons/index.cjs +3 -3
- package/dist/components/icons/index.js +2 -2
- package/dist/components/icons-v2-generated/index.cjs +2 -2
- package/dist/components/icons-v2-generated/index.cjs.map +1 -1
- package/dist/components/icons-v2-generated/index.js +4 -4
- package/dist/components/index.cjs +133 -103
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +95 -65
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +11 -11
- package/dist/components/navigation/index.js +10 -10
- package/dist/components/onboarding-guides/build-default-href.d.ts +15 -0
- package/dist/components/onboarding-guides/build-default-href.d.ts.map +1 -0
- package/dist/components/onboarding-guides/hooks/use-onboarding-guides.d.ts +28 -0
- package/dist/components/onboarding-guides/hooks/use-onboarding-guides.d.ts.map +1 -0
- package/dist/components/onboarding-guides/index.cjs +373 -0
- package/dist/components/onboarding-guides/index.cjs.map +1 -0
- package/dist/components/onboarding-guides/index.d.ts +25 -0
- package/dist/components/onboarding-guides/index.d.ts.map +1 -0
- package/dist/components/onboarding-guides/index.js +373 -0
- package/dist/components/onboarding-guides/index.js.map +1 -0
- package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts +52 -0
- package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -0
- package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts +17 -0
- package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts.map +1 -0
- package/dist/components/onboarding-guides/onboarding-guides-catalog-view.d.ts +43 -0
- package/dist/components/onboarding-guides/onboarding-guides-catalog-view.d.ts.map +1 -0
- package/dist/components/shared/doc-search/doc-search-bar.d.ts +59 -0
- package/dist/components/shared/doc-search/doc-search-bar.d.ts.map +1 -0
- package/dist/components/shared/doc-search/doc-search-result-row.d.ts +18 -0
- package/dist/components/shared/doc-search/doc-search-result-row.d.ts.map +1 -0
- package/dist/components/shared/doc-search/format-relative-path.d.ts +10 -0
- package/dist/components/shared/doc-search/format-relative-path.d.ts.map +1 -0
- package/dist/components/shared/doc-search/index.d.ts +8 -0
- package/dist/components/shared/doc-search/index.d.ts.map +1 -0
- package/dist/components/shared/doc-search/map-doc-search-results.d.ts +15 -0
- package/dist/components/shared/doc-search/map-doc-search-results.d.ts.map +1 -0
- package/dist/components/shared/doc-search/resolve-search-result-action.d.ts +37 -0
- package/dist/components/shared/doc-search/resolve-search-result-action.d.ts.map +1 -0
- package/dist/components/shared/doc-search/types.d.ts +29 -0
- package/dist/components/shared/doc-search/types.d.ts.map +1 -0
- package/dist/components/shared/doc-search/use-doc-search.d.ts +46 -0
- package/dist/components/shared/doc-search/use-doc-search.d.ts.map +1 -0
- package/dist/components/shared/legal-document/use-legal-docs.d.ts.map +1 -1
- package/dist/components/tickets/help-center-card.d.ts +5 -1
- package/dist/components/tickets/help-center-card.d.ts.map +1 -1
- package/dist/components/tickets/hooks/use-ticket-actions.d.ts +8 -0
- package/dist/components/tickets/hooks/use-ticket-actions.d.ts.map +1 -1
- package/dist/components/tickets/index.cjs +321 -145
- package/dist/components/tickets/index.cjs.map +1 -1
- package/dist/components/tickets/index.js +242 -66
- package/dist/components/tickets/index.js.map +1 -1
- package/dist/components/tickets/ticket-detail-drawer.d.ts +11 -2
- package/dist/components/tickets/ticket-detail-drawer.d.ts.map +1 -1
- package/dist/components/tickets/types.d.ts +50 -1
- package/dist/components/tickets/types.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +51 -51
- package/dist/components/ui/file-manager/index.cjs.map +1 -1
- package/dist/components/ui/file-manager/index.js +2 -2
- package/dist/components/ui/filter-pill-row.d.ts +20 -0
- package/dist/components/ui/filter-pill-row.d.ts.map +1 -0
- package/dist/components/ui/index.cjs +16 -14
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +21 -19
- package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -1
- package/dist/contexts/chat-runtime-context.d.ts +42 -0
- 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/embed-shims/index.cjs +3 -3
- package/dist/embed-shims/index.cjs.map +1 -1
- package/dist/embed-shims/index.js +5 -5
- package/dist/hooks/index.cjs +6 -6
- package/dist/hooks/index.js +5 -5
- package/dist/index.cjs +28 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +59 -45
- package/dist/utils/dev-sections/openframe-dev-sections.d.ts +2 -2
- package/dist/utils/dev-sections/openframe-dev-sections.d.ts.map +1 -1
- package/dist/utils/index.cjs +11 -5
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.js +11 -5
- package/dist/utils/index.js.map +1 -1
- package/package.json +13 -1
- package/src/components/chat/entity-cards/blog-card.tsx +17 -5
- package/src/components/chat/entity-cards/case-study-card.tsx +23 -1
- package/src/components/chat/entity-cards/customer-interview-card.tsx +23 -1
- package/src/components/chat/entity-cards/dispatch.tsx +21 -0
- package/src/components/chat/entity-cards/investor-update-card.tsx +23 -1
- package/src/components/chat/entity-cards/onboarding-guide-card.tsx +30 -4
- package/src/components/chat/entity-cards/program-card.tsx +17 -3
- package/src/components/chat/entity-cards/use-entity-card-link.ts +66 -0
- package/src/components/chat/entity-cards/use-entity-card-placeholder.ts +50 -0
- package/src/components/features/captions-url.ts +25 -0
- package/src/components/features/index.ts +2 -0
- package/src/components/features/mux-origins.ts +27 -0
- package/src/components/features/notifications/index.ts +2 -0
- package/src/components/features/notifications/notification-drawer.tsx +100 -16
- package/src/components/features/notifications/notification-popups.tsx +105 -0
- package/src/components/features/notifications/notifications-context.tsx +16 -0
- package/src/components/features/notifications/types.ts +1 -0
- package/src/components/features/use-video-warmup.ts +176 -0
- package/src/components/index.ts +5 -0
- package/src/components/onboarding-guides/build-default-href.ts +16 -0
- package/src/components/onboarding-guides/hooks/use-onboarding-guides.ts +90 -0
- package/src/components/onboarding-guides/index.ts +39 -0
- package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +215 -0
- package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +62 -0
- package/src/components/onboarding-guides/onboarding-guides-catalog-view.tsx +230 -0
- package/src/components/shared/doc-search/doc-search-bar.tsx +100 -0
- package/src/components/shared/doc-search/doc-search-result-row.tsx +73 -0
- package/src/components/shared/doc-search/format-relative-path.ts +17 -0
- package/src/components/shared/doc-search/index.ts +24 -0
- package/src/components/shared/doc-search/map-doc-search-results.ts +113 -0
- package/src/components/shared/doc-search/resolve-search-result-action.ts +68 -0
- package/src/components/shared/doc-search/types.ts +28 -0
- package/src/components/shared/doc-search/use-doc-search.ts +263 -0
- package/src/components/shared/legal-document/use-legal-docs.ts +5 -1
- package/src/components/tickets/help-center-card.tsx +8 -0
- package/src/components/tickets/help-center-list.tsx +17 -3
- package/src/components/tickets/hooks/use-ticket-actions.ts +210 -14
- package/src/components/tickets/ticket-detail-drawer.tsx +175 -5
- package/src/components/tickets/types.ts +55 -0
- package/src/components/ui/filter-pill-row.tsx +72 -0
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/simple-markdown-renderer.tsx +24 -1
- package/src/components/ui/toaster.tsx +3 -3
- package/src/contexts/chat-runtime-context.tsx +41 -0
- package/src/stories/NotificationDrawer.stories.tsx +18 -2
- package/src/utils/dev-sections/openframe-dev-sections.ts +12 -5
- package/dist/chunk-2G3NXF6J.cjs +0 -521
- package/dist/chunk-2G3NXF6J.cjs.map +0 -1
- package/dist/chunk-D4MNFY67.cjs.map +0 -1
- package/dist/chunk-HICZPTRR.js.map +0 -1
- package/dist/chunk-P5EE2VJX.cjs.map +0 -1
- package/dist/chunk-R6MLPU4A.js +0 -521
- package/dist/chunk-R6MLPU4A.js.map +0 -1
- package/dist/chunk-WQZP3JIZ.js.map +0 -1
- package/dist/chunk-WT5JV2GS.cjs.map +0 -1
- package/dist/chunk-ZG2YY5E7.js.map +0 -1
- /package/dist/{chunk-4XLJWX2N.js.map → chunk-ORJREQ2W.js.map} +0 -0
- /package/dist/{chunk-7PCP7YQR.js.map → chunk-QTKU6ULP.js.map} +0 -0
- /package/dist/{chunk-CIPO6DXK.js.map → chunk-QY75VKAS.js.map} +0 -0
- /package/dist/{chunk-MX5MIFWA.js.map → chunk-UEBM4PC4.js.map} +0 -0
|
@@ -4,17 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
+
var _chunkK4DFAVSOcjs = require('../../chunk-K4DFAVSO.cjs');
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
var _chunk2G3NXF6Jcjs = require('../../chunk-2G3NXF6J.cjs');
|
|
13
|
-
require('../../chunk-VFKQMAUF.cjs');
|
|
14
13
|
|
|
14
|
+
var _chunkIH76P5R6cjs = require('../../chunk-IH76P5R6.cjs');
|
|
15
|
+
require('../../chunk-OB45JHDY.cjs');
|
|
15
16
|
|
|
16
|
-
var _chunkNGFP4RVLcjs = require('../../chunk-NGFP4RVL.cjs');
|
|
17
17
|
|
|
18
|
+
var _chunkSMCG2CCCcjs = require('../../chunk-SMCG2CCC.cjs');
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
|
|
@@ -36,43 +37,45 @@ var _chunkNGFP4RVLcjs = require('../../chunk-NGFP4RVL.cjs');
|
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
var _chunkD4MNFY67cjs = require('../../chunk-D4MNFY67.cjs');
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
var
|
|
43
|
-
require('../../chunk-24KCAECR.cjs');
|
|
44
|
-
require('../../chunk-65CPJ4SX.cjs');
|
|
45
|
-
require('../../chunk-XQFFGR6U.cjs');
|
|
46
|
-
require('../../chunk-P5EE2VJX.cjs');
|
|
47
|
-
require('../../chunk-27APPAJN.cjs');
|
|
42
|
+
var _chunkZGTDUPTWcjs = require('../../chunk-ZGTDUPTW.cjs');
|
|
48
43
|
require('../../chunk-XL4V2PYG.cjs');
|
|
49
44
|
require('../../chunk-BZFW3FOF.cjs');
|
|
50
45
|
|
|
51
46
|
|
|
52
47
|
|
|
53
48
|
|
|
54
|
-
|
|
55
|
-
require('../../chunk-
|
|
49
|
+
|
|
50
|
+
var _chunkXDPSSE4Ocjs = require('../../chunk-XDPSSE4O.cjs');
|
|
51
|
+
require('../../chunk-WBR7H6E3.cjs');
|
|
56
52
|
|
|
57
53
|
|
|
54
|
+
var _chunk5V6MSE3Bcjs = require('../../chunk-5V6MSE3B.cjs');
|
|
58
55
|
|
|
59
56
|
|
|
60
57
|
|
|
61
|
-
|
|
58
|
+
|
|
59
|
+
var _chunkG7UE6RKVcjs = require('../../chunk-G7UE6RKV.cjs');
|
|
60
|
+
require('../../chunk-JJR27M56.cjs');
|
|
62
61
|
require('../../chunk-664KA5FI.cjs');
|
|
62
|
+
require('../../chunk-65CPJ4SX.cjs');
|
|
63
63
|
require('../../chunk-WZW7C7TF.cjs');
|
|
64
|
-
require('../../chunk-
|
|
64
|
+
require('../../chunk-XQFFGR6U.cjs');
|
|
65
|
+
require('../../chunk-HOHDXYPR.cjs');
|
|
66
|
+
require('../../chunk-27APPAJN.cjs');
|
|
67
|
+
require('../../chunk-OZ3GH6OQ.cjs');
|
|
65
68
|
require('../../chunk-VRHGVLSL.cjs');
|
|
66
69
|
|
|
67
70
|
// src/components/tickets/ticket-center.tsx
|
|
68
71
|
var _react = require('react');
|
|
69
72
|
var _reactquery = require('@tanstack/react-query');
|
|
70
|
-
|
|
73
|
+
_chunkXDPSSE4Ocjs.init_button2.call(void 0, );
|
|
71
74
|
var _lucidereact = require('lucide-react');
|
|
72
75
|
|
|
73
76
|
// src/components/tickets/ticket-open-form.tsx
|
|
74
77
|
|
|
75
|
-
|
|
78
|
+
_chunkXDPSSE4Ocjs.init_button2.call(void 0, );
|
|
76
79
|
|
|
77
80
|
// src/components/tickets/types.ts
|
|
78
81
|
function isOptimistic(t) {
|
|
@@ -99,7 +102,7 @@ function TicketOpenForm({
|
|
|
99
102
|
}) {
|
|
100
103
|
const [subject, setSubject] = _react.useState.call(void 0, "");
|
|
101
104
|
const [content, setContent] = _react.useState.call(void 0, "");
|
|
102
|
-
const { attachments, readyAttachments, hasInflightUploads, addFiles, removeAttachment, clear } =
|
|
105
|
+
const { attachments, readyAttachments, hasInflightUploads, addFiles, removeAttachment, clear } = _chunkZGTDUPTWcjs.useChatAttachments.call(void 0, );
|
|
103
106
|
const trimmedSubject = subject.trim();
|
|
104
107
|
const trimmedContent = content.trim();
|
|
105
108
|
const overCap = content.length > TICKET_TEXT_MAX_CHARS;
|
|
@@ -119,7 +122,7 @@ function TicketOpenForm({
|
|
|
119
122
|
clear();
|
|
120
123
|
}
|
|
121
124
|
};
|
|
122
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
125
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "p-6", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { onSubmit: handleSubmit, className: "flex flex-col md:flex-row gap-6", children: [
|
|
123
126
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex-1 min-w-0 md:max-w-md", children: [
|
|
124
127
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-2xl font-semibold text-ods-text-primary mb-2", children: "Need Support?" }),
|
|
125
128
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-sm", children: "Can't find what you're looking for? Submit a support ticket below \u2014 we'll follow up shortly." }),
|
|
@@ -136,7 +139,7 @@ function TicketOpenForm({
|
|
|
136
139
|
}
|
|
137
140
|
),
|
|
138
141
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
139
|
-
|
|
142
|
+
_chunkXDPSSE4Ocjs.Input,
|
|
140
143
|
{
|
|
141
144
|
id: "ticket-subject",
|
|
142
145
|
type: "text",
|
|
@@ -158,7 +161,7 @@ function TicketOpenForm({
|
|
|
158
161
|
}
|
|
159
162
|
),
|
|
160
163
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
161
|
-
|
|
164
|
+
_chunkZGTDUPTWcjs.Textarea,
|
|
162
165
|
{
|
|
163
166
|
id: "ticket-content",
|
|
164
167
|
placeholder: "Describe your issue or question in detail...",
|
|
@@ -182,7 +185,7 @@ function TicketOpenForm({
|
|
|
182
185
|
)
|
|
183
186
|
] }),
|
|
184
187
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
185
|
-
|
|
188
|
+
_chunkZGTDUPTWcjs.ChatAttachmentChipStrip,
|
|
186
189
|
{
|
|
187
190
|
attachments,
|
|
188
191
|
onRemove: removeAttachment,
|
|
@@ -191,7 +194,7 @@ function TicketOpenForm({
|
|
|
191
194
|
),
|
|
192
195
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between gap-3", children: [
|
|
193
196
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
194
|
-
|
|
197
|
+
_chunkZGTDUPTWcjs.ChatAttachmentAddButton,
|
|
195
198
|
{
|
|
196
199
|
attachmentsEnabled: !supportSystemDown,
|
|
197
200
|
attachmentsCount: attachments.length,
|
|
@@ -200,7 +203,7 @@ function TicketOpenForm({
|
|
|
200
203
|
}
|
|
201
204
|
),
|
|
202
205
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
203
|
-
|
|
206
|
+
_chunkXDPSSE4Ocjs.Button,
|
|
204
207
|
{
|
|
205
208
|
type: "submit",
|
|
206
209
|
disabled: !canSubmit,
|
|
@@ -222,14 +225,14 @@ var Collapsible = CollapsiblePrimitive.Root;
|
|
|
222
225
|
var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
|
|
223
226
|
|
|
224
227
|
// src/components/tickets/ticket-detail-drawer.tsx
|
|
225
|
-
|
|
228
|
+
_chunkXDPSSE4Ocjs.init_button2.call(void 0, );
|
|
226
229
|
|
|
227
230
|
|
|
228
231
|
// src/components/tickets/hooks/use-ticket-engagements.ts
|
|
229
232
|
|
|
230
233
|
var LIST_ENGAGEMENTS_ENDPOINT = "/api/chat/agent/list-engagements";
|
|
231
234
|
function useTicketEngagements(externalTicketId, enabled = true) {
|
|
232
|
-
const identity =
|
|
235
|
+
const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
|
|
233
236
|
const identityKey = _nullishCoalesce(_optionalChain([identity, 'access', _ => _.user, 'optionalAccess', _2 => _2.email]), () => ( "anon"));
|
|
234
237
|
const queryEnabled = enabled && identity.authTier !== "anon" && !!_optionalChain([identity, 'access', _3 => _3.user, 'optionalAccess', _4 => _4.email]) && !!externalTicketId && !externalTicketId.startsWith("temp-");
|
|
235
238
|
const query = _reactquery.useQuery.call(void 0, {
|
|
@@ -243,7 +246,7 @@ function useTicketEngagements(externalTicketId, enabled = true) {
|
|
|
243
246
|
refetchOnMount: "always",
|
|
244
247
|
refetchOnWindowFocus: true,
|
|
245
248
|
queryFn: async () => {
|
|
246
|
-
const response = await
|
|
249
|
+
const response = await _chunkZGTDUPTWcjs.embedAuthedFetch.call(void 0, LIST_ENGAGEMENTS_ENDPOINT, {
|
|
247
250
|
method: "POST",
|
|
248
251
|
body: JSON.stringify({ ticket_id: externalTicketId })
|
|
249
252
|
});
|
|
@@ -291,7 +294,7 @@ function TicketLinkedDeliveryCard({
|
|
|
291
294
|
{
|
|
292
295
|
className: `rounded-md border border-ods-border bg-ods-bg overflow-hidden ${_nullishCoalesce(className, () => ( ""))}`,
|
|
293
296
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
294
|
-
|
|
297
|
+
_chunkK4DFAVSOcjs.DeliveryRow,
|
|
295
298
|
{
|
|
296
299
|
item,
|
|
297
300
|
href: clickup.delivery_href,
|
|
@@ -311,43 +314,59 @@ function TicketDetailDrawer({
|
|
|
311
314
|
onSendMessage,
|
|
312
315
|
onClose,
|
|
313
316
|
onReopen,
|
|
314
|
-
onActionCollapsed
|
|
317
|
+
onActionCollapsed,
|
|
318
|
+
replyError,
|
|
319
|
+
onClearReplyError
|
|
315
320
|
}) {
|
|
316
321
|
const isClosed = (_nullishCoalesce(ticket.status, () => ( ""))).toUpperCase() === "CLOSED";
|
|
317
322
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-ods-card border-t border-ods-border px-4 py-4 flex flex-col gap-4", children: [
|
|
323
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssignedAgentRow, { assignedOwner: ticket.assignedOwner }),
|
|
318
324
|
ticket.clickup && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketLinkedDeliveryCard, { clickup: ticket.clickup }),
|
|
319
325
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
|
|
320
326
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-xs font-medium text-ods-text-secondary mb-2 uppercase tracking-wider", children: "Conversation" }),
|
|
321
327
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketTimelinePanel, { ticket })
|
|
322
328
|
] }),
|
|
323
|
-
/* @__PURE__ */ _jsxruntime.
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
329
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "border-t border-ods-border pt-4", children: [
|
|
330
|
+
replyError && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
331
|
+
ReplyFailureBanner,
|
|
332
|
+
{
|
|
333
|
+
error: replyError,
|
|
334
|
+
onDismiss: _nullishCoalesce(onClearReplyError, () => ( (() => void 0)))
|
|
335
|
+
}
|
|
336
|
+
),
|
|
337
|
+
isClosed ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
338
|
+
ReopenAction,
|
|
339
|
+
{
|
|
340
|
+
ticketRef: { id: ticket.id, external_id: ticket.external_id },
|
|
341
|
+
busy,
|
|
342
|
+
supportSystemDown,
|
|
343
|
+
onReopen,
|
|
344
|
+
onActionCollapsed
|
|
345
|
+
}
|
|
346
|
+
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
347
|
+
OpenActions,
|
|
348
|
+
{
|
|
349
|
+
ticket,
|
|
350
|
+
busy,
|
|
351
|
+
supportSystemDown,
|
|
352
|
+
onSendMessage,
|
|
353
|
+
onClose,
|
|
354
|
+
onActionCollapsed
|
|
355
|
+
}
|
|
356
|
+
)
|
|
357
|
+
] })
|
|
343
358
|
] });
|
|
344
359
|
}
|
|
345
360
|
var TURN_SEPARATOR_RE = /[\s]{1,16}---[\s]{1,16}/g;
|
|
346
361
|
function TicketTimelinePanel({ ticket }) {
|
|
347
|
-
const identity =
|
|
362
|
+
const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
|
|
348
363
|
const externalId = isOptimistic(ticket) ? null : ticket.external_id;
|
|
349
364
|
const { engagements, isLoading } = useTicketEngagements(externalId, !!externalId);
|
|
350
365
|
const bodyTurns = ticket.body ? ticket.body.split(TURN_SEPARATOR_RE).map((t) => t.trim()).filter(Boolean) : [];
|
|
366
|
+
const customerEngagementBodies = new Set(
|
|
367
|
+
engagements.filter((e) => e.authorRole === "customer").map((e) => (_nullishCoalesce(e.body, () => ( ""))).trim()).filter(Boolean)
|
|
368
|
+
);
|
|
369
|
+
const suppressBodyTurnZero = bodyTurns.length > 0 && customerEngagementBodies.has(bodyTurns[0]);
|
|
351
370
|
const sessionEmailLower = _nullishCoalesce(_optionalChain([identity, 'access', _5 => _5.user, 'optionalAccess', _6 => _6.email, 'optionalAccess', _7 => _7.trim, 'call', _8 => _8(), 'access', _9 => _9.toLowerCase, 'call', _10 => _10()]), () => ( null));
|
|
352
371
|
const isViewerTheCustomer = !!sessionEmailLower && ticket.customer_emails.some((e) => e.trim().toLowerCase() === sessionEmailLower);
|
|
353
372
|
const viewerName = _optionalChain([identity, 'access', _11 => _11.user, 'optionalAccess', _12 => _12.name, 'optionalAccess', _13 => _13.trim, 'call', _14 => _14()]) || null;
|
|
@@ -356,10 +375,10 @@ function TicketTimelinePanel({ ticket }) {
|
|
|
356
375
|
const customerAvatar = isViewerTheCustomer ? _nullishCoalesce(_optionalChain([identity, 'access', _20 => _20.user, 'optionalAccess', _21 => _21.avatarUrl]), () => ( void 0)) : void 0;
|
|
357
376
|
if (bodyTurns.length === 0 && engagements.length === 0) {
|
|
358
377
|
if (isLoading) {
|
|
359
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
378
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.ConversationCardRowSkeletonList, { rows: 2 });
|
|
360
379
|
}
|
|
361
380
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
362
|
-
|
|
381
|
+
_chunkK4DFAVSOcjs.EmptyState,
|
|
363
382
|
{
|
|
364
383
|
type: "generic",
|
|
365
384
|
title: "No conversation yet",
|
|
@@ -370,11 +389,12 @@ function TicketTimelinePanel({ ticket }) {
|
|
|
370
389
|
}
|
|
371
390
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full", children: [
|
|
372
391
|
bodyTurns.map((turn, i) => {
|
|
392
|
+
if (i === 0 && suppressBodyTurnZero) return null;
|
|
373
393
|
const isResolution = turn.startsWith("[Resolution]");
|
|
374
394
|
const role = i === 0 ? "Original message" : isResolution ? "Resolution" : `Update ${i}`;
|
|
375
395
|
const text = isResolution ? turn.replace(/^\[Resolution\]\s*/, "") : turn;
|
|
376
396
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
377
|
-
|
|
397
|
+
_chunkIH76P5R6cjs.ConversationCardRow,
|
|
378
398
|
{
|
|
379
399
|
author: customerName,
|
|
380
400
|
role,
|
|
@@ -404,7 +424,7 @@ function TicketTimelinePanel({ ticket }) {
|
|
|
404
424
|
avatarSrc = void 0;
|
|
405
425
|
}
|
|
406
426
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
407
|
-
|
|
427
|
+
_chunkIH76P5R6cjs.ConversationCardRow,
|
|
408
428
|
{
|
|
409
429
|
author,
|
|
410
430
|
role: "Reply",
|
|
@@ -421,7 +441,7 @@ function TicketTimelinePanel({ ticket }) {
|
|
|
421
441
|
// content rendered — drawer is showing the customer's body
|
|
422
442
|
// turns + cached engagements while a background refetch is
|
|
423
443
|
// in flight. Single row keeps the placeholder modest.
|
|
424
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
444
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.ConversationCardRowSkeletonList, { rows: 1 })
|
|
425
445
|
] });
|
|
426
446
|
}
|
|
427
447
|
function mapEngagementAttachments(files) {
|
|
@@ -449,11 +469,10 @@ function ReopenAction({
|
|
|
449
469
|
onActionCollapsed
|
|
450
470
|
}) {
|
|
451
471
|
const handleReopen = async () => {
|
|
452
|
-
|
|
453
|
-
if (ok) onActionCollapsed();
|
|
472
|
+
void await onReopen(ticketRef);
|
|
454
473
|
};
|
|
455
474
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-end", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
456
|
-
|
|
475
|
+
_chunkXDPSSE4Ocjs.Button,
|
|
457
476
|
{
|
|
458
477
|
type: "button",
|
|
459
478
|
onClick: () => void handleReopen(),
|
|
@@ -474,7 +493,7 @@ function OpenActions({
|
|
|
474
493
|
const [messageText, setMessageText] = _react.useState.call(void 0, "");
|
|
475
494
|
const [resolution, setResolution] = _react.useState.call(void 0, "");
|
|
476
495
|
const [closeDialogOpen, setCloseDialogOpen] = _react.useState.call(void 0, false);
|
|
477
|
-
const attachments =
|
|
496
|
+
const attachments = _chunkZGTDUPTWcjs.useChatAttachments.call(void 0, );
|
|
478
497
|
const disabled = busy || supportSystemDown;
|
|
479
498
|
const ticketRef = { id: ticket.id, external_id: ticket.external_id };
|
|
480
499
|
const hasText = messageText.trim().length > 0;
|
|
@@ -490,14 +509,13 @@ function OpenActions({
|
|
|
490
509
|
};
|
|
491
510
|
const confirmClose = async () => {
|
|
492
511
|
setCloseDialogOpen(false);
|
|
493
|
-
|
|
512
|
+
await onClose(ticketRef, resolution.trim() || void 0);
|
|
494
513
|
setResolution("");
|
|
495
|
-
if (ok) onActionCollapsed();
|
|
496
514
|
};
|
|
497
515
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-3", children: [
|
|
498
516
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2", children: [
|
|
499
517
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
500
|
-
|
|
518
|
+
_chunkZGTDUPTWcjs.Textarea,
|
|
501
519
|
{
|
|
502
520
|
value: messageText,
|
|
503
521
|
onChange: (e) => setMessageText(e.target.value),
|
|
@@ -508,7 +526,7 @@ function OpenActions({
|
|
|
508
526
|
}
|
|
509
527
|
),
|
|
510
528
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
511
|
-
|
|
529
|
+
_chunkZGTDUPTWcjs.ChatAttachmentChipStrip,
|
|
512
530
|
{
|
|
513
531
|
attachments: attachments.attachments,
|
|
514
532
|
onRemove: attachments.removeAttachment,
|
|
@@ -518,7 +536,7 @@ function OpenActions({
|
|
|
518
536
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex justify-between items-center gap-2 flex-wrap", children: [
|
|
519
537
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
|
|
520
538
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
521
|
-
|
|
539
|
+
_chunkZGTDUPTWcjs.ChatAttachmentAddButton,
|
|
522
540
|
{
|
|
523
541
|
attachmentsEnabled: !supportSystemDown,
|
|
524
542
|
attachmentsCount: attachments.attachments.length,
|
|
@@ -530,7 +548,7 @@ function OpenActions({
|
|
|
530
548
|
] }),
|
|
531
549
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
|
|
532
550
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
533
|
-
|
|
551
|
+
_chunkXDPSSE4Ocjs.Button,
|
|
534
552
|
{
|
|
535
553
|
type: "button",
|
|
536
554
|
variant: "transparent",
|
|
@@ -541,7 +559,7 @@ function OpenActions({
|
|
|
541
559
|
}
|
|
542
560
|
),
|
|
543
561
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
544
|
-
|
|
562
|
+
_chunkXDPSSE4Ocjs.Button,
|
|
545
563
|
{
|
|
546
564
|
type: "button",
|
|
547
565
|
onClick: () => void sendMessage(),
|
|
@@ -553,13 +571,13 @@ function OpenActions({
|
|
|
553
571
|
] })
|
|
554
572
|
] })
|
|
555
573
|
] }),
|
|
556
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
557
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
558
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
559
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
574
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.AlertDialog, { open: closeDialogOpen, onOpenChange: setCloseDialogOpen, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.AlertDialogContent, { className: "bg-ods-card border-ods-border", children: [
|
|
575
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.AlertDialogHeader, { children: [
|
|
576
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.AlertDialogTitle, { className: "text-ods-text-primary font-['DM_Sans'] text-[20px] font-semibold", children: "Close this ticket?" }),
|
|
577
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.AlertDialogDescription, { className: "text-ods-text-secondary font-['DM_Sans'] text-[14px]", children: "Add an optional resolution note below. You can reopen the ticket later if needed." })
|
|
560
578
|
] }),
|
|
561
579
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
562
|
-
|
|
580
|
+
_chunkZGTDUPTWcjs.Textarea,
|
|
563
581
|
{
|
|
564
582
|
value: resolution,
|
|
565
583
|
onChange: (e) => setResolution(e.target.value),
|
|
@@ -569,9 +587,9 @@ function OpenActions({
|
|
|
569
587
|
className: "mt-2"
|
|
570
588
|
}
|
|
571
589
|
),
|
|
572
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
590
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.AlertDialogFooter, { children: [
|
|
573
591
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
574
|
-
|
|
592
|
+
_chunkZGTDUPTWcjs.AlertDialogCancel,
|
|
575
593
|
{
|
|
576
594
|
disabled: busy,
|
|
577
595
|
className: "bg-transparent border-ods-border text-ods-text-primary hover:bg-ods-border",
|
|
@@ -579,7 +597,7 @@ function OpenActions({
|
|
|
579
597
|
}
|
|
580
598
|
),
|
|
581
599
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
582
|
-
|
|
600
|
+
_chunkZGTDUPTWcjs.AlertDialogAction,
|
|
583
601
|
{
|
|
584
602
|
onClick: () => void confirmClose(),
|
|
585
603
|
disabled: busy,
|
|
@@ -591,6 +609,56 @@ function OpenActions({
|
|
|
591
609
|
] }) })
|
|
592
610
|
] });
|
|
593
611
|
}
|
|
612
|
+
function ReplyFailureBanner({
|
|
613
|
+
error,
|
|
614
|
+
onDismiss
|
|
615
|
+
}) {
|
|
616
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
617
|
+
"div",
|
|
618
|
+
{
|
|
619
|
+
role: "status",
|
|
620
|
+
"aria-live": "polite",
|
|
621
|
+
className: "mb-3 flex items-start gap-3 rounded-md border border-ods-attention-red-error bg-ods-attention-red-error-secondary px-3 py-2 text-sm text-ods-attention-red-error",
|
|
622
|
+
children: [
|
|
623
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "font-medium leading-snug", children: error.message }),
|
|
624
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
625
|
+
_chunkXDPSSE4Ocjs.Button,
|
|
626
|
+
{
|
|
627
|
+
type: "button",
|
|
628
|
+
variant: "transparent",
|
|
629
|
+
onClick: onDismiss,
|
|
630
|
+
"aria-label": "Dismiss reply failure",
|
|
631
|
+
className: "ml-auto px-2 py-0.5 text-xs font-medium uppercase tracking-wider text-ods-attention-red-error hover:bg-ods-attention-red-error/10 border-transparent",
|
|
632
|
+
children: "Dismiss"
|
|
633
|
+
}
|
|
634
|
+
)
|
|
635
|
+
]
|
|
636
|
+
}
|
|
637
|
+
);
|
|
638
|
+
}
|
|
639
|
+
function AssignedAgentRow({
|
|
640
|
+
assignedOwner
|
|
641
|
+
}) {
|
|
642
|
+
const trimmedName = _optionalChain([assignedOwner, 'optionalAccess', _30 => _30.name, 'optionalAccess', _31 => _31.trim, 'call', _32 => _32()]) || null;
|
|
643
|
+
const emailFallback = _optionalChain([assignedOwner, 'optionalAccess', _33 => _33.email, 'optionalAccess', _34 => _34.trim, 'call', _35 => _35()]) || null;
|
|
644
|
+
const displayLabel = _nullishCoalesce(trimmedName, () => ( (emailFallback ? emailFallback.split("@")[0] : null)));
|
|
645
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 text-xs", children: [
|
|
646
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-secondary uppercase tracking-wider font-medium", children: "Assigned to" }),
|
|
647
|
+
displayLabel ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-1.5 text-ods-text-primary font-medium", children: [
|
|
648
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
649
|
+
_chunkZGTDUPTWcjs.SquareAvatar,
|
|
650
|
+
{
|
|
651
|
+
size: "sm",
|
|
652
|
+
variant: "round",
|
|
653
|
+
src: _nullishCoalesce(_optionalChain([assignedOwner, 'optionalAccess', _36 => _36.avatarUrl]), () => ( void 0)),
|
|
654
|
+
alt: displayLabel,
|
|
655
|
+
fallback: displayLabel
|
|
656
|
+
}
|
|
657
|
+
),
|
|
658
|
+
displayLabel
|
|
659
|
+
] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-secondary italic", children: "Unassigned" })
|
|
660
|
+
] });
|
|
661
|
+
}
|
|
594
662
|
|
|
595
663
|
// src/components/tickets/ticket-row.tsx
|
|
596
664
|
|
|
@@ -609,7 +677,7 @@ function TicketRow({
|
|
|
609
677
|
const rowRef = _react.useRef.call(void 0, null);
|
|
610
678
|
const handleClick = _react.useCallback.call(void 0, () => {
|
|
611
679
|
onToggle(ticket.id);
|
|
612
|
-
|
|
680
|
+
_chunkZGTDUPTWcjs.scrollElementIntoView.call(void 0, rowRef.current, {
|
|
613
681
|
adjustTargetY: (raw) => {
|
|
614
682
|
if (!rowRef.current) return raw;
|
|
615
683
|
const expandedDrawer = document.querySelector(
|
|
@@ -635,7 +703,7 @@ function TicketRow({
|
|
|
635
703
|
// so the badge accurately reflects "Closed" with a checkmark.
|
|
636
704
|
statusLabel: _nullishCoalesce(ticket.pipeline_stage_label, () => ( void 0)),
|
|
637
705
|
category: _nullishCoalesce(ticket.customer_company, () => ( void 0)),
|
|
638
|
-
timeAgo: ticket.hubspot_updated_at ?
|
|
706
|
+
timeAgo: ticket.hubspot_updated_at ? _chunkZGTDUPTWcjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : void 0,
|
|
639
707
|
// Linked-work chip: surfaced whenever the ticket has a linked
|
|
640
708
|
// ClickUp task. Uses the linked task's own status so the chip text
|
|
641
709
|
// reads "Working" / "Waiting on version release" / etc. — useful
|
|
@@ -650,7 +718,7 @@ function TicketRow({
|
|
|
650
718
|
className: "border-b border-ods-border last:border-b-0",
|
|
651
719
|
children: [
|
|
652
720
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
653
|
-
|
|
721
|
+
_chunkZGTDUPTWcjs.ChatTicketItem,
|
|
654
722
|
{
|
|
655
723
|
ticket: tileData,
|
|
656
724
|
onClick: optimistic ? void 0 : handleClick,
|
|
@@ -714,7 +782,7 @@ function useTicketsList(filters) {
|
|
|
714
782
|
pageSize
|
|
715
783
|
};
|
|
716
784
|
if (statusFilter) body.status = statusFilter;
|
|
717
|
-
const response = await
|
|
785
|
+
const response = await _chunkZGTDUPTWcjs.embedAuthedFetch.call(void 0, FIND_TICKET_ENDPOINT, {
|
|
718
786
|
method: "POST",
|
|
719
787
|
body: JSON.stringify(body)
|
|
720
788
|
});
|
|
@@ -726,12 +794,12 @@ function useTicketsList(filters) {
|
|
|
726
794
|
}
|
|
727
795
|
});
|
|
728
796
|
const data = query.data;
|
|
729
|
-
const totalCount = _nullishCoalesce(_nullishCoalesce(_optionalChain([data, 'optionalAccess',
|
|
730
|
-
const echoedPage = _nullishCoalesce(_optionalChain([data, 'optionalAccess',
|
|
731
|
-
const echoedPageSize = _nullishCoalesce(_optionalChain([data, 'optionalAccess',
|
|
732
|
-
const totalPages = _nullishCoalesce(_optionalChain([data, 'optionalAccess',
|
|
797
|
+
const totalCount = _nullishCoalesce(_nullishCoalesce(_optionalChain([data, 'optionalAccess', _37 => _37.totalCount]), () => ( _optionalChain([data, 'optionalAccess', _38 => _38.count]))), () => ( (_nullishCoalesce(_optionalChain([data, 'optionalAccess', _39 => _39.tickets, 'optionalAccess', _40 => _40.length]), () => ( 0)))));
|
|
798
|
+
const echoedPage = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _41 => _41.page]), () => ( page));
|
|
799
|
+
const echoedPageSize = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _42 => _42.pageSize]), () => ( pageSize));
|
|
800
|
+
const totalPages = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _43 => _43.totalPages]), () => ( Math.max(1, Math.ceil(totalCount / echoedPageSize))));
|
|
733
801
|
return {
|
|
734
|
-
tickets: _nullishCoalesce(_optionalChain([data, 'optionalAccess',
|
|
802
|
+
tickets: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _44 => _44.tickets]), () => ( [])),
|
|
735
803
|
// Loading-state-truth = `data === undefined`. TanStack v5's
|
|
736
804
|
// `isPending` / `isLoading` flags can be `false` in transient
|
|
737
805
|
// windows where the query is enabled-but-fetch-not-yet-fired
|
|
@@ -753,7 +821,7 @@ function useTicketsList(filters) {
|
|
|
753
821
|
// - Background refetch with existing data: data !== undefined → no load
|
|
754
822
|
// - Filter-change refetch landing on empty results: data?.tickets===[]
|
|
755
823
|
// + isFetching → bridge skeleton (the `||` branch)
|
|
756
|
-
isLoading: enabled && (data === void 0 || query.isFetching && (_nullishCoalesce(_optionalChain([data, 'optionalAccess',
|
|
824
|
+
isLoading: enabled && (data === void 0 || query.isFetching && (_nullishCoalesce(_optionalChain([data, 'optionalAccess', _45 => _45.tickets]), () => ( []))).length === 0),
|
|
757
825
|
isFetching: query.isFetching,
|
|
758
826
|
error: _nullishCoalesce(query.error, () => ( null)),
|
|
759
827
|
refetch: () => {
|
|
@@ -771,6 +839,12 @@ function useTicketsList(filters) {
|
|
|
771
839
|
|
|
772
840
|
|
|
773
841
|
var TICKET_ACTION_ENDPOINT = "/api/chat/agent/ticket-action";
|
|
842
|
+
var REPLY_BANNER_CODES = /* @__PURE__ */ new Set([
|
|
843
|
+
"HUBSPOT_5XX",
|
|
844
|
+
"HUBSPOT_400_VALIDATION",
|
|
845
|
+
"HUBSPOT_404_THREAD",
|
|
846
|
+
"HUBSPOT_REPLY_UNKNOWN"
|
|
847
|
+
]);
|
|
774
848
|
var MIRROR_SYNC_BACKOFF_MS = [3e3, 6e3, 12e3];
|
|
775
849
|
function useTicketActions(options) {
|
|
776
850
|
const queryClient = _reactquery.useQueryClient.call(void 0, );
|
|
@@ -785,6 +859,26 @@ function useTicketActions(options) {
|
|
|
785
859
|
setBusyRows(new Set(busyRowsRef.current));
|
|
786
860
|
}, []);
|
|
787
861
|
const isRowBusy = _react.useCallback.call(void 0, (id) => busyRows.has(id), [busyRows]);
|
|
862
|
+
const [replyErrorByTicket, setReplyErrorByTicket] = _react.useState.call(void 0, () => /* @__PURE__ */ new Map());
|
|
863
|
+
const setReplyError = _react.useCallback.call(void 0,
|
|
864
|
+
(externalId, mapped) => {
|
|
865
|
+
setReplyErrorByTicket((prev) => {
|
|
866
|
+
const next = new Map(prev);
|
|
867
|
+
if (mapped) next.set(externalId, mapped);
|
|
868
|
+
else next.delete(externalId);
|
|
869
|
+
return next;
|
|
870
|
+
});
|
|
871
|
+
},
|
|
872
|
+
[]
|
|
873
|
+
);
|
|
874
|
+
const replyErrorFor = _react.useCallback.call(void 0,
|
|
875
|
+
(externalId) => _nullishCoalesce(replyErrorByTicket.get(externalId), () => ( null)),
|
|
876
|
+
[replyErrorByTicket]
|
|
877
|
+
);
|
|
878
|
+
const clearReplyError = _react.useCallback.call(void 0,
|
|
879
|
+
(externalId) => setReplyError(externalId, null),
|
|
880
|
+
[setReplyError]
|
|
881
|
+
);
|
|
788
882
|
const watcherControllersRef = _react.useRef.call(void 0, /* @__PURE__ */ new Map());
|
|
789
883
|
_react.useEffect.call(void 0, () => {
|
|
790
884
|
return () => {
|
|
@@ -802,7 +896,7 @@ function useTicketActions(options) {
|
|
|
802
896
|
}, []);
|
|
803
897
|
const executeTicketAction = _react.useCallback.call(void 0,
|
|
804
898
|
async (toolName, args) => {
|
|
805
|
-
const res = await
|
|
899
|
+
const res = await _chunkZGTDUPTWcjs.embedAuthedFetch.call(void 0, TICKET_ACTION_ENDPOINT, {
|
|
806
900
|
method: "POST",
|
|
807
901
|
body: JSON.stringify({ tool_name: toolName, args })
|
|
808
902
|
});
|
|
@@ -862,9 +956,11 @@ function useTicketActions(options) {
|
|
|
862
956
|
},
|
|
863
957
|
[queryClient, removeOptimistic, toast2]
|
|
864
958
|
);
|
|
959
|
+
const lastUpdateErrorRef = _react.useRef.call(void 0, null);
|
|
865
960
|
const surfaceError = _react.useCallback.call(void 0,
|
|
866
961
|
(err, action) => {
|
|
867
962
|
const mapped = mapTicketActionError(err);
|
|
963
|
+
lastUpdateErrorRef.current = mapped;
|
|
868
964
|
if (mapped.supportSystemDown) onSupportSystemDown();
|
|
869
965
|
toast2({
|
|
870
966
|
title: `Could not ${action}`,
|
|
@@ -899,6 +995,10 @@ function useTicketActions(options) {
|
|
|
899
995
|
// seconds via the mirror refetch. Drawer uses live chat
|
|
900
996
|
// identity for own-replies during this window anyway.
|
|
901
997
|
customer_name: null,
|
|
998
|
+
// No assignee until the real ticket lands. Drawer renders
|
|
999
|
+
// "Unassigned" for this brief window.
|
|
1000
|
+
assigned_to: null,
|
|
1001
|
+
assignedOwner: null,
|
|
902
1002
|
hubspot_updated_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
903
1003
|
_optimistic: true
|
|
904
1004
|
};
|
|
@@ -908,7 +1008,7 @@ function useTicketActions(options) {
|
|
|
908
1008
|
const result = await executeTicketAction("create_ticket", {
|
|
909
1009
|
subject: input.subject.trim(),
|
|
910
1010
|
content: input.content.trim(),
|
|
911
|
-
..._optionalChain([input, 'access',
|
|
1011
|
+
..._optionalChain([input, 'access', _46 => _46.attachments, 'optionalAccess', _47 => _47.length]) ? { attachments: input.attachments } : {}
|
|
912
1012
|
});
|
|
913
1013
|
if (result.mirror_synced === false) {
|
|
914
1014
|
toast2(TOAST_COPY.open_mirror_pending);
|
|
@@ -951,10 +1051,23 @@ function useTicketActions(options) {
|
|
|
951
1051
|
ticket_id: ticket.external_id
|
|
952
1052
|
});
|
|
953
1053
|
toast2(successCopy);
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
queryClient.
|
|
957
|
-
|
|
1054
|
+
const statusUpdate = _nullishCoalesce(serverArgs.status, () => ( null));
|
|
1055
|
+
if (statusUpdate) {
|
|
1056
|
+
queryClient.setQueriesData(
|
|
1057
|
+
{ queryKey: ["tickets"] },
|
|
1058
|
+
(prev) => {
|
|
1059
|
+
if (!prev || !Array.isArray(prev.tickets)) return prev;
|
|
1060
|
+
let mutated = false;
|
|
1061
|
+
const nextTickets = prev.tickets.map((t) => {
|
|
1062
|
+
if (t.id !== ticket.id || t.status === statusUpdate) return t;
|
|
1063
|
+
mutated = true;
|
|
1064
|
+
return { ...t, status: statusUpdate };
|
|
1065
|
+
});
|
|
1066
|
+
return mutated ? { ...prev, tickets: nextTickets } : prev;
|
|
1067
|
+
}
|
|
1068
|
+
);
|
|
1069
|
+
}
|
|
1070
|
+
await queryClient.invalidateQueries({ queryKey: ["ticket-engagements"] });
|
|
958
1071
|
return true;
|
|
959
1072
|
});
|
|
960
1073
|
} catch (err) {
|
|
@@ -974,12 +1087,13 @@ function useTicketActions(options) {
|
|
|
974
1087
|
[setRowBusy, enqueue, executeTicketAction, queryClient, toast2, surfaceError, removeTicketFromCache]
|
|
975
1088
|
);
|
|
976
1089
|
const sendMessage = _react.useCallback.call(void 0,
|
|
977
|
-
(ticket, text, attachments) => {
|
|
1090
|
+
async (ticket, text, attachments) => {
|
|
978
1091
|
const trimmed = text.trim();
|
|
979
1092
|
const hasText = trimmed.length > 0;
|
|
980
1093
|
const hasFiles = attachments.length > 0;
|
|
981
|
-
if (!hasText && !hasFiles) return
|
|
982
|
-
|
|
1094
|
+
if (!hasText && !hasFiles) return false;
|
|
1095
|
+
lastUpdateErrorRef.current = null;
|
|
1096
|
+
const ok = await updateTicket(
|
|
983
1097
|
ticket,
|
|
984
1098
|
{
|
|
985
1099
|
...hasText ? { content_addendum: trimmed } : {},
|
|
@@ -988,15 +1102,25 @@ function useTicketActions(options) {
|
|
|
988
1102
|
TOAST_COPY.comment_success,
|
|
989
1103
|
"send message"
|
|
990
1104
|
);
|
|
1105
|
+
if (ok) {
|
|
1106
|
+
clearReplyError(ticket.external_id);
|
|
1107
|
+
} else {
|
|
1108
|
+
const mapped = lastUpdateErrorRef.current;
|
|
1109
|
+
if (mapped && REPLY_BANNER_CODES.has(mapped.code)) {
|
|
1110
|
+
setReplyError(ticket.external_id, mapped);
|
|
1111
|
+
}
|
|
1112
|
+
lastUpdateErrorRef.current = null;
|
|
1113
|
+
}
|
|
1114
|
+
return ok;
|
|
991
1115
|
},
|
|
992
|
-
[updateTicket]
|
|
1116
|
+
[updateTicket, clearReplyError, setReplyError]
|
|
993
1117
|
);
|
|
994
1118
|
const closeTicket = _react.useCallback.call(void 0,
|
|
995
1119
|
(ticket, resolution) => updateTicket(
|
|
996
1120
|
ticket,
|
|
997
1121
|
{
|
|
998
1122
|
status: "CLOSED",
|
|
999
|
-
..._optionalChain([resolution, 'optionalAccess',
|
|
1123
|
+
..._optionalChain([resolution, 'optionalAccess', _48 => _48.trim, 'call', _49 => _49()]) ? { resolution: resolution.trim() } : {}
|
|
1000
1124
|
},
|
|
1001
1125
|
TOAST_COPY.close_success,
|
|
1002
1126
|
"close ticket"
|
|
@@ -1014,9 +1138,20 @@ function useTicketActions(options) {
|
|
|
1014
1138
|
closeTicket,
|
|
1015
1139
|
reopenTicket,
|
|
1016
1140
|
isSubmittingForm,
|
|
1017
|
-
isRowBusy
|
|
1141
|
+
isRowBusy,
|
|
1142
|
+
replyErrorFor,
|
|
1143
|
+
clearReplyError
|
|
1018
1144
|
}),
|
|
1019
|
-
[
|
|
1145
|
+
[
|
|
1146
|
+
submitTicket,
|
|
1147
|
+
sendMessage,
|
|
1148
|
+
closeTicket,
|
|
1149
|
+
reopenTicket,
|
|
1150
|
+
isSubmittingForm,
|
|
1151
|
+
isRowBusy,
|
|
1152
|
+
replyErrorFor,
|
|
1153
|
+
clearReplyError
|
|
1154
|
+
]
|
|
1020
1155
|
);
|
|
1021
1156
|
}
|
|
1022
1157
|
var TicketActionFailure = class extends Error {
|
|
@@ -1058,7 +1193,7 @@ function mapTicketActionError(err) {
|
|
|
1058
1193
|
removeRowFromCache: false
|
|
1059
1194
|
};
|
|
1060
1195
|
case "RATE_LIMITED": {
|
|
1061
|
-
const retryAfterRaw = _optionalChain([err, 'access',
|
|
1196
|
+
const retryAfterRaw = _optionalChain([err, 'access', _50 => _50.response, 'optionalAccess', _51 => _51.headers, 'access', _52 => _52.get, 'call', _53 => _53("Retry-After")]);
|
|
1062
1197
|
const retryAfterSeconds = retryAfterRaw ? parseInt(retryAfterRaw, 10) : void 0;
|
|
1063
1198
|
return {
|
|
1064
1199
|
code: err.code,
|
|
@@ -1075,6 +1210,34 @@ function mapTicketActionError(err) {
|
|
|
1075
1210
|
supportSystemDown: false,
|
|
1076
1211
|
removeRowFromCache: false
|
|
1077
1212
|
};
|
|
1213
|
+
case "HUBSPOT_5XX":
|
|
1214
|
+
return {
|
|
1215
|
+
code: err.code,
|
|
1216
|
+
message: "We couldn't reach the support system. Your reply wasn't sent \u2014 please retry in a moment.",
|
|
1217
|
+
supportSystemDown: false,
|
|
1218
|
+
removeRowFromCache: false
|
|
1219
|
+
};
|
|
1220
|
+
case "HUBSPOT_400_VALIDATION":
|
|
1221
|
+
return {
|
|
1222
|
+
code: err.code,
|
|
1223
|
+
message: "Your reply was rejected. Please rephrase or remove unsupported content and try again.",
|
|
1224
|
+
supportSystemDown: false,
|
|
1225
|
+
removeRowFromCache: false
|
|
1226
|
+
};
|
|
1227
|
+
case "HUBSPOT_404_THREAD":
|
|
1228
|
+
return {
|
|
1229
|
+
code: err.code,
|
|
1230
|
+
message: "This conversation is no longer accepting replies. Open a new ticket to continue.",
|
|
1231
|
+
supportSystemDown: false,
|
|
1232
|
+
removeRowFromCache: false
|
|
1233
|
+
};
|
|
1234
|
+
case "HUBSPOT_REPLY_UNKNOWN":
|
|
1235
|
+
return {
|
|
1236
|
+
code: err.code,
|
|
1237
|
+
message: "Your reply didn't go through. Please retry.",
|
|
1238
|
+
supportSystemDown: false,
|
|
1239
|
+
removeRowFromCache: false
|
|
1240
|
+
};
|
|
1078
1241
|
default:
|
|
1079
1242
|
return {
|
|
1080
1243
|
code: "UNKNOWN",
|
|
@@ -1098,9 +1261,11 @@ function cryptoRandomId() {
|
|
|
1098
1261
|
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
1099
1262
|
}
|
|
1100
1263
|
function cacheContainsTicket(queryClient, expectedTicketId) {
|
|
1101
|
-
const entries = queryClient.getQueriesData({
|
|
1264
|
+
const entries = queryClient.getQueriesData({
|
|
1265
|
+
queryKey: ["tickets"]
|
|
1266
|
+
});
|
|
1102
1267
|
for (const [, data] of entries) {
|
|
1103
|
-
if (Array.isArray(data) && data.some((t) => t.external_id === expectedTicketId)) {
|
|
1268
|
+
if (data && Array.isArray(data.tickets) && data.tickets.some((t) => t.external_id === expectedTicketId)) {
|
|
1104
1269
|
return true;
|
|
1105
1270
|
}
|
|
1106
1271
|
}
|
|
@@ -1115,14 +1280,14 @@ function resolveErrorCode(bodyCode, status) {
|
|
|
1115
1280
|
|
|
1116
1281
|
// src/components/tickets/ticket-center.tsx
|
|
1117
1282
|
|
|
1118
|
-
function TicketCenter({ toast: toast2 =
|
|
1119
|
-
const identity =
|
|
1283
|
+
function TicketCenter({ toast: toast2 = _chunk5V6MSE3Bcjs.toast } = {}) {
|
|
1284
|
+
const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
|
|
1120
1285
|
if (identity.isLoading) {
|
|
1121
1286
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketCenterSkeleton, {});
|
|
1122
1287
|
}
|
|
1123
|
-
if (identity.authTier === "anon" || !_optionalChain([identity, 'access',
|
|
1288
|
+
if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _54 => _54.user, 'optionalAccess', _55 => _55.email])) {
|
|
1124
1289
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1125
|
-
|
|
1290
|
+
_chunkK4DFAVSOcjs.EmptyState,
|
|
1126
1291
|
{
|
|
1127
1292
|
type: "generic",
|
|
1128
1293
|
title: "Sign in to manage tickets",
|
|
@@ -1193,10 +1358,10 @@ function TicketCenterAuthed({
|
|
|
1193
1358
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-3 text-xs text-ods-text-secondary", children: [
|
|
1194
1359
|
lastUpdatedAt && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
|
|
1195
1360
|
"Updated ",
|
|
1196
|
-
|
|
1361
|
+
_chunkZGTDUPTWcjs.formatRelativeTime.call(void 0, new Date(lastUpdatedAt))
|
|
1197
1362
|
] }),
|
|
1198
1363
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1199
|
-
|
|
1364
|
+
_chunkXDPSSE4Ocjs.Button,
|
|
1200
1365
|
{
|
|
1201
1366
|
type: "button",
|
|
1202
1367
|
variant: "transparent",
|
|
@@ -1209,15 +1374,15 @@ function TicketCenterAuthed({
|
|
|
1209
1374
|
)
|
|
1210
1375
|
] })
|
|
1211
1376
|
] }),
|
|
1212
|
-
isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketListSkeleton, {}) : merged.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1213
|
-
|
|
1377
|
+
isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketListSkeleton, {}) : merged.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "p-6", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1378
|
+
_chunkK4DFAVSOcjs.EmptyState,
|
|
1214
1379
|
{
|
|
1215
1380
|
type: "generic",
|
|
1216
1381
|
title: "No tickets yet",
|
|
1217
1382
|
description: "Open one above to start the conversation.",
|
|
1218
1383
|
showCTA: false
|
|
1219
1384
|
}
|
|
1220
|
-
) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1385
|
+
) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "overflow-hidden", children: merged.map((ticket) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1221
1386
|
TicketRow,
|
|
1222
1387
|
{
|
|
1223
1388
|
ticket,
|
|
@@ -1237,29 +1402,29 @@ function TicketCenterAuthed({
|
|
|
1237
1402
|
}
|
|
1238
1403
|
function TicketCenterSkeleton() {
|
|
1239
1404
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-6", children: [
|
|
1240
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1241
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1242
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1243
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1405
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "p-6", children: [
|
|
1406
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-7 w-48 mb-4" }),
|
|
1407
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-10 w-full mb-3" }),
|
|
1408
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-24 w-full" })
|
|
1244
1409
|
] }),
|
|
1245
1410
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketListSkeleton, {})
|
|
1246
1411
|
] });
|
|
1247
1412
|
}
|
|
1248
1413
|
function TicketListSkeleton() {
|
|
1249
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1414
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "overflow-hidden", children: [0, 1, 2].map((i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "h-20 px-4 flex items-center gap-4 border-b border-ods-border last:border-b-0", children: [
|
|
1250
1415
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex-1 flex flex-col gap-2", children: [
|
|
1251
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1252
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1416
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-4 w-2/3" }),
|
|
1417
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-3 w-full" })
|
|
1253
1418
|
] }),
|
|
1254
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1255
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1419
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-8 w-20" }),
|
|
1420
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-8 w-16" })
|
|
1256
1421
|
] }, i)) });
|
|
1257
1422
|
}
|
|
1258
1423
|
|
|
1259
1424
|
// src/components/tickets/help-center-list.tsx
|
|
1260
1425
|
|
|
1261
1426
|
|
|
1262
|
-
|
|
1427
|
+
_chunkK4DFAVSOcjs.init_unified_pagination.call(void 0, );
|
|
1263
1428
|
|
|
1264
1429
|
// src/components/tickets/help-center-card.tsx
|
|
1265
1430
|
|
|
@@ -1274,12 +1439,14 @@ function HelpCenterCard({
|
|
|
1274
1439
|
onSendMessage,
|
|
1275
1440
|
onClose,
|
|
1276
1441
|
onReopen,
|
|
1277
|
-
onActionCollapsed
|
|
1442
|
+
onActionCollapsed,
|
|
1443
|
+
replyError,
|
|
1444
|
+
onClearReplyError
|
|
1278
1445
|
}) {
|
|
1279
1446
|
const optimistic = isOptimistic(ticket);
|
|
1280
1447
|
const rawStatus = (_nullishCoalesce(ticket.status, () => ( "OPEN"))).toUpperCase();
|
|
1281
1448
|
const priority = (_nullishCoalesce(ticket.priority, () => ( ""))).toUpperCase();
|
|
1282
|
-
const relativeUpdated = ticket.hubspot_updated_at ?
|
|
1449
|
+
const relativeUpdated = ticket.hubspot_updated_at ? _chunkZGTDUPTWcjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : "recently";
|
|
1283
1450
|
const title = (ticket.subject || "").trim() || "(untitled)";
|
|
1284
1451
|
const subtitle = `UPDATED ${relativeUpdated}, #${ticket.external_id || "\u2014"}${ticket.pipeline_stage_label ? `, ${ticket.pipeline_stage_label}` : ""}`;
|
|
1285
1452
|
const description = _nullishCoalesce(_nullishCoalesce(ticket.preview, () => ( ticket.body)), () => ( ""));
|
|
@@ -1288,7 +1455,7 @@ function HelpCenterCard({
|
|
|
1288
1455
|
const rowRef = _react.useRef.call(void 0, null);
|
|
1289
1456
|
const handleClick = _react.useCallback.call(void 0, () => {
|
|
1290
1457
|
onToggle(ticket.id);
|
|
1291
|
-
|
|
1458
|
+
_chunkZGTDUPTWcjs.scrollElementIntoView.call(void 0, rowRef.current, {
|
|
1292
1459
|
headerOffset: STICKY_HEADER_OFFSET_PX,
|
|
1293
1460
|
adjustTargetY: (raw) => {
|
|
1294
1461
|
if (!rowRef.current) return raw;
|
|
@@ -1305,16 +1472,16 @@ function HelpCenterCard({
|
|
|
1305
1472
|
}, [onToggle, ticket.id]);
|
|
1306
1473
|
const rightBadges = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
1307
1474
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1308
|
-
|
|
1475
|
+
_chunkZGTDUPTWcjs.StatusBadge,
|
|
1309
1476
|
{
|
|
1310
1477
|
text: rawStatus,
|
|
1311
|
-
colorScheme:
|
|
1478
|
+
colorScheme: _chunkZGTDUPTWcjs.getStatusColorScheme.call(void 0, rawStatus),
|
|
1312
1479
|
variant: "card",
|
|
1313
1480
|
className: "border border-ods-border"
|
|
1314
1481
|
}
|
|
1315
1482
|
),
|
|
1316
1483
|
priority && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1317
|
-
|
|
1484
|
+
_chunkZGTDUPTWcjs.StatusBadge,
|
|
1318
1485
|
{
|
|
1319
1486
|
text: priority,
|
|
1320
1487
|
colorScheme: mapPriorityScheme(priority),
|
|
@@ -1341,7 +1508,7 @@ function HelpCenterCard({
|
|
|
1341
1508
|
"aria-controls": isExpanded ? `help-center-drawer-${ticket.id}` : void 0,
|
|
1342
1509
|
className: "w-full text-left p-[12px] md:p-[16px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent focus-visible:ring-inset disabled:cursor-default",
|
|
1343
1510
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1344
|
-
|
|
1511
|
+
_chunkIH76P5R6cjs.DevCardRowContent,
|
|
1345
1512
|
{
|
|
1346
1513
|
title,
|
|
1347
1514
|
subtitle,
|
|
@@ -1361,7 +1528,9 @@ function HelpCenterCard({
|
|
|
1361
1528
|
onSendMessage,
|
|
1362
1529
|
onClose,
|
|
1363
1530
|
onReopen,
|
|
1364
|
-
onActionCollapsed
|
|
1531
|
+
onActionCollapsed,
|
|
1532
|
+
replyError,
|
|
1533
|
+
onClearReplyError
|
|
1365
1534
|
}
|
|
1366
1535
|
) })
|
|
1367
1536
|
]
|
|
@@ -1414,12 +1583,12 @@ function HelpCenterCreateForm({
|
|
|
1414
1583
|
const [subject, setSubject] = _react.useState.call(void 0, "");
|
|
1415
1584
|
const [subjectError, setSubjectError] = _react.useState.call(void 0, null);
|
|
1416
1585
|
const subjectField = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [
|
|
1417
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1586
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.Label, { htmlFor: "help-center-subject", children: [
|
|
1418
1587
|
"Subject",
|
|
1419
1588
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-accent", children: "*" })
|
|
1420
1589
|
] }),
|
|
1421
1590
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1422
|
-
|
|
1591
|
+
_chunkXDPSSE4Ocjs.Input,
|
|
1423
1592
|
{
|
|
1424
1593
|
id: "help-center-subject",
|
|
1425
1594
|
type: "text",
|
|
@@ -1446,7 +1615,7 @@ function HelpCenterCreateForm({
|
|
|
1446
1615
|
)
|
|
1447
1616
|
] });
|
|
1448
1617
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1449
|
-
|
|
1618
|
+
_chunkSMCG2CCCcjs.ContactForm,
|
|
1450
1619
|
{
|
|
1451
1620
|
title: "Open a new ticket",
|
|
1452
1621
|
footerText: "The support team typically responds within one business day.",
|
|
@@ -1483,8 +1652,8 @@ function HelpCenterCreateForm({
|
|
|
1483
1652
|
|
|
1484
1653
|
// src/components/tickets/help-center-list.tsx
|
|
1485
1654
|
|
|
1486
|
-
function HelpCenterList({ toast: toast2 =
|
|
1487
|
-
const identity =
|
|
1655
|
+
function HelpCenterList({ toast: toast2 = _chunk5V6MSE3Bcjs.toast } = {}) {
|
|
1656
|
+
const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
|
|
1488
1657
|
const searchParams = _chunkG7UE6RKVcjs.useSearchParams.call(void 0, );
|
|
1489
1658
|
const router = _chunkG7UE6RKVcjs.useRouter.call(void 0, );
|
|
1490
1659
|
const pathname = _chunkG7UE6RKVcjs.usePathname.call(void 0, );
|
|
@@ -1493,11 +1662,11 @@ function HelpCenterList({ toast: toast2 = _chunkWT5JV2GScjs.toast } = {}) {
|
|
|
1493
1662
|
const rawPage = Number(searchParams.get("page"));
|
|
1494
1663
|
const page = Number.isFinite(rawPage) && rawPage > 0 ? Math.floor(rawPage) : 1;
|
|
1495
1664
|
if (identity.isLoading) {
|
|
1496
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1665
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevSectionPage, { sectionKey: "tickets", preControls: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpCenterCreateFormSkeleton, {}), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevCardRowSkeletonList, {}) });
|
|
1497
1666
|
}
|
|
1498
|
-
if (identity.authTier === "anon" || !_optionalChain([identity, 'access',
|
|
1499
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1500
|
-
|
|
1667
|
+
if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _56 => _56.user, 'optionalAccess', _57 => _57.email])) {
|
|
1668
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevSectionPage, { sectionKey: "tickets", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1669
|
+
_chunkK4DFAVSOcjs.EmptyState,
|
|
1501
1670
|
{
|
|
1502
1671
|
type: "generic",
|
|
1503
1672
|
title: "Sign in to manage tickets",
|
|
@@ -1506,7 +1675,7 @@ function HelpCenterList({ toast: toast2 = _chunkWT5JV2GScjs.toast } = {}) {
|
|
|
1506
1675
|
}
|
|
1507
1676
|
) });
|
|
1508
1677
|
}
|
|
1509
|
-
const sessionName = [_optionalChain([identity, 'access',
|
|
1678
|
+
const sessionName = [_optionalChain([identity, 'access', _58 => _58.user, 'optionalAccess', _59 => _59.firstName]), _optionalChain([identity, 'access', _60 => _60.user, 'optionalAccess', _61 => _61.lastName])].filter(Boolean).join(" ").trim() || _optionalChain([identity, 'access', _62 => _62.user, 'optionalAccess', _63 => _63.email, 'optionalAccess', _64 => _64.split, 'call', _65 => _65("@"), 'access', _66 => _66[0]]) || "Customer";
|
|
1510
1679
|
const sessionEmail = identity.user.email;
|
|
1511
1680
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1512
1681
|
HelpCenterListAuthed,
|
|
@@ -1561,7 +1730,12 @@ function HelpCenterListAuthed({
|
|
|
1561
1730
|
(ticketId) => {
|
|
1562
1731
|
queryClient.setQueriesData(
|
|
1563
1732
|
{ queryKey: ["tickets"] },
|
|
1564
|
-
(prev) =>
|
|
1733
|
+
(prev) => {
|
|
1734
|
+
if (!prev || !Array.isArray(prev.tickets)) return prev;
|
|
1735
|
+
const nextTickets = prev.tickets.filter((t) => t.id !== ticketId);
|
|
1736
|
+
if (nextTickets.length === prev.tickets.length) return prev;
|
|
1737
|
+
return { ...prev, tickets: nextTickets };
|
|
1738
|
+
}
|
|
1565
1739
|
);
|
|
1566
1740
|
setExpandedTicketId((prev) => prev === ticketId ? null : prev);
|
|
1567
1741
|
},
|
|
@@ -1595,17 +1769,17 @@ function HelpCenterListAuthed({
|
|
|
1595
1769
|
"Couldn\u2019t load your tickets. ",
|
|
1596
1770
|
error.message
|
|
1597
1771
|
] }),
|
|
1598
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1772
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Button, { type: "button", variant: "accent", onClick: () => refetch(), children: "Retry" })
|
|
1599
1773
|
] }),
|
|
1600
|
-
!error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1774
|
+
!error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevCardRowSkeletonList, {}) : !hasResults && isFetching ? (
|
|
1601
1775
|
// Bridge state — background refetch in flight and the
|
|
1602
1776
|
// optimistic placeholder was just removed by the mutation
|
|
1603
1777
|
// callback. Without this branch "No tickets yet" would flash
|
|
1604
1778
|
// for ~50ms between `removeOptimistic` and the server
|
|
1605
1779
|
// response landing.
|
|
1606
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1780
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevCardRowSkeletonList, { rows: 1 })
|
|
1607
1781
|
) : !hasResults ? hasActiveFilters ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1608
|
-
|
|
1782
|
+
_chunkK4DFAVSOcjs.EmptyState,
|
|
1609
1783
|
{
|
|
1610
1784
|
type: "search",
|
|
1611
1785
|
title: "No tickets found",
|
|
@@ -1620,7 +1794,7 @@ function HelpCenterListAuthed({
|
|
|
1620
1794
|
}
|
|
1621
1795
|
}
|
|
1622
1796
|
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1623
|
-
|
|
1797
|
+
_chunkK4DFAVSOcjs.EmptyState,
|
|
1624
1798
|
{
|
|
1625
1799
|
type: "generic",
|
|
1626
1800
|
title: "No tickets yet",
|
|
@@ -1647,14 +1821,16 @@ function HelpCenterListAuthed({
|
|
|
1647
1821
|
onSendMessage: actions.sendMessage,
|
|
1648
1822
|
onClose: actions.closeTicket,
|
|
1649
1823
|
onReopen: actions.reopenTicket,
|
|
1650
|
-
onActionCollapsed: () => setExpandedTicketId(null)
|
|
1824
|
+
onActionCollapsed: () => setExpandedTicketId(null),
|
|
1825
|
+
replyError: actions.replyErrorFor(ticket.external_id),
|
|
1826
|
+
onClearReplyError: () => actions.clearReplyError(ticket.external_id)
|
|
1651
1827
|
},
|
|
1652
1828
|
ticket.id
|
|
1653
1829
|
)) })
|
|
1654
1830
|
) }),
|
|
1655
|
-
!error && totalPages > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1831
|
+
!error && totalPages > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkK4DFAVSOcjs.UnifiedPagination, { currentPage: page, totalPages })
|
|
1656
1832
|
] });
|
|
1657
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1833
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevSectionPage, { sectionKey: "tickets", preControls: form, children: body });
|
|
1658
1834
|
}
|
|
1659
1835
|
|
|
1660
1836
|
|