diff options
-rw-r--r-- | src/assets/icons/camera/flash-off.svg | 2 | ||||
-rw-r--r-- | src/assets/icons/camera/flash-on.svg | 2 | ||||
-rw-r--r-- | src/components/camera/FlashButton.tsx | 53 | ||||
-rw-r--r-- | src/components/camera/styles.tsx | 27 | ||||
-rw-r--r-- | src/components/moments/TrimmerPlayer.tsx | 11 | ||||
-rw-r--r-- | src/screens/moments/CameraScreen.tsx | 171 | ||||
-rw-r--r-- | src/utils/camera.ts | 24 | ||||
-rw-r--r-- | yarn.lock | 91 |
8 files changed, 260 insertions, 121 deletions
diff --git a/src/assets/icons/camera/flash-off.svg b/src/assets/icons/camera/flash-off.svg index fb04efd2..b4608b75 100644 --- a/src/assets/icons/camera/flash-off.svg +++ b/src/assets/icons/camera/flash-off.svg @@ -1 +1 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 720"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M361.84,13.57,128.3,360c-3.94,2.81-6.8,11.94-7.74,16.16-4.5,29.23,19.23,41.69,31.66,44.27H289.39l-26,253c-2.11,10.3-1.13,33.3,19.69,42.86s38.69-1.18,45-7.73l260.27-373.1,9.85-16.16c8.44-32.61-14.78-46.38-27.44-49.19H400.53L427.26,38.16c1.13-17.42-11.26-29.28-17.59-33C386.6-7.23,368.17,5.61,361.84,13.57Z"/></svg>
\ No newline at end of file +<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 720"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M413.14,36.09,387.86,255.37h5.7L251.35,397.57H153c-11.76-2.43-34.2-14.21-29.95-41.86.89-4,3.6-12.62,7.32-15.28L351.28,12.83c6-7.53,23.41-19.67,45.23-8C402.5,8.4,414.2,19.61,413.14,36.09Z"/><path class="cls-1" d="M594.91,341l-9.32,15.28L339.45,709.1c-6,6.2-22.89,16.35-42.58,7.31s-20.62-30.78-18.63-40.53L297,493.2,495.79,294.46H569C580.94,297.12,602.89,310.14,594.91,341Z"/><path class="cls-1" d="M634.48,114.82a29,29,0,0,1-8.5,20.53L486.15,275.18,287.4,473.92,135.09,626.24A29,29,0,1,1,94,585.18l167.8-167.8L404,275.18,584.92,94.29a29,29,0,0,1,49.56,20.53Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/camera/flash-on.svg b/src/assets/icons/camera/flash-on.svg index b4608b75..fb04efd2 100644 --- a/src/assets/icons/camera/flash-on.svg +++ b/src/assets/icons/camera/flash-on.svg @@ -1 +1 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 720"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M413.14,36.09,387.86,255.37h5.7L251.35,397.57H153c-11.76-2.43-34.2-14.21-29.95-41.86.89-4,3.6-12.62,7.32-15.28L351.28,12.83c6-7.53,23.41-19.67,45.23-8C402.5,8.4,414.2,19.61,413.14,36.09Z"/><path class="cls-1" d="M594.91,341l-9.32,15.28L339.45,709.1c-6,6.2-22.89,16.35-42.58,7.31s-20.62-30.78-18.63-40.53L297,493.2,495.79,294.46H569C580.94,297.12,602.89,310.14,594.91,341Z"/><path class="cls-1" d="M634.48,114.82a29,29,0,0,1-8.5,20.53L486.15,275.18,287.4,473.92,135.09,626.24A29,29,0,1,1,94,585.18l167.8-167.8L404,275.18,584.92,94.29a29,29,0,0,1,49.56,20.53Z"/></svg>
\ No newline at end of file +<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 720"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M361.84,13.57,128.3,360c-3.94,2.81-6.8,11.94-7.74,16.16-4.5,29.23,19.23,41.69,31.66,44.27H289.39l-26,253c-2.11,10.3-1.13,33.3,19.69,42.86s38.69-1.18,45-7.73l260.27-373.1,9.85-16.16c8.44-32.61-14.78-46.38-27.44-49.19H400.53L427.26,38.16c1.13-17.42-11.26-29.28-17.59-33C386.6-7.23,368.17,5.61,361.84,13.57Z"/></svg>
\ No newline at end of file diff --git a/src/components/camera/FlashButton.tsx b/src/components/camera/FlashButton.tsx index 06a4e44e..65c773d9 100644 --- a/src/components/camera/FlashButton.tsx +++ b/src/components/camera/FlashButton.tsx @@ -1,8 +1,9 @@ +import {BlurView} from '@react-native-community/blur'; import React, {Dispatch, SetStateAction} from 'react'; -import {Text, TouchableOpacity} from 'react-native'; +import {Text, TouchableOpacity, View} from 'react-native'; import {FlashMode} from 'react-native-camera'; -import FlashOffIcon from '../../assets/icons/camera/flash-off.svg'; import FlashOnIcon from '../../assets/icons/camera/flash-on.svg'; +import FlashOffIcon from '../../assets/icons/camera/flash-off.svg'; import {styles} from './styles'; interface FlashButtonProps { @@ -16,27 +17,33 @@ interface FlashButtonProps { export const FlashButton: React.FC<FlashButtonProps> = ({ flashMode, setFlashMode, -}) => ( - <TouchableOpacity - onPress={() => setFlashMode(flashMode === 'on' ? 'off' : 'on')} - style={styles.flashButtonContainer}> - {flashMode === 'on' ? ( - <FlashOnIcon - height={30} - width={20} - color={'white'} - style={styles.flashIcon} - /> - ) : ( - <FlashOffIcon - height={30} - width={20} - color={'white'} - style={styles.flashIcon} +}) => { + return ( + <> + <BlurView + blurType={'ultraThinMaterialDark'} + blurAmount={1} + style={styles.blurView} /> - )} - <Text style={styles.saveButtonLabel}>Flash</Text> - </TouchableOpacity> -); + <TouchableOpacity + onPress={() => setFlashMode(flashMode === 'on' ? 'off' : 'on')} + style={styles.flashButtonContainerBackground}> + <View + style={[ + styles.flashButtonContainer, + // eslint-disable-next-line react-native/no-inline-styles + {opacity: flashMode === 'off' ? 0.5 : 1}, + ]}> + {flashMode === 'off' ? ( + <FlashOffIcon height={30} width={20} color={'white'} /> + ) : ( + <FlashOnIcon height={30} width={20} color={'white'} /> + )} + <Text style={styles.saveButtonLabel}>Flash</Text> + </View> + </TouchableOpacity> + </> + ); +}; export default FlashButton; diff --git a/src/components/camera/styles.tsx b/src/components/camera/styles.tsx index 33b47cc4..dbe1500b 100644 --- a/src/components/camera/styles.tsx +++ b/src/components/camera/styles.tsx @@ -18,9 +18,16 @@ export const styles = StyleSheet.create({ zIndex: 999, }, flashButtonContainer: { + zIndex: 3, + height: 86, + width: 49, + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + borderRadius: 30, + }, + flashButtonContainerBackground: { position: 'absolute', - backgroundColor: '#808080', - opacity: 0.25, zIndex: 1, top: normalize(50), right: 0, @@ -30,7 +37,7 @@ export const styles = StyleSheet.create({ flexDirection: 'column', justifyContent: 'center', alignItems: 'center', - borderRadius: 30, + borderRadius: 50, }, galleryIcon: { borderWidth: 2, @@ -47,7 +54,17 @@ export const styles = StyleSheet.create({ height: 40, backgroundColor: 'grey', }, - flashIcon: { - zIndex: 2, + blurView: { + position: 'absolute', + zIndex: 1, + top: normalize(50), + right: 0, + marginRight: normalize(18), + height: 86, + width: 49, + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + borderRadius: 24.5, }, }); diff --git a/src/components/moments/TrimmerPlayer.tsx b/src/components/moments/TrimmerPlayer.tsx index 8d1cd156..daec98cf 100644 --- a/src/components/moments/TrimmerPlayer.tsx +++ b/src/components/moments/TrimmerPlayer.tsx @@ -25,13 +25,22 @@ const TrimmerPlayer: React.FC<TrimmerPlayerProps> = ({ const playerRef = useRef<Video>(); // Stores where the video is playing (seekTime) const [seekTime, setSeekTime] = useState<number>(0); - const [paused, setPaused] = useState<boolean>(false); + const [paused, setPaused] = useState<boolean>(true); // Stores where the tracker is const [trackerTime, setTrackerTime] = useState<number>(0); // Stores start/end of desired trimmed video const [end, setEnd] = useState<number>(60); const [start, setStart] = useState<number>(0); + // Slight delay to play video since RNCamera can't record and play video here + // at the same time. + // see: https://github.com/react-native-camera/react-native-camera/issues/2592 + useEffect(() => { + setTimeout(() => { + setPaused(false); + }, 1000); + }, []); + useEffect(() => { playerRef.current?.seek(seekTime); }, [seekTime]); diff --git a/src/screens/moments/CameraScreen.tsx b/src/screens/moments/CameraScreen.tsx index 07b697d0..bd94bf63 100644 --- a/src/screens/moments/CameraScreen.tsx +++ b/src/screens/moments/CameraScreen.tsx @@ -3,7 +3,7 @@ import {useBottomTabBarHeight} from '@react-navigation/bottom-tabs'; import {RouteProp} from '@react-navigation/core'; import {useFocusEffect} from '@react-navigation/native'; import {StackNavigationProp} from '@react-navigation/stack'; -import React, {createRef, useCallback, useEffect, useState} from 'react'; +import React, {useCallback, useEffect, useRef, useState} from 'react'; import {Modal, StyleSheet, TouchableOpacity, View} from 'react-native'; import {CameraType, FlashMode, RNCamera} from 'react-native-camera'; import {AnimatedCircularProgress} from 'react-native-circular-progress'; @@ -25,19 +25,35 @@ interface CameraScreenProps { } const CameraScreen: React.FC<CameraScreenProps> = ({route, navigation}) => { const {screenType, selectedCategory} = route.params; - const cameraRef = createRef<RNCamera>(); + const cameraRef = useRef<RNCamera>(null); const tabBarHeight = useBottomTabBarHeight(); const [cameraType, setCameraType] = useState<keyof CameraType>('back'); const [flashMode, setFlashMode] = useState<keyof FlashMode>('off'); const [mostRecentPhoto, setMostRecentPhoto] = useState<string>(''); - const [isRecording, setIsRecording] = useState<boolean>(false); + const [recordingStarted, setRecordingStarted] = useState<boolean>(false); + const [showCaptureButtons, setShowCaptureButtons] = useState<boolean>(false); + const [showCamera, setShowCamera] = useState<boolean>(true); + const [videoUri, setVideoUri] = useState<string | undefined>(); + + useEffect(() => { + if (recordingStarted && videoUri) { + navigateToEditMedia(videoUri); + } + }, [videoUri]); useFocusEffect( useCallback(() => { navigation.dangerouslyGetParent()?.setOptions({ tabBarVisible: false, }); - return () => setIsRecording(false); + setRecordingStarted(false); + setShowCaptureButtons(true); + setShowCamera(true); + return () => { + setTimeout(() => { + setShowCamera(false); + }, 500); + }; }, [navigation]), ); @@ -58,7 +74,6 @@ const CameraScreen: React.FC<CameraScreenProps> = ({route, navigation}) => { }, []); const navigateToEditMedia = (uri: string) => { - cameraRef.current?.resumePreview(); navigation.navigate('EditMedia', { screenType, media: { @@ -87,93 +102,83 @@ const CameraScreen: React.FC<CameraScreenProps> = ({route, navigation}) => { <View style={styles.container}> <Modal transparent={true} - visible={isRecording && cameraType === 'front' && flashMode === 'on'}> + visible={ + recordingStarted && cameraType === 'front' && flashMode === 'on' + }> <View style={styles.flashView} /> </Modal> <TouchableOpacity style={styles.closeButton} onPress={handleClose}> <CloseIcon height={25} width={25} color={'white'} /> </TouchableOpacity> <FlashButton flashMode={flashMode} setFlashMode={setFlashMode} /> - <RNCamera - ref={cameraRef} - style={styles.camera} - type={cameraType} - flashMode={ - flashMode === 'on' && isRecording && cameraType === 'back' - ? 'torch' - : flashMode - } - onDoubleTap={() => { - setCameraType(cameraType === 'front' ? 'back' : 'front'); - }} - /> - <View style={[styles.bottomContainer, {bottom: tabBarHeight}]}> - <FlipButton cameraType={cameraType} setCameraType={setCameraType} /> - <TouchableOpacity - style={ - isRecording - ? styles.captureButtonVideoContainer - : styles.captureButtonContainer + {showCamera && ( + <RNCamera + ref={cameraRef} + style={styles.camera} + type={cameraType} + flashMode={ + flashMode === 'on' && recordingStarted && cameraType === 'back' + ? 'torch' + : flashMode } - activeOpacity={1} - onLongPress={() => { - takeVideo(cameraRef, (vid) => navigateToEditMedia(vid.uri)); - setIsRecording(true); - }} - onPressOut={async () => { - const cancelRecording = async () => { - if (await cameraRef.current?.isRecording()) { - cameraRef.current?.stopRecording(); - setIsRecording(false); - } - }; - cancelRecording(); - // tmp fix for when the animation glitches during the beginning of - // recording causing onPressOut to not be detected. - setTimeout(() => { - cancelRecording(); - }, 500); - setTimeout(() => { - cancelRecording(); - }, 1000); - setTimeout(() => { - cancelRecording(); - }, 1500); + onDoubleTap={() => { + if (showCaptureButtons) { + setCameraType(cameraType === 'front' ? 'back' : 'front'); + } }} - onPress={() => { - takePicture(cameraRef, (pic) => navigateToEditMedia(pic.uri)); - }}> - <View style={styles.captureButton} /> - </TouchableOpacity> - {isRecording && ( - <AnimatedCircularProgress - size={95} - width={6} - fill={100} - rotation={0} - duration={(MAX_VIDEO_RECORDING_DURATION + 1) * 1000} // an extra second for UI to load - tintColor={TAGG_PURPLE} - style={styles.bottomContainer} - lineCap={'round'} - /> - )} - <View style={styles.bottomRightContainer}> - <GalleryIcon - mostRecentPhotoUri={mostRecentPhoto} - callback={(media) => { - const filename = media.filename; - if ( - filename && - (filename.endsWith('gif') || filename.endsWith('GIF')) - ) { - showGIFFailureAlert(() => navigateToEditMedia(media.path)); - } else { - navigateToEditMedia(media.path); - } - }} - /> + onRecordingStart={() => setRecordingStarted(true)} + /> + )} + {showCaptureButtons && ( + <View style={[styles.bottomContainer, {bottom: tabBarHeight}]}> + <FlipButton cameraType={cameraType} setCameraType={setCameraType} /> + <TouchableOpacity + style={ + recordingStarted + ? styles.captureButtonVideoContainer + : styles.captureButtonContainer + } + activeOpacity={1} + onLongPress={() => + takeVideo(cameraRef, (vid) => setVideoUri(vid.uri)) + } + onPressOut={() => cameraRef.current?.stopRecording()} + onPress={() => { + setShowCaptureButtons(false); + takePicture(cameraRef, (pic) => navigateToEditMedia(pic.uri)); + }}> + <View style={styles.captureButton} /> + </TouchableOpacity> + {recordingStarted && ( + <AnimatedCircularProgress + size={95} + width={6} + fill={100} + rotation={0} + duration={(MAX_VIDEO_RECORDING_DURATION + 1) * 1000} // an extra second for UI to load + tintColor={TAGG_PURPLE} + style={styles.bottomContainer} + lineCap={'round'} + /> + )} + <View style={styles.bottomRightContainer}> + <GalleryIcon + mostRecentPhotoUri={mostRecentPhoto} + callback={(media) => { + const filename = media.filename; + if ( + filename && + (filename.endsWith('gif') || filename.endsWith('GIF')) + ) { + showGIFFailureAlert(() => navigateToEditMedia(media.path)); + } else { + navigateToEditMedia(media.path); + } + }} + /> + </View> </View> - </View> + )} </View> ); }; diff --git a/src/utils/camera.ts b/src/utils/camera.ts index ec2615de..6edc2b4f 100644 --- a/src/utils/camera.ts +++ b/src/utils/camera.ts @@ -24,15 +24,20 @@ export const takePicture = ( callback: (pic: TakePictureResponse) => void, ) => { if (cameraRef !== null) { + cameraRef.current?.pausePreview(); const options: TakePictureOptions = { forceUpOrientation: true, orientation: 'portrait', writeExif: false, - pauseAfterCapture: true, }; - cameraRef.current?.takePictureAsync(options).then((pic) => { - callback(pic); - }); + cameraRef.current + ?.takePictureAsync(options) + .then((pic) => { + callback(pic); + }) + .catch((error) => { + console.log(error); + }); } }; @@ -46,9 +51,14 @@ export const takeVideo = ( maxDuration: MAX_VIDEO_RECORDING_DURATION, quality: '1080p', }; - cameraRef.current?.recordAsync(options).then((vid) => { - callback(vid); - }); + cameraRef.current + ?.recordAsync(options) + .then((vid) => { + callback(vid); + }) + .catch((error) => { + console.log(error); + }); } }; @@ -3725,12 +3725,21 @@ "version" "3.1.2" dependencies: "prettier-linter-helpers" "^1.0.0" +<<<<<<< HEAD "eslint-plugin-react-hooks@^3.0.0": "integrity" "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==" "resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz" "version" "3.0.0" +======= + +"eslint-plugin-react-hooks@^3.0.0": + "integrity" "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==" + "resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz" + "version" "3.0.0" + +>>>>>>> 207a9d33eb9235d5e9da65fea7fc24d6f531e8c8 "eslint-plugin-react-native-globals@^0.1.1": "integrity" "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==" "resolved" "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz" @@ -7004,6 +7013,10 @@ "ansi-regex" "^4.0.0" "ansi-styles" "^3.2.0" "react-is" "^16.8.4" +<<<<<<< HEAD + +"pretty-format@^25.1.0": +======= "pretty-format@^25.1.0": "integrity" "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==" @@ -7016,6 +7029,18 @@ "react-is" "^16.12.0" "pretty-format@^25.2.0": +>>>>>>> 207a9d33eb9235d5e9da65fea7fc24d6f531e8c8 + "integrity" "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==" + "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz" + "version" "25.5.0" + dependencies: + "@jest/types" "^25.5.0" + "ansi-regex" "^5.0.0" + "ansi-styles" "^4.0.0" + "react-is" "^16.12.0" + +<<<<<<< HEAD +"pretty-format@^25.2.0": "integrity" "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==" "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz" "version" "25.5.0" @@ -7025,6 +7050,8 @@ "ansi-styles" "^4.0.0" "react-is" "^16.12.0" +======= +>>>>>>> 207a9d33eb9235d5e9da65fea7fc24d6f531e8c8 "private@^0.1.6": "integrity" "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" "resolved" "https://registry.npmjs.org/private/-/private-0.1.8.tgz" @@ -7361,6 +7388,63 @@ "version" "2.0.0-rc.0" dependencies: "@babel/plugin-transform-object-assign" "^7.10.4" +<<<<<<< HEAD +<<<<<<< HEAD +<<<<<<< HEAD + fbjs "^3.0.0" + string-hash-64 "^1.0.3" + +react-native-redash@^16.0.10: + version "16.1.1" + resolved "https://registry.yarnpkg.com/react-native-redash/-/react-native-redash-16.1.1.tgz#784cdf55672043aab9f15ae8c965dcbae8b119ba" + integrity sha512-pD3GMNqRz/5bUnX0ni4MMOBlVwH2dJnd7u6M80VqYGI87IfcuP6Sn1z171r0nUUeYvJ7blJQs0OKKmTsJIbWew== + dependencies: + abs-svg-path "^0.1.1" + normalize-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + +react-native-safe-area-context@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-3.2.0.tgz#06113c6b208f982d68ab5c3cebd199ca93db6941" + integrity sha512-k2Nty4PwSnrg9HwrYeeE+EYqViYJoOFwEy9LxL5RIRfoqxAq/uQXNGwpUg2/u4gnKpBbEPa9eRh15KKMe/VHkA== + +react-native-screens@^2.9.0: + version "2.18.1" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.18.1.tgz#47b9991c6f762d00d0ed3233e5283d523e859885" + integrity sha512-r5WZLpmx2hHjC1RgMdPq5YpSU9tEhBpUaZ5M1SUtNIONyiLqQVxabhRCINdebIk4depJiIl7yw2Q85zJyeX6fw== + +react-native-share@^5.1.7: + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-native-share/-/react-native-share-5.3.0.tgz#e501f974f2c0e12f8c78aa744dfc5bdf6bc54978" + integrity sha512-VHRVxCyENhKThfap2Y7eXawuCqMpSvKYsvANZUfeTKrTlZ86hVi9h0+ITXKTLIj8gOB8qmSYUzKG7o6Kj4wKJg== + +react-native-snap-carousel@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/react-native-snap-carousel/-/react-native-snap-carousel-3.9.1.tgz#6fd9bd8839546c2c6043a41d2035afbc6fe0443e" + integrity sha512-xWEGusacIgK1YaDXLi7Gao2+ISLoGPVEBR8fcMf4tOOJQufutlNwkoLu0l6B8Qgsrre0nTxoVZikRgGRDWlLaQ== + dependencies: + prop-types "^15.6.1" + react-addons-shallow-compare "15.6.2" + +react-native-splash-screen@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.2.0.tgz#d47ec8557b1ba988ee3ea98d01463081b60fff45" + integrity sha512-Ls9qiNZzW/OLFoI25wfjjAcrf2DZ975hn2vr6U9gyuxi2nooVbzQeFoQS5vQcbCt9QX5NY8ASEEAtlLdIa6KVg== + +react-native-status-bar-height@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-native-status-bar-height/-/react-native-status-bar-height-2.6.0.tgz#b6afd25b6e3d533c43d0fcdcfd5cafd775592cea" + integrity sha512-z3SGLF0mHT+OlJDq7B7h/jXPjWcdBT3V14Le5L2PjntjjWM3+EJzq2BcXDwV+v67KFNJic5pgA26cCmseYek6w== + +react-native-svg-transformer@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/react-native-svg-transformer/-/react-native-svg-transformer-0.14.3.tgz#43c8e176f5a11f16f39b87a64018e0ac090ffbdb" + integrity sha512-agDGdMeeBAsWEgg/u7mjtR2Z3c8smGCLep/n3svwifut9dpswZCP+bSIrU8ekg6RNtxAJL+eGJbWjJ38vWxw6g== +======= +======= +>>>>>>> 657bfed7 (Fixed yarn file.) +======= +>>>>>>> 207a9d33eb9235d5e9da65fea7fc24d6f531e8c8 "fbjs" "^3.0.0" "string-hash-64" "^1.0.3" @@ -7409,6 +7493,13 @@ "integrity" "sha512-agDGdMeeBAsWEgg/u7mjtR2Z3c8smGCLep/n3svwifut9dpswZCP+bSIrU8ekg6RNtxAJL+eGJbWjJ38vWxw6g==" "resolved" "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-0.14.3.tgz" "version" "0.14.3" +<<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> cf2a5b72 (Merged with new master and updated for device deployment.) +======= +>>>>>>> 657bfed7 (Fixed yarn file.) +======= +>>>>>>> 207a9d33eb9235d5e9da65fea7fc24d6f531e8c8 dependencies: "@svgr/core" "^4.3.3" "@svgr/plugin-svgo" "^4.3.1" |