@droppii-org/chat-sdk 0.7.3 → 0.7.5

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 (207) hide show
  1. package/dist/assets/images/defaultAvatarGroup.png +0 -0
  2. package/dist/components/boot/BootProgressBar.d.ts +13 -0
  3. package/dist/components/boot/BootProgressBar.d.ts.map +1 -0
  4. package/dist/components/boot/BootProgressBar.js +18 -0
  5. package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -1
  6. package/dist/components/canned-response/CannedResponsePanel.js +2 -2
  7. package/dist/components/common/BottomSheet.d.ts +18 -0
  8. package/dist/components/common/BottomSheet.d.ts.map +1 -0
  9. package/dist/components/common/BottomSheet.js +49 -0
  10. package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -1
  11. package/dist/components/common/DeskPanelDrawer.js +29 -15
  12. package/dist/components/common/DeskSidePanel.d.ts.map +1 -1
  13. package/dist/components/common/DeskSidePanel.js +1 -1
  14. package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
  15. package/dist/components/compose/ComposeNewMessageModal.js +3 -3
  16. package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
  17. package/dist/components/conversation/ConversationByGroupItem.js +5 -10
  18. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  19. package/dist/components/conversation/ConversationBySessionItem.js +6 -11
  20. package/dist/components/conversation/DeskConversationList.d.ts +4 -1
  21. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  22. package/dist/components/conversation/DeskConversationList.js +2 -2
  23. package/dist/components/conversation/DeskListHeader.d.ts +2 -0
  24. package/dist/components/conversation/DeskListHeader.d.ts.map +1 -1
  25. package/dist/components/conversation/DeskListHeader.js +3 -3
  26. package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -1
  27. package/dist/components/conversation-detail/ConversationMessageList.js +1 -1
  28. package/dist/components/conversation-inbox/ConversationInboxList.d.ts.map +1 -1
  29. package/dist/components/conversation-inbox/ConversationInboxList.js +12 -3
  30. package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts.map +1 -1
  31. package/dist/components/conversation-inbox/ConversationPeerAvatar.js +3 -1
  32. package/dist/components/conversation-inbox/InboxBootStatus.d.ts +10 -0
  33. package/dist/components/conversation-inbox/InboxBootStatus.d.ts.map +1 -0
  34. package/dist/components/conversation-inbox/InboxBootStatus.js +34 -0
  35. package/dist/components/conversation-inbox/InboxListSkeleton.d.ts +6 -0
  36. package/dist/components/conversation-inbox/InboxListSkeleton.d.ts.map +1 -0
  37. package/dist/components/conversation-inbox/InboxListSkeleton.js +8 -0
  38. package/dist/components/conversation-inbox/contact-search/PublicGroupResultItem.d.ts.map +1 -1
  39. package/dist/components/conversation-inbox/contact-search/PublicGroupResultItem.js +3 -2
  40. package/dist/components/conversation-inbox/contact-search/constants.d.ts +0 -1
  41. package/dist/components/conversation-inbox/contact-search/constants.d.ts.map +1 -1
  42. package/dist/components/conversation-inbox/contact-search/constants.js +0 -2
  43. package/dist/components/conversation-inbox/contact-search/index.d.ts +0 -1
  44. package/dist/components/conversation-inbox/contact-search/index.d.ts.map +1 -1
  45. package/dist/components/conversation-inbox/contact-search/index.js +0 -1
  46. package/dist/components/group/GroupAvatar.d.ts +9 -0
  47. package/dist/components/group/GroupAvatar.d.ts.map +1 -0
  48. package/dist/components/group/GroupAvatar.js +13 -0
  49. package/dist/components/group/GroupPanelHeader.js +1 -1
  50. package/dist/components/group/JoinGroupConfirmModal.d.ts.map +1 -1
  51. package/dist/components/group/JoinGroupConfirmModal.js +3 -2
  52. package/dist/components/icon/strokeIconNodes.d.ts +6 -0
  53. package/dist/components/icon/strokeIconNodes.d.ts.map +1 -1
  54. package/dist/components/icon/strokeIconNodes.js +5 -0
  55. package/dist/components/message/MessageHeader.d.ts +3 -1
  56. package/dist/components/message/MessageHeader.d.ts.map +1 -1
  57. package/dist/components/message/MessageHeader.js +11 -7
  58. package/dist/components/message/MessageList.d.ts +2 -0
  59. package/dist/components/message/MessageList.d.ts.map +1 -1
  60. package/dist/components/message/MessageList.js +15 -4
  61. package/dist/components/message/SelectSession.js +1 -1
  62. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  63. package/dist/components/message/footer/ActionBar.js +2 -2
  64. package/dist/components/message/footer/ComposerTabs.js +1 -1
  65. package/dist/components/message/footer/CrmComposerCard.js +1 -1
  66. package/dist/components/message/footer/EmojiPicker.d.ts +3 -1
  67. package/dist/components/message/footer/EmojiPicker.d.ts.map +1 -1
  68. package/dist/components/message/footer/EmojiPicker.js +3 -2
  69. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  70. package/dist/components/message/footer/EnterHandler.js +16 -2
  71. package/dist/components/message/footer/MediaActions.d.ts +2 -1
  72. package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
  73. package/dist/components/message/footer/MediaActions.js +4 -4
  74. package/dist/components/message/footer/ToolbarPlugin.js +1 -1
  75. package/dist/components/message/footer/mention/MentionMenu.js +1 -1
  76. package/dist/components/message/headerIconButton.js +1 -1
  77. package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -1
  78. package/dist/components/message/item/MessageMoreButton.js +18 -5
  79. package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
  80. package/dist/components/message/item/QuoteMessage.js +3 -50
  81. package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
  82. package/dist/components/message/reply/ReplyPreviewBar.js +4 -13
  83. package/dist/components/rich-text-editor/RichTextEditor.d.ts +3 -1
  84. package/dist/components/rich-text-editor/RichTextEditor.d.ts.map +1 -1
  85. package/dist/components/rich-text-editor/RichTextEditor.js +4 -2
  86. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
  87. package/dist/components/search-conversation/item/SearchItemAsGroup.js +5 -5
  88. package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
  89. package/dist/components/search-conversation/item/SearchItemAsMessage.js +13 -1
  90. package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
  91. package/dist/components/search-conversation/item/SearchItemAsUser.js +6 -0
  92. package/dist/components/session/DeskAssignedSession.js +2 -2
  93. package/dist/components/session/FolderRow.js +1 -1
  94. package/dist/components/thread/GroupInfoBodyCrm.d.ts +0 -2
  95. package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -1
  96. package/dist/components/thread/GroupInfoBodyCrm.js +2 -2
  97. package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
  98. package/dist/components/thread/GroupThreadInfo.js +2 -2
  99. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  100. package/dist/components/thread/ManualAssignPopover.js +13 -6
  101. package/dist/components/thread/SessionDetailCard.js +1 -1
  102. package/dist/components/thread/SessionTagPicker.js +1 -1
  103. package/dist/components/thread/SupportSessionPanel.d.ts +1 -1
  104. package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -1
  105. package/dist/components/thread/SupportSessionPanel.js +1 -1
  106. package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
  107. package/dist/components/thread/ThreadInfo.js +3 -1
  108. package/dist/components/thread/ThreadInfoHeader.d.ts +1 -1
  109. package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -1
  110. package/dist/components/thread/ThreadInfoHeader.js +1 -1
  111. package/dist/components/thread/UserSection.js +2 -2
  112. package/dist/constants/images.d.ts +1 -0
  113. package/dist/constants/images.d.ts.map +1 -1
  114. package/dist/constants/images.js +3 -0
  115. package/dist/constants/layout.d.ts +10 -1
  116. package/dist/constants/layout.d.ts.map +1 -1
  117. package/dist/constants/layout.js +10 -1
  118. package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -1
  119. package/dist/hooks/common/useDeskShortcuts.js +3 -1
  120. package/dist/hooks/common/useIsDeskWorkspaceMounted.d.ts +3 -0
  121. package/dist/hooks/common/useIsDeskWorkspaceMounted.d.ts.map +1 -0
  122. package/dist/hooks/common/useIsDeskWorkspaceMounted.js +4 -0
  123. package/dist/hooks/common/useViewportTier.d.ts +4 -0
  124. package/dist/hooks/common/useViewportTier.d.ts.map +1 -0
  125. package/dist/hooks/common/useViewportTier.js +9 -0
  126. package/dist/hooks/common/useVisualViewportHeight.d.ts +10 -0
  127. package/dist/hooks/common/useVisualViewportHeight.d.ts.map +1 -0
  128. package/dist/hooks/common/useVisualViewportHeight.js +30 -0
  129. package/dist/hooks/conversation/useConversationList.d.ts.map +1 -1
  130. package/dist/hooks/conversation/useConversationList.js +31 -0
  131. package/dist/hooks/conversation/useDeskOfflineLock.d.ts +9 -0
  132. package/dist/hooks/conversation/useDeskOfflineLock.d.ts.map +1 -0
  133. package/dist/hooks/conversation/useDeskOfflineLock.js +46 -0
  134. package/dist/hooks/conversation/useDeskThreadNavigation.d.ts +19 -0
  135. package/dist/hooks/conversation/useDeskThreadNavigation.d.ts.map +1 -0
  136. package/dist/hooks/conversation/useDeskThreadNavigation.js +68 -0
  137. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  138. package/dist/hooks/global/useGlobalEvent.js +22 -2
  139. package/dist/hooks/group/useCreateGroup.d.ts.map +1 -1
  140. package/dist/hooks/group/useCreateGroup.js +6 -7
  141. package/dist/hooks/init/useChatBootPhase.d.ts +30 -0
  142. package/dist/hooks/init/useChatBootPhase.d.ts.map +1 -0
  143. package/dist/hooks/init/useChatBootPhase.js +72 -0
  144. package/dist/hooks/message/usePinMessage.d.ts +0 -2
  145. package/dist/hooks/message/usePinMessage.d.ts.map +1 -1
  146. package/dist/hooks/message/usePinMessage.js +7 -11
  147. package/dist/hooks/message/useQuotedSenderName.d.ts +14 -0
  148. package/dist/hooks/message/useQuotedSenderName.d.ts.map +1 -0
  149. package/dist/hooks/message/useQuotedSenderName.js +41 -0
  150. package/dist/hooks/user/useAuth.d.ts.map +1 -1
  151. package/dist/hooks/user/useAuth.js +2 -0
  152. package/dist/index.d.ts +5 -1
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +5 -1
  155. package/dist/locales/i18n.d.ts.map +1 -1
  156. package/dist/locales/i18n.js +3 -2
  157. package/dist/locales/i18n.ts +3 -2
  158. package/dist/locales/vi/boot.json +28 -0
  159. package/dist/locales/vi/common.json +1 -1
  160. package/dist/screens/conversation-detail/index.d.ts.map +1 -1
  161. package/dist/screens/conversation-detail/index.js +8 -3
  162. package/dist/screens/desk-message/DeskBootCard.d.ts +7 -0
  163. package/dist/screens/desk-message/DeskBootCard.d.ts.map +1 -0
  164. package/dist/screens/desk-message/DeskBootCard.js +69 -0
  165. package/dist/screens/desk-message/DeskOfflineOverlay.d.ts +10 -0
  166. package/dist/screens/desk-message/DeskOfflineOverlay.d.ts.map +1 -0
  167. package/dist/screens/desk-message/DeskOfflineOverlay.js +11 -0
  168. package/dist/screens/desk-message/DeskWorkspace.d.ts +7 -1
  169. package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -1
  170. package/dist/screens/desk-message/DeskWorkspace.js +82 -13
  171. package/dist/screens/desk-message/DeskWorkspaceSkeleton.d.ts +10 -0
  172. package/dist/screens/desk-message/DeskWorkspaceSkeleton.d.ts.map +1 -0
  173. package/dist/screens/desk-message/DeskWorkspaceSkeleton.js +18 -0
  174. package/dist/screens/desk-message/PhoneThreadFallbackHeader.d.ts +8 -0
  175. package/dist/screens/desk-message/PhoneThreadFallbackHeader.d.ts.map +1 -0
  176. package/dist/screens/desk-message/PhoneThreadFallbackHeader.js +11 -0
  177. package/dist/screens/desk-message/index.d.ts +2 -0
  178. package/dist/screens/desk-message/index.d.ts.map +1 -1
  179. package/dist/screens/desk-message/index.js +47 -3
  180. package/dist/store/boot.d.ts +29 -0
  181. package/dist/store/boot.d.ts.map +1 -0
  182. package/dist/store/boot.js +21 -0
  183. package/dist/store/conversation.d.ts +2 -0
  184. package/dist/store/conversation.d.ts.map +1 -1
  185. package/dist/store/conversation.js +13 -12
  186. package/dist/store/deskPanelHost.d.ts +2 -0
  187. package/dist/store/deskPanelHost.d.ts.map +1 -1
  188. package/dist/store/deskPanelHost.js +1 -0
  189. package/dist/store/type.d.ts +4 -1
  190. package/dist/store/type.d.ts.map +1 -1
  191. package/dist/store/workspaceLayout.d.ts +3 -0
  192. package/dist/store/workspaceLayout.d.ts.map +1 -1
  193. package/dist/store/workspaceLayout.js +2 -0
  194. package/dist/styles/global.css +1 -1
  195. package/dist/utils/conversation.d.ts +1 -0
  196. package/dist/utils/conversation.d.ts.map +1 -1
  197. package/dist/utils/conversation.js +1 -1
  198. package/package.json +1 -1
  199. package/dist/components/conversation-inbox/contact-search/PublicGroupAvatar.d.ts +0 -9
  200. package/dist/components/conversation-inbox/contact-search/PublicGroupAvatar.d.ts.map +0 -1
  201. package/dist/components/conversation-inbox/contact-search/PublicGroupAvatar.js +0 -19
  202. package/dist/components/group/GroupCompositeAvatar.d.ts +0 -11
  203. package/dist/components/group/GroupCompositeAvatar.d.ts.map +0 -1
  204. package/dist/components/group/GroupCompositeAvatar.js +0 -87
  205. package/dist/screens/desk-message/ViewportNotice.d.ts +0 -4
  206. package/dist/screens/desk-message/ViewportNotice.d.ts.map +0 -1
  207. package/dist/screens/desk-message/ViewportNotice.js +0 -9
