| 1 |
import { Button } from '@wordpress/components' |
| 2 |
import { useRef, useEffect, useState, useCallback } from '@wordpress/element' |
| 3 |
import { __ } from '@wordpress/i18n' |
| 4 |
import { useWhenIdle } from '@extendify/hooks/helpers' |
| 5 |
import { GridView } from '@extendify/pages/GridView' |
| 6 |
import { Sidebar } from '@extendify/pages/Sidebar' |
| 7 |
import { useTemplatesStore } from '@extendify/state/Templates' |
| 8 |
import HasSidebar from './HasSidebar' |
| 9 |
import { Toolbar } from './Toolbar' |
| 10 |
|
| 11 |
export const Layout = ({ setOpen }) => { |
| 12 |
const gridContainer = useRef() |
| 13 |
const searchParams = useTemplatesStore((state) => state.searchParams) |
| 14 |
const [showIdleScreen, setShowIdleScreen] = useState(false) |
| 15 |
const resetTemplates = useTemplatesStore((state) => state.resetTemplates) |
| 16 |
const idle = useWhenIdle(300_000) // 5 minutes |
| 17 |
const removeIdleScreen = useCallback(() => { |
| 18 |
setShowIdleScreen(false) |
| 19 |
resetTemplates() |
| 20 |
}, [resetTemplates]) |
| 21 |
|
| 22 |
useEffect(() => { |
| 23 |
if (idle) setShowIdleScreen(true) |
| 24 |
}, [idle]) |
| 25 |
useEffect(() => { |
| 26 |
setShowIdleScreen(false) |
| 27 |
}, [searchParams]) |
| 28 |
useEffect(() => { |
| 29 |
if (!gridContainer.current) return |
| 30 |
gridContainer.current.scrollTop = 0 |
| 31 |
}, [searchParams]) |
| 32 |
|
| 33 |
return ( |
| 34 |
<div className="relative mx-auto flex h-full max-w-screen-4xl flex-col items-center"> |
| 35 |
<div className="w-full flex-grow overflow-hidden"> |
| 36 |
<button |
| 37 |
onClick={() => |
| 38 |
document |
| 39 |
.getElementById('extendify-templates') |
| 40 |
.querySelector('button') |
| 41 |
.focus() |
| 42 |
} |
| 43 |
className="extendify-skip-to-sr-link sr-only focus:not-sr-only focus:text-blue-500"> |
| 44 |
{__('Skip to templates', 'extendify')} |
| 45 |
</button> |
| 46 |
<div className="relative mx-auto h-full sm:flex"> |
| 47 |
<HasSidebar> |
| 48 |
<Sidebar /> |
| 49 |
<div className="relative z-30 flex h-full flex-col"> |
| 50 |
<Toolbar |
| 51 |
className="hidden h-20 w-full flex-shrink-0 px-6 sm:block md:px-8" |
| 52 |
hideLibrary={() => setOpen(false)} |
| 53 |
/> |
| 54 |
<div |
| 55 |
ref={gridContainer} |
| 56 |
className="z-20 flex-grow overflow-y-auto px-6 md:px-8"> |
| 57 |
{showIdleScreen ? ( |
| 58 |
<IdleScreen callback={removeIdleScreen} /> |
| 59 |
) : ( |
| 60 |
<GridView /> |
| 61 |
)} |
| 62 |
</div> |
| 63 |
</div> |
| 64 |
</HasSidebar> |
| 65 |
</div> |
| 66 |
</div> |
| 67 |
</div> |
| 68 |
) |
| 69 |
} |
| 70 |
|
| 71 |
const IdleScreen = ({ callback }) => ( |
| 72 |
<div className="flex h-full flex-col items-center justify-center"> |
| 73 |
<p className="mb-6 text-sm font-normal text-extendify-gray"> |
| 74 |
{__("We've added new stuff while you were away.", 'extendify')} |
| 75 |
</p> |
| 76 |
<Button |
| 77 |
className="components-button border-color-wp-theme-500 bg-wp-theme-500 text-white hover:bg-wp-theme-600" |
| 78 |
onClick={callback}> |
| 79 |
{__('Reload')} |
| 80 |
</Button> |
| 81 |
</div> |
| 82 |
) |
| 83 |
|