mirror of
https://github.com/infinilabs/coco-app.git
synced 2025-12-16 03:27:43 +01:00
fix: fix ai extension assistant list fetch (#890)
* fix: fix ai extension assistant list fetch * refactor: update * refactor: update * refactor: update
This commit is contained in:
@@ -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<T>(
|
||||
command: string,
|
||||
args?: Record<string, any>
|
||||
): Promise<T> {
|
||||
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");
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -25,7 +25,7 @@ export const AssistantFetcher = ({
|
||||
query?: string;
|
||||
}) => {
|
||||
try {
|
||||
if (unrequitable()) {
|
||||
if (await unrequitable()) {
|
||||
return {
|
||||
total: 0,
|
||||
list: [],
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -67,7 +67,7 @@ export const MessageActions = ({
|
||||
};
|
||||
|
||||
const handleSpeak = async () => {
|
||||
if (isDefaultServer()) {
|
||||
if (await isDefaultServer()) {
|
||||
return setSynthesizeItem({ id, content });
|
||||
}
|
||||
|
||||
|
||||
@@ -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<HTMLDivElement>(null);
|
||||
const extraIconSize = useSize(extraIconRef);
|
||||
|
||||
useEffect(() => {
|
||||
setVisibleAudioInput(isDefaultServer());
|
||||
useAsyncEffect(async () => {
|
||||
setVisibleAudioInput(await isDefaultServer());
|
||||
}, [currentService]);
|
||||
|
||||
const renderSearchIcon = () => (
|
||||
|
||||
@@ -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<SharedAiProps> = (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<SharedAiProps> = (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<SharedAiProps> = (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<SharedAiProps> = (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<SharedAiProps> = (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<SharedAiProps> = (props) => {
|
||||
searchable={searchable}
|
||||
onChange={onChange}
|
||||
onSearch={onSearch}
|
||||
placeholder={isLoadingAssistants && searchable ? "Loading..." : undefined}
|
||||
placeholder={
|
||||
isLoadingAssistants && searchable ? "Loading..." : undefined
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -471,7 +471,7 @@ export function useChatActions(
|
||||
const getChatHistory = useCallback(async () => {
|
||||
let response: any;
|
||||
if (isTauri) {
|
||||
if (unrequitable()) {
|
||||
if (await unrequitable()) {
|
||||
return setChats([]);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 }) => {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -306,7 +306,7 @@ export const createTauriAdapter = (): TauriPlatformAdapter => {
|
||||
error,
|
||||
|
||||
async searchMCPServers(serverId, queryParams) {
|
||||
if (unrequitable()) {
|
||||
if (await unrequitable()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user