@@ -0,0 +1,19 @@
1
+ /** history.state key on entries pushed by opening a thread from the list or a search hit. */
2
+ export declare const DESK_FROM_LIST_KEY = "dcDeskFromList";
3
+ /** Marker value: unique per page load, so an entry left by an earlier document is never trusted. */
4
+ export declare const DESK_DOC_ID: string;
5
+ interface ThreadTarget {
6
+ threadId: string;
7
+ messageId?: string;
8
+ }
9
+ /**
10
+ * Opening and leaving a thread. On phone a thread is its own history entry (marked) so the
11
+ * browser back button returns to the list; otherwise leaving replaces the URL, never leaves the app.
12
+ */
13
+ export declare const useDeskThreadNavigation: () => {
14
+ openFromList: (target: ThreadTarget) => void;
15
+ openThread: (target: ThreadTarget, hostUrl: string) => void;
16
+ backToList: () => void;
17
+ };
18
+ export {};
19
+ //# sourceMappingURL=useDeskThreadNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeskThreadNavigation.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useDeskThreadNavigation.ts"],"names":[],"mappings":"AAOA,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,oGAAoG;AACpG,eAAO,MAAM,WAAW,QAAqE,CAAC;AAE9F,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAeD;;;GAGG;AACH,eAAO,MAAM,uBAAuB;2BAIvB,YAAY;yBAiBZ,YAAY,WAAW,MAAM;;CAwBzC,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { useCallback } from "react";
3
+ import useConversationStore, { THREAD_URL_PARAMS } from "../../store/conversation";
4
+ import useDeskPanelHostStore from "../../store/deskPanelHost";
5
+ import useWorkspaceLayoutStore from "../../store/workspaceLayout";
6
+ import { useChatNavigate } from "./useChatNavigate";
7
+ /** history.state key on entries pushed by opening a thread from the list or a search hit. */
8
+ export const DESK_FROM_LIST_KEY = "dcDeskFromList";
9
+ /** Marker value: unique per page load, so an entry left by an earlier document is never trusted. */
10
+ export const DESK_DOC_ID = `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
11
+ const isMarkedEntry = () => { var _a; return ((_a = window.history.state) === null || _a === void 0 ? void 0 : _a[DESK_FROM_LIST_KEY]) === DESK_DOC_ID; };
12
+ const buildUrl = (target) => {
13
+ const params = new URLSearchParams(window.location.search);
14
+ THREAD_URL_PARAMS.forEach((key) => params.delete(key));
15
+ if (target) {
16
+ params.set("threadId", target.threadId);
17
+ if (target.messageId)
18
+ params.set("messageId", target.messageId);
19
+ }
20
+ const query = params.toString();
21
+ return `${window.location.pathname}${query ? `?${query}` : ""}`;
22
+ };
23
+ /**
24
+ * Opening and leaving a thread. On phone a thread is its own history entry (marked) so the
25
+ * browser back button returns to the list; otherwise leaving replaces the URL, never leaves the app.
26
+ */
27
+ export const useDeskThreadNavigation = () => {
28
+ const navigate = useChatNavigate();
29
+ const openFromList = useCallback((target) => {
30
+ const url = buildUrl(target);
31
+ if (useDeskPanelHostStore.getState().isFullScreen) {
32
+ useWorkspaceLayoutStore.getState().setPhonePendingPane("thread");
33
+ const state = { [DESK_FROM_LIST_KEY]: DESK_DOC_ID };
34
+ // Thread to thread (j/k) swaps the entry so back still lands on the list.
35
+ if (isMarkedEntry())
36
+ window.history.replaceState(state, "", url);
37
+ else
38
+ window.history.pushState(state, "", url);
39
+ return;
40
+ }
41
+ navigate(url);
42
+ }, [navigate]);
43
+ /** Shared openers: the phone desk gets a marked entry, every other host keeps its own URL. */
44
+ const openThread = useCallback((target, hostUrl) => {
45
+ if (useDeskPanelHostStore.getState().isFullScreen)
46
+ openFromList(target);
47
+ else
48
+ navigate(hostUrl);
49
+ }, [navigate, openFromList]);
50
+ const backToList = useCallback(() => {
51
+ const layout = useWorkspaceLayoutStore.getState();
52
+ if (layout.phonePendingPane === "list")
53
+ return;
54
+ layout.setPhonePendingPane("list");
55
+ if (isMarkedEntry()) {
56
+ useConversationStore.getState().clearSelectedConversation({ skipUrl: true });
57
+ window.history.back();
58
+ return;
59
+ }
60
+ const hadThread = new URLSearchParams(window.location.search).has("threadId");
61
+ // Replace first so clearing finds a clean URL and doesn't push an entry.
62
+ window.history.replaceState({}, "", buildUrl());
63
+ useConversationStore.getState().clearSelectedConversation();
64
+ if (!hadThread)
65
+ layout.setPhonePendingPane(null);
66
+ }, []);
67
+ return { openFromList, openThread, backToList };
68
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,cAAc,YA+lB1B,CAAC"}
1
+ {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAiDA,eAAO,MAAM,cAAc,YAmnB1B,CAAC"}
@@ -12,6 +12,7 @@ import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
12
12
  import useConversationStore from "../../store/conversation";
13
13
  import { resolveConversationBotId } from "../../utils/conversation";
14
14
  import useAuthStore from "../../store/auth";
15
+ import useBootStore from "../../store/boot";
15
16
  import { useRefetchChatToken } from "../../hooks/init/useChatToken";
16
17
  import { updateSession } from "../../hooks/session/useUpdateSession";
17
18
  import { QUERY_KEYS } from "../../services/query";
@@ -168,7 +169,9 @@ export const useGlobalEvent = () => {
168
169
  var _a;
169
170
  if (data) {
170
171
  useAuthStore.getState().setChatToken((_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.token);
172
+ return;
171
173
  }
174
+ useBootStore.getState().markFailed("engine");
172
175
  },
173
176
  });
174
177
  };
@@ -195,10 +198,15 @@ export const useGlobalEvent = () => {
195
198
  if (error.errCode === 10102) {
196
199
  updateConnectStatus(ConnectStatus.Connected);
197
200
  updateSyncStatus(SyncStatus.Success);
201
+ // Already logged in (e.g. ChatProvider remounted): sync events may have fired while
202
+ // nobody listened, so stop waiting for them rather than risk a boot screen that never ends.
203
+ useBootStore.getState().markConnected();
204
+ useBootStore.getState().markFirstSyncDone();
198
205
  getSelfUserInfo();
199
206
  initStore();
200
207
  return;
201
208
  }
209
+ useBootStore.getState().markFailed("engine");
202
210
  console.error(error);
203
211
  }
204
212
  };
@@ -208,27 +216,39 @@ export const useGlobalEvent = () => {
208
216
  if (!chatToken || !userID) {
209
217
  return;
210
218
  }
219
+ useBootStore.getState().startBoot(userID);
211
220
  tryLogin();
212
221
  };
213
222
  const connectingHandler = () => {
223
+ useBootStore.getState().markConnecting();
214
224
  updateConnectStatus(ConnectStatus.Connecting);
215
225
  };
216
226
  const connectSuccessHandler = () => {
227
+ useBootStore.getState().markConnected();
217
228
  updateConnectStatus(ConnectStatus.Connected);
218
229
  };
219
230
  const connectFailedHandler = () => {
231
+ // After boot, core keeps retrying on its own; the boot screen only shows "connect" then.
232
+ if (!useBootStore.getState().isFirstSyncDone) {
233
+ useBootStore.getState().markFailed("connect");
234
+ }
220
235
  updateConnectStatus(ConnectStatus.Disconnected);
221
236
  };
222
237
  const syncStartHandler = ({ data }) => {
223
238
  updateSyncStatus(SyncStatus.Loading);
224
239
  };
240
+ const syncProgressHandler = ({ data }) => {
241
+ useBootStore.getState().setSyncProgress(data);
242
+ };
225
243
  const syncFinishHandler = () => {
244
+ useBootStore.getState().markFirstSyncDone();
226
245
  updateSyncStatus(SyncStatus.Success);
227
246
  getSelfUserInfo();
228
247
  loadConversationList();
229
248
  void refreshCurrentGroupState();
230
249
  };
231
250
  const syncFailedHandler = () => {
251
+ useBootStore.getState().markFirstSyncDone();
232
252
  updateSyncStatus(SyncStatus.Failed);
233
253
  };
234
254
  // The bot behind the open thread changed (flow swapped, type switched,
@@ -419,7 +439,7 @@ export const useGlobalEvent = () => {
419
439
  DChatSDK.on(CbEvents.OnConnectFailed, connectFailedHandler);
420
440
  // sync
421
441
  DChatSDK.on(CbEvents.OnSyncServerStart, syncStartHandler);
422
- // DChatSDK.on(CbEvents.OnSyncServerProgress, syncProgressHandler);
442
+ DChatSDK.on(CbEvents.OnSyncServerProgress, syncProgressHandler);
423
443
  DChatSDK.on(CbEvents.OnSyncServerFinish, syncFinishHandler);
424
444
  DChatSDK.on(CbEvents.OnSyncServerFailed, syncFailedHandler);
425
445
  // message
@@ -454,7 +474,7 @@ export const useGlobalEvent = () => {
454
474
  DChatSDK.off(CbEvents.OnConnectFailed, connectFailedHandler);
455
475
  // sync
456
476
  DChatSDK.off(CbEvents.OnSyncServerStart, syncStartHandler);
457
- // DChatSDK.off(CbEvents.OnSyncServerProgress, syncProgressHandler);
477
+ DChatSDK.off(CbEvents.OnSyncServerProgress, syncProgressHandler);
458
478
  DChatSDK.off(CbEvents.OnSyncServerFinish, syncFinishHandler);
459
479
  DChatSDK.off(CbEvents.OnSyncServerFailed, syncFailedHandler);
460
480
  // message
@@ -1 +1 @@
1
- {"version":3,"file":"useCreateGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useCreateGroup.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqCD,eAAO,MAAM,cAAc;6DAQ2B,iBAAiB;CAyDtE,CAAC"}
1
+ {"version":3,"file":"useCreateGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useCreateGroup.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqCD,eAAO,MAAM,cAAc;6DAQ2B,iBAAiB;CA2DtE,CAAC"}
@@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next";
6
6
  import { GroupType, GroupVerificationType, GroupVisibility, SessionType } from "@droppii-org/wasm-client-sdk";
7
7
  import { DChatSDK } from "../../constants/sdk";
8
8
  import useAuthStore from "../../store/auth";
9
- import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
9
+ import { useDeskThreadNavigation } from "../../hooks/conversation/useDeskThreadNavigation";
10
10
  import { generateDefaultGroupName } from "../../utils/groupName";
11
11
  import { QUERY_KEYS } from "../../services/query";
12
12
  const GET_CONVERSATION_RETRY_COUNT = 4;
@@ -43,7 +43,7 @@ const getOneConversationWithRetry = async (groupID) => {
43
43
  export const useCreateGroup = () => {
44
44
  const { t } = useTranslation("conversation-inbox");
45
45
  const { t: tCommon } = useTranslation();
46
- const onNavigate = useChatNavigate();
46
+ const { openThread } = useDeskThreadNavigation();
47
47
  const queryClient = useQueryClient();
48
48
  const userID = useAuthStore((state) => state.userID);
49
49
  const createGroup = useCallback(async ({ groupName, isPublic, members, faceURL }) => {
@@ -56,9 +56,8 @@ export const useCreateGroup = () => {
56
56
  firstMemberName: firstMember === null || firstMember === void 0 ? void 0 : firstMember.displayName,
57
57
  remainingCount: restMembers.length,
58
58
  });
59
- // AC-Default2: no picked avatar → leave faceURL empty. UI renders a
60
- // composite of the owner's + first-joined member's avatars instead of
61
- // a static placeholder (see GroupCompositeAvatar).
59
+ // No picked avatar → leave faceURL empty; GroupAvatar shows the default
60
+ // group image (DROPPII-30928).
62
61
  const resolvedFaceURL = faceURL || "";
63
62
  try {
64
63
  const { data: group } = await DChatSDK.createGroup({
@@ -80,7 +79,7 @@ export const useCreateGroup = () => {
80
79
  });
81
80
  const searchParams = new URLSearchParams(window.location.search);
82
81
  searchParams.set("threadId", conversation.conversationID);
83
- onNavigate(`${window.location.pathname}?${searchParams.toString()}`);
82
+ openThread({ threadId: conversation.conversationID }, `${window.location.pathname}?${searchParams.toString()}`);
84
83
  return conversation;
85
84
  }
86
85
  catch (error) {
@@ -88,6 +87,6 @@ export const useCreateGroup = () => {
88
87
  message.error(errorMessage);
89
88
  throw error;
90
89
  }
91
- }, [onNavigate, t, tCommon, userID, queryClient]);
90
+ }, [openThread, t, tCommon, userID, queryClient]);
92
91
  return { createGroup };
93
92
  };
@@ -0,0 +1,30 @@
1
+ import { type ChatBootFailedStep } from "../../store/boot";
2
+ import { ConnectStatus } from "../../types/chat";
3
+ export type ChatBootPhase = "engine" | "connect" | "sync" | "ready" | "error";
4
+ export interface ChatBootState {
5
+ phase: ChatBootPhase;
6
+ /** Step that failed when `phase` is "error". */
7
+ failedStep: ChatBootFailedStep | null;
8
+ /** 0-100, meaningful in the "sync" phase. */
9
+ syncProgress: number;
10
+ /** The current step has run longer than the caller's `slowAfterMs`. */
11
+ isSlow: boolean;
12
+ /** False for the first moments, so a fast cached boot never flashes status text. */
13
+ isStatusVisible: boolean;
14
+ }
15
+ export declare const BOOT_STATUS_DELAY_MS = 600;
16
+ /** A connect or sync step that sees no change for this long is treated as stuck. */
17
+ export declare const BOOT_STALL_MS = 30000;
18
+ interface ResolveBootPhaseInput {
19
+ connectStatus: ConnectStatus;
20
+ hasConnected: boolean;
21
+ isFirstSyncDone: boolean;
22
+ failedStep: ChatBootFailedStep | null;
23
+ }
24
+ export declare const resolveChatBootPhase: ({ connectStatus, hasConnected, isFirstSyncDone, failedStep, }: ResolveBootPhaseInput) => ChatBootPhase;
25
+ /** Where the chat engine is in its boot: WASM + login, connect, first sync, ready, or failed. */
26
+ export declare const useChatBootPhase: ({ slowAfterMs, }: {
27
+ slowAfterMs: number;
28
+ }) => ChatBootState;
29
+ export {};
30
+ //# sourceMappingURL=useChatBootPhase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatBootPhase.d.ts","sourceRoot":"","sources":["../../../src/hooks/init/useChatBootPhase.ts"],"names":[],"mappings":"AAIA,OAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,aAAa,CAAC;IACrB,gDAAgD;IAChD,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,oFAAoF;AACpF,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC,UAAU,qBAAqB;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACvC;AAED,eAAO,MAAM,oBAAoB,GAAI,+DAKlC,qBAAqB,KAAG,aAO1B,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,gBAAgB,GAAI,kBAE9B;IACD,WAAW,EAAE,MAAM,CAAC;CACrB,KAAG,aAwDH,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use client";
2
+ import { useEffect, useState } from "react";
3
+ import { useChatContext } from "../../context/ChatContext";
4
+ import useBootStore from "../../store/boot";
5
+ import { ConnectStatus } from "../../types/chat";
6
+ export const BOOT_STATUS_DELAY_MS = 600;
7
+ /** A connect or sync step that sees no change for this long is treated as stuck. */
8
+ export const BOOT_STALL_MS = 30000;
9
+ export const resolveChatBootPhase = ({ connectStatus, hasConnected, isFirstSyncDone, failedStep, }) => {
10
+ if (connectStatus === ConnectStatus.Connected) {
11
+ return isFirstSyncDone ? "ready" : "sync";
12
+ }
13
+ if (failedStep)
14
+ return "error";
15
+ if (connectStatus === ConnectStatus.Connecting || hasConnected)
16
+ return "connect";
17
+ return "engine";
18
+ };
19
+ /** Where the chat engine is in its boot: WASM + login, connect, first sync, ready, or failed. */
20
+ export const useChatBootPhase = ({ slowAfterMs, }) => {
21
+ const { connectStatus } = useChatContext();
22
+ const hasConnected = useBootStore((state) => state.hasConnected);
23
+ const isFirstSyncDone = useBootStore((state) => state.isFirstSyncDone);
24
+ const failedStep = useBootStore((state) => state.failedStep);
25
+ const syncProgress = useBootStore((state) => state.syncProgress);
26
+ const basePhase = resolveChatBootPhase({
27
+ connectStatus,
28
+ hasConnected,
29
+ isFirstSyncDone,
30
+ failedStep,
31
+ });
32
+ // Sync progress restarts the slow/stall timers: a moving sync is not stuck.
33
+ const stepKey = basePhase === "sync" ? `sync:${syncProgress}` : basePhase;
34
+ const [isDelayOver, setIsDelayOver] = useState(false);
35
+ const [slowStepKey, setSlowStepKey] = useState(null);
36
+ const [stalledStepKey, setStalledStepKey] = useState(null);
37
+ useEffect(() => {
38
+ const timer = setTimeout(() => setIsDelayOver(true), BOOT_STATUS_DELAY_MS);
39
+ return () => clearTimeout(timer);
40
+ }, []);
41
+ useEffect(() => {
42
+ if (basePhase === "ready" || basePhase === "error")
43
+ return;
44
+ const slowTimer = setTimeout(() => setSlowStepKey(stepKey), slowAfterMs);
45
+ // No stall timer for "engine": a first WASM download on a slow network can take minutes.
46
+ // A stuck sync falls through to the UI it already has; a stuck connect becomes an error.
47
+ const stallTimer = basePhase === "engine"
48
+ ? undefined
49
+ : setTimeout(() => {
50
+ if (basePhase === "sync")
51
+ useBootStore.getState().markSyncStalled();
52
+ else
53
+ setStalledStepKey(stepKey);
54
+ }, BOOT_STALL_MS);
55
+ return () => {
56
+ clearTimeout(slowTimer);
57
+ clearTimeout(stallTimer);
58
+ // Re-entering the same step later (e.g. "connect" after a drop) starts from scratch.
59
+ setSlowStepKey(null);
60
+ setStalledStepKey(null);
61
+ };
62
+ }, [basePhase, stepKey, slowAfterMs]);
63
+ const isStalled = basePhase === "connect" && stalledStepKey === stepKey;
64
+ const phase = isStalled ? "error" : basePhase;
65
+ return {
66
+ phase,
67
+ failedStep: isStalled ? "connect" : phase === "error" ? failedStep : null,
68
+ syncProgress,
69
+ isSlow: slowStepKey === stepKey,
70
+ isStatusVisible: isDelayOver || phase === "error",
71
+ };
72
+ };
@@ -1,7 +1,5 @@
1
1
  export declare const usePinMessage: () => {
2
2
  pinMessage: (conversationID: string, clientMsgID: string) => Promise<void>;
3
3
  unpinMessage: (conversationID: string, clientMsgID: string) => Promise<void>;
4
- pinLoading: boolean;
5
- unpinLoading: boolean;
6
4
  };
7
5
  //# sourceMappingURL=usePinMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePinMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/usePinMessage.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa;;;;;CA6CzB,CAAC"}
1
+ {"version":3,"file":"usePinMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/usePinMessage.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa;iCAIC,MAAM,eAAe,MAAM;mCAiB3B,MAAM,eAAe,MAAM;CAkBrD,CAAC"}
@@ -1,11 +1,13 @@
1
- import { useRequest } from "ahooks";
1
+ import { useCallback } from "react";
2
2
  import { DChatSDK } from "../../constants/sdk";
3
3
  import useAuthStore from "../../store/auth";
4
4
  import { updateOneMessage } from "../../hooks/message/useMessage";
5
5
  import { fetchPinnedMessages } from "./usePinnedMessages";
6
+ // Plain callbacks, not ahooks useRequest: unpinning the last pin unmounts the
7
+ // pinned panel, and ahooks >=3.10 rejects a request whose owner unmounts.
6
8
  export const usePinMessage = () => {
7
9
  const userID = useAuthStore((state) => state.userID);
8
- const { runAsync: pinMessage, loading: pinLoading } = useRequest(async (conversationID, clientMsgID) => {
10
+ const pinMessage = useCallback(async (conversationID, clientMsgID) => {
9
11
  await DChatSDK.pinMsg({
10
12
  conversationID,
11
13
  clientMsgID,
@@ -17,10 +19,8 @@ export const usePinMessage = () => {
17
19
  pinnedTime: Date.now(),
18
20
  });
19
21
  await fetchPinnedMessages(conversationID);
20
- }, {
21
- manual: true,
22
- });
23
- const { runAsync: unpinMessage, loading: unpinLoading } = useRequest(async (conversationID, clientMsgID) => {
22
+ }, [userID]);
23
+ const unpinMessage = useCallback(async (conversationID, clientMsgID) => {
24
24
  await DChatSDK.unpinMsg({
25
25
  conversationID,
26
26
  clientMsgID,
@@ -30,13 +30,9 @@ export const usePinMessage = () => {
30
30
  isPinned: false,
31
31
  });
32
32
  await fetchPinnedMessages(conversationID);
33
- }, {
34
- manual: true,
35
- });
33
+ }, []);
36
34
  return {
37
35
  pinMessage,
38
36
  unpinMessage,
39
- pinLoading,
40
- unpinLoading,
41
37
  };
42
38
  };
@@ -0,0 +1,14 @@
1
+ type QuotedSender = {
2
+ sendID?: string;
3
+ senderNickname?: string;
4
+ } | null;
5
+ /**
6
+ * Who a quote is attributed to; the sent quote and the reply bar share it.
7
+ * `name` is empty when the viewer quoted their own message (`isMe`).
8
+ */
9
+ export declare const useQuotedSenderName: (quoted?: QuotedSender) => {
10
+ isMe: boolean;
11
+ name: string;
12
+ };
13
+ export {};
14
+ //# sourceMappingURL=useQuotedSenderName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuotedSenderName.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useQuotedSenderName.ts"],"names":[],"mappings":"AASA,KAAK,YAAY,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,YAAY;;;CAqCxD,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { useMemo } from "react";
2
+ import useAuthStore from "../../store/auth";
3
+ import useConversationStore from "../../store/conversation";
4
+ import { useUserUsername } from "../../hooks/user/useUserUsername";
5
+ import { BOT_SESSION_CONVERSATION_PREFIX, isSupportSessionAgentView, } from "../../utils/conversation";
6
+ /**
7
+ * Who a quote is attributed to; the sent quote and the reply bar share it.
8
+ * `name` is empty when the viewer quoted their own message (`isMe`).
9
+ */
10
+ export const useQuotedSenderName = (quoted) => {
11
+ const userID = useAuthStore((state) => state.userID);
12
+ const isCrm = useAuthStore((state) => state.isCrm);
13
+ const conversationData = useConversationStore((state) => state.conversationData);
14
+ const isMe = !!quoted && quoted.sendID === userID;
15
+ // Outside CRM an agent tells senders apart by username.
16
+ const isAgentView = !isCrm && isSupportSessionAgentView(conversationData, userID);
17
+ const quotedUsername = useUserUsername(isAgentView && !isMe ? quoted === null || quoted === void 0 ? void 0 : quoted.sendID : undefined);
18
+ const isSupportThread = useMemo(() => {
19
+ var _a, _b, _c, _d;
20
+ // Core sometimes leaves ex empty; the conversation id still marks a bot thread.
21
+ const conversationID = (_a = conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) !== null && _a !== void 0 ? _a : "";
22
+ if (conversationID.startsWith(BOT_SESSION_CONVERSATION_PREFIX))
23
+ return true;
24
+ try {
25
+ return Boolean((_d = (_c = (_b = JSON.parse((conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex) || "{}")) === null || _b === void 0 ? void 0 : _b.sessionInfo) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.botId);
26
+ }
27
+ catch (_e) {
28
+ return false;
29
+ }
30
+ }, [conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID, conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex]);
31
+ if (!quoted || isMe)
32
+ return { isMe, name: "" };
33
+ if (isAgentView) {
34
+ return { isMe, name: quotedUsername || quoted.senderNickname || "" };
35
+ }
36
+ // The session owner only ever sees the thread's own name for the other side.
37
+ if (!isCrm && isSupportThread) {
38
+ return { isMe, name: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName) || "" };
39
+ }
40
+ return { isMe, name: quoted.senderNickname || "" };
41
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../src/hooks/user/useAuth.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY;;CA6BxB,CAAC"}
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../src/hooks/user/useAuth.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY;;CA8BxB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { Platform } from "@droppii-org/wasm-client-sdk";
2
2
  import { DChatSDK } from "../../constants/sdk";
3
3
  import useAuthStore from "../../store/auth";
4
+ import useBootStore from "../../store/boot";
4
5
  import useConversationStore from "../../store/conversation";
5
6
  import useMessageDraftStore from "../../store/messageDraft";
6
7
  import useTypingStore from "../../store/typing";
@@ -12,6 +13,7 @@ export const useDChatAuth = () => {
12
13
  const res = await DChatSDK.logout();
13
14
  const applicationType = useAuthStore.getState().applicationType;
14
15
  resetConversationStore();
16
+ useBootStore.getState().reset();
15
17
  clearAllDrafts();
16
18
  useTypingStore.getState().clearTypers();
17
19
  initAuthStore({
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ export { DChatDeskMessage, DChatBubble, Icon, SkipLinks };
19
19
  export { StrokeIcon } from "./components/icon/StrokeIcon";
20
20
  export type { StrokeIconProps } from "./components/icon/StrokeIcon";
21
21
  export type { StrokeIconName } from "./components/icon/strokeIconNodes";
22
+ export { default as DeskWorkspaceSkeleton } from "./screens/desk-message/DeskWorkspaceSkeleton";
22
23
  export { default as RichTextEditor } from "./components/rich-text-editor/RichTextEditor";
23
24
  export { default as ShadowStyleBoundary } from "./components/shadow-style-boundary/ShadowStyleBoundary";
24
25
  export type { ShadowStyleBoundaryProps } from "./components/shadow-style-boundary/ShadowStyleBoundary";
@@ -73,6 +74,9 @@ export { MediaEntryCard, MediaResourcePanel, MediaResourceTabs, MediaResourceTab
73
74
  export type { MediaResourceTabsProps } from "./components/media-resources/MediaResourceTabs";
74
75
  export { useMessageResources } from "./hooks/message/useMessageResources";
75
76
  export { PAGE_SIZE } from "./constants";
76
- export { LAYOUT_BREAKPOINTS, LAYOUT_WIDTHS } from "./constants/layout";
77
+ export { LAYOUT_BREAKPOINTS, LAYOUT_MEDIA, LAYOUT_WIDTHS } from "./constants/layout";
77
78
  export { useMediaQuery } from "./hooks/common/useMediaQuery";
79
+ export { useViewportTier } from "./hooks/common/useViewportTier";
80
+ export type { ViewportTier } from "./hooks/common/useViewportTier";
81
+ export { useIsDeskWorkspaceMounted } from "./hooks/common/useIsDeskWorkspaceMounted";
78
82
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -18,6 +18,8 @@ export { openLink } from "./utils/openLink";
18
18
  //Components
19
19
  export { DChatDeskMessage, DChatBubble, Icon, SkipLinks };
20
20
  export { StrokeIcon } from "./components/icon/StrokeIcon";
21
+ // The desk's loading placeholder, for hosts whose app shell renders before ChatProvider.
22
+ export { default as DeskWorkspaceSkeleton } from "./screens/desk-message/DeskWorkspaceSkeleton";
21
23
  export { default as RichTextEditor } from "./components/rich-text-editor/RichTextEditor";
22
24
  export { default as ShadowStyleBoundary } from "./components/shadow-style-boundary/ShadowStyleBoundary";
23
25
  export { default as DChatConversationInbox } from "./screens/conversation-inbox";
@@ -68,5 +70,7 @@ export { getDChatSDK } from "./constants/sdk";
68
70
  export { MediaEntryCard, MediaResourcePanel, MediaResourceTabs, MediaResourceTabKey, } from "./components/media-resources";
69
71
  export { useMessageResources } from "./hooks/message/useMessageResources";
70
72
  export { PAGE_SIZE } from "./constants";
71
- export { LAYOUT_BREAKPOINTS, LAYOUT_WIDTHS } from "./constants/layout";
73
+ export { LAYOUT_BREAKPOINTS, LAYOUT_MEDIA, LAYOUT_WIDTHS } from "./constants/layout";
72
74
  export { useMediaQuery } from "./hooks/common/useMediaQuery";
75
+ export { useViewportTier } from "./hooks/common/useViewportTier";
76
+ export { useIsDeskWorkspaceMounted } from "./hooks/common/useIsDeskWorkspaceMounted";
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/locales/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAkB3B,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/locales/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAmB3B,eAAe,IAAI,CAAC"}
@@ -2,15 +2,16 @@ import i18n from "i18next";
2
2
  import { initReactI18next } from "react-i18next";
3
3
  import vi from "./vi/common.json";
4
4
  import viConversationInbox from "./vi/conversation-inbox.json";
5
+ import viBoot from "./vi/boot.json";
5
6
  if (!i18n.isInitialized) {
6
7
  i18n.use(initReactI18next).init({
7
8
  resources: {
8
- vi: { common: vi, "conversation-inbox": viConversationInbox },
9
+ vi: { common: vi, "conversation-inbox": viConversationInbox, boot: viBoot },
9
10
  },
10
11
  lng: "vi",
11
12
  fallbackLng: "vi",
12
13
  interpolation: { escapeValue: false },
13
- ns: ["common", "conversation-inbox"],
14
+ ns: ["common", "conversation-inbox", "boot"],
14
15
  defaultNS: "common",
15
16
  });
16
17
  }
@@ -2,16 +2,17 @@ import i18n from "i18next";
2
2
  import { initReactI18next } from "react-i18next";
3
3
  import vi from "./vi/common.json";
4
4
  import viConversationInbox from "./vi/conversation-inbox.json";
5
+ import viBoot from "./vi/boot.json";
5
6
 
6
7
  if (!i18n.isInitialized) {
7
8
  i18n.use(initReactI18next).init({
8
9
  resources: {
9
- vi: { common: vi, "conversation-inbox": viConversationInbox },
10
+ vi: { common: vi, "conversation-inbox": viConversationInbox, boot: viBoot },
10
11
  },
11
12
  lng: "vi",
12
13
  fallbackLng: "vi",
13
14
  interpolation: { escapeValue: false },
14
- ns: ["common", "conversation-inbox"],
15
+ ns: ["common", "conversation-inbox", "boot"],
15
16
  defaultNS: "common",
16
17
  });
17
18
  }
@@ -0,0 +1,28 @@
1
+ {
2
+ "desk": {
3
+ "title": {
4
+ "engine": "Đang khởi động Livechat",
5
+ "connect": "Đang kết nối máy chủ chat",
6
+ "sync": "Đang đồng bộ tin nhắn",
7
+ "error": "Không kết nối được Livechat"
8
+ },
9
+ "steps": {
10
+ "engine": "Khởi động Livechat",
11
+ "connect": "Kết nối máy chủ chat",
12
+ "sync": "Đồng bộ tin nhắn"
13
+ },
14
+ "slow": "Mạng đang chậm hơn bình thường. Livechat vẫn đang tải, bạn không cần làm gì thêm.",
15
+ "error_hint": "Kiểm tra kết nối mạng rồi bấm Thử lại. Nếu vẫn lỗi, báo bộ phận kỹ thuật: dừng ở bước {{step}}."
16
+ },
17
+ "inbox": {
18
+ "title": "Đang tải tin nhắn",
19
+ "engine": "Đang chuẩn bị hộp thư…",
20
+ "connect": "Đang kết nối…",
21
+ "sync": "Đang đồng bộ…",
22
+ "slow": "Lần đầu mở có thể mất một chút thời gian. Những lần sau sẽ nhanh hơn.",
23
+ "error_title": "Chưa tải được tin nhắn",
24
+ "error_hint": "Kiểm tra kết nối mạng rồi thử lại."
25
+ },
26
+ "retry": "Thử lại",
27
+ "sync_progress_label": "Tiến độ đồng bộ tin nhắn"
28
+ }