app/frontend/src/components/features/dishes/CreateDishForm.tsx

96 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-10-13 14:57:11 +02:00
import React, { useState } from "react";
import { useRouter } from "next/navigation";
import { createDish } from "@/utils/api/dishApi";
import PageTitle from "@/components/ui/PageTitle";
import Alert from "@/components/ui/Alert";
2025-10-13 17:35:07 +02:00
import Button from "@/components/ui/Button";
2025-10-13 14:57:11 +02:00
import { ChevronLeftIcon } from "@heroicons/react/16/solid";
2025-10-13 17:35:07 +02:00
import Hr from "@/components/ui/Hr";
import Input from "@/components/ui/Input";
2025-10-13 14:57:11 +02:00
const CreateDishForm = () => {
const router = useRouter()
const [name, setName] = useState<string>("");
const [error, setError] = useState<string>("");
const [loading, setLoading] = useState(false);
const validateForm = () => {
if (!name.trim()) {
setError("Dish name cannot be empty.");
return false;
}
return true;
};
const submitForm = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
// Validate client-side input
if (!validateForm()) return;
setError("");
setLoading(true);
try {
const result = await createDish(name);
if (result) {
router.push('/dishes')
}
} catch (error: unknown) {
setError(error instanceof Error ? error.message : "An unexpected error occurred.");
} finally {
setLoading(false);
}
}
return (
<div className="px-5">
<div className="flex mb-3">
<PageTitle>Create Dish</PageTitle>
</div>
<form className="space-y-4" onSubmit={ submitForm }>
{ error && (
<Alert type="error">{ error }</Alert>
) }
2025-10-13 17:35:07 +02:00
<Input
label="Dish Name"
type="text"
id="name"
name="name"
value={ name }
onChange={ (e) => setName(e.target.value) }
placeholder="Enter dish name"
className="mb-4"
/>
<Button
2025-10-13 14:57:11 +02:00
type="submit"
2025-10-13 17:35:07 +02:00
appearance="solid"
variant="primary"
2025-10-13 14:57:11 +02:00
disabled={ loading }
className={ loading ? "bg-gray-400" : '' }
>
{ loading ? "Saving..." : "Save Changes" }
2025-10-13 17:35:07 +02:00
</Button>
2025-10-13 14:57:11 +02:00
</form>
<Hr />
2025-10-13 17:35:07 +02:00
<Button
appearance="outline"
2025-10-13 14:57:11 +02:00
href="/dishes"
className="mt-4 pl-0 mr-0"
icon={ <ChevronLeftIcon/> }
>
Back to dishes
2025-10-13 17:35:07 +02:00
</Button>
2025-10-13 14:57:11 +02:00
</div>
);
};
export default CreateDishForm;