secant-ios-wallet/modules/Sources/Dependencies/CaptureDevice/CaptureDeviceLiveKey.swift

54 lines
1.8 KiB
Swift

//
// CaptureDeviceLiveKey.swift
// Zashi
//
// Created by Lukáš Korba on 11.11.2022.
//
import AVFoundation
import ComposableArchitecture
extension CaptureDeviceClient: DependencyKey {
public static let liveValue = Self(
isAuthorized: {
AVCaptureDevice.authorizationStatus(for: .video) == .authorized
},
isTorchAvailable: {
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else {
return false
}
return videoCaptureDevice.hasTorch
},
torch: { isTorchOn in
var device: AVCaptureDevice?
if #available(iOS 17, *) {
device = AVCaptureDevice.userPreferredCamera
} else {
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInDualWideCamera, .builtInUltraWideCamera, .builtInWideAngleCamera, .builtInTrueDepthCamera], mediaType: AVMediaType.video, position: .back)
device = deviceDiscoverySession.devices.first
}
guard let device else {
throw CaptureDeviceClientError.captureDevice
}
if device.hasTorch && device.isTorchAvailable {
do {
try device.lockForConfiguration()
if isTorchOn {
try device.setTorchModeOn(level: 1.0)
} else {
device.torchMode = .off
}
device.unlockForConfiguration()
} catch {
throw CaptureDeviceClientError.lockForConfiguration
}
} else {
throw CaptureDeviceClientError.torchUnavailable
}
}
)
}