From 1ed08d1e34aff2b9ce7dd90a447c935cf535cc1c Mon Sep 17 00:00:00 2001 From: zenn Date: Thu, 2 Apr 2026 18:26:18 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=B4=EB=A6=AC=EC=8A=A4:=20v1.4.5=20?= =?UTF-8?q?=ED=94=84=EB=9F=B0=ED=8A=B8=20=EB=82=B4=EB=B6=80=20=EB=AA=85?= =?UTF-8?q?=EC=B9=AD=20=EC=A0=95=EB=A6=AC=201=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/history.md | 3 ++ docs/todo.md | 1 + docs/update.md | 4 ++ frontend/src/App.vue | 12 +++--- frontend/src/views/GameHubView.vue | 19 +++++----- frontend/src/views/HomeView.vue | 52 +++++++++++++------------- frontend/src/views/MyTierListsView.vue | 2 +- frontend/src/views/TierEditorView.vue | 36 +++++++++--------- 8 files changed, 68 insertions(+), 61 deletions(-) diff --git a/docs/history.md b/docs/history.md index 8fc08ec..3ef053a 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,5 +1,8 @@ # 의사결정 이력 +## 2026-04-02 v1.4.5 +- 내부 리네이밍은 한 번에 API와 DB까지 건드리기보다, 홈·주제 화면·에디터처럼 영향 범위가 비교적 명확한 프런트 핵심 흐름부터 `game` 의존 이름을 줄여 나가는 편이 더 안전하다고 판단했다. + ## 2026-04-02 v1.4.4 - 용어 정리 마무리 단계에서는 눈에 잘 띄는 영어 헤더를 그대로 두기보다, 홈과 관리자처럼 진입 빈도가 높은 화면의 상단 라벨까지 한국어로 맞춰야 전체 제품 인상이 더 자연스럽다고 판단했다. diff --git a/docs/todo.md b/docs/todo.md index cb2cc62..4196d8b 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -1,6 +1,7 @@ # 할 일 및 이슈 ## 단기 확인 +- 내부 리네이밍 1단계로 홈/주제 화면/에디터/App 셸의 로컬 상태명은 먼저 정리했으므로, 다음 단계에서는 관리자 내부 `selectedGame / selectedGameId / games` 묶음을 같은 기준으로 옮긴다. - 화면/문서 층의 용어 정리는 거의 마무리됐으므로, 다음 단계에서는 내부 `gameId / games` 모델을 정말 `topic / template` 쪽으로 옮길지 범위를 먼저 정리한다. - 관리자 화면까지 포함한 사용자 노출 `게임` 문구를 3차까지 정리했으므로, 실제 운영 흐름에서 뜨는 확인창/토스트/선택 모달까지 표현이 자연스러운지 한 번 더 QA한다. - 왼쪽 사이드 메뉴와 각 화면 타이틀을 한글 기준으로 맞췄으므로, 홈/나의 티어표/즐겨찾기/설정 진입 시 실제 체감이 자연스럽고 중복 표현이 어색하지 않은지 한 번 더 QA한다. diff --git a/docs/update.md b/docs/update.md index 1ae7dce..585c893 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,9 @@ # 업데이트 로그 +## 2026-04-02 v1.4.5 +- 내부 리네이밍 1단계를 시작해 홈, 주제 화면, 티어표 편집기, 앱 셸에서 `games / gameId / gameName` 중심의 로컬 상태명을 `templates / topicId / templateId / templateName` 계열로 먼저 정리했다. +- 경로와 API는 그대로 둔 채 프런트 내부에서 자주 읽는 상태명부터 바꿔, 이후 `/games` 라우트와 관리자 상태를 손볼 때 의미 충돌이 덜 나도록 기반을 만들었다. + ## 2026-04-02 v1.4.4 - 홈 화면 `Topic Library`와 일부 영어 헤더를 `주제 선택 / 티어표 / 관리자 작업실 / 티어표 만들기 / 작업 공간`으로 정리해, 화면 타이틀과 상단 레이블까지 한국어 기준으로 거의 통일했다. diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 398fb19..07c8b78 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -134,8 +134,8 @@ const isGuideNextDisabled = computed(() => guideStepIndex.value >= guideSteps.le const isLightTheme = computed(() => themeMode.value === 'light') const themeToggleLabel = computed(() => (isLightTheme.value ? '다크 모드' : '라이트 모드')) const showSettingsThemePanel = computed(() => false && route.name === 'profile') -const showGameHubViewToggle = computed(() => route.name === 'gameHub') -const gameHubViewMode = computed(() => (route.query.view === 'list' ? 'list' : 'grid')) +const showTopicViewToggle = computed(() => route.name === 'gameHub') +const topicViewMode = computed(() => (route.query.view === 'list' ? 'list' : 'grid')) const leftBottomPrimaryAction = computed(() => { if (!authReady.value) return null if (route.name === 'home' && auth.user) { @@ -344,7 +344,7 @@ function toggleRightRail() { } } -function setGameHubViewMode(mode) { +function setTopicViewMode(mode) { if (route.name !== 'gameHub') return const nextQuery = { ...route.query } if (mode === 'list') nextQuery.view = 'list' @@ -499,11 +499,11 @@ function submitGlobalSearch() { Tier Maker
-
- -
diff --git a/frontend/src/views/GameHubView.vue b/frontend/src/views/GameHubView.vue index 2547c8a..da34ee1 100644 --- a/frontend/src/views/GameHubView.vue +++ b/frontend/src/views/GameHubView.vue @@ -9,9 +9,8 @@ const route = useRoute() const router = useRouter() const auth = useAuthStore() -const gameId = computed(() => route.params.gameId) - -const gameName = ref('') +const topicId = computed(() => route.params.gameId) +const topicName = ref('') const tierLists = ref([]) const error = ref('') const query = ref('') @@ -55,10 +54,10 @@ onMounted(async () => { async function loadTierLists() { try { const [gameRes, listRes] = await Promise.all([ - api.getGame(gameId.value), - api.searchPublicTierLists(gameId.value, query.value), + api.getGame(topicId.value), + api.searchPublicTierLists(topicId.value, query.value), ]) - gameName.value = gameRes.game?.name || gameId.value + topicName.value = gameRes.game?.name || topicId.value brokenThumbnailIds.value = {} tierLists.value = listRes.tierLists || [] } catch (e) { @@ -68,14 +67,14 @@ async function loadTierLists() { function createNew() { if (!auth.user) { - router.push(`/login?redirect=/editor/${gameId.value}/new`) + router.push(`/login?redirect=/editor/${topicId.value}/new`) return } - router.push(`/editor/${gameId.value}/new`) + router.push(`/editor/${topicId.value}/new`) } function openTierList(id) { - router.push(`/editor/${gameId.value}/${id}`) + router.push(`/editor/${topicId.value}/${id}`) } function submitSearch() { @@ -87,7 +86,7 @@ function submitSearch() {
Collection
-

{{ gameName || gameId }}

+

{{ topicName || topicId }}

이 주제의 공개 티어표를 탐색하고, 바로 새 보드를 만들어 같은 흐름으로 이어갈 수 있어요.

diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index 37d7797..fa32248 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -11,12 +11,12 @@ const route = useRoute() const router = useRouter() const auth = useAuthStore() -const items = ref([]) +const templateRecords = ref([]) const error = ref('') const loadingFavoriteId = ref('') const query = computed(() => (typeof route.query.q === 'string' ? route.query.q.trim().toLowerCase() : '')) -const games = computed(() => { - const filtered = items.value +const templates = computed(() => { + const filtered = templateRecords.value .filter((item) => item.id !== 'freeform') .filter((item) => { if (!query.value) return true @@ -33,34 +33,34 @@ const games = computed(() => { }) }) -async function loadGames() { +async function loadTemplates() { try { const data = await api.listGames() - items.value = data.games || [] + templateRecords.value = data.games || [] } catch (e) { error.value = '백엔드에 연결할 수 없어요. backend 서버가 실행 중인지 확인해주세요.' } } -onMounted(loadGames) -watch(() => auth.user?.id, loadGames) +onMounted(loadTemplates) +watch(() => auth.user?.id, loadTemplates) -function goGame(gameId) { - router.push(`/games/${gameId}`) +function openTopic(templateId) { + router.push(`/games/${templateId}`) } -async function toggleFavorite(game, event) { +async function toggleFavorite(template, event) { event?.stopPropagation() if (!auth.user) { router.push(`/login?redirect=${encodeURIComponent(route.fullPath || '/')}`) return } - if (!game?.id || loadingFavoriteId.value === game.id) return + if (!template?.id || loadingFavoriteId.value === template.id) return try { - loadingFavoriteId.value = game.id - const res = game.isFavorited ? await api.unfavoriteGame(game.id) : await api.favoriteGame(game.id) - items.value = items.value.map((entry) => (entry.id === game.id ? { ...entry, ...res.game } : entry)) + loadingFavoriteId.value = template.id + const res = template.isFavorited ? await api.unfavoriteGame(template.id) : await api.favoriteGame(template.id) + templateRecords.value = templateRecords.value.map((entry) => (entry.id === template.id ? { ...entry, ...res.game } : entry)) } catch (e) { error.value = '즐겨찾기 변경에 실패했어요.' } finally { @@ -68,15 +68,15 @@ async function toggleFavorite(game, event) { } } -function thumbUrl(g) { - return g.thumbnailSrc ? toApiUrl(g.thumbnailSrc) : '' +function templateThumbUrl(template) { + return template.thumbnailSrc ? toApiUrl(template.thumbnailSrc) : '' }