diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 044eb03a..81fbba63 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/packages/react-native/src/assets/ChangeIcon.tsx b/packages/react-native/src/assets/ChangeIcon.tsx new file mode 100644 index 00000000..a3e34708 --- /dev/null +++ b/packages/react-native/src/assets/ChangeIcon.tsx @@ -0,0 +1,19 @@ +import { Path, Svg, SvgProps } from 'react-native-svg'; + +export default function ChangeIcon({ width, height, color }: SvgProps) { + return ( + + + + ); +} diff --git a/packages/react-native/src/hooks/useCamera.ts b/packages/react-native/src/hooks/useCamera.ts index 6569ba0a..c2fb4b5b 100644 --- a/packages/react-native/src/hooks/useCamera.ts +++ b/packages/react-native/src/hooks/useCamera.ts @@ -1,6 +1,7 @@ -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { Platform } from 'react-native'; import { + CameraPosition, useCameraDevice, useCameraPermission, } from 'react-native-vision-camera'; @@ -14,7 +15,8 @@ import { import useCameraPermissionAlert from './useCameraPermissionAlert'; export default function useCamera() { - const device = useCameraDevice('back'); + const [cameraPosition, setCameraPosition] = useState('back'); + const device = useCameraDevice(cameraPosition); const { hasPermission } = useCameraPermission(); const cameraPermissionAlert = useCameraPermissionAlert(); @@ -28,6 +30,10 @@ export default function useCamera() { } }; + const changeCameraPosition = () => { + setCameraPosition((prev) => (prev === 'back' ? 'front' : 'back')); + }; + useEffect(() => { if (Platform.OS === 'ios') { request(PERMISSIONS.IOS.CAMERA).then(() => { @@ -40,5 +46,5 @@ export default function useCamera() { } }, []); - return { device, hasPermission }; + return { device, hasPermission, changeCameraPosition }; } diff --git a/packages/react-native/src/hooks/useGallery.ts b/packages/react-native/src/hooks/useGallery.ts index b1759ef6..083688b1 100644 --- a/packages/react-native/src/hooks/useGallery.ts +++ b/packages/react-native/src/hooks/useGallery.ts @@ -66,9 +66,7 @@ export default function useGallery() { selectionLimit: 1, }); - if (response.didCancel) { - return null; - } + if (response.didCancel) return null; return response.assets?.[0]?.uri; }; diff --git a/packages/react-native/src/pages/CameraPage.tsx b/packages/react-native/src/pages/CameraPage.tsx index 6c4718e8..4adfcb9c 100644 --- a/packages/react-native/src/pages/CameraPage.tsx +++ b/packages/react-native/src/pages/CameraPage.tsx @@ -6,11 +6,12 @@ import { Camera, PhotoFile } from 'react-native-vision-camera'; import useCamera from '@/hooks/useCamera'; import DownloadIcon from '@/assets/DownloadIcon'; import useGallery from '@/hooks/useGallery'; +import ChangeIcon from '@/assets/ChangeIcon'; export default function CameraPage() { const camera = useRef(null); const captureRef = useRef(null); - const { device, hasPermission } = useCamera(); + const { device, hasPermission, changeCameraPosition } = useCamera(); const [Filter] = useState(); const [photo, setPhoto] = useState(null); const { savePhoto: savePicture } = useGallery(); @@ -96,13 +97,22 @@ export default function CameraPage() { audio={false} /> {Filter} - - - - + + + + + + + + + + )}