(() => { const { EventManager, pageHelper, utils: { handleFocusEvent, setLocalStorage, getLocalStorage, removeLocalStorage, }, } = ShopbySkin; const signInHelper = pageHelper.signInHelper(); signInHelper.initialize({ helperKey: "sign-in-form", }); const containerEl = document.querySelector("sign-in-form"); const AUTH_TRANSITION_PAGES = [ '/pages/re-auth/re-authentication', '/pages/sign-in/member-authentication', ]; const getFromUrl = () => { const searchParams = new URLSearchParams(location.search); const from = searchParams.get("from"); const mainUrl = "/"; return decodeURIComponent(from || mainUrl); }; const getSafeFromUrl = () => { const fromUrl = getFromUrl(); return AUTH_TRANSITION_PAGES.some((page) => fromUrl.includes(page)) ? '/' : fromUrl; }; if (getLocalStorage("OPEN_ID_DORMANT_CALLBACK")) { const openIdDormantInformation = JSON.parse( getLocalStorage("OPEN_ID_DORMANT_CALLBACK") ?? "{}" ); EventManager.fire("OPEN_LAYER_MODAL", { name: "dormant-sign-in", modalAddClass: "dormant-sign-in-modal", isFull: false, data: { ...openIdDormantInformation?.dormantMemberResponse, accessToken: openIdDormantInformation?.accessToken, expireIn: openIdDormantInformation?.expireIn, }, onClose: ({ reason }) => { if (reason === "DID_SUBMIT") { location.replace(getSafeFromUrl()); removeLocalStorage("OPEN_ID_DORMANT_CALLBACK"); return; } signInHelper.signOut(); }, }); } const checkSignInValid = (params) => { if (!params || !params.memberId) { return { field: "memberId", message: "아이디를 입력하세요.", }; } if (!params.password) { return { field: "password", message: "비밀번호를 입력하세요.", }; } return { field: "", message: "", }; }; const showInvalidModal = (validResult) => { if (validResult.message) { EventManager.fire("MODAL_ALERT_OPEN", { noticeType: "CAUTION", message: validResult.message, onClose: () => { handleFocusEvent({ containerEl, fields: validResult.field }); }, }); return false; } return true; }; const setSessions = (memberNo) => { // 서브도메인간 쿠키 공유를 위해 domain=.dsdo.co.kr로 설정 document.cookie = `memberNo=${memberNo}; path=/; domain=.dsdo.co.kr;`; localStorage.setItem("memberNo", memberNo); } // eslint-disable-next-line complexity const handleSignInSubmit = async (params) => { const memberIdEl = containerEl?.querySelector('input[slot="memberId"]'); const passwordEl = containerEl?.querySelector('input[slot="password"]'); const memberId = params?.memberId ?? memberIdEl.value.trim(); const password = params?.password ?? passwordEl.value.trim(); const trackingKey = ShopbySkin.utils.getTrackingKey(); const validationResult = checkSignInValid({ memberId, password }); if (!showInvalidModal(validationResult)) { return; } // 이미 샵바이는 로그인한 상태로 변함 -> utils.isSignedIn() 시 true -> ssid/memberNo 둘 다 쿠키가 있어야 하는 상태 const { data: shopbyLoginInfo } = await signInHelper.signIn({ payload: { requestBody: { memberId, password, }, queryString: { ...(trackingKey && { trackingKey }), }, }, }); const saveIdCheckedEl = containerEl.querySelector( 'input[slot="saveIdChecked"]' ); const saveIdChecked = params?.saveIdChecked ?? saveIdCheckedEl.checked; if (saveIdChecked) { setLocalStorage("SAVE_MEMBER_ID", memberId); } // 샵바이 회원 프로필 조회 async function getProfile({ token }) { try { const response = await fetch(`https://shop-api.e-ncp.com/profile`, { method: "GET", headers: { "Content-Type": "application/json", "shop-by-authorization": `Bearer ${token}`, clientId: DSDOENV.clientId, // "L1ssjmbNZD2dBY+HZw8BMQ==", Version: "1.0", platform: "PC", }, }); // 상태 코드가 200이 아닌 경우 에러로 처리 if (!response.ok) { const errorData = await response.json(); console.error("API 요청 중 오류 발생:", errorData); } return response.json(); } catch (error) { console.error("API 요청 중 오류 발생:", error); throw error; } } // 매시업 로그인 async function PostUserLogin({ body }) { try { const response = await fetch( `https://dev2-service.api.wstore.nextinnovation.kr/api/v1/user/shop-login`, { method: "POST", headers: { "Content-Type": "application/json", clientId: DSDOENV.clientId, // "L1ssjmbNZD2dBY+HZw8BMQ==", }, body: JSON.stringify(body), } ); if (!response.ok) { const errorData = await response.json(); console.error("API 요청 중 오류 발생:", errorData); EventManager.fire("SIGN_OUT"); } return response.json(); } catch (error) { console.error("API 요청 중 오류 발생:", error); throw error; } } // 샵바이 토큰이 발행이 되면 if (shopbyLoginInfo) { const token = shopbyLoginInfo.accessToken; try { getProfile({ token }) .then((data) => { if (!data || !data.email) { // throw new Error("유효한 프로필 데이터를 가져오지 못했습니다."); EventManager.fire("SIGN_OUT"); } // const body = { // shop_uuid: `Bearer ${token}`, // email: data.email, // is_executive: false, // }; if (data.memberNo) { setSessions(data.memberNo); } // 휴먼 계정 if (shopbyLoginInfo.dormantMemberResponse) { EventManager.fire("OPEN_LAYER_MODAL", { name: "dormant-sign-in", modalAddClass: "dormant-sign-in-modal", isFull: false, data: shopbyLoginInfo.dormantMemberResponse, onClose: async ({ reason }) => { if (reason === "DID_SUBMIT") { const reactivatedProfile = await getProfile({ token }); if (reactivatedProfile.memberNo) { setSessions(reactivatedProfile.memberNo); } location.replace(getSafeFromUrl()); return; } signInHelper.signOut(); }, }); return; } // 비밀번호 변경 일차 초과 if (shopbyLoginInfo.daysFromLastPasswordChange > 90) { const nextUrl = `${location.origin}/pages/sign-in/expired-password-change-form.html`; location.replace(`${nextUrl}?from=${getFromUrl()}`); return; } // 본인 인증 안 된 계정으로 로그인 시 본인 인증 화면으로 강제 이동 if (!data.principalCertificated) { window.location.replace( "/pages/sign-in/member-authentication.html" ); return; } // 재인증 여부 체크 if (data.extraInfo?.length) { const isDev = DSDOENV.profile === 'dev'; const reAuth = data.extraInfo.some((info) => { const targetNo = isDev ? 439 : 314; const targetOptionNo = isDev ? 594 : 483; return info.extraInfoNo === targetNo && info.extraInfoOptionNos?.[0] === targetOptionNo; }); if (reAuth) { window.location.replace("/pages/re-auth/re-authentication.html"); return; } } location.replace(getSafeFromUrl()); }) .catch((error) => { console.error("오류 발생:", error.message); EventManager.fire("SIGN_OUT"); }); } catch (error) { console.error("사용자 정보 업데이트 실패", error); } } }; // .then((res) => { // const { data } = res; // if (data && data.refresh_token) { // // 매시업 로그인 성공 시 리턴 받은 토큰 저장 // localStorage.setItem("mash-up-token", data.refresh_token); // location.replace(getFromUrl()); // } else { // throw new Error("로그인 응답에 토큰이 없습니다."); // } // }) const clickEventListener = ({ target }) => { const action = target.getAttribute("shopby-action"); if (action === "SIGN_IN") { const { signInForm } = signInHelper.getState(); // 샵바이 로그인 handleSignInSubmit(signInForm); } }; const keypressEventListener = ({ target, key }) => { const action = target.getAttribute("shopby-action"); if (key === "Enter" && action === "PASSWORD_KEYPRESS") { const { signInForm } = signInHelper.getState(); handleSignInSubmit({ ...signInForm, password: target.value.trim() }); } }; containerEl.addEventListener("click", clickEventListener); containerEl.addEventListener("keypress", keypressEventListener); })();