From b9762102f3772381433c15c29be23d7a731a3cba Mon Sep 17 00:00:00 2001 From: Alexander Saiannyi Date: Sat, 6 Apr 2024 22:25:16 +0200 Subject: [PATCH] feat(core): add customer addresses query --- .changeset/tender-flowers-smile.md | 5 ++ .../client/queries/get-customer-addresses.ts | 74 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 .changeset/tender-flowers-smile.md create mode 100644 apps/core/client/queries/get-customer-addresses.ts diff --git a/.changeset/tender-flowers-smile.md b/.changeset/tender-flowers-smile.md new file mode 100644 index 000000000..69a466c75 --- /dev/null +++ b/.changeset/tender-flowers-smile.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +Add customer addresses query diff --git a/apps/core/client/queries/get-customer-addresses.ts b/apps/core/client/queries/get-customer-addresses.ts new file mode 100644 index 000000000..79b6d1e3e --- /dev/null +++ b/apps/core/client/queries/get-customer-addresses.ts @@ -0,0 +1,74 @@ +import { removeEdgesAndNodes } from '@bigcommerce/catalyst-client'; +import { cache } from 'react'; + +import { getSessionCustomerId } from '~/auth'; + +import { client } from '..'; +import { graphql } from '../graphql'; +import { revalidate } from '../revalidate-target'; + +const GET_CUSTOMER_ADDRESSES_QUERY = graphql(` + query getCustomerAddresses($after: String, $before: String, $first: Int, $last: Int) { + customer { + entityId + addresses(before: $before, after: $after, first: $first, last: $last) { + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + collectionInfo { + totalItems + } + edges { + node { + entityId + firstName + lastName + address1 + address2 + city + stateOrProvince + countryCode + phone + postalCode + company + } + } + } + } + } +`); + +export interface CustomerAddressesArgs { + after?: string; + before?: string; + limit?: number; +} + +export const getCustomerAddresses = cache( + async ({ before = '', after = '', limit = 9 }: CustomerAddressesArgs) => { + const customerId = await getSessionCustomerId(); + const paginationArgs = before ? { last: limit, before } : { first: limit, after }; + + const response = await client.fetch({ + document: GET_CUSTOMER_ADDRESSES_QUERY, + variables: { ...paginationArgs }, + customerId, + fetchOptions: { next: { revalidate } }, + }); + + const addresses = response.data.customer?.addresses; + + if (!addresses) { + return undefined; + } + + return { + pageInfo: addresses.pageInfo, + addressesCount: addresses.collectionInfo?.totalItems ?? 0, + addresses: removeEdgesAndNodes({ edges: addresses.edges }), + }; + }, +);