Files
kiss-translator/src/hooks/Api.js
2025-10-10 21:17:51 +08:00

137 lines
3.3 KiB
JavaScript

import { useCallback, useEffect, useMemo } from "react";
import { DEFAULT_API_LIST, API_SPE_TYPES } from "../config";
import { useSetting } from "./Setting";
function useApiState() {
const { setting, updateSetting } = useSetting();
const transApis = setting?.transApis || [];
return { transApis, updateSetting };
}
export function useApiList() {
const { transApis, updateSetting } = useApiState();
useEffect(() => {
const curSlugs = new Set(transApis.map((api) => api.apiSlug));
const missApis = DEFAULT_API_LIST.filter(
(api) => !curSlugs.has(api.apiSlug)
);
if (missApis.length > 0) {
updateSetting((prev) => ({
...prev,
transApis: [...(prev?.transApis || []), ...missApis],
}));
}
}, [transApis, updateSetting]);
const userApis = useMemo(
() =>
transApis
.filter((api) => !API_SPE_TYPES.builtin.has(api.apiSlug))
.sort((a, b) => a.apiSlug.localeCompare(b.apiSlug)),
[transApis]
);
const builtinApis = useMemo(
() => transApis.filter((api) => API_SPE_TYPES.builtin.has(api.apiSlug)),
[transApis]
);
const enabledApis = useMemo(
() => transApis.filter((api) => !api.isDisabled),
[transApis]
);
const aiEnabledApis = useMemo(
() => enabledApis.filter((api) => API_SPE_TYPES.ai.has(api.apiType)),
[enabledApis]
);
const addApi = useCallback(
(apiType) => {
const defaultApiOpt =
DEFAULT_API_LIST.find((da) => da.apiType === apiType) || {};
const uuid = crypto.randomUUID();
const apiSlug = `${apiType}_${crypto.randomUUID()}`;
const apiName = `${apiType}_${uuid.slice(0, 8)}`;
const newApi = {
...defaultApiOpt,
apiSlug,
apiName,
apiType,
};
updateSetting((prev) => ({
...prev,
transApis: [...(prev?.transApis || []), newApi],
}));
},
[updateSetting]
);
const deleteApi = useCallback(
(apiSlug) => {
updateSetting((prev) => ({
...prev,
transApis: (prev?.transApis || []).filter(
(api) => api.apiSlug !== apiSlug
),
}));
},
[updateSetting]
);
return {
transApis,
userApis,
builtinApis,
enabledApis,
aiEnabledApis,
addApi,
deleteApi,
};
}
export function useApiItem(apiSlug) {
const { transApis, updateSetting } = useApiState();
const api = useMemo(
() => transApis.find((a) => a.apiSlug === apiSlug),
[transApis, apiSlug]
);
const update = useCallback(
(updateData) => {
updateSetting((prev) => ({
...prev,
transApis: (prev?.transApis || []).map((item) =>
item.apiSlug === apiSlug ? { ...item, ...updateData, apiSlug } : item
),
}));
},
[apiSlug, updateSetting]
);
const reset = useCallback(() => {
updateSetting((prev) => ({
...prev,
transApis: (prev?.transApis || []).map((item) => {
if (item.apiSlug === apiSlug) {
const defaultApiOpt =
DEFAULT_API_LIST.find((da) => da.apiType === item.apiType) || {};
return {
...defaultApiOpt,
apiSlug: item.apiSlug,
apiName: item.apiName,
apiType: item.apiType,
key: item.key,
};
}
return item;
}),
}));
}, [apiSlug, updateSetting]);
return { api, update, reset };
}