Prevent commas and single quotes from being entered

Closes #60
This commit is contained in:
Brandon Presley 2022-09-27 17:41:23 +13:00
parent 9849ef6834
commit 86509eb211
3 changed files with 35 additions and 7 deletions

View File

@ -4,13 +4,14 @@ import {
useNavigation, useNavigation,
useRoute, useRoute,
} from '@react-navigation/native'; } from '@react-navigation/native';
import React, {useCallback, useState} from 'react'; import React, {useCallback, useContext, useState} from 'react';
import {ScrollView, View} from 'react-native'; import {ScrollView, View} from 'react-native';
import DocumentPicker from 'react-native-document-picker'; import DocumentPicker from 'react-native-document-picker';
import {Button, Card, IconButton, TouchableRipple} from 'react-native-paper'; import {Button, Card, IconButton, TouchableRipple} from 'react-native-paper';
import ConfirmDialog from './ConfirmDialog'; import ConfirmDialog from './ConfirmDialog';
import {MARGIN, PADDING} from './constants'; import {MARGIN, PADDING} from './constants';
import MassiveInput from './MassiveInput'; import MassiveInput from './MassiveInput';
import {SnackbarContext} from './MassiveSnack';
import {updatePlanWorkouts} from './plan.service'; import {updatePlanWorkouts} from './plan.service';
import {addSet, updateManySet, updateSetImage} from './set.service'; import {addSet, updateManySet, updateSetImage} from './set.service';
import {settings} from './settings.service'; import {settings} from './settings.service';
@ -26,6 +27,7 @@ export default function EditWorkout() {
const [minutes, setMinutes] = useState(params.value.minutes?.toString()); const [minutes, setMinutes] = useState(params.value.minutes?.toString());
const [seconds, setSeconds] = useState(params.value.seconds?.toString()); const [seconds, setSeconds] = useState(params.value.seconds?.toString());
const [sets, setSets] = useState(params.value.sets?.toString()); const [sets, setSets] = useState(params.value.sets?.toString());
const {toast} = useContext(SnackbarContext);
const navigation = useNavigation(); const navigation = useNavigation();
useFocusEffect( useFocusEffect(
@ -89,6 +91,18 @@ export default function EditWorkout() {
setShowRemove(false); setShowRemove(false);
}, []); }, []);
const handleName = (value: string) => {
setName(value.replace(/,|'/g, ''));
if (value.match(/,|'/))
toast('Commas and single quotes would break CSV exports', 6000);
};
const handleSteps = (value: string) => {
setSteps(value.replace(/,|'/g, ''));
if (value.match(/,|'/))
toast('Commas and single quotes would break CSV exports', 6000);
};
return ( return (
<View style={{padding: PADDING}}> <View style={{padding: PADDING}}>
<ScrollView style={{height: '90%'}}> <ScrollView style={{height: '90%'}}>
@ -96,13 +110,13 @@ export default function EditWorkout() {
autoFocus autoFocus
label="Name" label="Name"
value={name} value={name}
onChangeText={setName} onChangeText={handleName}
/> />
{!!settings.steps && ( {!!settings.steps && (
<MassiveInput <MassiveInput
selectTextOnFocus={false} selectTextOnFocus={false}
value={steps} value={steps}
onChangeText={setSteps} onChangeText={handleSteps}
label="Steps" label="Steps"
multiline multiline
/> />

View File

@ -1,7 +1,8 @@
import React, {useEffect, useRef, useState} from 'react'; import React, {useContext, useEffect, useRef, useState} from 'react';
import {ScrollView} from 'react-native'; import {ScrollView} from 'react-native';
import {Button} from 'react-native-paper'; import {Button} from 'react-native-paper';
import MassiveInput from './MassiveInput'; import MassiveInput from './MassiveInput';
import {SnackbarContext} from './MassiveSnack';
import Set from './set'; import Set from './set';
import {getSets} from './set.service'; import {getSets} from './set.service';
import {settings} from './settings.service'; import {settings} from './settings.service';
@ -24,6 +25,7 @@ export default function SetForm({
start: 0, start: 0,
end: set.reps.toString().length, end: set.reps.toString().length,
}); });
const {toast} = useContext(SnackbarContext);
const weightRef = useRef<any>(null); const weightRef = useRef<any>(null);
const repsRef = useRef<any>(null); const repsRef = useRef<any>(null);
const unitRef = useRef<any>(null); const unitRef = useRef<any>(null);
@ -51,13 +53,25 @@ export default function SetForm({
}); });
}; };
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);
};
return ( return (
<> <>
<ScrollView style={{height: '90%'}}> <ScrollView style={{height: '90%'}}>
<MassiveInput <MassiveInput
label="Name" label="Name"
value={name} value={name}
onChangeText={setName} onChangeText={handleName}
autoCorrect={false} autoCorrect={false}
autoFocus={!name} autoFocus={!name}
blurOnSubmit={false} blurOnSubmit={false}
@ -88,7 +102,7 @@ export default function SetForm({
autoCapitalize="none" autoCapitalize="none"
label="Unit" label="Unit"
value={unit} value={unit}
onChangeText={setUnit} onChangeText={handleUnit}
innerRef={unitRef} innerRef={unitRef}
/> />
)} )}

View File

@ -41,7 +41,7 @@ export default function WorkoutItem({
<List.Item <List.Item
onPress={() => navigation.navigate('EditWorkout', {value: item})} onPress={() => navigation.navigate('EditWorkout', {value: item})}
title={item.name} title={item.name}
description={`${item.sets} sets with ${minutes}:${seconds} rest`} description={`${item.sets} sets ${minutes}:${seconds} rest`}
onLongPress={longPress} onLongPress={longPress}
left={() => left={() =>
item.image && ( item.image && (