fix(login): add close button and drop passkey note from sign-in sheet - #513
Conversation
The sign-in sheet had no visible way to close it, so users hit by an expired session thought the app was stuck (#493). Add a close button to the header; it dismisses the sheet the same way Esc does, so the existing onDisappear path still cancels the attempt and rolls back cookies. Remove the "Passkey sign-in is not available in this window" note. Users read it as a malfunction (#496), and Google already falls back to password sign-in because of the passkey suppression script. Drop the string from the catalog and every .lproj mirror, and update ADR-0033 to match. Fixes #493 Fixes #496
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
It auto-closes issue #496 despite explicitly leaving that issue’s requested passkey behavior unresolved.
Get a fresh assessment by requesting another Copilot review.
Review effort: Balanced
Findings: 1
What changed in this PR
Adds a visible dismissal control to the login sheet and removes misleading passkey messaging.
Changes:
- Adds an accessible close button using the existing dismissal and rollback path.
- Removes the passkey note and synchronized translations.
- Updates ADR-0033 to document the decision.
| File | Description |
|---|---|
Sources/Kaset/Views/LoginSheet.swift |
Adds the close button and removes the note. |
Sources/Kaset/Resources/Localizable.xcstrings |
Removes the passkey localization entry. |
Sources/Kaset/Resources/ar.lproj/Localizable.strings |
Removes the Arabic translation. |
Sources/Kaset/Resources/de.lproj/Localizable.strings |
Removes the German translation. |
Sources/Kaset/Resources/es.lproj/Localizable.strings |
Removes the Spanish translation. |
Sources/Kaset/Resources/fr.lproj/Localizable.strings |
Removes the French translation. |
Sources/Kaset/Resources/id.lproj/Localizable.strings |
Removes the Indonesian translation. |
Sources/Kaset/Resources/it.lproj/Localizable.strings |
Removes the Italian translation. |
Sources/Kaset/Resources/ja.lproj/Localizable.strings |
Removes the Japanese translation. |
Sources/Kaset/Resources/ko.lproj/Localizable.strings |
Removes the Korean translation. |
Sources/Kaset/Resources/nl.lproj/Localizable.strings |
Removes the Dutch translation. |
Sources/Kaset/Resources/pl.lproj/Localizable.strings |
Removes the Polish translation. |
Sources/Kaset/Resources/pt.lproj/Localizable.strings |
Removes the Portuguese translation. |
Sources/Kaset/Resources/ru.lproj/Localizable.strings |
Removes the Russian translation. |
Sources/Kaset/Resources/sv.lproj/Localizable.strings |
Removes the Swedish translation. |
Sources/Kaset/Resources/tr.lproj/Localizable.strings |
Removes the Turkish translation. |
Sources/Kaset/Resources/uk.lproj/Localizable.strings |
Removes the Ukrainian translation. |
Sources/Kaset/Resources/zh-Hans.lproj/Localizable.strings |
Removes the Simplified Chinese translation. |
Sources/Kaset/Resources/zh-Hant.lproj/Localizable.strings |
Removes the Traditional Chinese translation. |
docs/adr/0033-login-passkey-suppression.md |
Documents why passkey messaging was removed. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Description
Adds a close button to the sign-in sheet and removes the passkey note from its header.
The sheet had no visible way to close it. When a session expired, users thought the app was stuck; Esc worked, but nothing on screen said so. The passkey note ("Passkey sign-in is not available in this window…") was read as a bug report waiting to happen, and Google already falls back to password sign-in because of the passkey suppression script (ADR-0033).
AI Prompt (Optional)
🤖 AI Prompt Used
AI Tool: Claude Code
Type of Change
Related Issues
Fixes #493
Fixes #496
Changes Made
LoginSheetheader: added anxmark.circle.fillclose button (same style asRefinePlaylistSheet). It callsdismiss(), the same path as Esc, soonDisappearstill cancels the login attempt and rolls back cookies. No auth logic changed.Localizable.xcstringsand all 17 translated.lproj/Localizable.stringsmirrors.Testing
LocalizationCatalogParityTests,AppLocalizationTests,LoginPasskeySuppressionTests(37 tests)The full
swift test --skip KasetUITestsrun showed failures in queue-enrichment, scrobbling-mix, playlist-rollback, and player-race tests (49 on one run, 56 on the next). Those suites pass when run on their own (125 tests), so they look like timing flakiness under load rather than anything touched here.Checklist
swiftlint --strict && swiftformat .Additional Notes