aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/assets/icons/camera/flash-off.svg2
-rw-r--r--src/assets/icons/camera/flash-on.svg2
-rw-r--r--src/components/camera/FlashButton.tsx53
-rw-r--r--src/components/camera/styles.tsx27
-rw-r--r--src/components/moments/TrimmerPlayer.tsx11
-rw-r--r--src/screens/moments/CameraScreen.tsx171
-rw-r--r--src/utils/camera.ts24
-rw-r--r--yarn.lock91
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);
+ });
}
};
diff --git a/yarn.lock b/yarn.lock
index 11ac6804..c4d4e36d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -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"