Skip to content

Commit

Permalink
Async await for Media Picker (#126)
Browse files Browse the repository at this point in the history
* Update dependencies and upgrade versions

* Update tools and tools' tests

* Update Example

* Update errors

* Update decorators

* Update bottomsheet

* Update screen

* Update deeplink

* Update components

* Added missing code

* Added mising MainActor for DeeplinkIntercepter

* Added MainActor to BottomSheet

* Small fixes

* Async await for Media Picker
  • Loading branch information
juicyfru1t authored Oct 10, 2024
1 parent 77cf062 commit 2ca2d75
Showing 1 changed file with 31 additions and 29 deletions.
60 changes: 31 additions & 29 deletions Sources/Addons/MediaPicker/ScreenShowMediaPickerAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,22 @@ public struct ScreenShowMediaPickerAction<Container: UIViewController>: ScreenAc
self.animated = animated
}

private func requestPhotosAccess(completion: @escaping (_ authorized: Bool) -> Void) {
let handler: (PHAuthorizationStatus) -> Void = { _ in
DispatchQueue.main.async {
requestPhotosAccessIfNeeded(completion: completion)
}
}

@MainActor
private func requestPhotosAccess() async -> Bool {
if #available(iOS 14, *) {
PHPhotoLibrary.requestAuthorization(for: .readWrite, handler: handler)
await PHPhotoLibrary.requestAuthorization(for: .readWrite)
} else {
PHPhotoLibrary.requestAuthorization(handler)
try? await withCheckedThrowingContinuation { continuation in
PHPhotoLibrary.requestAuthorization { _ in
continuation.resume()
}
}
}
return await requestPhotosAccessIfNeeded()
}

private func requestPhotosAccessIfNeeded(completion: @escaping (_ authorized: Bool) -> Void) {
@MainActor
private func requestPhotosAccessIfNeeded() async -> Bool {
let authorizationStatus: PHAuthorizationStatus

if #available(iOS 14, *) {
Expand All @@ -44,50 +45,50 @@ public struct ScreenShowMediaPickerAction<Container: UIViewController>: ScreenAc

switch authorizationStatus {
case .authorized, .limited:
completion(true)
return true

case .denied, .restricted:
completion(false)
return false

case .notDetermined:
requestPhotosAccess(completion: completion)
return await requestPhotosAccess()

@unknown default:
completion(false)
return false
}
}

private func requestCameraAccess(completion: @escaping (_ authorized: Bool) -> Void) {
AVCaptureDevice.requestAccess(for: .video) { _ in
DispatchQueue.main.async {
requestCameraAccessIfNeeded(completion: completion)
}
}
@MainActor
private func requestCameraAccess() async -> Bool {
await AVCaptureDevice.requestAccess(for: .video)
return await requestCameraAccessIfNeeded()
}

private func requestCameraAccessIfNeeded(completion: @escaping (_ authorized: Bool) -> Void) {
@MainActor
private func requestCameraAccessIfNeeded() async -> Bool {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
completion(true)
return true

case .denied, .restricted:
completion(false)
return false

case .notDetermined:
requestCameraAccess(completion: completion)
return await requestCameraAccess()

@unknown default:
completion(false)
return false
}
}

private func requestAccessIfNeeded(completion: @escaping (_ authorized: Bool) -> Void) {
@MainActor
private func requestAccessIfNeeded() async -> Bool {
switch mediaPicker.source {
case .photoLibrary, .savedPhotosAlbum:
requestPhotosAccessIfNeeded(completion: completion)
await requestPhotosAccessIfNeeded()

case .camera:
requestCameraAccessIfNeeded(completion: completion)
await requestCameraAccessIfNeeded()
}
}

Expand Down Expand Up @@ -148,7 +149,8 @@ public struct ScreenShowMediaPickerAction<Container: UIViewController>: ScreenAc
return completion(.containerAlreadyPresenting(container, for: self))
}

requestAccessIfNeeded { authorized in
Task { @MainActor in
let authorized = await requestAccessIfNeeded()
guard authorized else {
return completion(.mediaPickerSourceAccessDenied(for: self))
}
Expand Down

0 comments on commit 2ca2d75

Please sign in to comment.