diff --git a/framework/bigcommerce/auth/use-signup.tsx b/framework/bigcommerce/auth/use-signup.tsx index c68ce7b7a..23b7ce9c6 100644 --- a/framework/bigcommerce/auth/use-signup.tsx +++ b/framework/bigcommerce/auth/use-signup.tsx @@ -1,54 +1,44 @@ import { useCallback } from 'react' -import type { HookFetcher } from '@commerce/utils/types' +import type { MutationHook } from '@commerce/utils/types' import { CommerceError } from '@commerce/utils/errors' -import useCommerceSignup from '@commerce/use-signup' +import useSignup, { UseSignup } from '@commerce/use-signup' import type { SignupBody } from '../api/customers/signup' import useCustomer from '../customer/use-customer' -const defaultOpts = { - url: '/api/bigcommerce/customers/signup', - method: 'POST', -} +export default useSignup as UseSignup -export type SignupInput = SignupBody +export const handler: MutationHook = { + fetchOptions: { + url: '/api/bigcommerce/customers/signup', + method: 'POST', + }, + async fetcher({ + input: { firstName, lastName, email, password }, + options, + fetch, + }) { + if (!(firstName && lastName && email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to signup', + }) + } -export const fetcher: HookFetcher = ( - options, - { firstName, lastName, email, password }, - fetch -) => { - if (!(firstName && lastName && email && password)) { - throw new CommerceError({ - message: - 'A first name, last name, email and password are required to signup', + return fetch({ + ...options, + body: { firstName, lastName, email, password }, }) - } - - return fetch({ - ...defaultOpts, - ...options, - body: { firstName, lastName, email, password }, - }) -} - -export function extendHook(customFetcher: typeof fetcher) { - const useSignup = () => { + }, + useHook: ({ fetch }) => () => { const { revalidate } = useCustomer() - const fn = useCommerceSignup(defaultOpts, customFetcher) return useCallback( - async function signup(input: SignupInput) { - const data = await fn(input) + async function signup(input) { + const data = await fetch({ input }) await revalidate() return data }, - [fn] + [fetch, revalidate] ) - } - - useSignup.extend = extendHook - - return useSignup + }, } - -export default extendHook(fetcher) diff --git a/framework/bigcommerce/provider.ts b/framework/bigcommerce/provider.ts index 40bdc2c06..196855438 100644 --- a/framework/bigcommerce/provider.ts +++ b/framework/bigcommerce/provider.ts @@ -11,6 +11,8 @@ import { handler as useCustomer } from './customer/use-customer' import { handler as useSearch } from './product/use-search' import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' import fetcher from './fetcher' @@ -26,7 +28,7 @@ export const bigcommerceProvider = { }, customer: { useCustomer }, products: { useSearch }, - auth: { useLogin }, + auth: { useLogin, useLogout, useSignup }, } export type BigcommerceProvider = typeof bigcommerceProvider diff --git a/framework/commerce/use-signup.tsx b/framework/commerce/use-signup.tsx index 08ddb22c0..be3c32000 100644 --- a/framework/commerce/use-signup.tsx +++ b/framework/commerce/use-signup.tsx @@ -1,5 +1,19 @@ -import useAction from './utils/use-action' +import { useHook, useMutationHook } from './utils/use-hook' +import { mutationFetcher } from './utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from './utils/types' +import type { Provider } from '.' -const useSignup = useAction +export type UseSignup< + H extends MutationHook = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.auth?.useSignup! + +const useSignup: UseSignup = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} export default useSignup