Fix/UI polish#7
Conversation
The "Resolve Conflicts" NavigationLink in the home-screen Sync Issues section shared a List row with a "Learn how to fix" Link, so a tap on either control fired both gestures — opening Safari and pushing the conflict list at the same time. Replace every "Learn how to fix" Link with a new ExternalLinkButton helper (Button + openURL + .buttonStyle(.borderless)) that consumes taps and prevents the row-wide NavigationLink gesture from co-firing. The helper adds an arrow.up.right glyph to mark external destinations and increases the hit-slop via contentShape + vertical padding. Also fixed in SyncIssuesView while in the area: - Action-button style unified: critical issues stay borderedProminent, warnings (including pendingShares) are now consistently bordered. - accessibilityElement(children: .combine) tightened to wrap only the text trio, so the link button is its own VoiceOver target. Centralized the three static documentation URLs in a DocURL enum to remove force-unwrapped URL literals from view code.
Home screen: - Drop the "VaultSync" navigation title and keep the bar inline, so the top of the list reads as content instead of chrome. - Devices list no longer shows the long Device ID under each name; the full ID stays one tap away in the device detail view. Settings → Cloud Relay: - Hide the per-device provisioning row when the device is already provisioned, so only devices that actually need attention surface. - Remove the "Retry Provisioning" button (the same action remains available from Relay Diagnostics, where advanced controls belong). Settings → This Device: - Remove the standalone Device ID display; the "Copy Device ID" button is sufficient on its own. Localization: - Add the missing Sync Issue titles and the folder-error message to en/de/zh-Hans Localizable.strings. The reported case "1 Conflict Needs Resolution" showed up untranslated; the other three issue kinds had the same gap and are fixed in the same pass.
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThis PR consolidates external link handling by introducing ChangesExternalLinkButton Refactor & Settings UX Polish
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 6 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (6 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Patch release covering the conflict-button gesture-collision fix (#6), home and settings decluttering, and the missing en/de/zh-Hans translations for the Sync Issue titles.
CHANGELOG entry for 1.3.1 covering the conflict-button gesture collision fix (#6), home-screen and settings decluttering, and the missing German/Simplified Chinese translations for the Sync Issue titles. README "What's New" updated to match.
Closes #6.
Summary
Two related fixes bundled together — a reported tap-collision bug on the home screen, plus the surrounding UI cleanup and translation gaps that surfaced while testing the fix.
Bug fix — conflict button no longer also opens Safari (#6)
SyncIssuesViewplaced aLink("Learn how to fix")and aNavigationLink("Resolve Conflicts")in the sameListrow. In SwiftUI, aNavigationLinkmakes the entire row tappable, so any tap — even directly on the link — fired both gestures: navigation and browser open.ExternalLinkButtonhelper:Button+openURL+.buttonStyle(.borderless)consumes taps and prevents the row-wide gesture from co-firing. Adds anarrow.up.rightglyph to signal external destinations and acontentShape+ vertical padding for hit-slop.Link-style spots acrossContentView,SettingsView,RelayDiagnosticsView,IgnorePatternsViewfor consistency..accessibilityElement(children: .combine)inSyncIssuesViewso the link is its own VoiceOver target..borderedProminent, warnings =.bordered(previouslypendingShareswas an outlier).DocURLenum.Home screen polish
"VaultSync"navigation title and keep the bar inline — reads as content, not chrome.Settings polish
.provisioned. Only devices that need attention surface.Translation gap
Reported case: the home-screen status
Synchronisierungsproblemeshowed"1 Conflict Needs Resolution"in English on a German locale. Root cause: the title strings for all four Sync Issue kinds were missing from everyLocalizable.strings, soNSLocalizedStringwas falling back to the key. Added 9 missing keys toen/de/zh-Hans:1 Vault Has Sync Errors/%d Vaults Have Sync ErrorsAt least one folder is currently in an error state.1 Required Device Is Disconnected/%d Required Devices Are Disconnected1 Pending Share Needs Attention/%d Pending Shares Need Attention1 Conflict Needs Resolution/%d Conflicts Need ResolutionTest plan
SubscriptionManagerTestsstill exercisesretryRelayProvisioningagainst the manager directly — the method is unchanged, only the Settings UI entry point is removed).notes.sync-conflict-20260517-143022-ABCDEFG.mdnext to a real file in a vault → wait for next poll → home screen shows the Sync Issues section → tap Resolve Conflicts → ConflictListView opens without the browser also launching.zh-Hans.Provisioned; the "Retry Provisioning" button is gone.Fix: Prevent tap-collision bug and apply UI polish
This PR fixes issue
#6, a tap-collision bug where tapping external documentation links in sync issue rows would also trigger the row's navigation action.Main Fix
Introduced a new
ExternalLinkButtoncomponent (a borderless button with an external link arrow that opens URLs viaopenURL, with proper hit-slop handling) to replace shared-rowLinkinstances. Rolled out across 5 views:ContentView(current sync error and per-vault folder error sections)SyncIssuesView(per-issue "Learn how to fix" links)RelayDiagnosticsView(relay troubleshooting links)IgnorePatternsView(filter documentation link)SettingsView(Cloud Relay troubleshooting and about links)UI Polish
.provisioned; removed standalone "Retry Provisioning" button from Settings (action remains in Relay Diagnostics)DocURLenum; updated Privacy Policy and Terms of Use links to use itLocalization
Added 9 missing localization keys for Sync Issue titles and folder-error messages across English, German, and Simplified Chinese (en/de/zh-Hans), including singular/plural variants for conflicts, pending shares, disconnected devices, and sync errors.
Test Coverage
Existing test suite passes. Manual UI test steps documented in PR.