From 99cc5afb7c598323c326e66ceca319ca5a12603e Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Sat, 11 Jul 2026 17:11:27 +0530 Subject: [PATCH] fetch request fixes --- src/FetchRequestDetail.tsx | 271 +++++++--------- src/FetchRequests.tsx | 294 ++++++------------ .../fetch-requests/useFetchRequests.ts | 53 +--- 3 files changed, 211 insertions(+), 407 deletions(-) diff --git a/src/FetchRequestDetail.tsx b/src/FetchRequestDetail.tsx index 26d7373..2e0c42a 100644 --- a/src/FetchRequestDetail.tsx +++ b/src/FetchRequestDetail.tsx @@ -12,7 +12,6 @@ import { Stepper, Step, StepLabel, - StepIcon, LinearProgress, IconButton, Snackbar, @@ -35,7 +34,7 @@ import type { ProgressMessage, } from "./features/fetch-requests"; import { RETRY_MAX, formatApiError } from "./features/fetch-requests"; -import { useAppContext, useResource } from "../react-openapi"; +import { useAppContext, useResource, useItemSse } from "../react-openapi"; import { useQuery, useMutation } from "@tanstack/react-query"; const statusColors: Record = { @@ -58,6 +57,8 @@ const statusIcons: Record = { failed: , }; +const stepLabels = ["Extract", "Raw Expense", "Enrich", "Save"]; + function computeProgressPercent( status: FetchRequestStatus, liveCount: number, @@ -86,8 +87,6 @@ function computeProgressPercent( return Math.round(Math.min(100, pct)); } -const stepLabels = ["Extract", "Raw Expense", "Enrich", "Save"]; - function computeActiveStep(status: FetchRequestStatus, seenSteps: Set): number { if (status === "completed") return stepLabels.length; @@ -125,27 +124,13 @@ function sseIcon(status: SSEEvent["status"]) { case "failed": return ; case "skipped": return ; case "paused": return ; - case "progress": return ( - - ); + case "progress": return ; } } -function isMathValid(candidate: { amount: number; balance: number }, prevBalance: number) { - return ( - candidate.balance === prevBalance + candidate.amount || - candidate.balance === prevBalance - candidate.amount || - Math.abs(candidate.balance - (prevBalance + candidate.amount)) < 0.01 || - Math.abs(candidate.balance - (prevBalance - candidate.amount)) < 0.01 - ); -} - export default function FetchRequestDetail() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); - const { config } = useAppContext(); const { get, update } = useResource("fetch-requests"); const { data: fetchRequest, isLoading, error: fetchError, refetch: refetchRequest } = useQuery({ @@ -159,14 +144,52 @@ export default function FetchRequestDetail() { const resolveMutation = useResolveAmbiguity(); const { data: ambiguities, refetch: refetchAmbiguities } = useFetchRequestAmbiguities(id!); - const [sseEvents, setSseEvents] = React.useState([]); - const [sseConnected, setSseConnected] = React.useState(false); - const [liveParsedCount, setLiveParsedCount] = React.useState(undefined); const [stepStats, setStepStats] = React.useState>({}); + const [liveParsedCount, setLiveParsedCount] = React.useState(undefined); const [failNotif, setFailNotif] = React.useState(null); - const sseRef = React.useRef(null); const feedRef = React.useRef(null); + const sseUrl = id ? `/fetch-requests/${id}/events` : null; + const { connected: sseConnected, events: sseEvents } = useItemSse(sseUrl, { + onEvent: (parsed: SSEEvent) => { + if (parsed.status === "progress" && parsed.message.count !== undefined) { + if (parsed.step === "txn_dicts") setLiveParsedCount(parsed.message.count); + if (parsed.step === "enrich") setStepStats((prev) => ({ ...prev, enrich_count: parsed.message.count! })); + if (parsed.step === "save_expenses") setStepStats((prev) => ({ ...prev, save_count: parsed.message.count! })); + } + + if (parsed.status === "completed" && parsed.message.count !== undefined) { + const stats: Record = {}; + if (parsed.step === "raw_lines" && parsed.message.lines !== undefined) stats.raw_lines = parsed.message.lines; + if (parsed.step === "txn_blocks" && parsed.message.blocks !== undefined) stats.txn_blocks = parsed.message.blocks; + if (parsed.step === "txn_dicts") stats.txn_dicts = parsed.message.count; + if (parsed.step === "enrich") stats.enrich_count = parsed.message.count; + if (parsed.step === "save_expenses") stats.save_count = parsed.message.count; + if (Object.keys(stats).length) { + setStepStats((prev) => ({ ...prev, ...stats })); + } + } + + if (parsed.status === "paused") { + refetchRequest(); + refetchAmbiguities(); + } + if (parsed.status === "failed") { + setFailNotif(parsed.message.error || "Fetch request failed"); + refetchRequest(); + } + if (parsed.status === "completed" || parsed.step === "resume_extract") { + refetchRequest(); + } + }, + }); + + React.useEffect(() => { + if (feedRef.current) { + feedRef.current.scrollTop = feedRef.current.scrollHeight; + } + }, [sseEvents]); + const txnBlockCount = React.useMemo(() => { const blocks = (fetchRequest as any)?.source?.txn_blocks; if (!blocks) return 0; @@ -176,110 +199,6 @@ export default function FetchRequestDetail() { ); }, [fetchRequest]); - const stepMessages = React.useMemo(() => { - const msgs: Record = {}; - const source = (fetchRequest as any)?.source; - - const rawLineCount = stepStats.raw_lines ?? (source?.raw_lines?.length ?? 0); - if (rawLineCount) msgs[0] = `${rawLineCount}`; - - const sourceDictCount = source?.txn_dict_count ?? source?.txn_dicts_count ?? 0; - const dictLive = liveParsedCount ?? stepStats.txn_dicts ?? 0; - const dictCurrent = Math.max(dictLive, sourceDictCount); - if (dictCurrent && txnBlockCount) msgs[1] = `${dictCurrent}/${txnBlockCount}`; - else if (dictCurrent) msgs[1] = `${dictCurrent}`; - - const txnDictDenom = stepStats.txn_dicts ?? sourceDictCount; - if (stepStats.enrich_count && txnDictDenom) msgs[2] = `${stepStats.enrich_count}/${txnDictDenom}`; - else if (stepStats.enrich_count) msgs[2] = `${stepStats.enrich_count}`; - - if (stepStats.save_count && txnDictDenom) msgs[3] = `${stepStats.save_count}/${txnDictDenom}`; - else if (stepStats.save_count) msgs[3] = `${stepStats.save_count}`; - - return msgs; - }, [fetchRequest, stepStats, liveParsedCount, txnBlockCount]); - - React.useEffect(() => { - if (!id || !config?.baseApiUrl) return; - const url = `${config.baseApiUrl}/fetch-requests/${id}/events`; - const es = new EventSource(url); - sseRef.current = es; - - es.onopen = () => setSseConnected(true); - es.onerror = () => setSseConnected(false); - es.onmessage = (event) => { - try { - const parsed: SSEEvent = JSON.parse(event.data); - setSseEvents((prev) => [...prev, parsed]); - - if (parsed.status === "progress" && parsed.message.count !== undefined) { - if (parsed.step === "txn_dicts") setLiveParsedCount(parsed.message.count); - if (parsed.step === "enrich") setStepStats((prev) => ({ ...prev, enrich_count: parsed.message.count! })); - if (parsed.step === "save_expenses") setStepStats((prev) => ({ ...prev, save_count: parsed.message.count! })); - } - - if (parsed.status === "completed" && parsed.message.count !== undefined) { - const stats: Record = {}; - if (parsed.step === "raw_lines" && parsed.message.lines !== undefined) stats.raw_lines = parsed.message.lines; - if (parsed.step === "txn_blocks" && parsed.message.blocks !== undefined) stats.txn_blocks = parsed.message.blocks; - if (parsed.step === "txn_dicts") stats.txn_dicts = parsed.message.count; - if (parsed.step === "enrich") stats.enrich_count = parsed.message.count; - if (parsed.step === "save_expenses") stats.save_count = parsed.message.count; - if (Object.keys(stats).length) { - setStepStats((prev) => ({ ...prev, ...stats })); - } - } - - if (parsed.status === "paused") { - refetchRequest(); - refetchAmbiguities(); - } - if (parsed.status === "failed") { - setFailNotif(parsed.message.error || "Fetch request failed"); - refetchRequest(); - } - if (parsed.status === "completed" || parsed.step === "resume_extract") { - refetchRequest(); - } - } catch { - // ignore malformed events - } - }; - - return () => { - es.close(); - sseRef.current = null; - }; - }, [id, config?.baseApiUrl]); - - React.useEffect(() => { - if (feedRef.current) { - feedRef.current.scrollTop = feedRef.current.scrollHeight; - } - }, [sseEvents]); - - const displayEvents = React.useMemo(() => { - const progressSteps = new Set(["txn_dicts", "enrich", "save_expenses"]); - const lastProgressIdx: Record = {}; - for (let i = sseEvents.length - 1; i >= 0; i--) { - const e = sseEvents[i]; - if (progressSteps.has(e.step) && e.status === "progress" && lastProgressIdx[e.step] === undefined) { - lastProgressIdx[e.step] = i; - } - } - - const terminalStatuses = new Set(["completed", "skipped", "paused", "failed"]); - return sseEvents.filter((e, i) => { - if (progressSteps.has(e.step) && e.status === "progress") return i === lastProgressIdx[e.step]; - if (e.status === "started") { - return !sseEvents.slice(i + 1).some( - (later) => later.step === e.step && terminalStatuses.has(later.status), - ); - } - return true; - }); - }, [sseEvents]); - const seenSteps = React.useMemo(() => { const steps = new Set(); for (const evt of sseEvents) { @@ -308,6 +227,29 @@ export default function FetchRequestDetail() { return source?.txn_dict_count ?? source?.txn_dicts_count ?? 0; }, [fetchRequest, stepStats]); + const stepMessages = React.useMemo(() => { + const msgs: Record = {}; + const source = (fetchRequest as any)?.source; + + const rawLineCount = stepStats.raw_lines ?? (source?.raw_lines?.length ?? 0); + if (rawLineCount) msgs[0] = `${rawLineCount}`; + + const sourceDictCount = source?.txn_dict_count ?? source?.txn_dicts_count ?? 0; + const dictLive = liveParsedCount ?? stepStats.txn_dicts ?? 0; + const dictCurrent = Math.max(dictLive, sourceDictCount); + if (dictCurrent && txnBlockCount) msgs[1] = `${dictCurrent}/${txnBlockCount}`; + else if (dictCurrent) msgs[1] = `${dictCurrent}`; + + const txnDictDenom = stepStats.txn_dicts ?? sourceDictCount; + if (stepStats.enrich_count && txnDictDenom) msgs[2] = `${stepStats.enrich_count}/${txnDictDenom}`; + else if (stepStats.enrich_count) msgs[2] = `${stepStats.enrich_count}`; + + if (stepStats.save_count && txnDictDenom) msgs[3] = `${stepStats.save_count}/${txnDictDenom}`; + else if (stepStats.save_count) msgs[3] = `${stepStats.save_count}`; + + return msgs; + }, [fetchRequest, stepStats, liveParsedCount, txnBlockCount]); + const progressPercent = React.useMemo( () => computeProgressPercent( (fetchRequest as any)?.status as FetchRequestStatus ?? "pending", @@ -320,6 +262,28 @@ export default function FetchRequestDetail() { [fetchRequest, displayParsedCount, seenSteps, stepStats, txnBlockCount, txnDictCount], ); + const displayEvents = React.useMemo(() => { + const progressSteps = new Set(["txn_dicts", "enrich", "save_expenses"]); + const lastProgressIdx: Record = {}; + for (let i = sseEvents.length - 1; i >= 0; i--) { + const e = sseEvents[i]; + if (progressSteps.has(e.step) && e.status === "progress" && lastProgressIdx[e.step] === undefined) { + lastProgressIdx[e.step] = i; + } + } + + const terminalStatuses = new Set(["completed", "skipped", "paused", "failed"]); + return sseEvents.filter((e, i) => { + if (progressSteps.has(e.step) && e.status === "progress") return i === lastProgressIdx[e.step]; + if (e.status === "started") { + return !sseEvents.slice(i + 1).some( + (later) => later.step === e.step && terminalStatuses.has(later.status), + ); + } + return true; + }); + }, [sseEvents]); + const handleRetry = async () => { if (!id) return; try { @@ -360,11 +324,8 @@ export default function FetchRequestDetail() { const activeStep = computeActiveStep(req.status as FetchRequestStatus, seenSteps); const retryCount = req.retry_count ?? 0; const isRetryExhausted = retryCount >= RETRY_MAX; - const pendingAmbiguities = ambiguities?.filter((a: any) => a.status === "pending") ?? []; - const resolvedAmbiguities = ambiguities?.filter((a: any) => a.status === "resolved") ?? []; const hasAmbiguities = ambiguities && ambiguities.length > 0; - const allResolved = hasAmbiguities && pendingAmbiguities.length === 0; - const ambiguitiesLoading = !ambiguities; + const allResolved = hasAmbiguities && ambiguities.every((a: any) => a.status === "resolved"); return ( @@ -372,6 +333,7 @@ export default function FetchRequestDetail() { Back to Fetch Requests + {/* Header Card */} Date Range - {(req as any).start_date ? new Date((req as any).start_date).toLocaleDateString() : "?"} → {(req as any).end_date ? new Date((req as any).end_date).toLocaleDateString() : "?"} + {req.start_date ? new Date(req.start_date).toLocaleDateString() : "?"} → {req.end_date ? new Date(req.end_date).toLocaleDateString() : "?"} @@ -407,11 +369,10 @@ export default function FetchRequestDetail() { )} + {/* Progress Bar */} - - Overall Progress - + Overall Progress {["processing", "paused"].includes(req.status) && displayParsedCount > 0 && ( Validated: {displayParsedCount} transactions @@ -429,6 +390,7 @@ export default function FetchRequestDetail() { + {/* Retry Counter */} @@ -455,18 +417,19 @@ export default function FetchRequestDetail() { + {/* Error Alerts */} {req.status === "failed" && req.error_message && ( {req.error_message} )} - {isRetryExhausted && req.status === "failed" && ( Max retries reached — no further retry attempts will be made. )} + {/* Pipeline Stepper */} Pipeline Progress @@ -491,17 +454,15 @@ export default function FetchRequestDetail() { icon = {index + 1}; } - const stepMsg = stepMessages[index]; - return ( {icon}} > {label} - {stepMsg && ( + {stepMessages[index] && ( - {stepMsg} + {stepMessages[index]} )} @@ -511,6 +472,7 @@ export default function FetchRequestDetail() { + {/* SSE Event Feed */} @@ -568,15 +530,13 @@ export default function FetchRequestDetail() { )} - - {new Date().toLocaleTimeString()} - )) )} + {/* Ambiguity Resolution */} {hasAmbiguities && ( @@ -664,18 +624,19 @@ export default function FetchRequestDetail() { ); })} - - )} - setFailNotif(null)} - anchorOrigin={{ vertical: "bottom", horizontal: "center" }} - > - setFailNotif(null)} sx={{ borderRadius: 2 }}> - {failNotif} - - + + )} + + setFailNotif(null)} + anchorOrigin={{ vertical: "bottom", horizontal: "center" }} + > + setFailNotif(null)} sx={{ borderRadius: 2 }}> + {failNotif} + + ); } diff --git a/src/FetchRequests.tsx b/src/FetchRequests.tsx index cffa1b0..1937192 100644 --- a/src/FetchRequests.tsx +++ b/src/FetchRequests.tsx @@ -25,6 +25,12 @@ import { FormControl, OutlinedInput, Autocomplete, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, } from "@mui/material"; import DeleteIcon from "@mui/icons-material/Delete"; import CloudUploadIcon from "@mui/icons-material/CloudUpload"; @@ -36,9 +42,7 @@ import ErrorIcon from "@mui/icons-material/Error"; import ScheduleIcon from "@mui/icons-material/Schedule"; import HourglassEmptyIcon from "@mui/icons-material/HourglassEmpty"; import WarningAmberIcon from "@mui/icons-material/WarningAmber"; -import { - useUploadFile, -} from "./features/fetch-requests"; +import { useUploadFile } from "./features/fetch-requests"; import type { FetchRequest, FetchRequestStatus, @@ -47,7 +51,7 @@ import type { } from "./features/fetch-requests"; import { RETRY_MAX, formatApiError } from "./features/fetch-requests"; import { useNavigate } from "react-router-dom"; -import { useResource, FormFieldRenderer } from "../react-openapi"; +import { useResource, FormFieldRenderer, applyDisplayFormat } from "../react-openapi"; import type { FieldConfig } from "../react-openapi"; import { useMutation, useQuery } from "@tanstack/react-query"; @@ -81,18 +85,6 @@ const STATUS_OPTIONS: FetchRequestStatus[] = [ "failed", ]; -function formatDate(iso: string) { - const d = new Date(iso); - return d.toLocaleString(); -} - -function formatDateRange(start?: string, end?: string) { - if (!start && !end) return "\u2014"; - const s = start ? new Date(start).toLocaleDateString() : "?"; - const e = end ? new Date(end).toLocaleDateString() : "?"; - return `${s} \u2192 ${e}`; -} - function shortId(fp: string) { return fp.length > 8 ? fp.slice(0, 8) + "\u2026" : fp; } @@ -118,8 +110,7 @@ export default function FetchRequests() { const [accountFilter, setAccountFilter] = React.useState(""); const [sourceFilter, setSourceFilter] = React.useState<"all" | "file" | "email">("all"); - const fr = useResource("fetch-requests"); - const { list, create, update, remove, resource: fetchRes } = fr; + const { list, create, update, remove, resource: fetchRes } = useResource("fetch-requests"); const { data: listData, isLoading, isFetching, refetch } = useQuery({ queryKey: ["fetch-requests", "list", { statusFilter, accountFilter, sourceFilter }], @@ -141,20 +132,15 @@ export default function FetchRequests() { const fields = fetchRes?.orderedFields ?? []; const formatField: FieldConfig | undefined = fields.find(f => f.name === "format"); - const formatOptions: string[] = formatField?.enumValues ?? []; const startDateField: FieldConfig | undefined = fields.find(f => f.name === "start_date"); const endDateField: FieldConfig | undefined = fields.find(f => f.name === "end_date"); const payorUsernameField: FieldConfig | undefined = fields.find(f => f.name === "payor_username"); - const createMutation = useMutation({ - mutationFn: (data: any) => create(data), - }); + const createMutation = useMutation({ mutationFn: (data: any) => create(data) }); const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: string; data: any }) => update(id, data), }); - const deleteMutation = useMutation({ - mutationFn: (id: string) => remove(id), - }); + const deleteMutation = useMutation({ mutationFn: (id: string) => remove(id) }); const uploadMutation = useUploadFile(); const requests = listData?.items ?? []; @@ -199,7 +185,7 @@ export default function FetchRequests() { navigate(`/fetch-requests/${result.id}`); } catch (err: any) { if (err?.response?.status === 409) { - setSnackbar({ message: "Duplicate \u2014 same fingerprint already exists", severity: "error" }); + setSnackbar({ message: "Duplicate — same fingerprint already exists", severity: "error" }); } else { setSnackbar({ message: formatApiError(err) || "Failed to create fetch request", severity: "error" }); } @@ -238,14 +224,13 @@ export default function FetchRequests() { setDeleteTarget(null); }; - const sourceTypeOptions: ("all" | "file" | "email")[] = ["all", "file", "email"]; - return ( Fetch Request Pipeline + {/* Create Form */} New Fetch Request @@ -286,40 +271,14 @@ export default function FetchRequests() { Uploaded as: {uploadedPath} )} - {formatField ? ( - - ) : ( - - Format - - + {formatField && ( + )} ) : ( <> - {formatField ? ( - - ) : ( - - Format - - + {formatField && ( + )} setFromEmail(e.target.value)} size="small" /> setSubject(e.target.value)} size="small" /> @@ -334,58 +293,22 @@ export default function FetchRequests() { renderInput={(params) => ( )} - sx={{ "& .MuiOutlinedInput-root": { height: "auto", minHeight: "2.5rem" } }} /> - {payorUsernameField ? ( - - ) : ( - setPayorUsername(e.target.value)} size="small" helperText="Default: aetos" /> + + {payorUsernameField && ( + )} - {startDateField ? ( + {startDateField && ( - + - ) : ( - setStartDate(e.target.value)} - size="small" - InputLabelProps={{ shrink: true }} - inputProps={{ max: new Date().toISOString().split("T")[0] }} - sx={{ flex: 1 }} - /> )} - {endDateField ? ( + {endDateField && ( - + - ) : ( - setEndDate(e.target.value)} - size="small" - InputLabelProps={{ shrink: true }} - inputProps={{ max: new Date().toISOString().split("T")[0] }} - sx={{ flex: 1 }} - /> )} @@ -399,6 +322,7 @@ export default function FetchRequests() { + {/* Filters */} @@ -410,7 +334,7 @@ export default function FetchRequests() { input={} renderValue={(selected) => (selected as string[]).join(", ")} > - {STATUS_OPTIONS.map((s: string) => ( + {STATUS_OPTIONS.map((s) => ( {s.replace(/_/g, " ")} ))} @@ -422,7 +346,7 @@ export default function FetchRequests() { renderInput={(params) => ( )} - sx={{ minWidth: 160, "& .MuiOutlinedInput-root": { height: "auto", minHeight: "2.5rem" } }} + sx={{ minWidth: 160 }} /> val && setSourceFilter(val)} size="small" > - {sourceTypeOptions.map((opt) => ( - - {opt === "all" ? "All" : opt === "file" ? "File" : "Email"} - - ))} + All + File + Email refetch()} disabled={isFetching}> @@ -443,6 +365,7 @@ export default function FetchRequests() { + {/* List Table */} {isLoading ? ( @@ -452,41 +375,35 @@ export default function FetchRequests() { No fetch requests yet ) : ( - - - - - - {["ID", "Account", "Source", "Date Range", "Status", "Retries", "Created", "Actions"].map((h) => ( - - {h} - - ))} - - - - {[...requests] - .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()) - .map((req: FetchRequest) => ( - + + + + ID + Account + Source + Date Range + Status + Retries + Created + Actions + + + + {[...requests] + .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()) + .map((req: FetchRequest) => ( + navigate(`/fetch-requests/${req.id}`)} - sx={{ - cursor: "pointer", - borderBottom: 1, - borderColor: "divider", - "&:hover": { bgcolor: "action.hover" }, - "&:last-child": { borderBottom: 0 }, - }} > - + - {shortId(req.fingerprint)} + + {shortId(req.fingerprint)} + { @@ -499,96 +416,69 @@ export default function FetchRequests() { - - - {req.account_name} - - + + {req.account_name} + - - + + - {formatDateRange((req as any).start_date, (req as any).end_date)} + {(req as any).start_date ? new Date((req as any).start_date).toLocaleDateString() : "?"} → {(req as any).end_date ? new Date((req as any).end_date).toLocaleDateString() : "?"} - - - - - - - - - - {(req.retry_count ?? 0) > 0 ? ( - - {req.retry_count}/{RETRY_MAX} - - ) : ( - - \u2014 - - )} - - - {formatDate(req.created_at)} - - + + + + + + + + + {(req.retry_count ?? 0) > 0 ? `${req.retry_count}/${RETRY_MAX}` : "—"} + + + + + {new Date(req.created_at).toLocaleString()} + + + {req.status === "paused" && ( - { - e.stopPropagation(); - navigate(`/fetch-requests/${req.id}`); - }} - > + { e.stopPropagation(); navigate(`/fetch-requests/${req.id}`); }}> )} {req.status === "failed" && (req.retry_count ?? 0) < RETRY_MAX && ( - { - e.stopPropagation(); - handleRetry(req); - }} - > + { e.stopPropagation(); handleRetry(req); }}> )} - { - e.stopPropagation(); - setDeleteTarget(req); - }} - > + { e.stopPropagation(); setDeleteTarget(req); }}> - - + + ))} - - - - + +
+ )} list(params), - }); -} - -export function useFetchRequest(id: string) { - const { get } = useResource("fetch-requests"); - return useQuery({ - queryKey: ["fetch-requests", "detail", id], - queryFn: () => get(id), - enabled: !!id, - }); -} - -export function useCreateFetchRequest() { - const { create } = useResource("fetch-requests"); - return useMutation({ - mutationFn: (data: any) => create(data), - }); -} - -export function useUpdateFetchRequest() { - const { update } = useResource("fetch-requests"); - return useMutation({ - mutationFn: ({ id, data }: { id: string; data: any }) => update(id, data), - }); -} - -export function useDeleteFetchRequest() { - const { remove } = useResource("fetch-requests"); - return useMutation({ - mutationFn: (id: string) => remove(id), - }); -} - export function useUploadFile() { return useMutation({ mutationFn: async (file: File) => { @@ -66,9 +24,7 @@ export function useFetchRequestAmbiguities(fetchRequestId: string) { queryKey: ["fetch-requests", fetchRequestId, "ambiguities"], queryFn: async () => { const api = getApi(); - const res = await api.get( - `/fetch-requests/${fetchRequestId}/ambiguities` - ); + const res = await api.get(`/fetch-requests/${fetchRequestId}/ambiguities`); return res.data; }, enabled: !!fetchRequestId, @@ -87,10 +43,7 @@ export function useResolveAmbiguity() { payload: ResolveAmbiguityPayload; }) => { const api = getApi(); - const res = await api.post( - `/ambiguities/${ambiguityId}/resolve`, - payload - ); + const res = await api.post(`/ambiguities/${ambiguityId}/resolve`, payload); return res.data; }, onSuccess: (data: any) => {