Merge branch 'dev'
Deploy / deploy (push) Failing after 11m52s
CI / build (push) Failing after 13m19s

This commit is contained in:
ByungCheol
2026-06-27 19:41:42 +09:00
4 changed files with 16 additions and 5 deletions
+4
View File
@@ -6,10 +6,14 @@ import { setActivePinia, createPinia } from 'pinia'
const { pushMock } = vi.hoisted(() => ({ pushMock: vi.fn() }))
vi.mock('vue-router', () => ({ useRouter: () => ({ push: pushMock }) }))
// 아이디 로그인 플로우 검증용 — 운영에선 숨김(ID_LOGIN_ENABLED=false)이지만 로직은 유지되므로 켜서 테스트
vi.mock('@/config/features', () => ({ ID_LOGIN_ENABLED: true }))
vi.mock('@/api/authApi', () => ({
authApi: {
login: vi.fn(),
signupEnabled: vi.fn(() => Promise.resolve({ enabled: true })),
googleClientId: vi.fn(() => Promise.resolve({ clientId: '' })),
},
}))
+4 -3
View File
@@ -5,6 +5,7 @@ import { useAuthStore } from '@/stores/auth'
import { useUiStore } from '@/stores/ui'
import { authApi } from '@/api/authApi'
import { isNativeGoogle, nativeGoogleIdToken } from '@/native/googleAuth'
import { ID_LOGIN_ENABLED } from '@/config/features'
const auth = useAuthStore()
const ui = useUiStore()
@@ -173,7 +174,7 @@ onUnmounted(() => window.removeEventListener('keydown', onKeydown))
<button class="close" type="button" aria-label="닫기" @click="ui.closeLogin()">×</button>
<h2>로그인</h2>
<form class="form" @submit.prevent="handleLogin">
<form v-if="ID_LOGIN_ENABLED" class="form" @submit.prevent="handleLogin">
<input v-model="form.loginId" type="text" placeholder="아이디" autocomplete="username" :disabled="loading" />
<input v-model="form.password" type="password" placeholder="비밀번호" autocomplete="current-password" :disabled="loading" />
<label class="remember">
@@ -187,7 +188,7 @@ onUnmounted(() => window.removeEventListener('keydown', onKeydown))
<!-- 구글 로그인 서버에 클라이언트 ID 설정된 경우에만 노출 -->
<div v-show="googleClientId" class="google-wrap">
<div class="divider"><span>또는</span></div>
<div v-if="ID_LOGIN_ENABLED" class="divider"><span>또는</span></div>
<!-- (안드로이드): 네이티브 버튼 / ·PC: GIS 렌더 버튼 -->
<button
v-if="isNative"
@@ -211,7 +212,7 @@ onUnmounted(() => window.removeEventListener('keydown', onKeydown))
네이버로 로그인 (준비 )
</button>
<p class="links">
<p v-if="ID_LOGIN_ENABLED" class="links">
<template v-if="ui.signupEnabled">
계정이 없으신가요?
<a href="#" @click.prevent="goSignup">회원가입</a>
+5
View File
@@ -0,0 +1,5 @@
// 로그인 방식 기능 플래그.
// 구글 로그인만 운영하므로 아이디 로그인 폼 / 회원가입 UI 를 숨긴다.
// 백엔드(/api/auth/login, /api/auth/signup)는 비상용으로 그대로 유지 —
// 되돌리려면 이 값을 true 로 바꾸면 아이디 로그인/회원가입이 다시 노출된다.
export const ID_LOGIN_ENABLED = false
+3 -2
View File
@@ -4,6 +4,7 @@ import { RouterLink } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import { useUiStore } from '@/stores/ui'
import { accountApi } from '@/api/accountApi'
import { ID_LOGIN_ENABLED } from '@/config/features'
const auth = useAuthStore()
const ui = useUiStore()
@@ -296,9 +297,9 @@ onMounted(load)
<p class="tagline">슬림하게 관리하는 가계부 · 자산 · 예산</p>
<div class="cta">
<button type="button" class="btn primary" @click="ui.openLogin('/account')">로그인</button>
<button v-if="ui.signupEnabled" type="button" class="btn" @click="ui.openSignup()">회원가입</button>
<button v-if="ID_LOGIN_ENABLED && ui.signupEnabled" type="button" class="btn" @click="ui.openSignup()">회원가입</button>
</div>
<p class="cta-note">{{ ui.signupEnabled ? '로그인하면 나의 가계부 요약을 볼 수 있어요.' : '현재 회원가입이 제한되어 있습니다.' }}</p>
<p class="cta-note">{{ !ID_LOGIN_ENABLED || ui.signupEnabled ? '로그인하면 나의 가계부 요약을 볼 수 있어요.' : '현재 회원가입이 제한되어 있습니다.' }}</p>
</div>
<ul class="features">