import React, { useEffect, useState } from "react"; import { StyleProp, Text, View, TouchableWithoutFeedback, Image, Alert, ImageProps, } from "react-native"; const CamerIcon = require("../../assets/images/camera-icon.png"); import { ImageLibraryOptions, CameraOptions, ImagePickerResponse, } from "react-native-image-picker"; import { alertConfigCamera, alertConfigStorage, requestCameraPermission, requestExternalWritePermission, selectImageFromLibrary, } from "../../Utils/Camera"; import { colors } from "../../assets/colors"; import { BaseProps } from "../../Utils/BaseProps"; import styles from "./ImagePickerStyles"; export interface ImagePickerProps extends ImageLibraryOptions, CameraOptions, BaseProps { imageUri?: string; onChange?: (e: ImagePickerResponse) => void | undefined; imageProps?: ImageProps; imageStyles?: StyleProp; placeholderImage?: string; placeholderImageStyles?: StyleProp; disableFeedbackAlerts?: boolean; } const ImagePicker = (props: ImagePickerProps) => { const { containerStyle, labelStyle, disabled = false, label, hideLabel = false, errorMessage, errorVisibility = true, showErrorMessage = true, assistiveText, assistiveTextStyle, onChange, imageUri, mediaType, maxWidth = 500, maxHeight = 500, quality = 0.6, saveToPhotos = false, durationLimit = 30, videoQuality, imageProps, imageStyles, placeholderImage, placeholderImageStyles, disableFeedbackAlerts = true, testID, } = props; const [imageURI, setImageURI] = useState( imageUri ? imageUri : "" ); const selectImageConfig = { mediaType, maxWidth, maxHeight, quality, saveToPhotos, durationLimit, videoQuality, callback: (e: ImagePickerResponse | Object) => onChange?.(e), setImageURI: (uri: string | undefined) => setImageURI(uri), disableFeedbackAlerts: disableFeedbackAlerts, }; useEffect(() => { requestCameraPermission(alertConfigCamera); requestExternalWritePermission(alertConfigStorage); }, []); useEffect(() => { if (!imageUri) { return; } if (typeof imageUri === "string") { setImageURI(imageUri); } }, [imageUri]); const errorStyle = (ev: boolean, em: string | undefined): StyleProp => { const borderColor = ev && em ? colors.error : colors.grey; return { ...styles.containerStyle, borderColor }; }; const handlePress = () => { if (!imageURI) selectImageFromLibrary(selectImageConfig); else Alert.alert("Delete", "Are you sure you want to delete the image?", [ { text: "Yes", onPress: () => { setImageURI(""); onChange?.({}); }, }, { text: "No" }, ]); }; return ( {hideLabel || !label ? null : ( {label} )} {assistiveText && !errorVisibility ? ( {assistiveText} ) : null} {errorVisibility && showErrorMessage && errorMessage ? ( {errorMessage} ) : null} ); }; export default ImagePicker;