66 lines
1.8 KiB
Swift
66 lines
1.8 KiB
Swift
import ExpoModulesCore
|
|
import Photos
|
|
|
|
public class MediaLibraryPermissionRequester: DefaultMediaLibraryPermissionRequester, EXPermissionsRequester {
|
|
public static func permissionType() -> String {
|
|
return "mediaLibrary"
|
|
}
|
|
}
|
|
|
|
public class MediaLibraryWriteOnlyPermissionRequester: DefaultMediaLibraryPermissionRequester, EXPermissionsRequester {
|
|
public static func permissionType() -> String {
|
|
return "mediaLibraryWriteOnly"
|
|
}
|
|
|
|
override internal func accessLevel() -> PHAccessLevel {
|
|
return PHAccessLevel.addOnly
|
|
}
|
|
}
|
|
|
|
public class DefaultMediaLibraryPermissionRequester: NSObject {}
|
|
|
|
extension DefaultMediaLibraryPermissionRequester {
|
|
@objc
|
|
public func requestPermissions(resolver resolve: @escaping EXPromiseResolveBlock, rejecter reject: EXPromiseRejectBlock) {
|
|
let authorizationHandler = { (_: PHAuthorizationStatus) in
|
|
resolve(self.getPermissions())
|
|
}
|
|
PHPhotoLibrary.requestAuthorization(for: self.accessLevel(), handler: authorizationHandler)
|
|
}
|
|
|
|
@objc
|
|
public func getPermissions() -> [AnyHashable: Any] {
|
|
let authorizationStatus = PHPhotoLibrary.authorizationStatus(for: self.accessLevel())
|
|
var status: EXPermissionStatus
|
|
var scope: String
|
|
|
|
switch authorizationStatus {
|
|
case .authorized:
|
|
status = EXPermissionStatusGranted
|
|
scope = "all"
|
|
case .limited:
|
|
status = EXPermissionStatusGranted
|
|
scope = "limited"
|
|
case .denied, .restricted:
|
|
status = EXPermissionStatusDenied
|
|
scope = "none"
|
|
case .notDetermined:
|
|
fallthrough
|
|
@unknown default:
|
|
status = EXPermissionStatusUndetermined
|
|
scope = "none"
|
|
}
|
|
|
|
return [
|
|
"status": status.rawValue,
|
|
"accessPrivileges": scope,
|
|
"granted": status == EXPermissionStatusGranted
|
|
]
|
|
}
|
|
|
|
@objc
|
|
internal func accessLevel() -> PHAccessLevel {
|
|
return PHAccessLevel.readWrite
|
|
}
|
|
}
|