react-native-chatbot-ai 0.1.30 → 0.1.33

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 (41) hide show
  1. package/lib/module/components/chat/footer/index.js +32 -162
  2. package/lib/module/components/chat/footer/index.js.map +1 -1
  3. package/lib/module/components/chat/index.js +1 -1
  4. package/lib/module/components/chat/item/ChatAIThinkingMessageItem.js +13 -3
  5. package/lib/module/components/chat/item/ChatAIThinkingMessageItem.js.map +1 -1
  6. package/lib/module/components/chat/item/ChatTable.js +6 -1
  7. package/lib/module/components/chat/item/ChatTable.js.map +1 -1
  8. package/lib/module/hooks/upload/useUploadItem.js +171 -0
  9. package/lib/module/hooks/upload/useUploadItem.js.map +1 -0
  10. package/lib/module/store/streamMessage.js +6 -0
  11. package/lib/module/store/streamMessage.js.map +1 -1
  12. package/lib/module/translation/resources/i18n.js +12 -1
  13. package/lib/module/translation/resources/i18n.js.map +1 -1
  14. package/lib/typescript/src/components/chat/footer/index.d.ts +0 -13
  15. package/lib/typescript/src/components/chat/footer/index.d.ts.map +1 -1
  16. package/lib/typescript/src/components/chat/footer/item/UploadFileItem.d.ts +1 -1
  17. package/lib/typescript/src/components/chat/footer/item/UploadFileItem.d.ts.map +1 -1
  18. package/lib/typescript/src/components/chat/footer/item/UploadImageItem.d.ts +1 -1
  19. package/lib/typescript/src/components/chat/footer/item/UploadImageItem.d.ts.map +1 -1
  20. package/lib/typescript/src/components/chat/item/ChatAIThinkingMessageItem.d.ts.map +1 -1
  21. package/lib/typescript/src/components/chat/item/ChatTable.d.ts.map +1 -1
  22. package/lib/typescript/src/hooks/upload/useFileUpload.d.ts +1 -1
  23. package/lib/typescript/src/hooks/upload/useFileUpload.d.ts.map +1 -1
  24. package/lib/typescript/src/hooks/upload/useImageUpload.d.ts +1 -1
  25. package/lib/typescript/src/hooks/upload/useImageUpload.d.ts.map +1 -1
  26. package/lib/typescript/src/hooks/upload/useUploadItem.d.ts +27 -0
  27. package/lib/typescript/src/hooks/upload/useUploadItem.d.ts.map +1 -0
  28. package/lib/typescript/src/store/streamMessage.d.ts.map +1 -1
  29. package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -1
  30. package/package.json +2 -2
  31. package/src/components/chat/footer/index.tsx +35 -209
  32. package/src/components/chat/footer/item/UploadFileItem.tsx +1 -1
  33. package/src/components/chat/footer/item/UploadImageItem.tsx +1 -1
  34. package/src/components/chat/index.tsx +1 -1
  35. package/src/components/chat/item/ChatAIThinkingMessageItem.tsx +13 -1
  36. package/src/components/chat/item/ChatTable.tsx +8 -1
  37. package/src/hooks/upload/useFileUpload.ts +1 -1
  38. package/src/hooks/upload/useImageUpload.ts +1 -1
  39. package/src/hooks/upload/useUploadItem.ts +220 -0
  40. package/src/store/streamMessage.ts +6 -0
  41. package/src/translation/resources/i18n.ts +11 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useMemo","useState","Keyboard","types","UIUtils","isSameFile","shortenFileName","trans","openCameraPicker","openDocumentPicker","openImageMultiplePicker","GAEvents","useSessionStore","MAX_FILE_UPLOAD","MAX_FILE_SIZE","MAX_IMAGE_SIZE","useUploadItem","logGA","documentUpload","setDocumentUpload","imageUpload","setImageUpload","addImages","newImages","prev","totalPrevSize","reduce","acc","item","size","uniqueImages","filter","img","some","sel","map","i","uploadType","slice","length","totalNewSize","toast","open","title","name","filename","join","theme","addFile","newDocument","newFileIndex","findIndex","doc","uri","onPressImagePicker","dismiss","number","maxFiles","chatDetailMultimodalTap","conversation_id","getState","sessionId","button","onPressCameraPicker","newImage","handlePressDocumentPicker","type","pdf","handleUploadSuccess","next","fileIndex","path","handleRemoveUploadItem","clearFileUpload","fileUpload"],"sourceRoot":"../../../../src","sources":["hooks/upload/useUploadItem.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import { create } from 'zustand';
