@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
@@ -5,7 +5,8 @@ interface MediaActionsProps {
5
5
  buttonClassName?: string;
6
6
  showMediaUpload?: boolean;
7
7
  crmComposer?: boolean;
8
+ hideEmojiOnPhone?: boolean;
8
9
  }
9
- export default function MediaActions({ listUploadFiles, onFilesChange, buttonClassName, showMediaUpload, crmComposer, }: MediaActionsProps): import("react/jsx-runtime").JSX.Element;
10
+ export default function MediaActions({ listUploadFiles, onFilesChange, buttonClassName, showMediaUpload, crmComposer, hideEmojiOnPhone, }: MediaActionsProps): import("react/jsx-runtime").JSX.Element;
10
11
  export {};
11
12
  //# sourceMappingURL=MediaActions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MediaActions.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/MediaActions.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAuD1E,UAAU,iBAAiB;IACzB,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,eAAe,EACf,aAAa,EACb,eAAe,EACf,eAAsB,EACtB,WAAmB,GACpB,EAAE,iBAAiB,2CA6LnB"}
1
+ {"version":3,"file":"MediaActions.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/MediaActions.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAuD1E,UAAU,iBAAiB;IACzB,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,eAAe,EACf,aAAa,EACb,eAAe,EACf,eAAsB,EACtB,WAAmB,EACnB,gBAAwB,GACzB,EAAE,iBAAiB,2CA+LnB"}
@@ -18,7 +18,7 @@ import useAuthStore from "../../../store/auth";
18
18
  import { StrokeIcon } from "../../../components/icon/StrokeIcon";
