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 function useSavedSearches(): UseQueryResult<SavedSearch[]> {
return useQuery({
queryKey: ['saved-searches'],
queryFn: async () => {
const data = await apiFetch<SavedSearchesResponse>('/api/v1/saved-searches')
return data.saved_searches.map(adaptSavedSearch)
},
staleTime: 30_000,
})
}
export function useCreateSavedSearch(): UseMutationResult<SavedSearch, Error, { name: string; query: string }> {
const queryClient = useQueryClient()
return useMutation({
mutationFn: async ({ name, query }) => {
const dto = await apiFetch<SavedSearchDTO>('/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<string, string> = {}
if (name !== undefined) body['name'] = name
if (query !== undefined) body['query'] = query
const dto = await apiFetch<SavedSearchDTO>(
`/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<void, Error, { name: string }> {
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'] })
},
})
}