This commit is contained in:
frontend perkafean
2024-10-07 07:02:36 +00:00
parent eec9caefd0
commit ae9a34a065
11 changed files with 222 additions and 116 deletions

View File

@@ -70,8 +70,11 @@
z-index: 201; /* Behind the button */ z-index: 201; /* Behind the button */
font-size: 3vw; font-size: 3vw;
text-align: center; text-align: center;
transition: all 0.5s ease-in-out;
}
.bussinessName h2 {
color: inherit; /* Ensures that it inherits the color from the parent */
} }
.bussinessQR { .bussinessQR {
position: absolute; position: absolute;
height: 25vh; height: 25vh;

View File

@@ -1,6 +1,5 @@
import React, { useState, useRef, useEffect } from "react"; import React, { useState, useRef, useEffect } from "react";
import styles from "./Item.module.css"; import styles from "./Item.module.css";
const Item = ({ const Item = ({
blank, blank,
forCart, forCart,
@@ -13,8 +12,10 @@ const Item = ({
onPlusClick, onPlusClick,
onNegativeClick, onNegativeClick,
handleCreateItem, handleCreateItem,
handleUpdateItem,
onRemoveClick, onRemoveClick,
isAvailable, isAvailable,
isBeingEdit,
}) => { }) => {
const [selectedImage, setSelectedImage] = useState(null); const [selectedImage, setSelectedImage] = useState(null);
const [previewUrl, setPreviewUrl] = useState(imageUrl); const [previewUrl, setPreviewUrl] = useState(imageUrl);
@@ -24,6 +25,8 @@ const Item = ({
const fileInputRef = useRef(null); const fileInputRef = useRef(null);
useEffect(() => { useEffect(() => {
console.log(imageUrl);
console.log(selectedImage);
if (selectedImage) { if (selectedImage) {
const reader = new FileReader(); const reader = new FileReader();
reader.onloadend = () => { reader.onloadend = () => {
@@ -48,7 +51,10 @@ const Item = ({
}; };
const handleCreate = () => { const handleCreate = () => {
handleCreateItem(itemName, itemPrice, itemQty, selectedImage); handleCreateItem(itemName, itemPrice, selectedImage, previewUrl);
};
const handleUpdate = () => {
handleUpdateItem(itemName, itemPrice, selectedImage, previewUrl);
}; };
const handleRemoveClick = () => { const handleRemoveClick = () => {
@@ -86,7 +92,11 @@ const Item = ({
{!forInvoice && ( {!forInvoice && (
<div className={styles.imageContainer}> <div className={styles.imageContainer}>
<img <img
src={previewUrl} src={
blank || previewUrl || isBeingEdit
? previewUrl
: "https://png.pngtree.com/png-vector/20221125/ourmid/pngtree-no-image-available-icon-flatvector-illustration-pic-design-profile-vector-png-image_40966566.jpg"
}
onError={({ currentTarget }) => { onError={({ currentTarget }) => {
currentTarget.onerror = null; // prevents looping currentTarget.onerror = null; // prevents looping
currentTarget.src = currentTarget.src =
@@ -98,9 +108,12 @@ const Item = ({
}} }}
className={styles.itemImage} className={styles.itemImage}
/> />
{blank && (
{(isBeingEdit || blank) && (
<div className={styles.overlay} onClick={handleImageClick}> <div className={styles.overlay} onClick={handleImageClick}>
<span>Click To Add Image</span> <span>
{previewUrl ? "Click To Change Image" : "Click To Add Image"}
</span>
</div> </div>
)} )}
<input <input
@@ -117,13 +130,13 @@ const Item = ({
<input <input
className={`${ className={`${
forInvoice ? styles.itemInvoiceName : styles.itemName forInvoice ? styles.itemInvoiceName : styles.itemName
} ${blank ? styles.blank : styles.notblank} ${ } ${isBeingEdit || blank ? styles.blank : styles.notblank} ${
!isAvailable ? styles.disabled : "" !isAvailable ? styles.disabled : ""
}`} }`}
value={itemName} value={itemName}
placeholder="name" placeholder="name"
onChange={handleNameChange} onChange={handleNameChange}
disabled={!blank} disabled={!blank && !isBeingEdit}
/> />
{forInvoice && ( {forInvoice && (
@@ -135,17 +148,17 @@ const Item = ({
{!forInvoice && ( {!forInvoice && (
<input <input
className={`${styles.itemPrice} ${ className={`${styles.itemPrice} ${
blank ? styles.blank : styles.notblank isBeingEdit || blank ? styles.blank : styles.notblank
} ${!isAvailable ? styles.disabled : ""}`} } ${!isAvailable ? styles.disabled : ""}`}
value={itemPrice} value={itemPrice}
placeholder="price" placeholder="price"
onChange={handlePriceChange} onChange={handlePriceChange}
disabled={!blank} disabled={!blank && !isBeingEdit}
/> />
)} )}
{!forInvoice && {!forInvoice &&
(itemQty != 0 ? ( (!isBeingEdit && itemQty != 0 ? (
<div className={styles.itemQty}> <div className={styles.itemQty}>
<svg <svg
className={styles.plusNegative} className={styles.plusNegative}
@@ -162,14 +175,14 @@ const Item = ({
fillRule="nonzero" fillRule="nonzero"
/> />
</svg> </svg>
{!blank ? ( {!blank && !isBeingEdit ? (
<p className={styles.itemQtyValue}>{itemQty}</p> <p className={styles.itemQtyValue}>{itemQty}</p>
) : ( ) : (
<input <input
className={styles.itemQtyInput} className={styles.itemQtyInput}
value={itemQty} value={itemQty}
onChange={handleQtyChange} onChange={handleQtyChange}
disabled={!blank} disabled={!blank && !isBeingEdit}
/> />
)} )}
<svg <svg
@@ -188,7 +201,7 @@ const Item = ({
/> />
</svg> </svg>
</div> </div>
) : !blank ? ( ) : !blank && !isBeingEdit ? (
<div className={styles.itemQty}> <div className={styles.itemQty}>
<button <button
className={styles.addButton} className={styles.addButton}
@@ -207,9 +220,9 @@ const Item = ({
backgroundColor: "#4da94d", backgroundColor: "#4da94d",
width: "150px", width: "150px",
}} }}
onClick={handleCreate} onClick={isBeingEdit ? handleUpdate : handleCreate}
> >
+ {isBeingEdit ? "save" : "+"}
</button> </button>
</div> </div>
))} ))}

View File

@@ -9,7 +9,6 @@ import {
} from "../helpers/cartHelpers.js"; } from "../helpers/cartHelpers.js";
import { import {
getImageUrl, getImageUrl,
createItem,
updateItemAvalilability, updateItemAvalilability,
updateItemType, updateItemType,
deleteItemType, deleteItemType,
@@ -27,6 +26,8 @@ const ItemLister = ({
forInvoice, forInvoice,
isEditMode, isEditMode,
raw, raw,
handleCreateItem,
handleUpdateItem,
}) => { }) => {
const [items, setItems] = useState( const [items, setItems] = useState(
itemList.map((item) => ({ itemList.map((item) => ({
@@ -45,6 +46,7 @@ const ItemLister = ({
}, [itemList]); }, [itemList]);
const [isEdit, setIsEditing] = useState(false); const [isEdit, setIsEditing] = useState(false);
const [onEditItem, setOnEditItem] = useState(0);
const [isAddingNewItem, setIsAddingNewItem] = useState(false); const [isAddingNewItem, setIsAddingNewItem] = useState(false);
const [editedTypeName, setEditedTypeName] = useState(typeName); const [editedTypeName, setEditedTypeName] = useState(typeName);
const typeNameInputRef = useRef(null); const typeNameInputRef = useRef(null);
@@ -122,6 +124,11 @@ const ItemLister = ({
const toggleAddNewItem = () => { const toggleAddNewItem = () => {
setIsAddingNewItem((prev) => !prev); setIsAddingNewItem((prev) => !prev);
setOnEditItem(0);
};
const editItem = (itemId) => {
setIsAddingNewItem(false);
setOnEditItem(itemId);
}; };
const handleChange = async (itemId) => { const handleChange = async (itemId) => {
// Find the item in the current items array // Find the item in the current items array
@@ -165,6 +172,10 @@ const ItemLister = ({
setItems(updatedItems); setItems(updatedItems);
} }
}; };
const onCreateItem = (itemName, itemPrice, selectedImage, previewUrl) => {
handleCreateItem(itemName, itemPrice, selectedImage, previewUrl);
setIsAddingNewItem(false);
};
return ( return (
<> <>
@@ -238,27 +249,25 @@ const ItemLister = ({
> >
</button> </button>
<Item <Item blank={true} handleCreateItem={onCreateItem} />
blank={true}
handleCreateItem={(name, price, qty, selectedImage) =>
createItem(
shopId,
name,
price,
qty,
selectedImage,
itemTypeId
)
}
/>
</> </>
)} )}
</> </>
)} )}
{items.map((item) => { {items.map((item) => {
return !forCart || (forCart && item.qty > 0) ? ( return !forCart || (forCart && item.qty > 0) ? (
<>
{onEditItem == item.itemId && (
<button
className={styles["add-item-button"]}
onClick={() => editItem(0)}
style={{ display: "inline-block" }}
>
</button>
)}
<div className={styles["itemWrapper"]}> <div className={styles["itemWrapper"]}>
{isEditMode && ( {isEditMode && onEditItem != item.itemId && (
<div className={styles["editModeLayout"]}> <div className={styles["editModeLayout"]}>
{isEditMode && ( {isEditMode && (
<Switch <Switch
@@ -266,9 +275,15 @@ const ItemLister = ({
checked={item.availability} checked={item.availability}
/> />
)} )}
<h3>{item.availability ? "available" : "unavailable"}</h3> <h3>
{item.availability ? "available" : "unavailable"}
</h3>
<button onClick={() => editItem(item.itemId)}>
edit
</button>
</div> </div>
)} )}
<Item <Item
key={item.itemId} key={item.itemId}
forCart={forCart} forCart={forCart}
@@ -276,14 +291,20 @@ const ItemLister = ({
name={item.name} name={item.name}
price={item.price} price={item.price}
qty={item.qty} qty={item.qty}
imageUrl={getImageUrl(item.image)} imageUrl={
itemTypeId ? getImageUrl(item.image) : item.image
}
onPlusClick={() => handlePlusClick(item.itemId)} onPlusClick={() => handlePlusClick(item.itemId)}
onNegativeClick={() => handleNegativeClick(item.itemId)} onNegativeClick={() => handleNegativeClick(item.itemId)}
onRemoveClick={() => handleRemoveClick(item.itemId)} onRemoveClick={() => handleRemoveClick(item.itemId)}
isEditMode={isEditMode} isBeingEdit={onEditItem == item.itemId}
isAvailable={item.availability} isAvailable={item.availability}
handleUpdateItem={(name, price, image) =>
handleUpdateItem(item.itemId, name, price, image)
}
/> />
</div> </div>
</>
) : null; ) : null;
})} })}

View File

@@ -4,6 +4,7 @@
width: 100%; width: 100%;
padding: 10px; /* Adjust padding as needed */ padding: 10px; /* Adjust padding as needed */
box-sizing: border-box; /* Ensure padding doesn't affect width */ box-sizing: border-box; /* Ensure padding doesn't affect width */
white-space: break-spaces;
} }
.item-lister:last-child { .item-lister:last-child {

View File

@@ -1,6 +1,5 @@
import React, { useRef, useEffect, useState } from "react"; import React, { useRef, useEffect, useState } from "react";
import styles from "./ItemType.module.css"; import styles from "./ItemType.module.css";
import { getImageUrl } from "../helpers/itemHelper";
export default function ItemType({ export default function ItemType({
onClick, onClick,
@@ -26,12 +25,13 @@ export default function ItemType({
if (selectedImage) { if (selectedImage) {
const reader = new FileReader(); const reader = new FileReader();
reader.onloadend = () => { reader.onloadend = () => {
setPreviewUrl(reader.result); onClick(reader.result);
// setPreviewUrl(reader.result);
}; };
reader.readAsDataURL(selectedImage); reader.readAsDataURL(selectedImage);
} else { } else {
setPreviewUrl(getImageUrl(imageUrl)); setPreviewUrl(imageUrl);
onClick(getImageUrl(imageUrl)); // onClick(getImageUrl(imageUrl));
} }
}, [selectedImage, imageUrl]); }, [selectedImage, imageUrl]);
@@ -66,7 +66,9 @@ export default function ItemType({
style={{ zIndex: blank ? 301 : "inherit" }} style={{ zIndex: blank ? 301 : "inherit" }}
> >
<div <div
onClick={rectangular ?( blank? null:() => onClick(imageUrl)) : onClick} onClick={
rectangular ? (blank ? null : () => onClick(imageUrl)) : onClick
}
className={styles["item-type-rect"]} className={styles["item-type-rect"]}
style={{ style={{
top: selected ? "-10px" : "initial", top: selected ? "-10px" : "initial",
@@ -86,24 +88,15 @@ export default function ItemType({
onChange={handleImageChange} onChange={handleImageChange}
id="image-input" id="image-input"
/> />
Click to add image
<label
htmlFor="image-input"
className={styles["item-type-image-text"]}
>
Click to add image
</label>
</div> </div>
)} )}
</div> </div>
<input <input
ref={inputRef} ref={inputRef}
className={`${styles["item-type-name"]} ${ className={`${styles["item-type-name"]} ${styles.noborder}`}
blank ? styles.border : styles.noborder
}`}
value={name} value={name}
onChange={handleNameChange} onChange={handleNameChange}
disabled={!blank} disabled={true}
style={{ style={{
top: selected ? "-5px" : "initial", top: selected ? "-5px" : "initial",
borderBottom: selected ? "1px solid #000" : "none", borderBottom: selected ? "1px solid #000" : "none",

View File

@@ -58,7 +58,7 @@
.item-type-image { .item-type-image {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: cover;
border-radius: 15px; border-radius: 15px;
} }

View File

@@ -29,11 +29,19 @@
flex-direction: column; flex-direction: column;
} }
.inline-container {
display: grid;
grid-template-columns: repeat(4, 1fr); /* Always 4 columns */
gap: 10px; /* Spacing between grid items */
padding: 10px; /* Padding inside grid */
overflow-y: auto; /* Allow scrolling if items overflow */
}
.grid-container { .grid-container {
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); /* Always 4 columns */ grid-template-columns: repeat(4, 1fr); /* Always 4 columns */
gap: 10px; /* Spacing between grid items */ gap: 10px; /* Spacing between grid items */
padding: 10px; /* Padding inside grid */ padding: 10px; /* Padding inside grid */
max-height: calc(3 * (25vw - 20px) + 20px); /* 3 items + gaps */
overflow-y: auto; /* Allow scrolling if items overflow */ overflow-y: auto; /* Allow scrolling if items overflow */
} }

View File

@@ -4,6 +4,7 @@ import "./ItemTypeLister.css";
import ItemType from "./ItemType"; import ItemType from "./ItemType";
import { createItemType } from "../helpers/itemHelper.js"; import { createItemType } from "../helpers/itemHelper.js";
import { getImageUrl } from "../helpers/itemHelper"; import { getImageUrl } from "../helpers/itemHelper";
import ItemLister from "./ItemLister";
const ItemTypeLister = ({ const ItemTypeLister = ({
shopId, shopId,
@@ -16,6 +17,21 @@ const ItemTypeLister = ({
}) => { }) => {
const [isAddingNewItem, setIsAddingNewItem] = useState(false); const [isAddingNewItem, setIsAddingNewItem] = useState(false);
const newItemDivRef = useRef(null); 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 // Effect to handle changes to isAddingNewItem
useEffect(() => { useEffect(() => {
@@ -72,7 +88,11 @@ const ItemTypeLister = ({
className="item-type-lister" className="item-type-lister"
style={{ overflowX: isAddingNewItem ? "hidden" : "" }} style={{ overflowX: isAddingNewItem ? "hidden" : "" }}
> >
<div ref={newItemDivRef} className="item-type-list" style={{display: isAddingNewItem?'block':'inline-flex'}}> <div
ref={newItemDivRef}
className="item-type-list"
style={{ display: isAddingNewItem ? "block" : "inline-flex" }}
>
{isEditMode && {isEditMode &&
!isAddingNewItem && !isAddingNewItem &&
user && user &&
@@ -81,7 +101,7 @@ const ItemTypeLister = ({
<ItemType <ItemType
onClick={toggleAddNewItem} onClick={toggleAddNewItem}
name={"create"} name={"create"}
imageUrl={"uploads/addnew.png"} imageUrl={getImageUrl("uploads/addnew.png")}
/> />
)} )}
{user && {user &&
@@ -92,110 +112,122 @@ const ItemTypeLister = ({
<ItemType <ItemType
blank={true} blank={true}
imageUrl={previewUrl} imageUrl={previewUrl}
name={"blank"} name={" "}
onCreate={handleCreate} onCreate={handleCreate}
/> />
<div className="rect-creator"> <div className="rect-creator">
<div <div
className="grid-container" className="inline-container"
style={{ visibility: "hidden" }} style={{ visibility: "hidden" }}
> >
<ItemType <ItemType
onClick={() => onFilterChange(0)} onClick={() => onFilterChange(0)}
imageUrl={"uploads/1718732420960.png"} imageUrl={getImageUrl("uploads/1718732420960.png")}
/>
<input></input>
{/* <ItemType
onClick={() => onFilterChange(0)}
imageUrl={getImageUrl("uploads/1718732420960.png")}
/> />
<ItemType <ItemType
onClick={() => onFilterChange(0)} onClick={() => onFilterChange(0)}
imageUrl={"uploads/1718732420960.png"} imageUrl={getImageUrl("uploads/1718732420960.png")}
/> />
<ItemType <ItemType
onClick={() => onFilterChange(0)} onClick={() => onFilterChange(0)}
imageUrl={"uploads/1718732420960.png"} imageUrl={getImageUrl("uploads/1718732420960.png")}
/> /> */}
<ItemType
onClick={() => onFilterChange(0)}
imageUrl={"uploads/1718732420960.png"}
/>
</div> </div>
<div className="grid-container" style={{ paddingTop: "15px" }}> <div className="grid-container" style={{ paddingTop: "15px" }}>
<ItemType <ItemType
rectangular={true} rectangular={true}
blank={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/beverage1.png"} imageUrl={getImageUrl("uploads/addnew.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/beverage2.png"} imageUrl={getImageUrl("uploads/beverage1.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/beverage3.png"} imageUrl={getImageUrl("uploads/beverage2.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/dessert1.png"} imageUrl={getImageUrl("uploads/beverage3.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/dessert2.jpg"} imageUrl={getImageUrl("uploads/dessert1.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/food1.png"} imageUrl={getImageUrl("uploads/dessert2.jpg")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/food2.jpg"} imageUrl={getImageUrl("uploads/food1.png")}
/>
<ItemType
rectangular={true}
onClick={(e) => handleImageChange(e)}
imageUrl={getImageUrl("uploads/food2.jpg")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/food3.png"} imageUrl={getImageUrl("uploads/food3.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/packet1.png"} imageUrl={getImageUrl("uploads/packet1.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/packet2.png"} imageUrl={getImageUrl("uploads/packet2.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/snack1.png"} imageUrl={getImageUrl("uploads/snack1.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/snack2.png"} imageUrl={getImageUrl("uploads/snack2.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/snack3.png"} imageUrl={getImageUrl("uploads/snack3.png")}
/> />
<ItemType <ItemType
rectangular={true} rectangular={true}
onClick={(e) => handleImageChange(e)} onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/snack4.png"} imageUrl={getImageUrl("uploads/snack4.png")}
/>
<ItemType
rectangular={true}
blank={true}
onClick={(e) => handleImageChange(e)}
imageUrl={"uploads/addnew.png"}
/> />
</div> </div>
<ItemLister
shopId={shopId}
shopOwnerId={shopOwnerId}
user={user}
typeName={"add new"}
itemList={items}
isEditMode={true}
raw={true}
handleCreateItem={handleCreateItem}
/>
<button onClick={toggleAddNewItem} className="add-button"> <button onClick={toggleAddNewItem} className="add-button">
back back
</button> </button>
@@ -208,7 +240,7 @@ const ItemTypeLister = ({
<ItemType <ItemType
name={"All"} name={"All"}
onClick={() => onFilterChange(0)} onClick={() => onFilterChange(0)}
imageUrl={"uploads/1718732420960.png"} imageUrl={getImageUrl("uploads/1718732420960.png")}
/> />
)} )}
{itemTypes && {itemTypes &&
@@ -219,7 +251,7 @@ const ItemTypeLister = ({
<ItemType <ItemType
key={itemType.itemTypeId} key={itemType.itemTypeId}
name={itemType.name} name={itemType.name}
imageUrl={itemType.image} imageUrl={getImageUrl(itemType.image)}
onClick={() => onFilterChange(itemType.itemTypeId)} onClick={() => onFilterChange(itemType.itemTypeId)}
selected={filterId === itemType.itemTypeId} selected={filterId === itemType.itemTypeId}
/> />

View File

@@ -1,5 +1,5 @@
// src/config.js // 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; export default API_BASE_URL;

View File

@@ -64,7 +64,6 @@ export async function createItem(
shopId, shopId,
name, name,
price, price,
qty,
selectedImage, selectedImage,
itemTypeId itemTypeId
) { ) {
@@ -73,7 +72,6 @@ export async function createItem(
const formData = new FormData(); const formData = new FormData();
formData.append("name", name); formData.append("name", name);
formData.append("price", price); formData.append("price", price);
formData.append("stock", qty);
formData.append("image", selectedImage); formData.append("image", selectedImage);
formData.append("itemTypeId", itemTypeId); 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) { export async function updateItemAvalilability(itemId, isAvailable) {
try { try {
const response = await fetch( const response = await fetch(

View File

@@ -10,7 +10,7 @@ import {
import "../App.css"; import "../App.css";
import { getImageUrl } from "../helpers/itemHelper.js"; import { getImageUrl, createItem, updateItem } from "../helpers/itemHelper.js";
import SearchInput from "../components/SearchInput"; import SearchInput from "../components/SearchInput";
import ItemTypeLister from "../components/ItemTypeLister"; import ItemTypeLister from "../components/ItemTypeLister";
import { MusicPlayer } from "../components/MusicPlayer"; import { MusicPlayer } from "../components/MusicPlayer";
@@ -20,11 +20,7 @@ import Header from "../components/Header";
import { ThreeDots } from "react-loader-spinner"; import { ThreeDots } from "react-loader-spinner";
import { getItemTypesWithItems } from "../helpers/itemHelper.js"; import { updateLocalStorage } from "../helpers/localStorageHelpers";
import {
getLocalStorage,
updateLocalStorage,
} from "../helpers/localStorageHelpers";
import { unsubscribeUser } from "../helpers/subscribeHelpers.js"; import { unsubscribeUser } from "../helpers/subscribeHelpers.js";
import WelcomePage from "./WelcomePage.js"; import WelcomePage from "./WelcomePage.js";
@@ -218,6 +214,18 @@ function CafePage({
itemList={itemType.itemList} itemList={itemType.itemList}
isEditMode={isEditMode} isEditMode={isEditMode}
raw={isEditMode || filterId == 0 ? false : true} 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)
}
/> />
))} ))}
</body> </body>