mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
fix: nav panel and main panel animation on hide menu
This commit is contained in:
parent
84f41cec76
commit
543846c241
@ -1,7 +1,15 @@
|
|||||||
export const Breadcrumbs = () => {
|
import { ShowMenuSvg } from '../../_shared/svg/ShowMenuSvg';
|
||||||
|
|
||||||
|
export const Breadcrumbs = ({ menuHidden, onShowMenuClick }: { menuHidden: boolean; onShowMenuClick: () => void }) => {
|
||||||
return (
|
return (
|
||||||
<div className={'flex items-center'}>
|
<div className={'flex items-center'}>
|
||||||
<div className={'mr-4 flex items-center'}>
|
<div className={'mr-4 flex items-center'}>
|
||||||
|
{menuHidden && (
|
||||||
|
<button onClick={() => onShowMenuClick()} className={'mr-2 h-5 w-5'}>
|
||||||
|
<ShowMenuSvg></ShowMenuSvg>
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
|
||||||
<button className={'p-1'} onClick={() => history.back()}>
|
<button className={'p-1'} onClick={() => history.back()}>
|
||||||
<img src={'/images/home/arrow_left.svg'} />
|
<img src={'/images/home/arrow_left.svg'} />
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { Breadcrumbs } from './Breadcrumbs';
|
import { Breadcrumbs } from './Breadcrumbs';
|
||||||
import { PageOptions } from './PageOptions';
|
import { PageOptions } from './PageOptions';
|
||||||
|
|
||||||
export const HeaderPanel = () => {
|
export const HeaderPanel = ({ menuHidden, onShowMenuClick }: { menuHidden: boolean; onShowMenuClick: () => void }) => {
|
||||||
return (
|
return (
|
||||||
<div className={'flex h-[60px] items-center justify-between border-b border-shade-6 px-8'}>
|
<div className={'flex h-[60px] items-center justify-between border-b border-shade-6 px-8'}>
|
||||||
<Breadcrumbs></Breadcrumbs>
|
<Breadcrumbs menuHidden={menuHidden} onShowMenuClick={onShowMenuClick}></Breadcrumbs>
|
||||||
<PageOptions></PageOptions>
|
<PageOptions></PageOptions>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -1,11 +1,40 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode, useEffect, useState } from 'react';
|
||||||
import { HeaderPanel } from './HeaderPanel/HeaderPanel';
|
import { HeaderPanel } from './HeaderPanel/HeaderPanel';
|
||||||
import { FooterPanel } from './FooterPanel';
|
import { FooterPanel } from './FooterPanel';
|
||||||
|
|
||||||
export const MainPanel = ({ children }: { children: ReactNode }) => {
|
const ANIMATION_DURATION = 300;
|
||||||
|
|
||||||
|
export const MainPanel = ({
|
||||||
|
left,
|
||||||
|
menuHidden,
|
||||||
|
onShowMenuClick,
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
left: number;
|
||||||
|
menuHidden: boolean;
|
||||||
|
onShowMenuClick: () => void;
|
||||||
|
children: ReactNode;
|
||||||
|
}) => {
|
||||||
|
const [animation, setAnimation] = useState(false);
|
||||||
|
useEffect(() => {
|
||||||
|
if (!menuHidden) {
|
||||||
|
setTimeout(() => {
|
||||||
|
setAnimation(false);
|
||||||
|
}, ANIMATION_DURATION);
|
||||||
|
} else {
|
||||||
|
setAnimation(true);
|
||||||
|
}
|
||||||
|
}, [menuHidden]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={'flex h-full flex-1 flex-col'}>
|
<div
|
||||||
<HeaderPanel></HeaderPanel>
|
className={`absolute inset-0 flex h-full flex-1 flex-col`}
|
||||||
|
style={{
|
||||||
|
transition: menuHidden || animation ? `left ${ANIMATION_DURATION}ms ease-out` : 'none',
|
||||||
|
left: `${menuHidden ? 0 : left}px`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<HeaderPanel menuHidden={menuHidden} onShowMenuClick={onShowMenuClick}></HeaderPanel>
|
||||||
<div className={'min-h-0 flex-1 overflow-auto'}>{children}</div>
|
<div className={'min-h-0 flex-1 overflow-auto'}>{children}</div>
|
||||||
<FooterPanel></FooterPanel>
|
<FooterPanel></FooterPanel>
|
||||||
</div>
|
</div>
|
||||||
|
@ -14,6 +14,7 @@ export const useNavigationPanelHooks = function () {
|
|||||||
const width = useAppSelector((state) => state.navigationWidth);
|
const width = useAppSelector((state) => state.navigationWidth);
|
||||||
const [navigationPanelFixed, setNavigationPanelFixed] = useState(true);
|
const [navigationPanelFixed, setNavigationPanelFixed] = useState(true);
|
||||||
const [slideInFloatingPanel, setSlideInFloatingPanel] = useState(true);
|
const [slideInFloatingPanel, setSlideInFloatingPanel] = useState(true);
|
||||||
|
const [menuHidden, setMenuHidden] = useState(false);
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
@ -28,6 +29,14 @@ export const useNavigationPanelHooks = function () {
|
|||||||
|
|
||||||
const [floatingPanelWidth, setFloatingPanelWidth] = useState(0);
|
const [floatingPanelWidth, setFloatingPanelWidth] = useState(0);
|
||||||
|
|
||||||
|
const onHideMenuClick = () => {
|
||||||
|
setMenuHidden(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onShowMenuClick = () => {
|
||||||
|
setMenuHidden(false);
|
||||||
|
};
|
||||||
|
|
||||||
const onPageClick = (page: IPage) => {
|
const onPageClick = (page: IPage) => {
|
||||||
let pageTypeRoute = (() => {
|
let pageTypeRoute = (() => {
|
||||||
switch (page.pageType) {
|
switch (page.pageType) {
|
||||||
@ -69,5 +78,8 @@ export const useNavigationPanelHooks = function () {
|
|||||||
onScreenMouseMove,
|
onScreenMouseMove,
|
||||||
slideInFloatingPanel,
|
slideInFloatingPanel,
|
||||||
setFloatingPanelWidth,
|
setFloatingPanelWidth,
|
||||||
|
menuHidden,
|
||||||
|
onHideMenuClick,
|
||||||
|
onShowMenuClick,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -9,15 +9,18 @@ import { IFolder } from '../../../stores/reducers/folders/slice';
|
|||||||
import { IPage } from '../../../stores/reducers/pages/slice';
|
import { IPage } from '../../../stores/reducers/pages/slice';
|
||||||
|
|
||||||
const MINIMUM_WIDTH = 200;
|
const MINIMUM_WIDTH = 200;
|
||||||
|
const ANIMATION_DURATION = 300;
|
||||||
|
|
||||||
export const NavigationPanel = ({
|
export const NavigationPanel = ({
|
||||||
onCollapseNavigationClick,
|
onHideMenuClick,
|
||||||
|
menuHidden,
|
||||||
width,
|
width,
|
||||||
folders,
|
folders,
|
||||||
pages,
|
pages,
|
||||||
onPageClick,
|
onPageClick,
|
||||||
}: {
|
}: {
|
||||||
onCollapseNavigationClick: () => void;
|
onHideMenuClick: () => void;
|
||||||
|
menuHidden: boolean;
|
||||||
width: number;
|
width: number;
|
||||||
folders: IFolder[];
|
folders: IFolder[];
|
||||||
pages: IPage[];
|
pages: IPage[];
|
||||||
@ -25,9 +28,16 @@ export const NavigationPanel = ({
|
|||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className={'flex flex-col justify-between bg-surface-1 text-sm'} style={{ width: `${width}px` }}>
|
<div
|
||||||
|
className={`absolute inset-0 flex flex-col justify-between bg-surface-1 text-sm`}
|
||||||
|
style={{
|
||||||
|
transition: `left ${ANIMATION_DURATION}ms ease-out`,
|
||||||
|
width: `${width}px`,
|
||||||
|
left: `${menuHidden ? -width : 0}px`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div className={'flex flex-col'}>
|
<div className={'flex flex-col'}>
|
||||||
<AppLogo iconToShow={'hide'} onHideMenuClick={onCollapseNavigationClick}></AppLogo>
|
<AppLogo iconToShow={'hide'} onHideMenuClick={onHideMenuClick}></AppLogo>
|
||||||
|
|
||||||
<Workspace></Workspace>
|
<Workspace></Workspace>
|
||||||
|
|
||||||
|
@ -26,30 +26,25 @@ export const Screen = ({ children }: { children: ReactNode }) => {
|
|||||||
onScreenMouseMove,
|
onScreenMouseMove,
|
||||||
slideInFloatingPanel,
|
slideInFloatingPanel,
|
||||||
setFloatingPanelWidth,
|
setFloatingPanelWidth,
|
||||||
|
onHideMenuClick,
|
||||||
|
onShowMenuClick,
|
||||||
|
menuHidden,
|
||||||
} = useNavigationPanelHooks();
|
} = useNavigationPanelHooks();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div onMouseMove={onScreenMouseMove} className='flex h-screen w-screen bg-white text-black'>
|
<div onMouseMove={onScreenMouseMove} className='flex h-screen w-screen bg-white text-black'>
|
||||||
{navigationPanelFixed ? (
|
<NavigationPanel
|
||||||
<NavigationPanel
|
onHideMenuClick={onHideMenuClick}
|
||||||
onCollapseNavigationClick={onCollapseNavigationClick}
|
width={width}
|
||||||
width={width}
|
folders={folders}
|
||||||
folders={folders}
|
pages={pages}
|
||||||
pages={pages}
|
onPageClick={onPageClick}
|
||||||
onPageClick={onPageClick}
|
menuHidden={menuHidden}
|
||||||
></NavigationPanel>
|
></NavigationPanel>
|
||||||
) : (
|
|
||||||
<NavigationFloatingPanel
|
|
||||||
onFixNavigationClick={onFixNavigationClick}
|
|
||||||
slideInFloatingPanel={slideInFloatingPanel}
|
|
||||||
folders={folders}
|
|
||||||
pages={pages}
|
|
||||||
onPageClick={onPageClick}
|
|
||||||
setWidth={setFloatingPanelWidth}
|
|
||||||
></NavigationFloatingPanel>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<MainPanel>{children}</MainPanel>
|
<MainPanel left={width} menuHidden={menuHidden} onShowMenuClick={onShowMenuClick}>
|
||||||
|
{children}
|
||||||
|
</MainPanel>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user