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>
This commit is contained in:
최민영 2026-08-29 22:58:05 +09:00
parent 390dcf0d8b
commit fbec743e5f
4 changed files with 124 additions and 10 deletions

View File

@ -100,16 +100,28 @@ fun RepositoryListScreen(
.modeSwipeGesture(state.mode, onShowAllRepositories, onShowFavorites),
) {
ModeTabs(state.mode, onShowAllRepositories, onShowFavorites)
MessageState(
if (state.mode == RepositoryListMode.FAVORITES) {
stringResource(R.string.repositories_favorites_empty)
} else {
stringResource(R.string.repositories_empty_account, state.accountName)
},
stringResource(R.string.repositories_logout),
onLogout,
Modifier.weight(1f),
)
// FAVORITES-mode empty doesn't mean the account has nothing to show -- it means
// nothing is starred *yet*, while 전체 저장소 (the other tab, right above this
// message) is very likely non-empty. The only sensible primary action here is
// "go look at 전체 저장소 and star something", never 로그아웃 -- offering logout as
// if this were a dead end was a copy-paste leftover from the ALL-mode branch below,
// where the account genuinely has zero repositories and logout is the only thing
// left to do.
if (state.mode == RepositoryListMode.FAVORITES) {
MessageState(
stringResource(R.string.repositories_favorites_empty),
stringResource(R.string.repositories_favorites_empty_action),
onShowAllRepositories,
Modifier.weight(1f),
)
} else {
MessageState(
stringResource(R.string.repositories_empty_account, state.accountName),
stringResource(R.string.repositories_logout),
onLogout,
Modifier.weight(1f),
)
}
}
is RepositoryListUiState.Error -> {
val needsLogin = state.type == RepositoryListError.AUTHENTICATION_EXPIRED ||

View File

@ -41,6 +41,7 @@
<string name="repositories_tab_all">전체 저장소</string>
<string name="repositories_tab_favorites">즐겨찾기</string>
<string name="repositories_favorites_empty">즐겨찾기한 저장소가 없습니다.</string>
<string name="repositories_favorites_empty_action">전체 저장소 보기</string>
<string name="repositories_favorite">즐겨찾기</string>
<string name="repositories_unfavorite">즐겨찾기 해제</string>
<string name="repositories_favorited">즐겨찾기됨</string>

View File

@ -938,3 +938,32 @@ This is the append-only implementation and handoff record shared by Codex and Cl
- Next recommended task: no further design-review gaps are currently queued; awaiting the next live
bug report or explicit direction from the human product owner.
- Next owner: Claude.
## 2026-08-29 (continued) — TASK-043: empty 즐겨찾기 offered 로그아웃 instead of a way back
- Agent and role: Claude, direct continuation of the same live session. Live bug report mid-turn:
"현재 화면 즐겨찾기가 안되어있는데 로그아웃할거냐는 버튼이 왜 있지?" — reproduced immediately via
screenshot of the actual device screen.
- Commit/diff: on `claude/task-015-notifications`; `feature/repositories/RepositoryListScreen.kt`'s
`RepositoryListUiState.Empty` branch split into two `MessageState` calls;
`strings_repositories.xml` gained `repositories_favorites_empty_action`;
`tasks/043-favorites-empty-state-wrong-action.md`.
- Root cause: the FAVORITES-mode ("nothing starred yet") and ALL-mode ("account has zero
repositories") empty states shared one `MessageState` call with a single hardcoded action —
`onLogout`/"로그아웃" — that only made sense for the ALL-mode dead-end case. FAVORITES-mode
inherited it as an unrelated leftover instead of getting its own action.
- How it was fixed: FAVORITES-mode now gets its own `MessageState` call using
`onShowAllRepositories` (already passed into this composable, and already what the tab row above it
calls) with a new "전체 저장소 보기" label; ALL-mode is unchanged.
- Files changed: `feature/repositories/RepositoryListScreen.kt`, `strings_repositories.xml`,
`tasks/043-favorites-empty-state-wrong-action.md`.
- Checks and results: `./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug`
BUILD SUCCESSFUL, all existing tests passing unmodified, 0 lint errors.
- Live verification: installed over wireless `adb`. 즐겨찾기 tab, empty, now shows "전체 저장소 보기"
instead of "로그아웃"; tapping it switches to 전체 저장소 and shows the full list — screenshots at
each step.
- Review findings and resolutions: None from a separate review pass.
- Known limitations: None outstanding for this task.
- Next recommended task: no further design-review gaps currently queued; continuing to watch for live
bug reports and awaiting further direction from the human product owner.
- Next owner: Claude, continuing per the standing direction.

View File

@ -0,0 +1,72 @@
# 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
- [x] 즐겨찾기 tab with zero starred repositories shows a button that reads "전체 저장소 보기", not
"로그아웃".
- [x] Tapping it switches to the 전체 저장소 tab (reuses the same `onShowAllRepositories` the tab row
itself already calls).
- [x] The genuinely-empty-account case (전체 저장소 tab, zero repositories at all) is unchanged and
still offers 로그아웃.
- [x] Build, unit tests, and lint pass.
- [x] 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
```text
./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.