crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

commit afa292990671b64dc2598a4d390e8557bfe173d4
parent c122f9035d95123d9f479a49dc896b45d6c7b4b9
Author: Michael Camilleri <[email protected]>
Date:   Tue, 16 Jun 2026 23:49:15 +0900

Clarify removed-puzzle announcements on the Game List

This commit fixes the Game List announcement row showing a white strip
around the banner by giving the row's parent stack the same grouped
background as the list content.

The removed-share copy is now shorter and aligned with the open-puzzle
removal wording: unavailable share links show 'Puzzle Removed' with
'This puzzle was removed.', while other share-link accept failures use
the existing 'Accepting Failed' language. The pending-sync reassurance
keeps its body but now appears under 'Puzzle Unavailable', and Debug
builds force the removed-puzzle banner so the Game List treatment can be
checked directly.

Co-Authored-By: Codex GPT 5.5 <[email protected]>

Diffstat:
MCrossmate/CrossmateApp.swift | 15++++++++++++---
MCrossmate/Services/AnnouncementCenter.swift | 2+-
MCrossmate/Views/GameList/GameListView.swift | 1+
3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/Crossmate/CrossmateApp.swift b/Crossmate/CrossmateApp.swift @@ -537,9 +537,9 @@ struct RootView: View { id: "share-link-join-failed", scope: .global, severity: gone ? .warning : .error, - title: gone ? "Puzzle Unavailable" : "Couldn't Join Puzzle", + title: gone ? "Puzzle Removed" : "Accepting Failed", body: gone - ? "This puzzle is no longer available — the person who shared it deleted or left the game." + ? "This puzzle was removed." : error.localizedDescription, dismissal: .manual )) @@ -547,6 +547,16 @@ struct RootView: View { } } await services.start(appDelegate: appDelegate) +#if DEBUG + services.announcements.post(Announcement( + id: "debug-share-link-join-failed", + scope: .global, + severity: .warning, + title: "Puzzle Removed", + body: "This puzzle was removed.", + dismissal: .manual + )) +#endif } .onOpenURL { url in if let id = services.importService.importGame(from: url) { @@ -965,7 +975,6 @@ private struct PuzzleDisplayView: View { for announcement in OpenPuzzleBanner.announcements(for: openState) { services.announcements.post(announcement) } - if isShared && preferences.isICloudSyncEnabled { services.syncMonitor.note( "PuzzleDisplay[\(gameID.uuidString.prefix(8))]: loaded shared roster" diff --git a/Crossmate/Services/AnnouncementCenter.swift b/Crossmate/Services/AnnouncementCenter.swift @@ -119,7 +119,7 @@ extension Announcement { id: "share-join-pending-sync", scope: .global, severity: .info, - title: "Almost There", + title: "Puzzle Unavailable", body: "This puzzle is still syncing and will appear in your list shortly.", dismissal: .transient(after: 6) ) diff --git a/Crossmate/Views/GameList/GameListView.swift b/Crossmate/Views/GameList/GameListView.swift @@ -68,6 +68,7 @@ struct GameListView: View { } content(usesRoomierType: usesRoomierType(for: geometry.size)) } + .background(Color(.systemGroupedBackground)) .animation(.easeInOut(duration: 0.3), value: announcements.currentGlobal()) } .navigationTitle("")