import { FetchError } from "@medusajs/js-sdk" import { AdminOrderItemsFilters, HttpTypes } from "@medusajs/types" import { QueryKey, useMutation, UseMutationOptions, useQuery, UseQueryOptions, } from "@tanstack/react-query" import { sdk } from "../../lib/client" import { queryClient } from "../../lib/query-client" import { queryKeysFactory, TQueryKey } from "../../lib/query-key-factory" const ORDERS_QUERY_KEY = "orders" as const const _orderKeys = queryKeysFactory(ORDERS_QUERY_KEY) as TQueryKey<"orders"> & { preview: (orderId: string) => any changes: (orderId: string) => any lineItems: (orderId: string) => any } _orderKeys.preview = function (id: string) { return [this.detail(id), "preview"] } _orderKeys.changes = function (id: string) { return [this.detail(id), "changes"] } _orderKeys.lineItems = function (id: string) { return [this.detail(id), "lineItems"] } export const ordersQueryKeys = _orderKeys export const useOrder = ( id: string, query?: Record, options?: Omit< UseQueryOptions, "queryFn" | "queryKey" > ) => { const { data, ...rest } = useQuery({ queryFn: async () => sdk.admin.order.retrieve(id, query), queryKey: ordersQueryKeys.detail(id, query), ...options, }) return { ...data, ...rest } } export const useOrderPreview = ( id: string, query?: HttpTypes.AdminOrderFilters, options?: Omit< UseQueryOptions< HttpTypes.AdminOrderPreviewResponse, FetchError, HttpTypes.AdminOrderPreviewResponse, QueryKey >, "queryFn" | "queryKey" > ) => { const { data, ...rest } = useQuery({ queryFn: async () => sdk.admin.order.retrievePreview(id, query), queryKey: ordersQueryKeys.preview(id), ...options, }) return { ...data, ...rest } } export const useOrders = ( query?: HttpTypes.AdminOrderFilters, options?: Omit< UseQueryOptions< HttpTypes.AdminOrderListResponse, FetchError, HttpTypes.AdminOrderListResponse, QueryKey >, "queryFn" | "queryKey" > ) => { const { data, ...rest } = useQuery({ queryFn: async () => sdk.admin.order.list(query), queryKey: ordersQueryKeys.list(query), ...options, }) return { ...data, ...rest } } export const useOrderChanges = ( id: string, query?: HttpTypes.AdminOrderChangesFilters, options?: Omit< UseQueryOptions< HttpTypes.AdminOrderChangesResponse, FetchError, HttpTypes.AdminOrderChangesResponse, QueryKey >, "queryFn" | "queryKey" > ) => { const { data, ...rest } = useQuery({ queryFn: async () => sdk.admin.order.listChanges(id, query), queryKey: ordersQueryKeys.changes(id), ...options, }) return { ...data, ...rest } } export const useOrderLineItems = ( id: string, query?: HttpTypes.AdminOrderItemsFilters, options?: Omit< UseQueryOptions< HttpTypes.AdminOrderLineItemsListResponse, FetchError, HttpTypes.AdminOrderLineItemsListResponse, QueryKey >, "queryFn" | "queryKey" > ) => { const { data, ...rest } = useQuery({ queryFn: async () => sdk.admin.order.listLineItems(id, query), queryKey: ordersQueryKeys.lineItems(id), ...options, }) return { ...data, ...rest } } export const useCreateOrderFulfillment = ( orderId: string, options?: UseMutationOptions< HttpTypes.AdminOrderResponse, FetchError, HttpTypes.AdminCreateOrderFulfillment > ) => { return useMutation({ mutationFn: (payload: HttpTypes.AdminCreateOrderFulfillment) => sdk.admin.order.createFulfillment(orderId, payload), onSuccess: (data: any, variables: any, context: any) => { queryClient.invalidateQueries({ queryKey: ordersQueryKeys.all, }) queryClient.invalidateQueries({ queryKey: ordersQueryKeys.preview(orderId), }) options?.onSuccess?.(data, variables, context) }, ...options, }) } export const useCancelOrderFulfillment = ( orderId: string, fulfillmentId: string, options?: UseMutationOptions ) => { return useMutation({ mutationFn: (payload: { no_notification?: boolean }) => sdk.admin.order.cancelFulfillment(orderId, fulfillmentId, payload), onSuccess: (data: any, variables: any, context: any) => { queryClient.invalidateQueries({ queryKey: ordersQueryKeys.all, }) queryClient.invalidateQueries({ queryKey: ordersQueryKeys.preview(orderId), }) options?.onSuccess?.(data, variables, context) }, ...options, }) } export const useCreateOrderShipment = ( orderId: string, fulfillmentId: string, options?: UseMutationOptions< { order: HttpTypes.AdminOrder }, FetchError, HttpTypes.AdminCreateOrderShipment > ) => { return useMutation({ mutationFn: (payload: HttpTypes.AdminCreateOrderShipment) => sdk.admin.order.createShipment(orderId, fulfillmentId, payload), onSuccess: (data: any, variables: any, context: any) => { queryClient.invalidateQueries({ queryKey: ordersQueryKeys.all, }) queryClient.invalidateQueries({ queryKey: ordersQueryKeys.preview(orderId), }) options?.onSuccess?.(data, variables, context) }, ...options, }) } export const useMarkOrderFulfillmentAsDelivered = ( orderId: string, fulfillmentId: string, options?: UseMutationOptions< { order: HttpTypes.AdminOrder }, FetchError, HttpTypes.AdminMarkOrderFulfillmentAsDelivered > ) => { return useMutation({ mutationFn: (payload: HttpTypes.AdminMarkOrderFulfillmentAsDelivered) => sdk.admin.order.markAsDelivered(orderId, fulfillmentId, payload), onSuccess: (data: any, variables: any, context: any) => { queryClient.invalidateQueries({ queryKey: ordersQueryKeys.all, }) queryClient.invalidateQueries({ queryKey: ordersQueryKeys.preview(orderId), }) options?.onSuccess?.(data, variables, context) }, ...options, }) } export const useCancelOrder = ( orderId: string, options?: UseMutationOptions ) => { return useMutation({ mutationFn: (id) => sdk.admin.order.cancel(id), onSuccess: (data: any, variables: any, context: any) => { queryClient.invalidateQueries({ queryKey: ordersQueryKeys.details(), }) queryClient.invalidateQueries({ queryKey: ordersQueryKeys.preview(orderId), }) options?.onSuccess?.(data, variables, context) }, ...options, }) }