You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
PadelClub/PadelClub/Views/Match/EditSharingView.swift

174 lines
5.7 KiB

//
// EditSharingView.swift
// Padel Tournament
//
// Created by Razmig Sarkissian on 03/02/2024.
//
import SwiftUI
import TipKit
import CoreTransferable
struct EditSharingView: View {
var match: Match
@State private var displayRank: Bool = false
@State private var displayTeamTitle: Bool = false
@State private var showCamera: Bool = false
@State private var newImage: UIImage?
@State private var copied: Bool = false
var shareMessage: String {
shareMessage(displayRank: displayRank, displayTeamName: displayTeamTitle)
}
func shareMessage(displayRank: Bool, displayTeamName: Bool) -> String {
var messageData: [String] = []
var locAndTime: String = ""
if let courtName = match.courtName() {
locAndTime.append("\(courtName)")
}
if let startDate = match.startDate {
locAndTime = locAndTime + " à " + startDate.formattedAsHourMinute()
}
if locAndTime.isEmpty == false {
messageData.append(locAndTime)
}
if let tournament = match.currentTournament() {
messageData.append(tournament.tournamentTitle())
}
let message = [match.isLoserBracket ? "Classement" : nil, match.roundTitle(), match.isLoserBracket ? nil : ((match.index > 0 || match.isGroupStage()) ? match.matchTitle(.short) : nil)].compactMap({ $0 }).joined(separator: " ")
messageData.append(message)
guard let labelOne = match.team(.one)?.teamLabelRanked(displayRank: displayRank, displayTeamName: displayTeamName), let labelTwo = match.team(.two)?.teamLabelRanked(displayRank: displayRank, displayTeamName: displayTeamName) else {
return messageData.joined(separator: "\n")
}
let players = "\(labelOne)\ncontre\n\(labelTwo)"
messageData.append(players)
return messageData.joined(separator: "\n")
}
var body: some View {
List {
if let newImage {
Section {
let tip = SharePictureTip()
TipView(tip)
.tipStyle(tint: .green)
}
Section {
ZStack {
Color.black
.ignoresSafeArea()
Image(uiImage: newImage)
.resizable()
.scaledToFit()
.frame(height: 200, alignment: .center)
.frame(maxWidth: .infinity, alignment: .center)
}
.listRowInsets(EdgeInsets())
} footer: {
HStack {
Spacer()
Button("effacer", role: .destructive) {
self.newImage = nil
}
}
}
} else {
Button {
showCamera = true
} label: {
Label("Prendre une photo", systemImage: "camera")
}
}
Section {
Toggle(isOn: $displayRank) {
Text("Afficher leurs rangs dans ce tournoi")
}
Toggle(isOn: $displayTeamTitle) {
Text("Afficher plutôt le nom de l'équipe")
}
} header: {
Text("Options")
}
Section {
Text(shareMessage)
} header: {
Text("Message type généré")
} footer: {
HStack {
Spacer()
Button {
UIPasteboard.general.string = shareMessage
copied = true
} label: {
Label(copied ? "copié" : "copier", systemImage: "doc.on.doc")
}
if shareMessage == UIPasteboard.general.string || copied == true {
Image(systemName: "checkmark")
}
}
}
}
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
if let newImage {
let photo = Photo(image: Image(uiImage:newImage), caption: shareMessage)
ShareLink(
item: photo,
preview: SharePreview(
photo.caption,
image: photo.image)) {
Text("Partager")
}
.onAppear {
UIPasteboard.general.string = shareMessage
copied = true
}
} else {
ShareLink("Partager", item: shareMessage)
}
}
}
.navigationTitle("Préparation")
.navigationBarTitleDisplayMode(.inline)
.toolbarBackground(.visible, for: .navigationBar)
.fullScreenCover(isPresented: $showCamera) {
ImagePickerView(image: $newImage)
.background(Color.black.edgesIgnoringSafeArea(.all))
}
.onChange(of: displayRank) {
copied = false
}
.onChange(of: displayTeamTitle) {
copied = false
}
}
}
struct Photo: Transferable {
static var transferRepresentation: some TransferRepresentation {
ProxyRepresentation(exporting: \.image)
ProxyRepresentation(exporting: \.caption)
}
public var image: Image
public var caption: String
}