[장바구니 관련 추가]#1
- 작업 진행중 - api로 데이터 보내도록 처리중.
This commit is contained in:
@@ -76,11 +76,16 @@ export const types = {
|
||||
GET_MY_INFO_SHIPPING_SEARCH: 'GET_MY_INFO_SHIPPING_SEARCH',
|
||||
|
||||
// cart actions
|
||||
GET_MY_INFO_CART_SEARCH: 'GET_MY_INFO_CART_SEARCH',
|
||||
ADD_TO_CART: 'ADD_TO_CART',
|
||||
REMOVE_FROM_CART: 'REMOVE_FROM_CART',
|
||||
UPDATE_CART_ITEM: 'UPDATE_CART_ITEM',
|
||||
CLEAR_CART: 'CLEAR_CART',
|
||||
//cart api action
|
||||
GET_MY_INFO_CART_SEARCH: 'GET_MY_INFO_CART_SEARCH',
|
||||
INSERT_MY_INFO_CART : "INSERT_MY_INFO_CART",
|
||||
DELETE_MY_INFO_CART : "DELETE_MY_INFO_CART",
|
||||
DELETE_ALL_MY_INFO_CART : "DELETE_ALL_MY_INFO_CART",
|
||||
UPDATE_MY_INFO_CART : "UPDATE_MY_INFO_CART",
|
||||
|
||||
// appData actions
|
||||
ADD_MAIN_INDEX: 'ADD_MAIN_INDEX',
|
||||
|
||||
@@ -50,6 +50,151 @@ export const getMyInfoCartSearch = (props) => (dispatch, getState) => {
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 장바구니 상품 추가 API
|
||||
*/
|
||||
export const insertMyinfoCart = (props) => (dispatch, getState) => {
|
||||
const { mbrNo, patnrId, prdtId, prdtOpt, prodQty } = props;
|
||||
|
||||
const onSuccess = (response) => {
|
||||
console.log("✅ insertMyinfoCart API 성공:", response.data);
|
||||
if (response.data.retCode !== '0' && response.data.retCode !== 0) {
|
||||
console.error("❌ retCode 에러:", response.data.retCode);
|
||||
console.error("에러 메시지:", response.data.retMsg);
|
||||
|
||||
return;
|
||||
}
|
||||
// response.data.data가 실제 상품 정보인지 확인
|
||||
if (!response.data.data) {
|
||||
console.warn("⚠️ response.data.data가 undefined입니다");
|
||||
}
|
||||
|
||||
dispatch({
|
||||
type: types.INSERT_MY_INFO_CART,
|
||||
payload: response.data.data,
|
||||
});
|
||||
|
||||
dispatch(getMyInfoCartSearch({ mbrNo }));
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error("insertMyinfoCart OnFail: ", error);
|
||||
};
|
||||
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
"post",
|
||||
URLS.INSERT_MY_INFO_CART,
|
||||
{},
|
||||
{ mbrNo, patnrId, prdtId, prdtOpt, prodQty },
|
||||
onSuccess,
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 장바구니 상품 삭제 API
|
||||
*/
|
||||
export const deleteMyinfoCart = (props) => (dispatch, getState) => {
|
||||
const { mbrNo, patnrId, prdtId, prodSno } = props;
|
||||
|
||||
const onSuccess = (response) => {
|
||||
console.log("deleteMyinfoCart onSuccess: ", response.data);
|
||||
|
||||
dispatch({
|
||||
type: types.DELETE_MY_INFO_CART,
|
||||
payload: response.data.data,
|
||||
});
|
||||
|
||||
// 장바구니 목록 재조회
|
||||
dispatch(getMyInfoCartSearch({ mbrNo }));
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error("deleteMyinfoCart OnFail: ", error);
|
||||
};
|
||||
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
"post",
|
||||
URLS.DELETE_MY_INFO_CART,
|
||||
{},
|
||||
{ mbrNo, patnrId, prdtId, prodSno },
|
||||
onSuccess,
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 장바구니 상품 전체 삭제
|
||||
*/
|
||||
export const deleteAllMyinfoCart = (props) => (dispatch, getState) => {
|
||||
const { mbrNo } = props;
|
||||
|
||||
const onSuccess = (response) => {
|
||||
console.log("deleteAllMyinfoCart onSuccess: ", response.data);
|
||||
|
||||
dispatch({
|
||||
type: types.DELETE_ALL_MY_INFO_CART,
|
||||
payload: response.data.data,
|
||||
});
|
||||
|
||||
// 장바구니 목록 재조회
|
||||
dispatch(getMyInfoCartSearch({ mbrNo }));
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error("deleteAllMyinfoCart OnFail: ", error);
|
||||
};
|
||||
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
"post",
|
||||
URLS.DELETE_ALL_MY_INFO_CART,
|
||||
{},
|
||||
{ mbrNo },
|
||||
onSuccess,
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 장바구니 상품 수정
|
||||
*/
|
||||
export const updateMyinfoCart = (props) => (dispatch, getState) => {
|
||||
const { mbrNo, patnrId, prdtId, prodQty, prodSno } = props;
|
||||
|
||||
const onSuccess = (response) => {
|
||||
console.log("updateMyinfoCart onSuccess: ", response.data);
|
||||
|
||||
dispatch({
|
||||
type: types.UPDATE_MY_INFO_CART,
|
||||
payload: response.data.data,
|
||||
});
|
||||
|
||||
// 장바구니 목록 재조회
|
||||
dispatch(getMyInfoCartSearch({ mbrNo }));
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error("updateMyinfoCart OnFail: ", error);
|
||||
};
|
||||
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
"post",
|
||||
URLS.UPDATE_MY_INFO_CART,
|
||||
{},
|
||||
{ mbrNo, patnrId, prdtId, prodQty, prodSno },
|
||||
onSuccess,
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 장바구니에 상품 추가
|
||||
* @param {Object} props - 장바구니 상품 정보
|
||||
|
||||
@@ -20,10 +20,15 @@ export const URLS = {
|
||||
GET_MY_INFO_CARD_SEARCH: "/lgsp/v1/myinfo/card/search.lge",
|
||||
|
||||
// cart controller
|
||||
GET_MY_INFO_CART_SEARCH: "/lgsp/v1/myinfo/cart/search.lge",
|
||||
ADD_TO_CART: "/lgsp/v1/myinfo/cart/add.lge",
|
||||
REMOVE_FROM_CART: "/lgsp/v1/myinfo/cart/remove.lge",
|
||||
UPDATE_CART_ITEM: "/lgsp/v1/myinfo/cart/update.lge",
|
||||
// cart api
|
||||
GET_MY_INFO_CART_SEARCH: "/lgsp/v1/myinfo/cart/search.lge",
|
||||
INSERT_MY_INFO_CART: "/lgsp/v1/myinfo/cart/add.lge",
|
||||
DELETE_MY_INFO_CART : "/lgsp/v1/myinfo/cart/delete.lge",
|
||||
DELETE_ALL_MY_INFO_CART : "/lgsp/v1/myinfo/cart/deleteAll.lge",
|
||||
UPDATE_MY_INFO_CART : "/lgsp/v1/myinfo/cart/update.lge",
|
||||
|
||||
// shipping controller
|
||||
GET_MY_INFO_SHIPPING_SEARCH: "/lgsp/v1/myinfo/address/shipping/search.lge",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { types } from "../actions/actionTypes";
|
||||
import { types } from '../actions/actionTypes';
|
||||
|
||||
/**
|
||||
* Cart Reducer 초기 상태
|
||||
@@ -20,7 +20,7 @@ const initialState = {
|
||||
*/
|
||||
export const cartReducer = (state = initialState, action) => {
|
||||
switch (action.type) {
|
||||
// 장바구니 조회
|
||||
// 장바구니 조회 - API에서 가져온 전체 목록
|
||||
case types.GET_MY_INFO_CART_SEARCH:
|
||||
return {
|
||||
...state,
|
||||
@@ -32,6 +32,56 @@ export const cartReducer = (state = initialState, action) => {
|
||||
};
|
||||
|
||||
// 장바구니에 상품 추가
|
||||
case types.INSERT_MY_INFO_CART:
|
||||
return {
|
||||
...state,
|
||||
getMyinfoCartSearch: {
|
||||
...state.getMyinfoCartSearch,
|
||||
cartList: [...state.getMyinfoCartSearch.cartList, action.payload],
|
||||
totalCount: (state.getMyinfoCartSearch.totalCount || 0) + 1,
|
||||
},
|
||||
lastAction: {
|
||||
type: "insert",
|
||||
data: action.payload,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
error: null,
|
||||
};
|
||||
|
||||
// 장바구니에서 상품 삭제
|
||||
case types.DELETE_MY_INFO_CART:
|
||||
return {
|
||||
...state,
|
||||
getMyinfoCartSearch: {
|
||||
...state.getMyinfoCartSearch,
|
||||
cartList: state.getMyinfoCartSearch.cartList.filter(
|
||||
item => item.prodSno !== action.payload.prodSno
|
||||
),
|
||||
totalCount: Math.max(0, (state.getMyinfoCartSearch.totalCount || 0) - 1),
|
||||
},
|
||||
lastAction: {
|
||||
type: "delete",
|
||||
data: action.payload,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
error: null,
|
||||
};
|
||||
|
||||
case types.UPDATE_MY_INFO_CART:
|
||||
return {
|
||||
...state,
|
||||
getMyinfoCartSearch: {
|
||||
...state.getMyinfoCartSearch,
|
||||
cartList: state.getMyinfoCartSearch.cartList.map(item =>
|
||||
item.prodSno === action.payload.prodSno
|
||||
? { ...item, ...action.payload }
|
||||
: item
|
||||
),
|
||||
},
|
||||
error: null,
|
||||
};
|
||||
|
||||
// 장바구니에 상품 추가 (addToCart - 로컬 상태용)
|
||||
case types.ADD_TO_CART:
|
||||
return {
|
||||
...state,
|
||||
@@ -43,7 +93,7 @@ export const cartReducer = (state = initialState, action) => {
|
||||
error: null,
|
||||
};
|
||||
|
||||
// 장바구니에서 상품 제거
|
||||
// 장바구니에서 상품 제거 (removeFromCart)
|
||||
case types.REMOVE_FROM_CART:
|
||||
return {
|
||||
...state,
|
||||
@@ -55,19 +105,19 @@ export const cartReducer = (state = initialState, action) => {
|
||||
error: null,
|
||||
};
|
||||
|
||||
// 장바구니 상품 수량 업데이트
|
||||
// 장바구니 상품 수량 업데이트 (updateCartItem)
|
||||
case types.UPDATE_CART_ITEM:
|
||||
return {
|
||||
...state,
|
||||
lastAction: {
|
||||
type: "update",
|
||||
type: "updateQty",
|
||||
data: action.payload,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
error: null,
|
||||
};
|
||||
|
||||
// 장바구니 전체 비우기
|
||||
// 장바구니 전체 비우기 (clearCart - 로컬 상태 전용)
|
||||
case types.CLEAR_CART:
|
||||
return {
|
||||
...state,
|
||||
|
||||
@@ -46,7 +46,8 @@ export default function CartPanel({ spotlightId, scrollOptions = [], panelInfo }
|
||||
);
|
||||
|
||||
// Mock Mode 여부 확인 및 적절한 데이터 선택
|
||||
const isMockMode = BUYNOW_CONFIG.isMockMode();
|
||||
// const isMockMode = BUYNOW_CONFIG.isMockMode();
|
||||
const isMockMode = false;
|
||||
const displayCartData = useMemo(() => {
|
||||
return isMockMode ? mockCartData : cartData;
|
||||
}, [isMockMode, mockCartData, cartData]);
|
||||
|
||||
@@ -18,6 +18,7 @@ import SpotlightContainerDecorator
|
||||
import logoImage from '../../../assets/images/ic-partners-qvc@3x.png';
|
||||
import defaultImage from '../../../assets/images/img-thumb-empty-144@3x.png';
|
||||
import {
|
||||
deleteMyinfoCart,
|
||||
removeFromCart,
|
||||
updateCartItem,
|
||||
} from '../../actions/cartActions';
|
||||
@@ -264,6 +265,21 @@ const CartProduct = ({ cartInfo, getScrollTo, scrollTop }) => {
|
||||
[scrollTop]
|
||||
);
|
||||
|
||||
//장바구니 삭제
|
||||
const deleteCart = (patnrId, prdtId, prodSno) => {
|
||||
const { userNumber } = store.getState().common.appStatus.loginUserData;
|
||||
console.log("###test",userNumber,
|
||||
patnrId,
|
||||
prdtId,
|
||||
prodSno)
|
||||
// dispatch(deleteMyinfoCart({
|
||||
// mbrNo : userNumber,
|
||||
// patnrId,
|
||||
// prdtId,
|
||||
// prodSno
|
||||
// }))
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{Object.entries(groupedCartData).map(([partnerKey, group], index) => {
|
||||
@@ -433,7 +449,7 @@ const CartProduct = ({ cartInfo, getScrollTo, scrollTop }) => {
|
||||
<TButton
|
||||
className={css.trashImg}
|
||||
size="cartTrash"
|
||||
onClick={() => handleDeleteClick(item.prodSno)}
|
||||
onClick={() => deleteCart(item.patnrId, item.prdtId, item.prodSno)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -15,7 +15,10 @@ import Spotlight from '@enact/spotlight';
|
||||
import SpotlightContainerDecorator
|
||||
from '@enact/spotlight/SpotlightContainerDecorator';
|
||||
|
||||
import { addToCart } from '../../../actions/cartActions';
|
||||
import {
|
||||
addToCart,
|
||||
insertMyinfoCart,
|
||||
} from '../../../actions/cartActions';
|
||||
import { getMyInfoCheckoutInfo } from '../../../actions/checkoutActions';
|
||||
import {
|
||||
changeAppStatus,
|
||||
@@ -1084,17 +1087,18 @@ const BuyOption = ({
|
||||
|
||||
if (!isMock) {
|
||||
dispatch(
|
||||
addToCart({
|
||||
insertMyinfoCart({
|
||||
mbrNo: userNumber,
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
prodQty: String(effectiveQuantity),
|
||||
prodQty: Number(effectiveQuantity),
|
||||
prdtOpt: {
|
||||
prodOptCdCval: optionForUse?.prodOptCdCval || '',
|
||||
prodOptCval: optionLabel,
|
||||
prodOptSno: productOptionInfos?.[0]?.prodOptSno || '',
|
||||
prodOptCdCval: optionForUse?.prodOptCdCval || '',
|
||||
prodOptTpCdCval: productOptionInfos?.[0]?.prodOptTpCdCval || '',
|
||||
prodOptCval: optionLabel,
|
||||
},
|
||||
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user