diff --git a/backend/dist/nsfwapp-linux-amd64 b/backend/dist/nsfwapp-linux-amd64 index fb14fbc..47c4048 100644 Binary files a/backend/dist/nsfwapp-linux-amd64 and b/backend/dist/nsfwapp-linux-amd64 differ diff --git a/backend/dist/nsfwapp.exe b/backend/dist/nsfwapp.exe index ba0ba25..97fa5d1 100644 Binary files a/backend/dist/nsfwapp.exe and b/backend/dist/nsfwapp.exe differ diff --git a/backend/dist/nsfwapp_amd64.deb b/backend/dist/nsfwapp_amd64.deb index 4554c3b..ab207f1 100644 Binary files a/backend/dist/nsfwapp_amd64.deb and b/backend/dist/nsfwapp_amd64.deb differ diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a1734e0..e76e0a9 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1849,6 +1849,19 @@ export default function App() { setModelsCount(headerStats.totalCount) }, [headerStats.totalCount]) + const handleModelsCountChange = useCallback((count: number) => { + const nextCount = Number.isFinite(count) && count > 0 ? Math.floor(count) : 0 + + setHeaderStats((prev) => + prev.totalCount === nextCount + ? prev + : { + ...prev, + totalCount: nextCount, + } + ) + }, []) + const overviewInFlightRef = useRef(false) const overviewLastSigRef = useRef('') const overviewLastAtRef = useRef(0) @@ -1876,8 +1889,6 @@ export default function App() { if (overviewLastSigRef.current === sig && now - overviewLastAtRef.current < MODELS_OVERVIEW_COOLDOWN_MS) return overviewInFlightRef.current = true - overviewLastSigRef.current = sig - overviewLastAtRef.current = now overviewAbortRef.current?.abort() const controller = new AbortController() @@ -1915,6 +1926,9 @@ export default function App() { : next }) + overviewLastSigRef.current = sig + overviewLastAtRef.current = now + const safeList = Array.isArray(data?.models) ? data.models : [] const built = buildModelsByKey(safeList) @@ -4462,7 +4476,10 @@ export default function App() { ) : null} {selectedTab === 'models' ? ( - + ) : null} {trainingTabMounted ? ( diff --git a/frontend/src/components/ui/ModelsTab.tsx b/frontend/src/components/ui/ModelsTab.tsx index ae82697..1778342 100644 --- a/frontend/src/components/ui/ModelsTab.tsx +++ b/frontend/src/components/ui/ModelsTab.tsx @@ -292,10 +292,12 @@ function TableIcon() { type ModelsTabProps = { onAddToDownloads?: (job: RecordJob) => void | Promise + onModelsCountChange?: (count: number) => void } -export default function ModelsTab({ onAddToDownloads }: ModelsTabProps) { +export default function ModelsTab({ onAddToDownloads, onModelsCountChange }: ModelsTabProps) { const [models, setModels] = useState([]) + const modelsLoadedRef = useRef(false) const flagsInFlightRef = useRef>({}) const [loading, setLoading] = useState(false) @@ -508,18 +510,25 @@ export default function ModelsTab({ onAddToDownloads }: ModelsTabProps) { : [] setModels(list) + modelsLoadedRef.current = true + onModelsCountChange?.(list.length) void refreshVideoCounts() } catch (e: any) { setErr(e?.message ?? String(e)) } finally { setLoading(false) } - }, [refreshVideoCounts]) + }, [onModelsCountChange, refreshVideoCounts]) useEffect(() => { void refresh() }, [refresh]) + useEffect(() => { + if (!modelsLoadedRef.current) return + onModelsCountChange?.(models.length) + }, [models.length, onModelsCountChange]) + useEffect(() => { const onChanged = (ev: Event) => { const e = ev as CustomEvent @@ -553,6 +562,7 @@ export default function ModelsTab({ onAddToDownloads }: ModelsTabProps) { useEffect(() => { const onDbChanged = () => { setPage(1) + modelsLoadedRef.current = false setModels([]) void refresh() }