42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
import { fetchMedia, fetchMediaSyncStatus, triggerMediaSync } from './api.js';
|
|
|
|
export const mediaQueryKeys = {
|
|
items: ['dashboard', 'media'] as const,
|
|
syncStatus: ['dashboard', 'media', 'sync-status'] as const,
|
|
};
|
|
|
|
export function useMediaQuery() {
|
|
return useQuery({ queryKey: mediaQueryKeys.items, queryFn: fetchMedia });
|
|
}
|
|
|
|
export function useMediaSyncStatusQuery() {
|
|
return useQuery({
|
|
queryKey: mediaQueryKeys.syncStatus,
|
|
queryFn: fetchMediaSyncStatus,
|
|
refetchInterval(query) {
|
|
return query.state.data?.isSyncing ? 1_000 : 15_000;
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useTriggerMediaSyncMutation() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn(isFull: boolean) {
|
|
const syncRequest = triggerMediaSync(isFull);
|
|
void queryClient.invalidateQueries({ queryKey: mediaQueryKeys.syncStatus });
|
|
return syncRequest;
|
|
},
|
|
async onSuccess() {
|
|
await Promise.all([
|
|
queryClient.invalidateQueries({ queryKey: mediaQueryKeys.items }),
|
|
queryClient.invalidateQueries({ queryKey: mediaQueryKeys.syncStatus }),
|
|
]);
|
|
},
|
|
onError() {
|
|
void queryClient.invalidateQueries({ queryKey: mediaQueryKeys.syncStatus });
|
|
},
|
|
});
|
|
}
|