import { apiQueryClient, type paths, useResourceQuery } from "@/shared/api"; type BrokerageOperation = NonNullable< OperationsEndpoint["responses"][200]["content"]["application/json"]["data"] >["items"][number]; type BrokerageOperationsQuery = Omit< NonNullable, "sync" >; type OperationCategory = BrokerageOperation["category"]; type OperationsEndpoint = paths["/api/v1/brokerage-accounts/{accountId}/operations"]["get"]; const operationCategories = [ "trade", "income", "tax", "fee", "transfer", "other", ] as const satisfies readonly OperationCategory[]; function brokerageOperationsQueryOptions( accountId: string | undefined, query: BrokerageOperationsQuery = {}, ) { return apiQueryClient.queryOptions( "get", "/api/v1/brokerage-accounts/{accountId}/operations", { params: { path: { accountId: accountId ?? "" }, query: brokerageOperationsQueryParameters(query), }, }, ); } function brokerageOperationsQueryParameters(query: BrokerageOperationsQuery) { return { ...(query.instrumentUid && { instrumentUid: query.instrumentUid }), ...(query.from && { from: query.from }), ...(query.to && { to: query.to }), ...(query.categories?.length && { categories: query.categories.toSorted((left, right) => left.localeCompare(right)) }), ...(query.cursor && { cursor: query.cursor }), ...(query.limit && { limit: query.limit }), }; } function useBrokerageOperations( accountId: string | undefined, query: BrokerageOperationsQuery = {}, ) { return useResourceQuery({ meta: { accessGroup: "brokerage" }, ...brokerageOperationsQueryOptions(accountId, query), enabled: Boolean(accountId), staleTime: 30_000, }); } export { type BrokerageOperation, brokerageOperationsQueryOptions, brokerageOperationsQueryParameters as brokerageOperationsQueryParams, operationCategories, type OperationCategory, useBrokerageOperations, };