@zenify-omni/chat-ui-react-js 0.1.0

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 (403) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +92 -0
  3. package/assets/asset-url.js +6 -0
  4. package/assets/icons/chatter_agent.js +27 -0
  5. package/assets/icons/chatter_chatbot.js +43 -0
  6. package/assets/icons/chatter_contact.js +36 -0
  7. package/assets/icons/email_icon.png +0 -0
  8. package/assets/icons/emoji/angry.svg +56 -0
  9. package/assets/icons/emoji/haha.svg +20 -0
  10. package/assets/icons/emoji/like.svg +10 -0
  11. package/assets/icons/emoji/like_out_line.png +0 -0
  12. package/assets/icons/emoji/love.svg +10 -0
  13. package/assets/icons/emoji/sad.svg +46 -0
  14. package/assets/icons/emoji/wow.svg +51 -0
  15. package/assets/icons/instagram.js +29 -0
  16. package/assets/icons/not_found.png +0 -0
  17. package/assets/icons/not_found_template.svg +9 -0
  18. package/assets/icons/phone_icon.png +0 -0
  19. package/assets/icons/shopee.js +17 -0
  20. package/assets/icons/sms_icon.png +0 -0
  21. package/assets/icons/tiktok.js +17 -0
  22. package/assets/icons/whatsapp.js +28 -0
  23. package/assets/icons/zalo.js +17 -0
  24. package/assets/icons/zalo_icon.png +0 -0
  25. package/assets/icons/zns_icon.png +0 -0
  26. package/assets/images/emoji.webp +0 -0
  27. package/assets/images/error.png +0 -0
  28. package/assets/images/menu.png +0 -0
  29. package/assets/images/money.png +0 -0
  30. package/assets/images/success.png +0 -0
  31. package/assets/public-urls.js +78 -0
  32. package/components/campaign-detail-route/select/group.js +38 -0
  33. package/components/campaign-detail-route/select/multi-groups.js +43 -0
  34. package/components/chat-route/chat-box/ads-context-card.js +143 -0
  35. package/components/chat-route/chat-box/chat-drop-file.js +18 -0
  36. package/components/chat-route/chat-box/chat-feedback/chat-insight.js +214 -0
  37. package/components/chat-route/chat-box/chat-feedback/index.js +127 -0
  38. package/components/chat-route/chat-box/chat-header-actions-inline.js +1055 -0
  39. package/components/chat-route/chat-box/chat-header.js +465 -0
  40. package/components/chat-route/chat-box/chat-input.js +1164 -0
  41. package/components/chat-route/chat-box/chat-message-action.js +399 -0
  42. package/components/chat-route/chat-box/chat-message-list.js +995 -0
  43. package/components/chat-route/chat-box/chat-message.js +2099 -0
  44. package/components/chat-route/chat-box/chat-reply-preview.js +317 -0
  45. package/components/chat-route/chat-box/common-groups-modal.js +430 -0
  46. package/components/chat-route/chat-box/constants.js +29 -0
  47. package/components/chat-route/chat-box/contact-card/index.js +87 -0
  48. package/components/chat-route/chat-box/edit-customer-alias-dialog.js +197 -0
  49. package/components/chat-route/chat-box/emoji-picker-combined.js +91 -0
  50. package/components/chat-route/chat-box/emoji-sprite.js +45 -0
  51. package/components/chat-route/chat-box/emojiMap.js +92 -0
  52. package/components/chat-route/chat-box/facebook-reconnect-notice.js +49 -0
  53. package/components/chat-route/chat-box/forward-message-modal.js +659 -0
  54. package/components/chat-route/chat-box/index.js +165 -0
  55. package/components/chat-route/chat-box/message-time.js +44 -0
  56. package/components/chat-route/chat-box/message-viewers.js +114 -0
  57. package/components/chat-route/chat-box/pasted-file-preview.js +138 -0
  58. package/components/chat-route/chat-box/pinned-messages.js +255 -0
  59. package/components/chat-route/chat-box/react-message/react-preview.js +83 -0
  60. package/components/chat-route/chat-box/react-message/reaction-button.js +200 -0
  61. package/components/chat-route/chat-box/right-side/chat-history.js +142 -0
  62. package/components/chat-route/chat-box/right-side/chat-tag-selector.js +232 -0
  63. package/components/chat-route/chat-box/right-side/create-personal-tag-modal.js +458 -0
  64. package/components/chat-route/chat-box/right-side/customer/customer-info-item.js +60 -0
  65. package/components/chat-route/chat-box/right-side/in-room-dialog.js +225 -0
  66. package/components/chat-route/chat-box/right-side/zalo-group/add-friend-dialog.js +154 -0
  67. package/components/chat-route/chat-box/right-side/zalo-group/send-message-dialog.js +165 -0
  68. package/components/chat-route/chat-box/send-contact-card-modal.js +102 -0
  69. package/components/chat-route/chat-box/send-contact-card.js +80 -0
  70. package/components/chat-route/chat-box/text-content.js +400 -0
  71. package/components/chat-route/chat-box/use-facebook-page-invalid.js +22 -0
  72. package/components/chat-route/chat-box/zalo-emoji-decoration.js +98 -0
  73. package/components/chat-route/chat-box/zalo-emoji-picker.js +74 -0
  74. package/components/chat-route/chat-box/zalo-personal-editor.js +590 -0
  75. package/components/chat-route/chat-box/zalo-reminder/create-zalo-reminder.js +868 -0
  76. package/components/chat-route/chat-box/zalo-reminder/use-send-zalo-reminder.js +98 -0
  77. package/components/chat-route/chat-box/zalo-reminder/zalo-reminder-content.js +294 -0
  78. package/components/chat-route/chat-box/zalo-rtf-utils.js +422 -0
  79. package/components/chat-route/chat-list/action-chat-item.js +116 -0
  80. package/components/chat-route/chat-list/assign-agent-dialog.js +170 -0
  81. package/components/chat-route/chat-list/assign-tag-dialog.js +242 -0
  82. package/components/chat-route/chat-list/chat-item-tags.js +105 -0
  83. package/components/chat-route/chat-list/chat-item.js +749 -0
  84. package/components/chat-route/chat-list/chat-list-item.js +370 -0
  85. package/components/chat-route/chat-list/chat-list-selection-bar.js +426 -0
  86. package/components/chat-route/chat-list/chat-search-preview.js +48 -0
  87. package/components/chat-route/chat-list/chat-sort-menu.js +89 -0
  88. package/components/chat-route/chat-list/edit-filter-modal.js +468 -0
  89. package/components/chat-route/chat-list/filter-chat-sources.js +222 -0
  90. package/components/chat-route/chat-list/filter-chat.js +501 -0
  91. package/components/chat-route/chat-list/filter-criteria-rows.js +845 -0
  92. package/components/chat-route/chat-list/filter-group-select.js +66 -0
  93. package/components/chat-route/chat-list/filter-pin-menu.js +165 -0
  94. package/components/chat-route/chat-list/friend-request/list-friend-request.js +287 -0
  95. package/components/chat-route/chat-list/index.js +243 -0
  96. package/components/chat-route/chat-list/inline-search-results.js +178 -0
  97. package/components/chat-route/chat-list/post-ids-field.js +104 -0
  98. package/components/chat-route/chat-list/quick-filter-bar.js +391 -0
  99. package/components/chat-route/chat-list/save-filter-popover.js +258 -0
  100. package/components/chat-route/chat-list/search-messages/index.js +225 -0
  101. package/components/chat-route/chat-list/search-result-header.js +51 -0
  102. package/components/chat-route/chat-list/util.js +604 -0
  103. package/components/chat-route/chat-toolbar.js +108 -0
  104. package/components/chat-route/hooks/use-reassign.js +111 -0
  105. package/components/chat-route/shared/close-conversation-dialog.js +111 -0
  106. package/components/chat-route/shared/force-transfer-dialog.js +109 -0
  107. package/components/chat-route/shared/in-queue-confirm-dialog.js +40 -0
  108. package/components/chat-route/util.js +146 -0
  109. package/components/chat-route/zalo/modal-action-zalo.js +76 -0
  110. package/components/chat-route/zalo/modal-add-friend-zalo.js +277 -0
  111. package/components/custom/SafeHTML.js +45 -0
  112. package/components/custom/audio-player.js +81 -0
  113. package/components/custom/avatar.js +95 -0
  114. package/components/custom/between-date-picker/index.js +86 -0
  115. package/components/custom/button-close.js +28 -0
  116. package/components/custom/button.js +80 -0
  117. package/components/custom/color-picker.js +81 -0
  118. package/components/custom/combobox.js +168 -0
  119. package/components/custom/custom-dialog.js +44 -0
  120. package/components/custom/custom-select.js +256 -0
  121. package/components/custom/cycle-value-helpers.js +11 -0
  122. package/components/custom/cycle-value.js +93 -0
  123. package/components/custom/date-time-picker/components/date-time-group.js +44 -0
  124. package/components/custom/date-time-picker/components/date-time-input.js +383 -0
  125. package/components/custom/date-time-picker/components/date-time-unit-input.js +138 -0
  126. package/components/custom/date-time-picker/components/month-year-picker.js +232 -0
  127. package/components/custom/date-time-picker/hooks/use-merge-refs.js +18 -0
  128. package/components/custom/date-time-picker/hooks/use-scroll-to-center.js +18 -0
  129. package/components/custom/date-time-picker/index.js +348 -0
  130. package/components/custom/field-file-upload/files-upload.js +87 -0
  131. package/components/custom/field-file-upload/image-upload.js +115 -0
  132. package/components/custom/field-file-upload/preview-images-modal.js +284 -0
  133. package/components/custom/field-file-upload/preview-list-file.js +134 -0
  134. package/components/custom/field-file-upload/preview-list-image.js +108 -0
  135. package/components/custom/field-file-upload/upload-custom.js +222 -0
  136. package/components/custom/field-generator.js +639 -0
  137. package/components/custom/field-layout-popover.js +304 -0
  138. package/components/custom/file-preview-modal.js +351 -0
  139. package/components/custom/html-edtior.js +100 -0
  140. package/components/custom/icon.js +49 -0
  141. package/components/custom/infinite-scroll-combobox.js +253 -0
  142. package/components/custom/inline-edit-popover.js +90 -0
  143. package/components/custom/inputs/calendar-input.js +0 -0
  144. package/components/custom/inputs/chip-input.js +136 -0
  145. package/components/custom/inputs/file-input.js +71 -0
  146. package/components/custom/inputs/mask-data/mask-data-input.js +80 -0
  147. package/components/custom/inputs/mask-data/mask-data-select.js +78 -0
  148. package/components/custom/inputs/mask-data/mask-data-textarea.js +75 -0
  149. package/components/custom/inputs/mask-data/reconcile-masked-edit.js +20 -0
  150. package/components/custom/jxl-decode.js +34 -0
  151. package/components/custom/jxl-image.js +68 -0
  152. package/components/custom/jxl-worker.js +12 -0
  153. package/components/custom/label.js +55 -0
  154. package/components/custom/layout.js +30 -0
  155. package/components/custom/multi-select-search-cc.js +179 -0
  156. package/components/custom/multiple-select-setting-tags.js +404 -0
  157. package/components/custom/multiple-selector.js +821 -0
  158. package/components/custom/pagination.js +95 -0
  159. package/components/custom/popup-confirm.js +120 -0
  160. package/components/custom/previews/facebook/facebook-appointment-booking-preview.js +83 -0
  161. package/components/custom/previews/facebook/facebook-audio-preview.js +130 -0
  162. package/components/custom/previews/facebook/facebook-event-preview.js +72 -0
  163. package/components/custom/previews/facebook/facebook-file-preview.js +95 -0
  164. package/components/custom/previews/facebook/facebook-group-preview.js +103 -0
  165. package/components/custom/previews/facebook/facebook-image-preview.js +81 -0
  166. package/components/custom/previews/facebook/facebook-page-preview.js +85 -0
  167. package/components/custom/previews/facebook/facebook-post-preview.js +77 -0
  168. package/components/custom/previews/facebook/facebook-reel-preview.js +83 -0
  169. package/components/custom/previews/facebook/facebook-sticker-preview.js +23 -0
  170. package/components/custom/previews/facebook/facebook-video-preview.js +114 -0
  171. package/components/custom/previews/facebook/index.js +24 -0
  172. package/components/custom/previews/file-preview.js +747 -0
  173. package/components/custom/previews/image-preview.js +288 -0
  174. package/components/custom/previews/instagram/index.js +4 -0
  175. package/components/custom/previews/instagram/instagram-share-post-preview.js +77 -0
  176. package/components/custom/previews/link-preview.js +166 -0
  177. package/components/custom/previews/product-preview.js +334 -0
  178. package/components/custom/previews/tiktok-order-preview.js +278 -0
  179. package/components/custom/previews/tiktok-product-preview.js +321 -0
  180. package/components/custom/previews/tiktok-voucher-preview.js +151 -0
  181. package/components/custom/previews/whatsapp/index.js +10 -0
  182. package/components/custom/previews/whatsapp/whatsapp-contact-card-preview.js +150 -0
  183. package/components/custom/previews/whatsapp/whatsapp-order-preview.js +38 -0
  184. package/components/custom/previews/whatsapp/whatsapp-poll-preview.js +29 -0
  185. package/components/custom/previews/whatsapp/whatsapp-product-preview.js +29 -0
  186. package/components/custom/retry-image.js +44 -0
  187. package/components/custom/search-input.js +26 -0
  188. package/components/custom/separator-with-text.js +14 -0
  189. package/components/custom/showToast.js +21 -0
  190. package/components/custom/sortable-header.js +62 -0
  191. package/components/custom/table-resize-line.js +92 -0
  192. package/components/custom/time-picker/index.js +73 -0
  193. package/components/custom/time-picker/time-picker-input.js +159 -0
  194. package/components/custom/time-picker/time-picker-utils.js +152 -0
  195. package/components/custom/viewers/audio-player.js +192 -0
  196. package/components/custom/viewers/code-viewer.js +140 -0
  197. package/components/custom/viewers/csv-viewer.js +174 -0
  198. package/components/custom/viewers/docx-viewer.js +145 -0
  199. package/components/custom/viewers/image-viewer.js +104 -0
  200. package/components/custom/viewers/markdown-viewer.js +124 -0
  201. package/components/custom/viewers/pdf-viewer.js +333 -0
  202. package/components/custom/viewers/spreadsheet-viewer.js +232 -0
  203. package/components/custom/viewers/unsupported-viewer.js +85 -0
  204. package/components/custom/viewers/video-player.js +241 -0
  205. package/components/customers-route/change-owner-modal.js +430 -0
  206. package/components/customers-route/contact-note-button.js +212 -0
  207. package/components/customers-route/customer-source.js +37 -0
  208. package/components/customers-route/table/columns.js +675 -0
  209. package/components/customers-route/table/edit-fields.js +125 -0
  210. package/components/customers-route/table/editable-cell.js +218 -0
  211. package/components/customers-route/table/note-cell.js +77 -0
  212. package/components/dialogs/invite-agent.js +677 -0
  213. package/components/error-boundary.js +53 -0
  214. package/components/leads-route/duplicate-phone-warning-toast.js +96 -0
  215. package/components/leads-route/table/columns.js +523 -0
  216. package/components/leads-route/table/contact-cell-name.js +82 -0
  217. package/components/leads-route/table/edit-fields.js +142 -0
  218. package/components/leads-route/table/editable-cell.js +228 -0
  219. package/components/org-tree/group-name-display.js +36 -0
  220. package/components/org-tree/group-tree-multi-select.js +208 -0
  221. package/components/org-tree/group-tree-select.js +220 -0
  222. package/components/posts-route/dialog-select-posts.js +284 -0
  223. package/components/reports-route/agents/multi-select-agents.js +55 -0
  224. package/components/reports-route/agents/multi-select-search-agents.js +43 -0
  225. package/components/settings-route/chat-layout/detail/constants.js +353 -0
  226. package/components/settings-route/chat-layout/detail/form.js +43 -0
  227. package/components/settings-route/chat-timeout/channel-multi-select.js +119 -0
  228. package/components/settings-route/multi-channel/facebook/hooks/use-facebook-sdk.js +3 -0
  229. package/components/settings-route/object-rule/util.js +79 -0
  230. package/components/settings-route/routing/settings-dialog.js +561 -0
  231. package/components/settings-route/switchboard/queue-new/constant.js +9 -0
  232. package/components/shared/linked-customer-fields/LinkedCustomerFields.js +91 -0
  233. package/components/shared/linked-customer-fields/use-linked-customer-fields.js +123 -0
  234. package/components/smartqc-route/qc-form/controls/multi-select-search-agents.js +50 -0
  235. package/components/ui/alert-dialog.js +112 -0
  236. package/components/ui/avatar.js +44 -0
  237. package/components/ui/badge.js +54 -0
  238. package/components/ui/button.js +48 -0
  239. package/components/ui/calendar.js +70 -0
  240. package/components/ui/card.js +58 -0
  241. package/components/ui/carousel.js +238 -0
  242. package/components/ui/checkbox.js +27 -0
  243. package/components/ui/command.js +111 -0
  244. package/components/ui/context-menu.js +154 -0
  245. package/components/ui/dialog.js +104 -0
  246. package/components/ui/dropdown-menu.js +169 -0
  247. package/components/ui/form.js +104 -0
  248. package/components/ui/input.js +115 -0
  249. package/components/ui/label.js +20 -0
  250. package/components/ui/popover.js +29 -0
  251. package/components/ui/radio-group.js +53 -0
  252. package/components/ui/scroll-area.js +38 -0
  253. package/components/ui/select.js +147 -0
  254. package/components/ui/separator.js +24 -0
  255. package/components/ui/sheet.js +113 -0
  256. package/components/ui/skeleton.js +17 -0
  257. package/components/ui/slider.js +26 -0
  258. package/components/ui/sonner.js +76 -0
  259. package/components/ui/switch.js +54 -0
  260. package/components/ui/table-v2.js +269 -0
  261. package/components/ui/table.js +245 -0
  262. package/components/ui/tabs.js +89 -0
  263. package/components/ui/textarea.js +33 -0
  264. package/components/ui/tooltip.js +40 -0
  265. package/components/workflow-editor/nodes/ticket/picker-field.js +233 -0
  266. package/components/zalo-login-qr.js +237 -0
  267. package/components/zalo-login-status-modal.js +45 -0
  268. package/config/env.js +27 -0
  269. package/config/hmr.js +8 -0
  270. package/config/navigation.js +54 -0
  271. package/config/runtime.js +46 -0
  272. package/config/theme.js +274 -0
  273. package/constants/brand-colors.js +32 -0
  274. package/constants/chat-icon.js +34 -0
  275. package/dist/chat.css +1 -0
  276. package/exceptions/throw-exception.js +15 -0
  277. package/hooks/use-chat-attachments.js +106 -0
  278. package/hooks/use-chat-configs.js +62 -0
  279. package/hooks/use-chat-customer.js +33 -0
  280. package/hooks/use-chat-display-config-sync.js +72 -0
  281. package/hooks/use-chat-permission.js +68 -0
  282. package/hooks/use-chat-room-detail.js +44 -0
  283. package/hooks/use-chat-selection.js +26 -0
  284. package/hooks/use-chat-sort.js +69 -0
  285. package/hooks/use-chat-surface.js +8 -0
  286. package/hooks/use-common-filter-options.js +70 -0
  287. package/hooks/use-crm-organization-filter-options.js +0 -0
  288. package/hooks/use-crm-organizations-data.js +23 -0
  289. package/hooks/use-debounce.js +14 -0
  290. package/hooks/use-dynamic-fields.js +7 -0
  291. package/hooks/use-facebook-notice.js +24 -0
  292. package/hooks/use-feature-flags.js +6 -0
  293. package/hooks/use-field-layout-override.js +46 -0
  294. package/hooks/use-file-upload.js +119 -0
  295. package/hooks/use-file-viewer.js +93 -0
  296. package/hooks/use-frozen-columns.js +29 -0
  297. package/hooks/use-horizontal-scroll.js +41 -0
  298. package/hooks/use-image-preview-queue.js +101 -0
  299. package/hooks/use-inline-editable-cell.js +97 -0
  300. package/hooks/use-intersection-observer.js +24 -0
  301. package/hooks/use-interval.js +20 -0
  302. package/hooks/use-latest-message-id.js +13 -0
  303. package/hooks/use-lead-filter-options.js +0 -0
  304. package/hooks/use-logout-listener.js +43 -0
  305. package/hooks/use-org-tree.js +43 -0
  306. package/hooks/use-permission.js +33 -0
  307. package/hooks/use-quick-filters.js +175 -0
  308. package/hooks/use-resizable-table.js +0 -0
  309. package/hooks/use-setting-common.js +389 -0
  310. package/hooks/use-settings.js +41 -0
  311. package/hooks/use-sort-bindings.js +24 -0
  312. package/hooks/use-table-display-config.js +0 -0
  313. package/hooks/use-tenant-config.js +99 -0
  314. package/hooks/use-update-user-config.js +150 -0
  315. package/hooks/use-zalo-connection.js +57 -0
  316. package/hooks/use-zalo-mention-list.js +31 -0
  317. package/index.css +624 -0
  318. package/index.js +100 -0
  319. package/lib/deal-name.js +27 -0
  320. package/lib/i18n/react.js +7 -0
  321. package/lib/i18n/use-language.js +0 -0
  322. package/lib/query-client.js +34 -0
  323. package/lib/utils.js +25 -0
  324. package/package.json +108 -0
  325. package/provider/chat-context.js +9 -0
  326. package/provider/chat-provider.js +177 -0
  327. package/provider/chat-room-context.js +9 -0
  328. package/provider/chat-room-hooks.js +8 -0
  329. package/provider/chat-room-provider.js +84 -0
  330. package/provider/hooks.js +22 -0
  331. package/provider/index.js +42 -0
  332. package/public/contact-card-user.svg +25 -0
  333. package/public/images/icons/facebook.svg +1 -0
  334. package/public/images/icons/instagram.svg +1 -0
  335. package/public/images/icons/shopee.svg +1 -0
  336. package/public/images/icons/whatsapp.svg +1 -0
  337. package/public/images/icons/zalo.png +0 -0
  338. package/public/images/images.jpg +0 -0
  339. package/public/images/ticket_sources/api.png +0 -0
  340. package/public/images/ticket_sources/email.png +0 -0
  341. package/public/images/ticket_sources/facebook.png +0 -0
  342. package/public/images/ticket_sources/hand.png +0 -0
  343. package/public/images/ticket_sources/instagram.png +0 -0
  344. package/public/images/ticket_sources/livechat.png +0 -0
  345. package/public/images/ticket_sources/shopee.svg +1 -0
  346. package/public/images/ticket_sources/sms.png +0 -0
  347. package/public/images/ticket_sources/telephone-call-in.png +0 -0
  348. package/public/images/ticket_sources/telephone-call-out.png +0 -0
  349. package/public/images/ticket_sources/tiktok.png +0 -0
  350. package/public/images/ticket_sources/tiktok_shop.png +0 -0
  351. package/public/images/ticket_sources/whatsapp.png +0 -0
  352. package/public/images/ticket_sources/whatsapp.svg +1 -0
  353. package/public/images/ticket_sources/zalo.png +0 -0
  354. package/public/placeholder.svg +13 -0
  355. package/store/app-status-store.js +17 -0
  356. package/store/chat-display-config-store.js +182 -0
  357. package/store/chat-display-config.resolvers.js +88 -0
  358. package/store/chat-store-helpers.js +62 -0
  359. package/store/chat-store.js +931 -0
  360. package/store/crm-organization-list-filter-store.js +126 -0
  361. package/store/customer-list-filter-store.js +139 -0
  362. package/store/devtools.js +9 -0
  363. package/store/duplicate-phone-warning-store.js +18 -0
  364. package/store/entity-extract-store.js +72 -0
  365. package/store/file-preview-store.js +27 -0
  366. package/store/filter-store.js +289 -0
  367. package/store/index.js +22 -0
  368. package/store/knowledge-crawl-store.js +53 -0
  369. package/store/lead-list-filter-store.js +142 -0
  370. package/store/list-pagination-state.js +44 -0
  371. package/store/lumi-learn-from-chat-store.js +69 -0
  372. package/store/merge-suggestion-store.js +27 -0
  373. package/store/notification-store.js +63 -0
  374. package/store/preview-image-store.js +22 -0
  375. package/store/settings-store/multi-channel/email-list-store.js +20 -0
  376. package/store/settings-store/multi-channel/facebook-list-store.js +22 -0
  377. package/store/settings-store/multi-channel/google-list-store.js +20 -0
  378. package/store/settings-store/multi-channel/instagram-list-store.js +20 -0
  379. package/store/settings-store/multi-channel/misa-list-store.js +20 -0
  380. package/store/settings-store/multi-channel/nhanhvn-list-store.js +20 -0
  381. package/store/settings-store/multi-channel/shopee-list-store.js +20 -0
  382. package/store/settings-store/multi-channel/shopee-order-list-store.js +20 -0
  383. package/store/settings-store/multi-channel/sms-list-store.js +20 -0
  384. package/store/settings-store/multi-channel/tiktok-business-list-store.js +20 -0
  385. package/store/settings-store/multi-channel/tiktok-list-store.js +20 -0
  386. package/store/settings-store/multi-channel/zalo-list-store.js +22 -0
  387. package/store/settings-store/multi-channel/zalo-user-list-store.js +25 -0
  388. package/store/smart-qc-store/smart-qc-list-filter-store.js +70 -0
  389. package/store/tenant-config-store.js +21 -0
  390. package/store/user-detail-store.js +17 -0
  391. package/store/user-status-store.js +33 -0
  392. package/store/workflow-store.js +24 -0
  393. package/store/workspace-store.js +32 -0
  394. package/tailwind-preset.js +129 -0
  395. package/utils/chat-actions.js +414 -0
  396. package/utils/chat_socket.js +1225 -0
  397. package/utils/extra-columns.js +108 -0
  398. package/utils/file.js +316 -0
  399. package/utils/html-to-plain-text.js +12 -0
  400. package/utils/notification.js +71 -0
  401. package/utils/replaceZaloSprite.js +64 -0
  402. package/utils/show-be-error.js +17 -0
  403. package/utils/typing_socket.js +101 -0
