@droppii-org/chat-sdk 0.7.18 → 0.7.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/components/conversation/DeskBackgroundSyncStatus.d.ts +3 -1
  2. package/dist/components/conversation/DeskBackgroundSyncStatus.d.ts.map +1 -1
  3. package/dist/components/conversation/DeskBackgroundSyncStatus.js +3 -2
  4. package/dist/components/conversation/ThreadCard.d.ts +3 -1
  5. package/dist/components/conversation/ThreadCard.d.ts.map +1 -1
  6. package/dist/components/conversation/ThreadCard.js +3 -3
  7. package/dist/components/conversation-detail/ConversationDetailBootStatus.d.ts +4 -0
  8. package/dist/components/conversation-detail/ConversationDetailBootStatus.d.ts.map +1 -0
  9. package/dist/components/conversation-detail/ConversationDetailBootStatus.js +15 -0
  10. package/dist/components/message/footer/MediaActions.d.ts +2 -1
  11. package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
  12. package/dist/components/message/footer/MediaActions.js +2 -2
  13. package/dist/components/message/footer/MediaUploadButtons.d.ts +2 -1
  14. package/dist/components/message/footer/MediaUploadButtons.d.ts.map +1 -1
  15. package/dist/components/message/footer/MediaUploadButtons.js +15 -3
  16. package/dist/components/rich-text-editor/RichTextEditor.d.ts +3 -1
  17. package/dist/components/rich-text-editor/RichTextEditor.d.ts.map +1 -1
  18. package/dist/components/rich-text-editor/RichTextEditor.js +2 -2
  19. package/dist/components/thread/SessionDetailCard.d.ts.map +1 -1
  20. package/dist/components/thread/SessionDetailCard.js +31 -40
  21. package/dist/components/thread/SessionLabelRow.d.ts +15 -0
  22. package/dist/components/thread/SessionLabelRow.d.ts.map +1 -0
  23. package/dist/components/thread/SessionLabelRow.js +53 -0
  24. package/dist/components/thread/SessionSection.d.ts +2 -1
  25. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  26. package/dist/components/thread/SessionSection.js +2 -2
  27. package/dist/components/thread/SessionTagPicker.d.ts.map +1 -1
  28. package/dist/components/thread/SessionTagPicker.js +2 -5
  29. package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -1
  30. package/dist/components/thread/SupportSessionPanel.js +17 -15
  31. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  32. package/dist/hooks/global/useGlobalEvent.js +4 -2
  33. package/dist/hooks/session/useGetListSessionByConversation.d.ts +2 -2
  34. package/dist/hooks/session/useGetListSessionByConversation.d.ts.map +1 -1
  35. package/dist/hooks/session/useGetListSessionByConversation.js +14 -8
  36. package/dist/hooks/session/useSessionLabelsAutosave.d.ts +25 -0
  37. package/dist/hooks/session/useSessionLabelsAutosave.d.ts.map +1 -0
  38. package/dist/hooks/session/useSessionLabelsAutosave.js +90 -0
  39. package/dist/hooks/session/useUpdateSessionInfo.d.ts +4 -2
  40. package/dist/hooks/session/useUpdateSessionInfo.d.ts.map +1 -1
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -0
  44. package/dist/locales/vi/common.json +3 -3
  45. package/dist/screens/conversation-detail/index.d.ts.map +1 -1
  46. package/dist/screens/conversation-detail/index.js +4 -1
  47. package/dist/styles/global.css +1 -1
  48. package/dist/types/dto.d.ts +8 -2
  49. package/dist/types/dto.d.ts.map +1 -1
  50. package/package.json +1 -1
@@ -10,7 +10,7 @@ import SingleThreadInfo from "./SingleThreadInfo";
10
10
  import ThreadInfoHeader, { threadInfoIconButtonClass, } from "./ThreadInfoHeader";
11
11
  import { StrokeIcon } from "../../components/icon/StrokeIcon";
12
12
  import { useGetListSessionByConversation } from "../../hooks/session/useGetListSessionByConversation";
