style: format frontend with prettier
Mechanical one-shot pass of pnpm format over src/, tests/, tools/, and root configs. No functional changes; build and type-check verified.
This commit is contained in:
@@ -1,68 +1,83 @@
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { useGalleryStore, type WorkerKey } from "../store";
|
||||
import { BackgroundTaskSummary } from "./backgroundTasks/BackgroundTaskSummary";
|
||||
import { ExpandedTaskPanel } from "./backgroundTasks/ExpandedTaskPanel";
|
||||
import { buildDuplicateScanTask, buildFolderTasks, taskHasTerminalFailure, taskProgress } from "./backgroundTasks/taskModel";
|
||||
import type { BackgroundTask, FailedWorkerItem } from "./backgroundTasks/types";
|
||||
import { useEffect, useMemo, useState } from 'react'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
import { useGalleryStore, type WorkerKey } from '../store'
|
||||
import { BackgroundTaskSummary } from './backgroundTasks/BackgroundTaskSummary'
|
||||
import { ExpandedTaskPanel } from './backgroundTasks/ExpandedTaskPanel'
|
||||
import {
|
||||
buildDuplicateScanTask,
|
||||
buildFolderTasks,
|
||||
taskHasTerminalFailure,
|
||||
taskProgress,
|
||||
} from './backgroundTasks/taskModel'
|
||||
import type { BackgroundTask, FailedWorkerItem } from './backgroundTasks/types'
|
||||
|
||||
export function BackgroundTasks() {
|
||||
const folders = useGalleryStore((state) => state.folders);
|
||||
const indexingProgress = useGalleryStore((state) => state.indexingProgress);
|
||||
const mediaJobProgress = useGalleryStore((state) => state.mediaJobProgress);
|
||||
const retryFailedEmbeddings = useGalleryStore((state) => state.retryFailedEmbeddings);
|
||||
const queueTaggingJobs = useGalleryStore((state) => state.queueTaggingJobs);
|
||||
const showFailedTagging = useGalleryStore((state) => state.showFailedTagging);
|
||||
const duplicateScanning = useGalleryStore((state) => state.duplicateScanning);
|
||||
const duplicateScanProgress = useGalleryStore((state) => state.duplicateScanProgress);
|
||||
const workerPaused = useGalleryStore((state) => state.workerPaused);
|
||||
const loadWorkerStates = useGalleryStore((state) => state.loadWorkerStates);
|
||||
const setWorkerPaused = useGalleryStore((state) => state.setWorkerPaused);
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
const [dismissed, setDismissed] = useState<Record<number, string>>({});
|
||||
const [failedEmbeddingItems, setFailedEmbeddingItems] = useState<Record<number, FailedWorkerItem[]>>({});
|
||||
const [failedTaggingItems, setFailedTaggingItems] = useState<Record<number, FailedWorkerItem[]>>({});
|
||||
const folders = useGalleryStore((state) => state.folders)
|
||||
const indexingProgress = useGalleryStore((state) => state.indexingProgress)
|
||||
const mediaJobProgress = useGalleryStore((state) => state.mediaJobProgress)
|
||||
const retryFailedEmbeddings = useGalleryStore((state) => state.retryFailedEmbeddings)
|
||||
const queueTaggingJobs = useGalleryStore((state) => state.queueTaggingJobs)
|
||||
const showFailedTagging = useGalleryStore((state) => state.showFailedTagging)
|
||||
const duplicateScanning = useGalleryStore((state) => state.duplicateScanning)
|
||||
const duplicateScanProgress = useGalleryStore((state) => state.duplicateScanProgress)
|
||||
const workerPaused = useGalleryStore((state) => state.workerPaused)
|
||||
const loadWorkerStates = useGalleryStore((state) => state.loadWorkerStates)
|
||||
const setWorkerPaused = useGalleryStore((state) => state.setWorkerPaused)
|
||||
const [expanded, setExpanded] = useState(false)
|
||||
const [dismissed, setDismissed] = useState<Record<number, string>>({})
|
||||
const [failedEmbeddingItems, setFailedEmbeddingItems] = useState<
|
||||
Record<number, FailedWorkerItem[]>
|
||||
>({})
|
||||
const [failedTaggingItems, setFailedTaggingItems] = useState<Record<number, FailedWorkerItem[]>>(
|
||||
{}
|
||||
)
|
||||
|
||||
useEffect(() => {
|
||||
void loadWorkerStates();
|
||||
}, [folders, loadWorkerStates]);
|
||||
void loadWorkerStates()
|
||||
}, [folders, loadWorkerStates])
|
||||
|
||||
const failedEmbeddingCounts = useMemo(
|
||||
() =>
|
||||
Object.fromEntries(
|
||||
Object.entries(mediaJobProgress).map(([id, progress]) => [id, progress?.embedding_failed ?? 0]),
|
||||
Object.entries(mediaJobProgress).map(([id, progress]) => [
|
||||
id,
|
||||
progress?.embedding_failed ?? 0,
|
||||
])
|
||||
),
|
||||
[mediaJobProgress],
|
||||
);
|
||||
[mediaJobProgress]
|
||||
)
|
||||
const failedTaggingCounts = useMemo(
|
||||
() =>
|
||||
Object.fromEntries(
|
||||
Object.entries(mediaJobProgress).map(([id, progress]) => [id, progress?.tagging_failed ?? 0]),
|
||||
Object.entries(mediaJobProgress).map(([id, progress]) => [
|
||||
id,
|
||||
progress?.tagging_failed ?? 0,
|
||||
])
|
||||
),
|
||||
[mediaJobProgress],
|
||||
);
|
||||
[mediaJobProgress]
|
||||
)
|
||||
|
||||
useEffect(() => {
|
||||
if (!expanded) return;
|
||||
if (!expanded) return
|
||||
for (const [folderId, count] of Object.entries(failedEmbeddingCounts)) {
|
||||
if (count > 0) {
|
||||
invoke<FailedWorkerItem[]>("get_failed_embedding_images", {
|
||||
invoke<FailedWorkerItem[]>('get_failed_embedding_images', {
|
||||
folderId: Number(folderId),
|
||||
})
|
||||
.then((items) => setFailedEmbeddingItems((prev) => ({ ...prev, [folderId]: items })))
|
||||
.catch(() => undefined);
|
||||
.catch(() => undefined)
|
||||
}
|
||||
}
|
||||
for (const [folderId, count] of Object.entries(failedTaggingCounts)) {
|
||||
if (count > 0) {
|
||||
invoke<FailedWorkerItem[]>("get_failed_tagging_images", {
|
||||
invoke<FailedWorkerItem[]>('get_failed_tagging_images', {
|
||||
folderId: Number(folderId),
|
||||
})
|
||||
.then((items) => setFailedTaggingItems((prev) => ({ ...prev, [folderId]: items })))
|
||||
.catch(() => undefined);
|
||||
.catch(() => undefined)
|
||||
}
|
||||
}
|
||||
}, [expanded, failedEmbeddingCounts, failedTaggingCounts]);
|
||||
}, [expanded, failedEmbeddingCounts, failedTaggingCounts])
|
||||
|
||||
const folderTasks = useMemo(
|
||||
() =>
|
||||
@@ -73,37 +88,38 @@ export function BackgroundTasks() {
|
||||
mediaJobProgress,
|
||||
workerPaused,
|
||||
}),
|
||||
[dismissed, folders, indexingProgress, mediaJobProgress, workerPaused],
|
||||
);
|
||||
[dismissed, folders, indexingProgress, mediaJobProgress, workerPaused]
|
||||
)
|
||||
|
||||
const duplicateScanTask = useMemo(
|
||||
() => buildDuplicateScanTask(duplicateScanning, duplicateScanProgress),
|
||||
[duplicateScanning, duplicateScanProgress],
|
||||
);
|
||||
const allTasks = duplicateScanTask ? [duplicateScanTask, ...folderTasks] : folderTasks;
|
||||
[duplicateScanning, duplicateScanProgress]
|
||||
)
|
||||
const allTasks = duplicateScanTask ? [duplicateScanTask, ...folderTasks] : folderTasks
|
||||
|
||||
if (allTasks.length === 0) return null;
|
||||
if (allTasks.length === 0) return null
|
||||
|
||||
const isWorkerPaused = (folderId: number, worker: WorkerKey) => workerPaused[folderId]?.[worker] ?? false;
|
||||
const isWorkerPaused = (folderId: number, worker: WorkerKey) =>
|
||||
workerPaused[folderId]?.[worker] ?? false
|
||||
|
||||
const toggleWorker = (folderId: number, worker: WorkerKey) => {
|
||||
setWorkerPaused(folderId, worker, !isWorkerPaused(folderId, worker));
|
||||
};
|
||||
setWorkerPaused(folderId, worker, !isWorkerPaused(folderId, worker))
|
||||
}
|
||||
|
||||
const dismissTask = (task: BackgroundTask) => {
|
||||
if (task.id < 0) return;
|
||||
setDismissed((prev) => ({ ...prev, [task.id]: task.snapshot }));
|
||||
setExpanded(false);
|
||||
};
|
||||
if (task.id < 0) return
|
||||
setDismissed((prev) => ({ ...prev, [task.id]: task.snapshot }))
|
||||
setExpanded(false)
|
||||
}
|
||||
|
||||
const retryTask = (task: BackgroundTask) => {
|
||||
if (task.hasFailedEmbeddings) void retryFailedEmbeddings(task.id);
|
||||
if (task.hasFailedTagging) void queueTaggingJobs(task.id);
|
||||
};
|
||||
if (task.hasFailedEmbeddings) void retryFailedEmbeddings(task.id)
|
||||
if (task.hasFailedTagging) void queueTaggingJobs(task.id)
|
||||
}
|
||||
|
||||
const primary = allTasks[0];
|
||||
const hasFailed = folderTasks.some(taskHasTerminalFailure);
|
||||
const barProgress = taskProgress(primary);
|
||||
const primary = allTasks[0]
|
||||
const hasFailed = folderTasks.some(taskHasTerminalFailure)
|
||||
const barProgress = taskProgress(primary)
|
||||
|
||||
return (
|
||||
<div className="shrink-0 border-b border-white/[0.06]">
|
||||
@@ -135,5 +151,5 @@ export function BackgroundTasks() {
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user