4
0
forked from crowetic/commerce

Fetch the cart!

This commit is contained in:
Luis Alvarez 2020-10-04 21:20:52 -05:00
parent 8a7798d4d6
commit a3cf05fbd2
7 changed files with 35 additions and 12 deletions

View File

@ -11,7 +11,20 @@ export type Item = {
quantity?: number quantity?: number
} }
export type Cart = any // TODO: this type should match:
// https://developer.bigcommerce.com/api-reference/cart-checkout/server-server-cart-api/cart/getacart#responses
export type Cart = {
id: string
parent_id?: string
customer_id: number
email: string
currency: { code: string }
tax_included: boolean
base_amount: number
discount_amount: number
cart_amount: number
// TODO: add missing fields
}
const METHODS = ['GET', 'POST', 'PUT', 'DELETE'] const METHODS = ['GET', 'POST', 'PUT', 'DELETE']
@ -91,7 +104,6 @@ function getCartCookie(name: string, cartId?: string, maxAge?: number) {
? { ? {
maxAge, maxAge,
expires: new Date(Date.now() + maxAge * 1000), expires: new Date(Date.now() + maxAge * 1000),
httpOnly: true,
secure: process.env.NODE_ENV === 'production', secure: process.env.NODE_ENV === 'production',
path: '/', path: '/',
sameSite: 'lax', sameSite: 'lax',

View File

@ -1,10 +1,11 @@
import { FC } from 'react' import type { FC } from 'react'
import { import {
CartProvider as CommerceCartProvider, CartProvider as CommerceCartProvider,
useCart as useCommerceCart, useCart as useCommerceCart,
} from 'lib/commerce/cart' } from '@lib/commerce/cart'
import type { Cart } from '../api/cart'
export type Cart = {} export type { Cart }
export const CartProvider: FC = ({ children }) => { export const CartProvider: FC = ({ children }) => {
return ( return (

View File

@ -23,6 +23,7 @@ async function getError(res: Response) {
export const bigcommerceConfig: CommerceConfig = { export const bigcommerceConfig: CommerceConfig = {
locale: 'en-us', locale: 'en-us',
cartCookie: 'bc_cartId',
async fetcher({ url, method = 'GET', variables, body: bodyObj }) { async fetcher({ url, method = 'GET', variables, body: bodyObj }) {
const hasBody = Boolean(variables || bodyObj) const hasBody = Boolean(variables || bodyObj)
const body = hasBody const body = hasBody

View File

@ -1,5 +1,6 @@
import { createContext, useContext, FC } from 'react' import { createContext, useContext, FC } from 'react'
import useSWR, { responseInterface } from 'swr' import useSWR, { responseInterface } from 'swr'
import Cookies from 'js-cookie'
import { useCommerce } from '..' import { useCommerce } from '..'
export type CartResponse<C> = responseInterface<C, Error> & { export type CartResponse<C> = responseInterface<C, Error> & {
@ -12,15 +13,10 @@ export type CartProviderProps =
const CartContext = createContext<CartResponse<any> | null>(null) const CartContext = createContext<CartResponse<any> | null>(null)
function getCartCookie() {
// TODO: Figure how the cart should be persisted
return null
}
const CartProvider: FC<CartProviderProps> = ({ children, query, url }) => { const CartProvider: FC<CartProviderProps> = ({ children, query, url }) => {
const { fetcher: fetch } = useCommerce() const { fetcher: fetch, cartCookie } = useCommerce()
const fetcher = (url?: string, query?: string) => fetch({ url, query }) const fetcher = (url?: string, query?: string) => fetch({ url, query })
const cartId = getCartCookie() const cartId = Cookies.get(cartCookie)
const response = useSWR(() => (cartId ? [url, query] : null), fetcher) const response = useSWR(() => (cartId ? [url, query] : null), fetcher)
return ( return (

View File

@ -17,6 +17,7 @@ export type CommerceProps = {
export type CommerceConfig = { export type CommerceConfig = {
fetcher: Fetcher<any> fetcher: Fetcher<any>
locale: string locale: string
cartCookie: string
} }
export type Fetcher<T> = (options: FetcherOptions) => T | Promise<T> export type Fetcher<T> = (options: FetcherOptions) => T | Promise<T>

View File

@ -22,6 +22,7 @@
"@types/classnames": "^2.2.10", "@types/classnames": "^2.2.10",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"cookie": "^0.4.1", "cookie": "^0.4.1",
"js-cookie": "^2.2.1",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"next": "^9.5.4-canary.23", "next": "^9.5.4-canary.23",
"postcss-nested": "^5.0.1", "postcss-nested": "^5.0.1",
@ -36,6 +37,7 @@
"@graphql-codegen/typescript": "^1.17.10", "@graphql-codegen/typescript": "^1.17.10",
"@graphql-codegen/typescript-operations": "^1.17.8", "@graphql-codegen/typescript-operations": "^1.17.8",
"@types/cookie": "^0.4.0", "@types/cookie": "^0.4.0",
"@types/js-cookie": "^2.2.6",
"@types/node": "^14.11.2", "@types/node": "^14.11.2",
"@types/react": "^16.9.49", "@types/react": "^16.9.49",
"graphql": "^15.3.0", "graphql": "^15.3.0",

View File

@ -1540,6 +1540,11 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/js-cookie@^2.2.6":
version "2.2.6"
resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f"
integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw==
"@types/js-yaml@^3.12.5": "@types/js-yaml@^3.12.5":
version "3.12.5" version "3.12.5"
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb"
@ -4398,6 +4403,11 @@ jest-worker@^26.3.0:
merge-stream "^2.0.0" merge-stream "^2.0.0"
supports-color "^7.0.0" supports-color "^7.0.0"
js-cookie@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"