feat(services): select Jellyfin via jellyfin_service_id on the frontend

Slice 4b frontend half. Jellyfin-touching pages now select a Jellyfin service
instance instead of a machine.

- api/client.ts: Jellyfin-backed calls (counts/libraries/activity/users, media
  status/build/stop/force-stop, queryMedia) send jellyfin_service_id.
- hooks/useDashboard, useUsers, useMedia: selector param renamed to
  jellyfinServiceId.
- pages/Media + Applications: list jellyfin service instances and persist
  jellyfin_service_id in the URL.
- Dashboard (widgets) and Users (default instance) need no selector change.
- Update Applications + Media tests for the new hook/param.

Files/SSH transport keeps machine_id. Verification: frontend lint 0 errors,
build success, 70 tests; backend ruff clean, 222 tests.
This commit is contained in:
Developer
2026-06-23 12:10:27 +00:00
parent a13f560df2
commit cbb703341e
9 changed files with 113 additions and 89 deletions
+9 -9
View File
@@ -9,26 +9,26 @@ import {
} from "../api/client";
import type { DashboardShortcutInput } from "../types";
export function useCounts(machineId?: string) {
export function useCounts(jellyfinServiceId?: string) {
return useQuery({
queryKey: ["dashboard", "counts", machineId ?? "default"],
queryFn: () => fetchCounts(machineId),
queryKey: ["dashboard", "counts", jellyfinServiceId ?? "default"],
queryFn: () => fetchCounts(jellyfinServiceId),
staleTime: 5 * 60 * 1000,
});
}
export function useLibraries(machineId?: string) {
export function useLibraries(jellyfinServiceId?: string) {
return useQuery({
queryKey: ["dashboard", "libraries", machineId ?? "default"],
queryFn: () => fetchLibraries(machineId),
queryKey: ["dashboard", "libraries", jellyfinServiceId ?? "default"],
queryFn: () => fetchLibraries(jellyfinServiceId),
staleTime: 5 * 60 * 1000,
});
}
export function useActivity(machineId?: string) {
export function useActivity(jellyfinServiceId?: string) {
return useQuery({
queryKey: ["dashboard", "activity", machineId ?? "default"],
queryFn: () => fetchActivity(machineId),
queryKey: ["dashboard", "activity", jellyfinServiceId ?? "default"],
queryFn: () => fetchActivity(jellyfinServiceId),
refetchInterval: 15_000,
});
}