feat: 온보딩 화면 + 로그인 라우팅 + CustomButton 토큰화#30
Conversation
- 회원 탈퇴 요청을 authProvider로 보내 만료 토큰 refresh/retry 경로를 타게 함 - 탈퇴 성공 결과일 때만 Keychain을 정리하도록 변경 Rejected: 요청 직후 무조건 로컬 토큰 삭제 | 서버 탈퇴 실패 시 로컬/서버 상태가 갈라질 수 있어 제외
- 기존 Sources/Reducer / Sources/View 평탄 구조 제거 - LoginView, SocialCircleButtonView 를 Sources/Main/View 로 이동 (LoginFeature 은 별도 커밋에서 라우팅 변경과 함께 정리) - OnBoarding 기능과 Main 로그인 흐름을 폴더 단위로 분리해 후속 화면 확장 여지 확보
- OnBoardingFeature: Page 구조체 + 4개 페이지 데이터(타이틀/서브타이틀/ImageAsset) + currentIndex/isLastPage/currentPage/primaryButtonTitle State computed, primaryButtonTapped 액션과 delegate(.finished) - OnBoardingView: ZStack/VStack 최상위 레이아웃만 본체에 두고 extension 안에서 topSection / pageContent / titleBlock / illustration / bottomSection 으로 분리, TabView 페이지 스와이프 지원 - OnBoardingPageIndicator: 활성 pill(20×8) + 비활성 dot(8×8) Color.neutral800 ±opacity 0.4 의 인디케이터 컴포넌트 - DesignSystem ImageAsset 에 onboarding1~4 케이스 + ImageAssets.xcassets/OnBoarding 일러스트(@3x PNG) 4종 추가
- LoginFeature.DelegateAction.presentOnboarding 추가, 로그인 성공 시 delegate 발송 (loginEntity payload 없이 단일 케이스) - AuthCoordinator.AuthScreen 에 onboarding(OnBoardingFeature) 케이스 추가 - AuthCoordinator.routerAction 에서 .login(.delegate(.presentOnboarding)) 감지 시 routes.push(.onboarding(.init())) - onboarding(.delegate(.finished)) 핸들러 자리 마련 (메인 탭 연결 지점) - AuthCoordinatorView 에 onboarding 케이스 분기 추가 (navigation back 숨김)
- CustomButton.body 의 배경을 Capsule() → RoundedRectangle(cornerRadius: config.cornerRadius, style: .continuous) 로 변경 - CustomButtonConfig.primary(.large).cornerRadius 를 .full → .default 로 변경 (Figma 스펙과 일치, 하드코딩 Capsule 제거) - 이후 variant 가 추가될 때 config.cornerRadius 만 바꾸면 일괄 적용 가능
- README.md: NomadSpot 템플릿 잔재 제거하고 Picke 1:1 철학 배틀 플랫폼 소개로 재작성, OAuth 플로우 / 모듈 구조 / 빠른 시작 / OAuth 사전 등록 표 / Git 컨벤션 정리 - AGENTS.md SwiftUI 스타일 가이드에 다음 5가지 규칙 명문화: · View 분할 — body 는 최상위 레이아웃만, 영역은 extension + private func 으로 분리 (LoginView / OnBoardingView 레퍼런스) · 폰트 — .font(.system) 금지, pretendardCustomFont(textStyle:) / pretendardFont(family:size:) 사용 · 컬러 — .foregroundStyle(.neutral900) 점 단축형 사용 · 이미지 — Image(asset: .xxx) + 데이터 모델은 ImageAsset 타입 직접 보유 · 파생값 — store.primaryButtonTitle 처럼 State computed property 로 노출, View 의 private var 금지
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4f384a5172
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| case .routeAction(_, action: .onboarding(.delegate(.finished))): | ||
| // TODO: 메인 탭으로 전환하는 NavigationAction 발송 | ||
| return .none |
There was a problem hiding this comment.
Route onboarding completion to next flow
When the onboarding feature emits .delegate(.finished), the coordinator currently returns .none, so tapping the last-page CTA ("시작하기") has no effect. In the current auth flow this leaves users stuck on onboarding with no forward transition, even though the UI communicates completion; this should dispatch a concrete navigation action (or root transition) instead of a no-op.
Useful? React with 👍 / 👎.
| if loginEntity.isNewUser { | ||
| return .send(.delegate(.presentOnboarding)) | ||
| } else { | ||
| return .send(.delegate(.presentOnboarding)) |
There was a problem hiding this comment.
Use
isNewUser when deciding post-login route
Both sides of the if loginEntity.isNewUser branch send the same .delegate(.presentOnboarding) action, so returning users are routed to onboarding exactly like first-time users. This effectively ignores backend onboarding state and can force existing users through onboarding on every login; the false branch should route to the normal authenticated destination.
Useful? React with 👍 / 👎.
Summary
Reducer/,View/→Main/Reducer/,Main/View/+OnBoarding/([Onboarding] 온보딩 + 로그인/회원가입 #2).default(=2) 로 통일,Capsule()하드코딩 제거 ([Auth] 토큰 관리 + 자동 refresh #20 [Onboarding] 온보딩 + 로그인/회원가입 #2)Related Issues
변경 요약 — Issue Checklist 매핑
#2
#20
Test plan