mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-13 12:55:00 +00:00
refactor(core): adapter to new journal and property (#8508)
remove old WorkspacePropertyAdapter add JournalService
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta';
|
||||
import { WorkspacePropertiesAdapter } from '@affine/core/modules/properties';
|
||||
import { JournalService } from '@affine/core/modules/journal';
|
||||
import { I18n } from '@affine/i18n';
|
||||
import { track } from '@affine/track';
|
||||
import type { EditorHost } from '@blocksuite/affine/block-std';
|
||||
@@ -21,9 +21,9 @@ export function createLinkedWidgetConfig(
|
||||
) => {
|
||||
const currentWorkspace = framework.get(WorkspaceService).workspace;
|
||||
const rawMetas = currentWorkspace.docCollection.meta.docMetas;
|
||||
const adapter = framework.get(WorkspacePropertiesAdapter);
|
||||
const journalService = framework.get(JournalService);
|
||||
const isJournal = (d: DocMeta) =>
|
||||
!!adapter.getJournalPageDateString(d.id);
|
||||
!!journalService.journalDate$(d.id).value;
|
||||
|
||||
const docDisplayMetaService = framework.get(DocDisplayMetaService);
|
||||
const docMetas = rawMetas
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { FavoriteTag } from '@affine/core/components/page-list';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { toast } from '@affine/core/utils';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
import { track } from '@affine/track';
|
||||
|
||||
@@ -9,12 +9,11 @@ import {
|
||||
Scrollable,
|
||||
} from '@affine/component';
|
||||
import { useNavigateHelper } from '@affine/core/components/hooks/use-navigate-helper';
|
||||
import { WorkspaceLegacyProperties } from '@affine/core/modules/properties';
|
||||
import type { Tag } from '@affine/core/modules/tag';
|
||||
import { DeleteTagConfirmModal, TagService } from '@affine/core/modules/tag';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
import { DeleteIcon, MoreHorizontalIcon, TagsIcon } from '@blocksuite/icons/rc';
|
||||
import { useLiveData, useService } from '@toeverything/infra';
|
||||
import { useLiveData, useService, WorkspaceService } from '@toeverything/infra';
|
||||
import clsx from 'clsx';
|
||||
import { clamp } from 'lodash-es';
|
||||
import type { HTMLAttributes, PropsWithChildren } from 'react';
|
||||
@@ -84,7 +83,7 @@ export const EditTagMenu = ({
|
||||
onTagDelete: (tagIds: string[]) => void;
|
||||
}>) => {
|
||||
const t = useI18n();
|
||||
const legacyProperties = useService(WorkspaceLegacyProperties);
|
||||
const workspaceService = useService(WorkspaceService);
|
||||
const tagService = useService(TagService);
|
||||
const tagList = tagService.tagList;
|
||||
const tag = useLiveData(tagList.tagByTagId$(tagId));
|
||||
@@ -135,7 +134,7 @@ export const EditTagMenu = ({
|
||||
<MenuItem
|
||||
prefixIcon={<TagsIcon />}
|
||||
onClick={() => {
|
||||
navigate.jumpToTag(legacyProperties.workspaceId, tag?.id || '');
|
||||
navigate.jumpToTag(workspaceService.workspace.id, tag?.id || '');
|
||||
}}
|
||||
>
|
||||
{t['com.affine.page-properties.tags.open-tags-page']()}
|
||||
@@ -171,7 +170,7 @@ export const EditTagMenu = ({
|
||||
),
|
||||
} satisfies Partial<MenuProps>;
|
||||
}, [
|
||||
legacyProperties.workspaceId,
|
||||
workspaceService,
|
||||
navigate,
|
||||
onTagDelete,
|
||||
t,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { toast } from '@affine/component';
|
||||
import { useBlockSuiteDocMeta } from '@affine/core/components/hooks/use-block-suite-page-meta';
|
||||
import { FavoriteTag } from '@affine/core/components/page-list/components/favorite-tag';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { ShareDocsListService } from '@affine/core/modules/share-doc';
|
||||
import { PublicPageMode } from '@affine/graphql';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
} from '@affine/core/commands';
|
||||
import { DocInfoService } from '@affine/core/modules/doc-info';
|
||||
import type { Editor } from '@affine/core/modules/editor';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
import { track } from '@affine/track';
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
import { useService } from '@toeverything/infra';
|
||||
import { useDebouncedState } from 'foxact/use-debounced-state';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
import { WorkspacePropertiesAdapter } from '../../modules/properties';
|
||||
|
||||
function getProxy<T extends object>(obj: T) {
|
||||
return new Proxy(obj, {});
|
||||
}
|
||||
|
||||
const useReactiveAdapter = (adapter: WorkspacePropertiesAdapter) => {
|
||||
// hack: delay proxy creation to avoid unnecessary re-render + render in another component issue
|
||||
const [proxy, setProxy] = useDebouncedState(adapter, 0);
|
||||
useEffect(() => {
|
||||
// TODO(@Peng): track which properties are used and then filter by property path change
|
||||
// using Y.YEvent.path
|
||||
function observe() {
|
||||
setProxy(getProxy(adapter));
|
||||
}
|
||||
const disposables: (() => void)[] = [];
|
||||
disposables.push(
|
||||
adapter.workspace.docCollection.meta.docMetaUpdated.on(observe).dispose
|
||||
);
|
||||
adapter.properties.observeDeep(observe);
|
||||
disposables.push(() => adapter.properties.unobserveDeep(observe));
|
||||
return () => {
|
||||
for (const dispose of disposables) {
|
||||
dispose();
|
||||
}
|
||||
};
|
||||
}, [adapter, setProxy]);
|
||||
|
||||
return proxy;
|
||||
};
|
||||
|
||||
export function useCurrentWorkspacePropertiesAdapter() {
|
||||
const adapter = useService(WorkspacePropertiesAdapter);
|
||||
return useReactiveAdapter(adapter);
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import { EditorSettingService } from '@affine/core/modules/editor-settting';
|
||||
import { JournalService } from '@affine/core/modules/journal';
|
||||
import { i18nTime } from '@affine/i18n';
|
||||
import { track } from '@affine/track';
|
||||
import { type DocCollection, Text } from '@blocksuite/affine/store';
|
||||
@@ -13,7 +14,6 @@ import dayjs from 'dayjs';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
|
||||
import { WorkbenchService } from '../../modules/workbench';
|
||||
import { useCurrentWorkspacePropertiesAdapter } from './use-affine-adapter';
|
||||
import { useDocCollectionHelper } from './use-block-suite-workspace-helper';
|
||||
|
||||
type MaybeDate = Date | string | number;
|
||||
@@ -30,14 +30,16 @@ function toDayjs(j?: string | false) {
|
||||
return day;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use `JournalService` directly
|
||||
*/
|
||||
export const useJournalHelper = (docCollection: DocCollection) => {
|
||||
const bsWorkspaceHelper = useDocCollectionHelper(docCollection);
|
||||
const { docsService, editorSettingService } = useServices({
|
||||
const { docsService, editorSettingService, journalService } = useServices({
|
||||
DocsService,
|
||||
EditorSettingService,
|
||||
JournalService,
|
||||
});
|
||||
const adapter = useCurrentWorkspacePropertiesAdapter();
|
||||
const { isPageJournal } = useJournalInfoHelper();
|
||||
|
||||
/**
|
||||
* @internal
|
||||
@@ -62,10 +64,10 @@ export const useJournalHelper = (docCollection: DocCollection) => {
|
||||
note: editorSettingService.editorSetting.get('affine:note'),
|
||||
};
|
||||
initDocFromProps(page, docProps);
|
||||
adapter.setJournalPageDateString(page.id, title);
|
||||
journalService.setJournalDate(page.id, title);
|
||||
return page;
|
||||
},
|
||||
[adapter, bsWorkspaceHelper, docsService.list, editorSettingService]
|
||||
[journalService, bsWorkspaceHelper, docsService.list, editorSettingService]
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -73,17 +75,11 @@ export const useJournalHelper = (docCollection: DocCollection) => {
|
||||
*/
|
||||
const getJournalsByDate = useCallback(
|
||||
(maybeDate: MaybeDate) => {
|
||||
const day = dayjs(maybeDate);
|
||||
return Array.from(docCollection.docs.values()).filter(page => {
|
||||
const pageId = page.id;
|
||||
if (!isPageJournal(pageId)) return false;
|
||||
if (page.meta?.trash) return false;
|
||||
const journalDate = adapter.getJournalPageDateString(page.id);
|
||||
if (!journalDate) return false;
|
||||
return day.isSame(journalDate, 'day');
|
||||
});
|
||||
return journalService.getJournalsByDate(
|
||||
dayjs(maybeDate).format(JOURNAL_DATE_FORMAT)
|
||||
);
|
||||
},
|
||||
[adapter, isPageJournal, docCollection.docs]
|
||||
[journalService]
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -92,34 +88,18 @@ export const useJournalHelper = (docCollection: DocCollection) => {
|
||||
const getJournalByDate = useCallback(
|
||||
(maybeDate: MaybeDate) => {
|
||||
const pages = getJournalsByDate(maybeDate);
|
||||
if (pages.length) return pages[0].getDoc();
|
||||
if (pages.length) return pages[0];
|
||||
return _createJournal(maybeDate);
|
||||
},
|
||||
[_createJournal, getJournalsByDate]
|
||||
);
|
||||
|
||||
const appendContentToToday = useCallback(
|
||||
async (content: string) => {
|
||||
if (!content) return;
|
||||
const page = getJournalByDate(dayjs().format(JOURNAL_DATE_FORMAT));
|
||||
if (!page) return;
|
||||
const blockId = page.addBlock(
|
||||
'affine:paragraph',
|
||||
{ text: new page.Text(content) },
|
||||
page.getBlockByFlavour('affine:note')[0].id
|
||||
);
|
||||
return { page, blockId };
|
||||
},
|
||||
[getJournalByDate]
|
||||
);
|
||||
|
||||
return useMemo(
|
||||
() => ({
|
||||
getJournalsByDate,
|
||||
getJournalByDate,
|
||||
appendContentToToday,
|
||||
}),
|
||||
[getJournalsByDate, getJournalByDate, appendContentToToday]
|
||||
[getJournalsByDate, getJournalByDate]
|
||||
);
|
||||
};
|
||||
|
||||
@@ -164,31 +144,33 @@ export const useJournalRouteHelper = (docCollection: DocCollection) => {
|
||||
);
|
||||
};
|
||||
|
||||
// get journal info that don't rely on `docCollection`
|
||||
/**
|
||||
* @deprecated use `JournalService` directly
|
||||
*/
|
||||
export const useJournalInfoHelper = (pageId?: string | null) => {
|
||||
const adapter = useCurrentWorkspacePropertiesAdapter();
|
||||
const journalService = useService(JournalService);
|
||||
|
||||
const isPageJournal = useCallback(
|
||||
(pageId: string) => {
|
||||
return !!adapter.getJournalPageDateString(pageId);
|
||||
return !!journalService.journalDate$(pageId).value;
|
||||
},
|
||||
[adapter]
|
||||
[journalService]
|
||||
);
|
||||
|
||||
const isPageTodayJournal = useCallback(
|
||||
(pageId: string) => {
|
||||
const date = dayjs().format(JOURNAL_DATE_FORMAT);
|
||||
const d = adapter.getJournalPageDateString(pageId);
|
||||
const d = journalService.journalDate$(pageId).value;
|
||||
return isPageJournal(pageId) && d === date;
|
||||
},
|
||||
[adapter, isPageJournal]
|
||||
[isPageJournal, journalService]
|
||||
);
|
||||
|
||||
const getJournalDateString = useCallback(
|
||||
(pageId: string) => {
|
||||
return adapter.getJournalPageDateString(pageId);
|
||||
return journalService.journalDate$(pageId).value;
|
||||
},
|
||||
[adapter]
|
||||
[journalService]
|
||||
);
|
||||
|
||||
const getLocalizedJournalDateString = useCallback(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { toast } from '@affine/component';
|
||||
import { CollectionService } from '@affine/core/modules/collection';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
import { useLiveData, useService, WorkspaceService } from '@toeverything/infra';
|
||||
import { useCallback, useMemo, useState } from 'react';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import type { Tag } from '@affine/core/modules/tag';
|
||||
import { TagService } from '@affine/core/modules/tag';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
|
||||
@@ -9,8 +9,10 @@ import { useBlockSuiteMetaHelper } from '@affine/core/components/hooks/affine/us
|
||||
import { useTrashModalHelper } from '@affine/core/components/hooks/affine/use-trash-modal-helper';
|
||||
import { useCatchEventCallback } from '@affine/core/components/hooks/use-catch-event-hook';
|
||||
import { DocInfoService } from '@affine/core/modules/doc-info';
|
||||
import { FavoriteService } from '@affine/core/modules/favorite';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import {
|
||||
CompatibleFavoriteItemsAdapter,
|
||||
FavoriteService,
|
||||
} from '@affine/core/modules/favorite';
|
||||
import { WorkbenchService } from '@affine/core/modules/workbench';
|
||||
import type { Collection, DeleteCollectionInfo } from '@affine/env/filter';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { ShareDocsListService } from '@affine/core/modules/share-doc';
|
||||
import type { Collection, Filter } from '@affine/env/filter';
|
||||
import { PublicPageMode } from '@affine/graphql';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { MenuItemProps } from '@affine/component';
|
||||
import { Menu, MenuItem } from '@affine/component';
|
||||
import { useDeleteCollectionInfo } from '@affine/core/components/hooks/affine/use-delete-collection-info';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { WorkbenchService } from '@affine/core/modules/workbench';
|
||||
import type { Collection } from '@affine/env/filter';
|
||||
import { useI18n } from '@affine/i18n';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Button, IconButton, Tooltip } from '@affine/component';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import type { Collection } from '@affine/env/filter';
|
||||
import { Trans, useI18n } from '@affine/i18n';
|
||||
import type { DocMeta } from '@blocksuite/affine/store';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { IconButton, Menu, toast } from '@affine/component';
|
||||
import { useBlockSuiteDocMeta } from '@affine/core/components/hooks/use-block-suite-page-meta';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/properties';
|
||||
import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite';
|
||||
import { ShareDocsListService } from '@affine/core/modules/share-doc';
|
||||
import { PublicPageMode } from '@affine/graphql';
|
||||
import { Trans, useI18n } from '@affine/i18n';
|
||||
|
||||
Reference in New Issue
Block a user