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:
parent
390dcf0d8b
commit
fbec743e5f
@ -100,16 +100,28 @@ fun RepositoryListScreen(
|
|||||||
.modeSwipeGesture(state.mode, onShowAllRepositories, onShowFavorites),
|
.modeSwipeGesture(state.mode, onShowAllRepositories, onShowFavorites),
|
||||||
) {
|
) {
|
||||||
ModeTabs(state.mode, onShowAllRepositories, onShowFavorites)
|
ModeTabs(state.mode, onShowAllRepositories, onShowFavorites)
|
||||||
MessageState(
|
// FAVORITES-mode empty doesn't mean the account has nothing to show -- it means
|
||||||
if (state.mode == RepositoryListMode.FAVORITES) {
|
// nothing is starred *yet*, while 전체 저장소 (the other tab, right above this
|
||||||
stringResource(R.string.repositories_favorites_empty)
|
// message) is very likely non-empty. The only sensible primary action here is
|
||||||
} else {
|
// "go look at 전체 저장소 and star something", never 로그아웃 -- offering logout as
|
||||||
stringResource(R.string.repositories_empty_account, state.accountName)
|
// 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
|
||||||
stringResource(R.string.repositories_logout),
|
// left to do.
|
||||||
onLogout,
|
if (state.mode == RepositoryListMode.FAVORITES) {
|
||||||
Modifier.weight(1f),
|
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 -> {
|
is RepositoryListUiState.Error -> {
|
||||||
val needsLogin = state.type == RepositoryListError.AUTHENTICATION_EXPIRED ||
|
val needsLogin = state.type == RepositoryListError.AUTHENTICATION_EXPIRED ||
|
||||||
|
|||||||
@ -41,6 +41,7 @@
|
|||||||
<string name="repositories_tab_all">전체 저장소</string>
|
<string name="repositories_tab_all">전체 저장소</string>
|
||||||
<string name="repositories_tab_favorites">즐겨찾기</string>
|
<string name="repositories_tab_favorites">즐겨찾기</string>
|
||||||
<string name="repositories_favorites_empty">즐겨찾기한 저장소가 없습니다.</string>
|
<string name="repositories_favorites_empty">즐겨찾기한 저장소가 없습니다.</string>
|
||||||
|
<string name="repositories_favorites_empty_action">전체 저장소 보기</string>
|
||||||
<string name="repositories_favorite">즐겨찾기</string>
|
<string name="repositories_favorite">즐겨찾기</string>
|
||||||
<string name="repositories_unfavorite">즐겨찾기 해제</string>
|
<string name="repositories_unfavorite">즐겨찾기 해제</string>
|
||||||
<string name="repositories_favorited">즐겨찾기됨</string>
|
<string name="repositories_favorited">즐겨찾기됨</string>
|
||||||
|
|||||||
@ -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
|
- 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.
|
bug report or explicit direction from the human product owner.
|
||||||
- Next owner: Claude.
|
- 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.
|
||||||
|
|||||||
72
tasks/043-favorites-empty-state-wrong-action.md
Normal file
72
tasks/043-favorites-empty-state-wrong-action.md
Normal 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.
|
||||||
Loading…
x
Reference in New Issue
Block a user