19
19
  const EmojiIcon = (_jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M7.59997 12.4C7.59997 12.4 8.49997 13.2 9.99997 13.2C11.5 13.2 12.4 12.4 12.4 12.4M14 8.39997C14 8.8418 13.6418 9.19997 13.2 9.19997C12.7581 9.19997 12.4 8.8418 12.4 8.39997C12.4 7.95814 12.7581 7.59997 13.2 7.59997C13.6418 7.59997 14 7.95814 14 8.39997ZM18 9.99997C18 14.4182 14.4182 18 9.99997 18C5.58169 18 1.99997 14.4182 1.99997 9.99997C1.99997 5.58169 5.58169 1.99997 9.99997 1.99997C14.4182 1.99997 18 5.58169 18 9.99997ZM7.59997 8.39997C7.59997 8.8418 7.2418 9.19997 6.79997 9.19997C6.35814 9.19997 5.99997 8.8418 5.99997 8.39997C5.99997 7.95814 6.35814 7.59997 6.79997 7.59997C7.2418 7.59997 7.59997 7.95814 7.59997 8.39997Z", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
20
20
  const AttachIcon = (_jsx("svg", { width: "22", height: "22", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M15.6 10.0001V11.2001C15.6 14.5137 12.9137 17.2001 9.59998 17.2001C6.28626 17.2001 3.59998 14.5137 3.59998 11.2001V6.79999C3.59998 4.59085 5.39084 2.79999 7.59998 2.79999C9.8091 2.79999 11.6 4.59085 11.6 6.79999V11.2C11.6 12.3045 10.7045 13.2 9.59998 13.2C8.49542 13.2 7.59998 12.3045 7.59998 11.2V7.99999", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
21
- export default function MediaActions({ listUploadFiles, onFilesChange, buttonClassName, showMediaUpload = true, crmComposer = false, }) {
21
+ export default function MediaActions({ listUploadFiles, onFilesChange, buttonClassName, showMediaUpload = true, crmComposer = false, hideEmojiOnPhone = false, }) {
22
22
  const [editor] = useLexicalComposerContext();
23
23
  const { t } = useTranslation();
24
24
  const [showEmojiPicker, setShowEmojiPicker] = useState(false);
@@ -96,14 +96,14 @@ export default function MediaActions({ listUploadFiles, onFilesChange, buttonCla
96
96
  return () => document.removeEventListener("mousedown", handleClickOutside);
97
97
  }, []);
98
98
  const btnClass = crmComposer
99
- ? "!flex !h-8 !w-8 items-center justify-center rounded-lg p-0 text-gray-600 hover:!bg-gray-5 hover:!text-gray-900"
99
+ ? "!flex !h-8 !w-8 items-center justify-center rounded-lg p-0 text-gray-600 hover:!bg-gray-5 hover:!text-gray-900 touch:min-h-10 touch:min-w-10"
100
100
  : buttonClassName !== null && buttonClassName !== void 0 ? buttonClassName : "w-8 h-8 p-0 text-gray-500 hover:text-gray-700 hover:bg-gray-100";
101
101
  const activeCls = crmComposer
102
102
  ? "!bg-primary-25 !text-primary-500"
103
103
  : "bg-blue-100 text-blue-600";
104
104
  const crmLabel = (key) => crmComposer ? { "aria-label": t(key), title: t(key) } : {};
105
- return (_jsxs("div", { "data-cp-name": "MediaActions", className: clsx("flex items-center relative", crmComposer ? "gap-0.5" : "gap-1"), ref: containerRef, children: [isCrm && (_jsx(Button, Object.assign({ type: "text", shape: "default", className: clsx(btnClass, isOpenCanned && activeCls), onClick: onPressCanned }, crmLabel("composer_quick_reply"), { children: crmComposer ? (_jsx(StrokeIcon, { name: "hash", size: 18 })) : (_jsx(CannedResponseIcon, { className: clsx("hover:text-gray-700", isOpenCanned && "text-blue-600") })) }))), _jsx(Button, Object.assign({ type: "text", shape: "default", className: clsx(btnClass, showEmojiPicker &&
105
+ return (_jsxs("div", { "data-cp-name": "MediaActions", className: clsx("flex items-center relative", crmComposer ? "gap-0.5" : "gap-1"), ref: containerRef, children: [isCrm && (_jsx(Button, Object.assign({ type: "text", shape: "default", className: clsx(btnClass, isOpenCanned && activeCls), onClick: onPressCanned }, crmLabel("composer_quick_reply"), { children: crmComposer ? (_jsx(StrokeIcon, { name: "hash", size: 18 })) : (_jsx(CannedResponseIcon, { className: clsx("hover:text-gray-700", isOpenCanned && "text-blue-600") })) }))), _jsx(Button, Object.assign({ type: "text", shape: "default", className: clsx(btnClass, hideEmojiOnPhone && "phone:!hidden", showEmojiPicker &&
106
106
  (crmComposer
107
107
  ? activeCls
108
- : "bg-[var(--dc-color-primary-light)] text-[var(--dc-color-primary)]")), onClick: () => setShowEmojiPicker(!showEmojiPicker) }, crmLabel("composer_emoji"), { children: crmComposer ? _jsx(StrokeIcon, { name: "smile", size: 18 }) : EmojiIcon })), showMediaUpload && (_jsxs(_Fragment, { children: [_jsx(Upload, { accept: "image/jpeg, image/png, image/jpg, video/*", beforeUpload: beforeUploadImagesAndVideo, multiple: true, onChange: handleChange, showUploadList: false, fileList: listUploadFiles, children: _jsx(Button, Object.assign({ type: "text", shape: "default", className: btnClass }, crmLabel("composer_attach_image"), { children: crmComposer ? (_jsx(StrokeIcon, { name: "image", size: 18 })) : (_jsx(Icon, { icon: "image-02-o", size: 22 })) })) }), _jsx(Upload, { accept: ".doc,.docx,.pdf", beforeUpload: beforeUploadFile, onChange: handleChange, showUploadList: false, fileList: listUploadFiles, children: _jsx(Button, Object.assign({ type: "text", shape: "default", className: btnClass }, crmLabel("composer_attach_file"), { children: crmComposer ? _jsx(StrokeIcon, { name: "paperclip", size: 18 }) : AttachIcon })) })] })), showEmojiPicker && (_jsx(EmojiPicker, { onEmojiSelect: handleEmojiSelect, onClose: () => setShowEmojiPicker(false) }))] }));
108
+ : "bg-[var(--dc-color-primary-light)] text-[var(--dc-color-primary)]")), onClick: () => setShowEmojiPicker(!showEmojiPicker) }, crmLabel("composer_emoji"), { children: crmComposer ? _jsx(StrokeIcon, { name: "smile", size: 18 }) : EmojiIcon })), showMediaUpload && (_jsxs(_Fragment, { children: [_jsx(Upload, { accept: "image/jpeg, image/png, image/jpg, video/*", beforeUpload: beforeUploadImagesAndVideo, multiple: true, onChange: handleChange, showUploadList: false, fileList: listUploadFiles, children: _jsx(Button, Object.assign({ type: "text", shape: "default", className: btnClass }, crmLabel("composer_attach_image"), { children: crmComposer ? (_jsx(StrokeIcon, { name: "image", size: 18 })) : (_jsx(Icon, { icon: "image-02-o", size: 22 })) })) }), _jsx(Upload, { accept: ".doc,.docx,.pdf", beforeUpload: beforeUploadFile, onChange: handleChange, showUploadList: false, fileList: listUploadFiles, children: _jsx(Button, Object.assign({ type: "text", shape: "default", className: btnClass }, crmLabel("composer_attach_file"), { children: crmComposer ? _jsx(StrokeIcon, { name: "paperclip", size: 18 }) : AttachIcon })) })] })), showEmojiPicker && (_jsx(EmojiPicker, { className: crmComposer ? "max-lg:w-80" : undefined, onEmojiSelect: handleEmojiSelect, onClose: () => setShowEmojiPicker(false) }))] }));
109
109
  }
@@ -105,7 +105,7 @@ export const ToolbarPlugin = ({ compact = false }) => {
105
105
  editor.dispatchCommand(TOGGLE_LINK_COMMAND, "https://");
106
106
  }, [editor]);
107
107
  const getButtonClasses = (isActive) => {
108
- return `w-8 h-8 p-0 border-sm ${isActive
108
+ return `w-8 h-8 p-0 border-sm ${compact ? "touch:min-h-10 touch:min-w-10" : ""} ${isActive
109
109
  ? "bg-blue-100 text-blue-600"
110
110
  : "text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`;
111
111
  };
@@ -95,7 +95,7 @@ const MentionMenu = ({ groupID, isBotThread }) => {
95
95
  // overlapped the composer's own top portion. MentionMenuOffset
96
96
  // pushes the extra distance from the caret up to the composer's
97
97
  // actual top edge, so the menu clears the input entirely.
98
- _jsxs(MentionMenuOffset, { "data-cp-name": "MentionMenu", className: "absolute left-0 z-50 max-h-[220px] w-[260px] overflow-y-auto rounded-md border border-gray-200 bg-white py-1 shadow-lg", children: [_jsx("div", { className: "px-3 py-1 text-xs font-medium text-gray-400", children: t("mention.menu_title") }), typeaheadOptions.length === 0 ? (_jsx("div", { className: "px-3 py-2 text-sm text-gray-500", children: limitReached
98
+ _jsxs(MentionMenuOffset, { "data-cp-name": "MentionMenu", className: "absolute left-0 z-50 max-h-[220px] touch:max-h-[min(220px,calc(var(--dc-desk-height,100dvh)-var(--dc-composer-reserve,280px)))] w-[260px] overflow-y-auto rounded-md border border-gray-200 bg-white py-1 shadow-lg", children: [_jsx("div", { className: "px-3 py-1 text-xs font-medium text-gray-400", children: t("mention.menu_title") }), typeaheadOptions.length === 0 ? (_jsx("div", { className: "px-3 py-2 text-sm text-gray-500", children: limitReached
99
99
  ? t("mention.limit_reached", { max: MAX_MENTIONED_USERS })
100
100
  : t("mention.no_result") })) : (typeaheadOptions.map((option, index) => (_jsxs("button", { type: "button", className: `flex w-full items-center gap-2 px-3 py-2 text-left text-sm ${index === selectedIndex ? "bg-blue-50" : "hover:bg-gray-50"}`, onMouseEnter: () => setHighlightedIndex(index), onClick: () => selectOptionAndCleanUp(option), children: [option.option.isAtAll ? (_jsx("span", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-gray-100 text-gray-500", children: "@" })) : isCrm ? (_jsx(TintedAvatar, { name: option.option.displayName, src: option.option.faceURL, size: 24 })) : (_jsx(Avatar, { size: 24, src: option.option.faceURL, children: option.option.displayName.charAt(0) })), _jsx("span", { className: "min-w-0 flex-1 truncate", children: option.option.displayName })] }, option.key))))] }), anchorElementRef.current);
101
101
  } }));
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Icon } from "../../components/icon";
3
3
  import { StrokeIcon } from "../../components/icon/StrokeIcon";
4
4
  /** Classes of a header icon button; an open panel gets the Primary-25 tile in CRM. */
5
- export const headerIconButtonClass = (isCrm, isOpen) => `${isCrm ? "w-9 h-9 [@container(max-width:699px)]:!w-8 [@container(max-width:699px)]:!h-8" : "w-8 h-8"} p-0 ${isCrm && isOpen
5
+ export const headerIconButtonClass = (isCrm, isOpen) => `${isCrm ? "w-9 h-9 [@container(max-width:699px)]:!w-8 [@container(max-width:699px)]:!h-8 touch:min-h-10 touch:min-w-10" : "w-8 h-8"} p-0 ${isCrm && isOpen
6
6
  ? "bg-primary-25 text-primary-500"
7
7
  : "text-[var(--dc-color-header-icon)]"}`;
8
8
  /** Mockup line icon in CRM, the icon-font glyph elsewhere. */
@@ -1 +1 @@
1
- {"version":3,"file":"MessageMoreButton.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/MessageMoreButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAwBtC,UAAU,sBAAsB;IAC9B,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,oFAAoF;AACpF,QAAA,MAAM,iBAAiB,GAAI,mDAMxB,sBAAsB,4CAyDxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"MessageMoreButton.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/MessageMoreButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAsCtC,UAAU,sBAAsB;IAC9B,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,oFAAoF;AACpF,QAAA,MAAM,iBAAiB,GAAI,mDAMxB,sBAAsB,4CAmFxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1,18 +1,29 @@
1
1
  "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useRef } from "react";
4
- import { Dropdown } from "antd";
4
+ import { Dropdown, Menu } from "antd";
5
5
  import clsx from "clsx";
6
6
  import { StrokeIcon } from "../../../components/icon/StrokeIcon";
7
7
  import { useTranslation } from "react-i18next";
8
8
  import { useEscapeLayer } from "../../../hooks/common/useEscapeLayer";
9
+ import BottomSheet from "../../../components/common/BottomSheet";
10
+ import { LAYOUT_MEDIA } from "../../../constants/layout";
9
11
  // Compact text menu from the design: 260px, 36px rows, 14px text, 18px icons.
10
12
  const MORE_MENU_CLASSNAME = clsx("[&_.ant-dropdown-menu]:!w-[260px]", "[&_.ant-dropdown-menu]:!rounded-xl", "[&_.ant-dropdown-menu]:!p-1", "[&_.ant-dropdown-menu-item]:!h-9", "[&_.ant-dropdown-menu-item]:!rounded-lg", "[&_.ant-dropdown-menu-item]:!px-3", "[&_.ant-dropdown-menu-item]:!py-0", "[&_.ant-dropdown-menu-item]:flex", "[&_.ant-dropdown-menu-item]:items-center", "[&_[data-cp-name=ToolboxMenuRow]]:gap-2.5", "[&_[data-cp-name=ToolboxMenuRow]_span]:!text-sm", "[&_[data-cp-name=ToolboxMenuRow]_span]:!font-normal", "[&_[data-cp-name=ToolboxMenuRow]_svg]:!h-[18px]", "[&_[data-cp-name=ToolboxMenuRow]_svg]:!w-[18px]");
13
+ // Sheet rows: 48px, borderless, same labeled items as the dropdown.
14
+ const SHEET_MENU_CLASSNAME = clsx("!border-0", "[&_.ant-menu-item]:!h-12", "[&_.ant-menu-item]:!leading-[48px]", "[&_.ant-menu-item]:!rounded-lg", "[&_.ant-menu-item]:!px-3", "[&_.ant-menu-item]:!m-0", "[&_.ant-menu-item]:!w-full", "[&_[data-cp-name=ToolboxMenuRow]]:gap-3");
11
15
  /** CRM only: "…" beside the bubble that opens the same text menu as right-click. */
12
16
  const MessageMoreButton = ({ items, open, onOpenChange, isMine, reachable, }) => {
13
17
  const { t } = useTranslation();
14
18
  const buttonRef = useRef(null);
15
19
  useEscapeLayer(open, () => onOpenChange(false));
20
+ // A plain matchMedia read per render, no per-row subscription.
21
+ const isPhoneTier = typeof window !== "undefined" && window.matchMedia(LAYOUT_MEDIA.phone).matches;
22
+ const asSheet = open && isPhoneTier;
23
+ // Mounted on first sheet use only, so rows that never open one carry no Drawer.
24
+ const sheetUsedRef = useRef(false);
25
+ if (asSheet)
26
+ sheetUsedRef.current = true;
16
27
  // Opened from the keyboard: move into the menu; closing returns focus to the button.
17
28
  const openedByKeyboardRef = useRef(false);
18
29
  useEffect(() => {
@@ -25,7 +36,9 @@ const MessageMoreButton = ({ items, open, onOpenChange, isMine, reachable, }) =>
25
36
  // The popup mounts a frame or two after `open`; retry briefly.
26
37
  let tries = 0;
27
38
  const id = window.setInterval(() => {
28
- const item = document.querySelector(".ant-dropdown:not(.ant-dropdown-hidden) [role=menuitem]");
39
+ const item = document.querySelector(asSheet
40
+ ? ".ant-drawer-open [role=menuitem]"
41
+ : ".ant-dropdown:not(.ant-dropdown-hidden) [role=menuitem]");
29
42
  item === null || item === void 0 ? void 0 : item.focus();
30
43
  if (item || ++tries > 20)
31
44
  window.clearInterval(id);
@@ -36,7 +49,7 @@ const MessageMoreButton = ({ items, open, onOpenChange, isMine, reachable, }) =>
36
49
  openedByKeyboardRef.current = false;
37
50
  (_b = buttonRef.current) === null || _b === void 0 ? void 0 : _b.focus();
38
51
  }
39
- }, [open]);
40
- return (_jsx(Dropdown, { menu: { items }, trigger: ["click"], open: open, onOpenChange: onOpenChange, placement: isMine ? "bottomRight" : "bottomLeft", overlayClassName: MORE_MENU_CLASSNAME, children: _jsx("button", { ref: buttonRef, type: "button", "data-testid": "message-more-button", "aria-label": t("message_actions"), title: t("message_actions"), "aria-haspopup": "menu", "aria-expanded": open, tabIndex: reachable || open ? 0 : -1, className: clsx("absolute top-1/2 z-[1] flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-lg border-0 bg-gray-5 p-0 text-gray-900 opacity-0 transition-opacity hover:bg-gray-25 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200 group-hover/msg:opacity-100 group-focus-within/msg:opacity-100", open && "opacity-100", isMine ? "right-full mr-1" : "left-full ml-1"), children: _jsx(StrokeIcon, { name: "more", size: 18 }) }) }));
52
+ }, [open, asSheet]);
53
+ return (_jsxs(_Fragment, { children: [_jsx(Dropdown, { menu: { items }, trigger: ["click"], open: open && !asSheet, onOpenChange: onOpenChange, placement: isMine ? "bottomRight" : "bottomLeft", overlayClassName: MORE_MENU_CLASSNAME, children: _jsx("button", { ref: buttonRef, type: "button", "data-testid": "message-more-button", "aria-label": t("message_actions"), title: t("message_actions"), "aria-haspopup": isPhoneTier ? "dialog" : "menu", "aria-expanded": open, tabIndex: reachable || open ? 0 : -1, className: clsx("absolute top-1/2 z-[1] flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-lg border-0 bg-gray-5 p-0 text-gray-900 opacity-0 transition-opacity hover:bg-gray-25 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200 group-hover/msg:opacity-100 group-focus-within/msg:opacity-100 touch-any:opacity-100 touch:min-h-10 touch:min-w-10", open && "opacity-100", isMine ? "right-full mr-1" : "left-full ml-1"), children: _jsx(StrokeIcon, { name: "more", size: 18 }) }) }), sheetUsedRef.current && (_jsx(BottomSheet, { open: asSheet, title: t("message_actions"), onClose: () => onOpenChange(false), children: _jsx(Menu, { items: items, selectable: false, onClick: () => onOpenChange(false), className: SHEET_MENU_CLASSNAME }) }))] }));
41
54
  };
42
55
  export default MessageMoreButton;
@@ -1 +1 @@
1
- {"version":3,"file":"QuoteMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/QuoteMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAS3D,UAAU,qBAAqB;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,QAAA,MAAM,gBAAgB,GAAI,mCAGvB,qBAAqB,mDA0EvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"QuoteMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/QuoteMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAK3D,UAAU,qBAAqB;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,QAAA,MAAM,gBAAgB,GAAI,mCAGvB,qBAAqB,mDAoBvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,62 +1,15 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useTranslation } from "react-i18next";
3
- import { useCallback, useMemo } from "react";
4
- import useAuthStore from "../../../store/auth";
5
- import useConversationStore from "../../../store/conversation";
6
3
  import ReplyQuoteContent from "../../../components/message/reply/ReplyQuoteContent";
7
- import { useUserUsername } from "../../../hooks/user/useUserUsername";
8
- import { isSupportSessionAgentView } from "../../../utils/conversation";
4
+ import { useQuotedSenderName } from "../../../hooks/message/useQuotedSenderName";
9
5
  const QuoteMessageItem = ({ message, onPressQuoteMessage, }) => {
10
6
  var _a, _b;
11
- const userID = useAuthStore((state) => state.userID);
12
- const isCrm = useAuthStore((state) => state.isCrm);
13
- const conversationData = useConversationStore((state) => state.conversationData);
14
7
  const { t } = useTranslation();
15
- const isChatSupport = useMemo(() => {
16
- var _a, _b, _c;
17
- try {
18
- return (_c = (_b = (_a = JSON.parse((conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex) || "{}")) === null || _a === void 0 ? void 0 : _a.sessionInfo) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.botId;
19
- }
20
- catch (_d) {
21
- return false;
22
- }
23
- }, [conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex]);
24
8
  const quoteMessage = ((_a = message === null || message === void 0 ? void 0 : message.quoteElem) === null || _a === void 0 ? void 0 : _a.quoteMessage) || ((_b = message === null || message === void 0 ? void 0 : message.atTextElem) === null || _b === void 0 ? void 0 : _b.quoteMessage);
25
- // Outside CRM, an agent identifies quoted senders by username; the session
26
- // owner keeps seeing the thread's own name.
27
- const isAgentView = !isCrm && isSupportSessionAgentView(conversationData, userID);
28
- const quotedUsername = useUserUsername(isAgentView && (quoteMessage === null || quoteMessage === void 0 ? void 0 : quoteMessage.sendID) !== userID
29
- ? quoteMessage === null || quoteMessage === void 0 ? void 0 : quoteMessage.sendID
30
- : undefined);
31
- const getDisplayName = useCallback(({ name, id }) => {
32
- if (isAgentView) {
33
- if (id === userID)
34
- return t("you");
35
- return quotedUsername || name || "";
36
- }
37
- if (!name)
38
- return "";
39
- if (!isCrm && isChatSupport) {
40
- return conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName;
41
- }
42
- if (id === userID)
43
- return t("you");
44
- return name;
45
- }, [
46
- isAgentView,
47
- quotedUsername,
48
- isCrm,
49
- isChatSupport,
50
- conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName,
51
- userID,
52
- t,
53
- ]);
9
+ const { isMe, name } = useQuotedSenderName(quoteMessage);
54
10
  if (!quoteMessage)
55
11
  return null;
56
- const title = getDisplayName({
57
- name: quoteMessage.senderNickname,
58
- id: quoteMessage.sendID,
59
- });
12
+ const title = isMe ? t("you") : name;
60
13
  return (_jsx("div", { className: "flex cursor-pointer items-center overflow-hidden rounded-r-xl bg-white/70", onClick: () => onPressQuoteMessage === null || onPressQuoteMessage === void 0 ? void 0 : onPressQuoteMessage(quoteMessage.clientMsgID || ""), "data-cp-name": "QuoteMessageItem", children: _jsx(ReplyQuoteContent, { message: quoteMessage, title: title }) }));
61
14
  };
62
15
  export default QuoteMessageItem;
@@ -1 +1 @@
1
- {"version":3,"file":"ReplyPreviewBar.d.ts","sourceRoot":"","sources":["../../../../src/components/message/reply/ReplyPreviewBar.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,sDAmD3B,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ReplyPreviewBar.d.ts","sourceRoot":"","sources":["../../../../src/components/message/reply/ReplyPreviewBar.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,sDAuC3B,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,30 +1,21 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useTranslation } from "react-i18next";
3
3
  import { AdaptiveIcon } from "../../../components/icon/AdaptiveIcon";
4
- import useAuthStore from "../../../store/auth";
5
4
  import useConversationStore from "../../../store/conversation";
6
- import { useUserUsername } from "../../../hooks/user/useUserUsername";
7
- import { isSupportSessionAgentView } from "../../../utils/conversation";
5
+ import { useQuotedSenderName } from "../../../hooks/message/useQuotedSenderName";
8
6
  import { ReplyQuoteContent } from "./ReplyQuoteContent";
9
7
  export const ReplyPreviewBar = () => {
10
8
  const { t } = useTranslation();
11
9
  const quotedMessage = useConversationStore((state) => state.quotedMessage);
12
10
  const setQuotedMessage = useConversationStore((state) => state.setQuotedMessage);
13
- const conversationData = useConversationStore((state) => state.conversationData);
14
- const userID = useAuthStore((state) => state.userID);
15
- const isCrm = useAuthStore((state) => state.isCrm);
16
- const isMe = (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.sendID) === userID;
17
- // Matches the sent quote's title, which shows agents outside CRM the username.
18
- const isAgentView = !isCrm && isSupportSessionAgentView(conversationData, userID);
19
- const quotedUsername = useUserUsername(isAgentView && !isMe ? quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.sendID : undefined);
11
+ // Same name the sent quote will carry.
12
+ const { isMe, name } = useQuotedSenderName(quotedMessage);
20
13
  const handleClearQuotedMessage = () => {
21
14
  setQuotedMessage(null);
22
15
  };
23
16
  if (!quotedMessage)
24
17
  return null;
25
- const senderName = isMe
26
- ? t("your_self")
27
- : quotedUsername || quotedMessage.senderNickname || "";
18
+ const senderName = isMe ? t("your_self") : name;
28
19
  return (_jsxs("div", { "data-testid": "reply-preview-bar", "data-cp-name": "ReplyPreviewBar", className: "flex h-[59px] w-full shrink-0 items-center bg-gray-200/10 px-2 py-1", children: [_jsx(ReplyQuoteContent, { message: quotedMessage, title: t("reply_to", { name: senderName }) }), _jsx("button", { type: "button", onClick: handleClearQuotedMessage, "aria-label": t("cancel"), "data-testid": "reply-preview-bar-close", className: "flex h-4 w-4 shrink-0 items-center justify-center", children: _jsx(AdaptiveIcon, { stroke: "x", font: "close-o", size: 16, className: "text-gray-600" }) })] }));
29
20
  };
30
21
  export default ReplyPreviewBar;
@@ -6,7 +6,9 @@ interface RichTextEditorProps {
6
6
  onFilesChange?: (files: UploadFile[]) => void;
7
7
  minHeight?: string;
8
8
  showMediaUpload?: boolean;
9
+ /** CRM: hide the emoji button on phones (the system keyboard has emoji). */
10
+ hideEmojiOnPhone?: boolean;
9
11
  }
10
- export default function RichTextEditor({ initialHtml, placeholder, onChange, onFilesChange, minHeight, showMediaUpload, }: RichTextEditorProps): import("react/jsx-runtime").JSX.Element;
12
+ export default function RichTextEditor({ initialHtml, placeholder, onChange, onFilesChange, minHeight, showMediaUpload, hideEmojiOnPhone, }: RichTextEditorProps): import("react/jsx-runtime").JSX.Element;
11
13
  export {};
12
14
  //# sourceMappingURL=RichTextEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditor.d.ts","sourceRoot":"","sources":["../../../src/components/rich-text-editor/RichTextEditor.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA0ClC,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,WAAW,EACX,WAAW,EACX,QAAQ,EACR,aAAa,EACb,SAAmB,EACnB,eAAsB,GACvB,EAAE,mBAAmB,2CA6DrB"}
1
+ {"version":3,"file":"RichTextEditor.d.ts","sourceRoot":"","sources":["../../../src/components/rich-text-editor/RichTextEditor.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA2ClC,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,WAAW,EACX,WAAW,EACX,QAAQ,EACR,aAAa,EACb,SAAmB,EACnB,eAAsB,EACtB,gBAAwB,GACzB,EAAE,mBAAmB,2CAkErB"}
@@ -13,6 +13,7 @@ import { $getRoot } from "lexical";
13
13
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
14
14
  import { useEffect } from "react";
15
15
  import { ToolbarPlugin } from "../../components/message/footer/ToolbarPlugin";
16
+ import clsx from "clsx";
16
17
  import MediaActions from "../../components/message/footer/MediaActions";
17
18
  import { FilePreviewList } from "../../components/message/footer/FilePreview";
18
19
  import { editorTheme, editorNodes, editorOnError, } from "../../components/message/footer/editorConfig";
@@ -38,7 +39,7 @@ function HtmlPlugin({ initialHtml }) {
38
39
  }, [editor, initialHtml]);
39
40
  return null;
40
41
  }
41
- export default function RichTextEditor({ initialHtml, placeholder, onChange, onFilesChange, minHeight = "160px", showMediaUpload = true, }) {
42
+ export default function RichTextEditor({ initialHtml, placeholder, onChange, onFilesChange, minHeight = "160px", showMediaUpload = true, hideEmojiOnPhone = false, }) {
42
43
  const [listUploadFiles, setListUploadFiles] = useState([]);
43
44
  const handleChange = (editorState, editor, tags) => {
44
45
  if (tags.has("initial-html"))
@@ -58,5 +59,6 @@ export default function RichTextEditor({ initialHtml, placeholder, onChange, onF
58
59
  setListUploadFiles(files);
59
60
  onFilesChange === null || onFilesChange === void 0 ? void 0 : onFilesChange(files);
60
61
  };
61
- return (_jsxs(LexicalComposer, { initialConfig: EDITOR_CONFIG, children: [_jsxs("div", { className: "border border-gray-200 rounded-lg", children: [_jsx(FilePreviewList, { files: listUploadFiles, onRemove: handleRemoveFile }), _jsx("div", { className: "relative", children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: "px-3 py-2 text-sm outline-none", style: { minHeight } }), ErrorBoundary: LexicalErrorBoundary, placeholder: placeholder ? (_jsx("div", { className: "absolute top-2 left-3 pointer-events-none", children: _jsx("p", { className: "text-gray-400 text-sm", children: placeholder }) })) : null }) }), _jsxs("div", { className: "flex items-center border-t border-gray-100 px-2 py-1", children: [_jsx(ToolbarPlugin, {}), _jsx(MediaActions, { listUploadFiles: listUploadFiles, onFilesChange: handleFilesChange, showMediaUpload: showMediaUpload })] })] }), _jsx(LinkPlugin, {}), _jsx(ListPlugin, {}), _jsx(OnChangePlugin, { onChange: handleChange, ignoreSelectionChange: true }), _jsx(HtmlPlugin, { initialHtml: initialHtml })] }));
62
+ return (_jsxs(LexicalComposer, { initialConfig: EDITOR_CONFIG, children: [_jsxs("div", { className: "border border-gray-200 rounded-lg", children: [_jsx(FilePreviewList, { files: listUploadFiles, onRemove: handleRemoveFile }), _jsx("div", { className: "relative", children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: "px-3 py-2 text-sm outline-none", style: { minHeight } }), ErrorBoundary: LexicalErrorBoundary, placeholder: placeholder ? (_jsx("div", { className: "absolute top-2 left-3 pointer-events-none", children: _jsx("p", { className: "text-gray-400 text-sm", children: placeholder }) })) : null }) }), _jsxs("div", { className: clsx("flex items-center border-t border-gray-100 px-2 py-1", hideEmojiOnPhone &&
63
+ "flex-wrap max-sm:[&_[data-cp-name=ToolbarPlugin]]:!gap-1 max-sm:[&_[data-cp-name=ToolbarPlugin]]:!px-1"), children: [_jsx(ToolbarPlugin, {}), _jsx(MediaActions, { listUploadFiles: listUploadFiles, onFilesChange: handleFilesChange, showMediaUpload: showMediaUpload, hideEmojiOnPhone: hideEmojiOnPhone })] })] }), _jsx(LinkPlugin, {}), _jsx(ListPlugin, {}), _jsx(OnChangePlugin, { onChange: handleChange, ignoreSelectionChange: true }), _jsx(HtmlPlugin, { initialHtml: initialHtml })] }));
62
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SearchItemAsGroup.d.ts","sourceRoot":"","sources":["../../../../src/components/search-conversation/item/SearchItemAsGroup.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAUxF,UAAU,sBAAsB;IAC9B,KAAK,EAAE,4BAA4B,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,4CA4FvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"SearchItemAsGroup.d.ts","sourceRoot":"","sources":["../../../../src/components/search-conversation/item/SearchItemAsGroup.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAUxF,UAAU,sBAAsB;IAC9B,KAAK,EAAE,4BAA4B,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,4CA8FvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -7,9 +7,9 @@ import { AdaptiveIcon } from "../../../components/icon/AdaptiveIcon";
7
7
  import { useTranslation } from "react-i18next";
8
8
  import { GroupVisibility } from "@droppii-org/wasm-client-sdk";
9
9
  import useConversationStore from "../../../store/conversation";
10
- import { useChatNavigate } from "../../../hooks/conversation/useChatNavigate";
10
+ import { useDeskThreadNavigation } from "../../../hooks/conversation/useDeskThreadNavigation";
11
11
  import { highlightSearch, sanitizeHtml } from "../../../utils/common";
12
- import GroupCompositeAvatar from "../../../components/group/GroupCompositeAvatar";
12
+ import GroupAvatar from "../../../components/group/GroupAvatar";
13
13
  import RowChip from "../../../components/conversation/RowChip";
14
14
  import { StrokeIcon } from "../../../components/icon/StrokeIcon";
15
15
  import { useOpenPdpSearchResult } from "../../../hooks/search/useOpenPdpSearchResult";
@@ -18,7 +18,7 @@ const SearchItemAsGroup = (props) => {
18
18
  const { group, searchTerm = "" } = props;
19
19
  const { t } = useTranslation();
20
20
  const isCrm = useAuthStore((state) => state.isCrm);
21
- const onNavigate = useChatNavigate();
21
+ const { openThread } = useDeskThreadNavigation();
22
22
  const scope = useSearchScope();
23
23
  const openPdpResult = useOpenPdpSearchResult();
24
24
  const setConversationData = useConversationStore((state) => state.setConversationData);
@@ -39,9 +39,9 @@ const SearchItemAsGroup = (props) => {
39
39
  newSearchParams.delete("userId");
40
40
  newSearchParams.delete("groupId");
41
41
  newSearchParams.delete("botId");
42
- onNavigate(`${window.location.pathname}?${newSearchParams.toString()}`);
42
+ openThread({ threadId: conversation.conversationID }, `${window.location.pathname}?${newSearchParams.toString()}`);
43
43
  };
44
- return (_jsxs("div", Object.assign({ className: searchRowClass(isCrm) }, clickableProps(onPressItem), { "data-cp-name": "SearchItemAsGroup", children: [_jsx(GroupCompositeAvatar, { groupID: group.groupId, faceURL: conversation.faceURL, groupName: conversation.showName, size: isCrm ? 40 : 48 }), _jsxs("div", { className: "flex flex-col flex-1 min-w-0 gap-0.5", children: [_jsx("p", { className: isCrm
44
+ return (_jsxs("div", Object.assign({ className: searchRowClass(isCrm) }, clickableProps(onPressItem), { "data-cp-name": "SearchItemAsGroup", children: [_jsx(GroupAvatar, { faceURL: conversation.faceURL, groupName: conversation.showName, size: isCrm ? 40 : 48 }), _jsxs("div", { className: "flex flex-col flex-1 min-w-0 gap-0.5", children: [_jsx("p", { className: isCrm
45
45
  ? "m-0 truncate text-sm font-medium text-gray-900"
46
46
  : "text-sm font-semibold truncate", dangerouslySetInnerHTML: {
47
47
  __html: sanitizeHtml(highlightSearch(conversation.showName || "", searchTerm)),
@@ -1 +1 @@
1
- {"version":3,"file":"SearchItemAsMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/search-conversation/item/SearchItemAsMessage.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAA4B,MAAM,8BAA8B,CAAC;AA0BrF,UAAU,wBAAwB;IAChC,OAAO,EAAE,WAAW,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,QAAA,MAAM,mBAAmB,GAAI,OAAO,wBAAwB,4CAsJ3D,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"SearchItemAsMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/search-conversation/item/SearchItemAsMessage.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAA4B,MAAM,8BAA8B,CAAC;AA6BrF,UAAU,wBAAwB;IAChC,OAAO,EAAE,WAAW,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,QAAA,MAAM,mBAAmB,GAAI,OAAO,wBAAwB,4CAqK3D,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -12,10 +12,13 @@ import { useTranslation } from "react-i18next";
12
12
  import useConversationStore from "../../../store/conversation";
13
13
  import { useMemo } from "react";
14
14
  import TintedAvatar from "../../../components/common/TintedAvatar";
15
+ import GroupAvatar from "../../../components/group/GroupAvatar";
16
+ import { isGroupConversation } from "../../../utils/imCommon";
15
17
  import RowChip from "../../../components/conversation/RowChip";
16
18
  import useAuthStore from "../../../store/auth";
17
19
  import { getConversationIdFromMessage } from "../../../utils/conversation";
18
20
  import { useOpenPdpSearchResult } from "../../../hooks/search/useOpenPdpSearchResult";
21
+ import { useDeskThreadNavigation } from "../../../hooks/conversation/useDeskThreadNavigation";
19
22
  import { useSearchScope } from "../SearchScopeContext";
20
23
  // PDP labels the source by its inbox tab; BE's displayTag carries the CS team name.
21
24
  const PDP_TAG_LABEL_KEYS = {
@@ -31,6 +34,7 @@ const SearchItemAsMessage = (props) => {
31
34
  const scope = useSearchScope();
32
35
  const isPdpPortal = scope === "pdp-portal";
33
36
  const openPdpResult = useOpenPdpSearchResult();
37
+ const { openFromList } = useDeskThreadNavigation();
34
38
  const conversationData = useConversationStore((state) => state.conversationData);
35
39
  const useConversationDisplay = useMemo(() => {
36
40
  // PDP results span many threads, so show the sender like CRM does.
@@ -66,9 +70,17 @@ const SearchItemAsMessage = (props) => {
66
70
  .setConversationData(data, message.clientMsgID, {
67
71
  forceRevalidate: true,
68
72
  });
73
+ const previousId = useConversationStore.getState().selectedConversationId;
69
74
  useConversationStore
70
75
  .getState()
71
76
  .setSelectedConversationId(data.conversationID);
77
+ // CRM hits get a URL (and history entry) like list rows; hits inside the open thread don't.
78
+ if (isCrm && data.conversationID !== previousId) {
79
+ openFromList({
80
+ threadId: data.conversationID,
81
+ messageId: message.clientMsgID,
82
+ });
83
+ }
72
84
  onClick === null || onClick === void 0 ? void 0 : onClick();
73
85
  };
74
86
  let msgContent = "";
@@ -84,7 +96,7 @@ const SearchItemAsMessage = (props) => {
84
96
  msgContent = message === null || message === void 0 ? void 0 : message.content;
85
97
  }
86
98
  }
87
- return (_jsxs("div", Object.assign({ className: searchRowClass(isCrm) }, clickableProps(onPressItem), { "data-cp-name": "SearchItemAsMessage", children: [_jsx("div", { children: isCrm ? (_jsx(TintedAvatar, { name: (_b = (useConversationDisplay
99
+ return (_jsxs("div", Object.assign({ className: searchRowClass(isCrm) }, clickableProps(onPressItem), { "data-cp-name": "SearchItemAsMessage", children: [_jsx("div", { children: !useConversationDisplay && isGroupConversation(conversationData !== null && conversationData !== void 0 ? conversationData : undefined) ? (_jsx(GroupAvatar, { faceURL: conversationData === null || conversationData === void 0 ? void 0 : conversationData.faceURL, groupName: conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName, size: 40 })) : isCrm ? (_jsx(TintedAvatar, { name: (_b = (useConversationDisplay
88
100
  ? message.senderNickname
89
101
  : conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName)) !== null && _b !== void 0 ? _b : "", src: useConversationDisplay
90
102
  ? message.senderFaceUrl
@@ -1 +1 @@
1
- {"version":3,"file":"SearchItemAsUser.d.ts","sourceRoot":"","sources":["../../../../src/components/search-conversation/item/SearchItemAsUser.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAclF,UAAU,qBAAqB;IAE7B,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CAsFrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"SearchItemAsUser.d.ts","sourceRoot":"","sources":["../../../../src/components/search-conversation/item/SearchItemAsUser.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAelF,UAAU,qBAAqB;IAE7B,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CA2FrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -7,6 +7,7 @@ import { highlightSearch, sanitizeHtml } from "../../../utils/common";
7
7
  import useConversationStore from "../../../store/conversation";
8
8
  import { useTranslation } from "react-i18next";
9
9
  import { useOpenPdpSearchResult } from "../../../hooks/search/useOpenPdpSearchResult";
10
+ import { useDeskThreadNavigation } from "../../../hooks/conversation/useDeskThreadNavigation";
10
11
  import { useSearchScope } from "../SearchScopeContext";
11
12
  import useAuthStore from "../../../store/auth";
12
13
  import { SessionStatus } from "../../../types/chat";
@@ -23,6 +24,7 @@ const SearchItemAsUser = (props) => {
23
24
  const { t } = useTranslation();
24
25
  const scope = useSearchScope();
25
26
  const openPdpResult = useOpenPdpSearchResult();
27
+ const { openFromList } = useDeskThreadNavigation();
26
28
  const isCrm = useAuthStore((state) => state.isCrm);
27
29
  const ownerName = `${(_a = session.owner) === null || _a === void 0 ? void 0 : _a.fullName}${((_b = session.owner) === null || _b === void 0 ? void 0 : _b.username) ? ` (${(_c = session.owner) === null || _c === void 0 ? void 0 : _c.username})` : ""}`;
28
30
  const onPressItem = async () => {
@@ -32,10 +34,14 @@ const SearchItemAsUser = (props) => {
32
34
  if (!(session === null || session === void 0 ? void 0 : session.conversation)) {
33
35
  return message.error(t("err_get_conversation"));
34
36
  }
37
+ const previousId = useConversationStore.getState().selectedConversationId;
35
38
  useConversationStore.getState().setConversationData(session.conversation);
36
39
  useConversationStore
37
40
  .getState()
38
41
  .setSelectedConversationId(session.conversationId);
42
+ if (isCrm && session.conversationId !== previousId) {
43
+ openFromList({ threadId: session.conversationId });
44
+ }
39
45
  };
40
46
  return (_jsxs("div", Object.assign({ className: searchRowClass(isCrm) }, clickableProps(onPressItem), { "data-cp-name": "SearchItemAsUser", children: [isCrm ? (_jsx(TintedAvatar, { name: ((_d = session.owner) === null || _d === void 0 ? void 0 : _d.fullName) || ((_e = session.owner) === null || _e === void 0 ? void 0 : _e.username) || "", src: (_f = session.owner) === null || _f === void 0 ? void 0 : _f.avatar, size: 40 })) : (_jsx(Avatar, { size: "large", src: (_g = session.owner) === null || _g === void 0 ? void 0 : _g.avatar, alt: (_h = session.owner) === null || _h === void 0 ? void 0 : _h.username, children: (_k = (_j = session.owner) === null || _j === void 0 ? void 0 : _j.fullName) === null || _k === void 0 ? void 0 : _k.charAt(0).toUpperCase() })), _jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [_jsx("p", { className: isCrm
41
47
  ? "m-0 truncate text-sm font-medium text-gray-900"
@@ -54,9 +54,9 @@ const DeskAssignedSession = ({ variant = "inline" }) => {
54
54
  };
55
55
  }, [refetch]);
56
56
  if (collapsed) {
57
- return (_jsx("div", { className: "flex flex-col items-center shrink-0 pt-3 rounded-xl bg-white shadow-sm", style: { width: LAYOUT_WIDTHS.folderCollapsed }, "data-cp-name": "DeskAssignedSession", children: _jsx(Tooltip, { title: t("folder_panel_expand"), placement: "right", children: _jsx(Button, { type: "text", className: "text-gray-600 w-8 h-8 p-0", "aria-label": t("folder_panel_expand"), onClick: () => setFolderCollapsedChoice(false), children: _jsx(StrokeIcon, { name: "chevrons-right", size: 20 }) }) }) }));
57
+ return (_jsx("div", { className: "flex flex-col items-center shrink-0 pt-3 rounded-xl bg-white shadow-sm", style: { width: LAYOUT_WIDTHS.folderCollapsed }, "data-cp-name": "DeskAssignedSession", children: _jsx(Tooltip, { title: t("folder_panel_expand"), placement: "right", children: _jsx(Button, { type: "text", className: "text-gray-600 w-8 h-8 p-0 touch:min-h-10 touch:min-w-10", "aria-label": t("folder_panel_expand"), onClick: () => setFolderCollapsedChoice(false), children: _jsx(StrokeIcon, { name: "chevrons-right", size: 20 }) }) }) }));
58
58
  }
59
- return (_jsxs("aside", { "aria-label": t("folder_panel_title"), className: `flex flex-col h-full shrink-0 overflow-hidden rounded-xl bg-white ${isOverlay ? "shadow-lg" : "shadow-sm"}`, style: { width: LAYOUT_WIDTHS.folder }, "data-cp-name": "DeskAssignedSession", children: [_jsxs("div", { className: "flex items-center justify-between h-14 pl-4 pr-2 border-b border-gray-25 shrink-0", children: [_jsx("span", { className: "text-base font-bold flex-1 truncate", children: t("desk_brand") }), _jsx(Tooltip, { title: t(isOverlay ? "folder_panel_close" : "folder_panel_collapse"), children: _jsx(Button, { type: "text", className: "text-gray-600 w-8 h-8 p-0", "aria-label": t(isOverlay ? "folder_panel_close" : "folder_panel_collapse"), onClick: () => isOverlay ? setFolderOverlayOpen(false) : setFolderCollapsedChoice(true), children: _jsx(StrokeIcon, { name: isOverlay ? "x" : "chevrons-left", size: 18 }) }) })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto px-2 pb-2 pt-1", children: [_jsx("div", { className: "px-2 pb-1 pt-3 text-xs font-medium text-gray-600", children: t("my_messages") }), sessionSummary && (_jsx(SessionFolderList, { summary: sessionSummary, activeFolderId: activeFolderId, onFilterSelect: onFilterSelect, allGroups: {
59
+ return (_jsxs("aside", { "aria-label": t("folder_panel_title"), className: `flex flex-col h-full shrink-0 overflow-hidden rounded-xl bg-white ${isOverlay ? "shadow-lg" : "shadow-sm"}`, style: { width: LAYOUT_WIDTHS.folder }, "data-cp-name": "DeskAssignedSession", children: [_jsxs("div", { className: "flex items-center justify-between h-14 pl-4 pr-2 border-b border-gray-25 shrink-0", children: [_jsx("span", { className: "text-base font-bold flex-1 truncate", children: t("desk_brand") }), _jsx(Tooltip, { title: t(isOverlay ? "folder_panel_close" : "folder_panel_collapse"), children: _jsx(Button, { type: "text", className: "text-gray-600 w-8 h-8 p-0 touch:min-h-10 touch:min-w-10", "aria-label": t(isOverlay ? "folder_panel_close" : "folder_panel_collapse"), onClick: () => isOverlay ? setFolderOverlayOpen(false) : setFolderCollapsedChoice(true), children: _jsx(StrokeIcon, { name: isOverlay ? "x" : "chevrons-left", size: 18 }) }) })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto px-2 pb-2 pt-1", children: [_jsx("div", { className: "px-2 pb-1 pt-3 text-xs font-medium text-gray-600", children: t("my_messages") }), sessionSummary && (_jsx(SessionFolderList, { summary: sessionSummary, activeFolderId: activeFolderId, onFilterSelect: onFilterSelect, allGroups: {
60
60
  active: viewMode === "allGroups",
61
61
  onSelect: onAllGroupsSelect,
62
62
  } })), _jsx(DeskTeamInbox, {})] })] }));
@@ -10,7 +10,7 @@ export const FolderCount = ({ count, highlighted, }) => {
10
10
  return highlighted ? (_jsx("span", { className: "inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full bg-danger-600 px-1.5 text-xs font-semibold tabular-nums text-white", children: formatCount(count) })) : (_jsx("span", { className: "shrink-0 text-xs tabular-nums text-gray-600", children: formatCount(count) }));
11
11
  };
12
12
  /** One selectable folder in the desk sidebar. */
13
- const FolderRow = ({ label, iconName, iconClassName, count = 0, highlighted, active = false, indentClassName = "pl-2", onClick, }) => (_jsxs("button", { type: "button", onClick: onClick, "aria-current": active ? "true" : undefined, "data-cp-name": "FolderRow", className: clsx("flex h-9 min-w-0 flex-1 items-center gap-2 rounded-lg pr-2 text-left text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400", indentClassName, active
13
+ const FolderRow = ({ label, iconName, iconClassName, count = 0, highlighted, active = false, indentClassName = "pl-2", onClick, }) => (_jsxs("button", { type: "button", onClick: onClick, "aria-current": active ? "true" : undefined, "data-cp-name": "FolderRow", className: clsx("flex h-9 touch:min-h-10 min-w-0 flex-1 items-center gap-2 rounded-lg pr-2 text-left text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400", indentClassName, active
14
14
  ? "bg-primary-25 font-semibold text-primary-500"
15
15
  : "text-gray-900 hover:bg-gray-5"), children: [_jsx(StrokeIcon, { name: iconName, size: 18, className: iconClassName }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), _jsx(FolderCount, { count: count, highlighted: highlighted })] }));
16
16
  export default FolderRow;
@@ -2,10 +2,8 @@ import type { ChangeEvent } from "react";
2
2
  export type GroupInfoRow = "member-permission" | "admin-permission" | "invite-link";
3
3
  export type GroupInfoConfirm = "leave" | "disband" | "delete";
4
4
  export interface GroupInfoBodyCrmProps {
5
- groupID: string;
6
5
  groupName?: string;
7
6
  faceURL?: string;
8
- ownerUserID?: string;
9
7
  introduction?: string;
10
8
  memberCount?: number;
11
9
  isPublic: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupInfoBodyCrm.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupInfoBodyCrm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAUzC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AACpF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACrD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACtD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC/D,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/C;AA6BD,kGAAkG;AAClG,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CA8JrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"GroupInfoBodyCrm.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupInfoBodyCrm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAUzC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AACpF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACrD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACtD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC/D,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/C;AA6BD,kGAAkG;AAClG,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CA4JrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -4,7 +4,7 @@ import { useEffect, useRef } from "react";
4
4
  import { Input } from "antd";
5
5
  import { useTranslation } from "react-i18next";
6
6
  import { CrmIcon as Icon } from "../../components/group/crmIcon";
7
- import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
7
+ import GroupAvatar from "../../components/group/GroupAvatar";
8
8
  import { ACCEPTED_IMAGE_TYPES } from "../../utils/fileValidation";
9
9
  import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
10
10
  import { DangerRow, InfoCard, NavRow, SectionLabel, SwitchRow } from "./GroupInfoRows";
@@ -29,7 +29,7 @@ const GroupInfoBodyCrm = (props) => {
29
29
  const nameChanged = props.nameValue.trim() !== "" && props.nameValue.trim() !== ((_a = props.groupName) !== null && _a !== void 0 ? _a : "");
30
30
  const descChanged = props.descriptionValue.trim() !== ((_b = props.introduction) !== null && _b !== void 0 ? _b : "");
31
31
  const hasAdminRows = props.canConfigPermissions || props.showInviteLink;
32
- return (_jsxs("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "relative block h-[60px] w-[60px] shrink-0", children: [_jsx(GroupCompositeAvatar, { groupID: props.groupID, faceURL: props.faceURL, ownerUserID: props.ownerUserID, groupName: props.groupName, size: 56 }), props.isAvatarUploading && (_jsx("span", { className: "absolute left-0 top-0 flex h-14 w-14 items-center justify-center rounded-full bg-gray-900/30", children: _jsx("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }) })), props.canEditAvatar && (_jsxs(_Fragment, { children: [_jsx("input", { ref: props.avatarInputRef, type: "file", accept: ACCEPTED_IMAGE_TYPES.join(", "), className: "hidden", onChange: props.onAvatarSelect }), _jsx("button", { type: "button", disabled: props.isAvatarUploading, onClick: props.onAvatarClick, "aria-label": t("group_info_edit_avatar"), title: t("group_info_edit_avatar"), className: `absolute bottom-0 right-0 flex h-6 w-6 items-center justify-center rounded-full border-2 border-white bg-gray-900 text-white ${FOCUS_RING_CLASS}`, children: _jsx(Icon, { icon: "camera-o", size: 12 }) })] }))] }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [editingField === "name" ? (_jsx(Input, { autoFocus: true, value: props.nameValue, onChange: (event) => props.onNameChange(event.target.value), maxLength: 255, disabled: props.isSaving, "aria-label": t("group_info_edit_name"), onPressEnter: () => nameChanged && props.onSaveEdit("name") })) : (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx("span", { className: "truncate text-base font-semibold text-gray-900", title: props.groupName, children: props.groupName }), props.canEditName && (_jsx("button", { type: "button", className: `h-7 w-7 ${ICON_BUTTON}`, onClick: () => props.onStartEdit("name"), "aria-label": t("group_info_edit_name"), title: t("group_info_edit_name"), children: _jsx(Icon, { icon: "edit-o", size: 16 }) }))] })), _jsxs("span", { className: "flex flex-wrap gap-1.5", children: [_jsx(Chip, { icon: props.isPublic ? "globe-o" : "lock-o", tone: "primary", children: t(props.isPublic ? "group_visibility_public" : "group_visibility_private") }), typeof props.memberCount === "number" && (_jsx(Chip, { icon: "user-two-o", tone: "neutral", children: t("member_count", { count: props.memberCount }) }))] })] })] }), editingField === "name" && (_jsx(EditActions, { disabled: props.isSaving, canSave: !props.isSaving && nameChanged, onCancel: () => props.onCancelEdit("name"), onSave: () => props.onSaveEdit("name") })), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-xs font-medium text-gray-600", children: t("description") }), editingField === "description" ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Input.TextArea, { ref: descriptionRef, value: props.descriptionValue, onChange: (event) => props.onDescriptionChange(event.target.value), placeholder: t("enter_group_description"), "aria-label": t("description"), autoSize: { minRows: 2, maxRows: 5 }, maxLength: 500, showCount: true, disabled: props.isSaving }), _jsx(EditActions, { disabled: props.isSaving, canSave: !props.isSaving && descChanged, onCancel: () => props.onCancelEdit("description"), onSave: () => props.onSaveEdit("description") })] })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "m-0 whitespace-pre-wrap break-words text-sm text-gray-600", children: hasDescription ? props.introduction : t("group_info_no_description") }), props.canEditDescription && (_jsxs("button", { type: "button", onClick: () => props.onStartEdit("description"), className: `flex h-6 items-center gap-1.5 self-start rounded-lg text-[13px] font-medium text-primary-500 hover:text-primary-600 ${FOCUS_RING_CLASS}`, children: [_jsx(Icon, { icon: hasDescription ? "edit-o" : "plus-o", size: 14 }), t(hasDescription ? "group_info_edit_description" : "group_info_add_description")] }))] }))] }), _jsx(SectionLabel, { children: t("group_settings_section") }), _jsx(InfoCard, { children: [
32
+ return (_jsxs("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "relative block h-[60px] w-[60px] shrink-0", children: [_jsx(GroupAvatar, { faceURL: props.faceURL, groupName: props.groupName, size: 56 }), props.isAvatarUploading && (_jsx("span", { className: "absolute left-0 top-0 flex h-14 w-14 items-center justify-center rounded-full bg-gray-900/30", children: _jsx("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }) })), props.canEditAvatar && (_jsxs(_Fragment, { children: [_jsx("input", { ref: props.avatarInputRef, type: "file", accept: ACCEPTED_IMAGE_TYPES.join(", "), className: "hidden", onChange: props.onAvatarSelect }), _jsx("button", { type: "button", disabled: props.isAvatarUploading, onClick: props.onAvatarClick, "aria-label": t("group_info_edit_avatar"), title: t("group_info_edit_avatar"), className: `absolute bottom-0 right-0 flex h-6 w-6 items-center justify-center rounded-full border-2 border-white bg-gray-900 text-white ${FOCUS_RING_CLASS}`, children: _jsx(Icon, { icon: "camera-o", size: 12 }) })] }))] }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [editingField === "name" ? (_jsx(Input, { autoFocus: true, value: props.nameValue, onChange: (event) => props.onNameChange(event.target.value), maxLength: 255, disabled: props.isSaving, "aria-label": t("group_info_edit_name"), onPressEnter: () => nameChanged && props.onSaveEdit("name") })) : (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx("span", { className: "truncate text-base font-semibold text-gray-900", title: props.groupName, children: props.groupName }), props.canEditName && (_jsx("button", { type: "button", className: `h-7 w-7 ${ICON_BUTTON}`, onClick: () => props.onStartEdit("name"), "aria-label": t("group_info_edit_name"), title: t("group_info_edit_name"), children: _jsx(Icon, { icon: "edit-o", size: 16 }) }))] })), _jsxs("span", { className: "flex flex-wrap gap-1.5", children: [_jsx(Chip, { icon: props.isPublic ? "globe-o" : "lock-o", tone: "primary", children: t(props.isPublic ? "group_visibility_public" : "group_visibility_private") }), typeof props.memberCount === "number" && (_jsx(Chip, { icon: "user-two-o", tone: "neutral", children: t("member_count", { count: props.memberCount }) }))] })] })] }), editingField === "name" && (_jsx(EditActions, { disabled: props.isSaving, canSave: !props.isSaving && nameChanged, onCancel: () => props.onCancelEdit("name"), onSave: () => props.onSaveEdit("name") })), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-xs font-medium text-gray-600", children: t("description") }), editingField === "description" ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Input.TextArea, { ref: descriptionRef, value: props.descriptionValue, onChange: (event) => props.onDescriptionChange(event.target.value), placeholder: t("enter_group_description"), "aria-label": t("description"), autoSize: { minRows: 2, maxRows: 5 }, maxLength: 500, showCount: true, disabled: props.isSaving }), _jsx(EditActions, { disabled: props.isSaving, canSave: !props.isSaving && descChanged, onCancel: () => props.onCancelEdit("description"), onSave: () => props.onSaveEdit("description") })] })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "m-0 whitespace-pre-wrap break-words text-sm text-gray-600", children: hasDescription ? props.introduction : t("group_info_no_description") }), props.canEditDescription && (_jsxs("button", { type: "button", onClick: () => props.onStartEdit("description"), className: `flex h-6 items-center gap-1.5 self-start rounded-lg text-[13px] font-medium text-primary-500 hover:text-primary-600 ${FOCUS_RING_CLASS}`, children: [_jsx(Icon, { icon: hasDescription ? "edit-o" : "plus-o", size: 14 }), t(hasDescription ? "group_info_edit_description" : "group_info_add_description")] }))] }))] }), _jsx(SectionLabel, { children: t("group_settings_section") }), _jsx(InfoCard, { children: [
33
33
  _jsx(SwitchRow, { icon: "bell-o", label: t("notification"), checked: props.notifyEnabled, loading: props.isTogglingNotification, onChange: props.onToggleNotification }, "notify"),
34
34
  props.showAllowSend && (_jsx(SwitchRow, { icon: "chat-square-o", label: t("members_can_send_message"), hint: t("allow_send_message_hint"), checked: props.allowSendMessage, loading: props.isTogglingSendMessage, onChange: props.onToggleSendMessage }, "send")),
35
35
  ] }), hasAdminRows && (_jsxs(_Fragment, { children: [_jsx(SectionLabel, { children: t("group_admin_section") }), _jsx(InfoCard, { children: [
@@ -1 +1 @@
1
- {"version":3,"file":"GroupThreadInfo.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupThreadInfo.tsx"],"names":[],"mappings":"AA0BA,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AASD,QAAA,MAAM,eAAe,GAAI,qBAAqB,oBAAoB,mDAqrBjE,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"GroupThreadInfo.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupThreadInfo.tsx"],"names":[],"mappings":"AA0BA,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AASD,QAAA,MAAM,eAAe,GAAI,qBAAqB,oBAAoB,mDAirBjE,CAAC;AAEF,eAAe,eAAe,CAAC"}