import { UseListQueryResult, useList, useOne, useSave } from "@/lib/hooks/useDataSource"; import { IFilterItemDataProviderParam, IGetListDataProviderParams, } from "@/lib/hooks/useDataSource/DataSource"; import { TDataSourceError } from "@/lib/hooks/useDataSource/types"; import { useDataSource } from "@/lib/hooks/useDataSource/useDataSource"; import { useQueryKey } from "@/lib/hooks/useQueryKey"; import { ICreateQuote_Request_DTO, ICreateQuote_Response_DTO, IGetQuote_Response_DTO, IListQuotes_Response_DTO, IListResponse_DTO, IUpdateQuote_Request_DTO, IUpdateQuote_Response_DTO, UniqueID, } from "@shared/contexts"; export type UseQuotesListParams = Omit & { status?: string; enabled?: boolean; queryOptions?: Record; }; export type UseQuotesListResponse = UseListQueryResult< IListResponse_DTO, unknown >; export type UseQuotesGetParamsType = { enabled?: boolean; queryOptions?: Record; }; const quoteStatusFilter: Record = { draft: { field: "status", operator: "eq", value: "draft", }, archived: { field: "status", operator: "eq", value: "archived", }, active: { field: "status", operator: "eq", value: "active", }, }; export const useQuotes = () => { const dataSource = useDataSource(); const keys = useQueryKey(); return { useList: (params: UseQuotesListParams): UseQuotesListResponse => { const dataSource = useDataSource(); const keys = useQueryKey(); const { pagination, status = "draft", quickSearchTerm = undefined, enabled = true, queryOptions, } = params; return useList({ queryKey: keys().data().resource("quotes").action("list").params(params).get(), queryFn: () => { return dataSource.getList({ resource: "quotes", quickSearchTerm, filters: status !== "all" ? Array.of(quoteStatusFilter[status]) : undefined, pagination, }); }, enabled, queryOptions, }); }, useOne: (id?: string, params?: UseQuotesGetParamsType) => useOne({ queryKey: keys().data().resource("quotes").action("one").id("").params().get(), queryFn: () => dataSource.getOne({ resource: "quotes", id: String(id), }), enabled: !!id, ...params, }), useCreate: () => useSave({ //mutationKey: keys().data().resource("quotes").action("one").id("").params().get(), mutationFn: (data) => { const { date } = data; const id = UniqueID.generateNewID().object.toString(); const status = "draft"; return dataSource.createOne({ resource: "quotes", data: { ...data, date: new Date(date).toISOString().slice(0, 10), status, id, }, }); }, }), useUpdate: (id: string) => useSave({ mutationKey: keys().data().resource("quotes").action("one").id(id).params().get(), mutationFn: (data) => { const { date } = data; return dataSource.updateOne({ resource: "quotes", id, data: { ...data, date: new Date(date).toISOString().slice(0, 10), }, }); }, }), }; };