ok
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -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;
|
||||||
})}
|
})}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user