refactor(editor): should not rely on doc collection type (#9501)

This commit is contained in:
Saul-Mirone
2025-01-03 06:30:27 +00:00
parent cb5d7eaabc
commit 897c7d4284
55 changed files with 200 additions and 158 deletions

View File

@@ -7,7 +7,7 @@ import type { ListHistoryQuery } from '@affine/graphql';
import { listHistoryQuery, recoverDocMutation } from '@affine/graphql';
import { i18nTime } from '@affine/i18n';
import { assertEquals } from '@blocksuite/affine/global/utils';
import { DocCollection } from '@blocksuite/affine/store';
import { DocCollection, type Workspace } from '@blocksuite/affine/store';
import { useService } from '@toeverything/infra';
import { useEffect, useMemo } from 'react';
import useSWRImmutable from 'swr/immutable';
@@ -99,7 +99,7 @@ const snapshotFetcher = async (
// so that we do not need to worry about providers etc
// TODO(@Peng): fix references to the page (the referenced page will shown as deleted)
// if we simply clone the current workspace, it maybe time consuming right?
const docCollectionMap = new Map<string, DocCollection>();
const docCollectionMap = new Map<string, Workspace>();
// assume the workspace is a cloud workspace since the history feature is only enabled for cloud workspace
const getOrCreateShellWorkspace = (
@@ -147,7 +147,7 @@ export const usePageHistory = (
// workspace id + page id + timestamp + snapshot -> Page (to be used for rendering in blocksuite editor)
export const useSnapshotPage = (
docCollection: DocCollection,
docCollection: Workspace,
pageDocId: string,
ts?: string
) => {
@@ -253,10 +253,7 @@ export function revertUpdate(
applyUpdate(doc, revertChangesSinceSnapshotUpdate);
}
export const useRestorePage = (
docCollection: DocCollection,
pageId: string
) => {
export const useRestorePage = (docCollection: Workspace, pageId: string) => {
const page = useDocCollectionPage(docCollection, pageId);
const mutateQueryResource = useMutateQueryResource();
const { trigger: recover, isMutating } = useMutation({

View File

@@ -11,10 +11,7 @@ import { WorkspaceService } from '@affine/core/modules/workspace';
import { i18nTime, Trans, useI18n } from '@affine/i18n';
import { track } from '@affine/track';
import type { DocMode } from '@blocksuite/affine/blocks';
import type {
Doc as BlockSuiteDoc,
DocCollection,
} from '@blocksuite/affine/store';
import type { Doc as BlockSuiteDoc, Workspace } from '@blocksuite/affine/store';
import { CloseIcon, ToggleCollapseIcon } from '@blocksuite/icons/rc';
import * as Collapsible from '@radix-ui/react-collapsible';
import type { DialogContentProps } from '@radix-ui/react-dialog';
@@ -48,7 +45,7 @@ import * as styles from './styles.css';
export interface PageHistoryModalProps {
open: boolean;
onOpenChange: (open: boolean) => void;
docCollection: DocCollection;
docCollection: Workspace;
pageId: string;
}
@@ -400,7 +397,7 @@ const PageHistoryManager = ({
pageId,
onClose,
}: {
docCollection: DocCollection;
docCollection: Workspace;
pageId: string;
onClose: () => void;
}) => {

View File

@@ -6,7 +6,7 @@ import { useInsidePeekView } from '@affine/core/modules/peek-view/view/modal-con
import { WorkbenchLink } from '@affine/core/modules/workbench';
import { track } from '@affine/track';
import type { DocMode } from '@blocksuite/affine/blocks';
import type { DocCollection } from '@blocksuite/affine/store';
import type { Workspace } from '@blocksuite/affine/store';
import { LiveData, useLiveData, useService } from '@toeverything/infra';
import clsx from 'clsx';
import { nanoid } from 'nanoid';
@@ -167,7 +167,7 @@ export function AffineSharedPageReference({
Icon,
onClick: userOnClick,
}: AffinePageReferenceProps & {
docCollection: DocCollection;
docCollection: Workspace;
}) {
const journalService = useService(JournalService);
const isJournal = !!useLiveData(journalService.journalDate$(pageId));

View File

@@ -5,11 +5,11 @@ import { DocsService } from '@affine/core/modules/doc';
import { EditorSettingService } from '@affine/core/modules/editor-setting';
import { WorkbenchService } from '@affine/core/modules/workbench';
import { type DocMode } from '@blocksuite/affine/blocks';
import type { DocCollection } from '@blocksuite/affine/store';
import type { Workspace } from '@blocksuite/affine/store';
import { useServices } from '@toeverything/infra';
import { useCallback, useMemo } from 'react';
export const usePageHelper = (docCollection: DocCollection) => {
export const usePageHelper = (docCollection: Workspace) => {
const {
docsService,
workbenchService,

View File

@@ -6,13 +6,13 @@ import { ShareDocsListService } from '@affine/core/modules/share-doc';
import { WorkspaceService } from '@affine/core/modules/workspace';
import { PublicPageMode } from '@affine/graphql';
import { useI18n } from '@affine/i18n';
import type { DocCollection, DocMeta } from '@blocksuite/affine/store';
import type { DocMeta, Workspace } from '@blocksuite/affine/store';
import { useLiveData, useService } from '@toeverything/infra';
import { type ReactNode, useCallback, useEffect, useMemo } from 'react';
export type AllPageListConfig = {
allPages: DocMeta[];
docCollection: DocCollection;
docCollection: Workspace;
/**
* Return `undefined` if the page is not public
*/

View File

@@ -1,9 +1,9 @@
import type { DeltaInsert } from '@blocksuite/affine/inline';
import type { DocCollection } from '@blocksuite/affine/store';
import type { Workspace } from '@blocksuite/affine/store';
import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
import { useCallback } from 'react';
export function useReferenceLinkHelper(docCollection: DocCollection) {
export function useReferenceLinkHelper(docCollection: Workspace) {
const addReferenceLink = useCallback(
(pageId: string, referenceId: string) => {
const page = docCollection?.getDoc(pageId);

View File

@@ -1,19 +1,17 @@
import type { DocCollection, DocMeta } from '@blocksuite/affine/store';
import type { DocMeta, Workspace } from '@blocksuite/affine/store';
import type { Atom } from 'jotai';
import { atom, useAtomValue } from 'jotai';
const weakMap = new WeakMap<DocCollection, Atom<DocMeta[]>>();
const weakMap = new WeakMap<Workspace, Atom<DocMeta[]>>();
// this hook is extracted from './use-block-suite-page-meta.ts' to avoid circular dependency
export function useAllBlockSuiteDocMeta(
docCollection: DocCollection
): DocMeta[] {
export function useAllBlockSuiteDocMeta(docCollection: Workspace): DocMeta[] {
if (!weakMap.has(docCollection)) {
const baseAtom = atom<DocMeta[]>([...docCollection.meta.docMetas]);
weakMap.set(docCollection, baseAtom);
baseAtom.onMount = set => {
set([...docCollection.meta.docMetas]);
const dispose = docCollection.meta.docMetaUpdated.on(() => {
const dispose = docCollection.slots.docListUpdated.on(() => {
set([...docCollection.meta.docMetas]);
});
return () => {

View File

@@ -1,6 +1,6 @@
import { DocsService } from '@affine/core/modules/doc';
import { WorkspaceService } from '@affine/core/modules/workspace';
import type { DocCollection, DocMeta } from '@blocksuite/affine/store';
import type { DocMeta, Workspace } from '@blocksuite/affine/store';
import { useService } from '@toeverything/infra';
import { useCallback, useMemo } from 'react';
@@ -13,7 +13,7 @@ import { useJournalInfoHelper } from './use-journal';
* If you want to get all pageMetas, use `useAllBlockSuitePageMeta` instead
* @returns
*/
export function useBlockSuiteDocMeta(docCollection: DocCollection) {
export function useBlockSuiteDocMeta(docCollection: Workspace) {
const pageMetas = useAllBlockSuiteDocMeta(docCollection);
const { isPageJournal } = useJournalInfoHelper();
return useMemo(

View File

@@ -1,7 +1,7 @@
import type { Doc, DocCollection } from '@blocksuite/affine/store';
import type { Doc, Workspace } from '@blocksuite/affine/store';
import { useMemo } from 'react';
export function useDocCollectionHelper(docCollection: DocCollection) {
export function useDocCollectionHelper(docCollection: Workspace) {
return useMemo(
() => ({
createDoc: (pageId?: string): Doc => {

View File

@@ -1,12 +1,12 @@
import { DebugLogger } from '@affine/debug';
import { DisposableGroup } from '@blocksuite/affine/global/utils';
import type { Doc, DocCollection } from '@blocksuite/affine/store';
import type { Doc, Workspace } from '@blocksuite/affine/store';
import { useEffect, useState } from 'react';
const logger = new DebugLogger('use-doc-collection-page');
export function useDocCollectionPage(
docCollection: DocCollection,
docCollection: Workspace,
pageId: string | null
): Doc | null {
const [page, setPage] = useState(

View File

@@ -2,7 +2,7 @@ import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta';
import type { Tag } from '@affine/env/filter';
import { useI18n } from '@affine/i18n';
import { assertExists } from '@blocksuite/affine/global/utils';
import type { DocCollection, DocMeta } from '@blocksuite/affine/store';
import type { DocMeta, Workspace } from '@blocksuite/affine/store';
import { ToggleCollapseIcon, ViewLayersIcon } from '@blocksuite/icons/rc';
import * as Collapsible from '@radix-ui/react-collapsible';
import { useLiveData, useService } from '@toeverything/infra';
@@ -274,7 +274,7 @@ export const TagListItemRenderer = memo(function TagListItemRenderer(
function tagIdToTagOption(
tagId: string,
docCollection: DocCollection
docCollection: Workspace
): Tag | undefined {
return docCollection.meta.properties.tags?.options.find(
opt => opt.id === tagId

View File

@@ -1,5 +1,5 @@
import type { Collection, Tag } from '@affine/env/filter';
import type { DocCollection, DocMeta } from '@blocksuite/affine/store';
import type { DocMeta, Workspace } from '@blocksuite/affine/store';
import type { JSX, PropsWithChildren, ReactNode } from 'react';
import type { To } from 'react-router-dom';
@@ -91,7 +91,7 @@ export type PageGroupByType =
export interface ListProps<T> {
// required data:
items: T[];
docCollection: DocCollection;
docCollection: Workspace;
className?: string;
hideHeader?: boolean; // whether or not to hide the header. default is false (showing header)
groupBy?: ItemGroupDefinition<T>[];

View File

@@ -1,12 +1,12 @@
import { DebugLogger } from '@affine/debug';
import { DisposableGroup } from '@blocksuite/affine/global/utils';
import type { Doc, DocCollection } from '@blocksuite/affine/store';
import type { Doc, Workspace } from '@blocksuite/affine/store';
import { useEffect, useState } from 'react';
const logger = new DebugLogger('useBlockSuiteWorkspacePage');
export function useDocCollectionPage(
docCollection: DocCollection,
docCollection: Workspace,
pageId: string | null
): Doc | null {
const [page, setPage] = useState(