13
- import { PAGE_SIZE } from "../../constants";
13
+ const LOAD_MORE_THRESHOLD_PX = 80;
14
14
  /**
15
15
  * "Phiên hỗ trợ" for a bot support thread: customer, past sessions and the active
16
16
  * session card. In the drawer variant, ⓘ opens "Thông tin" over it inside the same box.
@@ -19,20 +19,22 @@ const SupportSessionPanel = ({ conversationId, width, isDetailsOpen = false, onC
19
19
  const { t } = useTranslation();
20
20
  const [panelEl, setPanelEl] = useState(null);
21
21
  const detailsButtonRef = useRef(null);
22
- const { data: sessions, isLoading } = useGetListSessionByConversation({
23
- conversationId,
24
- page: 1,
25
- pageSize: PAGE_SIZE.large,
26
- enabled: !!conversationId,
27
- });
28
- const { closedSessions, activeSession } = useMemo(() => {
29
- if (!sessions)
30
- return { closedSessions: [], activeSession: null };
31
- return {
32
- closedSessions: sessions.filter((s) => s.isClosed),
33
- activeSession: sessions.find((s) => !s.isClosed),
34
- };
22
+ const { data: sessions, isLoading, hasNextPage, isFetchingNextPage, fetchNextPage, } = useGetListSessionByConversation({ conversationId });
23
+ // Only the newest session can be live: old threads keep never-closed rows far down the list.
24
+ const { pastSessions, activeSession } = useMemo(() => {
25
+ const [newest, ...older] = sessions !== null && sessions !== void 0 ? sessions : [];
26
+ return newest && !newest.isClosed
27
+ ? { pastSessions: older, activeSession: newest }
28
+ : { pastSessions: sessions !== null && sessions !== void 0 ? sessions : [], activeSession: null };
35
29
  }, [sessions]);
30
+ const handleSessionListScroll = (event) => {
31
+ if (!hasNextPage || isFetchingNextPage)
32
+ return;
33
+ const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
34
+ if (scrollHeight - scrollTop - clientHeight < LOAD_MORE_THRESHOLD_PX) {
35
+ void fetchNextPage();
36
+ }
37
+ };
36
38
  // Focus goes back to the in-panel ⓘ button when the details drawer closes over it.
37
39
  const wasDetailsOpen = useRef(isDetailsOpen);
38
40
  useEffect(() => {
@@ -41,6 +43,6 @@ const SupportSessionPanel = ({ conversationId, width, isDetailsOpen = false, onC
41
43
  (_a = detailsButtonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
42
44
  wasDetailsOpen.current = isDetailsOpen;
43
45
  }, [isDetailsOpen]);
44
- return (_jsxs("div", { ref: setPanelEl, className: "relative flex h-full shrink-0 flex-col overflow-hidden rounded-xl bg-white shadow-sm phone:rounded-none phone:shadow-none", style: { width }, "data-cp-name": "SupportSessionPanel", "data-testid": "session-info-column", children: [variant === "drawer" ? (_jsx(ThreadInfoHeader, { title: t("support_session_panel_title"), onClose: onClose, actions: _jsx("button", { ref: detailsButtonRef, type: "button", "aria-label": t("thread_info_open"), title: t("thread_info_open"), "aria-expanded": isDetailsOpen, onClick: onOpenDetails, className: threadInfoIconButtonClass, children: _jsx(StrokeIcon, { name: "info", size: 18 }) }) })) : (_jsx("div", { className: "flex h-14 shrink-0 items-center border-b border-gray-25 px-4", children: _jsx("h2", { className: "m-0 truncate text-base font-bold text-gray-900", children: t("support_session_panel_title") }) })), _jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto", children: [_jsx(UserSection, {}), _jsx(SessionSection, { sessions: closedSessions, isLoading: isLoading })] }), activeSession && (_jsx("div", { className: "max-h-[70%] shrink-0 overflow-y-auto border-t border-gray-25 bg-white p-4", "data-testid": "active-session-dock", children: _jsx(SessionDetailCard, { session: activeSession, isActive: true }, activeSession.id) })), variant === "drawer" && panelEl && (_jsx(Drawer, { open: isDetailsOpen, onClose: onCloseDetails, "aria-label": t("thread_info_title"), getContainer: panelEl, rootStyle: { position: "absolute" }, width: "100%", mask: false, closeIcon: false, destroyOnHidden: true, styles: { body: { padding: 0 }, wrapper: { boxShadow: "none" } }, children: _jsx("div", { className: "h-full", "data-testid": "thread-details-overlay", children: _jsx(SingleThreadInfo, { onClose: onCloseDetails }) }) }))] }));
46
+ return (_jsxs("div", { ref: setPanelEl, className: "relative flex h-full shrink-0 flex-col overflow-hidden rounded-xl bg-white shadow-sm phone:rounded-none phone:shadow-none", style: { width }, "data-cp-name": "SupportSessionPanel", "data-testid": "session-info-column", children: [variant === "drawer" ? (_jsx(ThreadInfoHeader, { title: t("support_session_panel_title"), onClose: onClose, actions: _jsx("button", { ref: detailsButtonRef, type: "button", "aria-label": t("thread_info_open"), title: t("thread_info_open"), "aria-expanded": isDetailsOpen, onClick: onOpenDetails, className: threadInfoIconButtonClass, children: _jsx(StrokeIcon, { name: "info", size: 18 }) }) })) : (_jsx("div", { className: "flex h-14 shrink-0 items-center border-b border-gray-25 px-4", children: _jsx("h2", { className: "m-0 truncate text-base font-bold text-gray-900", children: t("support_session_panel_title") }) })), _jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto", onScroll: handleSessionListScroll, "data-testid": "session-list-scroll", children: [_jsx(UserSection, {}), _jsx(SessionSection, { sessions: pastSessions, isLoading: isLoading, isFetchingMore: isFetchingNextPage })] }), activeSession && (_jsx("div", { className: "max-h-[70%] shrink-0 overflow-y-auto border-t border-gray-25 bg-white p-4", "data-testid": "active-session-dock", children: _jsx(SessionDetailCard, { session: activeSession, isActive: true }, activeSession.id) })), variant === "drawer" && panelEl && (_jsx(Drawer, { open: isDetailsOpen, onClose: onCloseDetails, "aria-label": t("thread_info_title"), getContainer: panelEl, rootStyle: { position: "absolute" }, width: "100%", mask: false, closeIcon: false, destroyOnHidden: true, styles: { body: { padding: 0 }, wrapper: { boxShadow: "none" } }, children: _jsx("div", { className: "h-full", "data-testid": "thread-details-overlay", children: _jsx(SingleThreadInfo, { onClose: onCloseDetails }) }) }))] }));
45
47
  };
46
48
  export default SupportSessionPanel;
@@ -1 +1 @@
1
- {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAkDA,eAAO,MAAM,cAAc,YA4nB1B,CAAC"}
1
+ {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAkDA,eAAO,MAAM,cAAc,YA8nB1B,CAAC"}
@@ -243,16 +243,18 @@ export const useGlobalEvent = () => {
243
243
  const syncProgressHandler = ({ data }) => {
244
244
  useBootStore.getState().setSyncProgress(data);
245
245
  };
246
+ // Sync status first: the boot store re-renders at once, and ending the background
247
+ // phase while the status still says Loading would make useCanLoadChatData flicker off.
246
248
  const syncFinishHandler = () => {
247
- useBootStore.getState().markFirstSyncDone();
248
249
  updateSyncStatus(SyncStatus.Success);
250
+ useBootStore.getState().markFirstSyncDone();
249
251
  getSelfUserInfo();
250
252
  loadConversationList();
251
253
  void refreshCurrentGroupState();
252
254
  };
253
255
  const syncFailedHandler = () => {
254
- useBootStore.getState().markFirstSyncDone();
255
256
  updateSyncStatus(SyncStatus.Failed);
257
+ useBootStore.getState().markFirstSyncDone();
256
258
  };
257
259
  // The bot behind the open thread changed (flow swapped, type switched,
258
260
  // activated/deactivated). Everything the bot UI renders is react-query
@@ -1,10 +1,10 @@
1
1
  import { ISessionResponse } from "../../types/dto";
2
2
  interface GetListSessionParams {
3
3
  conversationId: string;
4
- page?: number;
5
4
  pageSize?: number;
6
5
  enabled?: boolean;
7
6
  }
8
- export declare const useGetListSessionByConversation: ({ conversationId, page, pageSize, enabled, }: GetListSessionParams) => import("@tanstack/react-query").UseQueryResult<ISessionResponse[], Error>;
7
+ /** A conversation's sessions, newest first; `data` is every page loaded so far. */
8
+ export declare const useGetListSessionByConversation: ({ conversationId, pageSize, enabled, }: GetListSessionParams) => import("@tanstack/react-query").UseInfiniteQueryResult<ISessionResponse[], Error>;
9
9
  export {};