package/index.css ADDED
@@ -0,0 +1,624 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* Hai skin `.lumi-theme` / `.qa-theme` ĐÃ XOÁ.
6
+ - Không component nào gắn hai class đó (grep = 0).
7
+ - Chúng đè `.bg-\[\#e5f1ff\]` và `.bg-\[\#f9f9f9\]` — hai class không còn
8
+ tồn tại sau khi bong bóng tin và nền luồng tin chuyển sang token.
9
+ - Chúng nằm NGOÀI `@layer` nên thắng mọi layer, kể cả `.dark`. Để lại là một
10
+ cái bẫy im lặng cho bất kỳ ai bật chúng sau này.
11
+ Cần skin riêng thì dùng `<ChatProvider theme={...}>`. */
12
+
13
+ @layer base {
14
+ :root {
15
+ /* Custom CSS Variables */
16
+ --header-height: 4rem;
17
+
18
+ /* Theme Variables */
19
+ --background: 0 0% 98%;
20
+ --foreground: 0 0% 20%;
21
+ --card: 0 0% 100%;
22
+ --card-foreground: 222.2 84% 4.9%;
23
+ --popover: 0 0% 100%;
24
+ --popover-foreground: 222.2 84% 4.9%;
25
+ --primary: 227 81% 54%;
26
+ --primary-foreground: 210 40% 98%;
27
+ --secondary: 230 86% 97%;
28
+ --secondary-foreground: 227 81% 54%;
29
+ /* 24% thay vì 27%: chữ trắng trên nền này trước chỉ đạt 4.42:1. */
30
+ --success: 100 100% 22%;
31
+ --muted: 220 8% 92%;
32
+ /* Nền vùng nội dung màn tạo chiến dịch (#E6EBF2). Tách riêng khỏi --muted
33
+ vì --muted dùng chung toàn app, đổi nó là đổi cả nghìn chỗ. */
34
+ --campaign-create-bg: 215 31.6% 92.5%;
35
+ /* 43% thay vì 47%: trên nền --background trước chỉ đạt 4.41:1. */
36
+ --muted-foreground: 222 7% 40%;
37
+ --accent: 180 15% 95%;
38
+ --accent-foreground: 222.2 47.4% 11.2%;
39
+ --destructive: 360 100% 42%;
40
+ --destructive-foreground: 210 40% 98%;
41
+ /* 81% chứ không 91%: bong bóng tin nhắn giờ có viền thật thay vì dựa vào
42
+ shadow. Ở 91% viền gần như vô hình (1.24:1) — nhìn như lỗi hơn là tinh tế. */
43
+ --border: 214 32% 91%;
44
+ --input: 214.3 31.8% 91.4%;
45
+
46
+ /* Bóng đổ: bản sáng dùng đen mờ đúng như mặc định Tailwind. */
47
+ --shadow-color: 0 0% 0%;
48
+ --shadow-strength: 0.1;
49
+ --shadow-rim: 0;
50
+ /* Viền focus = màu thương hiệu. Trước là một sắc xanh khác (220 90% 60%). */
51
+ --ring: 227 81% 54%;
52
+ --chart-1: 12 76% 61%;
53
+ --chart-2: 173 58% 39%;
54
+ --chart-3: 197 37% 24%;
55
+ --chart-4: 43 74% 66%;
56
+ --chart-5: 27 87% 67%;
57
+ --chart-6: 120 100% 16%;
58
+ --chart-7: 240 100% 50%;
59
+ --chart-8: 180 100% 50%;
60
+ --chart-9: 300 100% 50%;
61
+ --chart-10: 60 100% 50%;
62
+ --chart-11: 120 100% 50%;
63
+
64
+ --radius: 0.5rem;
65
+ --modal-max-height: 80vh;
66
+ --body-padding-x: 1rem;
67
+ --body-padding-y: 1rem;
68
+ --sidebar-background: 0 0% 100%;
69
+ --sidebar-foreground: 240 5.3% 26.1%;
70
+ --sidebar-primary: 240 5.9% 10%;
71
+ --sidebar-primary-foreground: 0 0% 98%;
72
+ --sidebar-accent: 230 86% 97%;
73
+ --sidebar-accent-foreground: 227 81% 54%;
74
+ --sidebar-border: 214 32% 91%;
75
+ --sidebar-ring: 227 81% 54%;
76
+
77
+ --icon-primary: 227, 81%, 54%, 1;
78
+ --icon-success: 100, 100%, 27%, 1;
79
+ --icon-danger: 0, 84%, 60%, 1;
80
+ --icon-eye-viewer: 207, 71%, 42%;
81
+ --border-secondary: 227, 81%, 54%, 1;
82
+ --border-eye-viewer: 207, 71%, 42%, 1;
83
+
84
+ /* color */
85
+ /* ── Token thay cho màu hex cứng ────────────────────────────────────
86
+ Mỗi cái gom một cụm màu đang rải rác trong components. Xem
87
+ `tailwind-preset.js` và `config/theme.js`. */
88
+
89
+ /* #2f8a00 đã là --success; đây là màu chữ trên nền đó. */
90
+ --success-foreground: 0 0% 100%;
91
+ /* Gom #f97316 #f59e0b #f37203 — trước đây không có token cảnh báo nào. */
92
+ /* 35% chứ không phải 53%: token này còn được dùng LÀM CHỮ
93
+ (`text-warning`), mà cam 53% trên nền sáng chỉ đạt 2.67:1. Ở độ đậm này
94
+ nó vừa đọc được làm chữ, vừa đủ tương phản với chữ trắng khi làm nền. */
95
+ --warning: 25 95% 35%;
96
+ --warning-foreground: 0 0% 100%;
97
+ /* #5a6981 — chữ phụ trong preview tin trả lời, 12 chỗ. */
98
+ --foreground-secondary: 217 18% 43%;
99
+ /* Gom #e5e7eb #e8e9ee #e5e6eb #e4e4e7 … — viền nhạt hơn --border. */
100
+ --border-subtle: 220 13% 91%;
101
+ /* Gom #fafbfd #f8fafc #fafafa #f9fafb … — nền trắng ngà. */
102
+ --surface-subtle: 210 20% 98%;
103
+
104
+ /* Mặt phẳng riêng của khung chat (trước là bg-[#e5f1ff] / bg-[#f9f9f9]). */
105
+ --chat-own-bubble: 212 100% 95%;
106
+ --chat-own-bubble-foreground: 0 0% 24%;
107
+ --chat-thread-bg: 0 0% 98%;
108
+
109
+ --label-blue: #d0eeff;
110
+ --label-blue-foreground: #0a2fb6;
111
+ --label-green: #e3f9e9;
112
+ --label-green-prime: #099516;
113
+ --label-green-foreground: #00800c;
114
+ --label-red: #ffdcda;
115
+ /* #dd0606 trên #ffdcda chỉ đạt 4.02:1. */
116
+ --label-red-foreground: #c00404;
117
+ --label-orange: #fff1da;
118
+ /* #f37203 chỉ đạt 2.61:1 trên nền #fff1da — trượt AA. Đậm lại. */
119
+ --label-orange-foreground: #8a4200;
120
+ --label-gray: #eeeff0;
121
+ --label-dark-blue: #020817;
122
+ }
123
+ /* ── Chế độ tối ──────────────────────────────────────────────────────────
124
+ Thiết kế theo BA quy tắc, không phải đảo ngược cơ học:
125
+
126
+ 1. GIỮ TÔNG MÀU. Xanh thương hiệu vẫn là tông 227, đỏ vẫn 0, cam vẫn 25.
127
+ Bản kế thừa từ shadcn biến --primary thành TRẮNG ở chế độ tối — nút
128
+ primary mất hẳn nhận diện. Ở đây nó chỉ sáng lên, không đổi tông.
129
+
130
+ 2. CÓ ĐỘ CAO. --background tối nhất, --card/--popover sáng hơn một bậc.
131
+ Bản cũ đặt cả hai cùng #020817 nên thẻ chìm vào nền.
132
+
133
+ 3. GIẢM BÃO HOÀ. Màu rực trên nền tối gây rung mắt, nên mọi màu đều hạ
134
+ vài phần trăm S so với bản sáng.
135
+
136
+ Chữ dùng trắng-ngả (L 92%) chứ không trắng tinh — tương phản tuyệt đối
137
+ trên nền rất tối làm mỏi mắt khi đọc lâu, mà chat thì đọc lâu. */
138
+ .dark {
139
+ /* Bề mặt: nền < thẻ < nổi */
140
+ --background: 225 20% 9%;
141
+ --card: 225 19% 13%;
142
+ --popover: 225 19% 13%;
143
+ --surface-subtle: 225 18% 16%;
144
+ --campaign-create-bg: 225 18% 14%;
145
+
146
+ /* Chữ */
147
+ --foreground: 210 20% 92%;
148
+ --card-foreground: 210 20% 92%;
149
+ --popover-foreground: 210 20% 92%;
150
+ --accent-foreground: 210 20% 92%;
151
+ --muted-foreground: 220 12% 65%;
152
+ --foreground-secondary: 218 14% 72%;
153
+
154
+ /* Thương hiệu — GIỮ tông 227, chỉ sáng lên để nổi trên nền tối.
155
+ primary-foreground thành chữ TỐI vì nền nút giờ là xanh sáng. */
156
+ --primary: 227 95% 70%;
157
+ --primary-foreground: 225 30% 12%;
158
+ --secondary: 227 32% 22%;
159
+ --secondary-foreground: 227 95% 84%;
160
+ --ring: 227 95% 84%;
161
+
162
+ /* Trung tính */
163
+ --muted: 225 15% 20%;
164
+ --accent: 225 15% 20%;
165
+ /* 30% chứ không 22%: bản sáng tách các bề mặt bằng shadow đen, mà shadow
166
+ đen trên nền tối là vô hình. Viền phải tự gánh việc đó. */
167
+ --border: 225 14% 30%;
168
+ --border-subtle: 225 14% 24%;
169
+ --input: 225 14% 30%;
170
+
171
+ /* Nền tối đã gần chạm đáy: bóng ĐEN đặc 100% cũng chỉ đạt 1.10:1.
172
+ Nên bản tối đổi bóng sang tông SÁNG + thêm viền quầng `--shadow-rim`
173
+ (lớp `0 0 0 1px` trong cùng box-shadow). Bản sáng đặt rim = 0 nên
174
+ không sinh thêm pixel nào — style sáng giữ nguyên tuyệt đối. */
175
+ --shadow-color: 225 45% 80%;
176
+ --shadow-strength: 0.16;
177
+ --shadow-rim: 0.3;
178
+
179
+ /* Trạng thái — sáng lên để đạt tương phản, chữ trên nền màu thì tối lại */
180
+ --success: 100 55% 55%;
181
+ --success-foreground: 100 30% 10%;
182
+ --destructive: 0 72% 68%;
183
+ --destructive-foreground: 0 0% 12%;
184
+ --warning: 28 90% 62%;
185
+ --warning-foreground: 25 40% 12%;
186
+
187
+ /* Khung chat */
188
+ --chat-own-bubble: 222 35% 24%;
189
+ --chat-own-bubble-foreground: 210 25% 92%;
190
+ --chat-thread-bg: 225 22% 7%;
191
+
192
+ /* Biểu đồ — GIỮ NGUYÊN tông của bản sáng, chỉ chỉnh độ sáng.
193
+ Bản cũ đổi cả tông (chart-1 cam -> xanh), nên cùng một chuỗi số đọc ở hai
194
+ chế độ lại ra hai màu khác hẳn. */
195
+ --chart-1: 12 70% 62%;
196
+ --chart-2: 173 50% 50%;
197
+ --chart-3: 197 35% 55%;
198
+ --chart-4: 43 70% 68%;
199
+ --chart-5: 27 80% 68%;
200
+ --chart-6: 120 45% 45%;
201
+ --chart-7: 240 70% 70%;
202
+ --chart-8: 180 55% 55%;
203
+ --chart-9: 300 60% 68%;
204
+ --chart-10: 60 65% 62%;
205
+ --chart-11: 120 60% 58%;
206
+
207
+ /* Sidebar — cùng thang bề mặt, cùng màu thương hiệu */
208
+ --sidebar-background: 225 20% 11%;
209
+ --sidebar-foreground: 210 16% 88%;
210
+ --sidebar-primary: 227 95% 84%;
211
+ --sidebar-primary-foreground: 225 30% 12%;
212
+ --sidebar-accent: 225 16% 18%;
213
+ --sidebar-accent-foreground: 227 90% 78%;
214
+ --sidebar-border: 225 14% 20%;
215
+ --sidebar-ring: 227 95% 84%;
216
+
217
+ /* Icon/viền — định dạng CSV + alpha, xem VAR_FORMAT trong config/theme.js */
218
+ --icon-primary: 227, 95%, 84%, 1;
219
+ --icon-success: 100, 55%, 55%, 1;
220
+ --icon-danger: 0, 72%, 68%, 1;
221
+ --icon-eye-viewer: 207, 55%, 62%;
222
+ --border-secondary: 227, 95%, 84%, 1;
223
+ --border-eye-viewer: 207, 55%, 62%, 1;
224
+
225
+ /* Nhãn — định dạng HEX TRẦN (dùng qua `bg-[--label-red]`).
226
+ Nền tối bão hoà thấp + chữ sáng cùng tông. */
227
+ --label-blue: #143349;
228
+ --label-blue-foreground: #9ecbff;
229
+ --label-green: #14331f;
230
+ --label-green-prime: #4ade80;
231
+ --label-green-foreground: #86efac;
232
+ --label-red: #3d1a19;
233
+ --label-red-foreground: #fda4a4;
234
+ --label-orange: #3b2a14;
235
+ --label-orange-foreground: #fbbf6e;
236
+ --label-gray: #24262b;
237
+ --label-dark-blue: #cbd5e1;
238
+ }
239
+
240
+ .collapsibleDropdown {
241
+ overflow: hidden;
242
+ }
243
+ .collapsibleDropdown[data-state="open"] {
244
+ animation: slideDown 200ms ease-out;
245
+ }
246
+ .collapsibleDropdown[data-state="closed"] {
247
+ animation: slideUp 200ms ease-out;
248
+ }
249
+
250
+ @keyframes slideDown {
251
+ from {
252
+ height: 0;
253
+ }
254
+ to {
255
+ height: var(--radix-collapsible-content-height);
256
+ }
257
+ }
258
+
259
+ @keyframes slideUp {
260
+ from {
261
+ height: var(--radix-collapsible-content-height);
262
+ }
263
+ to {
264
+ height: 0;
265
+ }
266
+ }
267
+
268
+ * {
269
+ @apply border-border;
270
+ }
271
+
272
+ html {
273
+ font-family: "Roboto", sans-serif;
274
+ }
275
+
276
+ body {
277
+ @apply min-h-svh w-full bg-background text-foreground;
278
+ }
279
+ body > #root {
280
+ @apply h-svh;
281
+ }
282
+ }
283
+
284
+ @layer utilities {
285
+ ::-webkit-scrollbar {
286
+ width: 0.5rem;
287
+ height: 0.5rem;
288
+ }
289
+
290
+ ::-webkit-scrollbar-track {
291
+ background-color: transparent;
292
+ border-radius: 100vh;
293
+ }
294
+
295
+ ::-webkit-scrollbar-thumb {
296
+ background: hsl(var(--border));
297
+ border-radius: 100vh;
298
+ }
299
+
300
+ ::-webkit-scrollbar-track:hover {
301
+ background: transparent;
302
+ }
303
+
304
+ ::-webkit-scrollbar-thumb:hover {
305
+ background: hsl(var(--border));
306
+ }
307
+
308
+ .faded-bottom {
309
+ @apply after:pointer-events-none after:absolute after:bottom-0 after:left-0 after:hidden after:h-32 after:w-full after:bg-[linear-gradient(180deg,_transparent_10%,_hsl(var(--background))_70%)] after:md:block;
310
+ }
311
+
312
+ ::-ms-reveal {
313
+ display: none;
314
+ }
315
+ }
316
+
317
+ @layer base {
318
+ * {
319
+ @apply border-border;
320
+ }
321
+ body {
322
+ @apply bg-background text-foreground;
323
+ }
324
+ }
325
+
326
+ @keyframes notification-ring {
327
+ 0% {
328
+ box-shadow:
329
+ 0 0 0 0 hsl(var(--ring) / 0.7),
330
+ 0 0 0 0 hsl(var(--ring) / 0.5);
331
+ transform: translateX(0);
332
+ }
333
+ 30% {
334
+ transform: translateX(-1px);
335
+ box-shadow:
336
+ 0 0 0 5px hsl(var(--ring) / 0),
337
+ 0 0 0 0 hsl(var(--ring) / 0.5);
338
+ }
339
+
340
+ 60% {
341
+ transform: translateX(1px);
342
+ box-shadow:
343
+ 0 0 0 3px hsl(var(--ring) / 0),
344
+ 0 0 0 8px hsl(var(--ring) / 0);
345
+ }
346
+
347
+ 100% {
348
+ box-shadow:
349
+ 0 0 0 0 hsl(var(--ring) / 0),
350
+ 0 0 0 8px hsl(var(--ring) / 0);
351
+ transform: translateX(0);
352
+ }
353
+ }
354
+
355
+ .animate-notification-ring {
356
+ animation: notification-ring 2s ease-in-out;
357
+ }
358
+
359
+ .scroll-container-hide {
360
+ scrollbar-width: none; /* Firefox */
361
+ -ms-overflow-style: none; /* IE 10+ */
362
+ }
363
+
364
+ .scroll-container-hide::-webkit-scrollbar {
365
+ width: 0px; /* Chrome, Safari, Edge */
366
+ background: transparent;
367
+ }
368
+
369
+ .scroll-container-thin {
370
+ scrollbar-width: thin; /* Firefox */
371
+ scrollbar-color: hsl(var(--border)) transparent;
372
+ scrollbar-gutter: stable;
373
+ }
374
+
375
+ .scroll-container-thin::-webkit-scrollbar {
376
+ width: 4px;
377
+ }
378
+
379
+ .scroll-container-thin::-webkit-scrollbar-track {
380
+ background: transparent;
381
+ }
382
+
383
+ .scroll-container-thin::-webkit-scrollbar-thumb {
384
+ background-color: hsl(var(--border));
385
+ border-radius: 9999px;
386
+ }
387
+
388
+ .scroll-container-thin::-webkit-scrollbar-thumb:hover {
389
+ background-color: hsl(var(--muted-foreground));
390
+ }
391
+
392
+ @keyframes shake {
393
+ 0%,
394
+ 100% {
395
+ transform: translateX(0);
396
+ }
397
+ 20%,
398
+ 60% {
399
+ transform: translateX(-4px);
400
+ }
401
+ 40%,
402
+ 80% {
403
+ transform: translateX(4px);
404
+ }
405
+ }
406
+
407
+ .shake {
408
+ animation: shake 0.4s ease-in-out;
409
+ }
410
+
411
+ /* Dedicated keyframe (not reusing `shake`, shared with one-shot error-shake
412
+ elsewhere) — smaller amplitude, and the motion only occupies the first 20%
413
+ of the cycle so the remaining 80% is a rest pause before it repeats. */
414
+ @keyframes bell-shake-loop {
415
+ 0%,
416
+ 100% {
417
+ transform: translateX(0);
418
+ }
419
+ 2%,
420
+ 10% {
421
+ transform: translateX(-2px);
422
+ }
423
+ 6%,
424
+ 14% {
425
+ transform: translateX(2px);
426
+ }
427
+ 18% {
428
+ transform: translateX(0);
429
+ }
430
+ }
431
+
432
+ .shake-loop {
433
+ animation: bell-shake-loop 2s ease-in-out infinite;
434
+ }
435
+
436
+ .no-radius-editor .tox-tinymce,
437
+ .no-radius-editor .tox .tox-editor-container {
438
+ border-radius: 0 !important;
439
+ border: unset !important;
440
+ }
441
+
442
+ .no-spinner::-webkit-inner-spin-button,
443
+ .no-spinner::-webkit-outer-spin-button {
444
+ -webkit-appearance: none;
445
+ margin: 0;
446
+ }
447
+ .no-spinner {
448
+ -moz-appearance: textfield;
449
+ }
450
+
451
+ @keyframes slide-in {
452
+ from {
453
+ opacity: 0;
454
+ transform: translateX(20px);
455
+ }
456
+ to {
457
+ opacity: 1;
458
+ transform: translateX(0);
459
+ }
460
+ }
461
+
462
+ .animate-slide-in {
463
+ animation: slide-in 0.3s ease-out;
464
+ }
465
+
466
+ /* 1. ANSWERING — Ripple + Glow */
467
+ @keyframes call-ripple {
468
+ 0% {
469
+ box-shadow: 0 0 0 0 hsl(var(--success) / 0.6);
470
+ transform: scale(1);
471
+ }
472
+ 70% {
473
+ box-shadow: 0 0 0 10px hsl(var(--success) / 0);
474
+ transform: scale(1.15);
475
+ }
476
+ 100% {
477
+ box-shadow: 0 0 0 0 hsl(var(--success) / 0);
478
+ transform: scale(1);
479
+ }
480
+ }
481
+ .call-ripple {
482
+ animation: call-ripple 1.3s infinite ease-out;
483
+ }
484
+
485
+ /* 2. IN CALL — Pulse */
486
+ @keyframes call-pulse {
487
+ 0%,
488
+ 100% {
489
+ transform: scale(1);
490
+ opacity: 1;
491
+ }
492
+ 50% {
493
+ transform: scale(1.25);
494
+ opacity: 0.6;
495
+ }
496
+ }
497
+ .call-pulse {
498
+ animation: call-pulse 1s infinite ease-in-out;
499
+ }
500
+
501
+ /* 3. HOLDING / MUTING — Breathing */
502
+ @keyframes call-breathe {
503
+ 0% {
504
+ transform: scale(1);
505
+ opacity: 0.7;
506
+ }
507
+ 50% {
508
+ transform: scale(0.9);
509
+ opacity: 1;
510
+ }
511
+ 100% {
512
+ transform: scale(1);
513
+ opacity: 0.7;
514
+ }
515
+ }
516
+ .call-breathe {
517
+ animation: call-breathe 1.6s infinite ease-in-out;
518
+ }
519
+
520
+ /* wrapper suggestion menu */
521
+ .chat-mentions__suggestions {
522
+ border-radius: 10px;
523
+ overflow: hidden;
524
+ background: white;
525
+ z-index: 999999 !important;
526
+ }
527
+
528
+ .chat-mentions__suggestions__list {
529
+ z-index: 999999 !important;
530
+ }
531
+
532
+ @keyframes message-cleave-in {
533
+ 0% {
534
+ opacity: 0;
535
+ transform: scaleY(0) scaleX(0.94);
536
+ }
537
+ 65% {
538
+ opacity: 1;
539
+ transform: scaleY(1.03) scaleX(1.01);
540
+ }
541
+ 100% {
542
+ opacity: 1;
543
+ transform: scaleY(1) scaleX(1);
544
+ }
545
+ }
546
+
547
+ .animate-message-cleave {
548
+ animation: message-cleave-in 280ms ease-out both;
549
+ transform-origin: center;
550
+ }
551
+
552
+ @keyframes reaction-pop-in {
553
+ from {
554
+ opacity: 0;
555
+ transform: translateY(6px) scale(0.8);
556
+ }
557
+ to {
558
+ opacity: 1;
559
+ transform: translateY(0) scale(1);
560
+ }
561
+ }
562
+
563
+ /* Mention highlight in ticket comments */
564
+ .mention-highlight {
565
+ color: hsl(var(--primary));
566
+ }
567
+
568
+ /* react-mentions: override <strong> default bold in highlighter */
569
+ .mentions__mention {
570
+ color: hsl(var(--primary));
571
+ font-weight: normal;
572
+ background: none;
573
+ }
574
+
575
+ /* TinyMCE mention autocomplete dropdown */
576
+ .tox-autocompleter .tox-menu {
577
+ max-height: 200px !important;
578
+ overflow-y: auto !important;
579
+ }
580
+
581
+ @keyframes typing-bounce {
582
+ 0%,
583
+ 60%,
584
+ 100% {
585
+ transform: translateY(0);
586
+ }
587
+ 30% {
588
+ transform: translateY(-6px);
589
+ }
590
+ }
591
+
592
+ /* Order detail modal — view-only mode: strip input boxes, show values as plain text */
593
+ .order-detail-readonly input:disabled,
594
+ .order-detail-readonly textarea:disabled {
595
+ background-color: transparent;
596
+ border-color: transparent;
597
+ box-shadow: none;
598
+ padding-left: 0;
599
+ padding-right: 0;
600
+ cursor: default;
601
+ opacity: 1;
602
+ resize: none;
603
+ }
604
+
605
+ /* Select / combobox triggers */
606
+ .order-detail-readonly [role="combobox"]:disabled {
607
+ background-color: transparent;
608
+ border-color: transparent;
609
+ box-shadow: none;
610
+ padding-left: 0;
611
+ cursor: default;
612
+ opacity: 1;
613
+ }
614
+
615
+ /* Hide the dropdown chevron when in view mode */
616
+ .order-detail-readonly [role="combobox"]:disabled > svg:last-child {
617
+ display: none;
618
+ }
619
+
620
+ /* Generic disabled button cleanup (icon buttons, etc.) */
621
+ .order-detail-readonly button:disabled {
622
+ cursor: default;
623
+ opacity: 1;
624
+ }
package/index.js ADDED
@@ -0,0 +1,100 @@
1
+ import { ChatProvider } from "./provider/chat-provider.js";
2
+ import { ChatRoomProvider } from "./provider/chat-room-provider.js";
3
+ import { ChatClientContext, ChatSessionContext } from "./provider/chat-context.js";
4
+ import { ChatRoomContext, ChatComposerContext } from "./provider/chat-room-context.js";
5
+ import { default as default2 } from "./components/chat-route/chat-box/index.js";
6
+ import { default as default3 } from "./components/chat-route/chat-list/index.js";
7
+ import { default as default4 } from "./components/chat-route/chat-toolbar.js";
8
+ import { ChatHeader } from "./components/chat-route/chat-box/chat-header.js";
9
+ import { default as default5 } from "./components/chat-route/chat-box/chat-message-list.js";
10
+ import { ChatInput } from "./components/chat-route/chat-box/chat-input.js";
11
+ import { ChatDropFile } from "./components/chat-route/chat-box/chat-drop-file.js";
12
+ import { useChatRoomDetail } from "./hooks/use-chat-room-detail.js";
13
+ import { useChatCustomer } from "./hooks/use-chat-customer.js";
14
+ import { useZaloConnection } from "./hooks/use-zalo-connection.js";
15
+ import { useChatPermission } from "./hooks/use-chat-permission.js";
16
+ import { useChatAttachments } from "./hooks/use-chat-attachments.js";
17
+ import { useChatSelection } from "./hooks/use-chat-selection.js";
18
+ import { useLatestMessageId } from "./hooks/use-latest-message-id.js";
19
+ import { useFacebookNotice } from "./hooks/use-facebook-notice.js";
20
+ import {
21
+ useChatRoomContext,
22
+ useChatComposerContext
23
+ } from "./provider/chat-room-hooks.js";
24
+ import {
25
+ useChatClient,
26
+ useChatSession,
27
+ useChatApi,
28
+ useChatSocket,
29
+ useChatBootstrap,
30
+ useChatConfig
31
+ } from "./provider/hooks.js";
32
+ import { default as default6 } from "./store/chat-store.js";
33
+ import {
34
+ applyChatTheme,
35
+ applyColorScheme,
36
+ resolveTheme,
37
+ buildChatTheme,
38
+ toHslTriplet,
39
+ CHAT_THEME_VARS
40
+ } from "./config/theme.js";
41
+ import { setNavigateFunc } from "./config/navigation.js";
42
+ import {
43
+ Toaster,
44
+ showErrorToast,
45
+ showSuccessToast,
46
+ showInfoToast,
47
+ showWarningToast
48
+ } from "./components/ui/sonner.js";
49
+ import {
50
+ getChatClient,
51
+ disposeChatClient,
52
+ ChatClientStatus
53
+ } from "@zenify-omni/chat-js/client.js";
54
+ export {
55
+ CHAT_THEME_VARS,
56
+ default2 as ChatBox,
57
+ ChatClientContext,
58
+ ChatClientStatus,
59
+ ChatComposerContext,
60
+ ChatDropFile,
61
+ ChatHeader,
62
+ ChatInput,
63
+ default3 as ChatList,
64
+ default5 as ChatMessageList,
65
+ ChatProvider,
66
+ ChatRoomContext,
67
+ ChatRoomProvider,
68
+ ChatSessionContext,
69
+ default4 as ChatToolbar,
70
+ Toaster,
71
+ applyChatTheme,
72
+ applyColorScheme,
73
+ buildChatTheme,
74
+ disposeChatClient,
75
+ getChatClient,
76
+ resolveTheme,
77
+ setNavigateFunc,
78
+ showErrorToast,
79
+ showInfoToast,
80
+ showSuccessToast,
81
+ showWarningToast,
82
+ toHslTriplet,
83
+ useChatApi,
84
+ useChatAttachments,
85
+ useChatBootstrap,
86
+ useChatClient,
87
+ useChatComposerContext,
88
+ useChatConfig,
89
+ useChatCustomer,
90
+ useChatPermission,
91
+ useChatRoomContext,
92
+ useChatRoomDetail,
93
+ useChatSelection,
94
+ useChatSession,
95
+ useChatSocket,
96
+ default6 as useChatStore,
97
+ useFacebookNotice,
98
+ useLatestMessageId,
99
+ useZaloConnection
100
+ };