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