MarketingPuzzleScreenshotView.swift (3027B)
1 import SwiftUI 2 3 @MainActor 4 struct MarketingPuzzleScreenshotView: View { 5 @State private var session: PlayerSession 6 @State private var navigationPath: [UUID] 7 private let roster: PlayerRoster 8 private let gameID: UUID 9 10 init(services: AppServices) { 11 let model = Self.makeModel() 12 _session = State(initialValue: model.session) 13 _navigationPath = State(initialValue: [model.gameID]) 14 self.gameID = model.gameID 15 self.roster = PlayerRoster( 16 previewGameID: model.gameID, 17 localName: services.preferences.name, 18 localColor: services.preferences.color, 19 remoteSelection: PlayerRoster.RemoteSelection( 20 authorID: "marketing-teammate", 21 row: 6, 22 col: 11, 23 direction: .down, 24 color: .red, 25 updatedAt: Date() 26 ) 27 ) 28 } 29 30 var body: some View { 31 NavigationStack(path: $navigationPath) { 32 Color(.systemBackground) 33 .navigationDestination(for: UUID.self) { destination in 34 if destination == gameID { 35 PuzzleView( 36 session: session, 37 roster: roster, 38 loadReplay: { .unavailable } 39 ) 40 .navigationTitle("") 41 .navigationBarTitleDisplayMode(.inline) 42 } 43 } 44 } 45 .preferredColorScheme(.light) 46 } 47 48 private static func makeModel() -> (session: PlayerSession, gameID: UUID) { 49 let source = """ 50 Title: Crossmate 51 Publisher: Collaborative Crossword App for iOS & iPadOS 52 CmVer: \(XD.currentCmVersion) 53 Author: Crossmate 54 55 56 ALTO#OGRE#PIPER 57 RAID#TREE#ADANA 58 MUNI#HOER#RAREE 59 ORACLEOFOMAHA## 60 RAS#ALMS#ADOBES 61 IT#OIL##FEE#ONO 62 BUCK#ROGER#PLAN 63 ###CROSSMATE### 64 ANAIS#ATA#ALICE 65 SIRE#RESURRECTS 66 SON#POL##AND### 67 ONEARM#SPCA#BAA 68 ##LEAPINLIZARDS 69 HAITI#PEAS#SEES 70 DANAE#ORES#ADES 71 72 73 A37. The best crossword app, perhaps ~ CROSSMATE 74 """ 75 let puzzle = try! Puzzle(xd: XD.parse(source)) 76 let game = Game(puzzle: puzzle) 77 let gameID = UUID(uuidString: "43524F53-534D-4154-452D-53484F545321")! 78 let mutator = GameMutator( 79 game: game, 80 gameID: gameID, 81 movesUpdater: nil, 82 isShared: true 83 ) 84 let session = PlayerSession(game: game, mutator: mutator) 85 for (offset, letter) in Array("CROSSMA").enumerated() { 86 game.setLetter( 87 String(letter), 88 atRow: 7, 89 atCol: 3 + offset, 90 pencil: false 91 ) 92 } 93 session.direction = .across 94 session.selectedRow = 7 95 session.selectedCol = 10 96 return (session, gameID) 97 } 98 }