Files
RedditBot/apps/dashboard/src/features/media/queries.ts
T

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 });
},
});
}