react-native-chatbot-ai 0.1.19 → 0.1.22

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 (263) hide show
  1. package/lib/module/components/Drawer/DeleteSessionPopup.js +113 -0
  2. package/lib/module/components/Drawer/DeleteSessionPopup.js.map +1 -0
  3. package/lib/module/components/Drawer/DrawerContent.js +21 -8
  4. package/lib/module/components/Drawer/DrawerContent.js.map +1 -1
  5. package/lib/module/components/Drawer/RenameSessionPopup.js +121 -0
  6. package/lib/module/components/Drawer/RenameSessionPopup.js.map +1 -0
  7. package/lib/module/components/Drawer/SearchInput.js +10 -3
  8. package/lib/module/components/Drawer/SearchInput.js.map +1 -1
  9. package/lib/module/components/Drawer/SessionItem.js +36 -20
  10. package/lib/module/components/Drawer/SessionItem.js.map +1 -1
  11. package/lib/module/components/Drawer/SessionList.js +2 -5
  12. package/lib/module/components/Drawer/SessionList.js.map +1 -1
  13. package/lib/module/components/Drawer/SessionOptionsBottomSheet.js +129 -0
  14. package/lib/module/components/Drawer/SessionOptionsBottomSheet.js.map +1 -0
  15. package/lib/module/components/Drawer/ShareSessionPopup.js +132 -0
  16. package/lib/module/components/Drawer/ShareSessionPopup.js.map +1 -0
  17. package/lib/module/components/chat/ChatEmpty.js +15 -4
  18. package/lib/module/components/chat/ChatEmpty.js.map +1 -1
  19. package/lib/module/components/chat/ChatHeader.js +10 -4
  20. package/lib/module/components/chat/ChatHeader.js.map +1 -1
  21. package/lib/module/components/chat/ChatMessageList.js +75 -24
  22. package/lib/module/components/chat/ChatMessageList.js.map +1 -1
  23. package/lib/module/components/chat/SuggestionItem.js +2 -1
  24. package/lib/module/components/chat/SuggestionItem.js.map +1 -1
  25. package/lib/module/components/chat/footer/index.js +77 -15
  26. package/lib/module/components/chat/footer/index.js.map +1 -1
  27. package/lib/module/components/chat/footer/item/UploadImageItem.js +21 -1
  28. package/lib/module/components/chat/footer/item/UploadImageItem.js.map +1 -1
  29. package/lib/module/components/chat/index.js +7 -6
  30. package/lib/module/components/chat/index.js.map +1 -1
  31. package/lib/module/components/chat/item/ChatAIAnswerMessageItem.js +36 -5
  32. package/lib/module/components/chat/item/ChatAIAnswerMessageItem.js.map +1 -1
  33. package/lib/module/components/chat/item/DeeplinkItem.js +30 -2
  34. package/lib/module/components/chat/item/DeeplinkItem.js.map +1 -1
  35. package/lib/module/components/chat/item/MessageActionsBar.js +243 -0
  36. package/lib/module/components/chat/item/MessageActionsBar.js.map +1 -0
  37. package/lib/module/components/chat/item/actions/ActionButton.js +56 -0
  38. package/lib/module/components/chat/item/actions/ActionButton.js.map +1 -0
  39. package/lib/module/components/portal/BottomSheet.js +245 -0
  40. package/lib/module/components/portal/BottomSheet.js.map +1 -0
  41. package/lib/module/components/portal/Popup.js +278 -0
  42. package/lib/module/components/portal/Popup.js.map +1 -0
  43. package/lib/module/components/portal/index.js +11 -5
  44. package/lib/module/components/portal/index.js.map +1 -1
  45. package/lib/module/components/product/CardHorizontal.js +44 -7
  46. package/lib/module/components/product/CardHorizontal.js.map +1 -1
  47. package/lib/module/constants/events.js +33 -0
  48. package/lib/module/constants/events.js.map +1 -1
  49. package/lib/module/constants/index.js +5 -1
  50. package/lib/module/constants/index.js.map +1 -1
  51. package/lib/module/constants/query.js +5 -1
  52. package/lib/module/constants/query.js.map +1 -1
  53. package/lib/module/context/ChatContext.js +9 -3
  54. package/lib/module/context/ChatContext.js.map +1 -1
  55. package/lib/module/hooks/message/useSendMessage.js +21 -3
  56. package/lib/module/hooks/message/useSendMessage.js.map +1 -1
  57. package/lib/module/hooks/message/useStreamMessage.js +10 -3
  58. package/lib/module/hooks/message/useStreamMessage.js.map +1 -1
  59. package/lib/module/hooks/messageActions/index.js +13 -0
  60. package/lib/module/hooks/messageActions/index.js.map +1 -0
  61. package/lib/module/hooks/messageActions/useAudioPlayer.js +269 -0
  62. package/lib/module/hooks/messageActions/useAudioPlayer.js.map +1 -0
  63. package/lib/module/hooks/messageActions/useCopyToClipboard.js +38 -0
  64. package/lib/module/hooks/messageActions/useCopyToClipboard.js.map +1 -0
  65. package/lib/module/hooks/messageActions/useFeedback.js +93 -0
  66. package/lib/module/hooks/messageActions/useFeedback.js.map +1 -0
  67. package/lib/module/hooks/messageActions/useSendFeedback.js +24 -0
  68. package/lib/module/hooks/messageActions/useSendFeedback.js.map +1 -0
  69. package/lib/module/hooks/messageActions/useShareMessage.js +128 -0
  70. package/lib/module/hooks/messageActions/useShareMessage.js.map +1 -0
  71. package/lib/module/hooks/session/useDeleteSession.js +23 -0
  72. package/lib/module/hooks/session/useDeleteSession.js.map +1 -0
  73. package/lib/module/hooks/session/useRenameSession.js +28 -0
  74. package/lib/module/hooks/session/useRenameSession.js.map +1 -0
  75. package/lib/module/hooks/session/useSearchSessions.js +5 -1
  76. package/lib/module/hooks/session/useSearchSessions.js.map +1 -1
  77. package/lib/module/hooks/session/useShareSession.js +16 -0
  78. package/lib/module/hooks/session/useShareSession.js.map +1 -0
  79. package/lib/module/hooks/upload/useImageUpload.js +2 -1
  80. package/lib/module/hooks/upload/useImageUpload.js.map +1 -1
  81. package/lib/module/services/endpoints.js +6 -1
  82. package/lib/module/services/endpoints.js.map +1 -1
  83. package/lib/module/services/index.js +1 -0
  84. package/lib/module/services/index.js.map +1 -1
  85. package/lib/module/services/playbackService.js +22 -0
  86. package/lib/module/services/playbackService.js.map +1 -0
  87. package/lib/module/store/audioPlayer.js +75 -0
  88. package/lib/module/store/audioPlayer.js.map +1 -0
  89. package/lib/module/store/messageActions.js +160 -0
  90. package/lib/module/store/messageActions.js.map +1 -0
  91. package/lib/module/store/session.js +6 -3
  92. package/lib/module/store/session.js.map +1 -1
  93. package/lib/module/translation/index.js +21 -25
  94. package/lib/module/translation/index.js.map +1 -1
  95. package/lib/module/translation/resources/i18n.js +39 -0
  96. package/lib/module/translation/resources/i18n.js.map +1 -0
  97. package/lib/module/types/chat.js +12 -1
  98. package/lib/module/types/chat.js.map +1 -1
  99. package/lib/module/types/index.js +1 -0
  100. package/lib/module/types/index.js.map +1 -1
  101. package/lib/module/types/messageActions.js +56 -0
  102. package/lib/module/types/messageActions.js.map +1 -0
  103. package/lib/module/utils/textCleaner.js +67 -0
  104. package/lib/module/utils/textCleaner.js.map +1 -0
  105. package/lib/module/utils/ui.js +27 -1
  106. package/lib/module/utils/ui.js.map +1 -1
  107. package/lib/typescript/src/components/Drawer/DeleteSessionPopup.d.ts +3 -0
  108. package/lib/typescript/src/components/Drawer/DeleteSessionPopup.d.ts.map +1 -0
  109. package/lib/typescript/src/components/Drawer/DrawerContent.d.ts.map +1 -1
  110. package/lib/typescript/src/components/Drawer/RenameSessionPopup.d.ts +3 -0
  111. package/lib/typescript/src/components/Drawer/RenameSessionPopup.d.ts.map +1 -0
  112. package/lib/typescript/src/components/Drawer/SearchInput.d.ts.map +1 -1
  113. package/lib/typescript/src/components/Drawer/SessionItem.d.ts.map +1 -1
  114. package/lib/typescript/src/components/Drawer/SessionList.d.ts.map +1 -1
  115. package/lib/typescript/src/components/Drawer/SessionOptionsBottomSheet.d.ts +3 -0
  116. package/lib/typescript/src/components/Drawer/SessionOptionsBottomSheet.d.ts.map +1 -0
  117. package/lib/typescript/src/components/Drawer/ShareSessionPopup.d.ts +3 -0
  118. package/lib/typescript/src/components/Drawer/ShareSessionPopup.d.ts.map +1 -0
  119. package/lib/typescript/src/components/chat/ChatEmpty.d.ts.map +1 -1
  120. package/lib/typescript/src/components/chat/ChatHeader.d.ts.map +1 -1
  121. package/lib/typescript/src/components/chat/ChatMessageList.d.ts.map +1 -1
  122. package/lib/typescript/src/components/chat/SuggestionItem.d.ts +3 -2
  123. package/lib/typescript/src/components/chat/SuggestionItem.d.ts.map +1 -1
  124. package/lib/typescript/src/components/chat/footer/index.d.ts.map +1 -1
  125. package/lib/typescript/src/components/chat/footer/item/UploadImageItem.d.ts.map +1 -1
  126. package/lib/typescript/src/components/chat/index.d.ts.map +1 -1
  127. package/lib/typescript/src/components/chat/item/ChatAIAnswerMessageItem.d.ts.map +1 -1
  128. package/lib/typescript/src/components/chat/item/DeeplinkItem.d.ts +2 -1
  129. package/lib/typescript/src/components/chat/item/DeeplinkItem.d.ts.map +1 -1
  130. package/lib/typescript/src/components/chat/item/MessageActionsBar.d.ts +16 -0
  131. package/lib/typescript/src/components/chat/item/MessageActionsBar.d.ts.map +1 -0
  132. package/lib/typescript/src/components/chat/item/actions/ActionButton.d.ts +19 -0
  133. package/lib/typescript/src/components/chat/item/actions/ActionButton.d.ts.map +1 -0
  134. package/lib/typescript/src/components/portal/BottomSheet.d.ts +8 -0
  135. package/lib/typescript/src/components/portal/BottomSheet.d.ts.map +1 -0
  136. package/lib/typescript/src/components/portal/Popup.d.ts +4 -0
  137. package/lib/typescript/src/components/portal/Popup.d.ts.map +1 -0
  138. package/lib/typescript/src/components/portal/index.d.ts.map +1 -1
  139. package/lib/typescript/src/components/product/CardHorizontal.d.ts +3 -2
  140. package/lib/typescript/src/components/product/CardHorizontal.d.ts.map +1 -1
  141. package/lib/typescript/src/constants/events.d.ts +33 -0
  142. package/lib/typescript/src/constants/events.d.ts.map +1 -1
  143. package/lib/typescript/src/constants/index.d.ts +5 -1
  144. package/lib/typescript/src/constants/index.d.ts.map +1 -1
  145. package/lib/typescript/src/constants/query.d.ts +4 -0
  146. package/lib/typescript/src/constants/query.d.ts.map +1 -1
  147. package/lib/typescript/src/context/ChatContext.d.ts.map +1 -1
  148. package/lib/typescript/src/hooks/message/useSendMessage.d.ts +2 -2
  149. package/lib/typescript/src/hooks/message/useSendMessage.d.ts.map +1 -1
  150. package/lib/typescript/src/hooks/message/useStreamMessage.d.ts.map +1 -1
  151. package/lib/typescript/src/hooks/messageActions/index.d.ts +10 -0
  152. package/lib/typescript/src/hooks/messageActions/index.d.ts.map +1 -0
  153. package/lib/typescript/src/hooks/messageActions/useAudioPlayer.d.ts +14 -0
  154. package/lib/typescript/src/hooks/messageActions/useAudioPlayer.d.ts.map +1 -0
  155. package/lib/typescript/src/hooks/messageActions/useCopyToClipboard.d.ts +9 -0
  156. package/lib/typescript/src/hooks/messageActions/useCopyToClipboard.d.ts.map +1 -0
  157. package/lib/typescript/src/hooks/messageActions/useFeedback.d.ts +18 -0
  158. package/lib/typescript/src/hooks/messageActions/useFeedback.d.ts.map +1 -0
  159. package/lib/typescript/src/hooks/messageActions/useSendFeedback.d.ts +6 -0
  160. package/lib/typescript/src/hooks/messageActions/useSendFeedback.d.ts.map +1 -0
  161. package/lib/typescript/src/hooks/messageActions/useShareMessage.d.ts +12 -0
  162. package/lib/typescript/src/hooks/messageActions/useShareMessage.d.ts.map +1 -0
  163. package/lib/typescript/src/hooks/session/useDeleteSession.d.ts +2 -0
  164. package/lib/typescript/src/hooks/session/useDeleteSession.d.ts.map +1 -0
  165. package/lib/typescript/src/hooks/session/useRenameSession.d.ts +2 -0
  166. package/lib/typescript/src/hooks/session/useRenameSession.d.ts.map +1 -0
  167. package/lib/typescript/src/hooks/session/useSearchSessions.d.ts +1 -1
  168. package/lib/typescript/src/hooks/session/useSearchSessions.d.ts.map +1 -1
  169. package/lib/typescript/src/hooks/session/useShareSession.d.ts +2 -0
  170. package/lib/typescript/src/hooks/session/useShareSession.d.ts.map +1 -0
  171. package/lib/typescript/src/hooks/upload/useImageUpload.d.ts +1 -1
  172. package/lib/typescript/src/hooks/upload/useImageUpload.d.ts.map +1 -1
  173. package/lib/typescript/src/services/endpoints.d.ts +5 -0
  174. package/lib/typescript/src/services/endpoints.d.ts.map +1 -1
  175. package/lib/typescript/src/services/index.d.ts +1 -0
  176. package/lib/typescript/src/services/index.d.ts.map +1 -1
  177. package/lib/typescript/src/services/playbackService.d.ts +2 -0
  178. package/lib/typescript/src/services/playbackService.d.ts.map +1 -0
  179. package/lib/typescript/src/store/audioPlayer.d.ts +27 -0
  180. package/lib/typescript/src/store/audioPlayer.d.ts.map +1 -0
  181. package/lib/typescript/src/store/messageActions.d.ts +9 -0
  182. package/lib/typescript/src/store/messageActions.d.ts.map +1 -0
  183. package/lib/typescript/src/store/session.d.ts.map +1 -1
  184. package/lib/typescript/src/translation/index.d.ts +3 -4
  185. package/lib/typescript/src/translation/index.d.ts.map +1 -1
  186. package/lib/typescript/src/translation/resources/i18n.d.ts +5 -0
  187. package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -0
  188. package/lib/typescript/src/types/chat.d.ts +16 -1
  189. package/lib/typescript/src/types/chat.d.ts.map +1 -1
  190. package/lib/typescript/src/types/dto.d.ts +11 -0
  191. package/lib/typescript/src/types/dto.d.ts.map +1 -1
  192. package/lib/typescript/src/types/index.d.ts +1 -0
  193. package/lib/typescript/src/types/index.d.ts.map +1 -1
  194. package/lib/typescript/src/types/messageActions.d.ts +85 -0
  195. package/lib/typescript/src/types/messageActions.d.ts.map +1 -0
  196. package/lib/typescript/src/types/ui.d.ts +16 -1
  197. package/lib/typescript/src/types/ui.d.ts.map +1 -1
  198. package/lib/typescript/src/utils/textCleaner.d.ts +30 -0
  199. package/lib/typescript/src/utils/textCleaner.d.ts.map +1 -0
  200. package/lib/typescript/src/utils/ui.d.ts +12 -1
  201. package/lib/typescript/src/utils/ui.d.ts.map +1 -1
  202. package/package.json +6 -6
  203. package/src/components/Drawer/DeleteSessionPopup.tsx +121 -0
  204. package/src/components/Drawer/DrawerContent.tsx +23 -7
  205. package/src/components/Drawer/RenameSessionPopup.tsx +145 -0
  206. package/src/components/Drawer/SearchInput.tsx +11 -2
  207. package/src/components/Drawer/SessionItem.tsx +22 -8
  208. package/src/components/Drawer/SessionList.tsx +0 -2
  209. package/src/components/Drawer/SessionOptionsBottomSheet.tsx +138 -0
  210. package/src/components/Drawer/ShareSessionPopup.tsx +145 -0
  211. package/src/components/chat/ChatEmpty.tsx +15 -5
  212. package/src/components/chat/ChatHeader.tsx +9 -4
  213. package/src/components/chat/ChatMessageList.tsx +78 -18
  214. package/src/components/chat/SuggestionItem.tsx +4 -3
  215. package/src/components/chat/footer/index.tsx +95 -14
  216. package/src/components/chat/footer/item/UploadImageItem.tsx +21 -1
  217. package/src/components/chat/index.tsx +8 -11
  218. package/src/components/chat/item/ChatAIAnswerMessageItem.tsx +55 -6
  219. package/src/components/chat/item/DeeplinkItem.tsx +30 -2
  220. package/src/components/chat/item/MessageActionsBar.tsx +326 -0
  221. package/src/components/chat/item/actions/ActionButton.tsx +65 -0
  222. package/src/components/portal/BottomSheet.tsx +307 -0
  223. package/src/components/portal/Popup.tsx +345 -0
  224. package/src/components/portal/index.tsx +5 -1
  225. package/src/components/product/CardHorizontal.tsx +45 -10
  226. package/src/constants/events.ts +34 -0
  227. package/src/constants/index.ts +6 -1
  228. package/src/constants/query.ts +4 -0
  229. package/src/context/ChatContext.tsx +6 -0
  230. package/src/hooks/message/useSendMessage.ts +47 -4
  231. package/src/hooks/message/useStreamMessage.ts +15 -4
  232. package/src/hooks/messageActions/index.ts +10 -0
  233. package/src/hooks/messageActions/useAudioPlayer.ts +346 -0
  234. package/src/hooks/messageActions/useCopyToClipboard.ts +38 -0
  235. package/src/hooks/messageActions/useFeedback.ts +114 -0
  236. package/src/hooks/messageActions/useSendFeedback.ts +31 -0
  237. package/src/hooks/messageActions/useShareMessage.ts +146 -0
  238. package/src/hooks/session/useDeleteSession.ts +25 -0
  239. package/src/hooks/session/useRenameSession.ts +37 -0
  240. package/src/hooks/session/useSearchSessions.ts +6 -1
  241. package/src/hooks/session/useShareSession.ts +22 -0
  242. package/src/hooks/upload/useImageUpload.ts +6 -2
  243. package/src/ignore.d.ts +20 -1
  244. package/src/services/endpoints.ts +10 -0
  245. package/src/services/index.ts +1 -0
  246. package/src/services/playbackService.ts +22 -0
  247. package/src/store/audioPlayer.ts +112 -0
  248. package/src/store/messageActions.ts +161 -0
  249. package/src/store/session.ts +4 -2
  250. package/src/translation/index.ts +27 -19
  251. package/src/translation/resources/i18n.ts +45 -0
  252. package/src/types/chat.ts +21 -1
  253. package/src/types/dto.ts +14 -0
  254. package/src/types/index.ts +1 -0
  255. package/src/types/messageActions.ts +131 -0
  256. package/src/types/ui.ts +19 -1
  257. package/src/utils/textCleaner.ts +65 -0
  258. package/src/utils/ui.tsx +29 -2
  259. package/lib/module/translation/resources/vi.js +0 -12
  260. package/lib/module/translation/resources/vi.js.map +0 -1
  261. package/lib/typescript/src/translation/resources/vi.d.ts +0 -11
  262. package/lib/typescript/src/translation/resources/vi.d.ts.map +0 -1
  263. package/src/translation/resources/vi.ts +0 -10
