diff --git a/app/admin/AddProduct.tsx b/app/admin/AddProduct.tsx new file mode 100644 index 0000000..0d5cb0e --- /dev/null +++ b/app/admin/AddProduct.tsx @@ -0,0 +1,195 @@ +"use client" + +import { useState, type ChangeEvent } from "react" +import type { Bike } from "@/utils/getBike" +import type React from "react" // Import React +import uploadImage from "./image"; +import { useRouter } from "next/navigation"; + +export default function AddProduct() { + const router = useRouter(); + const [newBike, setNewBike] = useState>({ + name: "", + description: "", + image: null, + amount_stocked: 0, + rental_rate: 0, + sell_price: 0, + damage_rate: 0, + for_rent: false, + }) + const [uploading, setUploading] = useState(false) + + const handleChange = (field: keyof Omit, value: string | number | boolean) => { + setNewBike((prev) => ({ ...prev, [field]: value })) + } + + const handleUpload = (e: ChangeEvent) => { + setUploading(true) + uploadImage(e).then((signedUrl) => { + if (signedUrl) { + setNewBike((prev) => ({ ...prev, image: signedUrl })) + } else { + console.error("Error uploading image") + } + setUploading(false) + }) + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + console.log("New bike to be added:", newBike) + // Here you would typically send the data to your backend API + // Reset the form after submission + try { + const response = await fetch("/api/add-bike", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(newBike), + }) + if (!response.ok) { + throw new Error("Failed to add bike") + } else { + console.log("Bike added successfully") + router.refresh() + } + } catch (error) { + console.error("Error adding bike:", error) + } + setNewBike({ + name: "", + description: "", + image: null, + amount_stocked: 0, + rental_rate: 0, + sell_price: 0, + damage_rate: 0, + for_rent: false, + }) + } + + return ( +
+

Add New Bike

+
+
+ + handleChange("name", e.target.value)} + className="mt-1 block w-full px-3 py-2 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-green-500 focus:border-green-500" + required + /> +
+
+ +