crossmate

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

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 }