(() => {
// π API Base URL μ€μ
const isNewYear = new Date() >= new Date('2026-01-01T00:00');
const API_BASE_URL = isNewYear
? 'https://grades.dotmodkorea.com'
: 'https://legacy.dotmodkorea.com';
const { actions, EventManager, pageHelper, Handlebars } = ShopbySkin;
const { initialize } = pageHelper.myPageHelper();
initialize();
// λ±κΈ μ§νλ₯ κ³μ° ν¨μ
const calculateGradeProgress = (current, max) => {
return Math.floor((current / max) * 100);
};
// νμ μμ½ μ 보 API νΈμΆ ν¨μ
const fetchMemberSummary = async (memberNo) => {
try {
// 1. λ±κΈ κ·μΉ λ¨Όμ μ‘°ν
const gradeRules = isNewYear
? [
{
gradeName: 'μ¬μ',
minAmount: 0,
},
{
gradeName: 'λ리',
minAmount: 100000,
},
{
gradeName: 'νμ₯',
minAmount: 300000,
},
{
gradeName: 'λν',
minAmount: 500000,
},
]
: [
{
gradeNo: 92972,
gradeName: 'μΈν΄',
minAmount: 0,
},
{
gradeNo: 92977,
gradeName: 'μ¬μ',
minAmount: 50000,
},
{
gradeNo: 92973,
gradeName: 'λ리',
minAmount: 100000,
},
{
gradeNo: 92974,
gradeName: 'κ³Όμ₯',
minAmount: 300000,
},
{
gradeNo: 92975,
gradeName: 'λΆμ₯',
minAmount: 700000,
},
{
gradeNo: 92976,
gradeName: 'μ¬μ₯',
minAmount: 1500000,
},
];
// 2. νμ μμ½ μ 보 μ‘°ν
const response = await fetch(`${API_BASE_URL}/api/shopby/grade/summary/${memberNo}`);
// const response = {
// orderCount: 6900, // μ΄ μ£Όλ¬Έκ±΄μ
// purchasedPrice: 1000000, // μ΄ κ²°μ κΈμ‘
// currentGrade: 'κ³Όμ₯',
// nextGrade: 'μ¬μ₯',
// priceToNextGrade: 500000,
// priceToMaintainGrade: 200000,
// };
// const data = response;
if (!response.ok) {
throw new Error(`API νΈμΆ μ€ν¨: ${response.status} ${response.statusText}`);
}
const responseData = await response.json();
const data = responseData.data;
if (isNewYear) {
if (data.currentGrade === 'λν') {
data.nextGradeMinAmount = gradeRules.find((i) => i.gradeName === 'λν').minAmount;
} else {
const nextGradeData = gradeRules.find((i) => i.gradeName === data.nextGrade);
data.nextGradeMinAmount = nextGradeData.minAmount;
}
if (data.currentGrade === 'λν') {
data.gradeProgress = 100;
} else {
data.gradeProgress = calculateGradeProgress(data.purchasedPrice, data.nextGradeMinAmount);
}
} else {
if (data.currentGrade === 'μ¬μ₯') {
data.nextGradeMinAmount = gradeRules.find((i) => i.gradeName === 'μ¬μ₯').minAmount;
} else {
const nextGradeData = gradeRules.find((i) => i.gradeName === data.nextGrade);
data.nextGradeMinAmount = nextGradeData.minAmount;
}
if (data.currentGrade === 'μ¬μ₯') {
data.gradeProgress = 100;
} else {
data.gradeProgress = calculateGradeProgress(data.purchasedPrice, data.nextGradeMinAmount);
}
}
// λ μ§ λ²μ κ³μ° (180μΌ)
const today = new Date();
const startDate = new Date(today);
startDate.setDate(today.getDate() - 180);
const formatDate = (date) => {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}.${month}.${day}`;
};
data.startDate = formatDate(startDate); // 180μΌ μ
data.endDate = formatDate(today); // μ€λ
data.isNewYear = isNewYear; // μ λ
μ¬λΆ
return data;
} catch (error) {
console.error('error on summary:', error);
return null;
}
};
// νμ μμ½ μ 보 λ³μ
let memberSummaryData;
// purchased-price-summary ν
νλ¦Ώ μ
λ°μ΄νΈ ν¨μ
const updatePurchasedSummary = () => {
const purchasedSummary = document.querySelector('purchased-price-summary');
if (purchasedSummary && memberSummaryData) {
const scriptTag = purchasedSummary.querySelector('script[type="text/x-handlebars-template"]');
if (scriptTag) {
const template = Handlebars.compile(scriptTag.innerHTML);
const renderedHtml = template(memberSummaryData);
purchasedSummary.innerHTML = renderedHtml;
}
}
};
let shopbyCommonData = {};
EventManager.on('PAGE_LOAD_COMPLETED', async (commonData) => {
shopbyCommonData = commonData;
// νμ μμ½ μ 보 API νΈμΆνμ¬ λ³μμ λ΄κΈ°
try {
const profileResult = await actions.queryProfile();
if (profileResult && profileResult.data) {
const memberNo = profileResult.data.memberNo;
if (memberNo) {
// memberSummaryData = await fetchMemberSummary('121858873');
memberSummaryData = await fetchMemberSummary(memberNo);
// purchased-price-summary ν
νλ¦Ώμ λ°μ΄ν° μ λ¬
updatePurchasedSummary();
}
}
} catch (error) {
console.error('νμ μ 보 μ‘°ν μ€ν¨:', error);
}
// μΈλΆμ€ν¬λ¦½νΈ λ±λ‘ κΈ°λ₯. μμ κΈμ§
ShopbyExternalScript?.setPageScriptType('MY_PAGE');
});
EventManager.on('MY_ORDER_STATUS_CONTENT_LOADED', (data) => {
// μΈλΆμ€ν¬λ¦½νΈ λ±λ‘ κΈ°λ₯. μμ κΈμ§
ShopbyExternalScript?.setGlobalObjectSb(data);
});
const containerEl = document.querySelector('[shopby-helper-key="my-page-helper-key"]');
const clickEventListener = (event) => {
const actionType = event.target.closest('[shopby-action]')?.getAttribute('shopby-action');
const CLICK_EVENT_HANDLER_MAP = {
LOGOUT: async () => {
await actions.postSignOut();
location.href = '/';
},
GRADE_BENEFIT: () => {
EventManager.fire('OPEN_LAYER_MODAL', {
name: 'grade-benefit-guide',
title: 'λ±κΈνν μλ΄',
isFull: false,
data: {
commonData: shopbyCommonData,
},
});
},
PRODUCT_LIKE_BTN: ({ event }) => {
event?.preventDefault?.();
const btn = event.target.closest('[shopby-product-no]');
const productNo = Number(btn.getAttribute('shopby-product-no') ?? 0);
actions.toggleLikeStatus({
productNo,
onSuccess: (isLiked) => {
if (isLiked) {
btn.classList.add('is-active');
return;
}
btn.classList.remove('is-active');
},
});
},
INQUIRY_REGISTER: () => {
EventManager.fire('OPEN_LAYER_MODAL', {
name: 'personal-inquiry-form',
title: `1:1λ¬Έμ λ±λ‘`,
modalAddClass: 'personal-inquiry-form-modal',
isFull: false,
data: {
isModify: false,
commonData: shopbyCommonData,
},
onClose: ({ reason }) => {
if (reason === 'DID_SUBMIT') {
EventManager.fire('MODAL_ALERT_OPEN', {
noticeType: 'SUCCESS',
message: 'κ²μκΈμ΄ μ μ₯λμμ΅λλ€.',
onClose: () => {
location.reload();
},
});
}
},
});
},
PRODUCT_INQUIRY_REGISTER: () => {
EventManager.fire('OPEN_LAYER_MODAL', {
name: 'product-inquiry-form',
title: 'μνλ¬Έμ',
modalAddClass: 'product-inquiry-form-modal',
isFull: false,
data: {
isSelectProduct: true,
commonData: shopbyCommonData,
},
onClose: ({ reason }) => {
if (reason === 'DID_SUBMIT') {
EventManager.fire('MODAL_ALERT_OPEN', {
noticeType: 'SUCCESS',
message: 'μνλ¬Έμκ° λ±λ‘λμ΅λλ€.',
onClose: () => {
location.reload();
},
});
}
},
});
},
PRODUCT_REVIEW_REGISTER: () => {
EventManager.fire('OPEN_LAYER_MODAL', {
name: 'product-review-form',
title: 'μννκΈ°',
modalAddClass: 'product-review-form-modal',
isFull: false,
data: {
isSelectProduct: true,
},
onClose: ({ reason }) => {
if (reason === 'DID_SUBMIT') {
EventManager.fire('MODAL_ALERT_OPEN', {
noticeType: 'success',
message: 'μννκΈ°κ° λ±λ‘λμμ΅λλ€.',
onClose: () => {
location.reload();
},
});
}
},
});
},
};
CLICK_EVENT_HANDLER_MAP[actionType]?.({ event });
};
containerEl.addEventListener('click', clickEventListener);
})();