diff --git a/src/components/common/Header/Header.tsx b/src/components/common/Header/Header.tsx index 4bed36757..092bcc8e7 100644 --- a/src/components/common/Header/Header.tsx +++ b/src/components/common/Header/Header.tsx @@ -1,5 +1,6 @@ import classNames from 'classnames' import React, { memo, useEffect, useRef, useState } from 'react' +import { useProductFilter } from 'src/components/contexts' import { useModalCommon } from 'src/components/hooks' import ModalAuthenticate from '../ModalAuthenticate/ModalAuthenticate' import ModalCreateUserInfo from '../ModalCreateUserInfo/ModalCreateUserInfo' @@ -9,11 +10,12 @@ import HeaderSubMenu from './components/HeaderSubMenu/HeaderSubMenu' import HeaderSubMenuMobile from './components/HeaderSubMenuMobile/HeaderSubMenuMobile' import s from './Header.module.scss' interface props { - toggleFilter: () => void, + } -const Header = memo(({ toggleFilter }: props) => { +const Header = memo(({ }: props) => { const headeFullRef = useRef(null) + const { toggleProductFilter: toggleFilter } = useProductFilter() const [isFullHeader, setIsFullHeader] = useState(true) const [isModeAuthenRegister, setIsModeAuthenRegister] = useState(false) const { visible: visibleModalAuthen, closeModal: closeModalAuthen, openModal: openModalAuthen } = useModalCommon({ initialValue: false }) diff --git a/src/components/common/Layout/Layout.tsx b/src/components/common/Layout/Layout.tsx index ec5a1646d..82853117b 100644 --- a/src/components/common/Layout/Layout.tsx +++ b/src/components/common/Layout/Layout.tsx @@ -1,7 +1,7 @@ import { CommerceProvider } from '@framework' import { useRouter } from 'next/router' import { FC } from 'react' -import { CartDrawerProvider, MessageProvider } from 'src/components/contexts' +import { CartDrawerProvider, MessageProvider, ProductFilterProvider } from 'src/components/contexts' import LayoutContent from './LayoutContent/LayoutContent' interface Props { className?: string @@ -13,9 +13,11 @@ const Layout: FC = ({ children }) => { return ( - - {children} - + + + {children} + + ) diff --git a/src/components/common/Layout/LayoutContent/LayoutContent.tsx b/src/components/common/Layout/LayoutContent/LayoutContent.tsx index 58ff83c95..7bfddafe7 100644 --- a/src/components/common/Layout/LayoutContent/LayoutContent.tsx +++ b/src/components/common/Layout/LayoutContent/LayoutContent.tsx @@ -15,21 +15,12 @@ interface Props { const LayoutContent: FC = ({ children }) => { const router = useRouter() - const { visible: visibleFilter, openModal: openFilter, closeModal: closeFilter } = useModalCommon({ initialValue: false }) const {messages, removeMessage} = useMessage() - const toggleFilter = () => { - if (visibleFilter) { - closeFilter() - } else { - openFilter() - } - } - return ( <>
-
+
{ router.pathname === ROUTE.ACCOUNT ?
@@ -39,7 +30,7 @@ const LayoutContent: FC = ({ children }) => { } { - FILTER_PAGE.includes(router.pathname) && (
) + FILTER_PAGE.includes(router.pathname) && (
) }
diff --git a/src/components/common/MenuNavigationProductList/MenuNavigationProductList.tsx b/src/components/common/MenuNavigationProductList/MenuNavigationProductList.tsx index 122e8e3f8..546fbf365 100644 --- a/src/components/common/MenuNavigationProductList/MenuNavigationProductList.tsx +++ b/src/components/common/MenuNavigationProductList/MenuNavigationProductList.tsx @@ -3,6 +3,7 @@ import classNames from 'classnames'; import { useRouter } from 'next/router'; import React, { useEffect, useState } from 'react'; import { ButtonCommon } from 'src/components/common'; +import { useProductFilter } from 'src/components/contexts'; import { useGetAllCollection } from 'src/components/hooks/collection'; import { useFacets } from 'src/components/hooks/facets'; import IconHide from 'src/components/icons/IconHide'; @@ -15,8 +16,7 @@ import s from './MenuNavigationProductList.module.scss'; import MenuSort from './MenuSort/MenuSort'; interface Props { - visible: boolean, - onClose: () => void + } const FACET_QUERY = { @@ -32,8 +32,9 @@ const FACET_QUERY = { } } as QueryFacetsArgs -const MenuNavigationProductList = ({ visible, onClose }: Props) => { +const MenuNavigationProductList = ({}: Props) => { const router = useRouter() + const { productFilterVisible: visible, closeProductFilter: onClose } = useProductFilter() const { facets, loading: facetsLoading } = useFacets(FACET_QUERY) const { collections, loading: collectionLoading } = useGetAllCollection() const [brandQuery, setBrandQuery] = useState([]) diff --git a/src/components/contexts/FilterContext.tsx b/src/components/contexts/FilterContext.tsx deleted file mode 100644 index 36a10ce9f..000000000 --- a/src/components/contexts/FilterContext.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { createContext, ReactNode, useContext, useState } from "react"; -import { filterContextType } from "src/utils/types.utils"; - -const contextDefaultValues: filterContextType = { - visible: false, - open: () => {}, - close: () => {}, -}; - -const FilterContext = createContext(contextDefaultValues); - -export function useAuth() { - return useContext(FilterContext); -} - -type FilterProviderProps = { - children: ReactNode; -}; - -export function FilterProvider({ children }: FilterProviderProps) { - const [visible, setVisible] = useState(false); - - const open = () => { - setVisible(true); - }; - - const close = () => { - setVisible(false); - }; - - const value = { - visible, - open, - close, - }; - return ( - <> - - {children} - - - ); -} \ No newline at end of file diff --git a/src/components/contexts/ProductFilter/ProductFilterContext.tsx b/src/components/contexts/ProductFilter/ProductFilterContext.tsx new file mode 100644 index 000000000..10417f528 --- /dev/null +++ b/src/components/contexts/ProductFilter/ProductFilterContext.tsx @@ -0,0 +1,20 @@ +import { createContext, useContext } from 'react'; + +export type ProductFilterContextType = { + productFilterVisible: boolean; + toggleProductFilter: (visible?: boolean) => void; + openProductFilter: () => void; + closeProductFilter: () => void; +}; +const DEFAULT_VALUE: ProductFilterContextType = { + productFilterVisible: false, + toggleProductFilter: () => { }, + openProductFilter: () => { }, + closeProductFilter: () => { }, +}; + +export const ProductFilterContext = createContext(DEFAULT_VALUE) + +export function useProductFilter() { + return useContext(ProductFilterContext); +} diff --git a/src/components/contexts/ProductFilter/ProductFilterProvider.tsx b/src/components/contexts/ProductFilter/ProductFilterProvider.tsx new file mode 100644 index 000000000..068b9daab --- /dev/null +++ b/src/components/contexts/ProductFilter/ProductFilterProvider.tsx @@ -0,0 +1,30 @@ +import { ReactNode, useState } from "react"; +import { ProductFilterContext } from "./ProductFilterContext"; + +type Props = { + children: ReactNode; +}; + +export function ProductFilterProvider({ children }: Props) { + const [visible, setVisible] = useState(false); + + const closeProductFilter = () => { + setVisible(false); + }; + + const openProductFilter = () => { + setVisible(true); + }; + + const toggleProductFilter = () => { + setVisible(!visible); + }; + + return ( + <> + + {children} + + + ); +} \ No newline at end of file diff --git a/src/components/contexts/index.ts b/src/components/contexts/index.ts index 795c9161c..38e0c0b49 100644 --- a/src/components/contexts/index.ts +++ b/src/components/contexts/index.ts @@ -3,3 +3,6 @@ export * from './CartDrawer/CartDrawerProvider' export * from './Message/MessageContext' export * from './Message/MessageProvider' + +export * from './ProductFilter/ProductFilterContext' +export * from './ProductFilter/ProductFilterProvider' diff --git a/src/components/modules/product-list/ProductListFilter/ProductListFilter.module.scss b/src/components/modules/product-list/ProductListFilter/ProductListFilter.module.scss index 84951b540..d3223831a 100644 --- a/src/components/modules/product-list/ProductListFilter/ProductListFilter.module.scss +++ b/src/components/modules/product-list/ProductListFilter/ProductListFilter.module.scss @@ -16,29 +16,34 @@ .list{ @apply w-full; .top { + .left { + @apply flex justify-between items-center; + } + + .iconFilter { + @apply relative; + &:focus { + outline: none; + filter: brightness(1.05); + } + &:focus-visible { + outline: 2px solid var(--text-active); + } + .dot { + @apply absolute; + top: -0.08rem; + right: -0.2rem; + background-color: var(--negative); + width: 1.2rem; + height: 1.2rem; + border-radius: 1.2rem; + } + } @screen md { @apply flex justify-between flex-wrap w-full; margin: 1rem 0; - } - } - .inner{ - @screen md { - @apply flex flex-col items-center justify-center; - } - .boxItem { - @screen md { - @apply flex justify-between flex-wrap; - margin: 1rem 0; - } - .item { - @screen md { - width: calc(97% / 2); - margin-top:1rem; - } - @screen lg{ - width: calc(97% / 3); - margin-top:1rem; - } + .iconFilter { + @apply hidden; } } } diff --git a/src/components/modules/product-list/ProductListFilter/ProductListFilter.tsx b/src/components/modules/product-list/ProductListFilter/ProductListFilter.tsx index f99e50c0d..558b9197a 100644 --- a/src/components/modules/product-list/ProductListFilter/ProductListFilter.tsx +++ b/src/components/modules/product-list/ProductListFilter/ProductListFilter.tsx @@ -4,8 +4,9 @@ import { useRouter } from 'next/router' import React, { useEffect, useState } from 'react' import { HeadingCommon, ListProductCardSkeleton, ProductList } from 'src/components/common' import BreadcrumbCommon from 'src/components/common/BreadcrumbCommon/BreadcrumbCommon' -import SkeletonImage from 'src/components/common/SkeletonCommon/SkeletonImage/SkeletonImage' +import { useProductFilter } from 'src/components/contexts' import { useSearchProducts } from 'src/components/hooks/product' +import { IconFilter } from 'src/components/icons' import { DEFAULT_PAGE_SIZE, QUERY_KEY, QUERY_SPLIT_SEPERATOR, ROUTE } from 'src/utils/constanst.utils' import { getFacetIdsFromCodes, getPageFromQuery, getProductSortParamFromQuery } from 'src/utils/funtion.utils' import s from './ProductListFilter.module.scss' @@ -34,6 +35,7 @@ const DEFAULT_SEARCH_ARGS = { const ProductListFilter = ({ facets, collections, products, total }: ProductListFilterProps) => { const router = useRouter() + const { openProductFilter } = useProductFilter() const [initialQueryFlag, setInitialQueryFlag] = useState(true) const [optionQueryProduct, setOptionQueryProduct] = useState({ input: DEFAULT_SEARCH_ARGS }) const { products: productSearchResult, totalItems, loading } = useSearchProducts(optionQueryProduct) @@ -101,14 +103,20 @@ const ProductListFilter = ({ facets, collections, products, total }: ProductList
- SPECIAL RECIPES +
+ SPECIAL RECIPES + +
{ - (!initialQueryFlag && loading && !productSearchResult) && + (!initialQueryFlag && loading && !productSearchResult) && }