diff --git a/src/commands/servers.ts b/src/commands/servers.ts index 9f9932d8..a8d34a84 100644 --- a/src/commands/servers.ts +++ b/src/commands/servers.ts @@ -15,7 +15,6 @@ import { MultiSourceQueryResponse, } from "@/types/commands"; import { useAppStore } from "@/stores/appStore"; -import { useAuthStore } from "@/stores/authStore"; import { getCurrentWindowService, handleLogout, @@ -39,16 +38,9 @@ async function invokeWithErrorHandler( command: string, args?: Record ): Promise { - const isCurrentLogin = useAuthStore.getState().isCurrentLogin; - const service = await getCurrentWindowService(); - // Not logged in - // console.log("isCurrentLogin", command, isCurrentLogin); - if ( - !WHITELIST_SERVERS.includes(command) && - (!isCurrentLogin || !service?.profile) - ) { + if (!WHITELIST_SERVERS.includes(command) && !service?.profile) { console.error("This command requires authentication"); throw new Error("This command requires authentication"); } diff --git a/src/commands/windowService.ts b/src/commands/windowService.ts index b29b9bba..d769cfeb 100644 --- a/src/commands/windowService.ts +++ b/src/commands/windowService.ts @@ -2,6 +2,7 @@ import { useConnectStore } from "@/stores/connectStore"; import { SETTINGS_WINDOW_LABEL } from "@/constants"; import platformAdapter from "@/utils/platformAdapter"; import { useAuthStore } from "@/stores/authStore"; +import { useExtensionsStore } from "@/stores/extensionsStore"; export async function getCurrentWindowService() { const currentService = useConnectStore.getState().currentService; @@ -13,23 +14,42 @@ export async function getCurrentWindowService() { : currentService; } -export async function setCurrentWindowService( - service: any, - isAll?: boolean -) { +export async function setCurrentWindowService(service: any, isAll?: boolean) { const { setCurrentService, setCloudSelectService } = useConnectStore.getState(); // all refresh logout if (isAll) { setCloudSelectService(service); - setCurrentService(service); - return; + return setCurrentService(service); } // current refresh const windowLabel = await platformAdapter.getCurrentWindowLabel(); - return windowLabel === SETTINGS_WINDOW_LABEL - ? setCloudSelectService(service) - : setCurrentService(service); + + if (windowLabel === SETTINGS_WINDOW_LABEL) { + const { currentService } = useConnectStore.getState(); + const { + aiOverviewServer, + setAiOverviewServer, + quickAiAccessServer, + setQuickAiAccessServer, + } = useExtensionsStore.getState(); + + if (currentService?.id === service.id) { + setCurrentService(service); + } + + if (aiOverviewServer?.id === service.id) { + setAiOverviewServer(service); + } + + if (quickAiAccessServer?.id === service.id) { + setQuickAiAccessServer(service); + } + + return setCloudSelectService(service); + } + + return setCurrentService(service); } export async function handleLogout(serverId?: string) { diff --git a/src/components/Assistant/AssistantFetcher.tsx b/src/components/Assistant/AssistantFetcher.tsx index 2b8b4501..8fa62bfe 100644 --- a/src/components/Assistant/AssistantFetcher.tsx +++ b/src/components/Assistant/AssistantFetcher.tsx @@ -25,7 +25,7 @@ export const AssistantFetcher = ({ query?: string; }) => { try { - if (unrequitable()) { + if (await unrequitable()) { return { total: 0, list: [], diff --git a/src/components/Assistant/Splash.tsx b/src/components/Assistant/Splash.tsx index 283da996..2ac5ad51 100644 --- a/src/components/Assistant/Splash.tsx +++ b/src/components/Assistant/Splash.tsx @@ -54,7 +54,7 @@ const Splash = ({ assistantIDs = [], startPage }: SplashProps) => { let response: any; if (isTauri) { - if (unrequitable()) { + if (await unrequitable()) { return setVisibleStartPage(false); } @@ -72,6 +72,8 @@ const Splash = ({ assistantIDs = [], startPage }: SplashProps) => { setSettings(response); }; + console.log("currentService", currentService); + useEffect(() => { getSettings(); fetchData(); diff --git a/src/components/ChatMessage/MessageActions.tsx b/src/components/ChatMessage/MessageActions.tsx index f37c607f..6f58c40f 100644 --- a/src/components/ChatMessage/MessageActions.tsx +++ b/src/components/ChatMessage/MessageActions.tsx @@ -67,7 +67,7 @@ export const MessageActions = ({ }; const handleSpeak = async () => { - if (isDefaultServer()) { + if (await isDefaultServer()) { return setSynthesizeItem({ id, content }); } diff --git a/src/components/Search/InputBox.tsx b/src/components/Search/InputBox.tsx index ed918c6b..7b45a7f8 100644 --- a/src/components/Search/InputBox.tsx +++ b/src/components/Search/InputBox.tsx @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; -import { useKeyPress, useSize } from "ahooks"; +import { useAsyncEffect, useKeyPress, useSize } from "ahooks"; import clsx from "clsx"; import AutoResizeTextarea from "./AutoResizeTextarea"; @@ -210,8 +210,8 @@ export default function ChatInput({ const extraIconRef = useRef(null); const extraIconSize = useSize(extraIconRef); - useEffect(() => { - setVisibleAudioInput(isDefaultServer()); + useAsyncEffect(async () => { + setVisibleAudioInput(await isDefaultServer()); }, [currentService]); const renderSearchIcon = () => ( diff --git a/src/components/Settings/Extensions/components/Details/SharedAi/index.tsx b/src/components/Settings/Extensions/components/Details/SharedAi/index.tsx index e8e3462d..b550d4ee 100644 --- a/src/components/Settings/Extensions/components/Details/SharedAi/index.tsx +++ b/src/components/Settings/Extensions/components/Details/SharedAi/index.tsx @@ -1,4 +1,4 @@ -import { FC, useMemo, useState, useCallback } from "react"; +import { FC, useMemo, useState, useCallback, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { isArray } from "lodash-es"; import { useAsyncEffect, useMount } from "ahooks"; @@ -37,6 +37,13 @@ const SharedAi: FC = (props) => { const { t } = useTranslation(); const [assistantSearchValue, setAssistantSearchValue] = useState(""); const [isLoadingAssistants, setIsLoadingAssistants] = useState(false); + const { setCloudSelectService } = useConnectStore(); + + useEffect(() => { + if (!server) return; + + setCloudSelectService(server); + }, [server]); const getEnabledServers = useCallback((servers: Server[]): Server[] => { if (!isArray(servers)) return []; @@ -56,7 +63,9 @@ const SharedAi: FC = (props) => { } if (server) { - const matchServer = enabledServers.find((item) => item.id === server.id); + const matchServer = enabledServers.find( + (item) => item.id === server.id + ); if (matchServer) { setServer(matchServer); return; @@ -65,7 +74,7 @@ const SharedAi: FC = (props) => { setServer(enabledServers[0]); } catch (error) { - console.error('Failed to load servers:', error); + console.error("Failed to load servers:", error); addError(`Failed to load servers: ${String(error)}`); } }); @@ -86,7 +95,9 @@ const SharedAi: FC = (props) => { query: assistantSearchValue, }); - const assistants: Assistant[] = data.list.map((item: any) => item._source); + const assistants: Assistant[] = data.list.map( + (item: any) => item._source + ); setAssistantList(assistants); if (assistants.length === 0) { @@ -104,7 +115,7 @@ const SharedAi: FC = (props) => { setAssistant(assistants[0]); } catch (error) { - console.error('Failed to fetch assistants:', error); + console.error("Failed to fetch assistants:", error); addError(`Failed to fetch assistants: ${String(error)}`); setAssistantList([]); setAssistant(undefined); @@ -181,7 +192,9 @@ const SharedAi: FC = (props) => { searchable={searchable} onChange={onChange} onSearch={onSearch} - placeholder={isLoadingAssistants && searchable ? "Loading..." : undefined} + placeholder={ + isLoadingAssistants && searchable ? "Loading..." : undefined + } /> ); diff --git a/src/hooks/useChatActions.ts b/src/hooks/useChatActions.ts index bfcf3200..ca8b2268 100644 --- a/src/hooks/useChatActions.ts +++ b/src/hooks/useChatActions.ts @@ -471,7 +471,7 @@ export function useChatActions( const getChatHistory = useCallback(async () => { let response: any; if (isTauri) { - if (unrequitable()) { + if (await unrequitable()) { return setChats([]); } diff --git a/src/hooks/useSyncStore.ts b/src/hooks/useSyncStore.ts index b7ffb803..5238f4ab 100644 --- a/src/hooks/useSyncStore.ts +++ b/src/hooks/useSyncStore.ts @@ -117,6 +117,7 @@ export const useSyncStore = () => { const setShowTooltip = useAppStore((state) => state.setShowTooltip); const setEndpoint = useAppStore((state) => state.setEndpoint); const setLanguage = useAppStore((state) => state.setLanguage); + const { setCurrentService } = useConnectStore(); useEffect(() => { if (!resetFixedWindow) { @@ -180,8 +181,12 @@ export const useSyncStore = () => { }), platformAdapter.listenEvent("change-connect-store", ({ payload }) => { - const { connectionTimeout, querySourceTimeout, allowSelfSignature } = - payload; + const { + connectionTimeout, + querySourceTimeout, + allowSelfSignature, + currentService, + } = payload; if (isNumber(connectionTimeout)) { setConnectionTimeout(connectionTimeout); } @@ -189,6 +194,7 @@ export const useSyncStore = () => { setQueryTimeout(querySourceTimeout); } setAllowSelfSignature(allowSelfSignature); + setCurrentService(currentService); }), platformAdapter.listenEvent("change-appearance-store", ({ payload }) => { diff --git a/src/pages/chat/index.tsx b/src/pages/chat/index.tsx index 25e9f2c3..09a538e5 100644 --- a/src/pages/chat/index.tsx +++ b/src/pages/chat/index.tsx @@ -66,7 +66,7 @@ export default function StandaloneChat({}: StandaloneChatProps) { const getChatHistory = async () => { try { - if (unrequitable()) { + if (await unrequitable()) { return setChats([]); } @@ -271,7 +271,11 @@ export default function StandaloneChat({}: StandaloneChatProps) { const handleDelete = async (id: string) => { if (!currentService?.id) return; - await platformAdapter.commands("delete_session_chat", currentService.id, id); + await platformAdapter.commands( + "delete_session_chat", + currentService.id, + id + ); }; return ( diff --git a/src/utils/index.ts b/src/utils/index.ts index 5bc9bde3..e9d76ab9 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -5,9 +5,8 @@ import { filesize as filesizeLib } from "filesize"; import platformAdapter from "./platformAdapter"; import { useAppStore } from "@/stores/appStore"; import { DEFAULT_COCO_SERVER_ID, HISTORY_PANEL_ID } from "@/constants"; -import { useConnectStore } from "@/stores/connectStore"; -import { useAuthStore } from "@/stores/authStore"; import { useChatStore } from "@/stores/chatStore"; +import { getCurrentWindowService } from "@/commands/windowService"; // 1 export async function copyToClipboard(text: string) { @@ -163,36 +162,28 @@ export const parseSearchQuery = (searchQuery: SearchQuery) => { return result; }; -export const unrequitable = () => { +export const unrequitable = async () => { const { isTauri } = useAppStore.getState(); - const { currentService } = useConnectStore.getState(); - const { isCurrentLogin } = useAuthStore.getState(); - const { id, available, enabled } = currentService ?? {}; + const { id, available, enabled } = await getCurrentWindowService(); - const serviceAvailable = Boolean( - id && enabled && available && isCurrentLogin - ); + const serviceAvailable = Boolean(id && enabled && available); return isTauri && !serviceAvailable; }; -export const isDefaultServer = (checkAvailability = true) => { +export const isDefaultServer = async (checkAvailability = true) => { const { isTauri } = useAppStore.getState(); - const { currentService } = useConnectStore.getState(); - const { isCurrentLogin } = useAuthStore.getState(); - const { id, available, enabled } = currentService ?? {}; + const { id, available, enabled } = await getCurrentWindowService(); - const isDefaultServer = currentService.id === DEFAULT_COCO_SERVER_ID; + const isDefault = id === DEFAULT_COCO_SERVER_ID; - const serviceAvailable = Boolean( - id && enabled && available && isCurrentLogin - ); + const serviceAvailable = Boolean(id && enabled && available); if (checkAvailability) { - return isTauri && isDefaultServer && serviceAvailable; + return isTauri && isDefault && serviceAvailable; } - return isTauri && isDefaultServer; + return isTauri && isDefault; }; export const filesize = (value: number, spacer?: string) => { diff --git a/src/utils/tauriAdapter.ts b/src/utils/tauriAdapter.ts index 55563bd0..a071c406 100644 --- a/src/utils/tauriAdapter.ts +++ b/src/utils/tauriAdapter.ts @@ -306,7 +306,7 @@ export const createTauriAdapter = (): TauriPlatformAdapter => { error, async searchMCPServers(serverId, queryParams) { - if (unrequitable()) { + if (await unrequitable()) { return []; }