-
Notifications
You must be signed in to change notification settings - Fork 60k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Enhance cloud synchronization functionality, support syncing delete operations for messages and conversations, and add support for automatic sync settings #5236
base: main
Are you sure you want to change the base?
Changes from 63 commits
1d0a40b
78c4084
1cce87a
cd354cf
d957397
284d33b
c440637
22f6129
5065091
22c7959
faac0d9
4f876f3
648e600
93bfb55
4b22aaf
621b148
eae593d
2ee2d50
5e1064a
0a6ddda
b2336f5
31f2829
e515f0f
fdb89af
fc97c4b
0745b64
d0b7ddc
5c51fd2
2fdb35b
31baa10
f1d69cb
2d68f17
0638db1
e8c7ac0
2bf72d0
c204031
ccacfec
6dc8681
6f3d753
5ae4921
370ce3e
9551f5d
35f5288
144fdc9
659a389
60bd3c5
89edebd
41242ca
cf7c6f2
c6657d3
31900cb
c4ae73d
9a025ae
98ab561
f80da8a
3e02a71
f45a693
7f3ec6d
dfd3d24
af23929
9a95d32
b2381b2
bf5cdc9
e3a2e78
36edbcd
9f58a66
36525d8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,6 +35,7 @@ export function useCommand(commands: Commands = {}) { | |
interface ChatCommands { | ||
new?: Command; | ||
newm?: Command; | ||
copy?: Command; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Incomplete
🔗 Analysis chainLGTM! New The addition of the To ensure proper implementation of the new This script will help verify that the 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Verify the implementation and usage of the new 'copy' command
# Test 1: Check for the implementation of the 'copy' command
echo "Checking for 'copy' command implementation:"
rg --type typescript "copy\s*:\s*\([^)]*\)\s*=>" -g '!app/command.ts'
# Test 2: Check for usage of the 'copy' command
echo "Checking for 'copy' command usage:"
rg --type typescript "copy\s*:" -g '!app/command.ts'
# Test 3: Check for any related UI elements or text
echo "Checking for related UI elements or text:"
rg --type typescript "copy" -g '!app/command.ts'
Length of output: 561 Script: #!/bin/bash
# Description: Verify the implementation and usage of the new 'copy' command
# Test 1: Check for the implementation of the 'copy' command
echo "Checking for 'copy' command implementation:"
rg "copy\s*:\s*\([^)]*\)\s*=>" -g '*.ts' -g '*.tsx'
# Test 2: Check for usage of the 'copy' command
echo "Checking for 'copy' command usage:"
rg "copy\s*:" -g '*.ts' -g '*.tsx'
# Test 3: Check for any related UI elements or text
echo "Checking for related UI elements or text:"
rg "copy" -g '*.ts' -g '*.tsx'
Length of output: 7136 |
||
next?: Command; | ||
prev?: Command; | ||
clear?: Command; | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -70,6 +70,7 @@ import { | |||||||||||||||||||
getMessageImages, | ||||||||||||||||||||
isVisionModel, | ||||||||||||||||||||
isDalle3, | ||||||||||||||||||||
removeOutdatedEntries, | ||||||||||||||||||||
showPlugins, | ||||||||||||||||||||
safeLocalStorage, | ||||||||||||||||||||
} from "../utils"; | ||||||||||||||||||||
|
@@ -1022,6 +1023,7 @@ function _Chat() { | |||||||||||||||||||
const chatCommands = useChatCommand({ | ||||||||||||||||||||
new: () => chatStore.newSession(), | ||||||||||||||||||||
newm: () => navigate(Path.NewChat), | ||||||||||||||||||||
copy: () => chatStore.copySession(), | ||||||||||||||||||||
prev: () => chatStore.nextSession(-1), | ||||||||||||||||||||
next: () => chatStore.nextSession(1), | ||||||||||||||||||||
clear: () => | ||||||||||||||||||||
|
@@ -1154,11 +1156,20 @@ function _Chat() { | |||||||||||||||||||
}; | ||||||||||||||||||||
|
||||||||||||||||||||
const deleteMessage = (msgId?: string) => { | ||||||||||||||||||||
chatStore.updateTargetSession( | ||||||||||||||||||||
session, | ||||||||||||||||||||
(session) => | ||||||||||||||||||||
(session.messages = session.messages.filter((m) => m.id !== msgId)), | ||||||||||||||||||||
); | ||||||||||||||||||||
chatStore.updateTargetSession(session, (session) => { | ||||||||||||||||||||
session.deletedMessageIds && | ||||||||||||||||||||
removeOutdatedEntries(session.deletedMessageIds); | ||||||||||||||||||||
session.messages = session.messages.filter((m) => { | ||||||||||||||||||||
Comment on lines
+1161
to
+1162
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Initialize In the Please apply the following diff to initialize const deleteMessage = (msgId?: string) => {
chatStore.updateCurrentSession((session) => {
+ if (!session.deletedMessageIds) {
+ session.deletedMessageIds = {} as Record<string, number>;
+ }
removeOutdatedEntries(session.deletedMessageIds);
session.messages = session.messages.filter((m) => {
if (m.id !== msgId) {
return true;
}
session.deletedMessageIds[m.id] = Date.now();
return false;
});
});
}; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||
if (m.id !== msgId) { | ||||||||||||||||||||
return true; | ||||||||||||||||||||
} | ||||||||||||||||||||
if (!session.deletedMessageIds) { | ||||||||||||||||||||
session.deletedMessageIds = {} as Record<string, number>; | ||||||||||||||||||||
} | ||||||||||||||||||||
session.deletedMessageIds[m.id] = Date.now(); | ||||||||||||||||||||
return false; | ||||||||||||||||||||
}); | ||||||||||||||||||||
}); | ||||||||||||||||||||
}; | ||||||||||||||||||||
|
||||||||||||||||||||
const onDelete = (msgId: string) => { | ||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -363,6 +363,21 @@ function SyncConfigModal(props: { onClose?: () => void }) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</select> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</ListItem> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<ListItem | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title={Locale.Settings.Sync.Config.EnableAutoSync.Title} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subTitle={Locale.Settings.Sync.Config.EnableAutoSync.SubTitle} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type="checkbox" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checked={syncStore.enableAutoSync} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(e) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
syncStore.update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(config) => (config.enableAutoSync = e.currentTarget.checked), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+374
to
+376
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid assignments within expressions. The assignment within the expression can lead to confusion and potential side effects. Consider refactoring to separate the assignment from the update function call. - syncStore.update(
- (config) => (config.enableAutoSync = e.currentTarget.checked),
- );
+ const enableAutoSync = e.currentTarget.checked;
+ syncStore.update((config) => {
+ config.enableAutoSync = enableAutoSync;
+ }); Committable suggestion
Suggested change
ToolsBiome
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
></input> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</ListItem> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+366
to
+379
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Refactor the assignment within the expression. The implementation of the automatic synchronization toggle looks good overall. However, there's a minor issue with the assignment within the expression in the To improve readability and avoid potential side effects, consider refactoring the onChange={(e) => {
- syncStore.update(
- (config) => (config.enableAutoSync = e.currentTarget.checked),
- );
+ const enableAutoSync = e.currentTarget.checked;
+ syncStore.update((config) => {
+ config.enableAutoSync = enableAutoSync;
+ });
}} This change separates the assignment from the update function call, making the code clearer and less prone to unexpected behavior. The overall implementation of the automatic synchronization feature is well-integrated into the existing UI and follows the established patterns in the codebase. 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Biome
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<ListItem | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title={Locale.Settings.Sync.Config.Proxy.Title} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subTitle={Locale.Settings.Sync.Config.Proxy.SubTitle} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -129,7 +129,9 @@ export const getServerSideConfig = () => { | |
if (customModels) customModels += ","; | ||
customModels += DEFAULT_MODELS.filter( | ||
(m) => | ||
(m.name.startsWith("gpt-4") || m.name.startsWith("chatgpt-4o") || m.name.startsWith("o1")) && | ||
(m.name.startsWith("gpt-4") || | ||
m.name.startsWith("chatgpt-4o") || | ||
m.name.startsWith("o1")) && | ||
Comment on lines
+132
to
+134
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Eliminate code duplication in model filtering logic The model filtering logic is duplicated between this file and Consider extracting the shared logic into a utility function: // app/utils/model-filters.ts
export const MODEL_PREFIXES = {
EXCLUDED: ["gpt-4", "chatgpt-4o", "o1"],
ALLOWED: ["gpt-4o-mini"]
};
export function isModelAllowed(modelId: string): boolean {
return (
!MODEL_PREFIXES.EXCLUDED.some(prefix => modelId.startsWith(prefix)) ||
MODEL_PREFIXES.ALLOWED.some(prefix => modelId.startsWith(prefix))
);
} Then use this utility function in both locations: - (m.name.startsWith("gpt-4") ||
- m.name.startsWith("chatgpt-4o") ||
- m.name.startsWith("o1")) &&
- !m.name.startsWith("gpt-4o-mini")
+ !isModelAllowed(m.name) |
||
!m.name.startsWith("gpt-4o-mini"), | ||
) | ||
.map((m) => "-" + m.name) | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,8 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getMessageTextContent, trimTopic } from "../utils"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getMessageTextContent, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
trimTopic, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
removeOutdatedEntries, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from "../utils"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { indexedDBStorage } from "@/app/utils/indexedDB-storage"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { nanoid } from "nanoid"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -29,6 +33,7 @@ import { ModelConfig, ModelType, useAppConfig } from "./config"; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useAccessStore } from "./access"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { collectModelsWithDefaultModel } from "../utils/model"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { createEmptyMask, Mask } from "./mask"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useSyncStore } from "./sync"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const localStorage = safeLocalStorage(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -81,6 +86,7 @@ export interface ChatSession { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastUpdate: number; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastSummarizeIndex: number; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
clearContextIndex?: number; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deletedMessageIds?: Record<string, number>; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mask: Mask; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -104,6 +110,7 @@ function createEmptySession(): ChatSession { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastUpdate: Date.now(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastSummarizeIndex: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deletedMessageIds: {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mask: createEmptyMask(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -189,9 +196,19 @@ function fillTemplateWith(input: string, modelConfig: ModelConfig) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return output; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let cloudSyncTimer: any = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Specify a more precise type for Using the Apply this diff to specify a more precise type: -let cloudSyncTimer: any = null;
+let cloudSyncTimer: ReturnType<typeof setTimeout> | null = null; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function noticeCloudSync(): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const syncStore = useSyncStore.getState(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cloudSyncTimer && clearTimeout(cloudSyncTimer); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cloudSyncTimer = setTimeout(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
syncStore.autoSync(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, 500); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const DEFAULT_CHAT_STATE = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions: [createEmptySession()], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
currentSessionIndex: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deletedSessionIds: {} as Record<string, number>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastInput: "", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -241,6 +258,28 @@ export const useChatStore = createPersistStore( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
copySession() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set((state) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { sessions, currentSessionIndex } = state; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const emptySession = createEmptySession(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// copy the session | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const curSession = JSON.parse( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JSON.stringify(sessions[currentSessionIndex]), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
curSession.id = emptySession.id; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
curSession.lastUpdate = emptySession.lastUpdate; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const newSessions = [...sessions]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
newSessions.splice(0, 0, curSession); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
currentSessionIndex: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions: newSessions, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+261
to
+281
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid using Using Apply this diff to use -const curSession = JSON.parse(
- JSON.stringify(sessions[currentSessionIndex]),
-);
+const curSession = structuredClone(sessions[currentSessionIndex]); If +import cloneDeep from 'lodash.clonedeep';
+
const curSession = cloneDeep(sessions[currentSessionIndex]); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
moveSession(from: number, to: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set((state) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { sessions, currentSessionIndex: oldIndex } = state; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -303,7 +342,18 @@ export const useChatStore = createPersistStore( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!deletedSession) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sessions = get().sessions.slice(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions.splice(index, 1); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const deletedSessionIds = { ...get().deletedSessionIds }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
removeOutdatedEntries(deletedSessionIds); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const hasDelSessions = sessions.splice(index, 1); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (hasDelSessions?.length) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hasDelSessions.forEach((session) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (session.messages.length > 0) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deletedSessionIds[session.id] = Date.now(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const currentIndex = get().currentSessionIndex; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let nextIndex = Math.min( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -320,19 +370,24 @@ export const useChatStore = createPersistStore( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const restoreState = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
currentSessionIndex: get().currentSessionIndex, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions: get().sessions.slice(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deletedSessionIds: get().deletedSessionIds, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set(() => ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
currentSessionIndex: nextIndex, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deletedSessionIds, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
})); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
noticeCloudSync(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
showToast( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Locale.Home.DeleteToast, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
text: Locale.Home.Revert, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onClick() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set(() => restoreState); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
noticeCloudSync(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5000, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -353,13 +408,33 @@ export const useChatStore = createPersistStore( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return session; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortSessions() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const currentSession = get().currentSession(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sessions = get().sessions.slice(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions.sort( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(a, b) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+415
to
+418
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Simplify session sorting by using numeric comparison Since Apply this diff to refine the sorting function: sessions.sort(
- (a, b) =>
- new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(),
+ (a, b) => b.lastUpdate - a.lastUpdate,
);
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const currentSessionIndex = sessions.findIndex((session) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return session && currentSession && session.id === currentSession.id; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set((state) => ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
currentSessionIndex, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sessions, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
})); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+411
to
+427
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix session comparison and optimize sorting implementation. There are two issues in the sorting implementation:
Apply these fixes: sessions.sort(
- (a, b) =>
- new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(),
+ (a, b) => b.lastUpdate - a.lastUpdate,
);
const currentSessionIndex = sessions.findIndex((session) => {
- return session && currentSession && session.id === currentSession.id;
+ return session && currentSession && session.id === currentSession?.id;
}); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onNewMessage(message: ChatMessage, targetSession: ChatSession) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get().updateTargetSession(targetSession, (session) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
session.messages = session.messages.concat(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
session.lastUpdate = Date.now(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get().updateStat(message, targetSession); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get().summarizeSession(false, targetSession); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get().sortSessions(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
noticeCloudSync(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async onUserInput(content: string, attachImages?: string[]) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Enhance security measures for API key handling
Several security considerations:
Consider these improvements:
Consider implementing: