Reformat (#116)
* Reformat * Prettier: Print Width 140 * SwiftFormat: Disable `organizeDeclarations` * React Helpers -> React Utils * Use bundle exec for pods * Disable Hermes in Example * Create clean.sh * Update package.json * Re-generate lockfiles * Add bundle install step to bootstrap
This commit is contained in:
@@ -5,8 +5,7 @@
|
||||
--disable andOperator
|
||||
--disable redundantReturn
|
||||
--disable wrapMultilineStatementBraces
|
||||
|
||||
--enable organizeDeclarations
|
||||
--disable organizeDeclarations
|
||||
|
||||
--enable markTypes
|
||||
|
||||
|
@@ -6,8 +6,7 @@
|
||||
// Copyright © 2020 Facebook. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef CameraBridge_h
|
||||
#define CameraBridge_h
|
||||
#pragma once
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <React/RCTViewManager.h>
|
||||
@@ -16,5 +15,3 @@
|
||||
@interface CameraBridge: RCTViewManager
|
||||
|
||||
@end
|
||||
|
||||
#endif /* CameraBridge_h */
|
||||
|
@@ -14,8 +14,6 @@ enum PermissionError: String {
|
||||
case microphone = "microphone-permission-denied"
|
||||
case camera = "camera-permission-denied"
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
return rawValue
|
||||
}
|
||||
@@ -39,8 +37,6 @@ enum ParameterError {
|
||||
case unsupportedInput(inputDescriptor: String)
|
||||
case invalidCombination(provided: String, missing: String)
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
switch self {
|
||||
case .invalid:
|
||||
@@ -84,8 +80,6 @@ enum DeviceError: String {
|
||||
case focusNotSupported = "focus-not-supported"
|
||||
case notAvailableOnSimulator = "camera-not-available-on-simulator"
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
return rawValue
|
||||
}
|
||||
@@ -120,8 +114,6 @@ enum FormatError {
|
||||
case invalidFormat
|
||||
case invalidPreset(preset: String)
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
switch self {
|
||||
case .invalidFormat:
|
||||
@@ -156,8 +148,6 @@ enum SessionError {
|
||||
case audioSessionSetupFailed(reason: String)
|
||||
case audioInUseByOtherApp
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
switch self {
|
||||
case .cameraNotReady:
|
||||
@@ -192,8 +182,6 @@ enum CaptureError {
|
||||
case invalidPhotoCodec
|
||||
case unknown(message: String? = nil)
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
switch self {
|
||||
case .invalidPhotoFormat:
|
||||
@@ -238,8 +226,6 @@ enum CaptureError {
|
||||
enum SystemError: String {
|
||||
case noManager = "no-camera-manager"
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
return rawValue
|
||||
}
|
||||
@@ -264,8 +250,6 @@ enum CameraError: Error {
|
||||
case system(_ id: SystemError)
|
||||
case unknown(message: String? = nil)
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var code: String {
|
||||
switch self {
|
||||
case let .permission(id: id):
|
||||
|
@@ -11,8 +11,6 @@ import AVFoundation
|
||||
// MARK: - TakePhotoOptions
|
||||
|
||||
struct TakePhotoOptions {
|
||||
// MARK: Lifecycle
|
||||
|
||||
init(fromDictionary dictionary: NSDictionary) {
|
||||
if let videoCodec = dictionary.value(forKey: "videoCodec") as? String {
|
||||
self.videoCodec = AVVideoCodecType(withString: videoCodec)
|
||||
@@ -20,8 +18,6 @@ struct TakePhotoOptions {
|
||||
qualityPrioritization = dictionary.value(forKey: "qualityPrioritization") as? String
|
||||
}
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
var videoCodec: AVVideoCodecType?
|
||||
var qualityPrioritization: String?
|
||||
}
|
||||
|
@@ -32,11 +32,77 @@ private let propsThatRequireDeviceReconfiguration = ["fps",
|
||||
|
||||
// MARK: - CameraView
|
||||
|
||||
final class CameraView: UIView {
|
||||
// MARK: Lifecycle
|
||||
public final class CameraView: UIView {
|
||||
// pragma MARK: React Properties
|
||||
|
||||
// props that require reconfiguring
|
||||
@objc var cameraId: NSString?
|
||||
@objc var enableDepthData = false
|
||||
@objc var enableHighResolutionCapture: NSNumber? // nullable bool
|
||||
@objc var enablePortraitEffectsMatteDelivery = false
|
||||
@objc var preset: String?
|
||||
// props that require format reconfiguring
|
||||
@objc var format: NSDictionary?
|
||||
@objc var fps: NSNumber?
|
||||
@objc var hdr: NSNumber? // nullable bool
|
||||
@objc var lowLightBoost: NSNumber? // nullable bool
|
||||
@objc var colorSpace: NSString?
|
||||
// other props
|
||||
@objc var isActive = false
|
||||
@objc var torch = "off"
|
||||
@objc var zoom: NSNumber = 0.0 // in percent
|
||||
// events
|
||||
@objc var onInitialized: RCTDirectEventBlock?
|
||||
@objc var onError: RCTDirectEventBlock?
|
||||
// zoom
|
||||
@objc var enableZoomGesture = false {
|
||||
didSet {
|
||||
if enableZoomGesture {
|
||||
addPinchGestureRecognizer()
|
||||
} else {
|
||||
removePinchGestureRecognizer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// pragma MARK: Internal Properties
|
||||
|
||||
internal var isReady = false
|
||||
/// The serial execution queue for the camera preview layer (input stream) as well as output processing (take photo and record video)
|
||||
internal let queue = DispatchQueue(label: "com.mrousavy.camera-queue", qos: .userInteractive, attributes: [], autoreleaseFrequency: .inherit, target: nil)
|
||||
// Capture Session
|
||||
internal let captureSession = AVCaptureSession()
|
||||
// Inputs
|
||||
internal var videoDeviceInput: AVCaptureDeviceInput?
|
||||
internal var audioDeviceInput: AVCaptureDeviceInput?
|
||||
// Outputs
|
||||
internal var photoOutput: AVCapturePhotoOutput?
|
||||
internal var movieOutput: AVCaptureMovieFileOutput?
|
||||
// CameraView+TakePhoto
|
||||
internal var photoCaptureDelegates: [PhotoCaptureDelegate] = []
|
||||
// CameraView+RecordVideo
|
||||
internal var recordingDelegateResolver: RCTPromiseResolveBlock?
|
||||
internal var recordingDelegateRejecter: RCTPromiseRejectBlock?
|
||||
// CameraView+Zoom
|
||||
internal var pinchGestureRecognizer: UIPinchGestureRecognizer?
|
||||
internal var pinchScaleOffset: CGFloat = 1.0
|
||||
|
||||
var isRunning: Bool {
|
||||
return captureSession.isRunning
|
||||
}
|
||||
|
||||
/// Convenience wrapper to get layer as its statically known type.
|
||||
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
|
||||
// swiftlint:disable force_cast
|
||||
return layer as! AVCaptureVideoPreviewLayer
|
||||
}
|
||||
|
||||
override public class var layerClass: AnyClass {
|
||||
return AVCaptureVideoPreviewLayer.self
|
||||
}
|
||||
|
||||
// pragma MARK: Setup
|
||||
override init(frame: CGRect) {
|
||||
override public init(frame: CGRect) {
|
||||
super.init(frame: frame)
|
||||
videoPreviewLayer.session = captureSession
|
||||
videoPreviewLayer.videoGravity = .resizeAspectFill
|
||||
@@ -80,82 +146,14 @@ final class CameraView: UIView {
|
||||
fatalError("init(coder:) is not implemented.")
|
||||
}
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
override class var layerClass: AnyClass {
|
||||
return AVCaptureVideoPreviewLayer.self
|
||||
}
|
||||
|
||||
// pragma MARK: Exported Properties
|
||||
// props that require reconfiguring
|
||||
@objc var cameraId: NSString?
|
||||
@objc var enableDepthData = false
|
||||
@objc var enableHighResolutionCapture: NSNumber? // nullable bool
|
||||
@objc var enablePortraitEffectsMatteDelivery = false
|
||||
@objc var preset: String?
|
||||
// props that require format reconfiguring
|
||||
@objc var format: NSDictionary?
|
||||
@objc var fps: NSNumber?
|
||||
@objc var hdr: NSNumber? // nullable bool
|
||||
@objc var lowLightBoost: NSNumber? // nullable bool
|
||||
@objc var colorSpace: NSString?
|
||||
// other props
|
||||
@objc var isActive = false
|
||||
@objc var torch = "off"
|
||||
@objc var zoom: NSNumber = 0.0 // in percent
|
||||
// events
|
||||
@objc var onInitialized: RCTDirectEventBlock?
|
||||
@objc var onError: RCTDirectEventBlock?
|
||||
|
||||
// pragma MARK: Private Properties
|
||||
internal var isReady = false
|
||||
/// The serial execution queue for the camera preview layer (input stream) as well as output processing (take photo and record video)
|
||||
internal let queue = DispatchQueue(label: "com.mrousavy.camera-queue", qos: .userInteractive, attributes: [], autoreleaseFrequency: .inherit, target: nil)
|
||||
// Capture Session
|
||||
internal let captureSession = AVCaptureSession()
|
||||
// Inputs
|
||||
internal var videoDeviceInput: AVCaptureDeviceInput?
|
||||
internal var audioDeviceInput: AVCaptureDeviceInput?
|
||||
// Outputs
|
||||
internal var photoOutput: AVCapturePhotoOutput?
|
||||
internal var movieOutput: AVCaptureMovieFileOutput?
|
||||
// CameraView+TakePhoto
|
||||
internal var photoCaptureDelegates: [PhotoCaptureDelegate] = []
|
||||
// CameraView+RecordVideo
|
||||
internal var recordingDelegateResolver: RCTPromiseResolveBlock?
|
||||
internal var recordingDelegateRejecter: RCTPromiseRejectBlock?
|
||||
// CameraView+Zoom
|
||||
internal var pinchGestureRecognizer: UIPinchGestureRecognizer?
|
||||
internal var pinchScaleOffset: CGFloat = 1.0
|
||||
|
||||
@objc var enableZoomGesture = false {
|
||||
didSet {
|
||||
if enableZoomGesture {
|
||||
addPinchGestureRecognizer()
|
||||
} else {
|
||||
removePinchGestureRecognizer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isRunning: Bool {
|
||||
return captureSession.isRunning
|
||||
}
|
||||
|
||||
/// Convenience wrapper to get layer as its statically known type.
|
||||
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
|
||||
// swiftlint:disable force_cast
|
||||
return layer as! AVCaptureVideoPreviewLayer
|
||||
}
|
||||
|
||||
override func removeFromSuperview() {
|
||||
override public func removeFromSuperview() {
|
||||
ReactLogger.log(level: .info, message: "Removing Camera View...")
|
||||
captureSession.stopRunning()
|
||||
super.removeFromSuperview()
|
||||
}
|
||||
|
||||
// pragma MARK: Props updating
|
||||
override final func didSetProps(_ changedProps: [String]!) {
|
||||
override public final func didSetProps(_ changedProps: [String]!) {
|
||||
ReactLogger.log(level: .info, message: "Updating \(changedProps.count) prop(s)...")
|
||||
let shouldReconfigure = changedProps.contains { propsThatRequireReconfiguration.contains($0) }
|
||||
let shouldReconfigureFormat = shouldReconfigure || changedProps.contains("format")
|
||||
|
@@ -6,7 +6,7 @@
|
||||
// Copyright © 2020 Facebook. All rights reserved.
|
||||
//
|
||||
|
||||
#import "CameraBridge.h"
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <React/RCTViewManager.h>
|
||||
|
||||
@interface RCT_EXTERN_REMAP_MODULE(CameraView, CameraViewManager, RCTViewManager)
|
||||
|
@@ -11,8 +11,6 @@ import Foundation
|
||||
|
||||
@objc(CameraViewManager)
|
||||
final class CameraViewManager: RCTViewManager {
|
||||
// MARK: Internal
|
||||
|
||||
override var methodQueue: DispatchQueue! {
|
||||
return DispatchQueue.main
|
||||
}
|
||||
|
@@ -13,16 +13,12 @@ private var delegatesReferences: [NSObject] = []
|
||||
// MARK: - PhotoCaptureDelegate
|
||||
|
||||
class PhotoCaptureDelegate: NSObject, AVCapturePhotoCaptureDelegate {
|
||||
// MARK: Lifecycle
|
||||
|
||||
required init(promise: Promise) {
|
||||
self.promise = promise
|
||||
super.init()
|
||||
delegatesReferences.append(self)
|
||||
}
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
func photoOutput(_: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
|
||||
defer {
|
||||
delegatesReferences.removeAll(where: { $0 == self })
|
||||
|
@@ -14,15 +14,11 @@ import Foundation
|
||||
* Represents a JavaScript Promise instance. `reject()` and `resolve()` should only be called once.
|
||||
*/
|
||||
class Promise {
|
||||
// MARK: Lifecycle
|
||||
|
||||
init(resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
||||
self.resolver = resolver
|
||||
self.rejecter = rejecter
|
||||
}
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
func reject(error: CameraError, cause: NSError?) {
|
||||
rejecter(error.code, error.message, cause)
|
||||
}
|
@@ -17,8 +17,6 @@ private var delegateReferences: [NSObject] = []
|
||||
// MARK: - RecordingDelegateWithCallback
|
||||
|
||||
class RecordingDelegateWithCallback: NSObject, AVCaptureFileOutputRecordingDelegate {
|
||||
// MARK: Lifecycle
|
||||
|
||||
init(callback: @escaping RCTResponseSenderBlock, resetTorchMode: @escaping () -> Void) {
|
||||
self.callback = callback
|
||||
self.resetTorchMode = resetTorchMode
|
||||
@@ -26,8 +24,6 @@ class RecordingDelegateWithCallback: NSObject, AVCaptureFileOutputRecordingDeleg
|
||||
delegateReferences.append(self)
|
||||
}
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from _: [AVCaptureConnection], error: Error?) {
|
||||
defer {
|
||||
self.resetTorchMode()
|
||||
|
@@ -138,7 +138,7 @@
|
||||
B887516125E0102000DB86D6 /* Extensions */,
|
||||
B887517225E0102000DB86D6 /* Parsers */,
|
||||
B887515C25E0102000DB86D6 /* PhotoCaptureDelegate.swift */,
|
||||
B887516D25E0102000DB86D6 /* React Helpers */,
|
||||
B887516D25E0102000DB86D6 /* React Utils */,
|
||||
B887516025E0102000DB86D6 /* VideoCaptureDelegate.swift */,
|
||||
134814211AA4EA7D00B7C361 /* Products */,
|
||||
);
|
||||
@@ -162,14 +162,14 @@
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B887516D25E0102000DB86D6 /* React Helpers */ = {
|
||||
B887516D25E0102000DB86D6 /* React Utils */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B887516E25E0102000DB86D6 /* MakeReactError.swift */,
|
||||
B887516F25E0102000DB86D6 /* ReactLogger.swift */,
|
||||
B887517025E0102000DB86D6 /* Promise.swift */,
|
||||
);
|
||||
path = "React Helpers";
|
||||
path = "React Utils";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B887517225E0102000DB86D6 /* Parsers */ = {
|
||||
|
Reference in New Issue
Block a user