PageSourceSearch

https://order.kyobobook.co.kr/assets/js/cart/helper/cartHelpers.js

js kyobobook.co.kr collected 2026-10-01 08:46:43 UTC 9,985 bytes, 296 lines download raw bytes

1import {cartState} from '../state/CartState.js';
2
3/**
4 * 비회원 조회 세션을 끝냅니다.
5 *
6 * 세션키 쿠키가 httpOnly 라 스크립트가 직접 지울 수 없어 서버에 맡깁니다.
7 * 정리가 끝나기 전에 장바구니 조회가 나가면 그 요청이 비회원 경로로 흘러가므로
8 * 호출부에서 반드시 await 해야 합니다.
9 *
10 * @return {Promise}
11 */
12function deleteNonMemberCookie() {
13    return order.utils.clearNonMemberSession();
14}
15
16/**
17 * 비회원 쿠키 삭제
18 */
19function deleteTempMemberCookie() {
20    const tmprMmbrNum = $("#tmprMmbrNum").val();
21    const expiredDate = new Date();
22    expiredDate.setDate(expiredDate.getDate() + -1);
23    const cookieValue = `; path=/; expires=${expiredDate.toUTCString()}; domain=.kyobobook.co.kr`;
24    document.cookie = `tmprMmbrNum=${tmprMmbrNum}; ${cookieValue}`;
25}
26
27/**
28 * 상품개수여부 체크
29 *
30 * @returns {boolean}
31 */
32function cartCntChk() {
33    if (cartState.cartCnt === 0) { //장바구니 개수가 0이면
34        KbbJS.ui.alert("상품을 담은 후 진행해주세요.");
35        return false;
36    }
37    return true;
38}
39
40
41/**
42 * 하단 추천 영역 상품 GA 데이터 수집
43 * @param {string} sectionKey - 'picks' | 'bestSeller' | 'topic' | 'today' | 'pbc' | 'mdPick'
44 * @param {string} saleCmdtid
45 * @returns {[Object|undefined, string]} [selectedItem, sectionName]
46 */
47function getGtmItem(sectionKey, saleCmdtid) {
48    let gtmItem;
49    let section = '';
50
51    switch (sectionKey) {
52        case 'picks':
53            section = 'AI 맞춤추천';
54            cartState.cartPicksList.forEach((item, idx) => {
55                if (item.saleCmdtid === saleCmdtid) {
56                    gtmItem = {...item, index: idx + 1, price: item.saleCmdtSapr};
57                }
58            });
59            break;
60        case 'bestSeller':
61            section = 'AI 맞춤추천';
62            cartState.cartWishList.forEach((item, idx) => {
63                if (item.saleCmdtid === saleCmdtid) {
64                    gtmItem = {...item, index: idx + 1, price: item.sapr};
65                }
66            });
67            break;
68        case 'topic':
69            section = '새로 나온 책';
70            cartState.cartTopicList.forEach((item, idx) => {
71                if (item.saleCmdtId === saleCmdtid) {
72                    gtmItem = {...item, saleCmdtid: item.saleCmdtId, index: idx + 1, price: item.cmdtSapr};
73                }
74            });
75            break;
76        case 'today':
77            section = '오늘의 책';
78            cartState.cartTodayList.forEach((item, idx) => {
79                if (item.saleCmdtId === saleCmdtid) {
80                    gtmItem = {...item, saleCmdtid: item.saleCmdtId, index: idx + 1, price: item.cmdtSapr};
81                }
82            });
83            break;
84        case 'pbc':
85            section = $('[data-pbc-corner]').text();
86            cartState.cartPbcList.forEach((item, idx) => {
87                if (item.saleCmdtid === saleCmdtid) {
88                    gtmItem = {...item, index: idx + 1, price: item.saleCmdtSapr};
89                }
90            });
91            break;
92        case 'mdPick':
93            section = $('[data-md-pick-corner]').text();
94            cartState.cartMdPickList.forEach((item, idx) => {
95                if (item.saleCmdtid === saleCmdtid) {
96                    gtmItem = {...item, index: idx + 1, price: item.saleCmdtSapr};
97                }
98            });
99            break;
100        case 'hottracksRecommend':
101            section = $('[data-hottrcaks-recommend-corner]').text();
102            cartState.cartHottrcaksRecommendList.forEach((item, idx) => {
103                if (item.saleCmdtid === saleCmdtid) {
104                    gtmItem = {...item, index: idx + 1, price: item.saleCmdtSapr};
105                }
106            });
107            break;
108        default:
109            break;
110    }
111
112    return [gtmItem, section];
113}
114
115/**
116 * 주문제한수량 체크
117 *
118 * @param dataObj
119 * @param packageYsno
120 * @returns {*|string|jQuery|number}
121 */
122function ordrLmttCheck(dataObj, packageYsno) {
123    if (packageYsno == "Y" || dataObj.find("[data-list-spbkKindCode]").val() == "060") { // 패키지형 결합상품 또는 상품권일 경우, 판매제한여부가 Y일 때 주문제한수량 체크
124        if (dataObj.find("[data-list-salelmttysno]").val() == "Y" && dataObj.find("[data-list-ordrlmttqntt]").val() > 0 && dataObj.find("[data-list-requqntt]").val() > dataObj.find("[data-list-ordrlmttqntt]").val()) {
125            return dataObj.find("[data-list-ordrlmttqntt]").val();
126        }
127    } else if (dataObj.find("[data-list-spbkKindCode]").val() == "020") { // 디컨 상품일 경우, 주문수량이 
1271보다 큰지 체크
128        if (dataObj.find("[data-list-requqntt]").val() > 1) {
129            return 1;
130        }
131    } else {
132        return 0;
133    }
134}
135
136
137/**
138 * 주문을 위한 비회원 번호 생성 및 쿠키 저장
139 *
140 * @returns {string}
141 */
142function setTempMemberCookie() {
143    let tmprMmbrNum = "";
144    let today = new Date();
145
146    today.setHours(today.getHours() + 9);
147    today = today.toISOString().replaceAll('-', '').replaceAll(':', '').replace('T', '').substring(0, 14)
148    tmprMmbrNum = today + "_0" + (Math.floor(9e3 * Math.random()) + 1e3);
149
150    const expiresDate = new Date();
151    expiresDate.setHours(expiresDate.getHours() + 3);   //tmprMmbrNum의 유효시간 3시간 설정
152    document.cookie = "tmprMmbrNum=" + tmprMmbrNum + "; path=/; expires=" + expiresDate.toUTCString() + "; domain=.kyobobook.co.kr";
153
154    return tmprMmbrNum;
155}
156
157/**
158 * 합배송 가능 상품 포함 여부
159 *
160 * @param cmdtList
161 * @returns {*}
162 */
163function requiresSeparateShipments(cmdtList) {
164    // cmdtList의 모든 상품이 주어진 조건을 만족하는지 확인합니다.
165    if (!cmdtList || cmdtList.length === 0) {
166        return false;
167    }
168
169    // 교보문고 배송 상품 내 POD 혹은 예약 상품이 포함된 경우
170    const isIncludePreorderWithKyobo = cmdtList.filter(cmdt => cmdt.saleCmdtGrpDvsnCode === 'SGK').length > 1 // 교보문고 배송 상품이 2개 이상인 경우
171        && cmdtList.some(cmdt => cmdt.saleCmdtGrpDvsnCode === 'SGK' // 교보문고 배송 상품인 경우
172             // KOR / ENG / JAP / PBC 중 예약 상품이 포함된 경우
173            && ((cartState.kyoboDeliveryCodes.includes(cmdt.saleCmdtDvsnCode) && cartState.prenSaleCdtnCodes.includes(cmdt.saleCdtnCode))
174                // POD 상품인 경우
175            || cmdt.saleCmdtDvsnCode === "POD"));
176
177    // 핫트랙스 배송 상품 내 예약 상품이 포함된 경우
178    const isIncludePreorderWithHottracks = cmdtList.filter(cmdt => cmdt.saleCmdtGrpDvsnCode === 'SGM' || cmdt.saleCmdtGrpDvsnCode === 'SGI').length > 1 // 핫트랙스 배송 상품이 2개 이상인 경우
179        && cmdtList.some(cmdt => (cmdt.saleCmdtGrpDvsnCode === 'SGM' || cmdt.saleCmdtGrpDvsnCode === 'SGI') // 핫트랙스 상품인 경우
180            && cartState.prenSaleCdtnCodes.includes(cmdt.saleCdtnCode)); // 예약 상품인 경우
181    console.log(cmdtList, isIncludePreorderWithKyobo, isIncludePreorderWithHottracks);
182
183    return isIncludePreorderWithKyobo || isIncludePreorderWithHottracks;
184}
185
186/**
187 * 교보문고 배송 상품수 조회
188 * KOR / ENG / JAP /PBC / POD
189 *
190 * @param cmdtList
191 * @returns {Number}
192 */
193function kyoboDeliveryCmdtCnt(cmdtList) {
194    return cmdtList.filter(cmdt => cartState.kyoboDeliveryCodes.includes(cmdt.saleCmdtDvsnCode) || cmdt.saleCmdtDvsnCode === "POD").length;
195}
196
197/**
198 * 기프트카드 주문인 경우 본인인증 체크
199 * @param prd060Cnt
200 * @returns {boolean}
201 */
202function validationVerifyForGiftCardOrder(prd060Cnt) {
203    if (prd060Cnt > 0 && order.user?.data?.crttYsno === "N") {
204        KbbJS.ui.alert({
205            text: "기프트카드 상품은 본인 인증 회원만 구매 가능합니다. 본인 인증 후 이용해주세요.",
206            confirm: {
207                label: "확인"
208            },
209            cancel: {
210                label: "본인 인증하기",
211                callback: (b) => (location.href = KbbJS.util.parseStageURL("/MBR/member-info"))
212            }
213        });
214
215        return true;
216    }
217
218    return false;
219}
220
221/**
222 * 로그인여부 체크
223 *
224 * @param nextPage
225 * @param params
226 * @param guestOption
227 * @returns {boolean}
228 */
229function loginChk(nextPage, params, guestOption) {
230    if (KbbJS.auth.authorized) { //회원인경우
231        return true;
232    }
233
234    // 로그인 페이지로 이동
235    guestOption = guestOption || "guest";
236    const loginURL = KbbJS.getOption('auth.redirect.login');
237    KbbJS.util.moveTo(loginURL, {
238        continue: KbbJS.util.customURL(nextPage || window.location.href, params),
239        order: guestOption,
240    });
241    return false;
242}
243
244function debounce(fn, delay = 200) {
245    let timer = null;
246    return function (...args) {
247        clearTimeout(timer);
248        timer = setTimeout(() => fn.apply(this, args), delay);
249    };
250}
251
252/**
253 * 수량 동기화
254 * @param cartGoodInfoList
255 * @returns {Promise<void>}
256 */
257async function syncCartState(cartGoodInfoList) {
258    if (!cartGoodInfoList) {
259        return;
260    }
261
262    // 1) 변경 요청 리스트를 spbkId → requQntt 맵으로
263    const qtyMap = cartGoodInfoList.reduce((map, {spbkId, requQntt}) => {
264        map[spbkId] = requQntt;
265        return map;
266    }, {});
267
268    // 2) cartState.cartGoodsList를 돌면서 requQntt가 있으면 교체
269    cartState.cartGoodsList = cartState.cartGoodsList.map(item => {
270        if (qtyMap[item.spbkId] != null) {
271            return {
272                ...item,
273                requQntt: qtyMap[item.spbkId]
274            };
275        }
276        return item;
277    });
278}
279
280/**
281 * Export 정의
282 */
283export const cartHelpers = {
284    deleteNonMemberCookie,
285    deleteTempMemberCookie,
286    cartCntChk,
287    getGtmItem,
288    ordrLmttCheck,
289    setTempMemberCookie,
290    requiresSeparateShipments,
291    validationVerifyForGiftCardOrder,
292    loginChk,
293    debounce,
294    syncCartState,
295    kyoboDeliveryCmdtCnt
296}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.