@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.
- package/lib/module/hooks/useFileDownload.js +19 -17
- package/lib/module/hooks/useFileDownload.js.map +1 -1
- package/lib/module/hooks/useMuteConversation.js +4 -6
- package/lib/module/hooks/useMuteConversation.js.map +1 -1
- package/lib/module/store/conversation.js +11 -0
- package/lib/module/store/conversation.js.map +1 -1
- package/lib/typescript/src/hooks/useFileDownload.d.ts.map +1 -1
- package/lib/typescript/src/store/conversation.d.ts +1 -0
- package/lib/typescript/src/store/conversation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/hooks/useFileDownload.ts +19 -18
- package/src/hooks/useMuteConversation.ts +6 -6
- package/src/store/conversation.ts +12 -0
|
@@ -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 =
|
|
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
|
|
143
|
-
//
|
|
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
|
-
|
|
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
|
|
156
|
-
|
|
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
|
-
}
|
|
160
|
-
|
|
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","
|
|
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().
|
|
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().
|
|
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","
|
|
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;
|
|
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":"
|
|
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,
|
|
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,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
|
|
176
|
-
//
|
|
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
|
-
|
|
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
|
|
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
|
-
}
|
|
191
|
-
|
|
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
|
-
.
|
|
20
|
-
|
|
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
|
-
.
|
|
37
|
-
|
|
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(
|