import React, { useState, useEffect, useRef, useCallback } from "react"; import axios from "axios"; import { isAutheticated } from "src/auth"; import { Button, Box, IconButton, Modal, Pagination, TextField, Typography, } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; import { ClipLoader } from "react-spinners"; import swal from "sweetalert"; import { toast } from "react-hot-toast"; import debounce from "lodash.debounce"; const style = { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)", width: 400, bgcolor: "background.paper", borderRadius: "0.5rem", boxShadow: 24, width: "500px", }; const Brands = () => { const token = isAutheticated(); const nameRef = useRef(); const [loading, setLoading] = useState(true); const [updating, setUpdating] = useState(true); const [saveLoading, setSaveLoading] = useState(true); const [edit, setEdit] = useState(false); const [brandName, setBrandName] = useState(""); const [brandId, setBrandId] = useState(""); const [brands, setBrands] = useState([]); const [itemPerPage, setItemPerPage] = useState(10); const [page, setPage] = useState(1); const [open, setOpen] = useState(false); const [olderBrandName, setOlderBrandName] = useState(""); const handleOpen = () => setOpen(true); const handleClose = () => { setOpen(false); setEdit(false); setBrandName(""); setBrandId(""); }; const getBrands = async () => { try { setLoading(true); // Set loading to true before fetching const response = await axios.get("/api/brand/getBrands", { params: { // page, // show: itemPerPage, brandName: nameRef.current?.value || "", }, // Include pagination and search }); if (response.status === 200) { setBrands(response.data.brands); } } catch (error) { console.error("Failed to fetch brands:", error); } finally { setLoading(false); // Set loading to false after fetching } }; useEffect(() => { getBrands(); }, []); const handleEditClick = (_id, brandName) => { setOpen(true); setBrandName(brandName); setBrandId(_id); setOlderBrandName(brandName); setEdit(true); }; const handleUpdate = async () => { const filteredBrandNames = brands .filter( (brand) => brand.brandName.toLowerCase() !== olderBrandName.toLowerCase() ) .map((brand) => brand.brandName.toLowerCase()); if (filteredBrandNames.includes(brandName.toLowerCase())) { swal("Warning", "Brand already exists", "error"); return; } if (!brandName) { swal("Warning", "Please fill all the required fields!", "error"); return; } setUpdating(false); const formData = new FormData(); formData.append("brandName", brandName); try { await axios.patch(`/api/brand/update/${brandId}`, formData, { headers: { Authorization: `Bearer ${token}` }, }); handleClose(); toast.success("Brand updated successfully"); getBrands(); } catch (err) { swal("Error", "Failed to update brand", "error"); } finally { setUpdating(true); } }; const handleDelete = (_id) => { swal({ title: "Are you sure?", icon: "warning", buttons: { Yes: { text: "Yes", value: true }, Cancel: { text: "Cancel", value: "cancel" }, }, }).then(async (value) => { if (value === true) { try { await axios.delete(`/api/brand/delete/${_id}`, { headers: { Authorization: `Bearer ${token}` }, }); toast.success("Brand deleted successfully"); getBrands(); } catch (err) { swal("Error", "Failed to delete brand", "error"); } } }); }; const handleSaveBrand = async () => { if ( brands.some( (brand) => brand.brandName.toLowerCase() === brandName.toLowerCase() ) ) { swal("Warning", "Brand already exists.", "error"); return; } if (!brandName) { swal("Warning", "Please fill all the required fields!", "error"); return; } setSaveLoading(false); const formData = new FormData(); formData.append("brandName", brandName); try { await axios.post("/api/brand/add", formData, { headers: { Authorization: `Bearer ${token}`, "Content-Type": "multipart/form-data", }, }); handleClose(); swal("Success", "New brand added successfully!", "success"); getBrands(); } catch (error) { swal("Error", "Failed to add brand", "error"); } finally { setSaveLoading(true); } }; const getPageCount = () => Math.max(1, Math.ceil(brands?.length / itemPerPage)); const debouncedSearch = useCallback( debounce(() => { setPage(1); getBrands(); }, 500), [] ); const handleSearchChange = () => { debouncedSearch(); }; return (
Brands
Brand Name handleClose()}>
setBrandName( e.target.value.charAt(0).toUpperCase() + e.target.value.slice(1) ) } /> {brandName ? ( <> {25 - brandName.length} characters left ) : ( <> )} {!edit && ( )} {edit && ( )}
{!loading && brands.length === 0 && ( )} {loading ? ( ) : ( brands && brands .slice( (`${page}` - 1) * itemPerPage, `${page}` * itemPerPage ) .map((item, i) => ( )) )}
Brand Name Action
No Data Available
Loading...
{item.brandName}
setPage(value)} />
); }; export default Brands;