import { RootState } from './index'; import { ProductModel } from 'models'; import { RecommendCoupon, PriceVales } from 'components'; /** * @description 장바구니 페이지에서 사용하는 셀럭터 */ export const cartedProductSelector = (state: RootState) => { const carted: ProductModel[] = []; state.cartedProductReducer.items ? Object.values(state.cartedProductReducer.items).map(product => { const newCarted = Object.assign( product, { quantity: { id: product.id, quantity: product.quantity?.quantity || 1, }, }, { key: product.id }, // NOTE: Table에서 key라는 속성명으로만 요구해서 추가 { displayPrice: product.price * (product.quantity?.quantity ?? 1) }, ); carted.push(newCarted); }) : null; return { ...state.cartedProductReducer, items: state.cartedProductReducer.items ? [...carted] : [], }; }; /** * @description 장바구니 페이지에서 "최종 결제 금액" 부분에서 사용될 셀렉터 */ export const paymentCartedProductSelector = (state: RootState) => { const recommend: RecommendCoupon = { recommend: 'unApplied', }; const priceVales: PriceVales = { totalPrice: 0, rateDiscountPrice: 0, amountDiscountPrice: 0, }; const discountRate = state.couponReducer.data?.rate.discountRate; const discountAmount = state.couponReducer.data?.amount.discountAmount; state.paymentCartedProductReducer.items && discountRate && discountAmount ? Object.values(state.paymentCartedProductReducer.items).map(product => { // 수량 정의 const quantity = product.quantity?.quantity ? product.quantity.quantity : 1; // 전체 금액 priceVales.totalPrice += product.price * quantity; // 쿠폰 금액 계산 if (product.availableCoupon !== false) { priceVales.rateDiscountPrice += Math.floor( (product.price * quantity * discountRate) / 100, ); priceVales.amountDiscountPrice = discountAmount; } }) : null; if (priceVales.rateDiscountPrice > priceVales.amountDiscountPrice) { recommend.recommend = 'rate'; } if ( priceVales.rateDiscountPrice !== 0 && priceVales.rateDiscountPrice <= priceVales.amountDiscountPrice // 두 값이 같은 경우 'amount'로 처리한다 ) { recommend.recommend = 'amount'; } return { tableDataSource: priceVales, recommend }; }; /** * @description 쿠폰 데이터 반환 셀렉터 */ export const couponTypeSelector = (state: RootState) => { return state.couponReducer.data ? Object.assign({}, state.couponReducer.data) : null; };