import type { ReqPreorderSelectEvent, ResPreorderSelectEvent, ReqPreorderReserveDataUpdate, ResPreorderReserveDataUpdate, } from '#layers/types/PreregistType' import { DEFAULT_LOCALE_CODE } from '@/i18n.config' import { countryDialingCodes } from '#layers/assets/data/countryData' /** * 프로모션 - 사전등록 */ const usePreregist = () => { const promotion = ref({ id: 'preregist', title: '사전등록 프로모션', link: '/#preregist', startDate: '2025-07-09 10:00:00', endDate: '2025-12-31 23:59:59', }) // 사전 등록 프로모션 정보 const preregistDate = ref(Date.now()) // 사전 등록일 // [Setter] 사전등록 - 사전 등록일 세팅 const setPreregistDate = (newPreregistDate: number) => { preregistDate.value = newPreregistDate } // 프로모션 기간 여부 const isPromotionPeriod = computed(() => { if ( !promotion.value || !promotion.value.startDate || !promotion.value.endDate ) { return false } // return isBetweenPeriod( // kstStringToTimestamp(promotion.value.startDate), // kstStringToTimestamp(promotion.value.endDate) // ) }) // 국가 번호 조회 const countryDialingCode = computed(() => { return countryDialingCodes[countryCode.value.toUpperCase()] }) // 사전 등록 - 특정 국가 여부 조회 (IP 기반) const { isKorea, isTaiwanHongKongMacau, isNorthAmerica, countryCode, checkCountryByIp, } = useGds() // 사전 등록 - (등록 여부) 조회 const getPreregist = async (req: ReqPreorderSelectEvent) => { let res: ResPreorderSelectEvent = {} as ResPreorderSelectEvent try { const config = useRuntimeConfig() const stoveApiBaseUrl = config.public.stoveApiUrl const url = `${stoveApiBaseUrl}/pub-comm/v1.0/Preorder/SelectEvent` const headers = { Authorization: `Bearer ${req.accessToken}`, } const body = { event_code: req.event_code, lang: req.lang || DEFAULT_LOCALE_CODE, terms_type: req.terms_type, } res = (await commonFetch('POST', url, { headers, body, })) as ResPreorderSelectEvent if (res != null) { if (res.code === 0) { setPreregistDate(res.value?.terms_time_long || Date.now()) } else if (res.code === -1) { //= 조회 된 데이터가 없습니다. -> 최초 } else if (res.code === -90002) { //= 사전 등록 기간이 아닙니다. } else if (`${res.code}`.startsWith('401')) { //= [01] 로그인 후 이용하실 수 있습니다. res = { code: -90028, message: res.message || '' } // 401은 -90028로 처리 } else if (res.code === -90028) { //= [01] 로그인 후 이용하실 수 있습니다. } else { // [-90003] 점검 진행 중 res = { code: res.code, message: res.message || '' } console.log( '[Failure] /composables/promotion/usePreregist.getPreregist: ', res ) res.code = -99999 // else 알럿 띄우기 용 세팅 } } else { res = { code: -99999, message: '' } console.log( '[Failure] /composables/promotion/usePreregist.getPreregist: ', res ) res.code = -99999 // else 알럿 띄우기 용 세팅 } } catch (e) { console.error( '[Exception] /composables/promotion/usePreregist.getPreregist: ', e ) res = { code: -99999, message: `${e}`, } } return res } // 사전 등록 - 저장 const setPreregist = async (req: ReqPreorderReserveDataUpdate) => { let res: ResPreorderReserveDataUpdate = {} as ResPreorderReserveDataUpdate try { const config = useRuntimeConfig() const stoveApiBaseUrl = config.public.stoveApiUrl const url = `${stoveApiBaseUrl}/pub-comm/v1.0/Preorder/ReserveDataUpdate` const headers = { Authorization: `Bearer ${req.accessToken}`, } const body = { necessary_consent1: req.necessary_consent1, necessary_consent2: req.necessary_consent2, necessary_consent3: req.necessary_consent3, event_code: req.event_code, terms_type: req.terms_type, c_num: req.c_num, lang_code: req.lang_code, hp: req.hp, email: req.email, metric_seq: req.metric_seq, //= mcode g_server: req.g_server, world_id: req.world_id, game_unique_num: req.game_unique_num, event_info1: req.event_info1, // 각 이벤트 필요할때 사용 event_info2: req.event_info2, // 각 이벤트 필요할때 사용 event_info3: req.event_info3, // 각 이벤트 필요할때 사용 event_info4: req.event_info4, // 각 이벤트 필요할때 사용 under14_terms: req.under14_terms, // 14세미만 진행 하는 구분값 device_type: req.device_type, // 접속 기기 pc / mobile country_code: req.country_code, country_dialing_code: req.country_dialing_code, // 국가 번호 birth_date: req.birth_date, // 생년월일 - 북미(미국, 캐나다)의 경우 } res = (await commonFetch('POST', url, { headers, body, })) as ResPreorderReserveDataUpdate if (res != null) { if (res.code === 0) { //= [08] [사전 등록 완료 레이어] 노출 if ( res.message != null && res.message !== '' && isNumeric(res.message) ) { // 사전 등록일이 숫자면 날짜로 변환 setPreregistDate(Number(res.message)) } else { setPreregistDate(Date.now()) } } else if (`${res.code}`.startsWith('401')) { //= [01] 로그인 후 이용하실 수 있습니다. res = { code: -90028, message: res.message || '' } // 401은 -90028로 처리 } else if (res.code === -90028) { //= [01] 로그인 후 이용하실 수 있습니다. } else if (res.code === -90002) { //= [02] 사전 등록 기간이 아닙니다. } else if (res.code === -90018) { //= [04] 생년 월일을 입력해 주세요. } else if (res.code === -90022) { //= [05] 사전 등록 가능한 연령이 아닙니다. } else if (res.code === -90000) { //= [06] 필수 약관을 모두 선택해 주세요. } else if (res.code === -90023) { //= [07] 이미 사전 등록이 완료된 계정입니다. if ( res.message != null && res.message !== '' && isNumeric(res.message) ) { // 사전 등록일이 숫자면 날짜로 변환 setPreregistDate(Number(res.message)) } else { setPreregistDate(Date.now()) } } else { //= [03] 오류가 발생했습니다.\n계속 오류가 발생하면 고객센터로 문의해 주세요. res = { code: res.code, message: res.message || '' } console.log( '[Failure] /composables/promotion/usePreregist.setPreregist: ', res ) res.code = -99999 // else 알럿 띄우기 용 세팅 } } else { res = { code: -99999, message: '' } console.log( '[Failure] /composables/promotion/usePreregist.setPreregist: ', res ) } } catch (e) { console.error( '[Exception] /composables/promotion/usePreregist.setPreregist: ', e ) res = { code: -99999, message: `${e}`, } } return res } return { promotion, isKorea, isTaiwanHongKongMacau, isNorthAmerica, countryCode, isPromotionPeriod, countryDialingCode, preregistDate, checkCountryByIp, getPreregist, setPreregist, } } export { usePreregist }