fix: market item life cycle error

This commit is contained in:
Zhang Minghan 2024-01-10 18:21:04 +08:00
parent 90345076be
commit 84a4a87388
3 changed files with 52 additions and 23 deletions

View File

@ -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

View File

@ -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"), {

View File

@ -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) : [];
} }