import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import type { UseQueryResult, UseMutationResult } from '@tanstack/react-query' import { apiFetch, apiFetchVoid } from '../../api/client' import { adaptSavedSearch } from '../../api/adapters' import type { SavedSearch, SavedSearchDTO } from '../../api/adapters' interface SavedSearchesResponse { saved_searches: SavedSearchDTO[] } export interface UseSavedSearchesOptions { enabled?: boolean staleTime?: number } export function useSavedSearches(options?: UseSavedSearchesOptions): UseQueryResult { return useQuery({ queryKey: ['saved-searches'], queryFn: async () => { const data = await apiFetch('/api/v1/saved-searches') return data.saved_searches.map(adaptSavedSearch) }, enabled: options?.enabled, staleTime: options?.staleTime ?? 30_000, }) } export function useCreateSavedSearch(): UseMutationResult { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ name, query }) => { const dto = await apiFetch('/api/v1/saved-searches', { method: 'POST', body: JSON.stringify({ name, query }), headers: { 'Content-Type': 'application/json' }, }) return adaptSavedSearch(dto) }, onSuccess: () => { void queryClient.invalidateQueries({ queryKey: ['saved-searches'] }) }, }) } export function useUpdateSavedSearch(): UseMutationResult< SavedSearch, Error, { oldName: string; name?: string; query?: string } > { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ oldName, name, query }) => { const body: Record = {} if (name !== undefined) body['name'] = name if (query !== undefined) body['query'] = query const dto = await apiFetch( `/api/v1/saved-searches/${encodeURIComponent(oldName)}`, { method: 'PUT', body: JSON.stringify(body), headers: { 'Content-Type': 'application/json' }, }, ) return adaptSavedSearch(dto) }, onSuccess: () => { void queryClient.invalidateQueries({ queryKey: ['saved-searches'] }) }, }) } export function useDeleteSavedSearch(): UseMutationResult { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ name }) => { await apiFetchVoid(`/api/v1/saved-searches/${encodeURIComponent(name)}`, { method: 'DELETE', }) }, onSuccess: () => { void queryClient.invalidateQueries({ queryKey: ['saved-searches'] }) }, }) }