Massive/EditWeight.tsx

134 lines
3.6 KiB
TypeScript
Raw Normal View History

2023-10-19 05:28:56 +00:00
import { DateTimePickerAndroid } from "@react-native-community/datetimepicker";
import {
NavigationProp,
RouteProp,
useFocusEffect,
useNavigation,
useRoute,
} from "@react-navigation/native";
import { format } from "date-fns";
import { useCallback, useRef, useState } from "react";
2023-10-20 22:57:31 +00:00
import { TextInput, View } from "react-native";
import { Button, IconButton } from "react-native-paper";
2023-10-19 05:28:56 +00:00
import AppInput from "./AppInput";
import ConfirmDialog from "./ConfirmDialog";
import { MARGIN, PADDING } from "./constants";
2023-10-20 22:57:31 +00:00
import { getNow, settingsRepo, weightRepo } from "./db";
2023-10-19 05:28:56 +00:00
import Settings from "./settings";
import StackHeader from "./StackHeader";
2023-10-20 22:57:31 +00:00
import Weight from "./weight";
import { WeightPageParams } from "./WeightPage";
2023-10-19 05:28:56 +00:00
export default function EditWeight() {
2023-10-20 22:57:31 +00:00
const { params } = useRoute<RouteProp<WeightPageParams, "EditWeight">>();
const { weight } = params;
const { navigate } = useNavigation<NavigationProp<WeightPageParams>>();
2023-10-19 05:28:56 +00:00
const [settings, setSettings] = useState<Settings>({} as Settings);
2023-10-20 22:57:31 +00:00
const [value, setValue] = useState(weight.value?.toString());
const [unit, setUnit] = useState(weight.unit);
2023-10-19 05:28:56 +00:00
const [created, setCreated] = useState<Date>(
2023-10-20 22:57:31 +00:00
weight.created ? new Date(weight.created) : new Date()
2023-10-19 05:28:56 +00:00
);
2023-10-20 22:57:31 +00:00
const [showDelete, setShowDelete] = useState(false);
2023-10-19 05:28:56 +00:00
const [createdDirty, setCreatedDirty] = useState(false);
const unitRef = useRef<TextInput>(null);
useFocusEffect(
useCallback(() => {
settingsRepo.findOne({ where: {} }).then(setSettings);
}, [])
);
2023-10-24 03:16:42 +00:00
const submit = async () => {
2023-10-20 22:57:31 +00:00
if (!value) return;
2023-10-19 05:28:56 +00:00
2023-10-20 22:57:31 +00:00
const newWeight: Partial<Weight> = {
id: weight.id,
value: Number(value),
2023-10-19 05:28:56 +00:00
unit,
};
2023-10-20 22:57:31 +00:00
if (createdDirty) newWeight.created = created.toISOString();
else if (typeof weight.id !== "number") newWeight.created = await getNow();
2023-10-19 05:28:56 +00:00
2023-10-20 22:57:31 +00:00
await weightRepo.save(newWeight);
navigate("Weights");
2023-10-19 05:28:56 +00:00
};
const pickDate = useCallback(() => {
DateTimePickerAndroid.open({
value: created,
onChange: (_, date) => {
if (date === created) return;
setCreated(date);
setCreatedDirty(true);
},
mode: "date",
});
}, [created]);
const remove = async () => {
2023-10-20 22:57:31 +00:00
if (!weight.id) return;
await weightRepo.delete(weight.id);
navigate("Weights");
2023-10-19 05:28:56 +00:00
};
return (
<>
2023-10-20 22:57:31 +00:00
<StackHeader
title={typeof weight.id === "number" ? "Edit weight" : "Add weight"}
>
{typeof weight.id === "number" ? (
2023-10-19 05:28:56 +00:00
<IconButton onPress={() => setShowDelete(true)} icon="delete" />
) : null}
</StackHeader>
<ConfirmDialog
2023-10-20 22:57:31 +00:00
title="Delete weight"
2023-10-19 05:28:56 +00:00
show={showDelete}
onOk={remove}
setShow={setShowDelete}
>
2023-10-20 22:57:31 +00:00
<>Are you sure you want to delete {value}</>
2023-10-19 05:28:56 +00:00
</ConfirmDialog>
<View style={{ padding: PADDING, flex: 1 }}>
<AppInput
2023-10-24 03:16:42 +00:00
label="Weight"
2023-10-20 22:57:31 +00:00
value={value}
onChangeText={setValue}
keyboardType="numeric"
2023-10-24 03:16:42 +00:00
onSubmitEditing={submit}
2023-10-19 05:28:56 +00:00
/>
{settings.showUnit && (
<AppInput
autoCapitalize="none"
label="Unit"
value={unit}
onChangeText={setUnit}
innerRef={unitRef}
/>
)}
{settings.showDate && (
<AppInput
label="Created"
value={format(created, settings.date || "P")}
onPressOut={pickDate}
/>
)}
</View>
<Button
2023-10-20 22:57:31 +00:00
disabled={!value}
2023-10-19 05:28:56 +00:00
mode="outlined"
2023-10-20 22:57:31 +00:00
icon="content-save"
2023-10-19 05:28:56 +00:00
style={{ margin: MARGIN }}
2023-10-24 03:16:42 +00:00
onPress={submit}
2023-10-19 05:28:56 +00:00
>
Save
</Button>
</>
);
}