From 7207e92e38c1d254e0474ad69bad0a85d2b08da3 Mon Sep 17 00:00:00 2001 From: Mahyar Khanbolooki Date: Wed, 9 Jul 2025 00:34:17 +0330 Subject: [PATCH] add: menu filter modal --- src/app/[name]/page.tsx | 39 ++++++++++++++++- src/components/icons/CloseIcon.tsx | 43 +++++++++++++++++++ src/components/menu/Menu.tsx | 3 +- .../overlays/BlurredOverlayContainer.tsx | 10 +++-- 4 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 src/components/icons/CloseIcon.tsx diff --git a/src/app/[name]/page.tsx b/src/app/[name]/page.tsx index ab15c1d..0078d48 100644 --- a/src/app/[name]/page.tsx +++ b/src/app/[name]/page.tsx @@ -11,6 +11,10 @@ import VerticalScrollView from "@/components/listview/VerticalScrollView"; import MenuItemRenderer from "@/components/listview/MenuItemRenderer"; import React from "react"; import MenuItem from "@/components/listview/MenuItem"; +import BlurredOverlayContainer from "@/components/overlays/BlurredOverlayContainer"; +import CloseIcon from "@/components/icons/CloseIcon"; +import clsx from "clsx"; +import Button from "@/components/button/PrimaryButton"; const categories = new Array(13).fill({ title: "خوراک", icon: "" }); @@ -118,6 +122,7 @@ const foods = [ const MenuIndex = () => { const [search, setSearch] = useState(""); const [selectedCategory, setSelectedCategory] = useState(0); + const [filterModal, setFilterModal] = useState(false); const updateSearch = useCallback((e: React.ChangeEvent) => { setSearch(e.target.value); @@ -127,6 +132,11 @@ const MenuIndex = () => { setSelectedCategory(id); }, []); + const toggleFilterModal = useCallback(() => { + setFilterModal((state) => !state); + }, []); + + const filteredReceiptItems = useMemo(() => { const lowerSearch = search.toLowerCase(); return foods.filter( @@ -136,6 +146,7 @@ const MenuIndex = () => { ); }, [selectedCategory, search]); + return (
@@ -164,7 +175,7 @@ const MenuIndex = () => { {categories[selectedCategory]?.title}
- @@ -182,6 +193,32 @@ const MenuIndex = () => { ))} + + +
+
+
فیلتر ها
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
); }; diff --git a/src/components/icons/CloseIcon.tsx b/src/components/icons/CloseIcon.tsx new file mode 100644 index 0000000..7450a8d --- /dev/null +++ b/src/components/icons/CloseIcon.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +interface CloseIconProps { + className?: string; + stroke?: string; + strokeWidth?: number; + size?: number; +} + +const CloseIcon: React.FC = ({ + className = '', + stroke = '#8C90A3', + strokeWidth = 1.5, + size = 20, +}) => { + return ( + + + + + ); +}; + +export default CloseIcon; diff --git a/src/components/menu/Menu.tsx b/src/components/menu/Menu.tsx index ede4452..5af6fec 100644 --- a/src/components/menu/Menu.tsx +++ b/src/components/menu/Menu.tsx @@ -76,8 +76,7 @@ function Menu({ menuState, toggleMenuState, nightModeState, togglenightModeState return (
- -
+
{ e.stopPropagation(); }} diff --git a/src/components/overlays/BlurredOverlayContainer.tsx b/src/components/overlays/BlurredOverlayContainer.tsx index 91c2cd3..2e5dfd8 100644 --- a/src/components/overlays/BlurredOverlayContainer.tsx +++ b/src/components/overlays/BlurredOverlayContainer.tsx @@ -7,7 +7,7 @@ type Props = { bgOpacity?: string changeDelay?: string effectdelay?: string -} & React.DetailedHTMLProps, HTMLButtonElement> +} & React.DetailedHTMLProps, HTMLDivElement> const BlurredOverlayContainer = ({ visible = true, @@ -15,6 +15,7 @@ const BlurredOverlayContainer = ({ changeDelay = '0', effectdelay = '0', children, + onClick, ...props }: Props) => { const [loaded, setLoaded] = useState(visible) @@ -35,11 +36,11 @@ const BlurredOverlayContainer = ({ visible || loaded ? 'z-50' : !visible && !loaded ? '-z-50' : 'z-0' return ( - +
) }