mirror of
https://github.com/coaidev/coai.git
synced 2025-06-04 04:40:22 +09:00
fix: market item life cycle error
This commit is contained in:
parent
90345076be
commit
84a4a87388
@ -16,7 +16,7 @@ import { modelEvent } from "@/events/model.ts";
|
|||||||
import { levelSelector } from "@/store/subscription.ts";
|
import { levelSelector } from "@/store/subscription.ts";
|
||||||
import { teenagerSelector } from "@/store/package.ts";
|
import { teenagerSelector } from "@/store/package.ts";
|
||||||
import { ToastAction } from "@/components/ui/toast.tsx";
|
import { ToastAction } from "@/components/ui/toast.tsx";
|
||||||
import { useMemo } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import { Sparkles } from "lucide-react";
|
import { Sparkles } from "lucide-react";
|
||||||
import { goAuth } from "@/utils/app.ts";
|
import { goAuth } from "@/utils/app.ts";
|
||||||
|
|
||||||
@ -55,6 +55,8 @@ function ModelFinder(props: ModelSelectorProps) {
|
|||||||
const student = useSelector(teenagerSelector);
|
const student = useSelector(teenagerSelector);
|
||||||
const list = useSelector(selectModelList);
|
const list = useSelector(selectModelList);
|
||||||
|
|
||||||
|
const [sync, setSync] = useState<boolean>(false);
|
||||||
|
|
||||||
modelEvent.bind((target: string) => {
|
modelEvent.bind((target: string) => {
|
||||||
if (supportModels.find((m) => m.id === target)) {
|
if (supportModels.find((m) => m.id === target)) {
|
||||||
if (model === target) return;
|
if (model === target) return;
|
||||||
@ -64,7 +66,10 @@ function ModelFinder(props: ModelSelectorProps) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const models = useMemo(() => {
|
const models = useMemo(() => {
|
||||||
const raw = supportModels.filter((model) => list.includes(model.id));
|
const raw = list.length
|
||||||
|
? supportModels.filter((model) => list.includes(model.id))
|
||||||
|
: supportModels.filter((model) => model.default);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
...raw.map((model: Model): SelectItemProps => filterModel(model, level)),
|
...raw.map((model: Model): SelectItemProps => filterModel(model, level)),
|
||||||
{
|
{
|
||||||
@ -73,7 +78,14 @@ function ModelFinder(props: ModelSelectorProps) {
|
|||||||
value: t("market.model"),
|
value: t("market.model"),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}, [supportModels, level, student]);
|
}, [supportModels, level, student, sync]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setInterval(() => {
|
||||||
|
if (supportModels.length === 0) return;
|
||||||
|
setSync(!sync);
|
||||||
|
}, 500);
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SelectGroup
|
<SelectGroup
|
||||||
|
@ -328,7 +328,8 @@ function Market() {
|
|||||||
const sync = useRef<boolean>(false);
|
const sync = useRef<boolean>(false);
|
||||||
|
|
||||||
const update = async (): Promise<void> => {
|
const update = async (): Promise<void> => {
|
||||||
const resp = await updateMarket(form);
|
const preflight = form.filter((_, idx) => doCheck(idx));
|
||||||
|
const resp = await updateMarket(preflight);
|
||||||
|
|
||||||
if (!resp.status) {
|
if (!resp.status) {
|
||||||
toast(t("admin.market.update-failed"), {
|
toast(t("admin.market.update-failed"), {
|
||||||
|
@ -11,6 +11,11 @@ export function getPreferenceModels(): string[] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function loadPreferenceModels(models: Model[]): Model[] {
|
export function loadPreferenceModels(models: Model[]): Model[] {
|
||||||
|
models = models.filter((item) =>
|
||||||
|
item.id.length > 0 &&
|
||||||
|
item.name.length > 0
|
||||||
|
);
|
||||||
|
|
||||||
// sort by preference
|
// sort by preference
|
||||||
const preference = getPreferenceModels();
|
const preference = getPreferenceModels();
|
||||||
|
|
||||||
@ -31,27 +36,38 @@ export function setOfflineModels(models: Model[]): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function parseOfflineModels(models: string): Model[] {
|
export function parseOfflineModels(models: string): Model[] {
|
||||||
const parsed = JSON.parse(models);
|
try {
|
||||||
if (!Array.isArray(parsed)) return [];
|
const parsed = JSON.parse(models);
|
||||||
return parsed
|
if (!Array.isArray(parsed)) return [];
|
||||||
.map((item): Model | null => {
|
return parsed
|
||||||
if (!item || typeof item !== "object") return null;
|
.map((item): Model | null => {
|
||||||
return {
|
if (!item || typeof item !== "object") {
|
||||||
id: item.id || "",
|
return null;
|
||||||
name: item.name || "",
|
}
|
||||||
description: item.description || "",
|
|
||||||
free: item.free || false,
|
if (!item.id || !item.name) {
|
||||||
auth: item.auth || false,
|
return null;
|
||||||
default: item.default || false,
|
}
|
||||||
high_context: item.high_context || false,
|
|
||||||
avatar: item.avatar || "",
|
return {
|
||||||
tag: item.tag || [],
|
id: item.id || "",
|
||||||
} as Model;
|
name: item.name || "",
|
||||||
})
|
description: item.description || "",
|
||||||
.filter((item): item is Model => item !== null);
|
free: item.free || false,
|
||||||
|
auth: item.auth || false,
|
||||||
|
default: item.default || false,
|
||||||
|
high_context: item.high_context || false,
|
||||||
|
avatar: item.avatar || "",
|
||||||
|
tag: item.tag || [],
|
||||||
|
} as Model;
|
||||||
|
})
|
||||||
|
.filter((item): item is Model => item !== null);
|
||||||
|
} catch {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getOfflineModels(): Model[] {
|
export function getOfflineModels(): Model[] {
|
||||||
const memory = getMemory("model_offline");
|
const memory = getMemory("model_offline");
|
||||||
return memory.length ? parseOfflineModels(memory) : [];
|
return memory && memory.length ? parseOfflineModels(memory) : [];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user