From dc3a981dc0b1ddc86444bcd83294555083e640f3 Mon Sep 17 00:00:00 2001 From: Adam Clason Date: Sun, 22 Jan 2023 13:18:43 -0600 Subject: [PATCH] Add use-customer orderload implementation --- .../src/api/endpoints/customer/customer.ts | 34 +++++++++++++++++++ .../src/api/endpoints/customer/index.ts | 18 ++++++++++ .../ordercloud/src/api/endpoints/index.ts | 6 ++-- packages/ordercloud/src/auth/use-signup.tsx | 4 +-- .../ordercloud/src/customer/use-customer.tsx | 31 ++++++++++++----- 5 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 packages/ordercloud/src/api/endpoints/customer/customer.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/index.ts diff --git a/packages/ordercloud/src/api/endpoints/customer/customer.ts b/packages/ordercloud/src/api/endpoints/customer/customer.ts new file mode 100644 index 000000000..06985039e --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/customer.ts @@ -0,0 +1,34 @@ +import type { CustomerEndpoint } from '.' +import { CommerceAPIError } from '@vercel/commerce/api/utils/errors' + +const getLoggedInCustomer: CustomerEndpoint['handlers']['getLoggedInCustomer'] = + async ({ req, config: { restBuyerFetch, tokenCookie } }) => { + const token = req.cookies.get(tokenCookie)?.value + + if (token) { + const customer = await restBuyerFetch('GET', '/me', undefined, { + token, + }) + + if (!customer) { + throw new CommerceAPIError('Customer not found', { + status: 404, + }) + } + + return { + data: { + customer: { + id: customer.ID, + firstName: customer.FirstName, + lastName: customer.LastName, + email: customer.Email, + }, + }, + } + } + + return { data: null } + } + +export default getLoggedInCustomer diff --git a/packages/ordercloud/src/api/endpoints/customer/index.ts b/packages/ordercloud/src/api/endpoints/customer/index.ts new file mode 100644 index 000000000..1e5e6676f --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import customerEndpoint from '@vercel/commerce/api/endpoints/customer' +import type { CustomerSchema } from '@vercel/commerce/types/customer' +import type { OrdercloudAPI } from '../..' +import getLoggedInCustomer from './customer' + +export type CustomerAPI = GetAPISchema + +export type CustomerEndpoint = CustomerAPI['endpoint'] + +export const handlers: CustomerEndpoint['handlers'] = { getLoggedInCustomer } + +const customerApi = createEndpoint({ + handler: customerEndpoint, + handlers, +}) + +export default customerApi diff --git a/packages/ordercloud/src/api/endpoints/index.ts b/packages/ordercloud/src/api/endpoints/index.ts index 9b200a41b..0f7f79117 100644 --- a/packages/ordercloud/src/api/endpoints/index.ts +++ b/packages/ordercloud/src/api/endpoints/index.ts @@ -5,17 +5,19 @@ import createEndpoints from '@vercel/commerce/api/endpoints' import cart from './cart' import checkout from './checkout' import products from './catalog/products' +import customer from './customer' import customerCard from './customer/card' import customerAddress from './customer/address' -import signup from './signup'; +import signup from './signup' const endpoints = { cart, checkout, + customer: customer, 'customer/card': customerCard, 'customer/address': customerAddress, 'catalog/products': products, - 'signup': signup + signup: signup, } export default function ordercloudAPI(commerce: OrdercloudAPI) { diff --git a/packages/ordercloud/src/auth/use-signup.tsx b/packages/ordercloud/src/auth/use-signup.tsx index 3d6957927..39a69ed8d 100644 --- a/packages/ordercloud/src/auth/use-signup.tsx +++ b/packages/ordercloud/src/auth/use-signup.tsx @@ -32,7 +32,7 @@ export const handler: MutationHook = { useHook: ({ fetch }) => () => { - //const { mutate } = useCustomer() TODO add mutate back in once useCustomer is implemented + const { mutate } = useCustomer() return useCallback( async function signup(input) { @@ -40,7 +40,7 @@ export const handler: MutationHook = { // await mutate() return data }, - [fetch] //mutate] + [fetch, mutate] ) }, } diff --git a/packages/ordercloud/src/customer/use-customer.tsx b/packages/ordercloud/src/customer/use-customer.tsx index 6eaede14f..182aee2cc 100644 --- a/packages/ordercloud/src/customer/use-customer.tsx +++ b/packages/ordercloud/src/customer/use-customer.tsx @@ -1,15 +1,28 @@ -import { SWRHook } from '@vercel/commerce/utils/types' -import useCustomer, { UseCustomer } from '@vercel/commerce/customer/use-customer' +import type { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { + type UseCustomer, +} from '@vercel/commerce/customer/use-customer' +import type { CustomerHook } from '@vercel/commerce/types/customer' export default useCustomer as UseCustomer -export const handler: SWRHook = { + +export const handler: SWRHook = { fetchOptions: { - query: '', + url: '/api/commerce/customer', + method: 'GET', }, - async fetcher({ input, options, fetch }) {}, - useHook: () => () => { - return async function addItem() { - return {} - } + async fetcher({ options, fetch }) { + const data = await fetch(options) + return data?.customer ?? null }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, }