fix(reader): force menu rebuild so toggle checkmarks reflect state

Viewer Insights (and likely Subscribed/Full Width, same mechanism)
kept showing the pre-toggle checkmark in the overflow menu until the
whole view was torn down and rebuilt (navigate away and back) -
SwiftUI's macOS Menu doesn't reliably re-evaluate a Toggle's checkmark
against updated @Observable state on its own. Keying the Menu's .id()
to every toggle-backed state it displays forces a fresh rebuild
whenever any of them change.
This commit is contained in:
2026-08-14 16:08:44 +01:00
parent fa31cd707e
commit 02023cf382
@@ -127,6 +127,13 @@ struct DocumentReaderView: View {
} label: {
Image(systemName: "ellipsis.circle")
}
// SwiftUI's macOS `Menu` doesn't reliably re-evaluate a
// `Toggle`'s checkmark against updated @Observable state on
// its own without a fresh `.id()` per state combination,
// toggling Subscribed/Viewer Insights/Full Width kept
// showing the pre-toggle checkmark until the whole view was
// torn down and rebuilt (e.g. navigating away and back).
.id(menuIdentity)
}
}
.task { await viewModel.loadFullContent() }
@@ -205,6 +212,19 @@ struct DocumentReaderView: View {
}
}
/// Every toggle-backed piece of state shown as a checkmark inside
/// `menuContent` see the `.id()` comment on the `Menu` above.
private var menuIdentity: String {
[
starStore.isStarred(documentId: viewModel.documentId),
viewModel.isSubscribed,
viewModel.isPinned,
viewModel.isInsightsEnabled ?? false,
viewModel.isFullWidth,
viewModel.isEditing
].map(String.init).joined(separator: "-")
}
@ViewBuilder
private var viewerAvatars: some View {
if !viewModel.viewers.isEmpty {