fix(core): restore lost activation state of sidebar menu items (#6520)

https://github.com/toeverything/AFFiNE/assets/102217452/41a53a43-e17d-41b5-b8e5-2ca42bcfae0a
This commit is contained in:
JimmFly
2024-04-12 10:36:04 +00:00
parent 6a535b94c3
commit 62f90e5f10
4 changed files with 19 additions and 17 deletions

View File

@@ -1,4 +1,5 @@
import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references'; import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references';
import { Workbench } from '@affine/core/modules/workbench';
import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { EdgelessIcon, PageIcon } from '@blocksuite/icons'; import { EdgelessIcon, PageIcon } from '@blocksuite/icons';
import type { DocCollection, DocMeta } from '@blocksuite/store'; import type { DocCollection, DocMeta } from '@blocksuite/store';
@@ -6,7 +7,6 @@ import { useDraggable } from '@dnd-kit/core';
import * as Collapsible from '@radix-ui/react-collapsible'; import * as Collapsible from '@radix-ui/react-collapsible';
import { PageRecordList, useLiveData, useService } from '@toeverything/infra'; import { PageRecordList, useLiveData, useService } from '@toeverything/infra';
import React, { useCallback, useMemo } from 'react'; import React, { useCallback, useMemo } from 'react';
import { useParams } from 'react-router-dom';
import { import {
type DNDIdentifier, type DNDIdentifier,
@@ -35,12 +35,13 @@ export const Page = ({
allPageMeta: Record<string, DocMeta>; allPageMeta: Record<string, DocMeta>;
}) => { }) => {
const [collapsed, setCollapsed] = React.useState(true); const [collapsed, setCollapsed] = React.useState(true);
const params = useParams(); const workbench = useService(Workbench);
const location = useLiveData(workbench.location$);
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const pageId = page.id; const pageId = page.id;
const active = params.pageId === pageId; const active = location.pathname === '/' + pageId;
const pageRecord = useLiveData(useService(PageRecordList).record$(pageId)); const pageRecord = useLiveData(useService(PageRecordList).record$(pageId));
const pageMode = useLiveData(pageRecord?.mode$); const pageMode = useLiveData(pageRecord?.mode$);
const dragItemId = getDNDId('collection-list', 'doc', pageId, parentId); const dragItemId = getDNDId('collection-list', 'doc', pageId, parentId);

View File

@@ -1,11 +1,11 @@
import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references'; import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references';
import { Workbench } from '@affine/core/modules/workbench';
import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { EdgelessIcon, PageIcon } from '@blocksuite/icons'; import { EdgelessIcon, PageIcon } from '@blocksuite/icons';
import type { DocCollection, DocMeta } from '@blocksuite/store'; import type { DocCollection, DocMeta } from '@blocksuite/store';
import * as Collapsible from '@radix-ui/react-collapsible'; import * as Collapsible from '@radix-ui/react-collapsible';
import { PageRecordList, useLiveData, useService } from '@toeverything/infra'; import { PageRecordList, useLiveData, useService } from '@toeverything/infra';
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { useParams } from 'react-router-dom';
import { MenuLinkItem } from '../../../app-sidebar'; import { MenuLinkItem } from '../../../app-sidebar';
import * as styles from '../favorite/styles.css'; import * as styles from '../favorite/styles.css';
@@ -24,8 +24,9 @@ export const ReferencePage = ({
parentIds, parentIds,
}: ReferencePageProps) => { }: ReferencePageProps) => {
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const params = useParams(); const workbench = useService(Workbench);
const active = params.pageId === pageId; const location = useLiveData(workbench.location$);
const active = location.pathname === '/' + pageId;
const pageRecord = useLiveData(useService(PageRecordList).record$(pageId)); const pageRecord = useLiveData(useService(PageRecordList).record$(pageId));
const pageMode = useLiveData(pageRecord?.mode$); const pageMode = useLiveData(pageRecord?.mode$);

View File

@@ -3,6 +3,7 @@ import {
parseDNDId, parseDNDId,
} from '@affine/core/hooks/affine/use-global-dnd-helper'; } from '@affine/core/hooks/affine/use-global-dnd-helper';
import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references'; import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references';
import { Workbench } from '@affine/core/modules/workbench';
import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { EdgelessIcon, PageIcon } from '@blocksuite/icons'; import { EdgelessIcon, PageIcon } from '@blocksuite/icons';
import { type AnimateLayoutChanges, useSortable } from '@dnd-kit/sortable'; import { type AnimateLayoutChanges, useSortable } from '@dnd-kit/sortable';
@@ -10,7 +11,6 @@ import { CSS } from '@dnd-kit/utilities';
import * as Collapsible from '@radix-ui/react-collapsible'; import * as Collapsible from '@radix-ui/react-collapsible';
import { PageRecordList, useLiveData, useService } from '@toeverything/infra'; import { PageRecordList, useLiveData, useService } from '@toeverything/infra';
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { useParams } from 'react-router-dom';
import { MenuLinkItem } from '../../../app-sidebar'; import { MenuLinkItem } from '../../../app-sidebar';
import { DragMenuItemOverlay } from '../components/drag-menu-item-overlay'; import { DragMenuItemOverlay } from '../components/drag-menu-item-overlay';
@@ -33,8 +33,9 @@ export const FavouriteDocSidebarNavItem = ({
sortable?: boolean; sortable?: boolean;
}) => { }) => {
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const params = useParams(); const workbench = useService(Workbench);
const linkActive = params.pageId === pageId; const location = useLiveData(workbench.location$);
const linkActive = location.pathname === '/' + pageId;
const pageRecord = useLiveData(useService(PageRecordList).record$(pageId)); const pageRecord = useLiveData(useService(PageRecordList).record$(pageId));
const pageMode = useLiveData(pageRecord?.mode$); const pageMode = useLiveData(pageRecord?.mode$);

View File

@@ -2,11 +2,11 @@ import {
useJournalInfoHelper, useJournalInfoHelper,
useJournalRouteHelper, useJournalRouteHelper,
} from '@affine/core/hooks/use-journal'; } from '@affine/core/hooks/use-journal';
import { Workbench } from '@affine/core/modules/workbench';
import type { DocCollection } from '@affine/core/shared'; import type { DocCollection } from '@affine/core/shared';
import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { TodayIcon, TomorrowIcon, YesterdayIcon } from '@blocksuite/icons'; import { TodayIcon, TomorrowIcon, YesterdayIcon } from '@blocksuite/icons';
import { Doc, useServiceOptional } from '@toeverything/infra'; import { useLiveData, useService } from '@toeverything/infra';
import { useParams } from 'react-router-dom';
import { MenuItem } from '../app-sidebar'; import { MenuItem } from '../app-sidebar';
@@ -18,17 +18,16 @@ export const AppSidebarJournalButton = ({
docCollection, docCollection,
}: AppSidebarJournalButtonProps) => { }: AppSidebarJournalButtonProps) => {
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const currentPage = useServiceOptional(Doc); const workbench = useService(Workbench);
const location = useLiveData(workbench.location$);
const { openToday } = useJournalRouteHelper(docCollection); const { openToday } = useJournalRouteHelper(docCollection);
const { journalDate, isJournal } = useJournalInfoHelper( const { journalDate, isJournal } = useJournalInfoHelper(
docCollection, docCollection,
currentPage?.id location.pathname.split('/')[1]
); );
const params = useParams();
const isJournalActive = isJournal && !!params.pageId;
const Icon = const Icon =
isJournalActive && journalDate isJournal && journalDate
? journalDate.isBefore(new Date(), 'day') ? journalDate.isBefore(new Date(), 'day')
? YesterdayIcon ? YesterdayIcon
: journalDate.isAfter(new Date(), 'day') : journalDate.isAfter(new Date(), 'day')
@@ -39,7 +38,7 @@ export const AppSidebarJournalButton = ({
return ( return (
<MenuItem <MenuItem
data-testid="slider-bar-journals-button" data-testid="slider-bar-journals-button"
active={isJournalActive} active={isJournal}
onClick={openToday} onClick={openToday}
icon={<Icon />} icon={<Icon />}
> >