137 lines
3.3 KiB
JavaScript
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 };
|
|
}
|