diff --git a/src/ApiDocs.res b/src/ApiDocs.res index 0a50b5a24..e1efa0990 100644 --- a/src/ApiDocs.res +++ b/src/ApiDocs.res @@ -288,13 +288,19 @@ module DocstringsStylize = { let make = (props: props) => { let (_, setScrollLock) = ScrollLockContext.useScrollLock() - let (isSidebarOpen, setSidebarOpen) = React.useState(_ => true) - - let toggleSidebar = () => - setSidebarOpen(prev => { - setScrollLock(_ => !prev) - !prev - }) + let isMobile = Hooks.useIsMobile() + let (isSidebarOpen, setSidebarOpen) = React.useState(_ => false) + + React.useEffect(() => { + setSidebarOpen(_ => !isMobile) + None + }, [isMobile]) + + let toggleSidebar = () => { + let nextSidebarOpen = !(isSidebarOpen && isMobile) + setSidebarOpen(_ => nextSidebarOpen) + setScrollLock(_ => nextSidebarOpen && isMobile) + } let children = { open Markdown diff --git a/src/common/Hooks.res b/src/common/Hooks.res index 148ce7790..7a6ed85eb 100644 --- a/src/common/Hooks.res +++ b/src/common/Hooks.res @@ -69,3 +69,21 @@ let useScrollDirection = (~topMargin=80, ~threshold=20) => { scrollDir } + +let useIsMobile = (~breakpoint=768) => { + let (isMobile, setIsMobile) = React.useState(() => false) + + React.useEffect(() => { + let check = () => window.innerWidth < breakpoint + setIsMobile(_ => check()) + + let onResize = _ => { + setIsMobile(_ => check()) + } + + WebAPI.Window.addEventListener(window, Resize, onResize) + Some(() => WebAPI.Window.removeEventListener(window, Resize, onResize)) + }, [breakpoint]) + + isMobile +}