improve frontend Job typing

This commit is contained in:
Josh Hawkins 2026-04-17 12:14:05 -05:00
parent 0a37a0d63f
commit 607147ee68
2 changed files with 13 additions and 13 deletions

View File

@ -146,11 +146,11 @@ export type MediaSyncResults = {
totals: MediaSyncTotals; totals: MediaSyncTotals;
}; };
export type Job = { export type Job<TResults = unknown> = {
id: string; id: string;
job_type: string; job_type: string;
status: string; status: string;
results?: MediaSyncResults; results?: TResults;
start_time?: number; start_time?: number;
end_time?: number; end_time?: number;
error_message?: string; error_message?: string;

View File

@ -13,7 +13,7 @@ import { Switch } from "@/components/ui/switch";
import { LuCheck, LuX } from "react-icons/lu"; import { LuCheck, LuX } from "react-icons/lu";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; import { formatUnixTimestampToDateTime } from "@/utils/dateUtil";
import { MediaSyncStats } from "@/types/ws"; import { MediaSyncResults, MediaSyncStats } from "@/types/ws";
export default function MediaSyncSettingsView() { export default function MediaSyncSettingsView() {
const { t } = useTranslation("views/settings"); const { t } = useTranslation("views/settings");
@ -35,7 +35,8 @@ export default function MediaSyncSettingsView() {
]; ];
// Subscribe to media sync status via WebSocket // Subscribe to media sync status via WebSocket
const { payload: currentJob } = useJobStatus("media_sync"); const { payload: currentJob } = useJobStatus<MediaSyncResults>("media_sync");
const mediaSyncResults = currentJob?.results;
const isJobRunning = Boolean( const isJobRunning = Boolean(
currentJob && currentJob &&
@ -301,7 +302,7 @@ export default function MediaSyncSettingsView() {
</span> </span>
</div> </div>
)} )}
{currentJob?.results && ( {mediaSyncResults && (
<div className="mt-2 space-y-2 md:mr-2"> <div className="mt-2 space-y-2 md:mr-2">
<p className="text-sm font-medium text-muted-foreground"> <p className="text-sm font-medium text-muted-foreground">
{t("maintenance.sync.results")} {t("maintenance.sync.results")}
@ -309,7 +310,7 @@ export default function MediaSyncSettingsView() {
<div className="rounded-md border border-secondary"> <div className="rounded-md border border-secondary">
{/* Individual media type results */} {/* Individual media type results */}
<div className="divide-y divide-secondary"> <div className="divide-y divide-secondary">
{Object.entries(currentJob.results) {Object.entries(mediaSyncResults)
.filter(([key]) => key !== "totals") .filter(([key]) => key !== "totals")
.map(([mediaType, stats]) => { .map(([mediaType, stats]) => {
const mediaStats = stats as MediaSyncStats; const mediaStats = stats as MediaSyncStats;
@ -386,7 +387,7 @@ export default function MediaSyncSettingsView() {
})} })}
</div> </div>
{/* Totals */} {/* Totals */}
{currentJob.results.totals && ( {mediaSyncResults.totals && (
<div className="border-t border-secondary bg-background_alt p-3"> <div className="border-t border-secondary bg-background_alt p-3">
<p className="mb-1 font-medium"> <p className="mb-1 font-medium">
{t("maintenance.sync.resultsFields.totals")} {t("maintenance.sync.resultsFields.totals")}
@ -399,7 +400,7 @@ export default function MediaSyncSettingsView() {
)} )}
</span> </span>
<span className="font-medium"> <span className="font-medium">
{currentJob.results.totals.files_checked} {mediaSyncResults.totals.files_checked}
</span> </span>
</div> </div>
<div className="flex justify-between"> <div className="flex justify-between">
@ -410,12 +411,12 @@ export default function MediaSyncSettingsView() {
</span> </span>
<span <span
className={ className={
currentJob.results.totals.orphans_found > 0 mediaSyncResults.totals.orphans_found > 0
? "font-medium text-yellow-500" ? "font-medium text-yellow-500"
: "font-medium" : "font-medium"
} }
> >
{currentJob.results.totals.orphans_found} {mediaSyncResults.totals.orphans_found}
</span> </span>
</div> </div>
<div className="flex justify-between"> <div className="flex justify-between">
@ -427,13 +428,12 @@ export default function MediaSyncSettingsView() {
<span <span
className={cn( className={cn(
"text-medium", "text-medium",
currentJob.results.totals.orphans_deleted > mediaSyncResults.totals.orphans_deleted > 0
0
? "text-success" ? "text-success"
: "text-muted-foreground", : "text-muted-foreground",
)} )}
> >
{currentJob.results.totals.orphans_deleted} {mediaSyncResults.totals.orphans_deleted}
</span> </span>
</div> </div>
</div> </div>