fix(chat): preserve locked message content on unlock

This commit is contained in:
2026-07-01 10:47:55 +08:00
parent 9c45c7eb69
commit 617f1d4777
8 changed files with 130 additions and 29 deletions
@@ -10,7 +10,6 @@ export class ChatLocalMessageStore {
async markMessageUnlocked(
messageId: string,
content: string,
lockDetail?: ChatLockDetailData,
): Promise<Result<void>> {
return Result.wrap(async () => {
@@ -21,11 +20,10 @@ export class ChatLocalMessageStore {
let changed = false;
const updatedMessages = localResult.data.map((message) => {
if (message.id !== messageId) return message;
if (!shouldMarkMessageUnlocked(message, messageId)) return message;
changed = true;
return ChatMessage.from({
...message.toJson(),
content,
lockDetail: lockDetail ?? {
...message.lockDetail,
locked: false,
@@ -106,3 +104,17 @@ export class ChatLocalMessageStore {
});
}
}
function shouldMarkMessageUnlocked(
message: ChatMessage,
messageId: string,
): boolean {
if (message.id !== messageId) return false;
if (message.role !== "assistant") return false;
if (message.lockDetail.locked !== true) return false;
return (
Boolean(message.image.url) ||
message.lockDetail.reason === "private_message" ||
message.lockDetail.reason === "voice_message"
);
}
-2
View File
@@ -66,12 +66,10 @@ export class ChatRepository implements IChatRepository {
/** 把本地缓存中的单条锁定消息标记为已解锁。 */
async markPrivateMessageUnlockedInLocal(
messageId: string,
content: string,
lockDetail?: ChatLockDetailData,
): Promise<Result<void>> {
return this.localMessages.markMessageUnlocked(
messageId,
content,
lockDetail,
);
}
@@ -51,7 +51,6 @@ export interface IChatRepository {
/** 把本地缓存中的单条锁定消息标记为已解锁。 */
markPrivateMessageUnlockedInLocal(
messageId: string,
content: string,
lockDetail?: ChatLockDetailData,
): Promise<Result<void>>;