import Grid from "@mui/material/Grid"; import {useAlert} from "../../../hooks/useAlert"; import * as React from "react"; import {useCallback, useEffect, useState} from "react"; import {Cocktail} from "../../../components/cocktails/Cocktail"; import {Fab, Skeleton} from "@mui/material"; import Box from "@mui/material/Box"; import {NoResult} from "../../../components/cocktails/NoResult"; import {FilterBlock} from "../../../components/cocktails/FilterBlock"; import {CocktailInfoModal} from "../../../components/cocktails/CocktailInfoModal"; import {useUser} from "../../../hooks/useUser"; import {blue} from "@mui/material/colors"; import UpIcon from "@mui/icons-material/KeyboardArrowUp"; import {useSelect} from "../../../hooks/useSelect"; import Paper from "@mui/material/Paper"; import CheckMarks from "../../../components/cocktails/CheckMarks"; import {cocktailClient} from "../../../lib/clients/CocktailClient"; const emptyFilter = { search: "", all: false, hidden: true, onlyFavourite: false, glass: [], category: [], alcohol: [], iCount: [], ingredient: [], inMenu: "", sorting: "Название по возрастанию" } const CocktailsPageContent = () => { const {user} = useUser(); const {createError, createSuccess} = useAlert(); const [rows, setRows] = useState([]); const [filter, setFilter] = useState(emptyFilter) // const [chips, setChips] = useState([]) const chips = []; const [page, setPage] = useState(-1); const [load, setLoad] = useState(false); const [isEnd, setIsEnd] = useState(false); const [isNew, setIsNew] = useState(true); const {selectCocktail, getCocktail, getOpenCocktail} = useSelect(); const loading = useCallback(() => { const size = Math.floor((window.innerWidth) / 350) * 5; if (load || (!isNew && isEnd)) { return false; } cocktailClient.getMenu(setRows, setIsNew, setPage, setLoad, setIsEnd, isNew, rows, page, size, filter, createError); // eslint-disable-next-line }, [load, isEnd, page]); useEffect(() => { const handleScroll = () => { const {scrollTop, scrollHeight, clientHeight} = document.documentElement; if (scrollTop + clientHeight >= scrollHeight - 100) { loading(); } } window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); // eslint-disable-next-line }, [loading]); // eslint-disable-next-line useEffect(() => loading(), [filter]) const renderSkeleton = () => { return Array.from({length: 3}, () => null) .map((v, index) => ); } const handleChangeRating = (row, value) => { const newState = rows.map((r) => { if (row.id === r.id) { let newRating = r.rating; newRating.rating = value return { ...r, rating: newRating } } return r; }) cocktailClient.changeRating(row.id, newState, value, setRows, createSuccess, createError) } const handleFilterChange = (filterName, value) => { const newState = { ...filter, [filterName]: value } setFilter(newState) setIsNew(true); setIsEnd(false); setPage(-1); } const handleFavourite = (row) => { const value = !row.rating.favourite; const newState = rows.map((r) => { if (r.id === row.id) { let newRating = r.rating; newRating.favourite = value; return { ...r, rating: newRating } } return r; }); cocktailClient.changeFavourite(value, row.id, newState, setRows, createSuccess, createError) } const handleFilterClear = () => { setFilter(emptyFilter); setIsNew(true); setIsEnd(false); setPage(-1); } const handleSelectCocktail = (row) => selectCocktail(row.id) const deleteHandle = (row) => cocktailClient.deleteCocktail(row.id, rows, setRows, createSuccess, createError) const hideHandler = (id) => { cocktailClient.hiddenCocktail(id) .then(() => { createSuccess("Коктейль скрыт успешно"); setRows(rows.filter((r) => r.id !== id)) }).catch(() => createError("Ошибка при попытке скрыть коктейль")) } return ( {/**/} {/*Модальное окно информации о коктейле*/} {/*Блок фильтров*/} { (filter.all && filter.iCount === 1) && ( ) } {/*Основное содержимое*/} {rows.length > 0 && rows.map((row) => { return ( ) })} {load && renderSkeleton()} {rows.length === 0 && ()} window.window.scrollTo(0, 0)} aria-label='Expand' color='inherit'> ); } export default CocktailsPageContent;