2025-05-27 16:29:43 +08:00
|
|
|
import { useCallback, useRef, useMemo, useState } from "react";
|
|
|
|
|
import { cloneDeep, isEmpty } from "lodash-es";
|
|
|
|
|
|
|
|
|
|
import { useSearchStore } from "@/stores/searchStore";
|
|
|
|
|
import { useExtensionsStore } from "@/stores/extensionsStore";
|
|
|
|
|
import platformAdapter from "@/utils/platformAdapter";
|
|
|
|
|
import { Get } from "@/api/axiosRequest";
|
2025-05-28 12:29:28 +08:00
|
|
|
import type { Assistant } from "@/types/chat";
|
|
|
|
|
import { useAppStore } from "@/stores/appStore";
|
|
|
|
|
|
|
|
|
|
interface AssistantManagerProps {
|
|
|
|
|
isChatMode: boolean;
|
|
|
|
|
handleSubmit: () => void;
|
|
|
|
|
changeInput: (value: string) => void;
|
|
|
|
|
}
|
2025-05-27 16:29:43 +08:00
|
|
|
|
|
|
|
|
export function useAssistantManager({
|
|
|
|
|
isChatMode,
|
|
|
|
|
handleSubmit,
|
|
|
|
|
changeInput,
|
2025-05-28 12:29:28 +08:00
|
|
|
}: AssistantManagerProps) {
|
|
|
|
|
const isTauri = useAppStore((state) => state.isTauri);
|
|
|
|
|
|
|
|
|
|
const { goAskAi, setGoAskAi, setAskAiMessage, selectedAssistant } =
|
|
|
|
|
useSearchStore();
|
|
|
|
|
|
2025-05-27 16:29:43 +08:00
|
|
|
const quickAiAccessAssistant = useExtensionsStore(
|
|
|
|
|
(state) => state.quickAiAccessAssistant
|
|
|
|
|
);
|
|
|
|
|
|
2025-05-28 12:29:28 +08:00
|
|
|
const askAIRef = useRef<Assistant | null>(null);
|
2025-05-27 16:29:43 +08:00
|
|
|
|
2025-05-28 12:29:28 +08:00
|
|
|
const askAI = useMemo(() => {
|
2025-05-27 16:29:43 +08:00
|
|
|
const newAssistant = selectedAssistant ?? quickAiAccessAssistant;
|
|
|
|
|
return newAssistant;
|
|
|
|
|
}, [quickAiAccessAssistant, selectedAssistant]);
|
|
|
|
|
|
|
|
|
|
const [assistantDetail, setAssistantDetail] = useState<any>({});
|
|
|
|
|
|
|
|
|
|
const assistant_get = useCallback(async () => {
|
|
|
|
|
if (isTauri) {
|
|
|
|
|
const res = await platformAdapter.commands("assistant_get", {
|
2025-05-28 12:29:28 +08:00
|
|
|
serverId: askAI?.querySource?.id,
|
|
|
|
|
assistantId: askAI?.id,
|
2025-05-27 16:29:43 +08:00
|
|
|
});
|
2025-05-28 12:29:28 +08:00
|
|
|
setAssistantDetail(res);
|
2025-05-27 16:29:43 +08:00
|
|
|
} else {
|
2025-05-28 12:29:28 +08:00
|
|
|
const [error, res]: any = await Get(`/assistant/${askAI?.id}`, {
|
|
|
|
|
id: askAI?.id,
|
2025-05-27 16:29:43 +08:00
|
|
|
});
|
|
|
|
|
if (error) {
|
|
|
|
|
console.error("assistant", error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-05-28 12:29:28 +08:00
|
|
|
setAssistantDetail(res);
|
2025-05-27 16:29:43 +08:00
|
|
|
}
|
2025-05-28 12:29:28 +08:00
|
|
|
}, [askAI]);
|
2025-05-27 16:29:43 +08:00
|
|
|
|
|
|
|
|
const handleAskAi = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
2025-05-28 12:29:28 +08:00
|
|
|
askAIRef.current = cloneDeep(askAI);
|
2025-05-27 16:29:43 +08:00
|
|
|
|
2025-05-28 12:29:28 +08:00
|
|
|
if (!askAIRef.current) return;
|
2025-05-27 16:29:43 +08:00
|
|
|
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
|
|
const { value } = event.currentTarget;
|
|
|
|
|
|
|
|
|
|
if (!selectedAssistant && isEmpty(value)) return;
|
|
|
|
|
|
|
|
|
|
assistant_get();
|
|
|
|
|
changeInput("");
|
|
|
|
|
setAskAiMessage(!goAskAi && selectedAssistant ? "" : value);
|
2025-05-29 16:01:52 +08:00
|
|
|
setGoAskAi(true);
|
2025-05-27 16:29:43 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleKeyDownAutoResizeTextarea = (
|
|
|
|
|
e: React.KeyboardEvent<HTMLTextAreaElement>
|
|
|
|
|
) => {
|
|
|
|
|
const { key, shiftKey } = e;
|
|
|
|
|
|
|
|
|
|
const { value } = e.currentTarget;
|
|
|
|
|
|
|
|
|
|
if (key === "Backspace" && value === "") {
|
|
|
|
|
return setGoAskAi(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (key === "Tab" && !isChatMode) {
|
|
|
|
|
return handleAskAi(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (key === "Enter" && !shiftKey) {
|
|
|
|
|
if (goAskAi) {
|
|
|
|
|
return handleAskAi(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
handleSubmit();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-28 12:29:28 +08:00
|
|
|
return {
|
|
|
|
|
askAI,
|
|
|
|
|
askAIRef,
|
|
|
|
|
assistantDetail,
|
|
|
|
|
handleKeyDownAutoResizeTextarea,
|
|
|
|
|
};
|
2025-05-27 16:29:43 +08:00
|
|
|
}
|