import React, { useState } from 'react' import { EmptyState, Sub } from '../../primitives' import { AuthError, APIError } from '../../api/client' import type { SavedSearch } from '../../api/adapters' import { useSavedSearches, useCreateSavedSearch, useUpdateSavedSearch, useDeleteSavedSearch, } from './useSavedSearches' // ── Inline "Add new" form ───────────────────────────────────────────────────── function AddForm(): React.JSX.Element { const [name, setName] = useState('') const [query, setQuery] = useState('') const createMutation = useCreateSavedSearch() function handleSave(e: React.FormEvent) { e.preventDefault() if (!name.trim() || !query.trim()) return createMutation.mutate( { name: name.trim(), query: query.trim() }, { onSuccess: () => { setName('') setQuery('') }, }, ) } return (
setName(e.target.value)} autoComplete="off" /> setQuery(e.target.value)} autoComplete="off" /> {createMutation.isError && ( {createMutation.error instanceof APIError ? createMutation.error.message : String(createMutation.error)} )}
) } // ── Per-row inline edit form ────────────────────────────────────────────────── interface RowProps { row: SavedSearch } function SavedSearchRow({ row }: RowProps): React.JSX.Element { const [editing, setEditing] = useState(false) const [name, setName] = useState(row.name) const [query, setQuery] = useState(row.query) const updateMutation = useUpdateSavedSearch() const deleteMutation = useDeleteSavedSearch() function handleSave(e: React.FormEvent) { e.preventDefault() updateMutation.mutate( { oldName: row.name, name: name.trim() || undefined, query: query.trim() || undefined }, { onSuccess: () => setEditing(false) }, ) } function handleDelete() { deleteMutation.mutate({ name: row.name }) } if (editing) { return (
setName(e.target.value)} autoComplete="off" /> setQuery(e.target.value)} autoComplete="off" />
{updateMutation.isError && ( {updateMutation.error instanceof APIError ? updateMutation.error.message : String(updateMutation.error)} )}
) } return (
{row.name} {row.query} {new Date(row.updatedAt).toLocaleDateString()} {deleteMutation.isError && ( {deleteMutation.error instanceof APIError ? deleteMutation.error.message : String(deleteMutation.error)} )}
) } // ── Main section ────────────────────────────────────────────────────────────── export function SavedSearchesSection(): React.JSX.Element { const { data, isLoading, error } = useSavedSearches() if (isLoading) { return loading… } if (error != null) { if (error instanceof AuthError) { return (
not authenticated
Sign in to manage your saved searches.
) } const detail = error instanceof APIError ? error.message : String(error) return (
error
{detail}
) } return (
Saved searches
{data != null && data.length === 0 ? ( ) : (
Name Query Updated
{data?.map((row) => ( ))}
)}
) }