GameRowView.swift (1989B)
1 import SwiftUI 2 3 // MARK: - Row 4 5 struct GameRowView: View { 6 let game: GameSummary 7 let shareController: ShareController 8 let usesRoomierType: Bool 9 var onResume: () -> Void = {} 10 var onLeave: () -> Void = {} 11 var onResign: () -> Void = {} 12 var onDelete: () -> Void = {} 13 @State private var isShowingShareSheet = false 14 15 var body: some View { 16 let showsUnreadBadge = game.hasUnreadOtherMoves 17 18 HStack(spacing: 12) { 19 GameListThumbnailView( 20 game: game, 21 showsUnreadBadge: showsUnreadBadge 22 ) 23 VStack(alignment: .leading, spacing: 2) { 24 HStack(spacing: 4) { 25 Text(game.title) 26 .font((usesRoomierType ? Font.headline : .subheadline).weight(.semibold)) 27 .lineLimit(1) 28 .minimumScaleFactor(0.8) 29 .truncationMode(.tail) 30 if game.isShared { 31 SharedGameSymbol() 32 } 33 } 34 GameMetadataView( 35 puzzleDate: game.puzzleDate, 36 publisher: game.publisher, 37 usesRoomierType: usesRoomierType 38 ) 39 if let date = game.updatedAt { 40 LastUpdatedView(date: date, usesRoomierType: usesRoomierType) 41 } 42 } 43 Spacer() 44 GameOverflowMenu( 45 game: game, 46 onShare: { isShowingShareSheet = true }, 47 onResume: onResume, 48 onLeave: onLeave, 49 onResign: onResign, 50 onDelete: onDelete 51 ) 52 } 53 .padding(.vertical, 4) 54 .sheet(isPresented: $isShowingShareSheet) { 55 GameShareSheet( 56 gameID: game.id, 57 title: game.title, 58 shareController: shareController 59 ) 60 } 61 } 62 }