diff --git a/build/Camera.js.map b/build/Camera.js.map index 5654d522cfbc1..6918d04554fa2 100644 --- a/build/Camera.js.map +++ b/build/Camera.js.map @@ -1 +1 @@ -{"version":3,"file":"Camera.js","sourceRoot":"","sources":["../src/Camera.tsx"],"names":[],"mappings":"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","sourcesContent":["import { UnavailabilityError } from '@unimodules/core';\nimport mapValues from 'lodash/mapValues';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { findNodeHandle, Platform, ViewPropTypes } from 'react-native';\nimport {\n CapturedPicture,\n NativeProps,\n PictureOptions,\n Props,\n RecordingOptions,\n PermissionResponse,\n} from './Camera.types';\nimport ExponentCamera from './ExponentCamera';\nimport _CameraManager from './ExponentCameraManager';\n\n// TODO: Bacon: Fix multiplatform\nconst CameraManager = _CameraManager as any;\n\nconst EventThrottleMs = 500;\n\nconst _PICTURE_SAVED_CALLBACKS = {};\n\nlet _GLOBAL_PICTURE_ID = 1;\n\nfunction ensurePictureOptions(options?: PictureOptions): PictureOptions {\n let pictureOptions = options || {};\n\n if (!pictureOptions || typeof pictureOptions !== 'object') {\n pictureOptions = {};\n }\n\n if (!pictureOptions.quality) {\n pictureOptions.quality = 1;\n }\n if (pictureOptions.onPictureSaved) {\n const id = _GLOBAL_PICTURE_ID++;\n _PICTURE_SAVED_CALLBACKS[id] = pictureOptions.onPictureSaved;\n pictureOptions.id = id;\n pictureOptions.fastMode = true;\n }\n return pictureOptions;\n}\n\nfunction ensureRecordingOptions(options?: RecordingOptions): RecordingOptions {\n let recordingOptions = options || {};\n\n if (!recordingOptions || typeof recordingOptions !== 'object') {\n recordingOptions = {};\n } else if (typeof recordingOptions.quality === 'string') {\n recordingOptions.quality = Camera.Constants.VideoQuality[recordingOptions.quality];\n }\n\n return recordingOptions;\n}\n\nfunction ensureNativeProps(options?: Props): NativeProps {\n let props = options || {};\n\n if (!props || typeof props !== 'object') {\n props = {};\n }\n\n const newProps: NativeProps = mapValues(props, convertProp);\n\n const propsKeys = Object.keys(newProps);\n // barCodeTypes is deprecated\n if (!propsKeys.includes('barCodeScannerSettings') && propsKeys.includes('barCodeTypes')) {\n console.warn(\n `The \"barCodeTypes\" prop for Camera is deprecated and will be removed in SDK 34. Use \"barCodeScannerSettings\" instead.`\n );\n newProps.barCodeScannerSettings = {\n // @ts-ignore\n barCodeTypes: newProps.barCodeTypes,\n };\n }\n\n if (props.onBarCodeScanned) {\n newProps.barCodeScannerEnabled = true;\n }\n\n if (props.onFacesDetected) {\n newProps.faceDetectorEnabled = true;\n }\n\n if (Platform.OS !== 'android') {\n delete newProps.ratio;\n delete newProps.useCamera2Api;\n }\n\n return newProps;\n}\n\nfunction convertProp(value: any, key: string): any {\n if (typeof value === 'string' && Camera.ConversionTables[key]) {\n return Camera.ConversionTables[key][value];\n }\n\n return value;\n}\n\nfunction _onPictureSaved({ nativeEvent }: { nativeEvent: { data: CapturedPicture; id: number } }) {\n const { id, data } = nativeEvent;\n const callback = _PICTURE_SAVED_CALLBACKS[id];\n if (callback) {\n callback(data);\n delete _PICTURE_SAVED_CALLBACKS[id];\n }\n}\n\nexport default class Camera extends React.Component {\n static async isAvailableAsync(): Promise {\n if (!CameraManager.isAvailableAsync) {\n throw new UnavailabilityError('expo-camera', 'isAvailableAsync');\n }\n\n return await CameraManager.isAvailableAsync();\n }\n\n static async getAvailableCameraTypesAsync(): Promise<('front' | 'back')[]> {\n if (!CameraManager.getAvailableCameraTypesAsync) {\n throw new UnavailabilityError('expo-camera', 'getAvailableCameraTypesAsync');\n }\n\n return await CameraManager.getAvailableCameraTypesAsync();\n }\n\n static Constants = {\n Type: CameraManager.Type,\n FlashMode: CameraManager.FlashMode,\n AutoFocus: CameraManager.AutoFocus,\n WhiteBalance: CameraManager.WhiteBalance,\n VideoQuality: CameraManager.VideoQuality,\n VideoStabilization: CameraManager.VideoStabilization || {},\n };\n\n // Values under keys from this object will be transformed to native options\n static ConversionTables = {\n type: CameraManager.Type,\n flashMode: CameraManager.FlashMode,\n autoFocus: CameraManager.AutoFocus,\n whiteBalance: CameraManager.WhiteBalance,\n };\n\n static propTypes = {\n ...ViewPropTypes,\n zoom: PropTypes.number,\n ratio: PropTypes.string,\n focusDepth: PropTypes.number,\n onMountError: PropTypes.func,\n pictureSize: PropTypes.string,\n onCameraReady: PropTypes.func,\n useCamera2Api: PropTypes.bool,\n onBarCodeScanned: PropTypes.func,\n barCodeScannerSettings: PropTypes.object,\n onFacesDetected: PropTypes.func,\n faceDetectorSettings: PropTypes.object,\n type: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n flashMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n videoStabilizationMode: PropTypes.number,\n whiteBalance: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n autoFocus: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]),\n };\n\n static defaultProps: Props = {\n zoom: 0,\n ratio: '4:3',\n focusDepth: 0,\n faceDetectorSettings: {},\n type: CameraManager.Type.back,\n autoFocus: CameraManager.AutoFocus.on,\n flashMode: CameraManager.FlashMode.off,\n whiteBalance: CameraManager.WhiteBalance.auto,\n };\n\n static async getPermissionsAsync(): Promise {\n return CameraManager.getPermissionsAsync();\n }\n\n static async requestPermissionsAsync(): Promise {\n return CameraManager.requestPermissionsAsync();\n }\n\n _cameraHandle?: number | null;\n _cameraRef?: React.Component | null;\n _lastEvents: { [eventName: string]: string } = {};\n _lastEventsTimes: { [eventName: string]: Date } = {};\n\n async takePictureAsync(options?: PictureOptions): Promise {\n const pictureOptions = ensurePictureOptions(options);\n\n return await CameraManager.takePicture(pictureOptions, this._cameraHandle);\n }\n\n async getSupportedRatiosAsync(): Promise {\n if (!CameraManager.getSupportedRatios) {\n throw new UnavailabilityError('Camera', 'getSupportedRatiosAsync');\n }\n\n return await CameraManager.getSupportedRatios(this._cameraHandle);\n }\n\n async getAvailablePictureSizesAsync(ratio?: string): Promise {\n if (!CameraManager.getAvailablePictureSizes) {\n throw new UnavailabilityError('Camera', 'getAvailablePictureSizesAsync');\n }\n return await CameraManager.getAvailablePictureSizes(ratio, this._cameraHandle);\n }\n\n async recordAsync(options?: RecordingOptions): Promise<{ uri: string }> {\n if (!CameraManager.record) {\n throw new UnavailabilityError('Camera', 'recordAsync');\n }\n\n const recordingOptions = ensureRecordingOptions(options);\n\n return await CameraManager.record(recordingOptions, this._cameraHandle);\n }\n\n stopRecording() {\n if (!CameraManager.stopRecording) {\n throw new UnavailabilityError('Camera', 'stopRecording');\n }\n\n CameraManager.stopRecording(this._cameraHandle);\n }\n\n pausePreview() {\n if (!CameraManager.pausePreview) {\n throw new UnavailabilityError('Camera', 'pausePreview');\n }\n\n CameraManager.pausePreview(this._cameraHandle);\n }\n\n resumePreview() {\n if (!CameraManager.resumePreview) {\n throw new UnavailabilityError('Camera', 'resumePreview');\n }\n\n CameraManager.resumePreview(this._cameraHandle);\n }\n\n _onCameraReady = () => {\n if (this.props.onCameraReady) {\n this.props.onCameraReady();\n }\n };\n\n _onMountError = ({ nativeEvent }: { nativeEvent: { message: string } }) => {\n if (this.props.onMountError) {\n this.props.onMountError(nativeEvent);\n }\n };\n\n _onObjectDetected = (callback?: Function) => ({ nativeEvent }: { nativeEvent: any }) => {\n const { type } = nativeEvent;\n if (\n this._lastEvents[type] &&\n this._lastEventsTimes[type] &&\n JSON.stringify(nativeEvent) === this._lastEvents[type] &&\n new Date().getTime() - this._lastEventsTimes[type].getTime() < EventThrottleMs\n ) {\n return;\n }\n\n if (callback) {\n callback(nativeEvent);\n this._lastEventsTimes[type] = new Date();\n this._lastEvents[type] = JSON.stringify(nativeEvent);\n }\n };\n\n _setReference = (ref?: React.Component) => {\n if (ref) {\n this._cameraRef = ref;\n // TODO: Bacon: Unify these\n if (Platform.OS === 'web') {\n this._cameraHandle = ref as any;\n } else {\n this._cameraHandle = findNodeHandle(ref);\n }\n } else {\n this._cameraRef = null;\n this._cameraHandle = null;\n }\n };\n\n render() {\n const nativeProps = ensureNativeProps(this.props);\n\n const onBarCodeScanned = this._onObjectDetected(this.props.onBarCodeScanned);\n const onFacesDetected = this._onObjectDetected(this.props.onFacesDetected);\n\n return (\n \n );\n }\n}\n\nexport const { Constants, getPermissionsAsync, requestPermissionsAsync } = Camera;\n"]} \ No newline at end of file +{"version":3,"file":"Camera.js","sourceRoot":"","sources":["../src/Camera.tsx"],"names":[],"mappings":"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","sourcesContent":["import { UnavailabilityError } from '@unimodules/core';\nimport mapValues from 'lodash/mapValues';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { findNodeHandle, Platform, ViewPropTypes } from 'react-native';\n\nimport {\n CapturedPicture,\n NativeProps,\n PictureOptions,\n Props,\n RecordingOptions,\n PermissionResponse,\n} from './Camera.types';\nimport ExponentCamera from './ExponentCamera';\nimport _CameraManager from './ExponentCameraManager';\n\n// TODO: Bacon: Fix multiplatform\nconst CameraManager = _CameraManager as any;\n\nconst EventThrottleMs = 500;\n\nconst _PICTURE_SAVED_CALLBACKS = {};\n\nlet _GLOBAL_PICTURE_ID = 1;\n\nfunction ensurePictureOptions(options?: PictureOptions): PictureOptions {\n let pictureOptions = options || {};\n\n if (!pictureOptions || typeof pictureOptions !== 'object') {\n pictureOptions = {};\n }\n\n if (!pictureOptions.quality) {\n pictureOptions.quality = 1;\n }\n if (pictureOptions.onPictureSaved) {\n const id = _GLOBAL_PICTURE_ID++;\n _PICTURE_SAVED_CALLBACKS[id] = pictureOptions.onPictureSaved;\n pictureOptions.id = id;\n pictureOptions.fastMode = true;\n }\n return pictureOptions;\n}\n\nfunction ensureRecordingOptions(options?: RecordingOptions): RecordingOptions {\n let recordingOptions = options || {};\n\n if (!recordingOptions || typeof recordingOptions !== 'object') {\n recordingOptions = {};\n } else if (typeof recordingOptions.quality === 'string') {\n recordingOptions.quality = Camera.Constants.VideoQuality[recordingOptions.quality];\n }\n\n return recordingOptions;\n}\n\nfunction ensureNativeProps(options?: Props): NativeProps {\n let props = options || {};\n\n if (!props || typeof props !== 'object') {\n props = {};\n }\n\n const newProps: NativeProps = mapValues(props, convertProp);\n\n const propsKeys = Object.keys(newProps);\n // barCodeTypes is deprecated\n if (!propsKeys.includes('barCodeScannerSettings') && propsKeys.includes('barCodeTypes')) {\n console.warn(\n `The \"barCodeTypes\" prop for Camera is deprecated and will be removed in SDK 34. Use \"barCodeScannerSettings\" instead.`\n );\n newProps.barCodeScannerSettings = {\n // @ts-ignore\n barCodeTypes: newProps.barCodeTypes,\n };\n }\n\n if (props.onBarCodeScanned) {\n newProps.barCodeScannerEnabled = true;\n }\n\n if (props.onFacesDetected) {\n newProps.faceDetectorEnabled = true;\n }\n\n if (Platform.OS !== 'android') {\n delete newProps.ratio;\n delete newProps.useCamera2Api;\n }\n\n return newProps;\n}\n\nfunction convertProp(value: any, key: string): any {\n if (typeof value === 'string' && Camera.ConversionTables[key]) {\n return Camera.ConversionTables[key][value];\n }\n\n return value;\n}\n\nfunction _onPictureSaved({ nativeEvent }: { nativeEvent: { data: CapturedPicture; id: number } }) {\n const { id, data } = nativeEvent;\n const callback = _PICTURE_SAVED_CALLBACKS[id];\n if (callback) {\n callback(data);\n delete _PICTURE_SAVED_CALLBACKS[id];\n }\n}\n\nexport default class Camera extends React.Component {\n static async isAvailableAsync(): Promise {\n if (!CameraManager.isAvailableAsync) {\n throw new UnavailabilityError('expo-camera', 'isAvailableAsync');\n }\n\n return await CameraManager.isAvailableAsync();\n }\n\n static async getAvailableCameraTypesAsync(): Promise<('front' | 'back')[]> {\n if (!CameraManager.getAvailableCameraTypesAsync) {\n throw new UnavailabilityError('expo-camera', 'getAvailableCameraTypesAsync');\n }\n\n return await CameraManager.getAvailableCameraTypesAsync();\n }\n\n static Constants = {\n Type: CameraManager.Type,\n FlashMode: CameraManager.FlashMode,\n AutoFocus: CameraManager.AutoFocus,\n WhiteBalance: CameraManager.WhiteBalance,\n VideoQuality: CameraManager.VideoQuality,\n VideoStabilization: CameraManager.VideoStabilization || {},\n };\n\n // Values under keys from this object will be transformed to native options\n static ConversionTables = {\n type: CameraManager.Type,\n flashMode: CameraManager.FlashMode,\n autoFocus: CameraManager.AutoFocus,\n whiteBalance: CameraManager.WhiteBalance,\n };\n\n static propTypes = {\n ...ViewPropTypes,\n zoom: PropTypes.number,\n ratio: PropTypes.string,\n focusDepth: PropTypes.number,\n onMountError: PropTypes.func,\n pictureSize: PropTypes.string,\n onCameraReady: PropTypes.func,\n useCamera2Api: PropTypes.bool,\n onBarCodeScanned: PropTypes.func,\n barCodeScannerSettings: PropTypes.object,\n onFacesDetected: PropTypes.func,\n faceDetectorSettings: PropTypes.object,\n type: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n flashMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n videoStabilizationMode: PropTypes.number,\n whiteBalance: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n autoFocus: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]),\n };\n\n static defaultProps: Props = {\n zoom: 0,\n ratio: '4:3',\n focusDepth: 0,\n faceDetectorSettings: {},\n type: CameraManager.Type.back,\n autoFocus: CameraManager.AutoFocus.on,\n flashMode: CameraManager.FlashMode.off,\n whiteBalance: CameraManager.WhiteBalance.auto,\n };\n\n static async getPermissionsAsync(): Promise {\n return CameraManager.getPermissionsAsync();\n }\n\n static async requestPermissionsAsync(): Promise {\n return CameraManager.requestPermissionsAsync();\n }\n\n _cameraHandle?: number | null;\n _cameraRef?: React.Component | null;\n _lastEvents: { [eventName: string]: string } = {};\n _lastEventsTimes: { [eventName: string]: Date } = {};\n\n async takePictureAsync(options?: PictureOptions): Promise {\n const pictureOptions = ensurePictureOptions(options);\n\n return await CameraManager.takePicture(pictureOptions, this._cameraHandle);\n }\n\n async getSupportedRatiosAsync(): Promise {\n if (!CameraManager.getSupportedRatios) {\n throw new UnavailabilityError('Camera', 'getSupportedRatiosAsync');\n }\n\n return await CameraManager.getSupportedRatios(this._cameraHandle);\n }\n\n async getAvailablePictureSizesAsync(ratio?: string): Promise {\n if (!CameraManager.getAvailablePictureSizes) {\n throw new UnavailabilityError('Camera', 'getAvailablePictureSizesAsync');\n }\n return await CameraManager.getAvailablePictureSizes(ratio, this._cameraHandle);\n }\n\n async recordAsync(options?: RecordingOptions): Promise<{ uri: string }> {\n if (!CameraManager.record) {\n throw new UnavailabilityError('Camera', 'recordAsync');\n }\n\n const recordingOptions = ensureRecordingOptions(options);\n\n return await CameraManager.record(recordingOptions, this._cameraHandle);\n }\n\n stopRecording() {\n if (!CameraManager.stopRecording) {\n throw new UnavailabilityError('Camera', 'stopRecording');\n }\n\n CameraManager.stopRecording(this._cameraHandle);\n }\n\n pausePreview() {\n if (!CameraManager.pausePreview) {\n throw new UnavailabilityError('Camera', 'pausePreview');\n }\n\n CameraManager.pausePreview(this._cameraHandle);\n }\n\n resumePreview() {\n if (!CameraManager.resumePreview) {\n throw new UnavailabilityError('Camera', 'resumePreview');\n }\n\n CameraManager.resumePreview(this._cameraHandle);\n }\n\n _onCameraReady = () => {\n if (this.props.onCameraReady) {\n this.props.onCameraReady();\n }\n };\n\n _onMountError = ({ nativeEvent }: { nativeEvent: { message: string } }) => {\n if (this.props.onMountError) {\n this.props.onMountError(nativeEvent);\n }\n };\n\n _onObjectDetected = (callback?: Function) => ({ nativeEvent }: { nativeEvent: any }) => {\n const { type } = nativeEvent;\n if (\n this._lastEvents[type] &&\n this._lastEventsTimes[type] &&\n JSON.stringify(nativeEvent) === this._lastEvents[type] &&\n new Date().getTime() - this._lastEventsTimes[type].getTime() < EventThrottleMs\n ) {\n return;\n }\n\n if (callback) {\n callback(nativeEvent);\n this._lastEventsTimes[type] = new Date();\n this._lastEvents[type] = JSON.stringify(nativeEvent);\n }\n };\n\n _setReference = (ref?: React.Component) => {\n if (ref) {\n this._cameraRef = ref;\n // TODO: Bacon: Unify these\n if (Platform.OS === 'web') {\n this._cameraHandle = ref as any;\n } else {\n this._cameraHandle = findNodeHandle(ref);\n }\n } else {\n this._cameraRef = null;\n this._cameraHandle = null;\n }\n };\n\n render() {\n const nativeProps = ensureNativeProps(this.props);\n\n const onBarCodeScanned = this._onObjectDetected(this.props.onBarCodeScanned);\n const onFacesDetected = this._onObjectDetected(this.props.onFacesDetected);\n\n return (\n \n );\n }\n}\n\nexport const { Constants, getPermissionsAsync, requestPermissionsAsync } = Camera;\n"]} \ No newline at end of file diff --git a/build/CameraModule/CameraModule.js b/build/CameraModule/CameraModule.js index ac2903f9dc819..6945a9cabf47b 100644 --- a/build/CameraModule/CameraModule.js +++ b/build/CameraModule/CameraModule.js @@ -3,8 +3,8 @@ import invariant from 'invariant'; import { CameraType, ImageType } from './CameraModule.types'; import * as Utils from './CameraUtils'; import * as CapabilityUtils from './CapabilityUtils'; -import { FacingModeToCameraType, PictureSizes } from './constants'; import { isBackCameraAvailableAsync, isFrontCameraAvailableAsync } from './UserMediaManager'; +import { FacingModeToCameraType, PictureSizes } from './constants'; export { ImageType, CameraType }; const VALID_SETTINGS_KEYS = [ 'autoFocus', diff --git a/build/CameraModule/CameraModule.js.map b/build/CameraModule/CameraModule.js.map index 1799d1dbc888f..6f26ab540179b 100644 --- a/build/CameraModule/CameraModule.js.map +++ b/build/CameraModule/CameraModule.js.map @@ -1 +1 @@ -{"version":3,"file":"CameraModule.js","sourceRoot":"","sources":["../../src/CameraModule/CameraModule.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport invariant from 'invariant';\n\nimport { PictureOptions } from '../Camera.types';\nimport { CameraType, CapturedPicture, CaptureOptions, ImageType } from './CameraModule.types';\nimport * as Utils from './CameraUtils';\nimport * as CapabilityUtils from './CapabilityUtils';\nimport { FacingModeToCameraType, PictureSizes } from './constants';\nimport { isBackCameraAvailableAsync, isFrontCameraAvailableAsync } from './UserMediaManager';\n\nexport { ImageType, CameraType, CaptureOptions };\n\ntype OnCameraReadyListener = () => void;\ntype OnMountErrorListener = (event: { nativeEvent: Error }) => void;\n\nexport type WebCameraSettings = Partial<{\n autoFocus: string;\n flashMode: string;\n whiteBalance: string;\n exposureCompensation: number;\n colorTemperature: number;\n iso: number;\n brightness: number;\n contrast: number;\n saturation: number;\n sharpness: number;\n focusDistance: number;\n zoom: number;\n}>;\n\nconst VALID_SETTINGS_KEYS = [\n 'autoFocus',\n 'flashMode',\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'whiteBalance',\n 'zoom',\n];\n\nclass CameraModule {\n public onCameraReady: OnCameraReadyListener = () => {};\n public onMountError: OnMountErrorListener = () => {};\n private stream: MediaStream | null = null;\n private settings: MediaTrackSettings | null = null;\n private pictureSize?: string;\n private isStartingCamera = false;\n private cameraType: CameraType = CameraType.front;\n private webCameraSettings: WebCameraSettings = {\n autoFocus: 'continuous',\n flashMode: 'off',\n whiteBalance: 'continuous',\n zoom: 1,\n };\n\n public get type(): CameraType {\n return this.cameraType;\n }\n\n constructor(private videoElement: HTMLVideoElement) {\n if (this.videoElement) {\n this.videoElement.addEventListener('loadedmetadata', () => {\n this.syncTrackCapabilities();\n });\n }\n }\n\n public async updateWebCameraSettingsAsync(nextSettings: {\n [key: string]: any;\n }): Promise {\n const changes: WebCameraSettings = {};\n\n for (const key of Object.keys(nextSettings)) {\n if (!VALID_SETTINGS_KEYS.includes(key)) continue;\n const nextValue = nextSettings[key];\n if (nextValue !== this.webCameraSettings[key]) {\n changes[key] = nextValue;\n }\n }\n\n // Only update the native camera if changes were found\n const hasChanges = !!Object.keys(changes).length;\n\n this.webCameraSettings = { ...this.webCameraSettings, ...changes };\n if (hasChanges) {\n await this.syncTrackCapabilities(changes);\n }\n\n return hasChanges;\n }\n\n public async setTypeAsync(value: CameraType) {\n if (value === this.cameraType) {\n return;\n }\n this.cameraType = value;\n\n await this.resumePreview();\n }\n\n public setPictureSize(value: string) {\n if (value === this.pictureSize) {\n return;\n }\n invariant(\n PictureSizes.includes(value),\n `expo-camera: CameraModule.setPictureSize(): invalid size supplied ${value}, expected one of: ${PictureSizes.join(\n ', '\n )}`\n );\n\n // TODO: Bacon: IMP\n // const [width, height] = value.split('x');\n // const aspectRatio = parseFloat(width) / parseFloat(height);\n\n this.pictureSize = value;\n }\n\n public isTorchAvailable(): boolean {\n return isCapabilityAvailable(this.videoElement, 'torch');\n }\n\n public isZoomAvailable(): boolean {\n return isCapabilityAvailable(this.videoElement, 'zoom');\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints\n private async onCapabilitiesReady(\n track: MediaStreamTrack,\n settings: WebCameraSettings = {}\n ): Promise {\n const capabilities = track.getCapabilities();\n\n // Create an empty object because if you set a constraint that isn't available an error will be thrown.\n const constraints: MediaTrackConstraintSet = {};\n\n // TODO: Bacon: Add `pointsOfInterest` support\n const clampedValues = [\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'zoom',\n ];\n\n for (const property of clampedValues) {\n if (capabilities[property]) {\n constraints[property] = convertNormalizedSetting(\n capabilities[property],\n settings[property]\n );\n }\n }\n\n const _validatedConstrainedValue = (key, propName, converter) =>\n validatedConstrainedValue(\n key,\n propName,\n converter(settings[propName]),\n capabilities,\n settings,\n this.cameraType\n );\n\n if (capabilities.focusMode && settings.autoFocus !== undefined) {\n constraints.focusMode = _validatedConstrainedValue(\n 'focusMode',\n 'autoFocus',\n CapabilityUtils.convertAutoFocusJSONToNative\n );\n }\n\n if (capabilities.torch && settings.flashMode !== undefined) {\n constraints.torch = _validatedConstrainedValue(\n 'torch',\n 'flashMode',\n CapabilityUtils.convertFlashModeJSONToNative\n );\n }\n\n if (capabilities.whiteBalanceMode && settings.whiteBalance !== undefined) {\n constraints.whiteBalanceMode = _validatedConstrainedValue(\n 'whiteBalanceMode',\n 'whiteBalance',\n CapabilityUtils.convertWhiteBalanceJSONToNative\n );\n }\n\n await track.applyConstraints({ advanced: [constraints] as any });\n }\n\n private async applyVideoConstraints(constraints: { [key: string]: any }): Promise {\n if (!this.stream || !this.stream.getVideoTracks) {\n return false;\n }\n return await applyConstraints(this.stream.getVideoTracks(), constraints);\n }\n\n private async applyAudioConstraints(constraints: { [key: string]: any }): Promise {\n if (!this.stream || !this.stream.getAudioTracks) {\n return false;\n }\n return await applyConstraints(this.stream.getAudioTracks(), constraints);\n }\n\n private async syncTrackCapabilities(settings: WebCameraSettings = {}): Promise {\n if (this.stream && this.stream.getVideoTracks) {\n await Promise.all(\n this.stream.getVideoTracks().map(track => this.onCapabilitiesReady(track, settings))\n );\n }\n }\n\n private setStream(stream: MediaStream | null): void {\n this.stream = stream;\n this.settings = stream ? stream.getTracks()[0].getSettings() : null;\n setVideoSource(this.videoElement, stream);\n }\n\n public getActualCameraType(): CameraType | null {\n if (this.settings) {\n // On desktop no value will be returned, in this case we should assume the cameraType is 'front'\n const { facingMode = 'user' } = this.settings;\n return FacingModeToCameraType[facingMode];\n }\n return null;\n }\n\n public async ensureCameraIsRunningAsync(): Promise {\n if (!this.stream) {\n await this.resumePreview();\n }\n }\n\n public async resumePreview(): Promise {\n if (this.isStartingCamera) {\n return null;\n }\n this.isStartingCamera = true;\n try {\n this.stopAsync();\n const stream = await Utils.getStreamDevice(this.type);\n this.setStream(stream);\n this.isStartingCamera = false;\n this.onCameraReady();\n return stream;\n } catch (error) {\n this.isStartingCamera = false;\n this.onMountError({ nativeEvent: error });\n }\n return null;\n }\n\n public takePicture(config: PictureOptions): CapturedPicture {\n const base64 = Utils.captureImage(this.videoElement, config);\n\n const capturedPicture: CapturedPicture = {\n uri: base64,\n base64,\n width: 0,\n height: 0,\n };\n\n if (this.settings) {\n const { width = 0, height = 0 } = this.settings;\n capturedPicture.width = width;\n capturedPicture.height = height;\n // TODO: Bacon: verify/enforce exif shape.\n capturedPicture.exif = this.settings;\n }\n\n if (config.onPictureSaved) {\n config.onPictureSaved({ nativeEvent: { data: capturedPicture, id: config.id } });\n }\n return capturedPicture;\n }\n\n public stopAsync(): void {\n stopMediaStream(this.stream);\n this.setStream(null);\n }\n\n // TODO: Bacon: we don't even use ratio in native...\n public getAvailablePictureSizes = async (ratio: string): Promise => {\n return PictureSizes;\n };\n\n public getAvailableCameraTypesAsync = async (): Promise => {\n if (!navigator.mediaDevices.enumerateDevices) {\n return [];\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n const types: (string | null)[] = await Promise.all([\n (await isFrontCameraAvailableAsync(devices)) && CameraType.front,\n (await isBackCameraAvailableAsync()) && CameraType.back,\n ]);\n\n return types.filter(Boolean) as string[];\n };\n}\n\nfunction stopMediaStream(stream: MediaStream | null) {\n if (!stream) return;\n if (stream.getAudioTracks) stream.getAudioTracks().forEach(track => track.stop());\n if (stream.getVideoTracks) stream.getVideoTracks().forEach(track => track.stop());\n if (isMediaStreamTrack(stream)) stream.stop();\n}\n\nfunction setVideoSource(\n video: HTMLVideoElement,\n stream: MediaStream | MediaSource | Blob | null\n): void {\n try {\n video.srcObject = stream;\n } catch (_) {\n if (stream) {\n video.src = window.URL.createObjectURL(stream);\n } else if (typeof video.src === 'string') {\n window.URL.revokeObjectURL(video.src);\n }\n }\n}\n\nasync function applyConstraints(\n tracks: MediaStreamTrack[],\n constraints: { [key: string]: any }\n): Promise {\n try {\n await Promise.all(\n tracks.map(async track => {\n await track.applyConstraints({ advanced: [constraints] as any });\n })\n );\n return true;\n } catch (_) {\n return false;\n }\n}\n\nfunction isCapabilityAvailable(video: HTMLVideoElement, keyName: string): boolean {\n const stream = video.srcObject;\n\n if (stream instanceof MediaStream) {\n const videoTrack = stream.getVideoTracks()[0];\n\n if (typeof videoTrack.getCapabilities === 'undefined') {\n return false;\n }\n\n const capabilities: any = videoTrack.getCapabilities();\n\n return !!capabilities[keyName];\n }\n\n return false;\n}\n\nfunction isMediaStreamTrack(input: any): input is MediaStreamTrack {\n return typeof input.stop === 'function';\n}\n\nfunction convertNormalizedSetting(range: MediaSettingsRange, value?: number): number | undefined {\n if (!value) return;\n // convert the normalized incoming setting to the native camera zoom range\n const converted = convertRange(value, [range.min, range.max]);\n // clamp value so we don't get an error\n return Math.min(range.max, Math.max(range.min, converted));\n}\n\nfunction convertRange(value: number, r2: number[], r1: number[] = [0, 1]): number {\n return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];\n}\n\nfunction validatedConstrainedValue(\n constraintKey: string,\n settingsKey: string,\n convertedSetting: any,\n capabilities: MediaTrackCapabilities,\n settings: any,\n cameraType: string\n): any {\n const setting = settings[settingsKey];\n if (\n Array.isArray(capabilities[constraintKey]) &&\n convertedSetting &&\n !capabilities[constraintKey].includes(convertedSetting)\n ) {\n console.warn(\n ` { ${settingsKey}: \"${setting}\" } (converted to \"${convertedSetting}\" in the browser) is not supported for camera type \"${cameraType}\" in your browser. Using the default value instead.`\n );\n return undefined;\n }\n return convertedSetting;\n}\n\nexport default CameraModule;\n"]} \ No newline at end of file +{"version":3,"file":"CameraModule.js","sourceRoot":"","sources":["../../src/CameraModule/CameraModule.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport invariant from 'invariant';\n\nimport { PictureOptions } from '../Camera.types';\nimport { CameraType, CapturedPicture, CaptureOptions, ImageType } from './CameraModule.types';\nimport * as Utils from './CameraUtils';\nimport * as CapabilityUtils from './CapabilityUtils';\nimport { isBackCameraAvailableAsync, isFrontCameraAvailableAsync } from './UserMediaManager';\nimport { FacingModeToCameraType, PictureSizes } from './constants';\n\nexport { ImageType, CameraType, CaptureOptions };\n\ntype OnCameraReadyListener = () => void;\ntype OnMountErrorListener = (event: { nativeEvent: Error }) => void;\n\nexport type WebCameraSettings = Partial<{\n autoFocus: string;\n flashMode: string;\n whiteBalance: string;\n exposureCompensation: number;\n colorTemperature: number;\n iso: number;\n brightness: number;\n contrast: number;\n saturation: number;\n sharpness: number;\n focusDistance: number;\n zoom: number;\n}>;\n\nconst VALID_SETTINGS_KEYS = [\n 'autoFocus',\n 'flashMode',\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'whiteBalance',\n 'zoom',\n];\n\nclass CameraModule {\n public onCameraReady: OnCameraReadyListener = () => {};\n public onMountError: OnMountErrorListener = () => {};\n private stream: MediaStream | null = null;\n private settings: MediaTrackSettings | null = null;\n private pictureSize?: string;\n private isStartingCamera = false;\n private cameraType: CameraType = CameraType.front;\n private webCameraSettings: WebCameraSettings = {\n autoFocus: 'continuous',\n flashMode: 'off',\n whiteBalance: 'continuous',\n zoom: 1,\n };\n\n public get type(): CameraType {\n return this.cameraType;\n }\n\n constructor(private videoElement: HTMLVideoElement) {\n if (this.videoElement) {\n this.videoElement.addEventListener('loadedmetadata', () => {\n this.syncTrackCapabilities();\n });\n }\n }\n\n public async updateWebCameraSettingsAsync(nextSettings: {\n [key: string]: any;\n }): Promise {\n const changes: WebCameraSettings = {};\n\n for (const key of Object.keys(nextSettings)) {\n if (!VALID_SETTINGS_KEYS.includes(key)) continue;\n const nextValue = nextSettings[key];\n if (nextValue !== this.webCameraSettings[key]) {\n changes[key] = nextValue;\n }\n }\n\n // Only update the native camera if changes were found\n const hasChanges = !!Object.keys(changes).length;\n\n this.webCameraSettings = { ...this.webCameraSettings, ...changes };\n if (hasChanges) {\n await this.syncTrackCapabilities(changes);\n }\n\n return hasChanges;\n }\n\n public async setTypeAsync(value: CameraType) {\n if (value === this.cameraType) {\n return;\n }\n this.cameraType = value;\n\n await this.resumePreview();\n }\n\n public setPictureSize(value: string) {\n if (value === this.pictureSize) {\n return;\n }\n invariant(\n PictureSizes.includes(value),\n `expo-camera: CameraModule.setPictureSize(): invalid size supplied ${value}, expected one of: ${PictureSizes.join(\n ', '\n )}`\n );\n\n // TODO: Bacon: IMP\n // const [width, height] = value.split('x');\n // const aspectRatio = parseFloat(width) / parseFloat(height);\n\n this.pictureSize = value;\n }\n\n public isTorchAvailable(): boolean {\n return isCapabilityAvailable(this.videoElement, 'torch');\n }\n\n public isZoomAvailable(): boolean {\n return isCapabilityAvailable(this.videoElement, 'zoom');\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints\n private async onCapabilitiesReady(\n track: MediaStreamTrack,\n settings: WebCameraSettings = {}\n ): Promise {\n const capabilities = track.getCapabilities();\n\n // Create an empty object because if you set a constraint that isn't available an error will be thrown.\n const constraints: MediaTrackConstraintSet = {};\n\n // TODO: Bacon: Add `pointsOfInterest` support\n const clampedValues = [\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'zoom',\n ];\n\n for (const property of clampedValues) {\n if (capabilities[property]) {\n constraints[property] = convertNormalizedSetting(\n capabilities[property],\n settings[property]\n );\n }\n }\n\n const _validatedConstrainedValue = (key, propName, converter) =>\n validatedConstrainedValue(\n key,\n propName,\n converter(settings[propName]),\n capabilities,\n settings,\n this.cameraType\n );\n\n if (capabilities.focusMode && settings.autoFocus !== undefined) {\n constraints.focusMode = _validatedConstrainedValue(\n 'focusMode',\n 'autoFocus',\n CapabilityUtils.convertAutoFocusJSONToNative\n );\n }\n\n if (capabilities.torch && settings.flashMode !== undefined) {\n constraints.torch = _validatedConstrainedValue(\n 'torch',\n 'flashMode',\n CapabilityUtils.convertFlashModeJSONToNative\n );\n }\n\n if (capabilities.whiteBalanceMode && settings.whiteBalance !== undefined) {\n constraints.whiteBalanceMode = _validatedConstrainedValue(\n 'whiteBalanceMode',\n 'whiteBalance',\n CapabilityUtils.convertWhiteBalanceJSONToNative\n );\n }\n\n await track.applyConstraints({ advanced: [constraints] as any });\n }\n\n private async applyVideoConstraints(constraints: { [key: string]: any }): Promise {\n if (!this.stream || !this.stream.getVideoTracks) {\n return false;\n }\n return await applyConstraints(this.stream.getVideoTracks(), constraints);\n }\n\n private async applyAudioConstraints(constraints: { [key: string]: any }): Promise {\n if (!this.stream || !this.stream.getAudioTracks) {\n return false;\n }\n return await applyConstraints(this.stream.getAudioTracks(), constraints);\n }\n\n private async syncTrackCapabilities(settings: WebCameraSettings = {}): Promise {\n if (this.stream && this.stream.getVideoTracks) {\n await Promise.all(\n this.stream.getVideoTracks().map(track => this.onCapabilitiesReady(track, settings))\n );\n }\n }\n\n private setStream(stream: MediaStream | null): void {\n this.stream = stream;\n this.settings = stream ? stream.getTracks()[0].getSettings() : null;\n setVideoSource(this.videoElement, stream);\n }\n\n public getActualCameraType(): CameraType | null {\n if (this.settings) {\n // On desktop no value will be returned, in this case we should assume the cameraType is 'front'\n const { facingMode = 'user' } = this.settings;\n return FacingModeToCameraType[facingMode];\n }\n return null;\n }\n\n public async ensureCameraIsRunningAsync(): Promise {\n if (!this.stream) {\n await this.resumePreview();\n }\n }\n\n public async resumePreview(): Promise {\n if (this.isStartingCamera) {\n return null;\n }\n this.isStartingCamera = true;\n try {\n this.stopAsync();\n const stream = await Utils.getStreamDevice(this.type);\n this.setStream(stream);\n this.isStartingCamera = false;\n this.onCameraReady();\n return stream;\n } catch (error) {\n this.isStartingCamera = false;\n this.onMountError({ nativeEvent: error });\n }\n return null;\n }\n\n public takePicture(config: PictureOptions): CapturedPicture {\n const base64 = Utils.captureImage(this.videoElement, config);\n\n const capturedPicture: CapturedPicture = {\n uri: base64,\n base64,\n width: 0,\n height: 0,\n };\n\n if (this.settings) {\n const { width = 0, height = 0 } = this.settings;\n capturedPicture.width = width;\n capturedPicture.height = height;\n // TODO: Bacon: verify/enforce exif shape.\n capturedPicture.exif = this.settings;\n }\n\n if (config.onPictureSaved) {\n config.onPictureSaved({ nativeEvent: { data: capturedPicture, id: config.id } });\n }\n return capturedPicture;\n }\n\n public stopAsync(): void {\n stopMediaStream(this.stream);\n this.setStream(null);\n }\n\n // TODO: Bacon: we don't even use ratio in native...\n public getAvailablePictureSizes = async (ratio: string): Promise => {\n return PictureSizes;\n };\n\n public getAvailableCameraTypesAsync = async (): Promise => {\n if (!navigator.mediaDevices.enumerateDevices) {\n return [];\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n const types: (string | null)[] = await Promise.all([\n (await isFrontCameraAvailableAsync(devices)) && CameraType.front,\n (await isBackCameraAvailableAsync()) && CameraType.back,\n ]);\n\n return types.filter(Boolean) as string[];\n };\n}\n\nfunction stopMediaStream(stream: MediaStream | null) {\n if (!stream) return;\n if (stream.getAudioTracks) stream.getAudioTracks().forEach(track => track.stop());\n if (stream.getVideoTracks) stream.getVideoTracks().forEach(track => track.stop());\n if (isMediaStreamTrack(stream)) stream.stop();\n}\n\nfunction setVideoSource(\n video: HTMLVideoElement,\n stream: MediaStream | MediaSource | Blob | null\n): void {\n try {\n video.srcObject = stream;\n } catch (_) {\n if (stream) {\n video.src = window.URL.createObjectURL(stream);\n } else if (typeof video.src === 'string') {\n window.URL.revokeObjectURL(video.src);\n }\n }\n}\n\nasync function applyConstraints(\n tracks: MediaStreamTrack[],\n constraints: { [key: string]: any }\n): Promise {\n try {\n await Promise.all(\n tracks.map(async track => {\n await track.applyConstraints({ advanced: [constraints] as any });\n })\n );\n return true;\n } catch (_) {\n return false;\n }\n}\n\nfunction isCapabilityAvailable(video: HTMLVideoElement, keyName: string): boolean {\n const stream = video.srcObject;\n\n if (stream instanceof MediaStream) {\n const videoTrack = stream.getVideoTracks()[0];\n\n if (typeof videoTrack.getCapabilities === 'undefined') {\n return false;\n }\n\n const capabilities: any = videoTrack.getCapabilities();\n\n return !!capabilities[keyName];\n }\n\n return false;\n}\n\nfunction isMediaStreamTrack(input: any): input is MediaStreamTrack {\n return typeof input.stop === 'function';\n}\n\nfunction convertNormalizedSetting(range: MediaSettingsRange, value?: number): number | undefined {\n if (!value) return;\n // convert the normalized incoming setting to the native camera zoom range\n const converted = convertRange(value, [range.min, range.max]);\n // clamp value so we don't get an error\n return Math.min(range.max, Math.max(range.min, converted));\n}\n\nfunction convertRange(value: number, r2: number[], r1: number[] = [0, 1]): number {\n return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];\n}\n\nfunction validatedConstrainedValue(\n constraintKey: string,\n settingsKey: string,\n convertedSetting: any,\n capabilities: MediaTrackCapabilities,\n settings: any,\n cameraType: string\n): any {\n const setting = settings[settingsKey];\n if (\n Array.isArray(capabilities[constraintKey]) &&\n convertedSetting &&\n !capabilities[constraintKey].includes(convertedSetting)\n ) {\n console.warn(\n ` { ${settingsKey}: \"${setting}\" } (converted to \"${convertedSetting}\" in the browser) is not supported for camera type \"${cameraType}\" in your browser. Using the default value instead.`\n );\n return undefined;\n }\n return convertedSetting;\n}\n\nexport default CameraModule;\n"]} \ No newline at end of file diff --git a/build/CameraModule/CameraUtils.js b/build/CameraModule/CameraUtils.js index 2b505569f9867..899d1b5a8c2f2 100644 --- a/build/CameraModule/CameraUtils.js +++ b/build/CameraModule/CameraUtils.js @@ -1,8 +1,8 @@ /* eslint-env browser */ import invariant from 'invariant'; import { CameraType, ImageType } from './CameraModule.types'; -import { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './constants'; import { requestUserMediaAsync } from './UserMediaManager'; +import { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './constants'; export function getImageSize(videoWidth, videoHeight, scale) { const width = videoWidth * scale; const ratio = videoWidth / width; diff --git a/build/CameraModule/CameraUtils.js.map b/build/CameraModule/CameraUtils.js.map index 3b44f01f0005c..05255d10ba3b0 100644 --- a/build/CameraModule/CameraUtils.js.map +++ b/build/CameraModule/CameraUtils.js.map @@ -1 +1 @@ -{"version":3,"file":"CameraUtils.js","sourceRoot":"","sources":["../../src/CameraModule/CameraUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport invariant from 'invariant';\n\nimport { PictureOptions } from './../Camera.types';\nimport { CameraType, CaptureOptions, ImageSize, ImageType } from './CameraModule.types';\nimport { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './constants';\nimport { requestUserMediaAsync } from './UserMediaManager';\n\ninterface ConstrainLongRange {\n max?: number;\n min?: number;\n exact?: number;\n ideal?: number;\n}\n\nexport function getImageSize(videoWidth: number, videoHeight: number, scale: number): ImageSize {\n const width = videoWidth * scale;\n const ratio = videoWidth / width;\n const height = videoHeight / ratio;\n\n return {\n width,\n height,\n };\n}\n\nexport function toDataURL(\n canvas: HTMLCanvasElement,\n imageType: ImageType,\n quality: number\n): string {\n invariant(\n Object.values(ImageType).includes(imageType),\n `expo-camera: ${imageType} is not a valid ImageType. Expected a string from: ${Object.values(\n ImageType\n ).join(', ')}`\n );\n\n const format = ImageTypeFormat[imageType];\n if (imageType === ImageType.jpg) {\n invariant(\n quality <= 1 && quality >= 0,\n `expo-camera: ${quality} is not a valid image quality. Expected a number from 0...1`\n );\n return canvas.toDataURL(format, quality);\n } else {\n return canvas.toDataURL(format);\n }\n}\n\nexport function hasValidConstraints(\n preferredCameraType?: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): boolean {\n return preferredCameraType !== undefined && width !== undefined && height !== undefined;\n}\n\nfunction ensureCaptureOptions(config: any): CaptureOptions {\n const captureOptions = {\n scale: 1,\n imageType: ImageType.png,\n isImageMirror: false,\n };\n\n for (const key in config) {\n if (key in config && config[key] !== undefined && key in captureOptions) {\n captureOptions[key] = config[key];\n }\n }\n return captureOptions;\n}\n\nconst DEFAULT_QUALITY = 0.92;\n\nexport function captureImage(video: HTMLVideoElement, pictureOptions: PictureOptions): string {\n const config = ensureCaptureOptions(pictureOptions);\n const { scale, imageType, quality = DEFAULT_QUALITY, isImageMirror } = config;\n\n const { videoWidth, videoHeight } = video;\n const { width, height } = getImageSize(videoWidth, videoHeight, scale);\n\n // Build the canvas size and draw the camera image to the context from video\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n\n //TODO: Bacon: useless\n if (!context) throw new Error('Context is not defined');\n // Flip horizontally (as css transform: rotateY(180deg))\n if (isImageMirror) {\n context.setTransform(-1, 0, 0, 1, canvas.width, 0);\n }\n\n context.drawImage(video, 0, 0, width, height);\n\n const base64 = toDataURL(canvas, imageType, quality);\n return base64;\n}\n\nfunction getSupportedConstraints(): MediaTrackSupportedConstraints | null {\n if (navigator.mediaDevices && navigator.mediaDevices.getSupportedConstraints) {\n return navigator.mediaDevices.getSupportedConstraints();\n }\n return null;\n}\n\nexport function getIdealConstraints(\n preferredCameraType: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): MediaStreamConstraints {\n let preferredConstraints: MediaStreamConstraints = {\n audio: false,\n video: {},\n };\n\n if (hasValidConstraints(preferredCameraType, width, height)) {\n return MinimumConstraints;\n }\n\n const supports = getSupportedConstraints();\n // TODO: Bacon: Test this\n if (!supports || !supports.facingMode || !supports.width || !supports.height)\n return MinimumConstraints;\n\n if (preferredCameraType && Object.values(CameraType).includes(preferredCameraType)) {\n const facingMode = CameraTypeToFacingMode[preferredCameraType];\n if (isWebKit()) {\n const key = facingMode === 'user' ? 'exact' : 'ideal';\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n [key]: facingMode,\n };\n } else {\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n ideal: CameraTypeToFacingMode[preferredCameraType],\n };\n }\n }\n\n if (isMediaTrackConstraints(preferredConstraints.video)) {\n preferredConstraints.video.width = width;\n preferredConstraints.video.height = height;\n }\n\n return preferredConstraints;\n}\n\nfunction isMediaTrackConstraints(input: any): input is MediaTrackConstraints {\n return input && typeof input.video !== 'boolean';\n}\n\nexport async function getStreamDevice(\n preferredCameraType: CameraType,\n preferredWidth?: number | ConstrainLongRange,\n preferredHeight?: number | ConstrainLongRange\n): Promise {\n const constraints: MediaStreamConstraints = getIdealConstraints(\n preferredCameraType,\n preferredWidth,\n preferredHeight\n );\n const stream: MediaStream = await requestUserMediaAsync(constraints);\n return stream;\n}\n\nexport function isWebKit(): boolean {\n return /WebKit/.test(navigator.userAgent) && !/Edg/.test(navigator.userAgent);\n}\n"]} \ No newline at end of file +{"version":3,"file":"CameraUtils.js","sourceRoot":"","sources":["../../src/CameraModule/CameraUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport invariant from 'invariant';\n\nimport { PictureOptions } from './../Camera.types';\nimport { CameraType, CaptureOptions, ImageSize, ImageType } from './CameraModule.types';\nimport { requestUserMediaAsync } from './UserMediaManager';\nimport { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './constants';\n\ninterface ConstrainLongRange {\n max?: number;\n min?: number;\n exact?: number;\n ideal?: number;\n}\n\nexport function getImageSize(videoWidth: number, videoHeight: number, scale: number): ImageSize {\n const width = videoWidth * scale;\n const ratio = videoWidth / width;\n const height = videoHeight / ratio;\n\n return {\n width,\n height,\n };\n}\n\nexport function toDataURL(\n canvas: HTMLCanvasElement,\n imageType: ImageType,\n quality: number\n): string {\n invariant(\n Object.values(ImageType).includes(imageType),\n `expo-camera: ${imageType} is not a valid ImageType. Expected a string from: ${Object.values(\n ImageType\n ).join(', ')}`\n );\n\n const format = ImageTypeFormat[imageType];\n if (imageType === ImageType.jpg) {\n invariant(\n quality <= 1 && quality >= 0,\n `expo-camera: ${quality} is not a valid image quality. Expected a number from 0...1`\n );\n return canvas.toDataURL(format, quality);\n } else {\n return canvas.toDataURL(format);\n }\n}\n\nexport function hasValidConstraints(\n preferredCameraType?: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): boolean {\n return preferredCameraType !== undefined && width !== undefined && height !== undefined;\n}\n\nfunction ensureCaptureOptions(config: any): CaptureOptions {\n const captureOptions = {\n scale: 1,\n imageType: ImageType.png,\n isImageMirror: false,\n };\n\n for (const key in config) {\n if (key in config && config[key] !== undefined && key in captureOptions) {\n captureOptions[key] = config[key];\n }\n }\n return captureOptions;\n}\n\nconst DEFAULT_QUALITY = 0.92;\n\nexport function captureImage(video: HTMLVideoElement, pictureOptions: PictureOptions): string {\n const config = ensureCaptureOptions(pictureOptions);\n const { scale, imageType, quality = DEFAULT_QUALITY, isImageMirror } = config;\n\n const { videoWidth, videoHeight } = video;\n const { width, height } = getImageSize(videoWidth, videoHeight, scale);\n\n // Build the canvas size and draw the camera image to the context from video\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n\n //TODO: Bacon: useless\n if (!context) throw new Error('Context is not defined');\n // Flip horizontally (as css transform: rotateY(180deg))\n if (isImageMirror) {\n context.setTransform(-1, 0, 0, 1, canvas.width, 0);\n }\n\n context.drawImage(video, 0, 0, width, height);\n\n const base64 = toDataURL(canvas, imageType, quality);\n return base64;\n}\n\nfunction getSupportedConstraints(): MediaTrackSupportedConstraints | null {\n if (navigator.mediaDevices && navigator.mediaDevices.getSupportedConstraints) {\n return navigator.mediaDevices.getSupportedConstraints();\n }\n return null;\n}\n\nexport function getIdealConstraints(\n preferredCameraType: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): MediaStreamConstraints {\n let preferredConstraints: MediaStreamConstraints = {\n audio: false,\n video: {},\n };\n\n if (hasValidConstraints(preferredCameraType, width, height)) {\n return MinimumConstraints;\n }\n\n const supports = getSupportedConstraints();\n // TODO: Bacon: Test this\n if (!supports || !supports.facingMode || !supports.width || !supports.height)\n return MinimumConstraints;\n\n if (preferredCameraType && Object.values(CameraType).includes(preferredCameraType)) {\n const facingMode = CameraTypeToFacingMode[preferredCameraType];\n if (isWebKit()) {\n const key = facingMode === 'user' ? 'exact' : 'ideal';\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n [key]: facingMode,\n };\n } else {\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n ideal: CameraTypeToFacingMode[preferredCameraType],\n };\n }\n }\n\n if (isMediaTrackConstraints(preferredConstraints.video)) {\n preferredConstraints.video.width = width;\n preferredConstraints.video.height = height;\n }\n\n return preferredConstraints;\n}\n\nfunction isMediaTrackConstraints(input: any): input is MediaTrackConstraints {\n return input && typeof input.video !== 'boolean';\n}\n\nexport async function getStreamDevice(\n preferredCameraType: CameraType,\n preferredWidth?: number | ConstrainLongRange,\n preferredHeight?: number | ConstrainLongRange\n): Promise {\n const constraints: MediaStreamConstraints = getIdealConstraints(\n preferredCameraType,\n preferredWidth,\n preferredHeight\n );\n const stream: MediaStream = await requestUserMediaAsync(constraints);\n return stream;\n}\n\nexport function isWebKit(): boolean {\n return /WebKit/.test(navigator.userAgent) && !/Edg/.test(navigator.userAgent);\n}\n"]} \ No newline at end of file diff --git a/build/ExponentCamera.js.map b/build/ExponentCamera.js.map index aa64ac42864f8..2488b508f27d9 100644 --- a/build/ExponentCamera.js.map +++ b/build/ExponentCamera.js.map @@ -1 +1 @@ -{"version":3,"file":"ExponentCamera.js","sourceRoot":"","sources":["../src/ExponentCamera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,MAAM,cAAc,GAAqC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;AAEpG,eAAe,cAAc,CAAC","sourcesContent":["import { requireNativeViewManager } from '@unimodules/core';\nimport * as React from 'react';\nimport { NativeProps } from './Camera.types';\n\nconst ExponentCamera: React.ComponentType = requireNativeViewManager('ExponentCamera');\n\nexport default ExponentCamera;\n"]} \ No newline at end of file +{"version":3,"file":"ExponentCamera.js","sourceRoot":"","sources":["../src/ExponentCamera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,cAAc,GAAqC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;AAEpG,eAAe,cAAc,CAAC","sourcesContent":["import { requireNativeViewManager } from '@unimodules/core';\nimport * as React from 'react';\n\nimport { NativeProps } from './Camera.types';\n\nconst ExponentCamera: React.ComponentType = requireNativeViewManager('ExponentCamera');\n\nexport default ExponentCamera;\n"]} \ No newline at end of file diff --git a/build/ExponentCameraManager.web.js.map b/build/ExponentCameraManager.web.js.map index 9b07e611d6ac1..a091850cb3d2a 100644 --- a/build/ExponentCameraManager.web.js.map +++ b/build/ExponentCameraManager.web.js.map @@ -1 +1 @@ -{"version":3,"file":"ExponentCameraManager.web.js","sourceRoot":"","sources":["../src/ExponentCameraManager.web.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,eAAe;IACb,IAAI,IAAI;QACN,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,IAAI,IAAI;QACN,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;IACD,IAAI,SAAS;QACX,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;IACD,IAAI,SAAS;QACX,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,YAAY;SACzB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY;QACd,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,gBAAgB;QACpB,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,kCAAkC;IAClC,2BAA2B;IAC3B,iCAAiC;IACjC,KAAK,CAAC,WAAW,CAAC,OAAuB,EAAE,MAAsB;QAC/D,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,MAAsB;QACxC,OAAO,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,4BAA4B,CAAC,MAAsB;QACvD,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO,MAAM,MAAM,CAAC,4BAA4B,EAAE,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,wBAAwB,CAAC,KAAa,EAAE,MAAsB;QAClE,OAAO,MAAM,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;CACF,CAAC","sourcesContent":["import { CapturedPicture, PictureOptions } from './Camera.types';\nimport ExponentCamera from './ExponentCamera.web';\nimport { canGetUserMedia } from './CameraModule/UserMediaManager';\n\nexport default {\n get name(): string {\n return 'ExponentCameraManager';\n },\n get Type() {\n return {\n back: 'back',\n front: 'front',\n };\n },\n get FlashMode() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n torch: 'torch',\n };\n },\n get AutoFocus() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n singleShot: 'singleShot',\n };\n },\n get WhiteBalance() {\n return {\n auto: 'auto',\n continuous: 'continuous',\n manual: 'manual',\n };\n },\n get VideoQuality() {\n return {};\n },\n async isAvailableAsync(): Promise {\n return canGetUserMedia();\n },\n\n // TODO: Bacon: Is video possible?\n // record(options): Promise\n // stopRecording(): Promise\n async takePicture(options: PictureOptions, camera: ExponentCamera): Promise {\n return await camera.takePicture(options);\n },\n async pausePreview(camera: ExponentCamera): Promise {\n await camera.pausePreview();\n },\n async resumePreview(camera: ExponentCamera): Promise {\n return await camera.resumePreview();\n },\n async getAvailableCameraTypesAsync(camera: ExponentCamera): Promise {\n if (!canGetUserMedia()) return [];\n return await camera.getAvailableCameraTypesAsync();\n },\n async getAvailablePictureSizes(ratio: string, camera: ExponentCamera): Promise {\n return await camera.getAvailablePictureSizes(ratio);\n },\n};\n"]} \ No newline at end of file +{"version":3,"file":"ExponentCameraManager.web.js","sourceRoot":"","sources":["../src/ExponentCameraManager.web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,eAAe;IACb,IAAI,IAAI;QACN,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,IAAI,IAAI;QACN,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;IACD,IAAI,SAAS;QACX,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;IACD,IAAI,SAAS;QACX,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,YAAY;SACzB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY;QACd,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,gBAAgB;QACpB,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,kCAAkC;IAClC,2BAA2B;IAC3B,iCAAiC;IACjC,KAAK,CAAC,WAAW,CAAC,OAAuB,EAAE,MAAsB;QAC/D,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,MAAsB;QACxC,OAAO,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,4BAA4B,CAAC,MAAsB;QACvD,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO,MAAM,MAAM,CAAC,4BAA4B,EAAE,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,wBAAwB,CAAC,KAAa,EAAE,MAAsB;QAClE,OAAO,MAAM,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;CACF,CAAC","sourcesContent":["import { CapturedPicture, PictureOptions } from './Camera.types';\nimport { canGetUserMedia } from './CameraModule/UserMediaManager';\nimport ExponentCamera from './ExponentCamera.web';\n\nexport default {\n get name(): string {\n return 'ExponentCameraManager';\n },\n get Type() {\n return {\n back: 'back',\n front: 'front',\n };\n },\n get FlashMode() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n torch: 'torch',\n };\n },\n get AutoFocus() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n singleShot: 'singleShot',\n };\n },\n get WhiteBalance() {\n return {\n auto: 'auto',\n continuous: 'continuous',\n manual: 'manual',\n };\n },\n get VideoQuality() {\n return {};\n },\n async isAvailableAsync(): Promise {\n return canGetUserMedia();\n },\n\n // TODO: Bacon: Is video possible?\n // record(options): Promise\n // stopRecording(): Promise\n async takePicture(options: PictureOptions, camera: ExponentCamera): Promise {\n return await camera.takePicture(options);\n },\n async pausePreview(camera: ExponentCamera): Promise {\n await camera.pausePreview();\n },\n async resumePreview(camera: ExponentCamera): Promise {\n return await camera.resumePreview();\n },\n async getAvailableCameraTypesAsync(camera: ExponentCamera): Promise {\n if (!canGetUserMedia()) return [];\n return await camera.getAvailableCameraTypesAsync();\n },\n async getAvailablePictureSizes(ratio: string, camera: ExponentCamera): Promise {\n return await camera.getAvailablePictureSizes(ratio);\n },\n};\n"]} \ No newline at end of file diff --git a/src/Camera.tsx b/src/Camera.tsx index 8a3c983807f4e..a988c01815ff3 100644 --- a/src/Camera.tsx +++ b/src/Camera.tsx @@ -3,6 +3,7 @@ import mapValues from 'lodash/mapValues'; import PropTypes from 'prop-types'; import React from 'react'; import { findNodeHandle, Platform, ViewPropTypes } from 'react-native'; + import { CapturedPicture, NativeProps, diff --git a/src/CameraModule/CameraModule.ts b/src/CameraModule/CameraModule.ts index 7175c5f2b37d0..ad00b54cdd1e5 100644 --- a/src/CameraModule/CameraModule.ts +++ b/src/CameraModule/CameraModule.ts @@ -5,8 +5,8 @@ import { PictureOptions } from '../Camera.types'; import { CameraType, CapturedPicture, CaptureOptions, ImageType } from './CameraModule.types'; import * as Utils from './CameraUtils'; import * as CapabilityUtils from './CapabilityUtils'; -import { FacingModeToCameraType, PictureSizes } from './constants'; import { isBackCameraAvailableAsync, isFrontCameraAvailableAsync } from './UserMediaManager'; +import { FacingModeToCameraType, PictureSizes } from './constants'; export { ImageType, CameraType, CaptureOptions }; diff --git a/src/CameraModule/CameraUtils.ts b/src/CameraModule/CameraUtils.ts index 937cdc9f4a6b5..42623691860d1 100644 --- a/src/CameraModule/CameraUtils.ts +++ b/src/CameraModule/CameraUtils.ts @@ -3,8 +3,8 @@ import invariant from 'invariant'; import { PictureOptions } from './../Camera.types'; import { CameraType, CaptureOptions, ImageSize, ImageType } from './CameraModule.types'; -import { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './constants'; import { requestUserMediaAsync } from './UserMediaManager'; +import { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './constants'; interface ConstrainLongRange { max?: number; diff --git a/src/ExponentCamera.ts b/src/ExponentCamera.ts index dfa3282841c79..114c4a4344c92 100644 --- a/src/ExponentCamera.ts +++ b/src/ExponentCamera.ts @@ -1,5 +1,6 @@ import { requireNativeViewManager } from '@unimodules/core'; import * as React from 'react'; + import { NativeProps } from './Camera.types'; const ExponentCamera: React.ComponentType = requireNativeViewManager('ExponentCamera'); diff --git a/src/ExponentCameraManager.web.ts b/src/ExponentCameraManager.web.ts index 845360468cce2..d54e22fcb70a4 100644 --- a/src/ExponentCameraManager.web.ts +++ b/src/ExponentCameraManager.web.ts @@ -1,6 +1,6 @@ import { CapturedPicture, PictureOptions } from './Camera.types'; -import ExponentCamera from './ExponentCamera.web'; import { canGetUserMedia } from './CameraModule/UserMediaManager'; +import ExponentCamera from './ExponentCamera.web'; export default { get name(): string {