diff --git a/donutshop_ecommerce/src/app/api/menu-items/route.js b/donutshop_ecommerce/src/app/api/menu-items/route.js index d80f069..2a70373 100644 --- a/donutshop_ecommerce/src/app/api/menu-items/route.js +++ b/donutshop_ecommerce/src/app/api/menu-items/route.js @@ -9,6 +9,14 @@ export async function POST(req){ return Response.json(menuItemDoc) } +export async function PUT(req){ + mongoose.connect(process.env.MONGO_URL) + const {_id, ...data} = await req.json(); + await MenuItem.findByIdAndUpdate(_id, data); + + return Response.json(true) +} + export async function GET(){ mongoose.connect(process.env.MONGO_URL) return Response.json( diff --git a/donutshop_ecommerce/src/app/menu-items/edit/[id]/page.js b/donutshop_ecommerce/src/app/menu-items/edit/[id]/page.js new file mode 100644 index 0000000..cb443b2 --- /dev/null +++ b/donutshop_ecommerce/src/app/menu-items/edit/[id]/page.js @@ -0,0 +1,96 @@ +"use client" +import React, { useEffect, useState } from 'react' +import useProfile from '../../../../components/UseProfile'; +import { redirect, useParams } from 'next/navigation' +import Link from 'next/link' +import UserTab from '../../../../components/layout/UserTab'; +import EditImage from '../../../../components/layout/EditImage'; + +const EditMenuItemPage = () => { + const {loading, data} = useProfile(); + const [menuImg, setMenuImg] = useState(''); + const [itemName, setItemName] = useState(''); + const [description, setDescription] = useState(''); + const [basePrice, setBasePrice] = useState(''); + const [goToItems, setGoToItems] = useState(false); + const {id} = useParams(); + + + useEffect(() => { + fetch('/api/menu-items').then(res => { + res.json().then(items => { + const item = items.find(i => i._id === id); + setMenuImg(item.menuImg); + setItemName(item.itemName); + setDescription(item.description); + setBasePrice(item.basePrice); + }) + }) + }, []) + + async function handleMenuFormSubmit(ev){ + ev.preventDefault(); + const data = {menuImg, itemName, description, basePrice, _id:id}; + const menuSavingPromise = new Promise(async (resolve, reject) => { + const response = await fetch('/api/menu-items', { + method: 'PUT', + body: JSON.stringify(data), + headers: {'Content-Type': 'application/json'} + }); + if(response.ok) + resolve(); + else + reject(); + }); + await toast.promise(menuSavingPromise, { + loading: 'Saving...', + success: 'Menu is saved', + error: 'Fail to save menu!', + }); + + setGoToItems(true) + } + if(goToItems){ + return redirect('/menu-items') + } + + + if(loading){ + return

Loading...

+ } + if(!data.admin){ + return

Please login as an admin

+ } + + + return ( +
+ +
+
+
+ +
+
+ + setItemName(ev.target.value)}/> +
+
+ + setDescription(ev.target.value)}/> +
+
+ + setBasePrice(ev.target.value)}/> +
+ +
+
+ Show all menu items +
+
+
+ ) +} + +export default EditMenuItemPage \ No newline at end of file