import {Button, Group, TextInput, Text, Textarea, NumberInput, Container, Title, Flex} from '@mantine/core'; import {useForm} from '@mantine/form'; import {useParams} from "react-router"; import {useMutation, useQuery, useQueryClient} from "@tanstack/react-query"; import {InventoryItem} from "./types.ts"; import {useEffect} from "react"; type EditableInventoryItem = Omit; function EditItem() { const params = useParams(); const editItemForm = useForm({ mode: 'uncontrolled', initialValues: { name: "", brand: "", statusId: "", status: {name: "", id: ""}, serialNumber: "", rentalPrice: 0, replacementCost: 0, notes: "", }, validate: {}, }); const {isPending, error, data, isFetching} = useQuery({ queryKey: ['inventory', params.itemId], queryFn: async (): Promise => { const response = await fetch( import.meta.env.VITE_API_URL + '/inventory/' + params.itemId, ) if (!response.ok) throw new Error('Failed to fetch inventory ' + response.statusText) return await response.json() }, }); const queryClient = useQueryClient(); const updateItem = useMutation({ mutationFn: async (values: EditableInventoryItem) => { // await const result = await fetch(import.meta.env.VITE_API_URL + '/inventory/' + params.itemId, { method: 'PUT', body: JSON.stringify(values), headers: { 'Content-Type': 'application/json' } }); if (!result.ok) { throw new Error('Failed to update inventory item'); } // invalidate the queries so they pull updated information // this is a prefix, so it covers both the query that pulls a list, and also `['inventory', itemId]` in this file await queryClient.invalidateQueries({ queryKey: ['inventory'] }); } }) useEffect(() => { if (data) { // Even if query.data changes, form will be initialized only once editItemForm.initialize(data); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [data]); if (isPending) return 'Loading...' if (error) return 'An error has occurred: ' + error.message return (
await updateItem.mutateAsync(values))}>
{isFetching ? 'Updating...' : ''}
Edit Item ID: {data.id}