import CameraRoll from '@react-native-community/cameraroll'; import {RefObject} from 'react'; import {Alert} from 'react-native'; import { RecordOptions, RecordResponse, RNCamera, TakePictureOptions, TakePictureResponse, } from 'react-native-camera'; import ImagePicker, {ImageOrVideo, Video} from 'react-native-image-crop-picker'; import {ERROR_UPLOAD} from '../constants/strings'; /* * Captures a photo and pauses to show the preview of the picture taken */ export const takePicture = ( cameraRef: RefObject, callback: (pic: TakePictureResponse) => void, ) => { if (cameraRef !== null) { const options: TakePictureOptions = { forceUpOrientation: true, orientation: 'portrait', writeExif: false, pauseAfterCapture: true, }; cameraRef.current?.takePictureAsync(options).then((pic) => { callback(pic); }); } }; export const takeVideo = ( cameraRef: RefObject, callback: (vid: RecordResponse) => void, ) => { if (cameraRef !== null) { const options: RecordOptions = { orientation: 'portrait', maxDuration: 60, quality: '1080p', }; cameraRef.current?.recordAsync(options).then((vid) => { callback(vid); }); } }; export const saveImageToGallery = (capturedImageURI: string) => { CameraRoll.save(capturedImageURI, {album: 'Recents', type: 'photo'}) .then((_res) => Alert.alert('Saved to device!')) .catch((_err) => Alert.alert('Failed to save to device!')); }; export const navigateToImagePicker = ( callback: (media: ImageOrVideo) => void, ) => { ImagePicker.openPicker({ smartAlbums: [ 'Favorites', 'RecentlyAdded', 'SelfPortraits', 'Screenshots', 'UserLibrary', ], mediaType: 'any', }) .then((media) => { callback(media); }) .catch((err) => { if (err.code && err.code !== 'E_PICKER_CANCELLED') { Alert.alert(ERROR_UPLOAD); } }); }; export const navigateToVideoPicker = (callback: (vid: Video) => void) => { ImagePicker.openPicker({ mediaType: 'video', }) .then(async (vid) => { if (vid.path) { callback(vid); } }) .catch((err) => { if (err.code && err.code !== 'E_PICKER_CANCELLED') { Alert.alert(ERROR_UPLOAD); } }); }; export const showGIFFailureAlert = (onSuccess: () => void) => Alert.alert( 'Warning', 'The app currently cannot handle GIFs, and will only save a static image.', [ { text: 'Cancel', onPress: () => {}, style: 'cancel', }, { text: 'Post', onPress: onSuccess, style: 'default', }, ], { cancelable: true, onDismiss: () => Alert.alert( 'This alert was dismissed by tapping outside of the alert dialog.', ), }, );