import { keepPreviousData, useQuery, type UseQueryResult } from "@tanstack/react-query"; import { workOrdersApi } from "@/domain/work-orders/api/work-orders-api"; import { fetchWorkOrderEmployees } from "@/domain/work-orders/use-cases/fetch-work-order-employees"; import type { DispatchDetail, EmployeeOption, LocationOption, TaskListTemplate, VendorDropdownItem, WorkOrderDetail, } from "@/domain/work-orders/types/work-order"; import type { WorkOrderBoardDetail } from "@/domain/work-orders/types/work-order-board-detail"; import { queryKeys } from "@/infra/query-key/query-key"; import { requireQueryParam } from "@/lib/query/require-query-param"; export function useWorkOrderDetail( id: string | number | undefined, ): UseQueryResult { return useQuery({ queryKey: queryKeys.workOrders.detail(id ?? ""), queryFn: () => workOrdersApi.getById(requireQueryParam(id, "Work order id")), enabled: id !== undefined && id !== "", placeholderData: keepPreviousData, }); } export function useWorkOrderBoardDetail( id: string | number | undefined, enabled = true, meta?: { suppressErrorToast?: boolean }, ): UseQueryResult { return useQuery({ queryKey: queryKeys.workOrders.boardDetail(id ?? ""), queryFn: () => workOrdersApi.getBoardDetail(requireQueryParam(id, "Work order id")), enabled: enabled && id !== undefined && id !== "", meta, // Do not keepPreviousData — placeholder detail from another WO leaks into the slide-over. }); } export function useWorkOrderMedia( id: string | number | undefined, enabled = true, ): UseQueryResult { return useQuery({ queryKey: queryKeys.workOrders.boardMedia(id ?? ""), queryFn: () => workOrdersApi.listMedia(requireQueryParam(id, "Work order id")), enabled: enabled && id !== undefined && id !== "", }); } export function useWorkOrderLocations(): UseQueryResult { return useQuery({ queryKey: queryKeys.locations.dropdown(), queryFn: () => workOrdersApi.fetchLocations(), staleTime: 5 * 60 * 1000, }); } export function useWorkOrderEmployeesDropdown(): UseQueryResult { return useQuery({ queryKey: [...queryKeys.employees.all, "dropdown"] as const, queryFn: () => fetchWorkOrderEmployees(), staleTime: 5 * 60 * 1000, }); } export function useWorkOrderVendors( trade?: string, siteZip?: string, ): UseQueryResult { return useQuery({ queryKey: queryKeys.vendors.dropdown(trade, siteZip), queryFn: () => workOrdersApi.fetchVendorsDropdown(trade, siteZip), staleTime: 60 * 1000, }); } export function useTaskListTemplates(): UseQueryResult { return useQuery({ queryKey: queryKeys.workOrders.taskTemplates(), queryFn: () => workOrdersApi.fetchTaskTemplates(), staleTime: 5 * 60 * 1000, }); } export function useDispatchDetail( dispatchId: string | number | undefined, ): UseQueryResult { return useQuery({ queryKey: queryKeys.workOrders.dispatch(dispatchId ?? ""), queryFn: () => workOrdersApi.getDispatchById(requireQueryParam(dispatchId, "Dispatch id")), enabled: dispatchId !== undefined && dispatchId !== "", placeholderData: keepPreviousData, }); }