crossmate

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

commit f56fafaf5bca7a9484029268e65878670c1bff1e
parent 338bc54aaa463dddafa63206a878c382bd28ad51
Author: Michael Camilleri <[email protected]>
Date:   Tue, 30 Jun 2026 11:39:48 +0900

Use crossmates and friends terminology consistently

Diffstat:
MCrossmate/Models/TipStore.swift | 4++--
MCrossmate/Services/AppServices.swift | 30+++++++++++++++---------------
MCrossmate/Sync/FriendController.swift | 4++--
MCrossmate/Views/Friends/FriendsView.swift | 4++--
MCrossmate/Views/GameList/GameListView.swift | 4++--
MCrossmate/Views/GameList/GameShareItem.swift | 2+-
MCrossmate/Views/Settings/SettingsView.swift | 2+-
7 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/Crossmate/Models/TipStore.swift b/Crossmate/Models/TipStore.swift @@ -49,12 +49,12 @@ enum TipCatalog { Tip( id: "pick-your-colour", title: "Pick Your Colour", - body: "Choose your colour. Crossmate selects a different colour each time for friends." + body: "Choose your colour. A different colour is selected each time for crossmates." ), Tip( id: "get-attention", title: "Announce Your Availability", - body: "Nudge your friends from the Players menu in a shared puzzle." + body: "Nudge your crossmates from the Players menu in a shared puzzle." ), Tip( id: "be-notified", diff --git a/Crossmate/Services/AppServices.swift b/Crossmate/Services/AppServices.swift @@ -5,10 +5,10 @@ import UIKit import UserNotifications /// Fills a throwaway in-memory store with a handful of shared, in-progress -/// games and crossmates so the Game List colour strips and the friends list can +/// games and friends so the Game List colour strips and the friends list can /// be inspected in the Simulator without an iCloud account or a real opponent. /// Driven solely by the `--crossmate-seed-demo` launch argument; a normal -/// launch never reaches this. The same crossmate authorIDs are reused across +/// launch never reaches this. The same friend authorIDs are reused across /// both games on purpose, so one friend visibly takes a *different* colour in /// each game — the per-game colour derivation made visible. enum DemoSeed { @@ -36,11 +36,11 @@ enum DemoSeed { private static let filledPuzzleResource = "cm-starter-0001" /// The local user's authorID in demo mode, injected into `AuthorIdentity` - /// so the seeded crossmates classify as remote players. Kept distinct from - /// every crossmate id below. + /// so the seeded friends classify as remote players. Kept distinct from + /// every friend id below. static let localAuthorID = "_demo-you" - private static let crossmates: [(id: String, name: String)] = [ + private static let friends: [(id: String, name: String)] = [ ("_demo-alice", "Alice"), ("_demo-bob", "Bob"), ("_demo-carol", "Carol"), @@ -58,8 +58,8 @@ enum DemoSeed { guard let xd = try? XD.parse(puzzleSource) else { return } let puzzle = Puzzle(xd: xd) - for crossmate in crossmates { - seedFriend(crossmate, in: ctx) + for friend in friends { + seedFriend(friend, in: ctx) } seedGame( @@ -99,18 +99,18 @@ enum DemoSeed { } private static func seedFriend( - _ crossmate: (id: String, name: String), + _ seed: (id: String, name: String), in ctx: NSManagedObjectContext ) { let friend = FriendEntity(context: ctx) - friend.authorID = crossmate.id + friend.authorID = seed.id friend.createdAt = Date() - friend.displayName = crossmate.name + friend.displayName = seed.name friend.displayNameVersion = 0 friend.isBlocked = false friend.nickname = "" friend.nicknameVersion = 0 - friend.pairKey = "demo-pair-\(crossmate.id)" + friend.pairKey = "demo-pair-\(seed.id)" } @discardableResult @@ -136,7 +136,7 @@ enum DemoSeed { let player = PlayerEntity(context: ctx) player.game = game player.authorID = authorID - player.name = crossmates.first { $0.id == authorID }?.name + player.name = friends.first { $0.id == authorID }?.name player.ckRecordName = "demo-player-\(title)-\(authorID)" player.updatedAt = Date() } @@ -144,7 +144,7 @@ enum DemoSeed { } /// Fills a realistic share of `game`'s grid with correct letters, handing - /// each cell to one of the four demo players (you + the three crossmates) + /// each cell to one of the four demo players (you + the three friends) /// in small diagonal patches and leaving scattered gaps so the puzzle reads /// as in-progress. One `MovesEntity` per author carries that author's cells, /// exactly as a real co-solve would, so `GridStateMerger` rebuilds the @@ -155,7 +155,7 @@ enum DemoSeed { puzzle: Puzzle, in ctx: NSManagedObjectContext ) { - let authors = [localAuthorID] + crossmates.map(\.id) + let authors = [localAuthorID] + friends.map(\.id) let now = Date() var cellsByAuthor: [String: [GridPosition: TimestampedCell]] = [:] @@ -399,7 +399,7 @@ final class AppServices { self.eventLog = eventLog // `--crossmate-seed-demo` (set in the Run scheme's arguments) brings the // app up against a throwaway in-memory store pre-filled with a couple of - // shared games and a few crossmates, purely so the Game List colour + // shared games and a few friends, purely so the Game List colour // strips and the friends list can be eyeballed in the Simulator without // iCloud. It never touches the real on-disk store. let isDemoSeed = ProcessInfo.processInfo.arguments.contains("--crossmate-seed-demo") diff --git a/Crossmate/Sync/FriendController.swift b/Crossmate/Sync/FriendController.swift @@ -812,9 +812,9 @@ extension FriendController.FriendError: LocalizedError { var errorDescription: String? { switch self { case .invalidShareRecord: - return "The friendship record in iCloud is invalid." + return "The crossmate record in iCloud is invalid." case .missingShareURL, .missingShareURLInPayload: - return "The friendship share link is missing." + return "The crossmate share link is missing." case .participantNotFound: return "That player could not be found in iCloud." case .friendNotFound: diff --git a/Crossmate/Views/Friends/FriendsView.swift b/Crossmate/Views/Friends/FriendsView.swift @@ -7,12 +7,12 @@ struct FriendNewGameTarget: Identifiable, Equatable { var id: String { authorID } } -/// Sheet listing the user's (non-blocked) crossmates (friends), presented from +/// Sheet listing the user's non-blocked friends, presented from /// the game list. Friends are accumulated automatically the first time you /// collaborate with someone (see `FriendController`); the actions are renaming /// (a private nickname via `\.renameFriend`) and blocking via `\.blockFriend` /// (a reversible, server-enforced read-only downgrade on the inbox we own). -/// Blocked crossmates are intentionally hidden from this list; unblocking will +/// Blocked friends are intentionally hidden from this list; unblocking will /// live on a dedicated surface (Settings) — see TODO #10. The `\.unblockFriend` /// action and `FriendController.unblock` mechanism are already wired for it. struct FriendsView: View { diff --git a/Crossmate/Views/GameList/GameListView.swift b/Crossmate/Views/GameList/GameListView.swift @@ -34,7 +34,7 @@ struct GameListView: View { predicate: NSPredicate(format: "isBlocked == YES") ) // Drives the Invited section filter below. Pending invites from blocked - // crossmates can exist briefly until the ping cleanup path consumes them, + // friends can exist briefly until the ping cleanup path consumes them, // but the library and badge state should never surface them. private var blockedFriends: FetchedResults<FriendEntity> @@ -721,7 +721,7 @@ struct GameListView: View { private static let inviteErrorID = "invite-accept-error" private static let inviteSyncID = "invite-sync-in-progress" - /// Single-slot id for failures after starting a puzzle from the Crossmates + /// Single-slot id for failures after starting a puzzle from the friends /// sheet — scoped to the new puzzle, where the user can retry from its /// Share menu. private static let newGameInviteErrorID = "new-game-friend-invite-error" diff --git a/Crossmate/Views/GameList/GameShareItem.swift b/Crossmate/Views/GameList/GameShareItem.swift @@ -99,7 +99,7 @@ struct GameShareSheet: View { if isDirectInviteMode { Label("Link Sharing Unavailable", systemImage: "link.badge.plus") .foregroundStyle(.secondary) - Text("You've invited a friend directly. Everyone joins this puzzle the same way, so a share link isn't available.") + Text("You've invited a crossmate directly. Everyone joins this puzzle the same way, so a share link isn't available.") .font(.footnote) .foregroundStyle(.secondary) } else if !isInviteLimitReached { diff --git a/Crossmate/Views/Settings/SettingsView.swift b/Crossmate/Views/Settings/SettingsView.swift @@ -75,7 +75,7 @@ struct SettingsView: View { } header: { Text("Notifications") } footer: { - Text("Receive notifications when friends nudge you, pause playing after making changes, invite you to play, join one of your puzzles or finish a puzzle. These settings apply only to this device.") + Text("These settings apply only to this device.") } Section("Sharing") {