@droppii-org/chat-mobile 0.2.34 → 0.2.35

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.
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
- import { Platform, Share } from 'react-native';
5
4
  import RNFS from 'react-native-fs';
6
5
  import FileViewer from 'react-native-file-viewer';
6
+ import { saveDocuments } from '@react-native-documents/picker';
7
7
  import { UIUtils } from "../utils/UIUtils.js";
8
8
  import { trans } from "../translation/index.js";
9
+ import { getMimeType } from "../utils/imageUtils.js";
9
10
  const INITIAL_STATE = {
10
11
  status: 'idle',
11
12
  progress: 0,
@@ -15,7 +16,6 @@ const INITIAL_STATE = {
15
16
  error: null
16
17
  };
17
18
  const CacheDir = RNFS.CachesDirectoryPath;
18
- const DownloadDir = Platform.OS === 'android' ? RNFS.DownloadDirectoryPath : RNFS.CachesDirectoryPath;
19
19
  export const useFileDownload = (fileName, url) => {
20
20
  const [state, setState] = useState(INITIAL_STATE);
21
21
  const jobIdRef = useRef(null);
@@ -114,7 +114,7 @@ export const useFileDownload = (fileName, url) => {
114
114
  // fall through to search dirs
115
115
  }
116
116
  }
117
- const searchDirs = Platform.OS === 'android' ? [DownloadDir, CacheDir] : [CacheDir];
117
+ const searchDirs = [CacheDir];
118
118
  for (const dir of searchDirs) {
119
119
  const dirPath = `${dir}/${fileName}`;
120
120
  try {
@@ -139,32 +139,34 @@ export const useFileDownload = (fileName, url) => {
139
139
  if (path) openFile(path);
140
140
  }, [state.status, state.localPath, fileName, openFile, runDownload]);
141
141
 
142
- // Download button — cancel if in progress; otherwise download and expose to Files app.
143
- // iOS: download to cache then show share sheet (user can tap "Save to Files").
144
- // Android: download to Downloads dir and trigger media scan.
142
+ // Download button — cancel if in progress
143
+ // Download to cache then show "Save As" document picker
145
144
  const handleDownload = useCallback(async () => {
146
145
  if (state.status === 'downloading') {
147
146
  cancel();
148
147
  return;
149
148
  }
150
- if (Platform.OS === 'ios') {
149
+ try {
151
150
  const cachedPath = `${CacheDir}/${fileName}`;
152
151
  const exists = await RNFS.exists(cachedPath);
153
152
  const localPath = exists ? cachedPath : await runDownload(CacheDir);
154
153
  if (localPath) {
155
- await Share.share({
156
- url: `file://${localPath}`
154
+ await saveDocuments({
155
+ sourceUris: [`file://${localPath}`],
156
+ mimeType: getMimeType(fileName),
157
+ fileName,
158
+ copy: true
159
+ });
160
+ UIUtils.toast.open({
161
+ title: trans('chat:file_downloaded_success', {
162
+ fileName
163
+ }),
164
+ theme: 'info'
157
165
  });
158
166
  }
159
- } else {
160
- await runDownload(DownloadDir);
167
+ } catch (error) {
168
+ console.error(error);
161
169
  }
162
- UIUtils.toast.open({
163
- title: trans('chat:file_downloaded_success', {
164
- fileName
165
- }),
166
- theme: 'info'
167
- });
168
170
  }, [state.status, fileName, runDownload, cancel]);
169
171
  return {
170
172
  state,
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","useState","Platform","Share","RNFS","FileViewer","UIUtils","trans","INITIAL_STATE","status","progress","receivedMB","totalMB","localPath","error","CacheDir","CachesDirectoryPath","DownloadDir","OS","DownloadDirectoryPath","useFileDownload","fileName","url","state","setState","jobIdRef","cancelledRef","openFile","path","open","showOpenWithDialog","showAppsSuggestions","toast","title","theme","runDownload","destDir","destPath","current","MB","ret","downloadFile","fromUrl","toFile","res","r","bytesWritten","t","contentLength","prev","Math","round","jobId","result","promise","statusCode","Error","e","message","cancel","stopDownload","handleView","exists","searchDirs","dir","dirPath","handleDownload","cachedPath","share"],"sourceRoot":"../../../src","sources":["hooks/useFileDownload.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","RNFS","FileViewer","saveDocuments","UIUtils","trans","getMimeType","INITIAL_STATE","status","progress","receivedMB","totalMB","localPath","error","CacheDir","CachesDirectoryPath","useFileDownload","fileName","url","state","setState","jobIdRef","cancelledRef","openFile","path","open","showOpenWithDialog","showAppsSuggestions","toast","title","theme","runDownload","destDir","destPath","current","MB","ret","downloadFile","fromUrl","toFile","res","r","bytesWritten","t","contentLength","prev","Math","round","jobId","result","promise","statusCode","Error","e","message","cancel","stopDownload","handleView","exists","searchDirs","dir","dirPath","handleDownload","cachedPath","sourceUris","mimeType","copy","console"],"sourceRoot":"../../../src","sources":["hooks/useFileDownload.ts"],"mappings":"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","ignoreList":[]}
@@ -10,10 +10,9 @@ export function useMuteConversation() {
10
10
  conversationID: conversation.conversationID,
11
11
  opt: MessageReceiveOptType.NotNotify
12
12
  });
13
- useConversationStore.getState().updateConversations([{
14
- ...conversation,
13
+ useConversationStore.getState().updateConversation(conversation.conversationID, {
15
14
  recvMsgOpt: MessageReceiveOptType.NotNotify
16
- }]);
15
+ });
17
16
  }, []);
18
17
  const unmuteConversation = useCallback(async conversation => {
19
18
  if (conversation == null) return;
@@ -21,10 +20,9 @@ export function useMuteConversation() {
21
20
  conversationID: conversation.conversationID,
22
21
  opt: MessageReceiveOptType.Normal
23
22
  });
24
- useConversationStore.getState().updateConversations([{
25
- ...conversation,
23
+ useConversationStore.getState().updateConversation(conversation.conversationID, {
26
24
  recvMsgOpt: MessageReceiveOptType.Normal
27
- }]);
25
+ });
28
26
  }, []);
29
27
  return {
30
28
  muteConversation,
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","OpenIMSDK","MessageReceiveOptType","useConversationStore","useMuteConversation","muteConversation","conversation","setConversationRecvMessageOpt","conversationID","opt","NotNotify","getState","updateConversations","recvMsgOpt","unmuteConversation","Normal"],"sourceRoot":"../../../src","sources":["hooks/useMuteConversation.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,OAAOC,SAAS,IACdC,qBAAqB,QAChB,+BAA+B;AAEtC,SAASC,oBAAoB,QAAQ,mBAAU;AAE/C,OAAO,SAASC,mBAAmBA,CAAA,EAAG;EACpC,MAAMC,gBAAgB,GAAGL,WAAW,CAClC,MAAOM,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,MAAML,SAAS,CAACM,6BAA6B,CAAC;MAC5CC,cAAc,EAAEF,YAAY,CAACE,cAAc;MAC3CC,GAAG,EAAEP,qBAAqB,CAACQ;IAC7B,CAAC,CAAC;IACFP,oBAAoB,CACjBQ,QAAQ,CAAC,CAAC,CACVC,mBAAmB,CAAC,CACnB;MAAE,GAAGN,YAAY;MAAEO,UAAU,EAAEX,qBAAqB,CAACQ;IAAU,CAAC,CACjE,CAAC;EACN,CAAC,EACD,EACF,CAAC;EAED,MAAMI,kBAAkB,GAAGd,WAAW,CACpC,MAAOM,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,MAAML,SAAS,CAACM,6BAA6B,CAAC;MAC5CC,cAAc,EAAEF,YAAY,CAACE,cAAc;MAC3CC,GAAG,EAAEP,qBAAqB,CAACa;IAC7B,CAAC,CAAC;IACFZ,oBAAoB,CACjBQ,QAAQ,CAAC,CAAC,CACVC,mBAAmB,CAAC,CACnB;MAAE,GAAGN,YAAY;MAAEO,UAAU,EAAEX,qBAAqB,CAACa;IAAO,CAAC,CAC9D,CAAC;EACN,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEV,gBAAgB;IAAES;EAAmB,CAAC;AACjD","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","OpenIMSDK","MessageReceiveOptType","useConversationStore","useMuteConversation","muteConversation","conversation","setConversationRecvMessageOpt","conversationID","opt","NotNotify","getState","updateConversation","recvMsgOpt","unmuteConversation","Normal"],"sourceRoot":"../../../src","sources":["hooks/useMuteConversation.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,OAAOC,SAAS,IACdC,qBAAqB,QAChB,+BAA+B;AAEtC,SAASC,oBAAoB,QAAQ,mBAAU;AAE/C,OAAO,SAASC,mBAAmBA,CAAA,EAAG;EACpC,MAAMC,gBAAgB,GAAGL,WAAW,CAClC,MAAOM,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,MAAML,SAAS,CAACM,6BAA6B,CAAC;MAC5CC,cAAc,EAAEF,YAAY,CAACE,cAAc;MAC3CC,GAAG,EAAEP,qBAAqB,CAACQ;IAC7B,CAAC,CAAC;IACFP,oBAAoB,CACjBQ,QAAQ,CAAC,CAAC,CACVC,kBAAkB,CAACN,YAAY,CAACE,cAAc,EAAE;MAC/CK,UAAU,EAAEX,qBAAqB,CAACQ;IACpC,CAAC,CAAC;EACN,CAAC,EACD,EACF,CAAC;EAED,MAAMI,kBAAkB,GAAGd,WAAW,CACpC,MAAOM,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,MAAML,SAAS,CAACM,6BAA6B,CAAC;MAC5CC,cAAc,EAAEF,YAAY,CAACE,cAAc;MAC3CC,GAAG,EAAEP,qBAAqB,CAACa;IAC7B,CAAC,CAAC;IACFZ,oBAAoB,CACjBQ,QAAQ,CAAC,CAAC,CACVC,kBAAkB,CAACN,YAAY,CAACE,cAAc,EAAE;MAC/CK,UAAU,EAAEX,qBAAqB,CAACa;IACpC,CAAC,CAAC;EACN,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEV,gBAAgB;IAAES;EAAmB,CAAC;AACjD","ignoreList":[]}
@@ -16,6 +16,17 @@ export const useConversationStore = create()((set, get) => ({
16
16
  if (id == null) return;
17
17
  return get().map[id];
18
18
  },
19
+ updateConversation(id, data) {
20
+ const existing = get().map[id];
21
+ if (!existing) return;
22
+ set(sortConversation({
23
+ ...get().map,
24
+ [id]: {
25
+ ...existing,
26
+ ...data
27
+ }
28
+ }));
29
+ },
19
30
  updateConversations(conversations) {
20
31
  set(sortConversation(conversations.reduce((pre, curr) => {
21
32
  pre[curr.conversationID] = curr;
@@ -1 +1 @@
1
- {"version":3,"names":["create","sortConversation","useConversationStore","set","get","list","map","newConversationSignal","setCurrentConversation","id","currentConversationId","getCurrentConversation","updateConversations","conversations","reduce","pre","curr","conversationID","removeConversation","newMap","filter","item","reset","undefined","useConversation","state"],"sourceRoot":"../../../src","sources":["store/conversation.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAChC,SAASC,gBAAgB,QAAQ,0BAAuB;AAsBxD,OAAO,MAAMC,oBAAoB,GAAGF,MAAM,CAAoB,CAAC,CAAC,CAACG,GAAG,EAAEC,GAAG,MAAM;EAC7EC,IAAI,EAAE,EAAE;EACRC,GAAG,EAAE,CAAC,CAAC;EACPC,qBAAqB,EAAE,CAAC;EACxBC,sBAAsBA,CAACC,EAAE,EAAE;IACzBN,GAAG,CAAC;MAAEO,qBAAqB,EAAED;IAAG,CAAC,CAAC;EACpC,CAAC;EACDE,sBAAsBA,CAAA,EAAG;IACvB,MAAMF,EAAE,GAAGL,GAAG,CAAC,CAAC,CAACM,qBAAqB;IACtC,IAAID,EAAE,IAAI,IAAI,EAAE;IAEhB,OAAOL,GAAG,CAAC,CAAC,CAACE,GAAG,CAACG,EAAE,CAAC;EACtB,CAAC;EACDG,mBAAmBA,CAACC,aAAa,EAAE;IACjCV,GAAG,CACDF,gBAAgB,CACdY,aAAa,CAACC,MAAM,CAClB,CAACC,GAAG,EAAEC,IAAI,KAAK;MACbD,GAAG,CAACC,IAAI,CAACC,cAAc,CAAC,GAAGD,IAAI;MAC/B,OAAOD,GAAG;IACZ,CAAC,EACD;MAAE,GAAGX,GAAG,CAAC,CAAC,CAACE;IAAI,CACjB,CACF,CACF,CAAC;EACH,CAAC;EACDY,kBAAkBA,CAACT,EAAE,EAAE;IACrB,MAAMU,MAAM,GAAG;MAAE,GAAGf,GAAG,CAAC,CAAC,CAACE;IAAI,CAAC;IAC/B,OAAOa,MAAM,CAACV,EAAE,CAAC;IAEjBN,GAAG,CAAC;MACFG,GAAG,EAAEa,MAAM;MACXd,IAAI,EAAED,GAAG,CAAC,CAAC,CAACC,IAAI,CAACe,MAAM,CAAEC,IAAI,IAAKA,IAAI,KAAKZ,EAAE;IAC/C,CAAC,CAAC;EACJ,CAAC;EACDa,KAAKA,CAAA,EAAG;IACNnB,GAAG,CAAC;MACFO,qBAAqB,EAAEa,SAAS;MAChClB,IAAI,EAAE,EAAE;MACRC,GAAG,EAAE,CAAC,CAAC;MACPC,qBAAqB,EAAE;IACzB,CAAC,CAAC;EACJ;AACF,CAAC,CAAC,CAAC;AAEH,OAAO,MAAMiB,eAAe,GAAIf,EAAU,IAAmC;EAC3E,OAAOP,oBAAoB,CAAEuB,KAAK,IAAKA,KAAK,CAACnB,GAAG,CAACG,EAAE,CAAC,CAAC;AACvD,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["create","sortConversation","useConversationStore","set","get","list","map","newConversationSignal","setCurrentConversation","id","currentConversationId","getCurrentConversation","updateConversation","data","existing","updateConversations","conversations","reduce","pre","curr","conversationID","removeConversation","newMap","filter","item","reset","undefined","useConversation","state"],"sourceRoot":"../../../src","sources":["store/conversation.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAChC,SAASC,gBAAgB,QAAQ,0BAAuB;AAuBxD,OAAO,MAAMC,oBAAoB,GAAGF,MAAM,CAAoB,CAAC,CAAC,CAACG,GAAG,EAAEC,GAAG,MAAM;EAC7EC,IAAI,EAAE,EAAE;EACRC,GAAG,EAAE,CAAC,CAAC;EACPC,qBAAqB,EAAE,CAAC;EACxBC,sBAAsBA,CAACC,EAAE,EAAE;IACzBN,GAAG,CAAC;MAAEO,qBAAqB,EAAED;IAAG,CAAC,CAAC;EACpC,CAAC;EACDE,sBAAsBA,CAAA,EAAG;IACvB,MAAMF,EAAE,GAAGL,GAAG,CAAC,CAAC,CAACM,qBAAqB;IACtC,IAAID,EAAE,IAAI,IAAI,EAAE;IAEhB,OAAOL,GAAG,CAAC,CAAC,CAACE,GAAG,CAACG,EAAE,CAAC;EACtB,CAAC;EACDG,kBAAkBA,CAACH,EAAE,EAAEI,IAAI,EAAE;IAC3B,MAAMC,QAAQ,GAAGV,GAAG,CAAC,CAAC,CAACE,GAAG,CAACG,EAAE,CAAC;IAC9B,IAAI,CAACK,QAAQ,EAAE;IAEfX,GAAG,CACDF,gBAAgB,CAAC;MACf,GAAGG,GAAG,CAAC,CAAC,CAACE,GAAG;MACZ,CAACG,EAAE,GAAG;QAAE,GAAGK,QAAQ;QAAE,GAAGD;MAAK;IAC/B,CAAC,CACH,CAAC;EACH,CAAC;EACDE,mBAAmBA,CAACC,aAAa,EAAE;IACjCb,GAAG,CACDF,gBAAgB,CACde,aAAa,CAACC,MAAM,CAClB,CAACC,GAAG,EAAEC,IAAI,KAAK;MACbD,GAAG,CAACC,IAAI,CAACC,cAAc,CAAC,GAAGD,IAAI;MAC/B,OAAOD,GAAG;IACZ,CAAC,EACD;MAAE,GAAGd,GAAG,CAAC,CAAC,CAACE;IAAI,CACjB,CACF,CACF,CAAC;EACH,CAAC;EACDe,kBAAkBA,CAACZ,EAAE,EAAE;IACrB,MAAMa,MAAM,GAAG;MAAE,GAAGlB,GAAG,CAAC,CAAC,CAACE;IAAI,CAAC;IAC/B,OAAOgB,MAAM,CAACb,EAAE,CAAC;IAEjBN,GAAG,CAAC;MACFG,GAAG,EAAEgB,MAAM;MACXjB,IAAI,EAAED,GAAG,CAAC,CAAC,CAACC,IAAI,CAACkB,MAAM,CAAEC,IAAI,IAAKA,IAAI,KAAKf,EAAE;IAC/C,CAAC,CAAC;EACJ,CAAC;EACDgB,KAAKA,CAAA,EAAG;IACNtB,GAAG,CAAC;MACFO,qBAAqB,EAAEgB,SAAS;MAChCrB,IAAI,EAAE,EAAE;MACRC,GAAG,EAAE,CAAC,CAAC;MACPC,qBAAqB,EAAE;IACzB,CAAC,CAAC;EACJ;AACF,CAAC,CAAC,CAAC;AAEH,OAAO,MAAMoB,eAAe,GAAIlB,EAAU,IAAmC;EAC3E,OAAOP,oBAAoB,CAAE0B,KAAK,IAAKA,KAAK,CAACtB,GAAG,CAACG,EAAE,CAAC,CAAC;AACvD,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useFileDownload.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useFileDownload.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAiBD,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,KAAK,MAAM;;;;CAsK5D,CAAC"}
1
+ {"version":3,"file":"useFileDownload.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useFileDownload.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAaD,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,KAAK,MAAM;;;;CA0K5D,CAAC"}
@@ -8,6 +8,7 @@ export interface ConversationStore {
8
8
  map: Record<ConversationID, ConversationItem>;
9
9
  /** Signal incremented when a truly new conversation arrives and a full refetch is needed. */
10
10
  newConversationSignal: number;
11
+ updateConversation(id: ConversationID, data: Partial<ConversationItem>): void;
11
12
  updateConversations(conversations: ConversationItem[]): void;
12
13
  /**
13
14
  * Patches existing conversations with real-time data from OpenIM events.
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/store/conversation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,KAAK,cAAc,GAAG,MAAM,CAAC;AAE7B,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CAAC,EAAE,cAAc,CAAC;IACvC,sBAAsB,CAAC,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClD,sBAAsB,IAAI,gBAAgB,GAAG,SAAS,CAAC;IACvD,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC9C,6FAA6F;IAC7F,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAC7D;;;OAGG;IACH,kBAAkB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,eAAO,MAAM,oBAAoB,gFA2C9B,CAAC;AAEJ,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,KAAG,gBAAgB,GAAG,SAE/D,CAAC"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/store/conversation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,KAAK,cAAc,GAAG,MAAM,CAAC;AAE7B,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CAAC,EAAE,cAAc,CAAC;IACvC,sBAAsB,CAAC,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClD,sBAAsB,IAAI,gBAAgB,GAAG,SAAS,CAAC;IACvD,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC9C,6FAA6F;IAC7F,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAC9E,mBAAmB,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAC7D;;;OAGG;IACH,kBAAkB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,eAAO,MAAM,oBAAoB,gFAsD9B,CAAC;AAEJ,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,KAAG,gBAAgB,GAAG,SAE/D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@droppii-org/chat-mobile",
3
- "version": "0.2.34",
3
+ "version": "0.2.35",
4
4
  "description": "Droppii chat mobile",
5
5
  "keywords": [
6
6
  "react-native",
@@ -1,9 +1,10 @@
1
1
  import { useCallback, useEffect, useRef, useState } from 'react';
2
- import { Platform, Share } from 'react-native';
3
2
  import RNFS from 'react-native-fs';
4
3
  import FileViewer from 'react-native-file-viewer';
4
+ import { saveDocuments } from '@react-native-documents/picker';
5
5
  import { UIUtils } from '../utils/UIUtils';
6
6
  import { trans } from '../translation';
7
+ import { getMimeType } from '../utils/imageUtils';
7
8
 
8
9
  export type DownloadStatus = 'idle' | 'downloading' | 'done' | 'error';
9
10
 
@@ -26,10 +27,6 @@ const INITIAL_STATE: DownloadState = {
26
27
  };
27
28
 
28
29
  const CacheDir = RNFS.CachesDirectoryPath;
29
- const DownloadDir =
30
- Platform.OS === 'android'
31
- ? RNFS.DownloadDirectoryPath
32
- : RNFS.CachesDirectoryPath;
33
30
 
34
31
  export const useFileDownload = (fileName: string, url: string) => {
35
32
  const [state, setState] = useState<DownloadState>(INITIAL_STATE);
@@ -145,8 +142,7 @@ export const useFileDownload = (fileName: string, url: string) => {
145
142
  }
146
143
  }
147
144
 
148
- const searchDirs =
149
- Platform.OS === 'android' ? [DownloadDir, CacheDir] : [CacheDir];
145
+ const searchDirs = [CacheDir];
150
146
  for (const dir of searchDirs) {
151
147
  const dirPath = `${dir}/${fileName}`;
152
148
  try {
@@ -172,28 +168,33 @@ export const useFileDownload = (fileName: string, url: string) => {
172
168
  if (path) openFile(path);
173
169
  }, [state.status, state.localPath, fileName, openFile, runDownload]);
174
170
 
175
- // Download button — cancel if in progress; otherwise download and expose to Files app.
176
- // iOS: download to cache then show share sheet (user can tap "Save to Files").
177
- // Android: download to Downloads dir and trigger media scan.
171
+ // Download button — cancel if in progress
172
+ // Download to cache then show "Save As" document picker
178
173
  const handleDownload = useCallback(async () => {
179
174
  if (state.status === 'downloading') {
180
175
  cancel();
181
176
  return;
182
177
  }
183
- if (Platform.OS === 'ios') {
178
+ try {
184
179
  const cachedPath = `${CacheDir}/${fileName}`;
185
180
  const exists = await RNFS.exists(cachedPath);
186
181
  const localPath = exists ? cachedPath : await runDownload(CacheDir);
182
+
187
183
  if (localPath) {
188
- await Share.share({ url: `file://${localPath}` });
184
+ await saveDocuments({
185
+ sourceUris: [`file://${localPath}`],
186
+ mimeType: getMimeType(fileName),
187
+ fileName,
188
+ copy: true,
189
+ });
190
+ UIUtils.toast.open({
191
+ title: trans('chat:file_downloaded_success', { fileName }),
192
+ theme: 'info',
193
+ });
189
194
  }
190
- } else {
191
- await runDownload(DownloadDir);
195
+ } catch (error) {
196
+ console.error(error);
192
197
  }
193
- UIUtils.toast.open({
194
- title: trans('chat:file_downloaded_success', { fileName }),
195
- theme: 'info',
196
- });
197
198
  }, [state.status, fileName, runDownload, cancel]);
198
199
 
199
200
  return { state, handleView, handleDownload };
@@ -16,9 +16,9 @@ export function useMuteConversation() {
16
16
  });
17
17
  useConversationStore
18
18
  .getState()
19
- .updateConversations([
20
- { ...conversation, recvMsgOpt: MessageReceiveOptType.NotNotify },
21
- ]);
19
+ .updateConversation(conversation.conversationID, {
20
+ recvMsgOpt: MessageReceiveOptType.NotNotify,
21
+ });
22
22
  },
23
23
  []
24
24
  );
@@ -33,9 +33,9 @@ export function useMuteConversation() {
33
33
  });
34
34
  useConversationStore
35
35
  .getState()
36
- .updateConversations([
37
- { ...conversation, recvMsgOpt: MessageReceiveOptType.Normal },
38
- ]);
36
+ .updateConversation(conversation.conversationID, {
37
+ recvMsgOpt: MessageReceiveOptType.Normal,
38
+ });
39
39
  },
40
40
  []
41
41
  );
@@ -12,6 +12,7 @@ export interface ConversationStore {
12
12
  map: Record<ConversationID, ConversationItem>;
13
13
  /** Signal incremented when a truly new conversation arrives and a full refetch is needed. */
14
14
  newConversationSignal: number;
15
+ updateConversation(id: ConversationID, data: Partial<ConversationItem>): void;
15
16
  updateConversations(conversations: ConversationItem[]): void;
16
17
  /**
17
18
  * Patches existing conversations with real-time data from OpenIM events.
@@ -34,6 +35,17 @@ export const useConversationStore = create<ConversationStore>()((set, get) => ({
34
35
 
35
36
  return get().map[id];
36
37
  },
38
+ updateConversation(id, data) {
39
+ const existing = get().map[id];
40
+ if (!existing) return;
41
+
42
+ set(
43
+ sortConversation({
44
+ ...get().map,
45
+ [id]: { ...existing, ...data },
46
+ })
47
+ );
48
+ },
37
49
  updateConversations(conversations) {
38
50
  set(
39
51
  sortConversation(