From 23621184c7dcdfe6323e5b91b2f5d3e158764635 Mon Sep 17 00:00:00 2001 From: clkim Date: Tue, 9 Dec 2025 17:03:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix.=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9A=A9?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/composables/uesGameLinkedData.ts | 5 --- layers/composables/usePreregist.ts | 5 --- layers/middleware/pageData.global.ts | 53 ++++++++++++++----------- 3 files changed, 30 insertions(+), 33 deletions(-) diff --git a/layers/composables/uesGameLinkedData.ts b/layers/composables/uesGameLinkedData.ts index 6ed3f35..38aa2a4 100644 --- a/layers/composables/uesGameLinkedData.ts +++ b/layers/composables/uesGameLinkedData.ts @@ -64,12 +64,10 @@ const useGameLinkedData = () => { setHasGuid(res.value?.guid > 0) } else { res = { code: res.code, message: res.message || '' } - console.log(`${logPrefix.failure}.getGuid: `, res) res.code = -99999 // else 알럿 띄우기 용 세팅 setHasGuid(false) } } else { - console.log(`${logPrefix.failure}.getGuid - res is null: `, res) res = { code: -99999, message: '' } setHasGuid(false) } @@ -130,7 +128,6 @@ const useGameLinkedData = () => { } else if (res.code === 515) { // [515] AccessToken이 유효하지 않을 경우 res = { code: res.code, message: res.message || '' } - console.log(`${logPrefix.failure}.getCharacterList: `, res) setCharacterList([] as CharacterInfo[]) setMainCharacter({} as CharacterInfo) } else { @@ -138,14 +135,12 @@ const useGameLinkedData = () => { // [502] 유효하지 않거나 잘못된 파라미터로 호출할 경우 // [701] 존재하지 않은 게임일 경우(game_no 기준) res = { code: res.code, message: res.message || '' } - console.log(`${logPrefix.failure}.getCharacterList: `, res) res.code = -99999 // else 알럿 띄우기 용 세팅 setCharacterList([] as CharacterInfo[]) setMainCharacter({} as CharacterInfo) } } else { res = { code: -99999, message: '' } - console.log(`${logPrefix.failure}.getCharacterList: `, res) setCharacterList([] as CharacterInfo[]) setMainCharacter({} as CharacterInfo) } diff --git a/layers/composables/usePreregist.ts b/layers/composables/usePreregist.ts index ad9e748..5814506 100644 --- a/layers/composables/usePreregist.ts +++ b/layers/composables/usePreregist.ts @@ -88,18 +88,15 @@ const usePreregist = () => { const headers = { Authorization: `Bearer ${req.accessToken}`, } - console.log("🚀 ~ getPreregist ~ req.event_code:", req.event_code) const body = { event_code: req.event_code, lang: req.lang || DEFAULT_LOCALE_CODE, terms_type: req.terms_type, } - const res = (await commonFetch('POST', url, { headers, body, })) as ResPreorderSelectEvent - console.log("🚀 ~ getPreregist ~ res:", res.value) // 응답 검증 if (!res) { @@ -186,13 +183,11 @@ const usePreregist = () => { country_dialing_code: req.country_dialing_code, birth_date: req.birth_date, } - console.log("🚀 ~ setPreregist ~ parema", body) const res = (await commonFetch('POST', url, { headers, body, })) as ResPreorderReserveDataUpdate - console.log("🚀 ~ ResPreorderReserveDataUpdate ~ res:", res.value) // 응답 검증 if (!res) { diff --git a/layers/middleware/pageData.global.ts b/layers/middleware/pageData.global.ts index e45f274..c0fd4c1 100644 --- a/layers/middleware/pageData.global.ts +++ b/layers/middleware/pageData.global.ts @@ -15,7 +15,6 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const gameDomain = useGetGameDomain() const gameDataStore = useGameDataStore() const { gameData } = storeToRefs(gameDataStore) - console.log("🚀 ~ gameData:", gameData.value) const pageDataStore = usePageDataStore() const loadingStore = useLoadingStore() const { getPathAfterLanguage } = usePathResolver() @@ -31,25 +30,31 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const pageUrl = getPathAfterLanguage(to.path) // 루트 경로(언어 코드만 있는 경로)로 접근할 때만 intro.page_url로 리다이렉트 - const isRootPath = !pageUrl || pageUrl === '' || pageUrl === '/' || pageUrl === `/${langCode}/` - console.log("🚀 ~ isRootPath:", isRootPath) - + const isRootPath = + !pageUrl || + pageUrl === '' || + pageUrl === '/' || + pageUrl === `/${langCode}/` + console.log('🚀 ~ isRootPath:', isRootPath) + if (isRootPath) { // gameData.intro.page_url이 있으면 해당 URL로 리다이렉트 const introPageUrl = gameData.value?.intro?.page_url if (introPageUrl && introPageUrl.trim() !== '') { // 외부 URL인지 확인 - const isExternalUrl = introPageUrl.startsWith('http://') || introPageUrl.startsWith('https://') - + const isExternalUrl = + introPageUrl.startsWith('http://') || + introPageUrl.startsWith('https://') + // 내부 경로인 경우 언어 코드 추가 let finalIntroUrl = introPageUrl if (!isExternalUrl) { const normalizedIntroUrl = introPageUrl.split('?')[0] // 쿼리스트링 제외 - + // 언어 코드 패턴 확인 (예: /ko, /en, /zh-tw 등) const languagePattern = /^\/[a-z]{2}(-[a-z]{2})?(\/|$)/ const hasLanguageCode = languagePattern.test(normalizedIntroUrl) - + // 언어 코드가 없으면 추가 if (!hasLanguageCode) { // 경로가 /로 시작하지 않으면 / 추가 @@ -57,28 +62,29 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { ? normalizedIntroUrl : `/${normalizedIntroUrl}` finalIntroUrl = `/${langCode}${pathWithSlash}` - + // 쿼리스트링이 있으면 다시 추가 if (introPageUrl.includes('?')) { finalIntroUrl += '?' + introPageUrl.split('?')[1] } } } - + // 무한 리다이렉트 방지: 현재 경로와 리다이렉트할 URL 비교 const normalizedFinalUrl = finalIntroUrl.split('?')[0] // 쿼리스트링 제외 const currentPath = to.path - const isSamePath = !isExternalUrl && (currentPath === normalizedFinalUrl) - + const isSamePath = !isExternalUrl && currentPath === normalizedFinalUrl + if (!isSamePath) { // 다른 경로에서 접근한 경우에만 리다이렉트 const queryString = to.fullPath.includes('?') ? '?' + to.fullPath.split('?')[1] : '' - const redirectUrl = queryString && !finalIntroUrl.includes('?') - ? `${finalIntroUrl}${queryString}` - : finalIntroUrl - console.log("🚀 ~ pageData.global redirectUrl:", redirectUrl) + const redirectUrl = + queryString && !finalIntroUrl.includes('?') + ? `${finalIntroUrl}${queryString}` + : finalIntroUrl + console.log('🚀 ~ pageData.global redirectUrl:', redirectUrl) return navigateTo(redirectUrl, { external: isExternalUrl }) } } @@ -91,7 +97,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { pageUrl === '/' || pageUrl === `/${langCode}/` ) { - console.log("🚀 ~ pageData.global /home 리다이렉트") + console.log('🚀 ~ pageData.global /home 리다이렉트') return navigateTo(`/${langCode}/home`, { external: false }) } @@ -106,16 +112,18 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { Authorization: `Bearer ${accessToken}`, } - // 미리보기 쿼리스트링에서 파라미터 값 추출 + // 미리보기 쿼리스트링에서 파라미터 값 추출 // preview?page_seq=1&page_ver=1&lang_code=ko - const queryString = to.fullPath.includes('?') ? to.fullPath.split('?')[1] : '' + const queryString = to.fullPath.includes('?') + ? to.fullPath.split('?')[1] + : '' const urlParams = new URLSearchParams(queryString) const pageSeq = urlParams.get('page_seq') || '' const pageVer = urlParams.get('page_ver') || '' const queryLangCode = urlParams.get('lang_code') || langCode - let queryParams: Record; - let apiUrl: string; + let queryParams: Record + let apiUrl: string if (pageUrl === '/preview') { apiUrl = `${stoveApiBaseUrl}/pub-comm/v1.0/template/page/preview` queryParams = { @@ -124,7 +132,6 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { page_ver: pageVer, _t: Date.now().toString(), // 캐시 무효화를 위한 타임스탬프 } - } else { apiUrl = `${stoveApiBaseUrl}/pub-comm/v2.0/template/page` queryParams = { @@ -158,7 +165,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { } // 404 에러 코드 체크 - const isNotFoundError = + const isNotFoundError = (response?.code === 91002 && response?.message === 'Invalid LangCode') || response?.code === 91003 || response?.code === 90004 From e6382f9f69dd85e3f6bc322256bdd19d0aa8b42a Mon Sep 17 00:00:00 2001 From: clkim Date: Tue, 9 Dec 2025 19:02:37 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix.=20=EA=B2=8C=EC=9E=84=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=ED=8A=B8=20=EB=B2=84=ED=8A=BC=20platform,=20os=20?= =?UTF-8?q?=EB=B6=84=EA=B8=B0=20=EB=A1=9C=EC=A7=81=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/components/blocks/Button/Launcher.vue | 80 ++++++++++++++--- layers/components/layouts/Header.vue | 90 +++----------------- layers/templates/FxDownload01/index.vue | 2 +- 3 files changed, 82 insertions(+), 90 deletions(-) diff --git a/layers/components/blocks/Button/Launcher.vue b/layers/components/blocks/Button/Launcher.vue index c9edde2..1f97cdf 100644 --- a/layers/components/blocks/Button/Launcher.vue +++ b/layers/components/blocks/Button/Launcher.vue @@ -1,5 +1,6 @@ @@ -100,14 +158,14 @@ const handleClick = () => { diff --git a/layers/components/layouts/Header.vue b/layers/components/layouts/Header.vue index c4c5c7e..b782288 100644 --- a/layers/components/layouts/Header.vue +++ b/layers/components/layouts/Header.vue @@ -6,26 +6,18 @@ import type { GameDataMenuChildren, GameDataResourceGroup, GameDataResourceGroupSet, - PlatformTransformType, } from '#layers/types/api/gameData' const MORE_WIDTH = 72 const START_WIDTH_MARGIN = 40 -const PLATFORM_LABEL_KEY: Record = { - pc: 'PC', - google_play: 'Google Play', - app_store: 'App Store', -} as const const route = useRoute() const { tm } = useI18n() const { width } = useWindowSize() -const device = useDevice() const gameDataStore = useGameDataStore() const pageDataStore = usePageDataStore() const scrollStore = useScrollStore() const breakpoints = useResponsiveBreakpoints() -const modalStore = useModalStore() const { gameData } = storeToRefs(gameDataStore) const { pageLayoutType } = storeToRefs(pageDataStore) @@ -55,16 +47,8 @@ const start1depthData = computed( const start2depthData = computed( () => gnbData.value?.buttons[1]?.button_json as GameDataResourceGroupSet ) -const supportedPlatforms = computed( - () => - getSupportedPlatforms( - gameData.value?.platform_type, - gameData.value?.os_type - ) as PlatformTransformType[] -) -const isStartPCVisible = computed(() => { - return device.isDesktop && gameData.value?.platform_type !== '2' -}) + +console.log('start2depthData', start2depthData.value) // 자식 중 활성 링크 존재 여부 확인 const hasActiveChild = (children?: GameDataMenuChildren) => { @@ -158,52 +142,6 @@ const has2depthButton = (gnbItem: GameDataMenu) => { return gnbItem.children && Object.keys(gnbItem.children).length > 0 } -const highlight = (text: string) => `${text}` - -const tmWithGameName = (key: string): string => { - const raw = tm(key) - if (typeof raw !== 'string') return '' - - const withName = raw.replace( - /%게임명%/g, - highlight(gameData.value?.game_name || '') - ) - - const platformLines = supportedPlatforms.value - .map(platform => highlight(PLATFORM_LABEL_KEY[platform] as string)) - .filter(Boolean) - - return platformLines.length - ? `${withName}

${platformLines.join('
')}` - : withName -} - -const showNotSupportedOSAlert = () => { - return modalStore.handleOpenAlert({ - contentText: tmWithGameName('Alert_Not_SupportedOS'), - }) -} - -const handleStartClick = () => { - if (isStartPCVisible.value) return - - const target = device.isAndroid - ? 'google_play' - : device.isApple - ? 'app_store' - : null - - if (!target || !supportedPlatforms.value.includes(target)) { - showNotSupportedOSAlert() - return - } - - const url = gameData.value?.market_json?.[target]?.url || '' - if (!url) return showNotSupportedOSAlert() - - window.open(url, '_blank') -} - onMounted(() => { overflowCount.value = 0 isMounted.value = true @@ -263,14 +201,14 @@ onMounted(() => {