10
10
  //# sourceMappingURL=useGetListSessionByConversation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGetListSessionByConversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useGetListSessionByConversation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI7D,UAAU,oBAAoB;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,+BAA+B,GAAI,8CAK7C,oBAAoB,8EAyBtB,CAAC"}
1
+ {"version":3,"file":"useGetListSessionByConversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useGetListSessionByConversation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI7D,UAAU,oBAAoB;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD,mFAAmF;AACnF,eAAO,MAAM,+BAA+B,GAAI,wCAI7C,oBAAoB,sFA8BtB,CAAC"}
@@ -1,29 +1,35 @@
1
- import { useQuery } from "@tanstack/react-query";
1
+ import { useInfiniteQuery } from "@tanstack/react-query";
2
2
  import { QUERY_KEYS } from "../../services/query";
3
3
  import { apiInstance } from "../../services/api";
4
4
  import { ENDPOINTS } from "../../services/routes";
5
5
  import { PAGE_SIZE } from "../../constants";
6
6
  import useAuthStore from "../../store/auth";
7
- export const useGetListSessionByConversation = ({ conversationId, page = 1, pageSize = PAGE_SIZE.large, enabled = true, }) => {
7
+ const flattenPages = (data) => data.pages.flat();
8
+ /** A conversation's sessions, newest first; `data` is every page loaded so far. */
9
+ export const useGetListSessionByConversation = ({ conversationId, pageSize = PAGE_SIZE.large, enabled = true, }) => {
8
10
  const applicationType = useAuthStore((state) => state.applicationType);
9
- return useQuery({
11
+ return useInfiniteQuery({
10
12
  queryKey: [
11
13
  QUERY_KEYS.GET_LIST_SESSION_BY_CONVERSATION,
12
14
  applicationType,
13
15
  conversationId,
14
- { page, pageSize },
16
+ { pageSize },
15
17
  ],
16
- queryFn: async () => {
17
- var _a;
18
+ initialPageParam: 1,
19
+ queryFn: async ({ pageParam }) => {
20
+ var _a, _b;
18
21
  const res = await apiInstance.get(ENDPOINTS.chatService.listSessionByConversation(conversationId), {
19
22
  params: {
20
23
  applicationType,
21
- page,
24
+ page: pageParam,
22
25
  pageSize,
23
26
  },
24
27
  });
25
- return (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data;
28
+ return (_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : [];
26
29
  },
30
+ // pageable totals are always 0 on this endpoint, so only a short page ends the list.
31
+ getNextPageParam: (lastPage, _allPages, lastPageParam) => lastPage.length < pageSize ? undefined : lastPageParam + 1,
32
+ select: flattenPages,
27
33
  enabled: !!conversationId && enabled,
28
34
  });
29
35
  };
@@ -0,0 +1,25 @@
1
+ import type { AutosaveStatus } from "./useSessionFieldAutosave";
2
+ export interface SessionLabelDraft {
3
+ id: string;
4
+ note: string;
5
+ }
6
+ interface Options {
7
+ /** Labels as the server last returned them, in pick order. */
8
+ serverLabels: SessionLabelDraft[];
9
+ save: (labels: SessionLabelDraft[]) => Promise<unknown>;
10
+ waitMs?: number;
11
+ }
12
+ /**
13
+ * Autosave for a session's labels and their own notes. The API replaces the
14
+ * whole list, so saves run one at a time and each sends the newest local list:
15
+ * a tag change can never resend a note older than what was typed.
16
+ */
17
+ export declare const useSessionLabelsAutosave: ({ serverLabels, save, waitMs, }: Options) => {
18
+ labels: SessionLabelDraft[];
19
+ setNote: (id: string, note: string) => void;
20
+ setLabelIds: (ids: string[]) => void;
21
+ status: AutosaveStatus;
22
+ retry: () => Promise<void>;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=useSessionLabelsAutosave.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionLabelsAutosave.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useSessionLabelsAutosave.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,OAAO;IACf,8DAA8D;IAC9D,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,IAAI,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,iCAItC,OAAO;;kBAoDD,MAAM,QAAQ,MAAM;uBAUnB,MAAM,EAAE;;;CA+BjB,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import useAuthStore from "../../store/auth";
3
+ const toKey = (labels) => JSON.stringify(labels);
4
+ /**
5
+ * Autosave for a session's labels and their own notes. The API replaces the
6
+ * whole list, so saves run one at a time and each sends the newest local list:
7
+ * a tag change can never resend a note older than what was typed.
8
+ */
9
+ export const useSessionLabelsAutosave = ({ serverLabels, save, waitMs = 500, }) => {
10
+ const [labels, setLabelsState] = useState(serverLabels);
11
+ const [status, setStatus] = useState("idle");
12
+ const labelsRef = useRef(serverLabels);
13
+ const savedKeyRef = useRef(toKey(serverLabels));
14
+ const queueRef = useRef(Promise.resolve());
15
+ const timerRef = useRef();
16
+ const mountedRef = useRef(true);
17
+ const saveRef = useRef(save);
18
+ saveRef.current = save;
19
+ const serverRef = useRef(serverLabels);
20
+ serverRef.current = serverLabels;
21
+ const serverKey = toKey(serverLabels);
22
+ const flush = useCallback(() => {
23
+ clearTimeout(timerRef.current);
24
+ timerRef.current = undefined;
25
+ const run = queueRef.current.then(async () => {
26
+ const next = labelsRef.current;
27
+ const key = toKey(next);
28
+ if (key === savedKeyRef.current) {
29
+ // Edits undone back to the saved list: nothing to send, but clear a stale status.
30
+ if (mountedRef.current)
31
+ setStatus((prev) => (prev === "idle" ? prev : "saved"));
32
+ return;
33
+ }
34
+ if (mountedRef.current)
35
+ setStatus("saving");
36
+ try {
37
+ await saveRef.current(next);
38
+ savedKeyRef.current = key;
39
+ if (mountedRef.current) {
40
+ setStatus(toKey(labelsRef.current) === key ? "saved" : "saving");
41
+ }
42
+ }
43
+ catch (_a) {
44
+ if (mountedRef.current)
45
+ setStatus("error");
46
+ }
47
+ });
48
+ queueRef.current = run;
49
+ return run;
50
+ }, []);
51
+ const update = useCallback((next, delayMs) => {
52
+ labelsRef.current = next;
53
+ setLabelsState(next);
54
+ clearTimeout(timerRef.current);
55
+ if (delayMs === null)
56
+ void flush();
57
+ else
58
+ timerRef.current = setTimeout(flush, delayMs);
59
+ }, [flush]);
60
+ const setNote = useCallback((id, note) => update(labelsRef.current.map((label) => (label.id === id ? Object.assign(Object.assign({}, label), { note }) : label)), waitMs), [update, waitMs]);
61
+ // A removed label loses its note; adding it back starts empty.
62
+ const setLabelIds = useCallback((ids) => {
63
+ const notes = new Map(labelsRef.current.map((label) => [label.id, label.note]));
64
+ update(ids.map((id) => { var _a; return ({ id, note: (_a = notes.get(id)) !== null && _a !== void 0 ? _a : "" }); }), null);
65
+ }, [update]);
66
+ // Take a refetched list (e.g. another CS's edit) only when nothing local is unsaved.
67
+ useEffect(() => {
68
+ if (serverKey === savedKeyRef.current || timerRef.current !== undefined)
69
+ return;
70
+ if (toKey(labelsRef.current) !== savedKeyRef.current)
71
+ return;
72
+ labelsRef.current = serverRef.current;
73
+ savedKeyRef.current = serverKey;
74
+ setLabelsState(serverRef.current);
75
+ }, [serverKey]);
76
+ useEffect(() => {
77
+ mountedRef.current = true;
78
+ return () => {
79
+ mountedRef.current = false;
80
+ // Also covers a save that failed: leaving the card must not drop it.
81
+ if (toKey(labelsRef.current) === savedKeyRef.current)
82
+ return;
83
+ if (useAuthStore.getState().accessToken)
84
+ void flush();
85
+ else
86
+ clearTimeout(timerRef.current);
87
+ };
88
+ }, [flush]);
89
+ return { labels, setNote, setLabelIds, status, retry: flush };
90
+ };
@@ -1,7 +1,9 @@
1
- import { BaseResponse } from "../../types/dto";
1
+ import { BaseResponse, ISessionLabelInput } from "../../types/dto";
2
2
  interface IUpdateSessionInfoPayload {
3
+ /** Replaces the session's labels: a label left out is removed with its note. */
4
+ labels?: ISessionLabelInput[];
5
+ /** Deprecated by chat-service in favour of labels, which wins when both are sent. */
3
6
  labelIds?: string[];
4
- issueDetail?: string;
5
7
  sessionId: string;
6
8
  note?: string;
7
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useUpdateSessionInfo.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useUpdateSessionInfo.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,UAAU,yBAAyB;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,oBAAoB,2HAa7B,CAAC"}
1
+ {"version":3,"file":"useUpdateSessionInfo.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useUpdateSessionInfo.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG/D,UAAU,yBAAyB;IACjC,gFAAgF;IAChF,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,oBAAoB,2HAa7B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -23,6 +23,8 @@ export { StrokeIcon } from "./components/icon/StrokeIcon";
23
23
  export type { StrokeIconProps } from "./components/icon/StrokeIcon";
24
24
  export type { StrokeIconName } from "./components/icon/strokeIconNodes";
25
25
  export { default as DeskWorkspaceSkeleton } from "./screens/desk-message/DeskWorkspaceSkeleton";
26
+ export { useCanLoadChatData } from "./hooks/init/useCanLoadChatData";
27
+ export { default as ChatBackgroundSyncStatus } from "./components/conversation/DeskBackgroundSyncStatus";
26
28
  export { default as RichTextEditor } from "./components/rich-text-editor/RichTextEditor";
27
29
  export { default as ShadowStyleBoundary } from "./components/shadow-style-boundary/ShadowStyleBoundary";
28
30
  export type { ShadowStyleBoundaryProps } from "./components/shadow-style-boundary/ShadowStyleBoundary";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AACxB,OAAO,2BAA2B,CAAC;AAEnC,OAAO,gBAAgB,MAAM,wBAAwB,CAAC;AACtD,OAAO,SAAS,MAAM,kCAAkC,CAAC;AACzD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AACxG,YAAY,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAEvG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACjF,YAAY,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEhF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AACzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,uDAAuD,CAAC;AAMxG,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAC3G,YAAY,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AAM1G,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAC3G,YAAY,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AAE1G,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAChG,YAAY,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAE/F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACnF,YAAY,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAIlF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACtF,YAAY,EAAE,uBAAuB,IAAI,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChH,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACrE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,0BAA0B,GAC3B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,wBAAwB,GACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,YAAY,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iCAAiC,EAAE,MAAM,mDAAmD,CAAC;AAGtG,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIvE,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,QAAQ,IAAI,aAAa,EACzB,WAAW,IAAI,gBAAgB,GAChC,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -22,6 +22,10 @@ export { DChatDeskMessage, DChatBubble, Icon, SkipLinks };
22
22
  export { StrokeIcon } from "./components/icon/StrokeIcon";
23
23
  // The desk's loading placeholder, for hosts whose app shell renders before ChatProvider.
24
24
  export { default as DeskWorkspaceSkeleton } from "./screens/desk-message/DeskWorkspaceSkeleton";
25
+ // For hosts with their own conversation lists: when OpenIM reads give complete answers, and
26
+ // the strip shown while a fresh device's first sync finishes in the background.
27
+ export { useCanLoadChatData } from "./hooks/init/useCanLoadChatData";
28
+ export { default as ChatBackgroundSyncStatus } from "./components/conversation/DeskBackgroundSyncStatus";
25
29
  export { default as RichTextEditor } from "./components/rich-text-editor/RichTextEditor";
26
30
  export { default as ShadowStyleBoundary } from "./components/shadow-style-boundary/ShadowStyleBoundary";
27
31
  export { default as DChatConversationInbox } from "./screens/conversation-inbox";
@@ -157,8 +157,8 @@
157
157
  "close_session_failed": "Đóng phiên chat thất bại",
158
158
  "session_active": "Đang hoạt động",
159
159
  "session_add_tag_placeholder": "Thêm thẻ...",
160
- "session_issue_detail_placeholder": "Vấn đề cụ thể...",
161
- "session_note_placeholder": "Ghi chú...",
160
+ "session_issue_detail_placeholder": "Thêm vấn đề cụ thể…",
161
+ "session_note_placeholder": "Thêm ghi chú…",
162
162
  "session_close_button": "Kết thúc phiên",
163
163
  "member_count": "{{count}} thành viên",
164
164
  "members": "Thành viên",
@@ -325,7 +325,6 @@
325
325
  "members_open": "Thành viên",
326
326
  "action_cancel": "Huỷ",
327
327
  "undo": "Hoàn tác",
328
- "update_session_failed": "Cập nhật phiên không thành công",
329
328
  "save_status_saving": "Đang lưu…",
330
329
  "save_status_saved": "Đã lưu",
331
330
  "save_status_failed": "Lưu không được",
@@ -401,6 +400,7 @@
401
400
  "session_owner_label": "Phụ trách",
402
401
  "session_add_tag": "Thêm thẻ",
403
402
  "session_remove_tag": "Bỏ thẻ {{name}}",
403
+ "session_label_note_aria": "Vấn đề cụ thể của thẻ {{name}}",
404
404
  "session_no_tags": "Chưa có thẻ nào",
405
405
  "session_search_tag_placeholder": "Tìm thẻ...",
406
406
  "session_collapse": "Thu gọn",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/conversation-detail/index.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAarF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6CAA6C,CAAC;AASrD,MAAM,WAAW,4BACf,SAAQ,4BAA4B,EAClC,4BAA4B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,kGAAkG;IAClG,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,oHAAoH;IACpH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,QAAA,MAAM,uBAAuB,GAAI,oLAgB9B,4BAA4B,mDAsT9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/conversation-detail/index.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAarF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6CAA6C,CAAC;AASrD,MAAM,WAAW,4BACf,SAAQ,4BAA4B,EAClC,4BAA4B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,kGAAkG;IAClG,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,oHAAoH;IACpH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,QAAA,MAAM,uBAAuB,GAAI,oLAgB9B,4BAA4B,mDAuT9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -27,6 +27,8 @@ import MediaResourcePanel from "../../components/media-resources/MediaResourcePa
27
27
  import { MediaResourceTabKey } from "../../components/media-resources/constants";
28
28
  import { ConversationMessageList, ConversationDetailHeader, ConversationDetailInput, PinnedMessageBar, } from "../../components/conversation-detail";
29
29
  import TypingIndicatorBar from "../../components/conversation-detail/TypingIndicatorBar";
30
+ import ConversationDetailBootStatus from "../../components/conversation-detail/ConversationDetailBootStatus";
31
+ import { useCanLoadChatData } from "../../hooks/init/useCanLoadChatData";
30
32
  import { BotButtonMessage, BotInactiveNotice, BotMenuSheet, BotStartButton, BotSuggest, CsSessionConfirmModal, } from "../../components/conversation-detail/bot";
31
33
  import { useBotFlow } from "../../hooks/conversation/useBotFlow";
32
34
  import { useCanPinMessage } from "../../hooks/message/useCanPinMessage";
@@ -52,6 +54,7 @@ const DChatConversationDetail = (_a) => {
52
54
  const canPinMessage = useCanPinMessage();
53
55
  const clearSelectedConversation = useConversationStore((state) => state.clearSelectedConversation);
54
56
  const setPendingResolveTarget = useConversationStore((state) => state.setPendingResolveTarget);
57
+ const canLoadChatData = useCanLoadChatData();
55
58
  const { isResolving, error } = useResolveConversation({
56
59
  conversationId,
57
60
  userId,
@@ -146,7 +149,7 @@ const DChatConversationDetail = (_a) => {
146
149
  }
147
150
  };
148
151
  if (isResolving) {
149
- return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-white", children: _jsx(Spin, {}) }));
152
+ return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-white", children: canLoadChatData ? _jsx(Spin, {}) : _jsx(ConversationDetailBootStatus, {}) }));
150
153
  }
151
154
  if (error) {
152
155
  return (_jsxs("div", { "data-testid": "conversation-detail-root", className: clsx("relative flex h-full w-full flex-col overflow-hidden bg-white", className), children: [_jsx("div", { "data-testid": "conversation-detail-header", className: "flex w-full shrink-0 cursor-default items-center border-b border-gray-25 bg-white p-2 shadow-inset-gray-divider", children: _jsx("button", { type: "button", onClick: handleBack, "data-testid": "conversation-detail-back", "data-cp-name": "HeaderIconButton", className: "flex shrink-0 cursor-pointer items-center justify-center p-2 text-[var(--dc-color-nav-icon)]", children: _jsx(Icon, { icon: "arrow-left-o", size: 24 }) }) }), _jsx("div", { className: "flex flex-1 items-center justify-center", children: _jsx(Empty, { description: t("thread_detail.resolve_failed") }) })] }));