Skip to content

fix(session): 회원 앱 세션 복구 첫 설정·계정 전환 리셋·404 화면 정리 - #2647

Merged
subin21cc merged 9 commits into
mainfrom
fix/member-session-routing
Sep 30, 2026
Merged

subin21cc merged 9 commits into
mainfrom
fix/member-session-routing

Conversation

@subin21cc

@subin21cc subin21cc commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • 앱을 다시 켜 세션이 복구된 회원도 첫 설정이 남았으면 /onboarding 으로 간다(fix(account): 한 번 놓치면 다시 열리지 않는 첫 설정 온보딩 #1927 에서 빠졌던 복구 경로).
  • 첫 설정 기기 기록(onboarding_done)을 지금 세션 계정의 것으로 좁혀, 앞 계정의 기록을 보고 새 계정을 홈으로 보내지 않는다.
  • 계정 전환 리셋에 기록 시작일(recordSpanProvider)·주간 피드백 나중에 표시·코칭 시트 본 카드 수를 등록해, 앞 계정 값이 새 계정 화면에 남지 않는다.
  • 회원 앱에 없는 주소용 404 화면을 두고 홈으로/로그인하러 가기 로 돌아가게 한다.

Changes

✨ Features

  • NotFoundPage(app/router/not_found_page.dart) 신규, GoRouter.errorBuilder 에 연결 — 로그인·데모면 대시보드, 아니면 로그인 화면으로 보내는 버튼
  • ko/en ARB 에 notFoundTitle·notFoundMessage·notFoundGoHome·notFoundGoSignIn 추가, 생성 파일 갱신

🔧 Improvements

  • 첫 설정 판단(first_run_route.dart)이 provider 를 읽는 함수를 받도록 넓힘 — 로그인 화면(컨테이너)과 라우터 provider(Ref)가 같은 규칙을 씀. 기존 firstRouteAfterSignIn·rememberFirstRunDone 호출은 그대로
  • AppPrefs.forgetOnboardingDone() — 첫 설정 기록만 지우는 메서드(홈 가이드·언어는 유지)

🎨 UI/UX

  • 없는 주소에서 go_router 기본 영어 오류 화면 대신 흰 바탕 가운데 oncare_ui AppEmptyState(연결 끊김 아이콘·제목·안내·버튼)가 뜸. 주소창은 그대로

📝 Docs

  • frontend/flutter/docs/SESSION_PROVIDER_AUDIT.md 에 recordSpanProvider·weeklyFeedbackDismissedProvider·coachingSeenCountProvider 추가

🐛 Fixes

  • 라우터 provider 가 세션 전이 중 복구(unknown → authenticated)만 골라 첫 설정 여부를 판단하고, 판단 사이 세션(토큰)이 그대로일 때만 /onboarding 으로 옮김. 로그인 경로는 기존대로 로그인 화면이 맡고, 데모는 묻지 않음
  • SessionController 가 계정 경계(로그인으로 새 토큰 수신, 로그아웃·실행 중 만료로 세션 종료, 복구 중 만료 확인)에서 첫 설정 기기 기록을 지움. 같은 토큰으로 되살아나는 복구에서는 이어 씀
  • sessionFeatureResetOverride() 에 recordSpanProvider·weeklyFeedbackDismissedProvider·coachingSeenCountProvider 등록

Commits

  1. d52b248f0 fix(session): 계정 전환 리셋에 기록 시작일·코칭 표시 상태 등록
  2. 40795cc28 fix(account): 첫 설정 기기 기록의 계정 경계 정리
  3. 97cbf514b fix(account): 세션 복구 뒤 첫 설정 온보딩 연결
  4. 563c04db4 feat(router): 회원 앱 없는 주소용 404 화면 추가

Notes

  • 복구 뒤에는 가드가 먼저 홈을 세우고, 프로필을 읽은 다음 첫 설정으로 옮긴다 — 로그인 경로와 같은 순서라 첫 설정이 남은 회원에게는 홈이 잠깐 보인다.
  • 첫 설정 기기 기록을 계정 경계에서 지우므로, 로그아웃 뒤 같은 계정으로 다시 로그인하면서 프로필 조회까지 실패하면 첫 설정이 한 번 더 뜰 수 있다. 확실하지 않을 때 새 계정을 홈으로 보내는 것보다 묻는 쪽을 골랐다.
  • 목업(LocalApiInterceptor 의 /users/me·프로필·/me/records/span)과 실서버(dio) 모두 같은 provider 를 거치므로 한 경로로 둘 다 맞는다. 백엔드 변경 없음.
  • 기록을 새로 남기거나 지울 때 recordSpanProvider 를 다시 읽는 일은 이 PR 범위가 아니다(리셋 등록만).
  • chore(trainer): 개인 운동 트레이너 피드백 저장 경로·표시·추천 신호 정리 #2623·feat(exercise): 지난 날짜 개인운동 소급 체크와 직접 기록한 운동 카드·하루 상세 #2558 과 frontend/flutter/lib/l10n/app_en.arb·app_ko.arb(및 생성 l10n 파일)가 겹친다. 새 키는 파일 앞쪽(appTitle 다음)에 넣어 충돌 범위를 줄였다.

Screenshots (Optional)

Before After
go_router 기본 Page Not Found 영어 화면 흰 바탕 가운데 "페이지를 찾을 수 없어요" 안내 + 홈으로 버튼

Test Plan

  • CI 에서 flutter analyze·flutter test·UI 하드코딩 가드 통과 확인
  • 복구 전이 판별, 복구 뒤 이동 규칙(첫 설정/홈/세션 변경/프로필 실패), 라우터 provider 연결 테스트 통과
  • 세션 컨트롤러의 첫 설정 기기 기록 정리(로그인·로그아웃·만료·일시 실패·데모) 테스트 통과
  • 계정 전환 리셋 뒤 기록 시작일 재조회·물림 표시·코칭 배지 복원 테스트 통과
  • 404 화면 ko/en 문구, 흰 바탕·빈 화면 안내, 버튼 이동(홈/로그인), 주소 유지 테스트 통과

Manual Test Steps

  1. 새 계정으로 가입 → 첫 설정 화면에서 앱을 종료 → 다시 실행: 시작 화면 뒤 첫 설정 화면이 뜬다.
  2. 첫 설정을 끝낸 계정으로 앱 재실행: 홈에 그대로 머문다.
  3. 계정 A(기록 있음)로 식단 전체 그래프 확인 → 로그아웃 → 계정 B 로 로그인: 전체 가 B 의 첫 기록일부터 그려지고, 코칭 배지가 다시 보인다.
  4. 웹 빌드에서 로그인 후 주소창에 /nope 입력: 404 안내와 홈으로 버튼이 보이고, 누르면 홈으로 간다. 영어 설정에서 영어 문구 확인.

Related Issues

Closes #2630
Closes #2632
Closes #2633

Checklist

  • 코드 리뷰 준비 완료
  • 불필요한 코드 제거
  • 하드코딩 값 점검
  • Merge 충돌 없음
  • 데모 시나리오 영향 확인

auto-dispose 가 아닌 recordSpanProvider 가 리셋 레지스트리에 없어, 계정을
바꾸면 앞 계정의 첫 기록일부터 '전체' 그래프를 그렸다. 같은 감사에서 빠진
주간 피드백 '나중에' 표시와 코칭 시트의 본 카드 수도 함께 등록한다.
세션 provider 감사 문서에 세 줄을 더한다.

Refs #2632
onboarding_done 은 기기 전체에 하나라, 앞 계정이 끝낸 기록을 보고 프로필
조회에 실패한 새 계정도 홈으로 보냈다. 로그인으로 새 토큰을 받을 때,
로그아웃·실행 중 만료로 세션을 닫을 때, 복구 중 만료가 확인될 때 이 기록만
지운다. 같은 토큰으로 되살아나는 세션 복구에서는 이어 쓴다. 홈 가이드
기록과 언어는 건드리지 않는다.

Refs #2630
첫 설정 판단은 로그인 화면에서만 불려, 가입 직후 첫 설정 폼에서 앱을 닫은
회원은 다시 켜면 시작 화면에서 곧장 홈으로 가 빈 프로필로 남았다.

라우터 provider 가 세션 전이 중 복구(unknown -> authenticated)만 골라
로그인과 같은 규칙으로 판단하고, 첫 설정이 남았고 그 사이 세션이 그대로면
/onboarding 으로 옮긴다. 판단 함수는 provider 를 읽는 함수를 받도록 넓혀
로그인 화면(컨테이너)과 라우터 provider(Ref)가 같은 규칙을 쓴다.

Refs #2630
GoRouter 에 errorBuilder 가 없어 없는 주소에서 go_router 기본 영어 오류
화면이 떴다. 흰 바탕 가운데에 oncare_ui 빈 화면 안내로 ko/en 문구를 두고,
로그인(또는 데모) 상태면 '홈으로'(대시보드), 아니면 '로그인하러 가기'로
돌아가게 한다. 주소창은 그대로 둔다.

Refs #2633
@subin21cc subin21cc added bug Something isn't working enhancement New feature or request labels Sep 30, 2026
@subin21cc subin21cc self-assigned this Sep 30, 2026
@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Repository: CSE-Sudo/on-care/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: bc6045f3-de10-4d3f-a7ba-a7436c1533aa

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@subin21cc
subin21cc merged commit a3d7af2 into main Sep 30, 2026
4 checks passed
@subin21cc
subin21cc deleted the fix/member-session-routing branch September 30, 2026 23:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

None yet

1 participant