import {useCallback, useRef, useState} from 'react'; import {TextInput, View} from 'react-native'; import DocumentPicker from 'react-native-document-picker'; import {Button, Card, TouchableRipple} from 'react-native-paper'; import ConfirmDialog from './ConfirmDialog'; import {MARGIN} from './constants'; import {setRepo} from './db'; import GymSet from './gym-set'; import MassiveInput from './MassiveInput'; import {useSnackbar} from './MassiveSnack'; import {useSettings} from './use-settings'; export default function SetForm({ save, set, }: { set: GymSet; save: (set: GymSet) => void; }) { const [name, setName] = useState(set.name); const [reps, setReps] = useState(set.reps.toString()); const [weight, setWeight] = useState(set.weight.toString()); const [newImage, setNewImage] = useState(set.image); const [unit, setUnit] = useState(set.unit); const [showRemove, setShowRemove] = useState(false); const [selection, setSelection] = useState({ start: 0, end: set.reps.toString().length, }); const [removeImage, setRemoveImage] = useState(false); const {toast} = useSnackbar(); const {settings} = useSettings(); const weightRef = useRef(null); const repsRef = useRef(null); const unitRef = useRef(null); const handleSubmit = async () => { console.log(`${SetForm.name}.handleSubmit:`, {set, uri: newImage, name}); if (!name) return; let image = newImage; if (!newImage && !removeImage) image = await setRepo.findOne({where: {name}}).then(s => s.image); console.log(`${SetForm.name}.handleSubmit:`, {image}); save({ name, reps: Number(reps), weight: Number(weight), id: set.id, unit, image, minutes: Number(set.minutes ?? 3), seconds: Number(set.seconds ?? 30), sets: set.sets ?? 3, }); }; const handleName = (value: string) => { setName(value.replace(/,|'/g, '')); if (value.match(/,|'/)) toast('Commas and single quotes would break CSV exports', 6000); }; const handleUnit = (value: string) => { setUnit(value.replace(/,|'/g, '')); if (value.match(/,|'/)) toast('Commas and single quotes would break CSV exports', 6000); }; const changeImage = useCallback(async () => { const {fileCopyUri} = await DocumentPicker.pickSingle({ type: 'image/*', copyTo: 'documentDirectory', }); if (fileCopyUri) setNewImage(fileCopyUri); }, []); const handleRemove = useCallback(async () => { setNewImage(''); setRemoveImage(true); setShowRemove(false); }, []); return ( <> repsRef.current?.focus()} /> weightRef.current?.focus()} selection={selection} onSelectionChange={e => setSelection(e.nativeEvent.selection)} autoFocus={!!name} innerRef={repsRef} /> {!!settings.showUnit && ( )} {typeof set.id === 'number' && !!settings.showDate && ( )} {!!settings.images && newImage && ( setShowRemove(true)}> )} {!!settings.images && !newImage && ( )} Are you sure you want to remove the image? ); }