Implement flight updating

This commit is contained in:
april 2024-01-05 15:41:47 -06:00
parent dcb6ce3c2a
commit 4a0e49a959
5 changed files with 113 additions and 4 deletions

View File

@ -91,7 +91,12 @@ export default function Flight() {
Flight Log Flight Log
</Title> </Title>
<Group> <Group>
<Tooltip label="Edit Flight"> <Tooltip
label="Edit Flight"
onClick={() =>
navigate(`/logbook/flights/edit/${params.id}`)
}
>
<ActionIcon variant="subtle" size="lg"> <ActionIcon variant="subtle" size="lg">
<IconPencil /> <IconPencil />
</ActionIcon> </ActionIcon>

View File

@ -0,0 +1,63 @@
import { Container, Stack, Title } from "@mantine/core";
import {
FlightFormSchema,
flightCreateHelper,
flightEditHelper,
} from "@/util/types";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useApi } from "@/util/api";
import { useNavigate, useParams } from "@remix-run/react";
import { AxiosError } from "axios";
import FlightForm from "@/ui/form/flight-form";
export default function EditFlight() {
const params = useParams();
const navigate = useNavigate();
const queryClient = useQueryClient();
const client = useApi();
const flight = useQuery({
queryKey: [params.id],
queryFn: async () =>
await client.get(`/flights/${params.id}`).then((res) => res.data),
});
const editFlight = useMutation({
mutationFn: async (values: FlightFormSchema) => {
const newFlight = flightCreateHelper(values);
if (newFlight) {
const res = await client.put(`/flights/${params.id}`, newFlight);
return res.data;
}
throw new Error("Flight updating failed");
},
retry: (failureCount, error: AxiosError) => {
return !error || error.response?.status !== 401;
},
onSuccess: async (data: { id: string }) => {
await queryClient.invalidateQueries({ queryKey: ["flights-list"] });
navigate(`/logbook/flights/${data.id}`);
},
});
return (
<Container>
<Stack>
<Title order={2}>Edit Flight</Title>
<FlightForm
initialValues={flightEditHelper(flight.data) ?? null}
onSubmit={editFlight.mutate}
isError={editFlight.isError}
error={editFlight.error}
submitButtonLabel="Update"
withCancelButton
cancelFunc={() => navigate(`/logbook/flights/${params.id}`)}
mah="calc(100vh - 95px - 110px)"
/>
</Stack>
</Container>
);
}

View File

@ -39,6 +39,7 @@ export default function NewFlight() {
onSubmit={createFlight.mutate} onSubmit={createFlight.mutate}
isError={createFlight.isError} isError={createFlight.isError}
error={createFlight.error} error={createFlight.error}
mah="calc(100vh - 95px - 110px)"
/> />
</Stack> </Stack>
</Container> </Container>

View File

@ -26,11 +26,19 @@ export default function FlightForm({
isError, isError,
error, error,
initialValues, initialValues,
mah,
submitButtonLabel,
withCancelButton,
cancelFunc,
}: { }: {
onSubmit: (values: FlightFormSchema) => void; onSubmit: (values: FlightFormSchema) => void;
isError: boolean; isError: boolean;
error: AxiosError | null; error: AxiosError | null;
initialValues?: FlightFormSchema; initialValues?: FlightFormSchema | null;
mah?: string;
submitButtonLabel?: string;
withCancelButton?: boolean;
cancelFunc?: () => void;
}) { }) {
const form = useForm<FlightFormSchema>({ const form = useForm<FlightFormSchema>({
initialValues: initialValues ?? { initialValues: initialValues ?? {
@ -84,7 +92,7 @@ export default function FlightForm({
return ( return (
<form onSubmit={form.onSubmit((values) => onSubmit(values))}> <form onSubmit={form.onSubmit((values) => onSubmit(values))}>
<ScrollArea.Autosize mah="calc(100vh - 95px - 110px)"> <ScrollArea.Autosize mah={mah}>
<Container> <Container>
{/* Date and Aircraft */} {/* Date and Aircraft */}
@ -289,8 +297,13 @@ export default function FlightForm({
{error?.message} {error?.message}
</Text> </Text>
) : null} ) : null}
{withCancelButton ? (
<Button onClick={cancelFunc} color="gray">
Cancel
</Button>
) : null}
<Button type="submit" leftSection={<IconPencil />}> <Button type="submit" leftSection={<IconPencil />}>
Create {submitButtonLabel ?? "Create"}
</Button> </Button>
</Group> </Group>
</form> </form>

View File

@ -135,7 +135,34 @@ const flightCreateHelper = (
} }
}; };
const flightEditHelper = (
values: FlightCreateSchema
): FlightFormSchema | void => {
try {
const flight = {
...values,
date: dayjs(values.date),
time_start: Number(
`${dayjs(values.time_start).hour()}${dayjs(values.time_start).minute()}`
),
time_off: Number(
`${dayjs(values.time_off).hour()}${dayjs(values.time_off).minute()}`
),
time_down: Number(
`${dayjs(values.time_down).hour()}${dayjs(values.time_down).minute()}`
),
time_stop: Number(
`${dayjs(values.time_stop).hour()}${dayjs(values.time_stop).minute()}`
),
};
return flight;
} catch (err) {
console.log(err);
}
};
export { export {
flightEditHelper,
flightCreateHelper, flightCreateHelper,
type FlightFormSchema, type FlightFormSchema,
type FlightCreateSchema, type FlightCreateSchema,