mirror of
https://github.com/vercel/commerce.git
synced 2025-06-19 13:41:22 +00:00
Improve error handling
This commit is contained in:
parent
695caba290
commit
d4e8105ce0
@ -1,15 +1,21 @@
|
|||||||
import type { ServerResponse } from 'http'
|
import type { ServerResponse } from 'http'
|
||||||
import type { LoginMutation, LoginMutationVariables } from '../schema'
|
import type { LoginMutation, LoginMutationVariables } from '../schema'
|
||||||
import type { RecursivePartial } from '../api/utils/types'
|
|
||||||
import concatHeader from '../api/utils/concat-cookie'
|
import concatHeader from '../api/utils/concat-cookie'
|
||||||
import { VendureConfig, getConfig } from '../api'
|
import { getConfig, VendureConfig } from '../api'
|
||||||
|
import { CommerceError } from '@commerce/utils/errors'
|
||||||
|
import { ErrorResult } from '../schema'
|
||||||
|
|
||||||
export const loginMutation = /* GraphQL */ `
|
export const loginMutation = /* GraphQL */ `
|
||||||
mutation loginServer($email: String!, $password: String!) {
|
mutation loginServer($email: String!, $password: String!) {
|
||||||
login(username: $email, password: $password) {
|
login(username: $email, password: $password) {
|
||||||
|
__typename
|
||||||
... on CurrentUser {
|
... on CurrentUser {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
|
... on ErrorResult {
|
||||||
|
errorCode
|
||||||
|
message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
@ -44,10 +50,11 @@ async function login({
|
|||||||
}): Promise<LoginResult> {
|
}): Promise<LoginResult> {
|
||||||
config = getConfig(config)
|
config = getConfig(config)
|
||||||
|
|
||||||
const { data, res } = await config.fetch<RecursivePartial<LoginMutation>>(
|
const { data, res } = await config.fetch<LoginMutation>(query, { variables })
|
||||||
query,
|
|
||||||
{ variables }
|
if (data.login.__typename !== 'CurrentUser') {
|
||||||
)
|
throw new CommerceError({ message: (data.login as ErrorResult).message })
|
||||||
|
}
|
||||||
// Bigcommerce returns a Set-Cookie header with the auth cookie
|
// Bigcommerce returns a Set-Cookie header with the auth cookie
|
||||||
let cookie = res.headers.get('Set-Cookie')
|
let cookie = res.headers.get('Set-Cookie')
|
||||||
|
|
||||||
@ -68,7 +75,7 @@ async function login({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
result: data.login?.result,
|
result: data.login.id.toString(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,11 @@ import type { HookFetcher } from '@commerce/utils/types'
|
|||||||
import { CommerceError } from '@commerce/utils/errors'
|
import { CommerceError } from '@commerce/utils/errors'
|
||||||
import useCommerceLogin from '@commerce/use-login'
|
import useCommerceLogin from '@commerce/use-login'
|
||||||
import useCustomer from '../customer/use-customer'
|
import useCustomer from '../customer/use-customer'
|
||||||
import { LoginMutation, LoginMutationVariables } from '@framework/schema'
|
import {
|
||||||
|
ErrorResult,
|
||||||
|
LoginMutation,
|
||||||
|
LoginMutationVariables,
|
||||||
|
} from '@framework/schema'
|
||||||
|
|
||||||
export const loginMutation = /* GraphQL */ `
|
export const loginMutation = /* GraphQL */ `
|
||||||
mutation login($username: String!, $password: String!) {
|
mutation login($username: String!, $password: String!) {
|
||||||
@ -12,6 +16,10 @@ export const loginMutation = /* GraphQL */ `
|
|||||||
... on CurrentUser {
|
... on CurrentUser {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
|
... on ErrorResult {
|
||||||
|
errorCode
|
||||||
|
message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
@ -49,7 +57,9 @@ export function extendHook(customFetcher: typeof fetcher) {
|
|||||||
password: input.password,
|
password: input.password,
|
||||||
})
|
})
|
||||||
if (data.login.__typename !== 'CurrentUser') {
|
if (data.login.__typename !== 'CurrentUser') {
|
||||||
throw new CommerceError({ message: 'The credentials are not valid' })
|
throw new CommerceError({
|
||||||
|
message: (data.login as ErrorResult).message,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
await revalidate()
|
await revalidate()
|
||||||
return data
|
return data
|
||||||
|
@ -3,14 +3,23 @@ import type { HookFetcher } from '@commerce/utils/types'
|
|||||||
import { CommerceError } from '@commerce/utils/errors'
|
import { CommerceError } from '@commerce/utils/errors'
|
||||||
import useCommerceSignup from '@commerce/use-signup'
|
import useCommerceSignup from '@commerce/use-signup'
|
||||||
import useCustomer from '../customer/use-customer'
|
import useCustomer from '../customer/use-customer'
|
||||||
import { SignupMutation, SignupMutationVariables } from '@framework/schema'
|
import {
|
||||||
|
ErrorResult,
|
||||||
|
SignupMutation,
|
||||||
|
SignupMutationVariables,
|
||||||
|
} from '@framework/schema'
|
||||||
|
|
||||||
export const signupMutation = /* GraphQL */ `
|
export const signupMutation = /* GraphQL */ `
|
||||||
mutation signup($input: RegisterCustomerInput!) {
|
mutation signup($input: RegisterCustomerInput!) {
|
||||||
registerCustomerAccount(input: $input) {
|
registerCustomerAccount(input: $input) {
|
||||||
|
__typename
|
||||||
... on Success {
|
... on Success {
|
||||||
success
|
success
|
||||||
}
|
}
|
||||||
|
... on ErrorResult {
|
||||||
|
errorCode
|
||||||
|
message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
@ -52,7 +61,7 @@ export function extendHook(customFetcher: typeof fetcher) {
|
|||||||
|
|
||||||
return useCallback(
|
return useCallback(
|
||||||
async function signup(input: SignupInput) {
|
async function signup(input: SignupInput) {
|
||||||
const data = await fn({
|
const { registerCustomerAccount } = await fn({
|
||||||
input: {
|
input: {
|
||||||
firstName: input.firstName,
|
firstName: input.firstName,
|
||||||
lastName: input.lastName,
|
lastName: input.lastName,
|
||||||
@ -60,8 +69,13 @@ export function extendHook(customFetcher: typeof fetcher) {
|
|||||||
password: input.password,
|
password: input.password,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
if (registerCustomerAccount.__typename !== 'Success') {
|
||||||
|
throw new CommerceError({
|
||||||
|
message: (registerCustomerAccount as ErrorResult).message,
|
||||||
|
})
|
||||||
|
}
|
||||||
await revalidate()
|
await revalidate()
|
||||||
return data
|
return { registerCustomerAccount }
|
||||||
},
|
},
|
||||||
[fn]
|
[fn]
|
||||||
)
|
)
|
||||||
|
@ -8,12 +8,18 @@ import { cartFragment } from '../api/fragments/cart'
|
|||||||
import {
|
import {
|
||||||
AddItemToOrderMutation,
|
AddItemToOrderMutation,
|
||||||
AddItemToOrderMutationVariables,
|
AddItemToOrderMutationVariables,
|
||||||
|
ErrorResult,
|
||||||
} from '@framework/schema'
|
} from '@framework/schema'
|
||||||
|
|
||||||
export const addItemToOrderMutation = /* GraphQL */ `
|
export const addItemToOrderMutation = /* GraphQL */ `
|
||||||
mutation addItemToOrder($variantId: ID!, $quantity: Int!) {
|
mutation addItemToOrder($variantId: ID!, $quantity: Int!) {
|
||||||
addItemToOrder(productVariantId: $variantId, quantity: $quantity) {
|
addItemToOrder(productVariantId: $variantId, quantity: $quantity) {
|
||||||
|
__typename
|
||||||
...Cart
|
...Cart
|
||||||
|
... on ErrorResult {
|
||||||
|
errorCode
|
||||||
|
message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
${cartFragment}
|
${cartFragment}
|
||||||
@ -39,9 +45,6 @@ export const fetcher: HookFetcher<
|
|||||||
...options,
|
...options,
|
||||||
query: addItemToOrderMutation,
|
query: addItemToOrderMutation,
|
||||||
variables: { variantId, quantity: quantity || 1 },
|
variables: { variantId, quantity: quantity || 1 },
|
||||||
}).then((res) => {
|
|
||||||
console.log({ res })
|
|
||||||
return res
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,12 +55,18 @@ export function extendHook(customFetcher: typeof fetcher) {
|
|||||||
|
|
||||||
return useCallback(
|
return useCallback(
|
||||||
async function addItem(input: AddItemInput) {
|
async function addItem(input: AddItemInput) {
|
||||||
const data = await fn({
|
const { addItemToOrder } = await fn({
|
||||||
quantity: input.quantity || 1,
|
quantity: input.quantity || 1,
|
||||||
variantId: input.variantId,
|
variantId: input.variantId,
|
||||||
})
|
})
|
||||||
await mutate(data, false)
|
if (addItemToOrder.__typename === 'Order') {
|
||||||
return data
|
await mutate({ addItemToOrder }, false)
|
||||||
|
} else {
|
||||||
|
throw new CommerceError({
|
||||||
|
message: (addItemToOrder as ErrorResult).message,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return { addItemToOrder }
|
||||||
},
|
},
|
||||||
[fn, mutate]
|
[fn, mutate]
|
||||||
)
|
)
|
||||||
|
@ -30,7 +30,7 @@ export function extendHook(
|
|||||||
swrOptions?: SwrOptions<any | null>
|
swrOptions?: SwrOptions<any | null>
|
||||||
) {
|
) {
|
||||||
const useCart = () => {
|
const useCart = () => {
|
||||||
const response = useData<Cart>(
|
const response = useData<CartResult>(
|
||||||
{ query: getCartQuery },
|
{ query: getCartQuery },
|
||||||
[],
|
[],
|
||||||
customFetcher,
|
customFetcher,
|
||||||
|
@ -4,15 +4,21 @@ import useCartRemoveItem from '@commerce/cart/use-remove-item'
|
|||||||
import useCart from './use-cart'
|
import useCart from './use-cart'
|
||||||
import { cartFragment } from '@framework/api/fragments/cart'
|
import { cartFragment } from '@framework/api/fragments/cart'
|
||||||
import {
|
import {
|
||||||
|
ErrorResult,
|
||||||
RemoveOrderLineMutation,
|
RemoveOrderLineMutation,
|
||||||
RemoveOrderLineMutationVariables,
|
RemoveOrderLineMutationVariables,
|
||||||
} from '@framework/schema'
|
} from '@framework/schema'
|
||||||
|
import { CommerceError } from '@commerce/utils/errors'
|
||||||
|
|
||||||
export const removeOrderLineMutation = /* GraphQL */ `
|
export const removeOrderLineMutation = /* GraphQL */ `
|
||||||
mutation removeOrderLine($orderLineId: ID!) {
|
mutation removeOrderLine($orderLineId: ID!) {
|
||||||
removeOrderLine(orderLineId: $orderLineId) {
|
removeOrderLine(orderLineId: $orderLineId) {
|
||||||
__typename
|
__typename
|
||||||
...Cart
|
...Cart
|
||||||
|
... on ErrorResult {
|
||||||
|
errorCode
|
||||||
|
message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
${cartFragment}
|
${cartFragment}
|
||||||
@ -42,6 +48,10 @@ export function extendHook(customFetcher: typeof fetcher) {
|
|||||||
const { removeOrderLine } = await fn({ orderLineId: input.id })
|
const { removeOrderLine } = await fn({ orderLineId: input.id })
|
||||||
if (removeOrderLine.__typename === 'Order') {
|
if (removeOrderLine.__typename === 'Order') {
|
||||||
await mutate({ removeOrderLine }, false)
|
await mutate({ removeOrderLine }, false)
|
||||||
|
} else {
|
||||||
|
throw new CommerceError({
|
||||||
|
message: (removeOrderLine as ErrorResult).message,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return { removeOrderLine }
|
return { removeOrderLine }
|
||||||
},
|
},
|
||||||
|
@ -7,12 +7,19 @@ import { cartFragment } from '@framework/api/fragments/cart'
|
|||||||
import {
|
import {
|
||||||
AdjustOrderLineMutation,
|
AdjustOrderLineMutation,
|
||||||
AdjustOrderLineMutationVariables,
|
AdjustOrderLineMutationVariables,
|
||||||
|
ErrorResult,
|
||||||
} from '@framework/schema'
|
} from '@framework/schema'
|
||||||
|
import { CommerceError } from '@commerce/utils/errors'
|
||||||
|
|
||||||
export const adjustOrderLineMutation = /* GraphQL */ `
|
export const adjustOrderLineMutation = /* GraphQL */ `
|
||||||
mutation adjustOrderLine($orderLineId: ID!, $quantity: Int!) {
|
mutation adjustOrderLine($orderLineId: ID!, $quantity: Int!) {
|
||||||
adjustOrderLine(orderLineId: $orderLineId, quantity: $quantity) {
|
adjustOrderLine(orderLineId: $orderLineId, quantity: $quantity) {
|
||||||
|
__typename
|
||||||
...Cart
|
...Cart
|
||||||
|
... on ErrorResult {
|
||||||
|
errorCode
|
||||||
|
message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
${cartFragment}
|
${cartFragment}
|
||||||
@ -44,6 +51,10 @@ function extendHook(customFetcher: typeof fetcher, cfg?: { wait?: number }) {
|
|||||||
})
|
})
|
||||||
if (adjustOrderLine.__typename === 'Order') {
|
if (adjustOrderLine.__typename === 'Order') {
|
||||||
await mutate({ adjustOrderLine }, false)
|
await mutate({ adjustOrderLine }, false)
|
||||||
|
} else {
|
||||||
|
throw new CommerceError({
|
||||||
|
message: (adjustOrderLine as ErrorResult).message,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return { adjustOrderLine }
|
return { adjustOrderLine }
|
||||||
}, cfg?.wait ?? 500),
|
}, cfg?.wait ?? 500),
|
||||||
|
93
framework/vendure/schema.d.ts
vendored
93
framework/vendure/schema.d.ts
vendored
@ -2843,10 +2843,19 @@ export type LoginServerMutationVariables = Exact<{
|
|||||||
|
|
||||||
export type LoginServerMutation = { __typename?: 'Mutation' } & {
|
export type LoginServerMutation = { __typename?: 'Mutation' } & {
|
||||||
login:
|
login:
|
||||||
| ({ __typename?: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
|
| ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
|
||||||
| { __typename?: 'InvalidCredentialsError' }
|
| ({ __typename: 'InvalidCredentialsError' } & Pick<
|
||||||
| { __typename?: 'NotVerifiedError' }
|
InvalidCredentialsError,
|
||||||
| { __typename?: 'NativeAuthStrategyError' }
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NotVerifiedError' } & Pick<
|
||||||
|
NotVerifiedError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
|
||||||
|
NativeAuthStrategyError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type LoginMutationVariables = Exact<{
|
export type LoginMutationVariables = Exact<{
|
||||||
@ -2857,9 +2866,18 @@ export type LoginMutationVariables = Exact<{
|
|||||||
export type LoginMutation = { __typename?: 'Mutation' } & {
|
export type LoginMutation = { __typename?: 'Mutation' } & {
|
||||||
login:
|
login:
|
||||||
| ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
|
| ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
|
||||||
| { __typename: 'InvalidCredentialsError' }
|
| ({ __typename: 'InvalidCredentialsError' } & Pick<
|
||||||
| { __typename: 'NotVerifiedError' }
|
InvalidCredentialsError,
|
||||||
| { __typename: 'NativeAuthStrategyError' }
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NotVerifiedError' } & Pick<
|
||||||
|
NotVerifiedError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
|
||||||
|
NativeAuthStrategyError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type LogoutMutationVariables = Exact<{ [key: string]: never }>
|
export type LogoutMutationVariables = Exact<{ [key: string]: never }>
|
||||||
@ -2874,9 +2892,15 @@ export type SignupMutationVariables = Exact<{
|
|||||||
|
|
||||||
export type SignupMutation = { __typename?: 'Mutation' } & {
|
export type SignupMutation = { __typename?: 'Mutation' } & {
|
||||||
registerCustomerAccount:
|
registerCustomerAccount:
|
||||||
| ({ __typename?: 'Success' } & Pick<Success, 'success'>)
|
| ({ __typename: 'Success' } & Pick<Success, 'success'>)
|
||||||
| { __typename?: 'MissingPasswordError' }
|
| ({ __typename: 'MissingPasswordError' } & Pick<
|
||||||
| { __typename?: 'NativeAuthStrategyError' }
|
MissingPasswordError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
|
||||||
|
NativeAuthStrategyError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type AddItemToOrderMutationVariables = Exact<{
|
export type AddItemToOrderMutationVariables = Exact<{
|
||||||
@ -2886,11 +2910,23 @@ export type AddItemToOrderMutationVariables = Exact<{
|
|||||||
|
|
||||||
export type AddItemToOrderMutation = { __typename?: 'Mutation' } & {
|
export type AddItemToOrderMutation = { __typename?: 'Mutation' } & {
|
||||||
addItemToOrder:
|
addItemToOrder:
|
||||||
| ({ __typename?: 'Order' } & CartFragment)
|
| ({ __typename: 'Order' } & CartFragment)
|
||||||
| { __typename?: 'OrderModificationError' }
|
| ({ __typename: 'OrderModificationError' } & Pick<
|
||||||
| { __typename?: 'OrderLimitError' }
|
OrderModificationError,
|
||||||
| { __typename?: 'NegativeQuantityError' }
|
'errorCode' | 'message'
|
||||||
| { __typename?: 'InsufficientStockError' }
|
>)
|
||||||
|
| ({ __typename: 'OrderLimitError' } & Pick<
|
||||||
|
OrderLimitError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NegativeQuantityError' } & Pick<
|
||||||
|
NegativeQuantityError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'InsufficientStockError' } & Pick<
|
||||||
|
InsufficientStockError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }>
|
export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }>
|
||||||
@ -2906,7 +2942,10 @@ export type RemoveOrderLineMutationVariables = Exact<{
|
|||||||
export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & {
|
export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & {
|
||||||
removeOrderLine:
|
removeOrderLine:
|
||||||
| ({ __typename: 'Order' } & CartFragment)
|
| ({ __typename: 'Order' } & CartFragment)
|
||||||
| { __typename: 'OrderModificationError' }
|
| ({ __typename: 'OrderModificationError' } & Pick<
|
||||||
|
OrderModificationError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type AdjustOrderLineMutationVariables = Exact<{
|
export type AdjustOrderLineMutationVariables = Exact<{
|
||||||
@ -2916,11 +2955,23 @@ export type AdjustOrderLineMutationVariables = Exact<{
|
|||||||
|
|
||||||
export type AdjustOrderLineMutation = { __typename?: 'Mutation' } & {
|
export type AdjustOrderLineMutation = { __typename?: 'Mutation' } & {
|
||||||
adjustOrderLine:
|
adjustOrderLine:
|
||||||
| ({ __typename?: 'Order' } & CartFragment)
|
| ({ __typename: 'Order' } & CartFragment)
|
||||||
| { __typename?: 'OrderModificationError' }
|
| ({ __typename: 'OrderModificationError' } & Pick<
|
||||||
| { __typename?: 'OrderLimitError' }
|
OrderModificationError,
|
||||||
| { __typename?: 'NegativeQuantityError' }
|
'errorCode' | 'message'
|
||||||
| { __typename?: 'InsufficientStockError' }
|
>)
|
||||||
|
| ({ __typename: 'OrderLimitError' } & Pick<
|
||||||
|
OrderLimitError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'NegativeQuantityError' } & Pick<
|
||||||
|
NegativeQuantityError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
|
| ({ __typename: 'InsufficientStockError' } & Pick<
|
||||||
|
InsufficientStockError,
|
||||||
|
'errorCode' | 'message'
|
||||||
|
>)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }>
|
export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user