diff --git a/src/app/ui/app.tsx b/src/app/ui/app.tsx index 3f720d3..706e3a1 100644 --- a/src/app/ui/app.tsx +++ b/src/app/ui/app.tsx @@ -1,7 +1,12 @@ import { AppRouter } from '@app/lib/routes' +import { DrawerContextProvider } from '@features/drawer/lib/drawerContext' function App() { - return + return ( + + + + ) } export default App \ No newline at end of file diff --git a/src/features/drawer/lib/drawerContext.tsx b/src/features/drawer/lib/drawerContext.tsx new file mode 100644 index 0000000..fa21707 --- /dev/null +++ b/src/features/drawer/lib/drawerContext.tsx @@ -0,0 +1,26 @@ +import { useMediaQuery } from '@shared/lib/useMediaQuery' +import { createContext, useContext, useEffect, useState } from 'react' + +type DrawerContextValue = { + isOpen: boolean + setIsOpen: React.Dispatch> +} + +export const DrawerContext = createContext({ + isOpen: false, + setIsOpen: () => {} +}) + +export const DrawerContextProvider = ({ children }: { children: React.ReactNode }) => { + const [isOpen, setIsOpen] = useState(true) + + const isLargeScreen = useMediaQuery('(min-width: 1280px)') + + useEffect(() => { + setIsOpen(isLargeScreen) + }, [isLargeScreen]) + + return {children} +} + +export const useDrawer = () => useContext(DrawerContext) \ No newline at end of file diff --git a/src/features/drawer/ui/index.tsx b/src/features/drawer/ui/index.tsx index a5f6b28..15f6e47 100644 --- a/src/features/drawer/ui/index.tsx +++ b/src/features/drawer/ui/index.tsx @@ -1,29 +1,9 @@ import { FaAngleLeft } from 'react-icons/fa6' -import { useEffect, useState } from 'react' - -const useMediaQuery = (query: string) => { - const [matches, setMatches] = useState(false) - useEffect(() => { - const media = window.matchMedia(query) - if (media.matches !== matches) { - setMatches(media.matches) - } - const listener = () => { - setMatches(media.matches) - } - media.addEventListener('change', listener) - return () => media.removeEventListener('change', listener) - }, [matches, query]) - return matches -} +import { useEffect } from 'react' +import { useDrawer } from '../lib/drawerContext' export default function Drawer(props: { children: React.ReactNode }) { - const [isOpen, setIsOpen] = useState(false) - const isLargeScreen = useMediaQuery('(min-width: 1280px)') - - useEffect(() => { - setIsOpen(isLargeScreen) - }, [isLargeScreen]) + const { isOpen, setIsOpen } = useDrawer() useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { @@ -48,7 +28,7 @@ export default function Drawer(props: { children: React.ReactNode }) { window.addEventListener('keydown', handleKeyDown) return () => window.removeEventListener('keydown', handleKeyDown) - }, []) + }, [setIsOpen]) return (
diff --git a/src/shared/lib/useMediaQuery.tsx b/src/shared/lib/useMediaQuery.tsx new file mode 100644 index 0000000..a51c528 --- /dev/null +++ b/src/shared/lib/useMediaQuery.tsx @@ -0,0 +1,17 @@ +import { useEffect, useState } from 'react' + +export const useMediaQuery = (query: string) => { + const [matches, setMatches] = useState(true) + useEffect(() => { + const media = window.matchMedia(query) + if (media.matches !== matches) { + setMatches(media.matches) + } + const listener = () => { + setMatches(media.matches) + } + media.addEventListener('change', listener) + return () => media.removeEventListener('change', listener) + }, [matches, query]) + return matches +} \ No newline at end of file