Massive/EditSets.tsx

159 lines
4.5 KiB
TypeScript
Raw Normal View History

import {
RouteProp,
useFocusEffect,
useNavigation,
useRoute,
} from '@react-navigation/native'
2023-06-27 03:16:59 +00:00
import { useCallback, useState } from 'react'
import { View } from 'react-native'
import DocumentPicker from 'react-native-document-picker'
2023-06-27 03:16:59 +00:00
import { Button, Card, TouchableRipple } from 'react-native-paper'
import { In } from 'typeorm'
2023-01-01 02:20:56 +00:00
import AppInput from './AppInput'
import ConfirmDialog from './ConfirmDialog'
2023-06-27 03:16:59 +00:00
import { MARGIN, PADDING } from './constants'
import { setRepo, settingsRepo } from './db'
import GymSet from './gym-set'
2023-06-27 03:16:59 +00:00
import { HomePageParams } from './home-page-params'
import Settings from './settings'
import StackHeader from './StackHeader'
export default function EditSets() {
2023-06-27 03:16:59 +00:00
const { params } = useRoute<RouteProp<HomePageParams, 'EditSets'>>()
const { ids } = params
const navigation = useNavigation()
const [settings, setSettings] = useState<Settings>({} as Settings)
const [name, setName] = useState('')
const [reps, setReps] = useState('')
const [weight, setWeight] = useState('')
const [newImage, setNewImage] = useState('')
const [unit, setUnit] = useState('')
const [showRemove, setShowRemove] = useState(false)
const [names, setNames] = useState('')
const [oldReps, setOldReps] = useState('')
const [weights, setWeights] = useState('')
const [units, setUnits] = useState('')
const [selection, setSelection] = useState({
start: 0,
end: 1,
})
useFocusEffect(
useCallback(() => {
2023-06-27 03:16:59 +00:00
settingsRepo.findOne({ where: {} }).then(setSettings)
setRepo.find({ where: { id: In(ids) } }).then((sets) => {
setNames(sets.map((set) => set.name).join(', '))
setOldReps(sets.map((set) => set.reps).join(', '))
setWeights(sets.map((set) => set.weight).join(', '))
setUnits(sets.map((set) => set.unit).join(', '))
})
}, [ids]),
)
const handleSubmit = async () => {
2023-06-27 03:16:59 +00:00
console.log(`${EditSets.name}.handleSubmit:`, { uri: newImage, name })
const update: Partial<GymSet> = {}
if (name) update.name = name
if (reps) update.reps = Number(reps)
if (weight) update.weight = Number(weight)
if (unit) update.unit = unit
if (newImage) update.image = newImage
2022-12-18 00:23:10 +00:00
if (Object.keys(update).length > 0) await setRepo.update(ids, update)
navigation.goBack()
}
const changeImage = useCallback(async () => {
2023-06-27 03:16:59 +00:00
const { fileCopyUri } = await DocumentPicker.pickSingle({
type: DocumentPicker.types.images,
copyTo: 'documentDirectory',
})
if (fileCopyUri) setNewImage(fileCopyUri)
}, [])
const handleRemove = useCallback(async () => {
setNewImage('')
setShowRemove(false)
}, [])
return (
<>
<StackHeader title={`Edit ${ids.length} sets`} />
2023-06-27 03:16:59 +00:00
<View style={{ padding: PADDING, flex: 1 }}>
2022-12-29 00:57:19 +00:00
<AppInput
label={`Names: ${names}`}
value={name}
onChangeText={setName}
autoCorrect={false}
autoFocus={!name}
/>
2022-12-29 00:57:19 +00:00
<AppInput
label={`Reps: ${oldReps}`}
2023-06-27 03:16:59 +00:00
keyboardType='numeric'
value={reps}
onChangeText={setReps}
selection={selection}
2023-06-27 03:16:59 +00:00
onSelectionChange={(e) => setSelection(e.nativeEvent.selection)}
autoFocus={!!name}
/>
2022-12-29 00:57:19 +00:00
<AppInput
label={`Weights: ${weights}`}
2023-06-27 03:16:59 +00:00
keyboardType='numeric'
value={weight}
onChangeText={setWeight}
onSubmitEditing={handleSubmit}
/>
{settings.showUnit && (
2022-12-29 00:57:19 +00:00
<AppInput
2023-06-27 03:16:59 +00:00
autoCapitalize='none'
2022-12-14 05:54:20 +00:00
label={`Units: ${units}`}
value={unit}
onChangeText={setUnit}
/>
)}
{settings.images && newImage && (
<TouchableRipple
2023-06-27 03:16:59 +00:00
style={{ marginBottom: MARGIN }}
onPress={changeImage}
2023-06-27 03:16:59 +00:00
onLongPress={() => setShowRemove(true)}
>
<Card.Cover source={{ uri: newImage }} />
</TouchableRipple>
)}
<ConfirmDialog
2023-06-27 03:16:59 +00:00
title='Remove image'
onOk={handleRemove}
show={showRemove}
2023-06-27 03:16:59 +00:00
setShow={setShowRemove}
>
Are you sure you want to remove the image?
</ConfirmDialog>
{settings.images && !newImage && (
<Button
2023-06-27 03:16:59 +00:00
style={{ marginBottom: MARGIN }}
onPress={changeImage}
2023-06-27 03:16:59 +00:00
icon='add-photo-alternate'
>
Image
</Button>
)}
</View>
<Button
mode='outlined'
2023-06-27 03:16:59 +00:00
icon='save'
style={{ margin: MARGIN }}
onPress={handleSubmit}
>
Save
</Button>
</>
)
}