mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-07-15 00:11:15 +03:00
improve frontend Job typing
This commit is contained in:
parent
0a37a0d63f
commit
607147ee68
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user