4
0
forked from crowetic/commerce

Added useLogin hook and API endpoint

This commit is contained in:
Luis Alvarez 2020-10-20 22:27:38 -05:00
parent e2b26715b9
commit a1e47a73d2
9 changed files with 132 additions and 6 deletions

View File

@ -57,6 +57,7 @@ const createCustomer: CustomersHandlers['createCustomer'] = async ({
console.log('DATA', result.data)
// TODO: Currently not working, fix this asap.
const loginData = await login({ variables: { email, password }, config })
console.log('LOGIN DATA', loginData)

View File

@ -0,0 +1,26 @@
import login from '../../operations/login'
import type { LoginHandlers } from '../login'
const loginHandler: LoginHandlers['login'] = async ({
res,
body: { email, password },
config,
}) => {
// TODO: Add proper validations with something like Ajv
if (!(email && password)) {
return res.status(400).json({
data: null,
errors: [{ message: 'Invalid request' }],
})
}
// TODO: validate the password and email
// Passwords must be at least 7 characters and contain both alphabetic
// and numeric characters.
// TODO: Currently not working, fix this asap.
const loginData = await login({ variables: { email, password }, config })
res.status(200).json({ data: null })
}
export default loginHandler

View File

@ -0,0 +1,45 @@
import createApiHandler, {
BigcommerceApiHandler,
BigcommerceHandler,
} from '../utils/create-api-handler'
import isAllowedMethod from '../utils/is-allowed-method'
import { BigcommerceApiError } from '../utils/errors'
import login from './handlers/login'
export type LoginBody = {
email: string
password: string
}
export type LoginHandlers = {
login: BigcommerceHandler<null, Partial<LoginBody>>
}
const METHODS = ['POST']
const loginApi: BigcommerceApiHandler<null, LoginHandlers> = async (
req,
res,
config,
handlers
) => {
if (!isAllowedMethod(req, res, METHODS)) return
try {
const body = req.body ?? {}
return await handlers['login']({ req, res, config, body })
} catch (error) {
console.error(error)
const message =
error instanceof BigcommerceApiError
? 'An unexpected error ocurred with the Bigcommerce API'
: 'An unexpected error ocurred'
res.status(500).json({ data: null, errors: [{ message }] })
}
}
const handlers = { login }
export default createApiHandler(loginApi, handlers, {})

View File

@ -3,7 +3,7 @@ import { BigcommerceConfig, getConfig } from '..'
export type BigcommerceApiHandler<
T = any,
H extends BigcommerceHandlers = {},
H extends BigcommerceHandlers<T> = {},
Options extends {} = {}
> = (
req: NextApiRequest,

View File

@ -0,0 +1,49 @@
import { useCallback } from 'react'
import { HookFetcher } from '@lib/commerce/utils/types'
import useCommerceLogin from '@lib/commerce/use-login'
import type { LoginBody } from './api/customers/login'
const defaultOpts = {
url: '/api/bigcommerce/customers/login',
method: 'POST',
}
export type LoginInput = LoginBody
export const fetcher: HookFetcher<null, LoginBody> = (
options,
{ email, password },
fetch
) => {
if (!(email && password)) {
throw new Error(
'A first name, last name, email and password are required to login'
)
}
return fetch({
url: options?.url ?? defaultOpts.url,
method: options?.method ?? defaultOpts.method,
body: { email, password },
})
}
export function extendHook(customFetcher: typeof fetcher) {
const useLogin = () => {
const fn = useCommerceLogin<null, LoginInput>(defaultOpts, customFetcher)
return useCallback(
async function login(input: LoginInput) {
const data = await fn(input)
return data
},
[fn]
)
}
useLogin.extend = extendHook
return useLogin
}
export default extendHook(fetcher)

View File

@ -10,7 +10,7 @@ const defaultOpts = {
export type SignupInput = CreateCustomerBody
export const fetcher: HookFetcher<undefined, CreateCustomerBody> = (
export const fetcher: HookFetcher<null, CreateCustomerBody> = (
options,
{ firstName, lastName, email, password },
fetch
@ -30,10 +30,7 @@ export const fetcher: HookFetcher<undefined, CreateCustomerBody> = (
export function extendHook(customFetcher: typeof fetcher) {
const useSignup = () => {
const fn = useCommerceSignup<undefined, SignupInput>(
defaultOpts,
customFetcher
)
const fn = useCommerceSignup<null, SignupInput>(defaultOpts, customFetcher)
return useCallback(
async function signup(input: SignupInput) {

View File

@ -0,0 +1,5 @@
import useAction from './utils/use-action'
const useLogin = useAction
export default useLogin

View File

@ -0,0 +1,3 @@
import loginApi from '@lib/bigcommerce/api/customers/login'
export default loginApi()