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:
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") {