Skip to content

Commit 5ef06bf

Browse files
RainyNight9medcl
andauthored
fix: service switching error (#539)
* fix: service switching error * build: build error * chore: chat content can be copied * docs: update notes * fix: service switching error * chore: change to send cancel event to ws_cancel * chore: add ws-cancel --------- Co-authored-by: medcl <m@medcl.net>
1 parent 2b59add commit 5ef06bf

16 files changed

Lines changed: 98 additions & 167 deletions

File tree

docs/content.en/docs/release-notes/_index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ Information about release notes of Coco Server is provided here.
5959
- fix: server image loading failure #534
6060
- chore: skip register server that not logged in #536
6161
- refactor: service info related components #537
62+
- fix: service switching error #539
63+
- chore: chat content can be copied #539
6264

6365
## 0.4.0 (2025-04-27)
6466

src-tauri/src/assistant/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ pub async fn new_chat<R: Runtime>(
141141

142142
let body_text = common::http::get_response_body_text(response).await?;
143143

144+
log::debug!("New chat response: {}", &body_text);
145+
144146
let chat_response: GetResponse =
145147
serde_json::from_str(&body_text).map_err(|e| format!("Failed to parse response JSON: {}", e))?;
146148

@@ -248,8 +250,8 @@ pub async fn assistant_search<R: Runtime>(
248250
None,
249251
Some(reqwest::Body::from(body.to_string())),
250252
)
251-
.await
252-
.map_err(|e| format!("Error searching assistants: {}", e))?;
253+
.await
254+
.map_err(|e| format!("Error searching assistants: {}", e))?;
253255

254256
response
255257
.json::<Value>()

src-tauri/src/server/websocket.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ pub async fn connect_to_server<R: Runtime>(
9595
true, // disable_nagle
9696
Some(connector), // Connector
9797
)
98-
.await
99-
.map_err(|e| format!("WebSocket TLS error: {:?}", e))?;
98+
.await
99+
.map_err(|e| format!("WebSocket TLS error: {:?}", e))?;
100100

101101
let (cancel_tx, mut cancel_rx) = mpsc::channel(1);
102102

@@ -125,14 +125,16 @@ pub async fn connect_to_server<R: Runtime>(
125125
let _ = app_handle_clone.emit(&format!("ws-message-{}", client_id_clone), text);
126126
},
127127
Some(Err(_)) | None => {
128+
log::debug!("WebSocket connection closed or error");
128129
let _ = app_handle_clone.emit(&format!("ws-error-{}", client_id_clone), id.clone());
129130
break;
130131
}
131132
_ => {}
132133
}
133134
}
134135
_ = cancel_rx.recv() => {
135-
let _ = app_handle_clone.emit(&format!("ws-error-{}", client_id_clone), id.clone());
136+
log::debug!("WebSocket connection cancelled");
137+
let _ = app_handle_clone.emit(&format!("ws-cancel-{}", client_id_clone), id.clone());
136138
break;
137139
}
138140
}

src/components/Assistant/AssistantList.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ import {
77
ChevronRight,
88
} from "lucide-react";
99
import { useTranslation } from "react-i18next";
10+
import { isNil } from "lodash-es";
11+
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react";
12+
import {
13+
useAsyncEffect,
14+
useDebounce,
15+
useKeyPress,
16+
usePagination,
17+
useReactive,
18+
} from "ahooks";
19+
import clsx from "clsx";
1020

1121
import { useAppStore } from "@/stores/appStore";
1222
import logoImg from "@/assets/icon.svg";
@@ -17,18 +27,8 @@ import FontIcon from "@/components/Common/Icons/FontIcon";
1727
import { useChatStore } from "@/stores/chatStore";
1828
import { useShortcutsStore } from "@/stores/shortcutsStore";
1929
import { Post } from "@/api/axiosRequest";
20-
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react";
21-
import {
22-
useAsyncEffect,
23-
useDebounce,
24-
useKeyPress,
25-
usePagination,
26-
useReactive,
27-
} from "ahooks";
28-
import clsx from "clsx";
2930
import NoDataImage from "../Common/NoDataImage";
3031
import PopoverInput from "../Common/PopoverInput";
31-
import { isNil } from "lodash-es";
3232

