Ubisam-MobileGit/tasks/043-favorites-empty-state-wrong-action.md
choiminyeong fbec743e5f TASK-043: fix empty 즐겨찾기 offering 로그아웃 instead of a way back
The FAVORITES-mode empty state ("nothing starred yet") shared its
MessageState call with the ALL-mode empty state ("account has zero
repositories"), inheriting a hardcoded 로그아웃 action that only made sense
for the latter. Gives FAVORITES-mode its own action: "전체 저장소 보기",
wired to the same onShowAllRepositories the tab row already uses.

Live bug report: "현재 화면 즐겨찾기가 안되어있는데 로그아웃할거냐는
버튼이 왜 있지?" Live-verified the fix on-device.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 22:58:05 +09:00

3.9 KiB

TASK-043: Empty 즐겨찾기 tab offered 로그아웃 instead of a way back to 전체 저장소

Status: implemented; all required checks pass; live-confirmed on the human product owner's device Owner: Claude Reviewer: Codex

Outcome

Live bug report: "현재 화면 즐겨찾기가 안되어있는데 로그아웃할거냐는 버튼이 왜 있지?" (the current screen has nothing favorited, so why is there a button asking whether to log out?). Confirmed on screen: the 즐겨찾기 tab, with zero starred repositories, showed "즐겨찾기한 저장소가 없습니다." and directly below it a green primary button labeled "로그아웃" — logging out was presented as the answer to "you have nothing starred," which makes no sense and is a jarring, semi-destructive-looking action to put in front of a user who just wants to go star something.

Root cause: RepositoryListScreen's RepositoryListUiState.Empty branch renders both of its two very different cases — "즐겨찾기 has nothing starred yet" (fixable by visiting the other tab, right above this message) and "the account itself has zero repositories" (a genuine dead end where logout really is the only remaining action) — through the same MessageState call, which requires exactly one mandatory action/label pair. The FAVORITES-mode branch reused onLogout/"로그아웃" from the ALL-mode branch below it instead of getting its own action wired up.

Scope

  • Included: feature/repositories/RepositoryListScreen.kt's RepositoryListUiState.Empty branch — split into two calls to MessageState, one per mode. FAVORITES-mode now uses onShowAllRepositories (already in scope at this call site) with a new repositories_favorites_empty_action ("전체 저장소 보기") label instead of onLogout/"로그아웃". ALL-mode (genuinely zero repositories on the account) is unchanged.
  • Excluded: MessageState itself (still single-action by design; not worth generalizing for one call site). RepositoryListViewModel — this is a pure presentation fix, the Empty state's mode field it reads already existed.

Acceptance criteria

  • 즐겨찾기 tab with zero starred repositories shows a button that reads "전체 저장소 보기", not "로그아웃".
  • Tapping it switches to the 전체 저장소 tab (reuses the same onShowAllRepositories the tab row itself already calls).
  • The genuinely-empty-account case (전체 저장소 tab, zero repositories at all) is unchanged and still offers 로그아웃.
  • Build, unit tests, and lint pass.
  • Live-confirmed on the human product owner's device: emptied 즐겨찾기 (repository had been unstarred since the last check), confirmed the button now reads "전체 저장소 보기", tapped it, confirmed it switches to 전체 저장소 and shows the full repository list.

Required checks

./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug

Evidence

  • feature/repositories/RepositoryListScreen.kt: RepositoryListUiState.Empty branch now has two MessageState calls (FAVORITES vs. everything else) instead of one shared call with a hardcoded logout action.
  • strings_repositories.xml: new repositories_favorites_empty_action = "전체 저장소 보기".
  • ./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug: BUILD SUCCESSFUL, all unit tests passing unmodified (no test exercised this exact button label), 0 lint errors.
  • Live device: installed over wireless adb. 즐겨찾기 tab (currently empty — a previously-starred repository had been unstarred since TASK-041's verification) showed "전체 저장소 보기" (screenshot); tapped it and confirmed it lands on 전체 저장소 with the full list visible (screenshot).

Known limitations

None outstanding for this task.

Review findings

None yet — pending Codex/human review.