import { CheckoutContext, PreOrder } from '@akinon/next/types'; import { api } from '@akinon/next/data/client/api'; import { buildClientRequestUrl } from '@akinon/next/utils'; import { setPaymentStepBusy } from '@akinon/next/redux/reducers/checkout'; import { SavedCard } from './reducer'; interface CheckoutResponse { pre_order?: PreOrder; errors: { non_field_errors: string; }; context_list?: CheckoutContext[]; template_name?: string; redirect_url?: string; } interface GetResponse { count: number; next: null; previous: null; results: T[]; } type DefaultSetSavedCardRequest = { card: SavedCard; }; type IyzicoSetSavedCardRequest = { card: string; }; type SetSavedCardRequest = | DefaultSetSavedCardRequest | IyzicoSetSavedCardRequest; type DeleteSavedCardRequest = number; type SetInstallmentRequest = { installment: string; }; type DefaultCompleteSavedCardRequest = { agreement: boolean; }; type IyzicoCompleteSavedCardRequest = | { agreement: boolean; register_consumer_card: boolean; consumer_token: string; card_token: string; } | { agreement: boolean; card_holder: string; card_number: string; card_cvv: string; card_month: string; card_year: string; register_consumer_card: boolean; }; type CompleteSavedCardRequest = | DefaultCompleteSavedCardRequest | IyzicoCompleteSavedCardRequest; export const savedCardApi = api.injectEndpoints({ endpoints: (build) => ({ getSavedCards: build.query, void>({ query: () => ({ url: buildClientRequestUrl('/users/saved-cards/') }), async onQueryStarted(arg, { dispatch, queryFulfilled }) { dispatch(setPaymentStepBusy(true)); await queryFulfilled; dispatch(setPaymentStepBusy(false)); } }), deleteSavedCard: build.mutation< GetResponse, DeleteSavedCardRequest >({ query: (cardId) => ({ url: buildClientRequestUrl(`/users/saved-cards/${cardId}`), method: 'DELETE' }), async onQueryStarted(arg, { dispatch, queryFulfilled }) { dispatch(setPaymentStepBusy(true)); await queryFulfilled; dispatch(setPaymentStepBusy(false)); } }), setSavedCard: build.mutation({ query: ({ card }) => ({ url: buildClientRequestUrl( `/orders/checkout?page=SavedCardSelectionPage`, { useFormData: true } ), method: 'POST', body: { card: typeof card === 'string' ? card : card.token } }), async onQueryStarted({ card }, { dispatch, queryFulfilled }) { dispatch(setPaymentStepBusy(true)); await queryFulfilled; dispatch(setPaymentStepBusy(false)); } }), setSavedCardInstallmentOption: build.mutation< CheckoutResponse, SetInstallmentRequest >({ query: ({ installment }) => ({ url: buildClientRequestUrl( `/orders/checkout?page=SavedCardInstallmentSelectionPage`, { useFormData: true } ), method: 'POST', body: { installment } }), async onQueryStarted(arg, { dispatch, queryFulfilled }) { dispatch(setPaymentStepBusy(true)); await queryFulfilled; dispatch(setPaymentStepBusy(false)); } }), completeSavedCard: build.mutation< CheckoutResponse, CompleteSavedCardRequest >({ query: (body) => ({ url: buildClientRequestUrl( `/orders/checkout?page=CompleteSavedCardRequest`, { useFormData: true } ), method: 'POST', body }), async onQueryStarted(arg, { dispatch, queryFulfilled }) { dispatch(setPaymentStepBusy(true)); await queryFulfilled; dispatch(setPaymentStepBusy(false)); } }) }) }); export const { useGetSavedCardsQuery, useSetSavedCardMutation, useSetSavedCardInstallmentOptionMutation, useCompleteSavedCardMutation, useDeleteSavedCardMutation } = savedCardApi;