3333
interface AssistantListProps {
3434
assistantIDs?: string[];
@@ -41,6 +41,7 @@ interface State {
4141
export function AssistantList({ assistantIDs = [] }: AssistantListProps) {
4242
const { t } = useTranslation();
4343
const { connected } = useChatStore();
44+
4445
const isTauri = useAppStore((state) => state.isTauri);
4546
const setAssistantList = useConnectStore((state) => state.setAssistantList);
4647
const currentService = useConnectStore((state) => state.currentService);

src/components/Assistant/Chat.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ const ChatAI = memo(
134134
clientId,
135135
connected,
136136
setConnected,
137-
currentService,
138137
dealMsgRef,
139138
onWebsocketSessionId,
140139
});
@@ -165,7 +164,8 @@ const ChatAI = memo(
165164
isMCPActive,
166165
changeInput,
167166
websocketSessionId,
168-
showChatHistory
167+
showChatHistory,
168+
isLogin
169169
);
170170

171171
const { dealMsg } = useMessageHandler(
@@ -330,7 +330,6 @@ const ChatAI = memo(
330330
isSidebarOpen={isSidebarOpenChat}
331331
chats={chats}
332332
activeChat={activeChat}
333-
// onNewChat={clearChat}
334333
onSelectChat={onSelectChat}
335334
onDeleteChat={deleteChat}
336335
fetchChatHistory={getChatHistory}
@@ -340,7 +339,7 @@ const ChatAI = memo(
340339
)}
341340

342341
<ChatHeader
343-
onCreateNewChat={clearChat}
342+
clearChat={clearChat}
344343
onOpenChatAI={openChatAI}
345344
setIsSidebarOpen={toggleSidebar}
346345
isSidebarOpen={isSidebarOpenChat}

src/components/Assistant/ChatContent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export const ChatContent = ({
9696
};
9797

9898
return (
99-
<div className="flex-1 overflow-hidden flex flex-col justify-between relative">
99+
<div className="flex-1 overflow-hidden flex flex-col justify-between relative user-select-text">
100100
<div
101101
ref={scrollRef}
102102
className="flex-1 w-full overflow-x-hidden overflow-y-auto border-t border-[rgba(0,0,0,0.1)] dark:border-[rgba(255,255,255,0.15)] custom-scrollbar relative"

src/components/Assistant/ChatHeader.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { Server } from "@/types/server"
1717

1818

1919
interface ChatHeaderProps {
20-
onCreateNewChat: () => void;
20+
clearChat: () => void;
2121
onOpenChatAI: () => void;
2222
setIsSidebarOpen: () => void;
2323
isSidebarOpen: boolean;
@@ -31,7 +31,7 @@ interface ChatHeaderProps {
3131
}
3232

3333
export function ChatHeader({
34-
onCreateNewChat,
34+
clearChat,
3535
onOpenChatAI,
3636
isSidebarOpen,
3737
setIsSidebarOpen,
@@ -99,10 +99,10 @@ export function ChatHeader({
9999

100100
{showChatHistory ? (
101101
<button
102-
onClick={onCreateNewChat}
102+
onClick={clearChat}
103103
className="p-2 py-1 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800"
104104
>
105-
<VisibleKey shortcut={newSession} onKeyPress={onCreateNewChat}>
105+
<VisibleKey shortcut={newSession} onKeyPress={clearChat}>
106106
<MessageSquarePlus className="h-4 w-4 relative top-0.5" />
107107
</VisibleKey>
108108
</button>
@@ -131,7 +131,7 @@ export function ChatHeader({
131131
isLogin={isLogin}
132132
setIsLogin={setIsLogin}
133133
reconnect={reconnect}
134-
onCreateNewChat={onCreateNewChat}
134+
clearChat={clearChat}
135135
/>
136136

137137
{isChatPage ? null : (

src/components/Assistant/ChatSidebar.tsx

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React from "react";
22

3-
// import { Sidebar } from "@/components/Assistant/Sidebar";
43
import type { Chat } from "@/types/chat";
54
import HistoryList from "../Common/HistoryList";
65
import { HISTORY_PANEL_ID } from "@/constants";
@@ -9,7 +8,6 @@ interface ChatSidebarProps {
98
isSidebarOpen: boolean;
109
chats: Chat[];
1110
activeChat?: Chat;
12-
// onNewChat: () => void;
1311
onSelectChat: (chat: any) => void;
1412
onDeleteChat: (chatId: string) => void;
1513
fetchChatHistory: () => void;
@@ -21,7 +19,6 @@ export const ChatSidebar: React.FC<ChatSidebarProps> = ({
2119
isSidebarOpen,
2220
chats,
2321
activeChat,
24-
// onNewChat,
2522
onSelectChat,
2623
onDeleteChat,
2724
fetchChatHistory,
@@ -52,14 +49,6 @@ export const ChatSidebar: React.FC<ChatSidebarProps> = ({
5249
onRemove={onDeleteChat}
5350
/>
5451
)}
55-
{/* <Sidebar
56-
chats={chats}
57-
activeChat={activeChat}
58-
onNewChat={onNewChat}
59-
onSelectChat={onSelectChat}
60-
onDeleteChat={onDeleteChat}
61-
fetchChatHistory={fetchChatHistory}
62-
/> */}
6352
</div>
6453
);
6554
};

src/components/Assistant/ServerList.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ interface ServerListProps {
2020
isLogin: boolean;
2121
setIsLogin: (isLogin: boolean) => void;
2222
reconnect: (server?: IServer) => void;
23-
onCreateNewChat: () => void;
23+
clearChat: () => void;
2424
}
2525

2626
export function ServerList({
2727
isLogin,
2828
setIsLogin,
2929
reconnect,
30-
onCreateNewChat,
30+
clearChat,
3131
}: ServerListProps) {
3232
const { t } = useTranslation();
3333

@@ -110,12 +110,13 @@ export function ServerList({
110110
setCurrentService(server);
111111
setEndpoint(server.endpoint);
112112
setMessages(""); // Clear previous messages
113-
onCreateNewChat();
113+
clearChat();
114114
//
115115
if (!server.public && !server.profile) {
116116
setIsLogin(false);
117117
return;
118118
}
119+
//
119120
setIsLogin(true);
120121
// The Rust backend will automatically disconnect,
121122
// so we don't need to handle disconnection on the frontend

src/components/Assistant/Sidebar.tsx

Lines changed: 0 additions & 94 deletions
This file was deleted.

0 commit comments

Comments
 (0)