4
+ import UIUtils from "../utils/ui.js";
5
+ import { trans } from "../translation/index.js";
4
6
  const useStreamMessageStore = create(set => ({
5
7
  isStreaming: false,
6
8
  setIsStreaming: isStreaming => set({
@@ -31,6 +33,10 @@ const useStreamMessageStore = create(set => ({
31
33
  if (state.eventSource) {
32
34
  console.log('🛑 Closing stream');
33
35
  state.eventSource.close();
36
+ UIUtils.toast.open({
37
+ theme: 'light',
38
+ title: trans('stop_stream_alert')
39
+ });
34
40
  return {
35
41
  isStreaming: false,
36
42
  eventSource: undefined
@@ -1 +1 @@
1
- {"version":3,"names":["create","useStreamMessageStore","set","isStreaming","setIsStreaming","streamMessage","setStreamMessage","Object","keys","length","state","updated","id","msg","entries","setEventSource","es","eventSource","stopStream","console","log","close","undefined"],"sourceRoot":"../../../src","sources":["store/streamMessage.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAIhC,MAAMC,qBAAqB,GAAGD,MAAM,CAAsBE,GAAG,KAAM;EACjEC,WAAW,EAAE,KAAK;EAClBC,cAAc,EAAGD,WAAW,IAAKD,GAAG,CAAC;IAAEC;EAAY,CAAC,CAAC;EACrDE,aAAa,EAAE,CAAC,CAAC;EACjBC,gBAAgB,EAAGD,aAA2C,IAAK;IACjE,IAAI,CAACA,aAAa,IAAIE,MAAM,CAACC,IAAI,CAACH,aAAa,CAAC,CAACI,MAAM,KAAK,CAAC,EAAE;IAE/DP,GAAG,CAAEQ,KAAK,IAAK;MACb,MAAMC,OAAO,GAAG;QAAE,GAAGD,KAAK,CAACL;MAAc,CAAC;MAE1C,KAAK,MAAM,CAACO,EAAE,EAAEC,GAAG,CAAC,IAAIN,MAAM,CAACO,OAAO,CAACT,aAAa,CAAC,EAAE;QACrDM,OAAO,CAACC,EAAE,CAAC,GAAGC,GAAG;MACnB;MAEA,OAAO;QAAER,aAAa,EAAEM;MAAQ,CAAC;IACnC,CAAC,CAAC;EACJ,CAAC;EACDI,cAAcA,CAACC,EAAE,EAAE;IACjBd,GAAG,CAAC;MAAEe,WAAW,EAAED;IAAG,CAAC,CAAC;EAC1B,CAAC;EACDE,UAAUA,CAAA,EAAG;IACXhB,GAAG,CAAEQ,KAAK,IAAK;MACb,IAAIA,KAAK,CAACO,WAAW,EAAE;QACrBE,OAAO,CAACC,GAAG,CAAC,mBAAmB,CAAC;QAChCV,KAAK,CAACO,WAAW,CAACI,KAAK,CAAC,CAAC;QACzB,OAAO;UAAElB,WAAW,EAAE,KAAK;UAAEc,WAAW,EAAEK;QAAU,CAAC;MACvD;MACA,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;EACJ;AACF,CAAC,CAAC,CAAC;AAEH,eAAerB,qBAAqB","ignoreList":[]}
1
+ {"version":3,"names":["create","UIUtils","trans","useStreamMessageStore","set","isStreaming","setIsStreaming","streamMessage","setStreamMessage","Object","keys","length","state","updated","id","msg","entries","setEventSource","es","eventSource","stopStream","console","log","close","toast","open","theme","title","undefined"],"sourceRoot":"../../../src","sources":["store/streamMessage.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAGhC,OAAOC,OAAO,MAAM,gBAAa;AACjC,SAASC,KAAK,QAAQ,yBAAgB;AAEtC,MAAMC,qBAAqB,GAAGH,MAAM,CAAsBI,GAAG,KAAM;EACjEC,WAAW,EAAE,KAAK;EAClBC,cAAc,EAAGD,WAAW,IAAKD,GAAG,CAAC;IAAEC;EAAY,CAAC,CAAC;EACrDE,aAAa,EAAE,CAAC,CAAC;EACjBC,gBAAgB,EAAGD,aAA2C,IAAK;IACjE,IAAI,CAACA,aAAa,IAAIE,MAAM,CAACC,IAAI,CAACH,aAAa,CAAC,CAACI,MAAM,KAAK,CAAC,EAAE;IAE/DP,GAAG,CAAEQ,KAAK,IAAK;MACb,MAAMC,OAAO,GAAG;QAAE,GAAGD,KAAK,CAACL;MAAc,CAAC;MAE1C,KAAK,MAAM,CAACO,EAAE,EAAEC,GAAG,CAAC,IAAIN,MAAM,CAACO,OAAO,CAACT,aAAa,CAAC,EAAE;QACrDM,OAAO,CAACC,EAAE,CAAC,GAAGC,GAAG;MACnB;MAEA,OAAO;QAAER,aAAa,EAAEM;MAAQ,CAAC;IACnC,CAAC,CAAC;EACJ,CAAC;EACDI,cAAcA,CAACC,EAAE,EAAE;IACjBd,GAAG,CAAC;MAAEe,WAAW,EAAED;IAAG,CAAC,CAAC;EAC1B,CAAC;EACDE,UAAUA,CAAA,EAAG;IACXhB,GAAG,CAAEQ,KAAK,IAAK;MACb,IAAIA,KAAK,CAACO,WAAW,EAAE;QACrBE,OAAO,CAACC,GAAG,CAAC,mBAAmB,CAAC;QAChCV,KAAK,CAACO,WAAW,CAACI,KAAK,CAAC,CAAC;QACzBtB,OAAO,CAACuB,KAAK,CAACC,IAAI,CAAC;UACjBC,KAAK,EAAE,OAAO;UACdC,KAAK,EAAEzB,KAAK,CAAC,mBAAmB;QAClC,CAAC,CAAC;QACF,OAAO;UAAEG,WAAW,EAAE,KAAK;UAAEc,WAAW,EAAES;QAAU,CAAC;MACvD;MACA,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;EACJ;AACF,CAAC,CAAC,CAAC;AAEH,eAAezB,qBAAqB","ignoreList":[]}
@@ -32,7 +32,18 @@ const i18nKey = {
32
32
  delete_session_cancel: 'Không',
33
33
  delete_session_confirm: 'Xoá',
34
34
  delete_session_success: 'Đã xoá phiên chat thành công',
35
- recently_chat_history: 'Lịch sử gần đây'
35
+ recently_chat_history: 'Lịch sử gần đây',
36
+ stop_stream_alert: 'Đã dừng tạo câu trả lời',
37
+ images_too_large: `
38
+ Tổng dung lượng ảnh tải lên có kích thước quá lớn:
39
+ {{name}}
40
+ Vui lòng nén ảnh hoặc tải lên nhiều lần để tiếp tục.`,
41
+ file_too_large: `
42
+ Tổng dung lượng tệp tải lên có kích thước quá lớn:
43
+ {{name}}
44
+ Vui lòng nén tệp hoặc tải lên nhiều lần để tiếp tục.`,
45
+ max_image_reached: 'Chỉ được gửi tối đa {{number}} hình ảnh',
46
+ max_file_reached: 'Chỉ được gửi tối đa {{number}} tệp'
36
47
  };
37
48
  export default {
38
49
  vi: i18nKey
@@ -1 +1 @@
1
- {"version":3,"names":["i18nKey","input_placeholder","ai_answer_note","chat_empty_title","chat_empty_description_1","chat_empty_description_2","photo_library","camera","session_options_title","session_rename","session_share","session_delete","rename_session_title","rename_session_placeholder","rename_session_success","rename_session_cancel","rename_session_confirm","share_session_title","share_session_description","share_session_link_label","share_session_cancel","share_session_confirm","share_session_success","delete_session_title","delete_session_description","delete_session_cancel","delete_session_confirm","delete_session_success","recently_chat_history","vi"],"sourceRoot":"../../../../src","sources":["translation/resources/i18n.ts"],"mappings":";;AAAA,MAAMA,OAA+B,GAAG;EACtCC,iBAAiB,EAAE,0BAA0B;EAC7CC,cAAc,EACZ,gGAAgG;EAClGC,gBAAgB,EAAE,4BAA4B;EAC9CC,wBAAwB,EAAE,8CAA8C;EACxEC,wBAAwB,EAAE,2BAA2B;EACrDC,aAAa,EAAE,cAAc;EAC7BC,MAAM,EAAE,UAAU;EAElB;EACAC,qBAAqB,EAAE,qBAAqB;EAC5CC,cAAc,EAAE,SAAS;EACzBC,aAAa,EAAE,SAAS;EACxBC,cAAc,EAAE,KAAK;EAErB;EACAC,oBAAoB,EAAE,oBAAoB;EAC1CC,0BAA0B,EAAE,qBAAqB;EACjDC,sBAAsB,EAAE,+BAA+B;EACvDC,qBAAqB,EAAE,KAAK;EAC5BC,sBAAsB,EAAE,SAAS;EAEjC;EACAC,mBAAmB,EAAE,oBAAoB;EACzCC,yBAAyB,EACvB,+GAA+G;EACjHC,wBAAwB,EAAE,kBAAkB;EAC5CC,oBAAoB,EAAE,KAAK;EAC3BC,qBAAqB,EAAE,UAAU;EACjCC,qBAAqB,EACnB,gEAAgE;EAElE;EACAC,oBAAoB,EAAE,gBAAgB;EACtCC,0BAA0B,EACxB,4EAA4E;EAC9EC,qBAAqB,EAAE,OAAO;EAC9BC,sBAAsB,EAAE,KAAK;EAC7BC,sBAAsB,EAAE,8BAA8B;EAEtDC,qBAAqB,EAAE;AACzB,CAAC;AAED,eAAe;EACbC,EAAE,EAAE7B;AACN,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["i18nKey","input_placeholder","ai_answer_note","chat_empty_title","chat_empty_description_1","chat_empty_description_2","photo_library","camera","session_options_title","session_rename","session_share","session_delete","rename_session_title","rename_session_placeholder","rename_session_success","rename_session_cancel","rename_session_confirm","share_session_title","share_session_description","share_session_link_label","share_session_cancel","share_session_confirm","share_session_success","delete_session_title","delete_session_description","delete_session_cancel","delete_session_confirm","delete_session_success","recently_chat_history","stop_stream_alert","images_too_large","file_too_large","max_image_reached","max_file_reached","vi"],"sourceRoot":"../../../../src","sources":["translation/resources/i18n.ts"],"mappings":";;AAAA,MAAMA,OAA+B,GAAG;EACtCC,iBAAiB,EAAE,0BAA0B;EAC7CC,cAAc,EACZ,gGAAgG;EAClGC,gBAAgB,EAAE,4BAA4B;EAC9CC,wBAAwB,EAAE,8CAA8C;EACxEC,wBAAwB,EAAE,2BAA2B;EACrDC,aAAa,EAAE,cAAc;EAC7BC,MAAM,EAAE,UAAU;EAElB;EACAC,qBAAqB,EAAE,qBAAqB;EAC5CC,cAAc,EAAE,SAAS;EACzBC,aAAa,EAAE,SAAS;EACxBC,cAAc,EAAE,KAAK;EAErB;EACAC,oBAAoB,EAAE,oBAAoB;EAC1CC,0BAA0B,EAAE,qBAAqB;EACjDC,sBAAsB,EAAE,+BAA+B;EACvDC,qBAAqB,EAAE,KAAK;EAC5BC,sBAAsB,EAAE,SAAS;EAEjC;EACAC,mBAAmB,EAAE,oBAAoB;EACzCC,yBAAyB,EACvB,+GAA+G;EACjHC,wBAAwB,EAAE,kBAAkB;EAC5CC,oBAAoB,EAAE,KAAK;EAC3BC,qBAAqB,EAAE,UAAU;EACjCC,qBAAqB,EACnB,gEAAgE;EAElE;EACAC,oBAAoB,EAAE,gBAAgB;EACtCC,0BAA0B,EACxB,4EAA4E;EAC9EC,qBAAqB,EAAE,OAAO;EAC9BC,sBAAsB,EAAE,KAAK;EAC7BC,sBAAsB,EAAE,8BAA8B;EAEtDC,qBAAqB,EAAE,iBAAiB;EACxCC,iBAAiB,EAAE,yBAAyB;EAC5CC,gBAAgB,EAAE;AACpB;AACA;AACA,uDAAuD;EACrDC,cAAc,EAAE;AAClB;AACA;AACA,uDAAuD;EACrDC,iBAAiB,EAAE,yCAAyC;EAC5DC,gBAAgB,EAAE;AACpB,CAAC;AAED,eAAe;EACbC,EAAE,EAAElC;AACN,CAAC","ignoreList":[]}
@@ -1,17 +1,4 @@
1
- import type { Image } from 'react-native-image-crop-picker';
2
- import { DocumentPickerResponse } from '@react-native-documents/picker';
3
1
  import { IMessageItem } from '../../../types';
4
- export interface ImageUpload extends Image {
5
- streamId?: string;
6
- remoteUrl?: string;
7
- uploadType: 'image';
8
- }
9
- export interface FileUpload extends DocumentPickerResponse {
10
- streamId?: string;
11
- remoteUrl?: string;
12
- uploadType: 'file';
13
- }
14
- export type UploadItem = ImageUpload | FileUpload;
15
2
  interface IChatFooterProps {
16
3
  lastMessage?: IMessageItem;
17
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/footer/index.tsx"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAG5D,OAAO,EAAE,sBAAsB,EAAS,MAAM,gCAAgC,CAAC;AAE/E,OAAO,EAEL,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAQxB,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAW,SAAQ,sBAAsB;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAMlD,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED,QAAA,MAAM,UAAU,GAAI,iBAAiB,gBAAgB,4CAgWpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/footer/index.tsx"],"names":[],"mappings":"AA8BA,OAAO,EAEL,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAQxB,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAMD,QAAA,MAAM,UAAU,GAAI,iBAAiB,gBAAgB,4CA6MpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,4 +1,4 @@
1
- import { FileUpload } from '..';
1
+ import { FileUpload } from '../../../../hooks/upload/useUploadItem';
2
2
  interface Props {
3
3
  item: FileUpload;
4
4
  onRemove?: (item: FileUpload) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"UploadFileItem.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/chat/footer/item/UploadFileItem.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAMhC,UAAU,KAAK;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AACD,QAAA,MAAM,cAAc,GAAI,+BAA+B,KAAK,4CAuG3D,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"UploadFileItem.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/chat/footer/item/UploadFileItem.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAMpE,UAAU,KAAK;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AACD,QAAA,MAAM,cAAc,GAAI,+BAA+B,KAAK,4CAuG3D,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ImageUpload } from '..';
1
+ import { ImageUpload } from '../../../../hooks/upload/useUploadItem';
2
2
  interface Props {
3
3
  item: ImageUpload;
4
4
  onSuccess?: (item: ImageUpload) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"UploadImageItem.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/chat/footer/item/UploadImageItem.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAQjC,UAAU,KAAK;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CACxC;AAED,QAAA,MAAM,eAAe,GAAI,+BAA+B,KAAK,4CAyD5D,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"UploadImageItem.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/chat/footer/item/UploadImageItem.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAQrE,UAAU,KAAK;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CACxC;AAED,QAAA,MAAM,eAAe,GAAI,+BAA+B,KAAK,4CAyD5D,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatAIThinkingMessageItem.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatAIThinkingMessageItem.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAUnD,UAAU,8BAA8B;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA0DD,QAAA,MAAM,yBAAyB,GAAI,mBAGhC,8BAA8B,4CAuFhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"ChatAIThinkingMessageItem.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatAIThinkingMessageItem.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWnD,UAAU,8BAA8B;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA0DD,QAAA,MAAM,yBAAyB,GAAI,mBAGhC,8BAA8B,4CAkGhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTable.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatTable.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,UAAU;IAClB,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;IAC5B,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAMD,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CA6DnC,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"ChatTable.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatTable.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,UAAU;IAClB,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;IAC5B,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAMD,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAiEnC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,4 +1,4 @@
1
- import { FileUpload } from '../../components/chat/footer';
1
+ import { FileUpload } from '../../hooks/upload/useUploadItem';
2
2
  interface UseFileUploadProps {
3
3
  file: FileUpload;
4
4
  onSuccess?: (data: any) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useFileUpload.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/upload/useFileUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAc1D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,GAAI,+BAI3B,kBAAkB;;;;;;CA+FpB,CAAC"}
1
+ {"version":3,"file":"useFileUpload.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/upload/useFileUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAc9D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,GAAI,+BAI3B,kBAAkB;;;;;;CA+FpB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ImageUpload } from '../../components/chat/footer';
1
+ import { ImageUpload } from '../../hooks/upload/useUploadItem';
2
2
  interface UseImageUploadProps {
3
3
  file: ImageUpload;
4
4
  onSuccess?: (data: any, duration?: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useImageUpload.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/upload/useImageUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAc3D,UAAU,mBAAmB;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,+BAI5B,mBAAmB;;;;;;CAoGrB,CAAC"}
1
+ {"version":3,"file":"useImageUpload.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/upload/useImageUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAc/D,UAAU,mBAAmB;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,+BAI5B,mBAAmB;;;;;;CAoGrB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { DocumentPickerResponse } from '@react-native-documents/picker';
2
+ import { Image } from 'react-native-image-crop-picker';
3
+ export interface ImageUpload extends Image {
4
+ streamId?: string;
5
+ remoteUrl?: string;
6
+ uploadType: 'image';
7
+ }
8
+ export interface FileUpload extends DocumentPickerResponse {
9
+ streamId?: string;
10
+ remoteUrl?: string;
11
+ uploadType: 'file';
12
+ }
13
+ export type UploadItem = ImageUpload | FileUpload;
14
+ type Props = {
15
+ logGA: (event: string, params?: any) => void;
16
+ };
17
+ export declare const useUploadItem: ({ logGA }: Props) => {
18
+ fileUpload: UploadItem[];
19
+ onPressImagePicker: () => Promise<void>;
20
+ onPressCameraPicker: () => Promise<void>;
21
+ handlePressDocumentPicker: () => Promise<void>;
22
+ handleUploadSuccess: (item: UploadItem) => void;
23
+ handleRemoveUploadItem: (item: UploadItem) => void;
24
+ clearFileUpload: () => void;
25
+ };
26
+ export {};
27
+ //# sourceMappingURL=useUploadItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUploadItem.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/upload/useUploadItem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAS,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAYvD,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAW,SAAQ,sBAAsB;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAMlD,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,WAAW,KAAK;;;;;gCAqIG,UAAU;mCAsBP,UAAU;;CA2B7D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"streamMessage.d.ts","sourceRoot":"","sources":["../../../../src/store/streamMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,QAAA,MAAM,qBAAqB,iFA8BxB,CAAC;AAEJ,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"streamMessage.d.ts","sourceRoot":"","sources":["../../../../src/store/streamMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,QAAA,MAAM,qBAAqB,iFAkCxB,CAAC;AAEJ,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/translation/resources/i18n.ts"],"names":[],"mappings":";;;AA4CA,wBAEE"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/translation/resources/i18n.ts"],"names":[],"mappings":";;;AAuDA,wBAEE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-chatbot-ai",
3
- "version": "0.1.30",
3
+ "version": "0.1.33",
4
4
  "description": "React Native library for Chatbot AI",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -88,7 +88,7 @@
88
88
  "react-native-image-crop-picker": "^0.51.1",
89
89
  "react-native-marked": "^7.0.2",
90
90
  "react-native-sse": "^1.2.1",
91
- "release-it": "^19.0.4",
91
+ "release-it": "^19.0.6",
92
92
  "typescript": "^5.9.2",
93
93
  "zustand": "^5.0.8"
94
94
  },
@@ -11,17 +11,13 @@ import {
11
11
  import SuggestionsBar from './SuggestionsBar';
12
12
  import { useCallback, useState, useRef, useMemo, useEffect } from 'react';
13
13
  import type { ComponentType } from 'react';
14
- import {
15
- FlatList,
16
- StyleSheet,
17
- TouchableWithoutFeedback,
18
- Keyboard,
19
- } from 'react-native';
14
+ import { FlatList, StyleSheet, TouchableWithoutFeedback } from 'react-native';
20
15
 
21
16
  // Type assertion to fix TypeScript issue with React Native components
22
17
  const FlatListComponent = FlatList as unknown as ComponentType<any>;
23
18
  import debounce from 'lodash/debounce';
24
19
  import { useSendMessage } from '../../../hooks/message/useSendMessage';
20
+ import { UploadItem, useUploadItem } from '../../../hooks/upload/useUploadItem';
25
21
  import useStreamMessageStore from '../../../store/streamMessage';
26
22
  import {
27
23
  Menu,
@@ -30,15 +26,7 @@ import {
30
26
  MenuOptions,
31
27
  renderers,
32
28
  } from 'react-native-popup-menu';
33
- import {
34
- openCameraPicker,
35
- openDocumentPicker,
36
- openImageMultiplePicker,
37
- } from '../../../utils/device';
38
- import type { Image } from 'react-native-image-crop-picker';
39
29
  import UploadImageItem from './item/UploadImageItem';
40
- import { isSameFile, shortenFileName } from '../../../utils/common';
41
- import { DocumentPickerResponse, types } from '@react-native-documents/picker';
42
30
  import UploadFileItem from './item/UploadFileItem';
43
31
  import {
44
32
  IAttachment,
@@ -46,35 +34,21 @@ import {
46
34
  MessageType,
47
35
  SendActionLogType,
48
36
  } from '../../../types';
49
- import UIUtils from '../../../utils/ui';
50
37
  import { trans } from '../../../translation';
51
38
  import { useChatContext } from '../../../context/ChatContext';
52
39
  import { GAEvents } from '../../../constants/events';
53
40
  import useSessionStore from '../../../store/session';
54
41
 
55
42
  const { Popover } = renderers;
56
- export interface ImageUpload extends Image {
57
- streamId?: string;
58
- remoteUrl?: string;
59
- uploadType: 'image';
60
- }
61
-
62
- export interface FileUpload extends DocumentPickerResponse {
63
- streamId?: string;
64
- remoteUrl?: string;
65
- uploadType: 'file';
66
- }
67
-
68
- export type UploadItem = ImageUpload | FileUpload;
69
-
70
- const MAX_FILE_UPLOAD = 3;
71
- const MAX_FILE_SIZE = 30 * 1024 * 1024;
72
- const MAX_IMAGE_SIZE = 7 * 1024 * 1024;
73
43
 
74
44
  interface IChatFooterProps {
75
45
  lastMessage?: IMessageItem;
76
46
  }
77
47
 
48
+ const uploadItemKeyExtractor = (item: UploadItem) => {
49
+ return item.uploadType === 'image' ? item.path : item.uri;
50
+ };
51
+
78
52
  const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
79
53
  const menuRef = useRef(null);
80
54
  const logGA = useChatContext().logGA;
@@ -82,7 +56,16 @@ const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
82
56
  const [message, setMessage] = useState('');
83
57
  const isStreaming = useStreamMessageStore((state) => state.isStreaming);
84
58
  const stopStream = useStreamMessageStore((state) => state.stopStream);
85
- const [fileUpload, setFileUpload] = useState<UploadItem[]>([]);
59
+
60
+ const {
61
+ fileUpload,
62
+ handlePressDocumentPicker,
63
+ onPressCameraPicker,
64
+ onPressImagePicker,
65
+ clearFileUpload,
66
+ handleRemoveUploadItem,
67
+ handleUploadSuccess,
68
+ } = useUploadItem({ logGA });
86
69
 
87
70
  const debouncedMessage = debounce((m: string) => {
88
71
  setMessage(m);
@@ -104,87 +87,6 @@ const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
104
87
  );
105
88
  }, [lastMessage]);
106
89
 
107
- const onPressImagePicker = useCallback(async () => {
108
- Keyboard.dismiss();
109
- const totalImages = fileUpload.filter((i) => i.uploadType === 'image');
110
- if (totalImages.length >= MAX_FILE_UPLOAD) {
111
- UIUtils.toast.open({
112
- title: `Chỉ được gửi tối đa ${MAX_FILE_UPLOAD} hình ảnh`,
113
- });
114
- return;
115
- }
116
- const newImages =
117
- (await openImageMultiplePicker({
118
- maxFiles:
119
- MAX_FILE_UPLOAD - totalImages.length > 0
120
- ? MAX_FILE_UPLOAD - totalImages.length
121
- : 1,
122
- })) || [];
123
- const uniqueImages = newImages
124
- .filter((img) => !totalImages.some((sel) => isSameFile(sel, img)))
125
- .map((i) => ({ ...i, uploadType: 'image' }))
126
- .slice(0, MAX_FILE_UPLOAD - totalImages.length) as ImageUpload[];
127
-
128
- if (uniqueImages?.length > 0) {
129
- setFileUpload((prev) => {
130
- const totalPrevSize = totalImages.reduce(
131
- (acc, item) => acc + (item.size || 0),
132
- 0
133
- );
134
- const totalNewSize = uniqueImages.reduce(
135
- (acc, item) => acc + (item.size || 0),
136
- 0
137
- );
138
- if (totalPrevSize + totalNewSize > MAX_IMAGE_SIZE) {
139
- UIUtils.toast.open({
140
- title: `Tổng dung lượng ảnh tải lên có kích thước quá lớn:\n ${uniqueImages.map((i) => shortenFileName(i.filename || '')).join(',\n')}, \nVui lòng nén ảnh hoặc tải lên nhiều lần để tiếp tục.`,
141
- theme: 'danger',
142
- });
143
- return prev;
144
- }
145
- return [...prev, ...uniqueImages];
146
- });
147
- }
148
-
149
- logGA(GAEvents.chatDetailMultimodalTap, {
150
- conversation_id: useSessionStore.getState().sessionId,
151
- button: 'image',
152
- });
153
- }, [fileUpload, logGA]);
154
-
155
- const onPressCameraPicker = useCallback(async () => {
156
- Keyboard.dismiss();
157
- const totalImages = fileUpload.filter((i) => i.uploadType === 'image');
158
- if (totalImages.length >= MAX_FILE_UPLOAD) {
159
- UIUtils.toast.open({
160
- title: `Chỉ được gửi tối đa ${MAX_FILE_UPLOAD} hình ảnh`,
161
- });
162
- return;
163
- }
164
- const newImage = await openCameraPicker();
165
- if (newImage) {
166
- setFileUpload((prev) => {
167
- const totalPrevSize = totalImages.reduce(
168
- (acc, item) => acc + (item.size || 0),
169
- 0
170
- );
171
- const totalNewSize = newImage.size || 0;
172
- if (totalPrevSize + totalNewSize > MAX_IMAGE_SIZE) {
173
- UIUtils.toast.open({
174
- title: `Tổng dung lượng ảnh tải lên có kích thước quá lớn:\n ${shortenFileName(newImage.filename || '')},\n Vui lòng nén ảnh hoặc tải lên nhiều lần để tiếp tục.`,
175
- theme: 'danger',
176
- });
177
- return prev;
178
- }
179
- return [...prev, { ...newImage, uploadType: 'image' }];
180
- });
181
- }
182
- logGA(GAEvents.chatDetailMultimodalTap, {
183
- conversation_id: useSessionStore.getState().sessionId,
184
- button: 'image',
185
- });
186
- }, [fileUpload, logGA]);
187
-
188
90
  const menuItems = useMemo(() => {
189
91
  return [
190
92
  {
@@ -221,49 +123,19 @@ const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
221
123
 
222
124
  onSendMessage(message?.trim(), attachments, SendActionLogType.sendBtn);
223
125
  setMessage('');
224
- setFileUpload([]);
225
- }, [message, isStreaming, onSendMessage, stopStream, fileUpload, logGA]);
226
-
227
- const handleUploadSuccess = useCallback((item: UploadItem) => {
228
- if (item.uploadType === 'image') {
229
- setFileUpload((prev) => {
230
- const next = [...prev];
231
- const fileIndex = next.findIndex(
232
- (i) => i.uploadType === 'image' && i?.path === item?.path
233
- );
234
- if (fileIndex > -1) {
235
- next[fileIndex] = { ...next[fileIndex], ...item };
236
- }
237
- return next;
238
- });
239
- } else {
240
- setFileUpload((prev) => {
241
- const next = [...prev];
242
- const fileIndex = next.findIndex(
243
- (i) => i.uploadType === 'file' && i?.uri === item?.uri
244
- );
245
- if (fileIndex > -1) {
246
- next[fileIndex] = { ...next[fileIndex], ...item };
247
- }
248
- return next;
249
- });
250
- }
251
- }, []);
252
-
253
- const handleRemoveUploadItem = useCallback((item: UploadItem) => {
254
- if (item.uploadType === 'image') {
255
- setFileUpload((prev) =>
256
- prev.filter((i) => i.uploadType !== 'image' || i.path !== item.path)
257
- );
258
- } else {
259
- setFileUpload((prev) =>
260
- prev.filter((i) => i.uploadType !== 'file' || i.uri !== item.uri)
261
- );
262
- }
263
- }, []);
126
+ clearFileUpload();
127
+ }, [
128
+ message,
129
+ isStreaming,
130
+ onSendMessage,
131
+ stopStream,
132
+ fileUpload,
133
+ logGA,
134
+ clearFileUpload,
135
+ ]);
264
136
 
265
137
  const renderUploadItem = useCallback(
266
- (item: UploadItem) => {
138
+ ({ item }: { item: UploadItem }) => {
267
139
  switch (item.uploadType) {
268
140
  case 'image':
269
141
  return (
@@ -288,47 +160,6 @@ const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
288
160
  [handleRemoveUploadItem, handleUploadSuccess]
289
161
  );
290
162
 
291
- const handlePressDocumentPicker = useCallback(async () => {
292
- Keyboard.dismiss();
293
- const listFiles = fileUpload.filter((i) => i.uploadType === 'file');
294
- if (listFiles.length >= MAX_FILE_UPLOAD) {
295
- UIUtils.toast.open({
296
- title: `Chỉ được gửi tối đa ${MAX_FILE_UPLOAD} tệp`,
297
- });
298
- return;
299
- }
300
- const newDocument = await openDocumentPicker({
301
- type: types.pdf,
302
- });
303
- const newFileIndex = listFiles.findIndex(
304
- (doc) => doc.uploadType === 'file' && doc.uri === newDocument?.uri
305
- );
306
-
307
- if (!!newDocument && newFileIndex === -1) {
308
- setFileUpload((prev) => {
309
- const totalPrevSize = prev.reduce(
310
- (acc, item) => acc + (item.size || 0),
311
- 0
312
- );
313
- const totalNewSize = newDocument.size || 0;
314
- if (totalPrevSize + totalNewSize > MAX_FILE_SIZE) {
315
- UIUtils.toast.open({
316
- title: `Tổng dung lượng tệp tải lên có kích thước quá lớn:\n ${shortenFileName(
317
- newDocument.name || ''
318
- )},\n Vui lòng nén tệp hoặc tải lên nhiều lần để tiếp tục.`,
319
- theme: 'danger',
320
- });
321
- return prev;
322
- }
323
- return [...prev, { ...newDocument, uploadType: 'file' }];
324
- });
325
- }
326
- logGA(GAEvents.chatDetailMultimodalTap, {
327
- conversation_id: useSessionStore.getState().sessionId,
328
- button: 'file',
329
- });
330
- }, [fileUpload, logGA]);
331
-
332
163
  useEffect(() => {
333
164
  return () => {
334
165
  stopStream();
@@ -349,13 +180,9 @@ const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
349
180
  <KContainer.VisibleView visible={fileUpload.length > 0}>
350
181
  <FlatListComponent
351
182
  data={fileUpload}
352
- renderItem={({ item }: { item: UploadItem }) =>
353
- renderUploadItem(item)
354
- }
183
+ renderItem={renderUploadItem}
355
184
  horizontal
356
- keyExtractor={(item: UploadItem) =>
357
- item.uploadType === 'image' ? item.path : item.uri
358
- }
185
+ keyExtractor={uploadItemKeyExtractor}
359
186
  contentContainerStyle={styles.listUploadItem}
360
187
  />
361
188
  </KContainer.VisibleView>
@@ -398,8 +225,8 @@ const ChatFooter = ({ lastMessage }: IChatFooterProps) => {
398
225
  onSelect={i.onPress}
399
226
  style={styles.menuItem}
400
227
  >
401
- <KLabel.Text typo="TextMdMedium">{i.label}</KLabel.Text>
402
228
  <KImage.VectorIcons name={i.icon} />
229
+ <KLabel.Text typo="TextMdMedium">{i.label}</KLabel.Text>
403
230
  </MenuOption>
404
231
  ))}
405
232
  </MenuOptions>
@@ -460,16 +287,15 @@ const styles = StyleSheet.create({
460
287
  borderRadius: KRadiusValue['4x'],
461
288
  backgroundColor: KColors.white,
462
289
  width: 200,
290
+ paddingHorizontal: KSpacingValue['0.75rem'],
291
+ paddingVertical: KSpacingValue['0.5rem'],
463
292
  },
464
293
  menuItem: {
465
- paddingHorizontal: KSpacingValue['1rem'],
294
+ padding: KSpacingValue['0.5rem'],
466
295
  flexDirection: 'row',
467
296
  alignItems: 'center',
468
- paddingVertical: KSpacingValue['0.75rem'],
469
- borderBottomWidth: 1,
470
- borderBottomColor: KColors.border.normal,
471
- gap: KSpacingValue['0.5rem'],
472
- justifyContent: 'space-between',
297
+ justifyContent: 'flex-start',
298
+ gap: KSpacingValue['0.75rem'],
473
299
  },
474
300
  listUploadItem: {
475
301
  gap: KSpacingValue['0.75rem'],
@@ -8,7 +8,7 @@ import {
8
8
  } from '@droppii/libs';
9
9
  import { StyleSheet, Animated, Easing } from 'react-native';
10
10
  import { IconPdf } from '../../../../assets/svgIcon/IconPdf';
11
- import { FileUpload } from '..';
11
+ import { FileUpload } from '../../../../hooks/upload/useUploadItem';
12
12
  import { formatFileSize, shortenFileName } from '../../../../utils/common';
13
13
  import { useFileUpload } from '../../../../hooks/upload/useFileUpload';
14
14
  import UIUtils from '../../../../utils/ui';
@@ -5,7 +5,7 @@ import {
5
5
  KLabel,
6
6
  KRadiusValue,
7
7
  } from '@droppii/libs';
8
- import { ImageUpload } from '..';
8
+ import { ImageUpload } from '../../../../hooks/upload/useUploadItem';
9
9
  import { StyleSheet } from 'react-native';
10
10
  import { useImageUpload } from '../../../../hooks/upload/useImageUpload';
11
11
  import UIUtils from '../../../../utils/ui';
@@ -16,7 +16,7 @@ const ChatBotAI = () => {
16
16
  <KeyboardAvoidingView
17
17
  style={styles.container}
18
18
  behavior={'padding'}
19
- keyboardVerticalOffset={0}
19
+ keyboardVerticalOffset={1}
20
20
  >
21
21
  <ChatHeader />
22
22
  <ChatMessageList messageList={messageState?.messages || []} />
@@ -15,6 +15,7 @@ import useStreamMessageStore from '../../../store/streamMessage';
15
15
  import Markdown, { Renderer, RendererInterface } from 'react-native-marked';
16
16
  import icons from '../../../assets/icons';
17
17
  import { events } from '../../../constants/events';
18
+ import { trans } from '../../../translation';
18
19
 
19
20
  interface ChatAIThinkingMessageItemProps {
20
21
  item: IMessageItem;
@@ -84,6 +85,7 @@ const ChatAIThinkingMessageItem = ({
84
85
  const streamMessage = useStreamMessageStore(
85
86
  (state) => state.streamMessage?.[item.id]
86
87
  );
88
+ const isStreaming = useStreamMessageStore((state) => state.isStreaming);
87
89
 
88
90
  const [display, setDisplay] = useState('');
89
91
  const indexRef = useRef(0);
@@ -148,7 +150,7 @@ const ChatAIThinkingMessageItem = ({
148
150
 
149
151
  return (
150
152
  <KContainer.View>
151
- {!isLast || streamMessage?.metadata?.status === 'done' ? (
153
+ {!(isLast && isStreaming) ? (
152
154
  <KListItem.Accordion
153
155
  header={renderHeader}
154
156
  key={item.id.toString()}
@@ -165,6 +167,16 @@ const ChatAIThinkingMessageItem = ({
165
167
  {isLast && <KImage.Base size={42} uri={icons.icon_thinking_step} />}
166
168
  </KContainer.View>
167
169
  )}
170
+ {/* Disclaimer */}
171
+ <KContainer.VisibleView visible={isLast && !isStreaming}>
172
+ <KLabel.Text
173
+ typo="TextSmNormal"
174
+ color={KColors.gray.light}
175
+ textAlign="center"
176
+ >
177
+ {trans('ai_answer_note')}
178
+ </KLabel.Text>
179
+ </KContainer.VisibleView>
168
180
  </KContainer.View>
169
181
  );
170
182
  };