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()
}