@ -3,17 +3,30 @@ import Router from 'next/router'
import Link from 'next/link'
import axios from 'axios'
import Head from 'next/head'
import { DateTime } from 'luxon'
import useCart , { useSetCart } from '~/hooks/useCart'
import { FormController , Input, Button} from '~/components/form'
import { FormController , Button} from '~/components/form'
import Table from '~/components/table'
export default function Cart ( ) {
const cart = useCart ( )
const setCart = useSetCart ( )
const numItems = ( cart ? . items ) ? cart . items . length : 0
const allInStock = ! cart ? . items ? . some ( item => ! item . item . number _in _stock || item . item . number _in _stock < 1 )
const allHaveEnough = ! cart ? . items ? . some ( item => item . count > item . item . number _in _stock )
cart ? . items ? . forEach ( ( { item , count } ) => {
const stock = item . stock = { }
stock . is _preorder = item . preorder _availability _date && count > item . number _in _stock
stock . available = stock . is _preorder ? item . preorder _maximum - - Math . min ( 0 , item . number _in _stock ) : item . number _in _stock
stock . has _enough = count <= stock . available
} )
const allInStock = ! cart ? . items ? . some ( item => ! ( item . item . number _in _stock > 0 || item . item . preorder _availability _date ) )
const allHaveEnough = ! cart ? . items ? . some ( item => ! item . item . stock . has _enough )
const preorderItems = cart ? . items ? . filter ( ( { item , count } ) => count > item . number _in _stock && item . preorder _availability _date ) . map ( ( { item } ) => DateTime . fromISO ( item . preorder _availability _date ) ) || [ ]
preorderItems . sort ( ( b , a ) => a < b ? - 1 : a > b ? 1 : 0 )
const latestPreorder = preorderItems [ 0 ] ? . toLocaleString ( DateTime . DATE _FULL )
const handleRemove = id => async ev => {
if ( ev ) ev . preventDefault ( )
@ -42,8 +55,23 @@ export default function Cart(){
{ name : 'Item' , extractor : row => (
< >
< Link href = { ` /store/item/ ${ row . item . urlslug } ` } > < a > { row . item . name } < / a > < / L i n k >
{ ( ! row . item . number _in _stock || row . item . number _in _stock < 1 ) && < strong style = { { marginLeft : '6px' } } > Out of stock < / s t r o n g > }
{ ( row . item . number _in _stock > 0 && row . count > row . item . number _in _stock ) && < strong style = { { marginLeft : '6px' } } > Not enough in stock < / s t r o n g > }
{ ( ( ) => {
const { stock } = row . item ;
if ( stock . is _preorder && ! stock . has _enough )
return < strong style = { { marginLeft : '6px' } } > Not enough expected stock < / s t r o n g >
if ( stock . is _preorder && stock . has _enough )
return < strong style = { { marginLeft : '6px' } } > ( Pre - order : available { DateTime . fromISO ( row . item . preorder _availability _date ) . toLocaleString ( DateTime . DATE _SHORT ) } ) < / s t r o n g >
if ( ! row . item . number _in _stock || row . item . number _in _stock < 1 )
return < strong style = { { marginLeft : '6px' } } > Out of stock < / s t r o n g >
if ( ! stock . has _enough )
return < strong style = { { marginLeft : '6px' } } > Not enough in stock < / s t r o n g >
return null
} ) ( ) }
< / >
) } ,
{ name : 'Quantity in Cart' , extractor : row => row . count } ,
@ -92,6 +120,13 @@ export default function Cart(){
return < Button type = "submit" > Proceed to Checkout < / B u t t o n >
} ) ( ) }
{ latestPreorder && allHaveEnough && (
< p className = "warning" >
< strong > Note : < / s t r o n g >
Your cart contains one or more pre - order items . If you place an order with these items in your cart , it will not ship
until at least { latestPreorder }
< / p >
) }
< / F o r m C o n t r o l l e r >
< / >
)