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.
174 lines
5.7 KiB
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
|
|
}
|
|
|