diff options
| author | AAGaming <aagaming@riseup.net> | 2024-10-04 23:59:53 -0400 |
|---|---|---|
| committer | AAGaming <aagaming@riseup.net> | 2024-10-11 15:05:15 -0400 |
| commit | 7b32df09487383897927356547f1ba5a73e8cc94 (patch) | |
| tree | 18932621c4d2ac794e5fd1b5cb6968c4554b66e0 /frontend/src/components/DeckyDesktopSidebar.tsx | |
| parent | 306b0ff8d6206a912478ed1e3d3dbf82b8a85c41 (diff) | |
| download | decky-loader-7b32df09487383897927356547f1ba5a73e8cc94.tar.gz decky-loader-7b32df09487383897927356547f1ba5a73e8cc94.zip | |
Add routerhook for desktop UI and a basic sidebar menu for Decky in desktop UI
Diffstat (limited to 'frontend/src/components/DeckyDesktopSidebar.tsx')
| -rw-r--r-- | frontend/src/components/DeckyDesktopSidebar.tsx | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/frontend/src/components/DeckyDesktopSidebar.tsx b/frontend/src/components/DeckyDesktopSidebar.tsx new file mode 100644 index 00000000..f159652b --- /dev/null +++ b/frontend/src/components/DeckyDesktopSidebar.tsx @@ -0,0 +1,72 @@ +import { FC, useEffect, useRef, useState } from 'react'; + +import { useDeckyState } from './DeckyState'; +import PluginView from './PluginView'; +import { QuickAccessVisibleState } from './QuickAccessVisibleState'; + +const DeckyDesktopSidebar: FC = () => { + const { desktopMenuOpen, setDesktopMenuOpen } = useDeckyState(); + const [closed, setClosed] = useState<boolean>(!desktopMenuOpen); + const [openAnimStart, setOpenAnimStart] = useState<boolean>(desktopMenuOpen); + const closedInterval = useRef<number | null>(null); + + useEffect(() => { + const anim = requestAnimationFrame(() => setOpenAnimStart(desktopMenuOpen)); + return () => cancelAnimationFrame(anim); + }, [desktopMenuOpen]); + + useEffect(() => { + closedInterval.current && clearTimeout(closedInterval.current); + if (desktopMenuOpen) { + setClosed(false); + } else { + closedInterval.current = setTimeout(() => setClosed(true), 500); + } + }, [desktopMenuOpen]); + return ( + <> + <div + className="deckyDesktopSidebarDim" + style={{ + position: 'absolute', + height: 'calc(100% - 78px - 50px)', + width: '100%', + top: '78px', + left: '0px', + zIndex: 998, + background: 'rgba(0, 0, 0, 0.7)', + opacity: openAnimStart ? 1 : 0, + display: desktopMenuOpen || !closed ? 'flex' : 'none', + transition: 'opacity 0.4s cubic-bezier(0.65, 0, 0.35, 1)', + }} + onClick={() => setDesktopMenuOpen(false)} + /> + + <div + className="deckyDesktopSidebar" + style={{ + position: 'absolute', + height: 'calc(100% - 78px - 50px)', + width: '350px', + paddingLeft: '16px', + top: '78px', + right: '0px', + zIndex: 999, + transition: 'transform 0.4s cubic-bezier(0.65, 0, 0.35, 1)', + transform: openAnimStart ? 'translateX(0px)' : 'translateX(366px)', + overflowY: 'scroll', + // prevents chromium border jank + display: desktopMenuOpen || !closed ? 'flex' : 'none', + flexDirection: 'column', + background: '#171d25', + }} + > + <QuickAccessVisibleState.Provider value={desktopMenuOpen || !closed}> + <PluginView desktop={true} /> + </QuickAccessVisibleState.Provider> + </div> + </> + ); +}; + +export default DeckyDesktopSidebar; |
