import React, { useState, useEffect, useCallback } from 'react'; import { Row, Col, Button, Divider } from 'antd'; import { NavLink } from 'react-router-dom'; import { PRODUCTS_LIST_PATH } from 'routes'; import { PageTitle, CartTable, CartFinalPriceTable, LoadingSpin, InfoModal, } from 'components'; import { storageService } from 'services'; import { useDispatch, useSelector } from 'react-redux'; import { fetchCartedProductListAsync, fetchCartedProductListEditAsync, fetchPaymentCartedProductListAsync, } from 'reducers/actions'; import { cartedProductSelector, paymentCartedProductSelector } from 'reducers'; import { ProductModel } from 'models'; /** * @description 장바구니 페이지 */ export const Cart = () => { const dispatch = useDispatch(); const { isLoading, items } = useSelector(cartedProductSelector); const { tableDataSource, recommend } = useSelector( paymentCartedProductSelector, ); useEffect(() => { if (storageService.getItem('cart-class101')) { dispatch( fetchCartedProductListAsync.request({ productIdList: JSON.parse( storageService.getItem('cart-class101') as string, ), }), ); dispatch(fetchPaymentCartedProductListAsync.request({ id: [] })); } }, [storageService.getItem]); const handleCartTableClick = useCallback(() => { storageService.removeItem('cart-class101'); dispatch(fetchCartedProductListAsync.request({})); }, [storageService.removeItem]); const handleCartTableChange = useCallback( (id: ProductModel['id'], quantity: number) => { dispatch(fetchCartedProductListEditAsync.request({ id, quantity })); }, [dispatch], ); const handleSelectChange = useCallback( (selectedRowKeys: any, selectedRows: any) => { // antd에서 타입을 any로 해놔서 일단, any로 받음. 나머지 로직에서 타입 체크를 차라리 제대로 하자. dispatch( fetchPaymentCartedProductListAsync.request({ id: selectedRowKeys as ProductModel['id'][], // 다른 곳에서라도 타입을 정확하게 판단하기 위해 강제 어썰션 ProductModelList: selectedRows as ProductModel[], }), ); }, [dispatch], ); const handlePaymentClick = useCallback(() => { InfoModal('error', '경고', '결제는 안되요~'); }, [InfoModal]); if (isLoading && !items) { return <LoadingSpin />; } return ( <> <Row> <Col span={24}> <PageTitle title="장바구니" /> </Col> </Row> <Row style={{ marginBottom: 50 }}> <CartTable dataSource={items} onClick={handleCartTableClick} onChange={handleCartTableChange} onSelectChange={handleSelectChange} /> </Row> <Row> <Divider orientation="left">최종 결제 금액</Divider> <CartFinalPriceTable dataSource={tableDataSource} recommend={recommend} /> <Divider /> </Row> <Row style={{ textAlign: 'right' }}> <NavLink to={PRODUCTS_LIST_PATH}> <Button size="large" style={{ marginRight: 8 }}> 뒤로 가기 </Button> </NavLink> <Button type="danger" size="large" style={{ marginRight: 6 }} disabled={!tableDataSource.totalPrice} onClick={handlePaymentClick} > 결제하기 </Button> </Row> </> ); };