fix issue with camera

newoffer2025
Razmig Sarkissian 5 months ago
parent 340b242665
commit 0a3606916b
  1. 89
      PadelClub/Views/Match/EditSharingView.swift

@ -5,10 +5,11 @@
// Created by Razmig Sarkissian on 03/02/2024. // Created by Razmig Sarkissian on 03/02/2024.
// //
import SwiftUI
import TipKit
import CoreTransferable import CoreTransferable
import PadelClubData import PadelClubData
import SwiftUI
import TipKit
import AVFoundation
struct EditSharingView: View { struct EditSharingView: View {
var match: Match var match: Match
@ -17,6 +18,8 @@ struct EditSharingView: View {
@State private var showCamera: Bool = false @State private var showCamera: Bool = false
@State private var newImage: UIImage? @State private var newImage: UIImage?
@State private var copied: Bool = false @State private var copied: Bool = false
@State private var cameraAuthorizationStatus: AVAuthorizationStatus = .notDetermined
@State private var showCameraAccessAlert: Bool = false
var shareMessage: String { var shareMessage: String {
shareMessage(displayRank: displayRank, displayTeamName: displayTeamTitle) shareMessage(displayRank: displayRank, displayTeamName: displayTeamTitle)
@ -32,7 +35,8 @@ struct EditSharingView: View {
} }
if let startDate = match.startDate { if let startDate = match.startDate {
locAndTime = [locAndTime, startDate.formattedAsHourMinute()].compactMap({ $0 }).joined(separator: " à ") locAndTime = [locAndTime, startDate.formattedAsHourMinute()].compactMap({ $0 })
.joined(separator: " à ")
} }
if let locAndTime, locAndTime.isEmpty == false { if let locAndTime, locAndTime.isEmpty == false {
@ -44,11 +48,21 @@ struct EditSharingView: View {
messageData.append(tournament.tournamentTitle()) 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: " ") 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) 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 { 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") return messageData.joined(separator: "\n")
} }
@ -60,8 +74,6 @@ struct EditSharingView: View {
return messageData.joined(separator: "\n") return messageData.joined(separator: "\n")
} }
var body: some View { var body: some View {
List { List {
if let newImage { if let newImage {
@ -93,7 +105,7 @@ struct EditSharingView: View {
} else { } else {
Section { Section {
RowButtonView("Prendre une photo", systemImage: "camera") { RowButtonView("Prendre une photo", systemImage: "camera") {
showCamera = true checkCameraAuthorization()
} }
} }
} }
@ -124,23 +136,40 @@ struct EditSharingView: View {
.toolbar { .toolbar {
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {
if let newImage { if let newImage {
let photo = Photo(image: Image(uiImage:newImage), caption: shareMessage) let photo = Photo(image: Image(uiImage: newImage), caption: shareMessage)
ShareLink( ShareLink(
item: photo, item: photo,
preview: SharePreview( preview: SharePreview(
photo.caption, photo.caption,
image: photo.image)) { image: photo.image)
Text("Partager") ) {
} Text("Partager")
.onAppear { }
UIPasteboard.general.string = shareMessage .onAppear {
copied = true UIPasteboard.general.string = shareMessage
} copied = true
}
} else { } else {
ShareLink("Partager", item: shareMessage) ShareLink("Partager", item: shareMessage)
} }
} }
} }
.onChange(of: displayTeamTitle) {
copied = false
}
.alert("Accès à l'appareil photo requis", isPresented: $showCameraAccessAlert) {
Button("Annuler", role: .cancel) {}
Button("Paramètres") {
if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(settingsURL)
}
}
} message: {
Text(
"Pour prendre des photos, autorisez l'accès à l'appareil photo dans les paramètres de l'application."
)
}
.navigationTitle("Préparation") .navigationTitle("Préparation")
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.toolbarBackground(.visible, for: .navigationBar) .toolbarBackground(.visible, for: .navigationBar)
@ -155,6 +184,34 @@ struct EditSharingView: View {
copied = false copied = false
} }
} }
func checkCameraAuthorization() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
self.cameraAuthorizationStatus = status
switch status {
case .authorized:
// Camera access already granted, show camera
self.showCamera = true
case .notDetermined:
// Request camera access
AVCaptureDevice.requestAccess(for: .video) { granted in
DispatchQueue.main.async {
if granted {
self.showCamera = true
} else {
self.showCameraAccessAlert = true
}
}
}
case .denied, .restricted:
// Camera access was previously denied or restricted
self.showCameraAccessAlert = true
@unknown default:
// Handle future cases
self.showCameraAccessAlert = true
}
}
} }
struct Photo: Transferable { struct Photo: Transferable {

Loading…
Cancel
Save