@@ -4,12 +4,13 @@ import { useCallback } from 'react';
4
4
  import { useQueryClient } from '@tanstack/react-query';
5
5
  import useSessionStore from "../../store/session.js";
6
6
  import { useStreamMessage } from "./useStreamMessage.js";
7
- import { events } from "../../constants/events.js";
7
+ import { events, GAEvents } from "../../constants/events.js";
8
8
  import { DeviceEventEmitter } from 'react-native';
9
9
  import { MessageType, RoleType } from "../../types/index.js";
10
10
  import dayjs from 'dayjs';
11
11
  import { useCreateSession } from "../session/useCreateSession.js";
12
12
  import { QUERY_KEYS } from "../../constants/query.js";
13
+ import { useChatContext } from "../../context/ChatContext.js";
13
14
  export const useSendMessage = () => {
14
15
  const {
15
16
  startStream,
@@ -20,7 +21,8 @@ export const useSendMessage = () => {
20
21
  mutateAsync: createSession
21
22
  } = useCreateSession();
22
23
  const queryClient = useQueryClient();
23
- const onSendMessage = useCallback(async (message, attachments) => {
24
+ const logGA = useChatContext().logGA;
25
+ const onSendMessage = useCallback(async (message, attachments, actionType) => {
24
26
  const messageId = dayjs().valueOf().toString();
25
27
  const messageItem = {
26
28
  id: messageId,
@@ -52,6 +54,22 @@ export const useSendMessage = () => {
52
54
  refetchPage: (_page, index) => index === 0
53
55
  });
54
56
  }
57
+ logGA(GAEvents.chatDetailSendBtnTap, {
58
+ chat_type: useSessionStore.getState().sessionLogType,
59
+ conversation_id: latestSessionId || useSessionStore.getState().sessionId,
60
+ action_type: actionType
61
+ });
62
+ if (attachments?.length && attachments.length > 0) {
63
+ const totalFileCount = attachments.filter(i => i.type === 'file').length;
64
+ const totalImageCount = attachments.filter(i => i.type === 'image').length;
65
+ const fileType = [totalFileCount > 0 ? 'file' : null, totalImageCount > 0 ? 'image' : null].filter(Boolean).join(', ');
66
+ logGA(GAEvents.chatDetailMultimodalTap, {
67
+ conversation_id: latestSessionId || useSessionStore.getState().sessionId,
68
+ file_type: fileType,
69
+ total_image_count: totalImageCount,
70
+ total_file_count: totalFileCount
71
+ });
72
+ }
55
73
  startStream({
56
74
  content: message,
57
75
  stream: true,
@@ -61,7 +79,7 @@ export const useSendMessage = () => {
61
79
  },
62
80
  manual_retry_attempts: 0
63
81
  }, latestSessionId, messageId);
64
- }, [startStream, createSession, queryClient]);
82
+ }, [startStream, createSession, queryClient, logGA]);
65
83
  return {
66
84
  onSendMessage,
67
85
  stopStream,
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useQueryClient","useSessionStore","useStreamMessage","events","DeviceEventEmitter","MessageType","RoleType","dayjs","useCreateSession","QUERY_KEYS","useSendMessage","startStream","stopStream","retryStream","mutateAsync","createSession","queryClient","onSendMessage","message","attachments","messageId","valueOf","toString","messageItem","id","type","user_message","created_at","toISOString","modified_at","content","additional_kwargs","response_metadata","name","role","user","metadata","manual_retry_attempts","group_suggestion_id","emit","updateOneMessage","latestSessionId","getState","sessionId","resSession","title","setSessionId","refetchQueries","queryKey","SEARCH_SESSIONS","refetchPage","_page","index","stream","source"],"sourceRoot":"../../../../src","sources":["hooks/message/useSendMessage.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,cAAc,QAAQ,uBAAuB;AACtD,OAAOC,eAAe,MAAM,wBAAqB;AACjD,SAASC,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,MAAM,QAAQ,2BAAwB;AAC/C,SAASC,kBAAkB,QAAQ,cAAc;AACjD,SAAoCC,WAAW,EAAEC,QAAQ,QAAQ,sBAAa;AAC9E,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,gBAAgB,QAAQ,gCAA6B;AAC9D,SAASC,UAAU,QAAQ,0BAAuB;AAIlD,OAAO,MAAMC,cAAc,GAAGA,CAAA,KAAM;EAClC,MAAM;IAAEC,WAAW;IAAEC,UAAU;IAAEC;EAAY,CAAC,GAAGX,gBAAgB,CAAC,CAAC;EACnE,MAAM;IAAEY,WAAW,EAAEC;EAAc,CAAC,GAAGP,gBAAgB,CAAC,CAAC;EACzD,MAAMQ,WAAW,GAAGhB,cAAc,CAAC,CAAC;EACpC,MAAMiB,aAAa,GAAGlB,WAAW,CAC/B,OAAOmB,OAAe,EAAEC,WAA2B,KAAK;IACtD,MAAMC,SAAS,GAAGb,KAAK,CAAC,CAAC,CAACc,OAAO,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;IAC9C,MAAMC,WAAyB,GAAG;MAChCC,EAAE,EAAEJ,SAAS;MACbD,WAAW,EAAEA,WAAW,IAAI,EAAE;MAC9BM,IAAI,EAAEpB,WAAW,CAACqB,YAAY;MAC9BC,UAAU,EAAEpB,KAAK,CAAC,CAAC,CAACqB,WAAW,CAAC,CAAC;MACjCC,WAAW,EAAEtB,KAAK,CAAC,CAAC,CAACqB,WAAW,CAAC,CAAC;MAClCE,OAAO,EAAEZ,OAAO;MAChBa,iBAAiB,EAAE,CAAC,CAAC;MACrBC,iBAAiB,EAAE,CAAC,CAAC;MACrBC,IAAI,EAAE,IAAI;MACVC,IAAI,EAAE5B,QAAQ,CAAC6B,IAAI;MACnBC,QAAQ,EAAE,CAAC,CAAC;MACZC,qBAAqB,EAAE,CAAC;MACxBC,mBAAmB,EAAE;IACvB,CAAC;IACDlC,kBAAkB,CAACmC,IAAI,CAACpC,MAAM,CAACqC,gBAAgB,EAAEjB,WAAW,CAAC;IAE7D,IAAIkB,eAAe;IACnB,IAAI,CAACxC,eAAe,CAACyC,QAAQ,CAAC,CAAC,CAACC,SAAS,EAAE;MACzC,MAAMC,UAAU,GAAG,MAAM7B,aAAa,CAAC;QAAE8B,KAAK,EAAE3B;MAAQ,CAAC,CAAC;MAC1D,IAAI,CAAC0B,UAAU,EAAE;MACjB3C,eAAe,CAACyC,QAAQ,CAAC,CAAC,CAACI,YAAY,CAACF,UAAU,CAACpB,EAAE,CAAC;MACtDiB,eAAe,GAAGG,UAAU,CAACpB,EAAE;MAC/B;MACAR,WAAW,CAAC+B,cAAc,CAAC;QACzBC,QAAQ,EAAE,CAACvC,UAAU,CAACwC,eAAe,CAAC;QACtCC,WAAW,EAAEA,CACXC,KAA2C,EAC3CC,KAAa,KACVA,KAAK,KAAK;MACjB,CAAC,CAAC;IACJ;IACAzC,WAAW,CACT;MACEmB,OAAO,EAAEZ,OAAO;MAChBmC,MAAM,EAAE,IAAI;MACZlC,WAAW,EAAEA,WAAW,IAAI,EAAE;MAC9BiB,QAAQ,EAAE;QACRkB,MAAM,EAAE;MACV,CAAC;MACDjB,qBAAqB,EAAE;IACzB,CAAC,EACDI,eAAe,EACfrB,SACF,CAAC;EACH,CAAC,EACD,CAACT,WAAW,EAAEI,aAAa,EAAEC,WAAW,CAC1C,CAAC;EAED,OAAO;IACLC,aAAa;IACbL,UAAU;IACVC;EACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useQueryClient","useSessionStore","useStreamMessage","events","GAEvents","DeviceEventEmitter","MessageType","RoleType","dayjs","useCreateSession","QUERY_KEYS","useChatContext","useSendMessage","startStream","stopStream","retryStream","mutateAsync","createSession","queryClient","logGA","onSendMessage","message","attachments","actionType","messageId","valueOf","toString","messageItem","id","type","user_message","created_at","toISOString","modified_at","content","additional_kwargs","response_metadata","name","role","user","metadata","manual_retry_attempts","group_suggestion_id","emit","updateOneMessage","latestSessionId","getState","sessionId","resSession","title","setSessionId","refetchQueries","queryKey","SEARCH_SESSIONS","refetchPage","_page","index","chatDetailSendBtnTap","chat_type","sessionLogType","conversation_id","action_type","length","totalFileCount","filter","i","totalImageCount","fileType","Boolean","join","chatDetailMultimodalTap","file_type","total_image_count","total_file_count","stream","source"],"sourceRoot":"../../../../src","sources":["hooks/message/useSendMessage.ts"],"mappings":"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","ignoreList":[]}
@@ -3,18 +3,20 @@
3
3
  import { useEffect, useRef, useCallback } from 'react';
4
4
  import { useChatContext } from "../../context/ChatContext.js";
5
5
  import { ENDPOINTS } from "../../services/endpoints.js";
6
+ import { SendActionLogType } from "../../types/index.js";
6
7
  import EventSource from 'react-native-sse';
7
8
  import useStreamMessageStore from "../../store/streamMessage.js";
8
9
  import throttle from 'lodash/throttle';
9
10
  import { DeviceEventEmitter } from 'react-native';
10
- import { events } from "../../constants/events.js";
11
+ import { events, GAEvents } from "../../constants/events.js";
11
12
  import useSessionStore from "../../store/session.js";
12
13
  export const useStreamMessage = () => {
13
14
  const sessionId = useSessionStore(state => state.sessionId);
14
15
  const esRef = useRef(null);
15
16
  const sessionIdRef = useRef(sessionId);
16
17
  const {
17
- apiAddress
18
+ apiAddress,
19
+ logGA
18
20
  } = useChatContext();
19
21
  const setStreamMessage = useStreamMessageStore(state => state.setStreamMessage);
20
22
  const setIsStreaming = useStreamMessageStore(state => state.setIsStreaming);
@@ -118,6 +120,11 @@ export const useStreamMessage = () => {
118
120
  ...messageItem,
119
121
  metadata: {}
120
122
  });
123
+ logGA(GAEvents.chatDetailSendBtnTap, {
124
+ chat_type: useSessionStore.getState().sessionLogType,
125
+ conversation_id: sessionId,
126
+ action_type: SendActionLogType.retry
127
+ });
121
128
  startStream({
122
129
  content: messageItem.content,
123
130
  stream: true,
@@ -127,7 +134,7 @@ export const useStreamMessage = () => {
127
134
  },
128
135
  manual_retry_attempts: 0
129
136
  }, undefined, messageItem.id);
130
- }, [startStream]);
137
+ }, [startStream, logGA, sessionId]);
131
138
  useEffect(() => {
132
139
  return () => {
133
140
  stopStream();
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useCallback","useChatContext","ENDPOINTS","EventSource","useStreamMessageStore","throttle","DeviceEventEmitter","events","useSessionStore","useStreamMessage","sessionId","state","esRef","sessionIdRef","apiAddress","setStreamMessage","setIsStreaming","current","startStream","payload","latestSessionId","localMessageId","token","global","accessToken","currentSessionId","close","url","assistantService","getStreamMessage","es","method","headers","body","JSON","stringify","addEventListener","console","log","buffers","throttledFlush","emit","updateMultipleMessage","Object","values","map","m","content","leading","trailing","onStreamMessageEnd","isError","messageId","Promise","resolve","setTimeout","updateMessageError","id","metadata","needs_retry","original_message_id","status","forceUpdateMessages","event","data","parse","is_done","is_error","message_id","message","messages","join","error","err","stopStream","retryStream","messageItem","updateOneMessage","stream","attachments","source","manual_retry_attempts","undefined"],"sourceRoot":"../../../../src","sources":["hooks/message/useStreamMessage.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useCallback","useChatContext","ENDPOINTS","SendActionLogType","EventSource","useStreamMessageStore","throttle","DeviceEventEmitter","events","GAEvents","useSessionStore","useStreamMessage","sessionId","state","esRef","sessionIdRef","apiAddress","logGA","setStreamMessage","setIsStreaming","current","startStream","payload","latestSessionId","localMessageId","token","global","accessToken","currentSessionId","close","url","assistantService","getStreamMessage","es","method","headers","body","JSON","stringify","addEventListener","console","log","buffers","throttledFlush","emit","updateMultipleMessage","Object","values","map","m","content","leading","trailing","onStreamMessageEnd","isError","messageId","Promise","resolve","setTimeout","updateMessageError","id","metadata","needs_retry","original_message_id","status","forceUpdateMessages","event","data","parse","is_done","is_error","message_id","message","messages","join","error","err","stopStream","retryStream","messageItem","updateOneMessage","chatDetailSendBtnTap","chat_type","getState","sessionLogType","conversation_id","action_type","retry","stream","attachments","source","manual_retry_attempts","undefined"],"sourceRoot":"../../../../src","sources":["hooks/message/useStreamMessage.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Message Actions Hooks
5
+ * Barrel export for all message action hooks
6
+ */
7
+
8
+ export { useFeedback } from "./useFeedback.js";
9
+ export { useCopyToClipboard } from "./useCopyToClipboard.js";
10
+ export { useShareMessage } from "./useShareMessage.js";
11
+ export { useSendFeedback } from "./useSendFeedback.js";
12
+ export { useAudioPlayer } from "./useAudioPlayer.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useFeedback","useCopyToClipboard","useShareMessage","useSendFeedback","useAudioPlayer"],"sourceRoot":"../../../../src","sources":["hooks/messageActions/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAQ,kBAAe;AAC3C,SAASC,kBAAkB,QAAQ,yBAAsB;AACzD,SAASC,eAAe,QAAQ,sBAAmB;AACnD,SAASC,eAAe,QAAQ,sBAAmB;AACnD,SAASC,cAAc,QAAQ,qBAAkB","ignoreList":[]}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useAudioPlayer Hook - react-native-track-player version
5
+ */
6
+ import { useCallback, useEffect } from 'react';
7
+ import TrackPlayer, { Event, Capability, State } from 'react-native-track-player';
8
+ import ReactNativeBlobUtil from 'react-native-blob-util';
9
+ import { apiInstance } from "../../services/apis.js";
10
+ import { ENDPOINTS } from "../../services/endpoints.js";
11
+ import useAudioPlayerStore from "../../store/audioPlayer.js";
12
+ import useSessionStore from "../../store/session.js";
13
+ import { PlaybackService } from "../../services/index.js";
14
+ import { useChatContext } from "../../context/ChatContext.js";
15
+ import { GAEvents } from "../../constants/events.js";
16
+ // Register playback service BEFORE setupPlayer
17
+ TrackPlayer.registerPlaybackService(() => PlaybackService);
18
+
19
+ // --- INIT PLAYER ONE TIME ---
20
+ let playerInitialized = false;
21
+ const setupPlayer = async () => {
22
+ if (playerInitialized) return;
23
+ try {
24
+ await TrackPlayer.setupPlayer();
25
+ await TrackPlayer.updateOptions({
26
+ capabilities: [Capability.Play, Capability.Pause, Capability.Stop],
27
+ compactCapabilities: [Capability.Play, Capability.Pause],
28
+ notificationCapabilities: [Capability.Play, Capability.Pause, Capability.Stop]
29
+ });
30
+ playerInitialized = true;
31
+ } catch (e) {
32
+ console.error('Error initializing TrackPlayer:', e);
33
+ }
34
+ };
35
+ export const useAudioPlayer = ({
36
+ messageId
37
+ }) => {
38
+ const logGA = useChatContext().logGA;
39
+ const sessionId = useSessionStore().sessionId;
40
+ const {
41
+ currentMessageId,
42
+ currentSessionId,
43
+ isPlaying,
44
+ isLoading,
45
+ error,
46
+ setCurrentMessage,
47
+ setIsPlaying,
48
+ setIsLoading,
49
+ setError,
50
+ cacheAudioUrl,
51
+ getCachedAudioUrl,
52
+ stopPlayback: storeStopPlayback
53
+ } = useAudioPlayerStore();
54
+ const isThisMessagePlaying = currentMessageId === messageId && isPlaying;
55
+ const isThisMessageLoading = currentMessageId === messageId && isLoading;
56
+ const isThisMessagePaused = currentMessageId === messageId && !isPlaying && !isLoading;
57
+
58
+ // === FETCH AUDIO ===
59
+ const fetchAudio = useCallback(async (sid, mid) => {
60
+ try {
61
+ const cachedPath = getCachedAudioUrl(mid);
62
+ if (cachedPath) {
63
+ const exists = await ReactNativeBlobUtil.fs.exists(cachedPath);
64
+ if (exists) return cachedPath;
65
+ }
66
+ const endpoint = ENDPOINTS.assistantService.generateAudio(sid, mid);
67
+ const baseURL = apiInstance?.defaults?.baseURL || '';
68
+ const fullUrl = `${baseURL}${endpoint}`;
69
+ const token = global?.accessToken;
70
+ if (!token) throw new Error('Missing access token');
71
+ const headers = {
72
+ 'Authorization': `Bearer ${token}`,
73
+ 'Accept': 'application/json',
74
+ 'Content-Type': 'application/json'
75
+ };
76
+ const dirs = ReactNativeBlobUtil.fs.dirs;
77
+ const audioDir = `${dirs.CacheDir}/chatbot_audio`;
78
+ const filePath = `${audioDir}/${mid}.mp3`;
79
+ const dirExists = await ReactNativeBlobUtil.fs.exists(audioDir);
80
+ if (!dirExists) await ReactNativeBlobUtil.fs.mkdir(audioDir);
81
+ const response = await ReactNativeBlobUtil.config({
82
+ path: filePath,
83
+ fileCache: true
84
+ }).fetch('GET', fullUrl, headers);
85
+ if (response.info().status !== 200) {
86
+ const text = await response.text();
87
+ throw new Error(`Server error: ${response.info().status} - ${text}`);
88
+ }
89
+ const path = response.path();
90
+ const stat = await ReactNativeBlobUtil.fs.stat(path);
91
+ if (stat.size === 0) throw new Error('Downloaded file is empty');
92
+ cacheAudioUrl(mid, path);
93
+ return path;
94
+ } catch (err) {
95
+ const msg = err?.response?.data?.message || err?.message || 'Failed to fetch audio';
96
+ console.error('Fetch audio error:', msg);
97
+ throw new Error(msg);
98
+ }
99
+ }, [getCachedAudioUrl, cacheAudioUrl]);
100
+
101
+ // === PLAY AUDIO ===
102
+ const playAudio = useCallback(async audioPath => {
103
+ try {
104
+ await setupPlayer();
105
+ await TrackPlayer.reset();
106
+ const track = {
107
+ id: messageId,
108
+ url: `file://${audioPath}`,
109
+ title: `Message Audio`,
110
+ artist: 'Assistant'
111
+ };
112
+ await TrackPlayer.add([track]);
113
+ await TrackPlayer.play();
114
+ setIsPlaying(true);
115
+ } catch (err) {
116
+ console.error('Failed to play audio:', err);
117
+ throw new Error('Không thể phát âm thanh');
118
+ }
119
+ }, [messageId, setIsPlaying]);
120
+
121
+ // === PAUSE ===
122
+ const pauseAudio = useCallback(async () => {
123
+ try {
124
+ await TrackPlayer.pause();
125
+ setIsPlaying(false);
126
+ } catch (e) {
127
+ console.warn('Pause failed:', e);
128
+ }
129
+ }, [setIsPlaying]);
130
+
131
+ // === STOP ===
132
+ const stopPlayback = useCallback(async () => {
133
+ try {
134
+ await TrackPlayer.stop();
135
+ await TrackPlayer.reset();
136
+ storeStopPlayback();
137
+ } catch (e) {
138
+ console.warn('Stop failed:', e);
139
+ }
140
+ }, [storeStopPlayback]);
141
+
142
+ // === TOGGLE ===
143
+ const togglePlayback = useCallback(async () => {
144
+ try {
145
+ if (!sessionId) throw new Error('No session ID');
146
+
147
+ // Case 1: Click on the SAME message that is currently playing → Pause it
148
+ if (isThisMessagePlaying) {
149
+ await pauseAudio();
150
+ logGA(GAEvents.chatDetailVoiceBtnTap, {
151
+ conversation_id: sessionId,
152
+ message_id: messageId,
153
+ button_status: 'stop',
154
+ duration: 0
155
+ });
156
+ return;
157
+ }
158
+
159
+ // Case 2: Click on the SAME message that was paused → Resume it
160
+ if (currentMessageId === messageId && !isPlaying) {
161
+ await TrackPlayer.play();
162
+ setIsPlaying(true);
163
+ logGA(GAEvents.chatDetailVoiceBtnTap, {
164
+ conversation_id: sessionId,
165
+ message_id: messageId,
166
+ button_status: 'start',
167
+ duration: 0
168
+ });
169
+ return;
170
+ }
171
+
172
+ // Case 3: Click on a DIFFERENT message → Stop current and play new one
173
+ if (currentMessageId && currentMessageId !== messageId) {
174
+ await stopPlayback();
175
+ logGA(GAEvents.chatDetailVoiceBtnTap, {
176
+ conversation_id: sessionId,
177
+ message_id: messageId,
178
+ button_status: 'stop',
179
+ duration: 0
180
+ });
181
+ }
182
+
183
+ // Set new message as current and start loading
184
+ setCurrentMessage(messageId, sessionId);
185
+ setIsLoading(true);
186
+ setError(null);
187
+ const startStreamTime = Date.now();
188
+ const path = await fetchAudio(sessionId, messageId);
189
+ await playAudio(path);
190
+ logGA(GAEvents.chatDetailVoiceBtnTap, {
191
+ conversation_id: sessionId,
192
+ message_id: messageId,
193
+ button_status: 'start',
194
+ duration: (Date.now() - startStreamTime) / 1000
195
+ });
196
+ } catch (err) {
197
+ const msg = err?.message || 'Failed to play audio';
198
+ setError(msg);
199
+ setIsPlaying(false);
200
+ console.error('togglePlayback error:', msg);
201
+ } finally {
202
+ setIsLoading(false);
203
+ }
204
+ }, [sessionId, messageId, isThisMessagePlaying, currentMessageId, isPlaying, setCurrentMessage, setIsLoading, setError, setIsPlaying, fetchAudio, playAudio, pauseAudio, stopPlayback, logGA]);
205
+
206
+ // === PLAYER EVENTS ===
207
+ useEffect(() => {
208
+ // Listen for queue end
209
+ const queueEndSubscription = TrackPlayer.addEventListener(Event.PlaybackQueueEnded, () => {
210
+ if (currentMessageId === messageId) {
211
+ // Audio finished playing → reset to initial state
212
+ storeStopPlayback();
213
+ }
214
+ });
215
+
216
+ // Listen for playback state changes (from lock screen, control center, etc.)
217
+ const stateSubscription = TrackPlayer.addEventListener(Event.PlaybackState, async () => {
218
+ const state = await TrackPlayer.getState();
219
+
220
+ // Only update if this is the current message
221
+ if (currentMessageId === messageId) {
222
+ if (state === State.Playing) {
223
+ setIsPlaying(true);
224
+ } else if (state === State.Paused || state === State.Ready) {
225
+ setIsPlaying(false);
226
+ } else if (state === State.Stopped) {
227
+ storeStopPlayback();
228
+ }
229
+ }
230
+ });
231
+ return () => {
232
+ queueEndSubscription?.remove?.();
233
+ stateSubscription?.remove?.();
234
+ };
235
+ }, [currentMessageId, messageId, storeStopPlayback, setIsPlaying]);
236
+
237
+ // === CLEANUP CACHE WHEN SESSION CHANGES ===
238
+ const cleanupAudioCache = useCallback(async () => {
239
+ try {
240
+ const audioDir = `${ReactNativeBlobUtil.fs.dirs.CacheDir}/chatbot_audio`;
241
+ const exists = await ReactNativeBlobUtil.fs.exists(audioDir);
242
+ if (exists) await ReactNativeBlobUtil.fs.unlink(audioDir);
243
+ } catch (e) {
244
+ console.error('Cleanup cache error:', e);
245
+ }
246
+ }, []);
247
+ useEffect(() => {
248
+ if (currentSessionId && currentSessionId !== sessionId) {
249
+ if (currentMessageId === messageId) stopPlayback();
250
+ cleanupAudioCache();
251
+ }
252
+ }, [sessionId, currentSessionId, currentMessageId, messageId, stopPlayback, cleanupAudioCache]);
253
+ useEffect(() => {
254
+ return () => {
255
+ if (currentMessageId === messageId) {
256
+ stopPlayback();
257
+ }
258
+ };
259
+ }, [currentMessageId, messageId, stopPlayback]);
260
+ return {
261
+ isPlaying: isThisMessagePlaying,
262
+ isPaused: isThisMessagePaused,
263
+ isLoading: isThisMessageLoading,
264
+ error: currentMessageId === messageId ? error : null,
265
+ togglePlayback,
266
+ stopPlayback
267
+ };
268
+ };
269
+ //# sourceMappingURL=useAudioPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","TrackPlayer","Event","Capability","State","ReactNativeBlobUtil","apiInstance","ENDPOINTS","useAudioPlayerStore","useSessionStore","PlaybackService","useChatContext","GAEvents","registerPlaybackService","playerInitialized","setupPlayer","updateOptions","capabilities","Play","Pause","Stop","compactCapabilities","notificationCapabilities","e","console","error","useAudioPlayer","messageId","logGA","sessionId","currentMessageId","currentSessionId","isPlaying","isLoading","setCurrentMessage","setIsPlaying","setIsLoading","setError","cacheAudioUrl","getCachedAudioUrl","stopPlayback","storeStopPlayback","isThisMessagePlaying","isThisMessageLoading","isThisMessagePaused","fetchAudio","sid","mid","cachedPath","exists","fs","endpoint","assistantService","generateAudio","baseURL","defaults","fullUrl","token","global","accessToken","Error","headers","dirs","audioDir","CacheDir","filePath","dirExists","mkdir","response","config","path","fileCache","fetch","info","status","text","stat","size","err","msg","data","message","playAudio","audioPath","reset","track","id","url","title","artist","add","play","pauseAudio","pause","warn","stop","togglePlayback","chatDetailVoiceBtnTap","conversation_id","message_id","button_status","duration","startStreamTime","Date","now","queueEndSubscription","addEventListener","PlaybackQueueEnded","stateSubscription","PlaybackState","state","getState","Playing","Paused","Ready","Stopped","remove","cleanupAudioCache","unlink","isPaused"],"sourceRoot":"../../../../src","sources":["hooks/messageActions/useAudioPlayer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useCopyToClipboard Hook
5
+ * Custom hook for copying text to clipboard with markdown cleanup
6
+ */
7
+
8
+ import { useCallback, useState } from 'react';
9
+ import Clipboard from '@react-native-clipboard/clipboard';
10
+ import UIUtils from "../../utils/ui.js";
11
+ import { cleanMarkdown } from "../../utils/textCleaner.js";
12
+ export const useCopyToClipboard = () => {
13
+ const [isCopying, setIsCopying] = useState(false);
14
+ const copyToClipboard = useCallback(async text => {
15
+ if (!text || text.trim().length === 0) {
16
+ UIUtils.toast.showError('Không có nội dung để sao chép');
17
+ return;
18
+ }
19
+ try {
20
+ setIsCopying(true);
21
+
22
+ // Remove markdown formatting for cleaner copy
23
+ const cleanText = cleanMarkdown(text);
24
+ Clipboard.setString(cleanText);
25
+ UIUtils.toast.showSuccess('Đã sao chép vào clipboard');
26
+ } catch (error) {
27
+ console.error('Copy to clipboard error:', error);
28
+ UIUtils.toast.showError(error);
29
+ } finally {
30
+ setIsCopying(false);
31
+ }
32
+ }, []);
33
+ return {
34
+ copyToClipboard,
35
+ isCopying
36
+ };
37
+ };
38
+ //# sourceMappingURL=useCopyToClipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useState","Clipboard","UIUtils","cleanMarkdown","useCopyToClipboard","isCopying","setIsCopying","copyToClipboard","text","trim","length","toast","showError","cleanText","setString","showSuccess","error","console"],"sourceRoot":"../../../../src","sources":["hooks/messageActions/useCopyToClipboard.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAC7C,OAAOC,SAAS,MAAM,mCAAmC;AACzD,OAAOC,OAAO,MAAM,mBAAgB;AACpC,SAASC,aAAa,QAAQ,4BAAyB;AAEvD,OAAO,MAAMC,kBAAkB,GAAGA,CAAA,KAAM;EACtC,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAGN,QAAQ,CAAC,KAAK,CAAC;EAEjD,MAAMO,eAAe,GAAGR,WAAW,CAAC,MAAOS,IAAY,IAAK;IAC1D,IAAI,CAACA,IAAI,IAAIA,IAAI,CAACC,IAAI,CAAC,CAAC,CAACC,MAAM,KAAK,CAAC,EAAE;MACrCR,OAAO,CAACS,KAAK,CAACC,SAAS,CAAC,+BAA+B,CAAC;MACxD;IACF;IAEA,IAAI;MACFN,YAAY,CAAC,IAAI,CAAC;;MAElB;MACA,MAAMO,SAAS,GAAGV,aAAa,CAACK,IAAI,CAAC;MAErCP,SAAS,CAACa,SAAS,CAACD,SAAS,CAAC;MAE9BX,OAAO,CAACS,KAAK,CAACI,WAAW,CAAC,2BAA2B,CAAC;IACxD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,0BAA0B,EAAEA,KAAK,CAAC;MAChDd,OAAO,CAACS,KAAK,CAACC,SAAS,CAACI,KAAK,CAAC;IAChC,CAAC,SAAS;MACRV,YAAY,CAAC,KAAK,CAAC;IACrB;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAEC,eAAe;IAAEF;EAAU,CAAC;AACvC,CAAC","ignoreList":[]}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useFeedback Hook
5
+ * Custom hook for handling Like/Dislike feedback logic
6
+ */
7
+
8
+ import { useCallback } from 'react';
9
+ import useMessageActionsStore from "../../store/messageActions.js";
10
+ import { FeedbackType } from "../../types/messageActions.js";
11
+ import { useSendFeedback } from "./useSendFeedback.js";
12
+ import UIUtils from "../../utils/ui.js";
13
+ import useSessionStore from "../../store/session.js";
14
+ import { useChatContext } from "../../context/ChatContext.js";
15
+ import { GAEvents } from 'src/constants/events';
16
+ export const useFeedback = (messageId, message) => {
17
+ const logGA = useChatContext().logGA;
18
+ const sessionId = useSessionStore(state => state.sessionId);
19
+ const feedback = useMessageActionsStore(state => state.getFeedback(messageId));
20
+ const setFeedback = useMessageActionsStore(state => state.setFeedback);
21
+ const activeFeedbackList = useMessageActionsStore(state => state.activeFeedbackList);
22
+ const setActiveFeedbackList = useMessageActionsStore(state => state.setActiveFeedbackList);
23
+ const {
24
+ mutateAsync: sendFeedback,
25
+ isLoading
26
+ } = useSendFeedback();
27
+
28
+ // Check feedback from server (message) or local store
29
+ const serverFeedbackType = message?.feedback_type;
30
+ const serverFeedbackContent = message?.feedback_content;
31
+ const effectiveFeedback = feedback || (serverFeedbackType && serverFeedbackContent ? {
32
+ messageId,
33
+ feedbackType: serverFeedbackType,
34
+ reason: serverFeedbackContent,
35
+ timestamp: message.modified_at
36
+ } : null);
37
+ const isLikeActive = effectiveFeedback?.feedbackType === FeedbackType.like;
38
+ const isDislikeActive = effectiveFeedback?.feedbackType === FeedbackType.dislike;
39
+ const isLikeListOpen = activeFeedbackList === `${messageId}-like`;
40
+ const isDislikeListOpen = activeFeedbackList === `${messageId}-dislike`;
41
+ const toggleLikeList = useCallback(() => {
42
+ if (isLikeActive) return; // Already selected, cannot change
43
+ setActiveFeedbackList(isLikeListOpen ? null : `${messageId}-like`);
44
+ }, [messageId, isLikeActive, isLikeListOpen, setActiveFeedbackList]);
45
+ const toggleDislikeList = useCallback(() => {
46
+ if (isDislikeActive) return; // Already selected, cannot change
47
+ setActiveFeedbackList(isDislikeListOpen ? null : `${messageId}-dislike`);
48
+ }, [messageId, isDislikeActive, isDislikeListOpen, setActiveFeedbackList]);
49
+ const selectReason = useCallback(async (type, reason) => {
50
+ console.log('selectReason', sessionId);
51
+ if (!sessionId) {
52
+ console.error('Session ID is required to send feedback');
53
+ UIUtils.toast.open({
54
+ title: 'Không thể gửi phản hồi. Vui lòng thử lại.'
55
+ });
56
+ return;
57
+ }
58
+ try {
59
+ // Send to backend FIRST (no optimistic update)
60
+ await sendFeedback({
61
+ sessionId,
62
+ payload: {
63
+ message_id: messageId,
64
+ feedback_type: type,
65
+ feedback_content: reason
66
+ }
67
+ });
68
+ logGA(GAEvents.chatDetailLikeDislikeBtnTap, {
69
+ fb_type: type,
70
+ message_id: messageId
71
+ });
72
+
73
+ // Update local state AFTER successful API call
74
+ setFeedback(messageId, type, reason);
75
+ UIUtils.toast.showSuccess('Cảm ơn phản hồi của bạn!');
76
+ } catch (error) {
77
+ console.error('Failed to send feedback:', error);
78
+ UIUtils.toast.showError(error);
79
+ }
80
+ }, [messageId, setFeedback, sendFeedback, sessionId, logGA]);
81
+ return {
82
+ feedback: effectiveFeedback,
83
+ isLikeActive,
84
+ isDislikeActive,
85
+ isLikeListOpen,
86
+ isDislikeListOpen,
87
+ isLoading,
88
+ toggleLikeList,
89
+ toggleDislikeList,
90
+ selectReason
91
+ };
92
+ };
93
+ //# sourceMappingURL=useFeedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useMessageActionsStore","FeedbackType","useSendFeedback","UIUtils","useSessionStore","useChatContext","GAEvents","useFeedback","messageId","message","logGA","sessionId","state","feedback","getFeedback","setFeedback","activeFeedbackList","setActiveFeedbackList","mutateAsync","sendFeedback","isLoading","serverFeedbackType","feedback_type","serverFeedbackContent","feedback_content","effectiveFeedback","feedbackType","reason","timestamp","modified_at","isLikeActive","like","isDislikeActive","dislike","isLikeListOpen","isDislikeListOpen","toggleLikeList","toggleDislikeList","selectReason","type","console","log","error","toast","open","title","payload","message_id","chatDetailLikeDislikeBtnTap","fb_type","showSuccess","showError"],"sourceRoot":"../../../../src","sources":["hooks/messageActions/useFeedback.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useSendFeedback Hook
5
+ * React Query mutation hook for sending feedback to backend
6
+ */
7
+
8
+ import { useMutation } from '@tanstack/react-query';
9
+ import { apiInstance } from "../../services/apis.js";
10
+ import { ENDPOINTS } from "../../services/endpoints.js";
11
+ import { QUERY_KEYS } from "../../constants/query.js";
12
+ export const useSendFeedback = () => useMutation({
13
+ mutationKey: [QUERY_KEYS.SEND_FEEDBACK],
14
+ mutationFn: async ({
15
+ sessionId,
16
+ payload
17
+ }) => {
18
+ const res = await apiInstance?.put(ENDPOINTS.assistantService.sendFeedback(sessionId), payload);
19
+ return res?.data?.data;
20
+ },
21
+ retry: 2,
22
+ retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000)
23
+ });
24
+ //# sourceMappingURL=useSendFeedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMutation","apiInstance","ENDPOINTS","QUERY_KEYS","useSendFeedback","mutationKey","SEND_FEEDBACK","mutationFn","sessionId","payload","res","put","assistantService","sendFeedback","data","retry","retryDelay","attemptIndex","Math","min"],"sourceRoot":"../../../../src","sources":["hooks/messageActions/useSendFeedback.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAQ,uBAAuB;AACnD,SAASC,WAAW,QAAQ,wBAAqB;AACjD,SAASC,SAAS,QAAQ,6BAA0B;AAEpD,SAASC,UAAU,QAAQ,0BAAuB;AAQlD,OAAO,MAAMC,eAAe,GAAGA,CAAA,KAC7BJ,WAAW,CAAC;EACVK,WAAW,EAAE,CAACF,UAAU,CAACG,aAAa,CAAC;EACvCC,UAAU,EAAE,MAAAA,CAAO;IAAEC,SAAS;IAAEC;EAA4B,CAAC,KAAK;IAChE,MAAMC,GAAG,GAAG,MAAMT,WAAW,EAAEU,GAAG,CAChCT,SAAS,CAACU,gBAAgB,CAACC,YAAY,CAACL,SAAS,CAAC,EAClDC,OACF,CAAC;IACD,OAAOC,GAAG,EAAEI,IAAI,EAAEA,IAAI;EACxB,CAAC;EACDC,KAAK,EAAE,CAAC;EACRC,UAAU,EAAGC,YAAoB,IAC/BC,IAAI,CAACC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAIF,YAAY,EAAE,KAAK;AAC5C,CAAC,CAAC","ignoreList":[]}