Skip to content

Commit 9bb074d

Browse files
committed
feat(storefront-data): add useCreateCustomer hook and fix Rules of Hooks
- Add createCustomer service method and useCreateCustomer hook to auth module - Fix usePrefetchPages calling resolveRegion inside useEffect
1 parent 0ac1008 commit 9bb074d

4 files changed

Lines changed: 47 additions & 7 deletions

File tree

libs/storefront-data/src/auth/hooks.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,15 @@ export type CreateAuthHooksConfig<
2020
TLoginInput,
2121
TRegisterInput,
2222
TUpdateInput,
23+
TCreateCustomerInput = unknown,
2324
> = {
24-
service: AuthService<TCustomer, TLoginInput, TRegisterInput, TUpdateInput>
25+
service: AuthService<
26+
TCustomer,
27+
TLoginInput,
28+
TRegisterInput,
29+
TUpdateInput,
30+
TCreateCustomerInput
31+
>
2532
queryKeys?: AuthQueryKeys
2633
queryKeyNamespace?: QueryNamespace
2734
cacheConfig?: CacheConfig
@@ -37,12 +44,19 @@ export function createAuthHooks<
3744
TLoginInput,
3845
TRegisterInput,
3946
TUpdateInput,
47+
TCreateCustomerInput = unknown,
4048
>({
4149
service,
4250
queryKeys,
4351
queryKeyNamespace = "storefront-data",
4452
cacheConfig,
45-
}: CreateAuthHooksConfig<TCustomer, TLoginInput, TRegisterInput, TUpdateInput>) {
53+
}: CreateAuthHooksConfig<
54+
TCustomer,
55+
TLoginInput,
56+
TRegisterInput,
57+
TUpdateInput,
58+
TCreateCustomerInput
59+
>) {
4660
const resolvedCacheConfig = cacheConfig ?? createCacheConfig()
4761
const resolvedQueryKeys =
4862
queryKeys ?? createAuthQueryKeys(queryKeyNamespace)
@@ -116,6 +130,29 @@ export function createAuthHooks<
116130
})
117131
}
118132

133+
function useCreateCustomer(
134+
options?: AuthMutationOptions<TCustomer, TCreateCustomerInput>
135+
) {
136+
const queryClient = useQueryClient()
137+
return useMutation({
138+
mutationFn: (input: TCreateCustomerInput) => {
139+
if (!service.createCustomer) {
140+
throw new Error("createCustomer service is not configured")
141+
}
142+
return service.createCustomer(input)
143+
},
144+
onSuccess: (data, variables) => {
145+
queryClient.invalidateQueries({
146+
queryKey: resolvedQueryKeys.customer(),
147+
})
148+
options?.onSuccess?.(data, variables)
149+
},
150+
onError: (error) => {
151+
options?.onError?.(error)
152+
},
153+
})
154+
}
155+
119156
function useLogout(options?: AuthMutationOptions<void, void>) {
120157
const queryClient = useQueryClient()
121158
return useMutation({
@@ -183,6 +220,7 @@ export function createAuthHooks<
183220
useSuspenseAuth,
184221
useLogin,
185222
useRegister,
223+
useCreateCustomer,
186224
useLogout,
187225
useUpdateCustomer,
188226
useRefreshAuth,

libs/storefront-data/src/auth/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ export type AuthService<
1111
TLoginInput,
1212
TRegisterInput,
1313
TUpdateInput,
14+
TCreateCustomerInput = unknown,
1415
> = {
1516
getCustomer: (signal?: AbortSignal) => Promise<TCustomer | null>
1617
login: (input: TLoginInput) => Promise<unknown>
1718
logout: () => Promise<void>
1819
register: (input: TRegisterInput) => Promise<unknown>
20+
createCustomer?: (input: TCreateCustomerInput) => Promise<TCustomer>
1921
updateCustomer?: (input: TUpdateInput) => Promise<TCustomer>
2022
refresh?: () => Promise<unknown>
2123
}

libs/storefront-data/src/products/hooks.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,15 +461,15 @@ export function createProductHooks<
461461

462462
function usePrefetchPages(params: UsePrefetchPagesParams<TListInput>) {
463463
const queryClient = useQueryClient()
464+
// Call resolveRegion outside useEffect to follow Rules of Hooks
465+
const region = resolveRegion ? resolveRegion() : null
466+
const resolvedBaseInput = applyRegion(params.baseInput, region ?? undefined)
464467

465468
useEffect(() => {
466469
if (params.enabled === false || params.shouldPrefetch === false) {
467470
return
468471
}
469472

470-
const region = resolveRegion ? resolveRegion() : null
471-
const resolvedBaseInput = applyRegion(params.baseInput, region ?? undefined)
472-
473473
if (requireRegion && !resolvedBaseInput.region_id) {
474474
return
475475
}
@@ -577,7 +577,7 @@ export function createProductHooks<
577577
}, [
578578
params.enabled,
579579
params.shouldPrefetch,
580-
params.baseInput,
580+
resolvedBaseInput,
581581
params.currentPage,
582582
params.hasNextPage,
583583
params.hasPrevPage,

libs/storefront-data/tsconfig.build.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)