From ae9a34a065433b14f6a15b0235ca72148fd3d8ce Mon Sep 17 00:00:00 2001 From: frontend perkafean <165241731+frontendperkafean@users.noreply.github.com> Date: Mon, 7 Oct 2024 07:02:36 +0000 Subject: [PATCH] ok --- src/components/ButtonWithReplica.css | 5 +- src/components/Item.js | 43 ++++++++---- src/components/ItemLister.js | 101 ++++++++++++++++----------- src/components/ItemLister.module.css | 1 + src/components/ItemType.js | 25 +++---- src/components/ItemType.module.css | 2 +- src/components/ItemTypeLister.css | 8 +++ src/components/ItemTypeLister.js | 100 +++++++++++++++++--------- src/config.js | 2 +- src/helpers/itemHelper.js | 31 +++++++- src/pages/CafePage.js | 20 ++++-- 11 files changed, 222 insertions(+), 116 deletions(-) diff --git a/src/components/ButtonWithReplica.css b/src/components/ButtonWithReplica.css index 9ce5333..5fad701 100644 --- a/src/components/ButtonWithReplica.css +++ b/src/components/ButtonWithReplica.css @@ -70,8 +70,11 @@ z-index: 201; /* Behind the button */ font-size: 3vw; text-align: center; + transition: all 0.5s ease-in-out; +} +.bussinessName h2 { + color: inherit; /* Ensures that it inherits the color from the parent */ } - .bussinessQR { position: absolute; height: 25vh; diff --git a/src/components/Item.js b/src/components/Item.js index dbbb4c0..33d52ec 100644 --- a/src/components/Item.js +++ b/src/components/Item.js @@ -1,6 +1,5 @@ import React, { useState, useRef, useEffect } from "react"; import styles from "./Item.module.css"; - const Item = ({ blank, forCart, @@ -13,8 +12,10 @@ const Item = ({ onPlusClick, onNegativeClick, handleCreateItem, + handleUpdateItem, onRemoveClick, isAvailable, + isBeingEdit, }) => { const [selectedImage, setSelectedImage] = useState(null); const [previewUrl, setPreviewUrl] = useState(imageUrl); @@ -24,6 +25,8 @@ const Item = ({ const fileInputRef = useRef(null); useEffect(() => { + console.log(imageUrl); + console.log(selectedImage); if (selectedImage) { const reader = new FileReader(); reader.onloadend = () => { @@ -48,7 +51,10 @@ const Item = ({ }; const handleCreate = () => { - handleCreateItem(itemName, itemPrice, itemQty, selectedImage); + handleCreateItem(itemName, itemPrice, selectedImage, previewUrl); + }; + const handleUpdate = () => { + handleUpdateItem(itemName, itemPrice, selectedImage, previewUrl); }; const handleRemoveClick = () => { @@ -86,7 +92,11 @@ const Item = ({ {!forInvoice && (
{ currentTarget.onerror = null; // prevents looping currentTarget.src = @@ -98,9 +108,12 @@ const Item = ({ }} className={styles.itemImage} /> - {blank && ( + + {(isBeingEdit || blank) && (
- Click To Add Image + + {previewUrl ? "Click To Change Image" : "Click To Add Image"} +
)} {forInvoice && ( @@ -135,17 +148,17 @@ const Item = ({ {!forInvoice && ( )} {!forInvoice && - (itemQty != 0 ? ( + (!isBeingEdit && itemQty != 0 ? (
- {!blank ? ( + {!blank && !isBeingEdit ? (

{itemQty}

) : ( )}
- ) : !blank ? ( + ) : !blank && !isBeingEdit ? (
))} diff --git a/src/components/ItemLister.js b/src/components/ItemLister.js index a606fcf..e121395 100644 --- a/src/components/ItemLister.js +++ b/src/components/ItemLister.js @@ -9,7 +9,6 @@ import { } from "../helpers/cartHelpers.js"; import { getImageUrl, - createItem, updateItemAvalilability, updateItemType, deleteItemType, @@ -27,6 +26,8 @@ const ItemLister = ({ forInvoice, isEditMode, raw, + handleCreateItem, + handleUpdateItem, }) => { const [items, setItems] = useState( itemList.map((item) => ({ @@ -45,6 +46,7 @@ const ItemLister = ({ }, [itemList]); const [isEdit, setIsEditing] = useState(false); + const [onEditItem, setOnEditItem] = useState(0); const [isAddingNewItem, setIsAddingNewItem] = useState(false); const [editedTypeName, setEditedTypeName] = useState(typeName); const typeNameInputRef = useRef(null); @@ -122,6 +124,11 @@ const ItemLister = ({ const toggleAddNewItem = () => { setIsAddingNewItem((prev) => !prev); + setOnEditItem(0); + }; + const editItem = (itemId) => { + setIsAddingNewItem(false); + setOnEditItem(itemId); }; const handleChange = async (itemId) => { // Find the item in the current items array @@ -165,6 +172,10 @@ const ItemLister = ({ setItems(updatedItems); } }; + const onCreateItem = (itemName, itemPrice, selectedImage, previewUrl) => { + handleCreateItem(itemName, itemPrice, selectedImage, previewUrl); + setIsAddingNewItem(false); + }; return ( <> @@ -238,52 +249,62 @@ const ItemLister = ({ > ↩ - - createItem( - shopId, - name, - price, - qty, - selectedImage, - itemTypeId - ) - } - /> + )} )} {items.map((item) => { return !forCart || (forCart && item.qty > 0) ? ( -
- {isEditMode && ( -
- {isEditMode && ( - handleChange(item.itemId)} - checked={item.availability} - /> - )} -

{item.availability ? "available" : "unavailable"}

-
+ <> + {onEditItem == item.itemId && ( + )} - handlePlusClick(item.itemId)} - onNegativeClick={() => handleNegativeClick(item.itemId)} - onRemoveClick={() => handleRemoveClick(item.itemId)} - isEditMode={isEditMode} - isAvailable={item.availability} - /> -
+
+ {isEditMode && onEditItem != item.itemId && ( +
+ {isEditMode && ( + handleChange(item.itemId)} + checked={item.availability} + /> + )} +

+ {item.availability ? "available" : "unavailable"} +

+ +
+ )} + + handlePlusClick(item.itemId)} + onNegativeClick={() => handleNegativeClick(item.itemId)} + onRemoveClick={() => handleRemoveClick(item.itemId)} + isBeingEdit={onEditItem == item.itemId} + isAvailable={item.availability} + handleUpdateItem={(name, price, image) => + handleUpdateItem(item.itemId, name, price, image) + } + /> +
+ ) : null; })} diff --git a/src/components/ItemLister.module.css b/src/components/ItemLister.module.css index 0e5038d..8a491f8 100644 --- a/src/components/ItemLister.module.css +++ b/src/components/ItemLister.module.css @@ -4,6 +4,7 @@ width: 100%; padding: 10px; /* Adjust padding as needed */ box-sizing: border-box; /* Ensure padding doesn't affect width */ + white-space: break-spaces; } .item-lister:last-child { diff --git a/src/components/ItemType.js b/src/components/ItemType.js index a031b9b..d0d3241 100644 --- a/src/components/ItemType.js +++ b/src/components/ItemType.js @@ -1,6 +1,5 @@ import React, { useRef, useEffect, useState } from "react"; import styles from "./ItemType.module.css"; -import { getImageUrl } from "../helpers/itemHelper"; export default function ItemType({ onClick, @@ -26,12 +25,13 @@ export default function ItemType({ if (selectedImage) { const reader = new FileReader(); reader.onloadend = () => { - setPreviewUrl(reader.result); + onClick(reader.result); + // setPreviewUrl(reader.result); }; reader.readAsDataURL(selectedImage); } else { - setPreviewUrl(getImageUrl(imageUrl)); - onClick(getImageUrl(imageUrl)); + setPreviewUrl(imageUrl); + // onClick(getImageUrl(imageUrl)); } }, [selectedImage, imageUrl]); @@ -66,7 +66,9 @@ export default function ItemType({ style={{ zIndex: blank ? 301 : "inherit" }} >
onClick(imageUrl)) : onClick} + onClick={ + rectangular ? (blank ? null : () => onClick(imageUrl)) : onClick + } className={styles["item-type-rect"]} style={{ top: selected ? "-10px" : "initial", @@ -86,24 +88,15 @@ export default function ItemType({ onChange={handleImageChange} id="image-input" /> - Click to add image -
)}
{ const [isAddingNewItem, setIsAddingNewItem] = useState(false); const newItemDivRef = useRef(null); + const [items, setItems] = useState([]); + const handleCreateItem = (name, price, selectedImage, previewUrl) => { + console.log(previewUrl); + const newItem = { + itemId: items.length + 1, + name, + price, + selectedImage, + image: previewUrl, + availability: true, + }; + + // Update the items state with the new item + setItems((prevItems) => [...prevItems, newItem]); + }; // Effect to handle changes to isAddingNewItem useEffect(() => { @@ -72,7 +88,11 @@ const ItemTypeLister = ({ className="item-type-lister" style={{ overflowX: isAddingNewItem ? "hidden" : "" }} > -
+
{isEditMode && !isAddingNewItem && user && @@ -81,7 +101,7 @@ const ItemTypeLister = ({ )} {user && @@ -92,110 +112,122 @@ const ItemTypeLister = ({
onFilterChange(0)} - imageUrl={"uploads/1718732420960.png"} + imageUrl={getImageUrl("uploads/1718732420960.png")} + /> + + {/* onFilterChange(0)} + imageUrl={getImageUrl("uploads/1718732420960.png")} /> onFilterChange(0)} - imageUrl={"uploads/1718732420960.png"} + imageUrl={getImageUrl("uploads/1718732420960.png")} /> onFilterChange(0)} - imageUrl={"uploads/1718732420960.png"} - /> - onFilterChange(0)} - imageUrl={"uploads/1718732420960.png"} - /> + imageUrl={getImageUrl("uploads/1718732420960.png")} + /> */}
handleImageChange(e)} - imageUrl={"uploads/beverage1.png"} + imageUrl={getImageUrl("uploads/addnew.png")} /> handleImageChange(e)} - imageUrl={"uploads/beverage2.png"} + imageUrl={getImageUrl("uploads/beverage1.png")} /> handleImageChange(e)} - imageUrl={"uploads/beverage3.png"} + imageUrl={getImageUrl("uploads/beverage2.png")} /> handleImageChange(e)} - imageUrl={"uploads/dessert1.png"} + imageUrl={getImageUrl("uploads/beverage3.png")} /> handleImageChange(e)} - imageUrl={"uploads/dessert2.jpg"} + imageUrl={getImageUrl("uploads/dessert1.png")} /> handleImageChange(e)} - imageUrl={"uploads/food1.png"} + imageUrl={getImageUrl("uploads/dessert2.jpg")} /> handleImageChange(e)} - imageUrl={"uploads/food2.jpg"} + imageUrl={getImageUrl("uploads/food1.png")} + /> + handleImageChange(e)} + imageUrl={getImageUrl("uploads/food2.jpg")} /> handleImageChange(e)} - imageUrl={"uploads/food3.png"} + imageUrl={getImageUrl("uploads/food3.png")} /> handleImageChange(e)} - imageUrl={"uploads/packet1.png"} + imageUrl={getImageUrl("uploads/packet1.png")} /> handleImageChange(e)} - imageUrl={"uploads/packet2.png"} + imageUrl={getImageUrl("uploads/packet2.png")} /> handleImageChange(e)} - imageUrl={"uploads/snack1.png"} + imageUrl={getImageUrl("uploads/snack1.png")} /> handleImageChange(e)} - imageUrl={"uploads/snack2.png"} + imageUrl={getImageUrl("uploads/snack2.png")} /> handleImageChange(e)} - imageUrl={"uploads/snack3.png"} + imageUrl={getImageUrl("uploads/snack3.png")} /> handleImageChange(e)} - imageUrl={"uploads/snack4.png"} - /> - handleImageChange(e)} - imageUrl={"uploads/addnew.png"} + imageUrl={getImageUrl("uploads/snack4.png")} />
+ + @@ -208,7 +240,7 @@ const ItemTypeLister = ({ onFilterChange(0)} - imageUrl={"uploads/1718732420960.png"} + imageUrl={getImageUrl("uploads/1718732420960.png")} /> )} {itemTypes && @@ -219,7 +251,7 @@ const ItemTypeLister = ({ onFilterChange(itemType.itemTypeId)} selected={filterId === itemType.itemTypeId} /> diff --git a/src/config.js b/src/config.js index 3e87dec..7335e06 100644 --- a/src/config.js +++ b/src/config.js @@ -1,5 +1,5 @@ // src/config.js -const API_BASE_URL = "https://fmcf2m-5000.csb.app"; // Replace with your actual backend URL +const API_BASE_URL = "https://3nvnzs-5000.csb.app"; // Replace with your actual backend URL export default API_BASE_URL; diff --git a/src/helpers/itemHelper.js b/src/helpers/itemHelper.js index ae39d6e..07aab72 100644 --- a/src/helpers/itemHelper.js +++ b/src/helpers/itemHelper.js @@ -64,7 +64,6 @@ export async function createItem( shopId, name, price, - qty, selectedImage, itemTypeId ) { @@ -73,7 +72,6 @@ export async function createItem( const formData = new FormData(); formData.append("name", name); formData.append("price", price); - formData.append("stock", qty); formData.append("image", selectedImage); formData.append("itemTypeId", itemTypeId); @@ -98,6 +96,35 @@ export async function createItem( } } +export async function updateItem(itemId, name, price, selectedImage) { + try { + console.log(selectedImage); + const formData = new FormData(); + formData.append("name", name); + formData.append("price", price); + formData.append("image", selectedImage); + + const response = await fetch(`${API_BASE_URL}/item/set-item/${itemId}`, { + method: "PUT", + headers: { + Authorization: `Bearer ${getAuthToken()}`, + }, + body: formData, + }); + + if (!response.ok) { + const errorMessage = await response.text(); + throw new Error(`Error: ${errorMessage}`); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error("Failed to create item type:", error); + throw error; + } +} + export async function updateItemAvalilability(itemId, isAvailable) { try { const response = await fetch( diff --git a/src/pages/CafePage.js b/src/pages/CafePage.js index d7c8ec2..6d8c7d0 100644 --- a/src/pages/CafePage.js +++ b/src/pages/CafePage.js @@ -10,7 +10,7 @@ import { import "../App.css"; -import { getImageUrl } from "../helpers/itemHelper.js"; +import { getImageUrl, createItem, updateItem } from "../helpers/itemHelper.js"; import SearchInput from "../components/SearchInput"; import ItemTypeLister from "../components/ItemTypeLister"; import { MusicPlayer } from "../components/MusicPlayer"; @@ -20,11 +20,7 @@ import Header from "../components/Header"; import { ThreeDots } from "react-loader-spinner"; -import { getItemTypesWithItems } from "../helpers/itemHelper.js"; -import { - getLocalStorage, - updateLocalStorage, -} from "../helpers/localStorageHelpers"; +import { updateLocalStorage } from "../helpers/localStorageHelpers"; import { unsubscribeUser } from "../helpers/subscribeHelpers.js"; import WelcomePage from "./WelcomePage.js"; @@ -218,6 +214,18 @@ function CafePage({ itemList={itemType.itemList} isEditMode={isEditMode} raw={isEditMode || filterId == 0 ? false : true} + handleCreateItem={(name, price, selectedImage) => + createItem( + shopId, + name, + price, + selectedImage, + itemType.itemTypeId + ) + } + handleUpdateItem={(itemId, name, price, selectedImage) => + updateItem(itemId, name, price, selectedImage) + } /> ))}