import { buildClientRequestUrl } from '../../utils'; import { api } from './api'; import { address, misc } from '../urls'; import { Address, City, Country, District, Township } from '../../types'; interface GetResponse { count: number; next: null; previous: null; results: T[]; } const addressApi = api.injectEndpoints({ endpoints: (builder) => ({ getAddresses: builder.query, void>({ query: () => buildClientRequestUrl(address.getAddresses), providesTags: ['Addresses'] }), getCountries: builder.query, void>({ query: () => buildClientRequestUrl(address.countries) }), getCities: builder.query, string>({ query: (country) => buildClientRequestUrl(address.getCities(country)) }), getTownships: builder.query, string>({ query: (city) => buildClientRequestUrl(address.getTownships(city)) }), getDistricts: builder.query, string>({ query: (township) => buildClientRequestUrl(address.getDistricts(township)) }), getRetailStore: builder.query, void>({ query: () => buildClientRequestUrl(address.getRetailStore) }), getRetailStoreCities: builder.query, string>({ query: (country) => buildClientRequestUrl(address.getRetailStoreCities(country)) }), getRetailStoreTownships: builder.query, string>({ query: (city) => buildClientRequestUrl(address.getRetailStoreTownships(city)) }), addAddress: builder.mutation< Address, Partial
& { invalidateTag?: 'Addresses' | 'Checkout' } >({ query: (body) => ({ url: buildClientRequestUrl(address.base, { contentType: 'application/json' }), method: 'POST', body: { ...body, type: body.is_corporate === 'true' ? 'corporate' : 'personal' } }), invalidatesTags: (_, error, arg) => { if (error) return []; if (arg.invalidateTag) return [arg.invalidateTag]; return ['Addresses', 'Checkout']; } }), editAddress: builder.mutation< Address, Partial
& { invalidateTag?: 'Addresses' | 'Checkout' } >({ query: ({ pk, ...body }) => ({ url: buildClientRequestUrl(address.editAddress(pk), { contentType: 'application/json' }), method: 'PATCH', body: { ...body, user: body.user?.pk, type: body.is_corporate === 'true' ? 'corporate' : 'personal' } }), invalidatesTags: (_, error, arg) => { if (error) return []; if (arg.invalidateTag) return [arg.invalidateTag]; return ['Addresses', 'Checkout']; } }), removeAddress: builder.mutation< void, number | { id: number; invalidateTag: 'Addresses' | 'Checkout' } >({ query: (arg) => ({ url: buildClientRequestUrl( address.removeAddress(typeof arg === 'number' ? arg : arg.id) ), method: 'DELETE' }), invalidatesTags: (_, error, arg) => { if (error) return []; if (typeof arg === 'object' && arg.invalidateTag) return [arg.invalidateTag]; return ['Addresses', 'Checkout']; } }), setDefaultAddress: builder.mutation>({ query: ({ pk, primary }) => ({ url: buildClientRequestUrl(address.setDefaultAddress(pk), { contentType: 'application/json' }), method: 'PATCH', body: { primary } }), invalidatesTags: (_, error) => (error ? [] : ['Addresses']) }), getStores: builder.query, void>({ query: () => ({ url: buildClientRequestUrl(misc.stores) }) }) }), overrideExisting: true }); export const { useGetAddressesQuery, useGetCountriesQuery, useGetCitiesQuery, useGetTownshipsQuery, useGetDistrictsQuery, useGetRetailStoreQuery, useGetRetailStoreCitiesQuery, useGetRetailStoreTownshipsQuery, useAddAddressMutation, useEditAddressMutation, useRemoveAddressMutation, useSetDefaultAddressMutation, useGetStoresQuery } = addressApi;