diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index fa4f05311a..d1c79718cf 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -404,9 +404,9 @@ let chat: any = null; let tags = []; - // Read-only when viewing someone else's chat (e.g. via shared folder access) - $: readOnly = chat != null && chat.user_id !== $user?.id; - $: canClone = readOnly && ($user?.role === 'admin' || ($user?.permissions?.chat?.import ?? true)); + // Non-owners may reply when the sharing mode allows it, but cannot save chat edits. + $: isShared = chat != null && chat.user_id !== $user?.id; + $: canClone = isShared && ($user?.role === 'admin' || ($user?.permissions?.chat?.import ?? true)); let cloning = false; const cloneSharedChat = async () => { @@ -447,7 +447,7 @@ }); }; - $: if (readOnly && chat?.user_id) { + $: if (isShared && chat?.user_id) { void resolveChatOwner(chat.user_id); } else { chatOwner = null; @@ -499,7 +499,7 @@ } ); - if (!readOnly && $chatId && !$temporaryChatEnabled && !isTemporaryChatId($chatId)) { + if (!isShared && $chatId && !$temporaryChatEnabled && !isTemporaryChatId($chatId)) { const res = await updateChatById(localStorage.token, $chatId, { params }).catch((err) => { console.error('[tool permissions chat]', err); return null; @@ -763,7 +763,7 @@ const saveChatVariables = async (values) => { chatVariables = { ...chatVariables, ...values }; - if (readOnly) return; + if (isShared) return; if ($chatId && !$temporaryChatEnabled && !isTemporaryChatId($chatId)) { const res = await updateChatById(localStorage.token, $chatId, {}, chatVariables).catch( @@ -1299,7 +1299,7 @@ const emitTyping = (typing: boolean) => { if (!$socket?.connected || !joinedChatId) return; - if (typing && (joinedChatId !== $chatId || (readOnly && chat?.chat?.share_mode !== 'continue'))) + if (typing && (joinedChatId !== $chatId || (isShared && chat?.chat?.share_mode !== 'continue'))) return; if (typing ? Date.now() - lastTypingEmit < 2000 : !lastTypingEmit) return; lastTypingEmit = typing ? Date.now() : 0; @@ -1456,7 +1456,7 @@ if ( !sender?.id || sender.id === $user?.id || - (readOnly && chat?.chat?.share_mode !== 'continue') + (isShared && chat?.chat?.share_mode !== 'continue') ) return; if (event.data.data?.typing) { @@ -3103,7 +3103,7 @@ }; const createMessagePair = async (userPrompt) => { - if (readOnly) return; + if (isShared) return; messageInput?.setText(''); if (selectedModels.length === 0) { toast.error($i18n.t('Model not selected')); @@ -4506,7 +4506,7 @@ }; const saveChatHandler = async (_chatId, history) => { - if (readOnly) return; + if (isShared) return; if ($chatId == _chatId) { if (!$temporaryChatEnabled) { chat = await updateChatById(localStorage.token, _chatId, { @@ -4521,7 +4521,7 @@ }; const saveControls = async () => { - if (readOnly) return; + if (isShared) return; if (!$chatId || $temporaryChatEnabled) return; const loaded = chat?.chat ?? {}; if (equal(params, loaded.params ?? {}) && equal(chatFiles, loaded.files ?? [])) return; @@ -4883,7 +4883,7 @@ {:else} - {#if readOnly && chat?.chat?.share_mode !== 'continue'} + {#if isShared && chat?.chat?.share_mode !== 'continue'} {#if canClone}