mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 04:18:54 +00:00
fix(mobile): close menu when detail page navigate away (#8027)
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import { useI18n } from '@affine/i18n';
|
||||||
import { ArrowLeftSmallIcon } from '@blocksuite/icons/rc';
|
import { ArrowLeftSmallIcon } from '@blocksuite/icons/rc';
|
||||||
import { Slot } from '@radix-ui/react-slot';
|
import { Slot } from '@radix-ui/react-slot';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
@@ -48,10 +49,13 @@ export const MobileMenu = ({
|
|||||||
[onPointerDownOutside, rootOptions]
|
[onPointerDownOutside, rootOptions]
|
||||||
);
|
);
|
||||||
|
|
||||||
const onItemClick = useCallback((e: any) => {
|
const onItemClick = useCallback(
|
||||||
e.preventDefault();
|
(e: any) => {
|
||||||
setOpen(prev => !prev);
|
e.preventDefault();
|
||||||
}, []);
|
onOpenChange(!open);
|
||||||
|
},
|
||||||
|
[onOpenChange, open]
|
||||||
|
);
|
||||||
|
|
||||||
// dynamic height for slider
|
// dynamic height for slider
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -78,6 +82,8 @@ export const MobileMenu = ({
|
|||||||
};
|
};
|
||||||
}, [activeIndex, finalOpen]);
|
}, [activeIndex, finalOpen]);
|
||||||
|
|
||||||
|
const t = useI18n();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For cascading menu usage
|
* For cascading menu usage
|
||||||
* ```tsx
|
* ```tsx
|
||||||
@@ -139,7 +145,7 @@ export const MobileMenu = ({
|
|||||||
onClick={() => setSubMenus(prev => prev.slice(0, index))}
|
onClick={() => setSubMenus(prev => prev.slice(0, index))}
|
||||||
prefixStyle={{ width: 20, height: 20 }}
|
prefixStyle={{ width: 20, height: 20 }}
|
||||||
>
|
>
|
||||||
Back
|
{t['com.affine.backButton']()}
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
{sub.items}
|
{sub.items}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { useFavorite } from '@affine/core/components/blocksuite/block-suite-head
|
|||||||
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
||||||
import { track } from '@affine/core/mixpanel';
|
import { track } from '@affine/core/mixpanel';
|
||||||
import { EditorService } from '@affine/core/modules/editor';
|
import { EditorService } from '@affine/core/modules/editor';
|
||||||
|
import { ViewService } from '@affine/core/modules/workbench/services/view';
|
||||||
import { EditorOutlinePanel } from '@affine/core/pages/workspace/detail-page/tabs/outline';
|
import { EditorOutlinePanel } from '@affine/core/pages/workspace/detail-page/tabs/outline';
|
||||||
import { preventDefault } from '@affine/core/utils';
|
import { preventDefault } from '@affine/core/utils';
|
||||||
import { useI18n } from '@affine/i18n';
|
import { useI18n } from '@affine/i18n';
|
||||||
@@ -19,7 +20,7 @@ import {
|
|||||||
TocIcon,
|
TocIcon,
|
||||||
} from '@blocksuite/icons/rc';
|
} from '@blocksuite/icons/rc';
|
||||||
import { useLiveData, useService } from '@toeverything/infra';
|
import { useLiveData, useService } from '@toeverything/infra';
|
||||||
import { useCallback } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
|
|
||||||
import * as styles from './page-header-more-button.css';
|
import * as styles from './page-header-more-button.css';
|
||||||
import { DocInfoSheet } from './sheets/doc-info';
|
import { DocInfoSheet } from './sheets/doc-info';
|
||||||
@@ -34,6 +35,9 @@ export const PageHeaderMenuButton = ({ docId }: PageMenuProps) => {
|
|||||||
const editorService = useService(EditorService);
|
const editorService = useService(EditorService);
|
||||||
const editorContainer = useLiveData(editorService.editor.editorContainer$);
|
const editorContainer = useLiveData(editorService.editor.editorContainer$);
|
||||||
|
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const location = useLiveData(useService(ViewService).view.location$);
|
||||||
|
|
||||||
const isInTrash = useLiveData(
|
const isInTrash = useLiveData(
|
||||||
editorService.editor.doc.meta$.map(meta => meta.trash)
|
editorService.editor.doc.meta$.map(meta => meta.trash)
|
||||||
);
|
);
|
||||||
@@ -57,8 +61,14 @@ export const PageHeaderMenuButton = ({ docId }: PageMenuProps) => {
|
|||||||
if (open) {
|
if (open) {
|
||||||
track.$.header.docOptions.open();
|
track.$.header.docOptions.open();
|
||||||
}
|
}
|
||||||
|
setOpen(open);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// when the location is changed, close the menu
|
||||||
|
handleMenuOpenChange(false);
|
||||||
|
}, [handleMenuOpenChange, location.pathname]);
|
||||||
|
|
||||||
const handleToggleFavorite = useCallback(() => {
|
const handleToggleFavorite = useCallback(() => {
|
||||||
track.$.header.docOptions.toggleFavorite();
|
track.$.header.docOptions.toggleFavorite();
|
||||||
toggleFavorite();
|
toggleFavorite();
|
||||||
@@ -117,6 +127,7 @@ export const PageHeaderMenuButton = ({ docId }: PageMenuProps) => {
|
|||||||
align: 'center',
|
align: 'center',
|
||||||
}}
|
}}
|
||||||
rootOptions={{
|
rootOptions={{
|
||||||
|
open,
|
||||||
onOpenChange: handleMenuOpenChange,
|
onOpenChange: handleMenuOpenChange,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user