Skip to content

Commit

Permalink
feat(purchase carts): remove started cart (#39)
Browse files Browse the repository at this point in the history
  • Loading branch information
mapra99 committed Dec 23, 2022
1 parent 8db9326 commit 9ddcbbf
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 7 deletions.
8 changes: 6 additions & 2 deletions app/components/purchase-cart-list/purchase-cart-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import formatCurrency from '~/utils/format-currency'

import type { PurchaseCartListProps } from './types'

const PurchaseCartList = ({ cart, onClose }: PurchaseCartListProps) => {
const PurchaseCartList = ({ cart, onClose, onCartRemoval }: PurchaseCartListProps) => {
const { items, total_price } = cart

return (
Expand All @@ -18,7 +18,11 @@ const PurchaseCartList = ({ cart, onClose }: PurchaseCartListProps) => {
Cart ({items.length})
</Text>

<button className="text-base text-black opacity-50 underline">
<button
className="text-base text-black opacity-50 underline"
type="button"
onClick={onCartRemoval}
>
Remove all
</button>
</div>
Expand Down
1 change: 1 addition & 0 deletions app/components/purchase-cart-list/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ import type { PurchaseCart } from '~/models/purchase-cart'
export interface PurchaseCartListProps {
cart: PurchaseCart
onClose: () => void
onCartRemoval: () => void
}
3 changes: 2 additions & 1 deletion app/components/purchase-cart-modal/purchase-cart-modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { PurchaseCartList, EmptyPurchaseCartList } from '~/components'

import type { PurchaseCartModalProps } from "./types"

const PurchaseCartModal = ({ cart, onClose }: PurchaseCartModalProps) => {
const PurchaseCartModal = ({ cart, onClose, onCartRemoval }: PurchaseCartModalProps) => {
return (
<div className="z-50 fixed top-0 left-0 right-0 bottom-0">
<div className="relative h-full w-full p-6 sm:px-10">
Expand All @@ -12,6 +12,7 @@ const PurchaseCartModal = ({ cart, onClose }: PurchaseCartModalProps) => {
<PurchaseCartList
cart={cart}
onClose={onClose}
onCartRemoval={onCartRemoval}
/>
) : (
<EmptyPurchaseCartList onClose={onClose} />
Expand Down
1 change: 1 addition & 0 deletions app/components/purchase-cart-modal/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ import type { PurchaseCart } from '~/models/purchase-cart'
export interface PurchaseCartModalProps {
cart: PurchaseCart | undefined
onClose: () => void
onCartRemoval: () => void
}
3 changes: 2 additions & 1 deletion app/components/purchase-cart/purchase-cart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { PurchaseCartContext } from '~/contexts/purchase-cart-context'
import type { PurchaseCartProps } from "./types"

const PurchaseCart = (_args: PurchaseCartProps) => {
const { cart, cartListOpen, openCartList, closeCartList } = useContext(PurchaseCartContext)
const { cart, cartListOpen, openCartList, closeCartList, removeCart } = useContext(PurchaseCartContext)

return (
<div className="relative">
Expand All @@ -18,6 +18,7 @@ const PurchaseCart = (_args: PurchaseCartProps) => {
<PurchaseCartModal
cart={cart}
onClose={closeCartList}
onCartRemoval={removeCart}
/>
)}
</div>
Expand Down
14 changes: 12 additions & 2 deletions app/contexts/purchase-cart-context/purchase-cart-context.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useState, createContext } from 'react';
import invariant from 'tiny-invariant'
import { PurchaseCartSchema } from '~/models/purchase-cart'

import type { PurchaseCart } from '~/models/purchase-cart'
Expand All @@ -9,7 +10,8 @@ export const PurchaseCartContext = createContext<IPurchaseCartContext>({
cartListOpen: false,
openCartList: () => {},
closeCartList: () => {},
createOrUpdateCart: (_item: PurchaseCartItemPayload) => {}
createOrUpdateCart: (_item: PurchaseCartItemPayload) => {},
removeCart: () => {},
})

export const PurchaseCartProvider = ({ children, activeCart }: PurchaseCartProviderProps) => {
Expand Down Expand Up @@ -42,12 +44,20 @@ export const PurchaseCartProvider = ({ children, activeCart }: PurchaseCartProvi
setCart(PurchaseCartSchema.parse(data.cart))
}

const removeCart = async () => {
invariant(cart, "cart must exist")

const response = await fetch(`/api/purchase-carts/${cart.uuid}`, { method: 'delete' })
if (response.ok) setCart(undefined)
}

const contextVal: IPurchaseCartContext = {
cart,
cartListOpen,
openCartList,
closeCartList,
createOrUpdateCart
createOrUpdateCart,
removeCart
};

return (
Expand Down
1 change: 1 addition & 0 deletions app/contexts/purchase-cart-context/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export interface IPurchaseCartContext {
openCartList: () => void
closeCartList: () => void,
createOrUpdateCart: (item: PurchaseCartItemPayload) => void
removeCart: () => void
}

export interface PurchaseCartProviderProps {
Expand Down
4 changes: 4 additions & 0 deletions app/models/purchase-cart/purchase-cart.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,7 @@ export const createOrUpdateCart = async(sessionId: string, cartItem: PurchaseCar
return createdCart
}
}

export const removeCart = async (sessionId: string, cartUuid: string) => {
await AudiophileClient.sendRequest('delete', `purchase_carts/${cartUuid}`, { sessionToken: sessionId })
}
18 changes: 18 additions & 0 deletions app/routes/api/purchase-carts/$cartUuid.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import invariant from 'tiny-invariant'
import { removeCart } from '~/models/purchase-cart'
import * as SessionStorage from '~/utils/session-storage'

import type { ActionArgs } from '@remix-run/node'

export const action = async ({ params, request }: ActionArgs) => {
if (request.method !== 'DELETE') return

const { sessionId } = await SessionStorage.getOrCreateSessionId(request)
invariant(sessionId, 'there must be an active user session')

const { cartUuid } = params
invariant(cartUuid, 'cartUuid must exist')

await removeCart(sessionId, cartUuid)
return new Response('ok', { status: 200 })
}
4 changes: 3 additions & 1 deletion app/utils/audiophile-client/audiophile-client.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ export const sendRequest = async (method: RequestMethod, path: string, { authTok
const url = buildUrl(path, apiVersion)

const response = await fetch(url, request)
const result = await response.json();

let result
if(response.status !== 204) result = await response.json();

if (!response.ok) throw new RequestError(response.status, result?.error);

Expand Down

0 comments on commit 9ddcbbf

Please sign in to comment.