mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-26 23:02:57 +08:00
feat: bump blocksuite (#6078)
This commit is contained in:
@@ -14,7 +14,7 @@ const SyncAwarenessInnerLoggedIn = () => {
|
||||
|
||||
useEffect(() => {
|
||||
if (user && currentWorkspace) {
|
||||
currentWorkspace.blockSuiteWorkspace.awarenessStore.awareness.setLocalStateField(
|
||||
currentWorkspace.docCollection.awarenessStore.awareness.setLocalStateField(
|
||||
'user',
|
||||
{
|
||||
name: user.name,
|
||||
@@ -23,7 +23,7 @@ const SyncAwarenessInnerLoggedIn = () => {
|
||||
);
|
||||
|
||||
return () => {
|
||||
currentWorkspace.blockSuiteWorkspace.awarenessStore.awareness.setLocalStateField(
|
||||
currentWorkspace.docCollection.awarenessStore.awareness.setLocalStateField(
|
||||
'user',
|
||||
null
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useBlockSuiteWorkspacePage } from '@affine/core/hooks/use-block-suite-workspace-page';
|
||||
import { useDocCollectionPage } from '@affine/core/hooks/use-block-suite-workspace-page';
|
||||
import { timestampToLocalDate } from '@affine/core/utils';
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import {
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
} from '@affine/graphql';
|
||||
import { AffineCloudBlobStorage } from '@affine/workspace-impl';
|
||||
import { assertEquals } from '@blocksuite/global/utils';
|
||||
import { Workspace } from '@blocksuite/store';
|
||||
import { DocCollection } from '@blocksuite/store';
|
||||
import { globalBlockSuiteSchema } from '@toeverything/infra';
|
||||
import { revertUpdate } from '@toeverything/y-indexeddb';
|
||||
import { useEffect, useMemo } from 'react';
|
||||
@@ -98,14 +98,14 @@ const snapshotFetcher = async (
|
||||
// so that we do not need to worry about providers etc
|
||||
// todo: 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 workspaceMap = new Map<string, Workspace>();
|
||||
const docCollectionMap = new Map<string, DocCollection>();
|
||||
|
||||
// assume the workspace is a cloud workspace since the history feature is only enabled for cloud workspace
|
||||
const getOrCreateShellWorkspace = (workspaceId: string) => {
|
||||
let workspace = workspaceMap.get(workspaceId);
|
||||
if (!workspace) {
|
||||
let docCollection = docCollectionMap.get(workspaceId);
|
||||
if (!docCollection) {
|
||||
const blobStorage = new AffineCloudBlobStorage(workspaceId);
|
||||
workspace = new Workspace({
|
||||
docCollection = new DocCollection({
|
||||
id: workspaceId,
|
||||
blobStorages: [
|
||||
() => ({
|
||||
@@ -114,10 +114,10 @@ const getOrCreateShellWorkspace = (workspaceId: string) => {
|
||||
],
|
||||
schema: globalBlockSuiteSchema,
|
||||
});
|
||||
workspaceMap.set(workspaceId, workspace);
|
||||
workspace.doc.emit('sync', []);
|
||||
docCollectionMap.set(workspaceId, docCollection);
|
||||
docCollection.doc.emit('sync', []);
|
||||
}
|
||||
return workspace;
|
||||
return docCollection;
|
||||
};
|
||||
|
||||
// workspace id + page id + timestamp -> snapshot (update binary)
|
||||
@@ -139,17 +139,17 @@ export const usePageHistory = (
|
||||
|
||||
// workspace id + page id + timestamp + snapshot -> Page (to be used for rendering in blocksuite editor)
|
||||
export const useSnapshotPage = (
|
||||
workspace: Workspace,
|
||||
docCollection: DocCollection,
|
||||
pageDocId: string,
|
||||
ts?: string
|
||||
) => {
|
||||
const snapshot = usePageHistory(workspace.id, pageDocId, ts);
|
||||
const snapshot = usePageHistory(docCollection.id, pageDocId, ts);
|
||||
const page = useMemo(() => {
|
||||
if (!ts) {
|
||||
return;
|
||||
}
|
||||
const pageId = pageDocId + '-' + ts;
|
||||
const historyShellWorkspace = getOrCreateShellWorkspace(workspace.id);
|
||||
const historyShellWorkspace = getOrCreateShellWorkspace(docCollection.id);
|
||||
let page = historyShellWorkspace.getDoc(pageId);
|
||||
if (!page && snapshot) {
|
||||
page = historyShellWorkspace.createDoc({
|
||||
@@ -163,15 +163,15 @@ export const useSnapshotPage = (
|
||||
}); // must load before applyUpdate
|
||||
}
|
||||
return page ?? undefined;
|
||||
}, [pageDocId, snapshot, ts, workspace]);
|
||||
}, [pageDocId, snapshot, ts, docCollection]);
|
||||
|
||||
useEffect(() => {
|
||||
const historyShellWorkspace = getOrCreateShellWorkspace(workspace.id);
|
||||
const historyShellWorkspace = getOrCreateShellWorkspace(docCollection.id);
|
||||
// apply the rootdoc's update to the current workspace
|
||||
// this makes sure the page reference links are not deleted ones in the preview
|
||||
const update = encodeStateAsUpdate(workspace.doc);
|
||||
const update = encodeStateAsUpdate(docCollection.doc);
|
||||
applyUpdate(historyShellWorkspace.doc, update);
|
||||
}, [workspace]);
|
||||
}, [docCollection]);
|
||||
|
||||
return page;
|
||||
};
|
||||
@@ -187,13 +187,16 @@ export const historyListGroupByDay = (histories: DocHistory[]) => {
|
||||
return [...map.entries()];
|
||||
};
|
||||
|
||||
export const useRestorePage = (workspace: Workspace, pageId: string) => {
|
||||
const page = useBlockSuiteWorkspacePage(workspace, pageId);
|
||||
export const useRestorePage = (
|
||||
docCollection: DocCollection,
|
||||
pageId: string
|
||||
) => {
|
||||
const page = useDocCollectionPage(docCollection, pageId);
|
||||
const mutateQueryResource = useMutateQueryResource();
|
||||
const { trigger: recover, isMutating } = useMutation({
|
||||
mutation: recoverDocMutation,
|
||||
});
|
||||
const { getDocMeta, setDocTitle } = useDocMetaHelper(workspace);
|
||||
const { getDocMeta, setDocTitle } = useDocMetaHelper(docCollection);
|
||||
|
||||
const onRestore = useMemo(() => {
|
||||
return async (version: string, update: Uint8Array) => {
|
||||
@@ -216,12 +219,12 @@ export const useRestorePage = (workspace: Workspace, pageId: string) => {
|
||||
await recover({
|
||||
docId: pageDocId,
|
||||
timestamp: version,
|
||||
workspaceId: workspace.id,
|
||||
workspaceId: docCollection.id,
|
||||
});
|
||||
|
||||
await mutateQueryResource(listHistoryQuery, vars => {
|
||||
return (
|
||||
vars.pageDocId === pageDocId && vars.workspaceId === workspace.id
|
||||
vars.pageDocId === pageDocId && vars.workspaceId === docCollection.id
|
||||
);
|
||||
});
|
||||
|
||||
@@ -234,7 +237,7 @@ export const useRestorePage = (workspace: Workspace, pageId: string) => {
|
||||
pageId,
|
||||
recover,
|
||||
setDocTitle,
|
||||
workspace.id,
|
||||
docCollection.id,
|
||||
]);
|
||||
|
||||
return {
|
||||
|
||||
@@ -5,13 +5,13 @@ import { ConfirmModal, Modal } from '@affine/component/ui/modal';
|
||||
import { openSettingModalAtom } from '@affine/core/atoms';
|
||||
import { useIsWorkspaceOwner } from '@affine/core/hooks/affine/use-is-workspace-owner';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useBlockSuiteWorkspacePageTitle } from '@affine/core/hooks/use-block-suite-workspace-page-title';
|
||||
import { useDocCollectionPageTitle } from '@affine/core/hooks/use-block-suite-workspace-page-title';
|
||||
import { useWorkspaceQuota } from '@affine/core/hooks/use-workspace-quota';
|
||||
import { Trans } from '@affine/i18n';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { CloseIcon, ToggleCollapseIcon } from '@blocksuite/icons';
|
||||
import type { Doc as BlockSuiteDoc } from '@blocksuite/store';
|
||||
import { type Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
|
||||
import { type DocCollection } from '@blocksuite/store';
|
||||
import * as Collapsible from '@radix-ui/react-collapsible';
|
||||
import type { DialogContentProps } from '@radix-ui/react-dialog';
|
||||
import { Doc, type PageMode, Workspace } from '@toeverything/infra';
|
||||
@@ -49,7 +49,7 @@ import * as styles from './styles.css';
|
||||
export interface PageHistoryModalProps {
|
||||
open: boolean;
|
||||
onOpenChange: (open: boolean) => void;
|
||||
workspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
}
|
||||
|
||||
@@ -444,26 +444,26 @@ const EmptyHistoryPrompt = () => {
|
||||
};
|
||||
|
||||
const PageHistoryManager = ({
|
||||
workspace,
|
||||
docCollection,
|
||||
pageId,
|
||||
onClose,
|
||||
}: {
|
||||
workspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
onClose: () => void;
|
||||
}) => {
|
||||
const workspaceId = workspace.id;
|
||||
const workspaceId = docCollection.id;
|
||||
const [activeVersion, setActiveVersion] = useState<string>();
|
||||
|
||||
const pageDocId = useMemo(() => {
|
||||
return workspace.getDoc(pageId)?.spaceDoc.guid ?? pageId;
|
||||
}, [pageId, workspace]);
|
||||
return docCollection.getDoc(pageId)?.spaceDoc.guid ?? pageId;
|
||||
}, [pageId, docCollection]);
|
||||
|
||||
const snapshotPage = useSnapshotPage(workspace, pageDocId, activeVersion);
|
||||
const snapshotPage = useSnapshotPage(docCollection, pageDocId, activeVersion);
|
||||
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const { onRestore, isMutating } = useRestorePage(workspace, pageId);
|
||||
const { onRestore, isMutating } = useRestorePage(docCollection, pageId);
|
||||
|
||||
const handleRestore = useMemo(
|
||||
() => async () => {
|
||||
@@ -481,7 +481,7 @@ const PageHistoryManager = ({
|
||||
const page = useService(Doc);
|
||||
const [mode, setMode] = useState<PageMode>(page.mode.value);
|
||||
|
||||
const title = useBlockSuiteWorkspacePageTitle(workspace, pageId);
|
||||
const title = useDocCollectionPageTitle(docCollection, pageId);
|
||||
|
||||
const [showRestoreConfirmModal, setShowRestoreConfirmModal] = useState(false);
|
||||
|
||||
@@ -558,7 +558,7 @@ export const PageHistoryModal = ({
|
||||
onOpenChange,
|
||||
open,
|
||||
pageId,
|
||||
workspace,
|
||||
docCollection: workspace,
|
||||
}: PageHistoryModalProps) => {
|
||||
const onClose = useCallback(() => {
|
||||
onOpenChange(false);
|
||||
@@ -570,7 +570,7 @@ export const PageHistoryModal = ({
|
||||
<PageHistoryManager
|
||||
onClose={onClose}
|
||||
pageId={pageId}
|
||||
workspace={workspace}
|
||||
docCollection={workspace}
|
||||
/>
|
||||
</Suspense>
|
||||
</ModalContainer>
|
||||
@@ -595,7 +595,7 @@ export const GlobalPageHistoryModal = () => {
|
||||
open={open}
|
||||
onOpenChange={handleOpenChange}
|
||||
pageId={pageId}
|
||||
workspace={workspace.blockSuiteWorkspace}
|
||||
docCollection={workspace.docCollection}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
+2
-2
@@ -124,7 +124,7 @@ export class PagePropertiesMetaManager {
|
||||
// returns page schema properties -> related page
|
||||
getPropertyStatistics() {
|
||||
const mapping = new Map<string, Set<string>>();
|
||||
for (const page of this.adapter.workspace.blockSuiteWorkspace.docs.values()) {
|
||||
for (const page of this.adapter.workspace.docCollection.docs.values()) {
|
||||
const properties = this.adapter.getPageProperties(page.id);
|
||||
for (const id of Object.keys(properties.custom)) {
|
||||
if (!mapping.has(id)) mapping.set(id, new Set());
|
||||
@@ -169,7 +169,7 @@ export class PagePropertiesManager {
|
||||
}
|
||||
|
||||
get page() {
|
||||
return this.adapter.workspace.blockSuiteWorkspace.getDoc(this.pageId);
|
||||
return this.adapter.workspace.docCollection.getDoc(this.pageId);
|
||||
}
|
||||
|
||||
get intrinsicMeta() {
|
||||
|
||||
+2
-2
@@ -177,8 +177,8 @@ export const NumberValue = ({ property }: PropertyRowValueProps) => {
|
||||
export const TagsValue = () => {
|
||||
const workspace = useService(Workspace);
|
||||
const page = useService(Doc);
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const pageMetas = useAllBlockSuiteDocMeta(blockSuiteWorkspace);
|
||||
const docCollection = workspace.docCollection;
|
||||
const pageMetas = useAllBlockSuiteDocMeta(docCollection);
|
||||
const legacyProperties = useService(WorkspaceLegacyProperties);
|
||||
const options = useLiveData(legacyProperties.tagOptions$);
|
||||
|
||||
|
||||
@@ -405,7 +405,7 @@ export const PageBacklinksPopup = ({
|
||||
key={pageId}
|
||||
wrapper={MenuItem}
|
||||
pageId={pageId}
|
||||
workspace={manager.workspace.blockSuiteWorkspace}
|
||||
docCollection={manager.workspace.docCollection}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
@@ -600,7 +600,7 @@ export const PagePropertiesTableHeader = ({
|
||||
|
||||
const t = useAFFiNEI18N();
|
||||
const backlinks = useBlockSuitePageBacklinks(
|
||||
manager.workspace.blockSuiteWorkspace,
|
||||
manager.workspace.docCollection,
|
||||
manager.pageId
|
||||
);
|
||||
|
||||
@@ -1015,7 +1015,7 @@ export const PagePropertiesAddProperty = () => {
|
||||
const PagePropertiesTableInner = () => {
|
||||
const manager = useContext(managerContext);
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
use(manager.workspace.blockSuiteWorkspace.doc.whenSynced);
|
||||
use(manager.workspace.docCollection.doc.whenSynced);
|
||||
return (
|
||||
<div className={styles.root}>
|
||||
<Collapsible.Root
|
||||
|
||||
@@ -3,7 +3,7 @@ import { useJournalHelper } from '@affine/core/hooks/use-journal';
|
||||
import { WorkbenchLink } from '@affine/core/modules/workbench';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { LinkedPageIcon, TodayIcon } from '@blocksuite/icons';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import type { PropsWithChildren } from 'react';
|
||||
|
||||
import * as styles from './styles.css';
|
||||
@@ -44,15 +44,15 @@ export function pageReferenceRenderer({
|
||||
|
||||
export function AffinePageReference({
|
||||
pageId,
|
||||
workspace,
|
||||
docCollection,
|
||||
wrapper: Wrapper,
|
||||
}: {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
wrapper?: React.ComponentType<PropsWithChildren>;
|
||||
}) {
|
||||
const pageMetaHelper = useDocMetaHelper(workspace);
|
||||
const journalHelper = useJournalHelper(workspace);
|
||||
const pageMetaHelper = useDocMetaHelper(docCollection);
|
||||
const journalHelper = useJournalHelper(docCollection);
|
||||
const t = useAFFiNEI18N();
|
||||
const el = pageReferenceRenderer({
|
||||
pageId,
|
||||
|
||||
+10
-14
@@ -46,17 +46,13 @@ export const ProfilePanel = ({ isOwner, workspace }: ProfilePanelProps) => {
|
||||
const avatarUrl = useWorkspaceBlobObjectUrl(workspace?.meta, avatarBlob);
|
||||
|
||||
useEffect(() => {
|
||||
if (workspace?.blockSuiteWorkspace) {
|
||||
setAvatarBlob(workspace.blockSuiteWorkspace.meta.avatar ?? null);
|
||||
setName(
|
||||
workspace.blockSuiteWorkspace.meta.name ?? UNTITLED_WORKSPACE_NAME
|
||||
);
|
||||
const dispose = workspace.blockSuiteWorkspace.meta.commonFieldsUpdated.on(
|
||||
if (workspace?.docCollection) {
|
||||
setAvatarBlob(workspace.docCollection.meta.avatar ?? null);
|
||||
setName(workspace.docCollection.meta.name ?? UNTITLED_WORKSPACE_NAME);
|
||||
const dispose = workspace.docCollection.meta.commonFieldsUpdated.on(
|
||||
() => {
|
||||
setAvatarBlob(workspace.blockSuiteWorkspace.meta.avatar ?? null);
|
||||
setName(
|
||||
workspace.blockSuiteWorkspace.meta.name ?? UNTITLED_WORKSPACE_NAME
|
||||
);
|
||||
setAvatarBlob(workspace.docCollection.meta.avatar ?? null);
|
||||
setName(workspace.docCollection.meta.name ?? UNTITLED_WORKSPACE_NAME);
|
||||
}
|
||||
);
|
||||
return () => {
|
||||
@@ -75,14 +71,14 @@ export const ProfilePanel = ({ isOwner, workspace }: ProfilePanelProps) => {
|
||||
return;
|
||||
}
|
||||
if (!file) {
|
||||
workspace.blockSuiteWorkspace.meta.setAvatar('');
|
||||
workspace.docCollection.meta.setAvatar('');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const reducedFile = await validateAndReduceImage(file);
|
||||
const blobs = workspace.blockSuiteWorkspace.blob;
|
||||
const blobs = workspace.docCollection.blob;
|
||||
const blobId = await blobs.set(reducedFile);
|
||||
workspace.blockSuiteWorkspace.meta.setAvatar(blobId);
|
||||
workspace.docCollection.meta.setAvatar(blobId);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
throw error;
|
||||
@@ -96,7 +92,7 @@ export const ProfilePanel = ({ isOwner, workspace }: ProfilePanelProps) => {
|
||||
if (!workspace) {
|
||||
return;
|
||||
}
|
||||
workspace.blockSuiteWorkspace.meta.setName(name);
|
||||
workspace.docCollection.meta.setName(name);
|
||||
},
|
||||
[workspace]
|
||||
);
|
||||
|
||||
+2
-2
@@ -110,8 +110,8 @@ const BlockSuiteEditorImpl = forwardRef<AffineEditorContainer, EditorProps>(
|
||||
};
|
||||
}, []);
|
||||
|
||||
const pageMetaHelper = useDocMetaHelper(page.workspace);
|
||||
const journalHelper = useJournalHelper(page.workspace);
|
||||
const pageMetaHelper = useDocMetaHelper(page.collection);
|
||||
const journalHelper = useJournalHelper(page.collection);
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const customRenderers = useMemo(() => {
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import * as styles from './styles.css';
|
||||
|
||||
export const BlocksuiteEditorJournalDocTitle = ({ page }: { page: Doc }) => {
|
||||
const { localizedJournalDate, isTodayJournal, journalDate } =
|
||||
useJournalInfoHelper(page.workspace, page.id);
|
||||
useJournalInfoHelper(page.collection, page.id);
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
// TODO: i18n
|
||||
|
||||
@@ -64,7 +64,7 @@ export const BlocksuiteDocEditor = forwardRef<
|
||||
const docRef = useRef<PageEditor | null>(null);
|
||||
const [docPage, setDocPage] =
|
||||
useState<HTMLElementTagNameMap['affine-page-root']>();
|
||||
const { isJournal } = useJournalInfoHelper(page.workspace, page.id);
|
||||
const { isJournal } = useJournalInfoHelper(page.collection, page.id);
|
||||
|
||||
const onDocRef = useCallback(
|
||||
(el: PageEditor) => {
|
||||
|
||||
+4
-4
@@ -15,17 +15,17 @@ export interface FavoriteButtonProps {
|
||||
export const useFavorite = (pageId: string) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const workspace = useService(Workspace);
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const currentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
const docCollection = workspace.docCollection;
|
||||
const currentPage = docCollection.getDoc(pageId);
|
||||
assertExists(currentPage);
|
||||
|
||||
const pageMeta = useBlockSuiteDocMeta(blockSuiteWorkspace).find(
|
||||
const pageMeta = useBlockSuiteDocMeta(docCollection).find(
|
||||
meta => meta.id === pageId
|
||||
);
|
||||
const favorite = pageMeta?.favorite ?? false;
|
||||
|
||||
const { toggleFavorite: _toggleFavorite } =
|
||||
useBlockSuiteMetaHelper(blockSuiteWorkspace);
|
||||
useBlockSuiteMetaHelper(docCollection);
|
||||
|
||||
const toggleFavorite = useCallback(() => {
|
||||
_toggleFavorite(pageId);
|
||||
|
||||
+5
-5
@@ -3,24 +3,24 @@ import {
|
||||
useJournalInfoHelper,
|
||||
useJournalRouteHelper,
|
||||
} from '@affine/core/hooks/use-journal';
|
||||
import type { BlockSuiteWorkspace } from '@affine/core/shared';
|
||||
import type { DocCollection } from '@affine/core/shared';
|
||||
import type { Doc } from '@blocksuite/store';
|
||||
import dayjs from 'dayjs';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
export interface JournalWeekDatePickerProps {
|
||||
workspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
page: Doc;
|
||||
}
|
||||
|
||||
const weekStyle = { maxWidth: 800, width: '100%' };
|
||||
export const JournalWeekDatePicker = ({
|
||||
workspace,
|
||||
docCollection,
|
||||
page,
|
||||
}: JournalWeekDatePickerProps) => {
|
||||
const handleRef = useRef<WeekDatePickerHandle>(null);
|
||||
const { journalDate } = useJournalInfoHelper(workspace, page.id);
|
||||
const { openJournal } = useJournalRouteHelper(workspace);
|
||||
const { journalDate } = useJournalInfoHelper(docCollection, page.id);
|
||||
const { openJournal } = useJournalRouteHelper(docCollection);
|
||||
const [date, setDate] = useState(
|
||||
(journalDate ?? dayjs()).format('YYYY-MM-DD')
|
||||
);
|
||||
|
||||
+6
-4
@@ -1,16 +1,18 @@
|
||||
import { Button } from '@affine/component';
|
||||
import { useJournalRouteHelper } from '@affine/core/hooks/use-journal';
|
||||
import type { BlockSuiteWorkspace } from '@affine/core/shared';
|
||||
import type { DocCollection } from '@affine/core/shared';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
export interface JournalTodayButtonProps {
|
||||
workspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
}
|
||||
|
||||
export const JournalTodayButton = ({ workspace }: JournalTodayButtonProps) => {
|
||||
export const JournalTodayButton = ({
|
||||
docCollection,
|
||||
}: JournalTodayButtonProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const journalHelper = useJournalRouteHelper(workspace);
|
||||
const journalHelper = useJournalRouteHelper(docCollection);
|
||||
|
||||
const onToday = useCallback(() => {
|
||||
journalHelper.openToday();
|
||||
|
||||
@@ -47,11 +47,11 @@ export const PageHeaderMenuButton = ({
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const workspace = useService(Workspace);
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const currentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
const docCollection = workspace.docCollection;
|
||||
const currentPage = docCollection.getDoc(pageId);
|
||||
assertExists(currentPage);
|
||||
|
||||
const pageMeta = useBlockSuiteDocMeta(blockSuiteWorkspace).find(
|
||||
const pageMeta = useBlockSuiteDocMeta(docCollection).find(
|
||||
meta => meta.id === pageId
|
||||
);
|
||||
const page = useService(Doc);
|
||||
@@ -59,9 +59,9 @@ export const PageHeaderMenuButton = ({
|
||||
|
||||
const { favorite, toggleFavorite } = useFavorite(pageId);
|
||||
|
||||
const { duplicate } = useBlockSuiteMetaHelper(blockSuiteWorkspace);
|
||||
const { importFile } = usePageHelper(blockSuiteWorkspace);
|
||||
const { setTrashModal } = useTrashModalHelper(blockSuiteWorkspace);
|
||||
const { duplicate } = useBlockSuiteMetaHelper(docCollection);
|
||||
const { importFile } = usePageHelper(docCollection);
|
||||
const { setTrashModal } = useTrashModalHelper(docCollection);
|
||||
|
||||
const [historyModalOpen, setHistoryModalOpen] = useState(false);
|
||||
const setOpenHistoryTipsModal = useSetAtom(openHistoryTipsModalAtom);
|
||||
@@ -227,7 +227,7 @@ export const PageHeaderMenuButton = ({
|
||||
</Menu>
|
||||
{workspace.flavour === WorkspaceFlavour.AFFINE_CLOUD ? (
|
||||
<PageHistoryModal
|
||||
workspace={workspace.blockSuiteWorkspace}
|
||||
docCollection={workspace.docCollection}
|
||||
open={historyModalOpen}
|
||||
pageId={pageId}
|
||||
onOpenChange={setHistoryModalOpen}
|
||||
|
||||
+6
-11
@@ -3,14 +3,14 @@ import {
|
||||
useBlockSuiteDocMeta,
|
||||
useDocMetaHelper,
|
||||
} from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import type { BlockSuiteWorkspace } from '@affine/core/shared';
|
||||
import type { DocCollection } from '@affine/core/shared';
|
||||
import type { HTMLAttributes } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import * as styles from './style.css';
|
||||
|
||||
export interface BlockSuiteHeaderTitleProps {
|
||||
blockSuiteWorkspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
/** if set, title cannot be edited */
|
||||
isPublic?: boolean;
|
||||
@@ -21,18 +21,13 @@ const inputAttrs = {
|
||||
'data-testid': 'title-content',
|
||||
} as HTMLAttributes<HTMLInputElement>;
|
||||
export const BlocksuiteHeaderTitle = (props: BlockSuiteHeaderTitleProps) => {
|
||||
const {
|
||||
blockSuiteWorkspace: workspace,
|
||||
pageId,
|
||||
isPublic,
|
||||
inputHandleRef,
|
||||
} = props;
|
||||
const currentPage = workspace.getDoc(pageId);
|
||||
const pageMeta = useBlockSuiteDocMeta(workspace).find(
|
||||
const { docCollection, pageId, isPublic, inputHandleRef } = props;
|
||||
const currentPage = docCollection.getDoc(pageId);
|
||||
const pageMeta = useBlockSuiteDocMeta(docCollection).find(
|
||||
meta => meta.id === currentPage?.id
|
||||
);
|
||||
const title = pageMeta?.title;
|
||||
const { setDocTitle } = useDocMetaHelper(workspace);
|
||||
const { setDocTitle } = useDocMetaHelper(docCollection);
|
||||
|
||||
const onChange = useCallback(
|
||||
(v: string) => {
|
||||
|
||||
@@ -10,14 +10,14 @@ import {
|
||||
import type { CSSProperties } from 'react';
|
||||
import { useCallback, useEffect } from 'react';
|
||||
|
||||
import type { BlockSuiteWorkspace } from '../../../shared';
|
||||
import type { DocCollection } from '../../../shared';
|
||||
import { toast } from '../../../utils';
|
||||
import { StyledEditorModeSwitch, StyledKeyboardItem } from './style';
|
||||
import { EdgelessSwitchItem, PageSwitchItem } from './switch-items';
|
||||
|
||||
export type EditorModeSwitchProps = {
|
||||
// todo(himself65): combine these two properties
|
||||
blockSuiteWorkspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
style?: CSSProperties;
|
||||
isPublic?: boolean;
|
||||
@@ -36,13 +36,13 @@ const TooltipContent = () => {
|
||||
};
|
||||
export const EditorModeSwitch = ({
|
||||
style,
|
||||
blockSuiteWorkspace,
|
||||
docCollection,
|
||||
pageId,
|
||||
isPublic,
|
||||
publicMode,
|
||||
}: EditorModeSwitchProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const pageMeta = useBlockSuiteDocMeta(blockSuiteWorkspace).find(
|
||||
const pageMeta = useBlockSuiteDocMeta(docCollection).find(
|
||||
meta => meta.id === pageId
|
||||
);
|
||||
const trash = pageMeta?.trash ?? false;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { toast } from '@affine/component';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useBlockSuiteWorkspaceHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
||||
import { useDocCollectionHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
||||
import { WorkspaceSubPath } from '@affine/core/shared';
|
||||
import { useService } from '@toeverything/infra';
|
||||
import { PageRecordList } from '@toeverything/infra';
|
||||
@@ -9,12 +9,12 @@ import { initEmptyPage } from '@toeverything/infra';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
|
||||
import { useNavigateHelper } from '../../../hooks/use-navigate-helper';
|
||||
import type { BlockSuiteWorkspace } from '../../../shared';
|
||||
import type { DocCollection } from '../../../shared';
|
||||
|
||||
export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => {
|
||||
export const usePageHelper = (docCollection: DocCollection) => {
|
||||
const { openPage, jumpToSubPath } = useNavigateHelper();
|
||||
const { createDoc } = useBlockSuiteWorkspaceHelper(blockSuiteWorkspace);
|
||||
const { setDocMeta } = useDocMetaHelper(blockSuiteWorkspace);
|
||||
const { createDoc } = useDocCollectionHelper(docCollection);
|
||||
const { setDocMeta } = useDocMetaHelper(docCollection);
|
||||
const pageRecordList = useService(PageRecordList);
|
||||
|
||||
const isPreferredEdgeless = useCallback(
|
||||
@@ -28,10 +28,10 @@ export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => {
|
||||
const page = createDoc();
|
||||
initEmptyPage(page);
|
||||
pageRecordList.record(page.id).value?.setMode(mode || 'page');
|
||||
openPage(blockSuiteWorkspace.id, page.id);
|
||||
openPage(docCollection.id, page.id);
|
||||
return page;
|
||||
},
|
||||
[blockSuiteWorkspace.id, createDoc, openPage, pageRecordList]
|
||||
[docCollection.id, createDoc, openPage, pageRecordList]
|
||||
);
|
||||
|
||||
const createEdgelessAndOpen = useCallback(() => {
|
||||
@@ -50,7 +50,7 @@ export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => {
|
||||
}.`
|
||||
);
|
||||
if (options.isWorkspaceFile) {
|
||||
jumpToSubPath(blockSuiteWorkspace.id, WorkspaceSubPath.ALL);
|
||||
jumpToSubPath(docCollection.id, WorkspaceSubPath.ALL);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -58,16 +58,16 @@ export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => {
|
||||
return;
|
||||
}
|
||||
const pageId = pageIds[0];
|
||||
openPage(blockSuiteWorkspace.id, pageId);
|
||||
openPage(docCollection.id, pageId);
|
||||
};
|
||||
showImportModal({ workspace: blockSuiteWorkspace, onSuccess });
|
||||
}, [blockSuiteWorkspace, openPage, jumpToSubPath]);
|
||||
showImportModal({ collection: docCollection, onSuccess });
|
||||
}, [docCollection, openPage, jumpToSubPath]);
|
||||
|
||||
const createLinkedPageAndOpen = useAsyncCallback(
|
||||
async (pageId: string) => {
|
||||
const page = createPageAndOpen();
|
||||
page.load();
|
||||
const parentPage = blockSuiteWorkspace.getDoc(pageId);
|
||||
const parentPage = docCollection.getDoc(pageId);
|
||||
if (parentPage) {
|
||||
parentPage.load();
|
||||
const text = parentPage.Text.fromDelta([
|
||||
@@ -86,7 +86,7 @@ export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => {
|
||||
setDocMeta(page.id, {});
|
||||
}
|
||||
},
|
||||
[blockSuiteWorkspace, createPageAndOpen, setDocMeta]
|
||||
[docCollection, createPageAndOpen, setDocMeta]
|
||||
);
|
||||
|
||||
return useMemo(() => {
|
||||
|
||||
@@ -13,7 +13,7 @@ import {
|
||||
PlusIcon,
|
||||
ViewBarIcon,
|
||||
} from '@blocksuite/icons';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import clsx from 'clsx';
|
||||
import { useErrorBoundary } from 'foxact/use-error-boundary';
|
||||
import { useAtom } from 'jotai';
|
||||
@@ -45,7 +45,7 @@ import {
|
||||
import { hasAnimationPlayedAtom, previewBlockIdAtom } from './index.jotai';
|
||||
|
||||
export type ImagePreviewModalProps = {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
};
|
||||
|
||||
@@ -92,7 +92,7 @@ const ImagePreviewModalImpl = (
|
||||
const nextImageHandler = useCallback(
|
||||
(blockId: string | null) => {
|
||||
assertExists(blockId);
|
||||
const workspace = props.workspace;
|
||||
const workspace = props.docCollection;
|
||||
if (!hasPlayedAnimation) {
|
||||
setHasPlayedAnimation(true);
|
||||
}
|
||||
@@ -109,13 +109,13 @@ const ImagePreviewModalImpl = (
|
||||
setBlockId(nextBlock.id);
|
||||
}
|
||||
},
|
||||
[props.pageId, props.workspace, setBlockId, hasPlayedAnimation]
|
||||
[props.pageId, props.docCollection, setBlockId, hasPlayedAnimation]
|
||||
);
|
||||
|
||||
const previousImageHandler = useCallback(
|
||||
(blockId: string | null) => {
|
||||
assertExists(blockId);
|
||||
const workspace = props.workspace;
|
||||
const workspace = props.docCollection;
|
||||
const page = workspace.getDoc(props.pageId);
|
||||
assertExists(page);
|
||||
const block = page.getBlockById(blockId);
|
||||
@@ -130,12 +130,12 @@ const ImagePreviewModalImpl = (
|
||||
}
|
||||
resetZoom();
|
||||
},
|
||||
[props.pageId, props.workspace, setBlockId, resetZoom]
|
||||
[props.pageId, props.docCollection, setBlockId, resetZoom]
|
||||
);
|
||||
|
||||
const deleteHandler = useCallback(
|
||||
(blockId: string) => {
|
||||
const { pageId, workspace, onClose } = props;
|
||||
const { pageId, docCollection: workspace, onClose } = props;
|
||||
|
||||
const page = workspace.getDoc(pageId);
|
||||
assertExists(page);
|
||||
@@ -185,7 +185,7 @@ const ImagePreviewModalImpl = (
|
||||
|
||||
const downloadHandler = useCallback(
|
||||
async (blockId: string | null) => {
|
||||
const workspace = props.workspace;
|
||||
const workspace = props.docCollection;
|
||||
const page = workspace.getDoc(props.pageId);
|
||||
assertExists(page);
|
||||
if (typeof blockId === 'string') {
|
||||
@@ -237,31 +237,31 @@ const ImagePreviewModalImpl = (
|
||||
a.remove();
|
||||
}
|
||||
},
|
||||
[props.pageId, props.workspace]
|
||||
[props.pageId, props.docCollection]
|
||||
);
|
||||
const [caption, setCaption] = useState(() => {
|
||||
const page = props.workspace.getDoc(props.pageId);
|
||||
const page = props.docCollection.getDoc(props.pageId);
|
||||
assertExists(page);
|
||||
const block = page.getBlockById(props.blockId) as ImageBlockModel;
|
||||
assertExists(block);
|
||||
return block?.caption;
|
||||
});
|
||||
useEffect(() => {
|
||||
const page = props.workspace.getDoc(props.pageId);
|
||||
const page = props.docCollection.getDoc(props.pageId);
|
||||
assertExists(page);
|
||||
const block = page.getBlockById(props.blockId) as ImageBlockModel;
|
||||
assertExists(block);
|
||||
setCaption(block?.caption);
|
||||
}, [props.blockId, props.pageId, props.workspace]);
|
||||
}, [props.blockId, props.pageId, props.docCollection]);
|
||||
const { data, error } = useSWR(
|
||||
['workspace', 'image', props.pageId, props.blockId],
|
||||
{
|
||||
fetcher: ([_, __, pageId, blockId]) => {
|
||||
const page = props.workspace.getDoc(pageId);
|
||||
const page = props.docCollection.getDoc(pageId);
|
||||
assertExists(page);
|
||||
const block = page.getBlockById(blockId) as ImageBlockModel;
|
||||
assertExists(block);
|
||||
return props.workspace.blob.get(block?.sourceId as string);
|
||||
return props.docCollection.blob.get(block?.sourceId as string);
|
||||
},
|
||||
suspense: true,
|
||||
}
|
||||
@@ -508,7 +508,7 @@ export const ImagePreviewModal = (
|
||||
return;
|
||||
}
|
||||
|
||||
const workspace = props.workspace;
|
||||
const workspace = props.docCollection;
|
||||
|
||||
const page = workspace.getDoc(props.pageId);
|
||||
assertExists(page);
|
||||
@@ -541,7 +541,7 @@ export const ImagePreviewModal = (
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
},
|
||||
[blockId, setBlockId, props.workspace, props.pageId, isOpen, setIsOpen]
|
||||
[blockId, setBlockId, props.docCollection, props.pageId, isOpen, setIsOpen]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import './page-detail-editor.css';
|
||||
|
||||
import { useBlockSuiteWorkspacePage } from '@affine/core/hooks/use-block-suite-workspace-page';
|
||||
import { useDocCollectionPage } from '@affine/core/hooks/use-block-suite-workspace-page';
|
||||
import { assertExists, DisposableGroup } from '@blocksuite/global/utils';
|
||||
import type { AffineEditorContainer } from '@blocksuite/presets';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import type { Doc as BlockSuiteDoc } from '@blocksuite/store';
|
||||
import {
|
||||
Doc,
|
||||
@@ -34,7 +34,7 @@ export type OnLoadEditor = (
|
||||
export interface PageDetailEditorProps {
|
||||
isPublic?: boolean;
|
||||
publishMode?: PageMode;
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
onLoad?: OnLoadEditor;
|
||||
}
|
||||
@@ -78,7 +78,7 @@ const PageDetailEditorMain = memo(function PageDetailEditorMain({
|
||||
const disposableGroup = new DisposableGroup();
|
||||
disposableGroup.add(
|
||||
page.slots.blockUpdated.once(() => {
|
||||
page.workspace.setDocMeta(page.id, {
|
||||
page.collection.setDocMeta(page.id, {
|
||||
updatedDate: Date.now(),
|
||||
});
|
||||
})
|
||||
@@ -121,8 +121,8 @@ const PageDetailEditorMain = memo(function PageDetailEditorMain({
|
||||
});
|
||||
|
||||
export const PageDetailEditor = (props: PageDetailEditorProps) => {
|
||||
const { workspace, pageId } = props;
|
||||
const page = useBlockSuiteWorkspacePage(workspace, pageId);
|
||||
const { docCollection, pageId } = props;
|
||||
const page = useDocCollectionPage(docCollection, pageId);
|
||||
if (!page) {
|
||||
return null;
|
||||
}
|
||||
|
||||
+5
-5
@@ -6,21 +6,21 @@ import 'fake-indexeddb/auto';
|
||||
import { AffineSchemas } from '@blocksuite/blocks/schemas';
|
||||
import { assertExists } from '@blocksuite/global/utils';
|
||||
import type { Doc } from '@blocksuite/store';
|
||||
import { Schema, Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
|
||||
import { DocCollection, Schema } from '@blocksuite/store';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { useAtomValue } from 'jotai';
|
||||
import { describe, expect, test, vi } from 'vitest';
|
||||
import { beforeEach } from 'vitest';
|
||||
|
||||
import { useBlockSuitePagePreview } from '../use-block-suite-page-preview';
|
||||
let blockSuiteWorkspace: BlockSuiteWorkspace;
|
||||
let docCollection: DocCollection;
|
||||
|
||||
const schema = new Schema();
|
||||
schema.register(AffineSchemas);
|
||||
|
||||
beforeEach(async () => {
|
||||
vi.useFakeTimers({ toFake: ['requestIdleCallback'] });
|
||||
blockSuiteWorkspace = new BlockSuiteWorkspace({ id: 'test', schema });
|
||||
docCollection = new DocCollection({ id: 'test', schema });
|
||||
const initPage = async (page: Doc) => {
|
||||
page.load();
|
||||
expect(page).not.toBeNull();
|
||||
@@ -31,12 +31,12 @@ beforeEach(async () => {
|
||||
const frameId = page.addBlock('affine:note', {}, pageBlockId);
|
||||
page.addBlock('affine:paragraph', {}, frameId);
|
||||
};
|
||||
await initPage(blockSuiteWorkspace.createDoc({ id: 'page0' }));
|
||||
await initPage(docCollection.createDoc({ id: 'page0' }));
|
||||
});
|
||||
|
||||
describe('useBlockSuitePagePreview', () => {
|
||||
test('basic', async () => {
|
||||
const page = blockSuiteWorkspace.getDoc('page0') as Doc;
|
||||
const page = docCollection.getDoc('page0') as Doc;
|
||||
const id = page.addBlock(
|
||||
'affine:paragraph',
|
||||
{
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ export const VirtualizedCollectionList = ({
|
||||
items={collectionMetas}
|
||||
itemRenderer={collectionItemRenderer}
|
||||
rowAsLink
|
||||
blockSuiteWorkspace={currentWorkspace.blockSuiteWorkspace}
|
||||
docCollection={currentWorkspace.docCollection}
|
||||
operationsRenderer={collectionOperationRenderer}
|
||||
headerRenderer={collectionHeaderRenderer}
|
||||
/>
|
||||
|
||||
@@ -18,7 +18,7 @@ export const PageListNewPageButton = ({
|
||||
}>) => {
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const { importFile, createEdgeless, createPage } = usePageHelper(
|
||||
currentWorkspace.blockSuiteWorkspace
|
||||
currentWorkspace.docCollection
|
||||
);
|
||||
return (
|
||||
<div className={className} data-testid={testId}>
|
||||
|
||||
@@ -28,11 +28,9 @@ import {
|
||||
|
||||
const usePageOperationsRenderer = () => {
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const { setTrashModal } = useTrashModalHelper(
|
||||
currentWorkspace.blockSuiteWorkspace
|
||||
);
|
||||
const { setTrashModal } = useTrashModalHelper(currentWorkspace.docCollection);
|
||||
const { toggleFavorite, duplicate } = useBlockSuiteMetaHelper(
|
||||
currentWorkspace.blockSuiteWorkspace
|
||||
currentWorkspace.docCollection
|
||||
);
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
@@ -97,11 +95,9 @@ export const VirtualizedPageList = ({
|
||||
const [showFloatingToolbar, setShowFloatingToolbar] = useState(false);
|
||||
const [selectedPageIds, setSelectedPageIds] = useState<string[]>([]);
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const pageMetas = useBlockSuiteDocMeta(currentWorkspace.blockSuiteWorkspace);
|
||||
const pageMetas = useBlockSuiteDocMeta(currentWorkspace.docCollection);
|
||||
const pageOperations = usePageOperationsRenderer();
|
||||
const { isPreferredEdgeless } = usePageHelper(
|
||||
currentWorkspace.blockSuiteWorkspace
|
||||
);
|
||||
const { isPreferredEdgeless } = usePageHelper(currentWorkspace.docCollection);
|
||||
|
||||
const filteredPageMetas = useFilteredPageMetas(currentWorkspace, pageMetas, {
|
||||
filters,
|
||||
@@ -155,9 +151,7 @@ export const VirtualizedPageList = ({
|
||||
return <PageListHeader />;
|
||||
}, [collection, config, currentWorkspace.id, tag]);
|
||||
|
||||
const { setTrashModal } = useTrashModalHelper(
|
||||
currentWorkspace.blockSuiteWorkspace
|
||||
);
|
||||
const { setTrashModal } = useTrashModalHelper(currentWorkspace.docCollection);
|
||||
|
||||
const handleMultiDelete = useCallback(() => {
|
||||
const pageNameMapping = Object.fromEntries(
|
||||
@@ -190,7 +184,7 @@ export const VirtualizedPageList = ({
|
||||
items={pageMetasToRender}
|
||||
rowAsLink
|
||||
isPreferredEdgeless={isPreferredEdgeless}
|
||||
blockSuiteWorkspace={currentWorkspace.blockSuiteWorkspace}
|
||||
docCollection={currentWorkspace.docCollection}
|
||||
operationsRenderer={pageOperationRenderer}
|
||||
itemRenderer={pageItemRenderer}
|
||||
headerRenderer={pageHeaderRenderer}
|
||||
|
||||
@@ -1,31 +1,34 @@
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import { useAtomValue } from 'jotai';
|
||||
import { Suspense } from 'react';
|
||||
|
||||
import { useBlockSuitePagePreview } from './use-block-suite-page-preview';
|
||||
import { useBlockSuiteWorkspacePage } from './use-block-suite-workspace-page';
|
||||
import { useDocCollectionPage } from './use-block-suite-workspace-page';
|
||||
|
||||
interface PagePreviewInnerProps {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
}
|
||||
|
||||
const PagePreviewInner = ({ workspace, pageId }: PagePreviewInnerProps) => {
|
||||
const page = useBlockSuiteWorkspacePage(workspace, pageId);
|
||||
const PagePreviewInner = ({
|
||||
docCollection: workspace,
|
||||
pageId,
|
||||
}: PagePreviewInnerProps) => {
|
||||
const page = useDocCollectionPage(workspace, pageId);
|
||||
const previewAtom = useBlockSuitePagePreview(page);
|
||||
const preview = useAtomValue(previewAtom);
|
||||
return preview ? preview : null;
|
||||
};
|
||||
|
||||
interface PagePreviewProps {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
}
|
||||
|
||||
export const PagePreview = ({ workspace, pageId }: PagePreviewProps) => {
|
||||
export const PagePreview = ({ docCollection, pageId }: PagePreviewProps) => {
|
||||
return (
|
||||
<Suspense>
|
||||
<PagePreviewInner workspace={workspace} pageId={pageId} />
|
||||
<PagePreviewInner docCollection={docCollection} pageId={pageId} />
|
||||
</Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
ToggleCollapseIcon,
|
||||
ViewLayersIcon,
|
||||
} from '@blocksuite/icons';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import * as Collapsible from '@radix-ui/react-collapsible';
|
||||
import { useService } from '@toeverything/infra';
|
||||
import { useLiveData } from '@toeverything/infra';
|
||||
@@ -196,7 +196,7 @@ export const ItemGroup = <T extends ListItem>({
|
||||
|
||||
// todo: optimize how to render page meta list item
|
||||
const requiredPropNames = [
|
||||
'blockSuiteWorkspace',
|
||||
'docCollection',
|
||||
'rowAsLink',
|
||||
'isPreferredEdgeless',
|
||||
'operationsRenderer',
|
||||
@@ -266,9 +266,9 @@ export const TagListItemRenderer = (item: ListItem) => {
|
||||
|
||||
function tagIdToTagOption(
|
||||
tagId: string,
|
||||
blockSuiteWorkspace: Workspace
|
||||
docCollection: DocCollection
|
||||
): Tag | undefined {
|
||||
return blockSuiteWorkspace.meta.properties.tags?.options.find(
|
||||
return docCollection.meta.properties.tags?.options.find(
|
||||
opt => opt.id === tagId
|
||||
);
|
||||
}
|
||||
@@ -286,15 +286,15 @@ const PageTitle = ({ id }: { id: string }) => {
|
||||
|
||||
const UnifiedPageIcon = ({
|
||||
id,
|
||||
workspace,
|
||||
docCollection,
|
||||
isPreferredEdgeless,
|
||||
}: {
|
||||
id: string;
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
isPreferredEdgeless?: (id: string) => boolean;
|
||||
}) => {
|
||||
const isEdgeless = isPreferredEdgeless ? isPreferredEdgeless(id) : false;
|
||||
const { isJournal } = useJournalInfoHelper(workspace, id);
|
||||
const { isJournal } = useJournalInfoHelper(docCollection, id);
|
||||
if (isJournal) {
|
||||
return <TodayIcon />;
|
||||
}
|
||||
@@ -325,7 +325,7 @@ function pageMetaToListItemProp(
|
||||
pageId: item.id,
|
||||
title: <PageTitle id={item.id} />,
|
||||
preview: (
|
||||
<PagePreview workspace={props.blockSuiteWorkspace} pageId={item.id} />
|
||||
<PagePreview docCollection={props.docCollection} pageId={item.id} />
|
||||
),
|
||||
createDate: new Date(item.createDate),
|
||||
updatedDate: item.updatedDate ? new Date(item.updatedDate) : undefined,
|
||||
@@ -334,13 +334,13 @@ function pageMetaToListItemProp(
|
||||
icon: (
|
||||
<UnifiedPageIcon
|
||||
id={item.id}
|
||||
workspace={props.blockSuiteWorkspace}
|
||||
docCollection={props.docCollection}
|
||||
isPreferredEdgeless={props.isPreferredEdgeless}
|
||||
/>
|
||||
),
|
||||
tags:
|
||||
item.tags
|
||||
?.map(id => tagIdToTagOption(id, props.blockSuiteWorkspace))
|
||||
?.map(id => tagIdToTagOption(id, props.docCollection))
|
||||
.filter((v): v is Tag => v != null) ?? [],
|
||||
operations: props.operationsRenderer?.(item),
|
||||
selectable: props.selectable,
|
||||
|
||||
@@ -98,7 +98,7 @@ export const VirtualizedTagList = ({
|
||||
items={tagMetas}
|
||||
itemRenderer={tagItemRenderer}
|
||||
rowAsLink
|
||||
blockSuiteWorkspace={currentWorkspace.blockSuiteWorkspace}
|
||||
docCollection={currentWorkspace.docCollection}
|
||||
operationsRenderer={tagOperationRenderer}
|
||||
headerRenderer={tagHeaderRenderer}
|
||||
/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { Collection, Tag } from '@affine/env/filter';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import type { PropsWithChildren, ReactNode } from 'react';
|
||||
import type { To } from 'react-router-dom';
|
||||
|
||||
@@ -86,7 +86,7 @@ export type DateKey = 'createDate' | 'updatedDate';
|
||||
export interface ListProps<T> {
|
||||
// required data:
|
||||
items: T[];
|
||||
blockSuiteWorkspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
className?: string;
|
||||
hideHeader?: boolean; // whether or not to hide the header. default is false (showing header)
|
||||
groupBy?: ItemGroupByType | false;
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import { DisposableGroup } from '@blocksuite/global/utils';
|
||||
import type { Doc, Workspace } from '@blocksuite/store';
|
||||
import type { Doc, DocCollection } from '@blocksuite/store';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
const logger = new DebugLogger('useBlockSuiteWorkspacePage');
|
||||
|
||||
export function useBlockSuiteWorkspacePage(
|
||||
blockSuiteWorkspace: Workspace,
|
||||
export function useDocCollectionPage(
|
||||
docCollection: DocCollection,
|
||||
pageId: string | null
|
||||
): Doc | null {
|
||||
const [page, setPage] = useState(
|
||||
pageId ? blockSuiteWorkspace.getDoc(pageId) : null
|
||||
pageId ? docCollection.getDoc(pageId) : null
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const group = new DisposableGroup();
|
||||
group.add(
|
||||
blockSuiteWorkspace.slots.docAdded.on(id => {
|
||||
docCollection.slots.docAdded.on(id => {
|
||||
if (pageId === id) {
|
||||
setPage(blockSuiteWorkspace.getDoc(id));
|
||||
setPage(docCollection.getDoc(id));
|
||||
}
|
||||
})
|
||||
);
|
||||
group.add(
|
||||
blockSuiteWorkspace.slots.docRemoved.on(id => {
|
||||
docCollection.slots.docRemoved.on(id => {
|
||||
if (pageId === id) {
|
||||
setPage(null);
|
||||
}
|
||||
@@ -32,7 +32,7 @@ export function useBlockSuiteWorkspacePage(
|
||||
return () => {
|
||||
group.dispose();
|
||||
};
|
||||
}, [blockSuiteWorkspace, pageId]);
|
||||
}, [docCollection, pageId]);
|
||||
|
||||
useEffect(() => {
|
||||
if (page && !page.loaded) {
|
||||
@@ -46,9 +46,9 @@ export function useBlockSuiteWorkspacePage(
|
||||
|
||||
useEffect(() => {
|
||||
if (page?.id !== pageId) {
|
||||
setPage(pageId ? blockSuiteWorkspace.getDoc(pageId) : null);
|
||||
setPage(pageId ? docCollection.getDoc(pageId) : null);
|
||||
}
|
||||
}, [blockSuiteWorkspace, page?.id, pageId]);
|
||||
}, [docCollection, page?.id, pageId]);
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@ import {
|
||||
} from '@affine/component';
|
||||
import type { Collection } from '@affine/env/filter';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import type { DialogContentProps } from '@radix-ui/react-dialog';
|
||||
import { type ReactNode, useCallback, useMemo, useState } from 'react';
|
||||
|
||||
@@ -199,7 +199,7 @@ export const EditCollection = ({
|
||||
|
||||
export type AllPageListConfig = {
|
||||
allPages: DocMeta[];
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
isEdgeless: (id: string) => boolean;
|
||||
/**
|
||||
* Return `undefined` if the page is not public
|
||||
|
||||
@@ -87,7 +87,9 @@ export const PagesMode = ({
|
||||
<Menu
|
||||
items={
|
||||
<VariableSelect
|
||||
propertiesMeta={allPageListConfig.workspace.meta.properties}
|
||||
propertiesMeta={
|
||||
allPageListConfig.docCollection.meta.properties
|
||||
}
|
||||
selected={filters}
|
||||
onSelect={createFilter}
|
||||
/>
|
||||
@@ -114,7 +116,7 @@ export const PagesMode = ({
|
||||
{showFilter ? (
|
||||
<div style={{ padding: '12px 16px 16px' }}>
|
||||
<FilterList
|
||||
propertiesMeta={allPageListConfig.workspace.meta.properties}
|
||||
propertiesMeta={allPageListConfig.docCollection.meta.properties}
|
||||
value={filters}
|
||||
onChange={updateFilters}
|
||||
/>
|
||||
@@ -125,7 +127,7 @@ export const PagesMode = ({
|
||||
className={styles.pageList}
|
||||
items={searchedList}
|
||||
groupBy={false}
|
||||
blockSuiteWorkspace={allPageListConfig.workspace}
|
||||
docCollection={allPageListConfig.docCollection}
|
||||
selectable
|
||||
onSelectedIdsChange={ids => {
|
||||
updateCollection({
|
||||
|
||||
@@ -123,7 +123,7 @@ export const RulesMode = ({
|
||||
}}
|
||||
>
|
||||
<FilterList
|
||||
propertiesMeta={allPageListConfig.workspace.meta.properties}
|
||||
propertiesMeta={allPageListConfig.docCollection.meta.properties}
|
||||
value={collection.filterList}
|
||||
onChange={useCallback(
|
||||
filterList => updateCollection({ ...collection, filterList }),
|
||||
@@ -265,7 +265,7 @@ export const RulesMode = ({
|
||||
className={styles.resultPages}
|
||||
items={rulesPages}
|
||||
groupBy={false}
|
||||
blockSuiteWorkspace={allPageListConfig.workspace}
|
||||
docCollection={allPageListConfig.docCollection}
|
||||
isPreferredEdgeless={allPageListConfig.isEdgeless}
|
||||
operationsRenderer={operationsRenderer}
|
||||
></List>
|
||||
@@ -285,7 +285,7 @@ export const RulesMode = ({
|
||||
className={styles.resultPages}
|
||||
items={allowListPages}
|
||||
groupBy={false}
|
||||
blockSuiteWorkspace={allPageListConfig.workspace}
|
||||
docCollection={allPageListConfig.docCollection}
|
||||
isPreferredEdgeless={allPageListConfig.isEdgeless}
|
||||
operationsRenderer={operationsRenderer}
|
||||
></List>
|
||||
|
||||
+5
-3
@@ -76,7 +76,9 @@ export const SelectPage = ({
|
||||
<Menu
|
||||
items={
|
||||
<VariableSelect
|
||||
propertiesMeta={allPageListConfig.workspace.meta.properties}
|
||||
propertiesMeta={
|
||||
allPageListConfig.docCollection.meta.properties
|
||||
}
|
||||
selected={filters}
|
||||
onSelect={createFilter}
|
||||
/>
|
||||
@@ -103,7 +105,7 @@ export const SelectPage = ({
|
||||
{showFilter ? (
|
||||
<div style={{ padding: '12px 16px 16px' }}>
|
||||
<FilterList
|
||||
propertiesMeta={allPageListConfig.workspace.meta.properties}
|
||||
propertiesMeta={allPageListConfig.docCollection.meta.properties}
|
||||
value={filters}
|
||||
onChange={updateFilters}
|
||||
/>
|
||||
@@ -113,7 +115,7 @@ export const SelectPage = ({
|
||||
<VirtualizedList
|
||||
className={styles.pageList}
|
||||
items={searchedList}
|
||||
blockSuiteWorkspace={allPageListConfig.workspace}
|
||||
docCollection={allPageListConfig.docCollection}
|
||||
selectable
|
||||
groupBy={false}
|
||||
onSelectedIdsChange={onChange}
|
||||
|
||||
@@ -2,7 +2,7 @@ import {
|
||||
useBlockSuiteDocMeta,
|
||||
useDocMetaHelper,
|
||||
} from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useGetBlockSuiteWorkspacePageTitle } from '@affine/core/hooks/use-block-suite-workspace-page-title';
|
||||
import { useGetDocCollectionPageTitle } from '@affine/core/hooks/use-block-suite-workspace-page-title';
|
||||
import { useJournalHelper } from '@affine/core/hooks/use-journal';
|
||||
import { CollectionService } from '@affine/core/modules/collection';
|
||||
import { WorkspaceSubPath } from '@affine/core/shared';
|
||||
@@ -79,7 +79,7 @@ function getAllCommand(context: CommandContext) {
|
||||
|
||||
const useWorkspacePages = () => {
|
||||
const workspace = useService(Workspace);
|
||||
const pages = useBlockSuiteDocMeta(workspace.blockSuiteWorkspace);
|
||||
const pages = useBlockSuiteDocMeta(workspace.docCollection);
|
||||
return pages;
|
||||
};
|
||||
|
||||
@@ -100,7 +100,7 @@ export const pageToCommand = (
|
||||
category: CommandCategory,
|
||||
page: DocMeta,
|
||||
navigationHelper: ReturnType<typeof useNavigateHelper>,
|
||||
getPageTitle: ReturnType<typeof useGetBlockSuiteWorkspacePageTitle>,
|
||||
getPageTitle: ReturnType<typeof useGetDocCollectionPageTitle>,
|
||||
isPageJournal: (pageId: string) => boolean,
|
||||
t: ReturnType<typeof useAFFiNEI18N>,
|
||||
workspace: Workspace,
|
||||
@@ -151,16 +151,14 @@ export const usePageCommands = () => {
|
||||
const recentPages = useRecentPages();
|
||||
const pages = useWorkspacePages();
|
||||
const workspace = useService(Workspace);
|
||||
const pageHelper = usePageHelper(workspace.blockSuiteWorkspace);
|
||||
const pageMetaHelper = useDocMetaHelper(workspace.blockSuiteWorkspace);
|
||||
const pageHelper = usePageHelper(workspace.docCollection);
|
||||
const pageMetaHelper = useDocMetaHelper(workspace.docCollection);
|
||||
const query = useAtomValue(cmdkQueryAtom);
|
||||
const navigationHelper = useNavigateHelper();
|
||||
const journalHelper = useJournalHelper(workspace.blockSuiteWorkspace);
|
||||
const journalHelper = useJournalHelper(workspace.docCollection);
|
||||
const t = useAFFiNEI18N();
|
||||
const getPageTitle = useGetBlockSuiteWorkspacePageTitle(
|
||||
workspace.blockSuiteWorkspace
|
||||
);
|
||||
const { isPageJournal } = useJournalHelper(workspace.blockSuiteWorkspace);
|
||||
const getPageTitle = useGetDocCollectionPageTitle(workspace.docCollection);
|
||||
const { isPageJournal } = useJournalHelper(workspace.docCollection);
|
||||
|
||||
const [searchTime, setSearchTime] = useState<number>(0);
|
||||
|
||||
@@ -197,7 +195,7 @@ export const usePageCommands = () => {
|
||||
} else {
|
||||
// queried pages that has matched contents
|
||||
// TODO: we shall have a debounce for global search here
|
||||
const searchResults = workspace.blockSuiteWorkspace.search({
|
||||
const searchResults = workspace.docCollection.search({
|
||||
query,
|
||||
}) as unknown as Map<string, SearchResultsValue>;
|
||||
const resultValues = Array.from(searchResults.values());
|
||||
@@ -242,7 +240,7 @@ export const usePageCommands = () => {
|
||||
if (!appendRes) return;
|
||||
const { page, blockId } = appendRes;
|
||||
navigationHelper.jumpToPageBlock(
|
||||
page.workspace.id,
|
||||
page.collection.id,
|
||||
page.id,
|
||||
blockId
|
||||
);
|
||||
|
||||
@@ -22,15 +22,15 @@ export const TrashPageFooter = ({ pageId }: { pageId: string }) => {
|
||||
useService(CurrentWorkspaceService).currentWorkspace
|
||||
);
|
||||
assertExists(workspace);
|
||||
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
|
||||
const pageMeta = useBlockSuiteDocMeta(blockSuiteWorkspace).find(
|
||||
const docCollection = workspace.docCollection;
|
||||
const pageMeta = useBlockSuiteDocMeta(docCollection).find(
|
||||
meta => meta.id === pageId
|
||||
);
|
||||
assertExists(pageMeta);
|
||||
const t = useAFFiNEI18N();
|
||||
const { appSettings } = useAppSettingHelper();
|
||||
const { jumpToSubPath } = useNavigateHelper();
|
||||
const { restoreFromTrash } = useBlockSuiteMetaHelper(blockSuiteWorkspace);
|
||||
const { restoreFromTrash } = useBlockSuiteMetaHelper(docCollection);
|
||||
const [open, setOpen] = useState(false);
|
||||
const hintText = t['com.affine.cmdk.affine.editor.trash-footer-hint']();
|
||||
|
||||
@@ -45,9 +45,9 @@ export const TrashPageFooter = ({ pageId }: { pageId: string }) => {
|
||||
|
||||
const onConfirmDelete = useCallback(() => {
|
||||
jumpToSubPath(workspace.id, WorkspaceSubPath.ALL);
|
||||
blockSuiteWorkspace.removeDoc(pageId);
|
||||
docCollection.removeDoc(pageId);
|
||||
toast(t['com.affine.toastMessage.permanentlyDeleted']());
|
||||
}, [blockSuiteWorkspace, jumpToSubPath, pageId, workspace.id, t]);
|
||||
}, [docCollection, jumpToSubPath, pageId, workspace.id, t]);
|
||||
|
||||
const onDelete = useCallback(() => {
|
||||
setOpen(true);
|
||||
|
||||
+6
-6
@@ -10,7 +10,7 @@ import { CollectionService } from '@affine/core/modules/collection';
|
||||
import type { Collection, DeleteCollectionInfo } from '@affine/env/filter';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { MoreHorizontalIcon, ViewLayersIcon } from '@blocksuite/icons';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import { useDroppable } from '@dnd-kit/core';
|
||||
import * as Collapsible from '@radix-ui/react-collapsible';
|
||||
import { useService } from '@toeverything/infra';
|
||||
@@ -30,12 +30,12 @@ import * as styles from './styles.css';
|
||||
const CollectionRenderer = ({
|
||||
collection,
|
||||
pages,
|
||||
workspace,
|
||||
docCollection,
|
||||
info,
|
||||
}: {
|
||||
collection: Collection;
|
||||
pages: DocMeta[];
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
info: DeleteCollectionInfo;
|
||||
}) => {
|
||||
const [collapsed, setCollapsed] = useState(true);
|
||||
@@ -159,7 +159,7 @@ const CollectionRenderer = ({
|
||||
allPageMeta={allPagesMeta}
|
||||
page={page}
|
||||
key={page.id}
|
||||
workspace={workspace}
|
||||
docCollection={docCollection}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
@@ -169,7 +169,7 @@ const CollectionRenderer = ({
|
||||
);
|
||||
};
|
||||
export const CollectionsList = ({
|
||||
workspace,
|
||||
docCollection: workspace,
|
||||
info,
|
||||
onCreate,
|
||||
}: CollectionsListProps) => {
|
||||
@@ -205,7 +205,7 @@ export const CollectionsList = ({
|
||||
key={view.id}
|
||||
collection={view}
|
||||
pages={metas}
|
||||
workspace={workspace}
|
||||
docCollection={workspace}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
|
||||
+8
-8
@@ -1,7 +1,7 @@
|
||||
import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { EdgelessIcon, PageIcon } from '@blocksuite/icons';
|
||||
import type { DocMeta, Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection, DocMeta } from '@blocksuite/store';
|
||||
import { useDraggable } from '@dnd-kit/core';
|
||||
import * as Collapsible from '@radix-ui/react-collapsible';
|
||||
import { PageRecordList, useLiveData, useService } from '@toeverything/infra';
|
||||
@@ -18,7 +18,7 @@ import * as styles from './styles.css';
|
||||
|
||||
export const Page = ({
|
||||
page,
|
||||
workspace,
|
||||
docCollection,
|
||||
allPageMeta,
|
||||
inAllowList,
|
||||
removeFromAllowList,
|
||||
@@ -26,7 +26,7 @@ export const Page = ({
|
||||
page: DocMeta;
|
||||
inAllowList: boolean;
|
||||
removeFromAllowList: (id: string) => void;
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
allPageMeta: Record<string, DocMeta>;
|
||||
}) => {
|
||||
const [collapsed, setCollapsed] = React.useState(true);
|
||||
@@ -46,10 +46,10 @@ export const Page = ({
|
||||
|
||||
const { jumpToPage } = useNavigateHelper();
|
||||
const clickPage = useCallback(() => {
|
||||
jumpToPage(workspace.id, page.id);
|
||||
}, [jumpToPage, page.id, workspace.id]);
|
||||
jumpToPage(docCollection.id, page.id);
|
||||
}, [jumpToPage, page.id, docCollection.id]);
|
||||
|
||||
const references = useBlockSuitePageReferences(workspace, pageId);
|
||||
const references = useBlockSuitePageReferences(docCollection, pageId);
|
||||
const referencesToRender = references.filter(
|
||||
id => allPageMeta[id] && !allPageMeta[id]?.trash
|
||||
);
|
||||
@@ -85,7 +85,7 @@ export const Page = ({
|
||||
onCollapsedChange={setCollapsed}
|
||||
postfix={
|
||||
<PostfixItem
|
||||
workspace={workspace}
|
||||
docCollection={docCollection}
|
||||
pageId={pageId}
|
||||
pageTitle={pageTitle}
|
||||
removeFromAllowList={removeFromAllowList}
|
||||
@@ -103,7 +103,7 @@ export const Page = ({
|
||||
return (
|
||||
<ReferencePage
|
||||
key={id}
|
||||
workspace={workspace}
|
||||
docCollection={docCollection}
|
||||
pageId={id}
|
||||
metaMapping={allPageMeta}
|
||||
parentIds={new Set([pageId])}
|
||||
|
||||
+6
-6
@@ -3,7 +3,7 @@ import { IconButton } from '@affine/component/ui/button';
|
||||
import { Menu } from '@affine/component/ui/menu';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { MoreHorizontalIcon } from '@blocksuite/icons';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { useBlockSuiteMetaHelper } from '../../../../hooks/affine/use-block-suite-meta-helper';
|
||||
@@ -13,7 +13,7 @@ import { OperationItems } from './operation-item';
|
||||
|
||||
export type OperationMenuButtonProps = {
|
||||
pageId: string;
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageTitle: string;
|
||||
setRenameModalOpen: () => void;
|
||||
inFavorites?: boolean;
|
||||
@@ -24,7 +24,7 @@ export type OperationMenuButtonProps = {
|
||||
|
||||
export const OperationMenuButton = ({ ...props }: OperationMenuButtonProps) => {
|
||||
const {
|
||||
workspace,
|
||||
docCollection,
|
||||
pageId,
|
||||
pageTitle,
|
||||
setRenameModalOpen,
|
||||
@@ -34,9 +34,9 @@ export const OperationMenuButton = ({ ...props }: OperationMenuButtonProps) => {
|
||||
isReferencePage,
|
||||
} = props;
|
||||
const t = useAFFiNEI18N();
|
||||
const { createLinkedPage } = usePageHelper(workspace);
|
||||
const { setTrashModal } = useTrashModalHelper(workspace);
|
||||
const { removeFromFavorite } = useBlockSuiteMetaHelper(workspace);
|
||||
const { createLinkedPage } = usePageHelper(docCollection);
|
||||
const { setTrashModal } = useTrashModalHelper(docCollection);
|
||||
const { removeFromFavorite } = useBlockSuiteMetaHelper(docCollection);
|
||||
|
||||
const handleRename = useCallback(() => {
|
||||
setRenameModalOpen?.();
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@ import { toast } from '@affine/component';
|
||||
import { RenameModal } from '@affine/component/rename-modal';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import { AddFavouriteButton } from '../favorite/add-favourite-button';
|
||||
@@ -10,7 +10,7 @@ import * as styles from '../favorite/styles.css';
|
||||
import { OperationMenuButton } from './operation-menu-button';
|
||||
|
||||
type PostfixItemProps = {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
pageTitle: string;
|
||||
inFavorites?: boolean;
|
||||
@@ -20,10 +20,10 @@ type PostfixItemProps = {
|
||||
};
|
||||
|
||||
export const PostfixItem = ({ ...props }: PostfixItemProps) => {
|
||||
const { workspace, pageId, pageTitle } = props;
|
||||
const { docCollection, pageId, pageTitle } = props;
|
||||
const t = useAFFiNEI18N();
|
||||
const [open, setOpen] = useState(false);
|
||||
const { setDocTitle } = useDocMetaHelper(workspace);
|
||||
const { setDocTitle } = useDocMetaHelper(docCollection);
|
||||
|
||||
const handleRename = useCallback(
|
||||
(newName: string) => {
|
||||
|
||||
+7
-7
@@ -1,7 +1,7 @@
|
||||
import { useBlockSuitePageReferences } from '@affine/core/hooks/use-block-suite-page-references';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { EdgelessIcon, PageIcon } from '@blocksuite/icons';
|
||||
import { type DocMeta, type Workspace } from '@blocksuite/store';
|
||||
import { type DocCollection, type DocMeta } from '@blocksuite/store';
|
||||
import * as Collapsible from '@radix-ui/react-collapsible';
|
||||
import { PageRecordList, useLiveData, useService } from '@toeverything/infra';
|
||||
import { useMemo, useState } from 'react';
|
||||
@@ -11,14 +11,14 @@ import { MenuLinkItem } from '../../../app-sidebar';
|
||||
import * as styles from '../favorite/styles.css';
|
||||
import { PostfixItem } from './postfix-item';
|
||||
export interface ReferencePageProps {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId: string;
|
||||
metaMapping: Record<string, DocMeta>;
|
||||
parentIds: Set<string>;
|
||||
}
|
||||
|
||||
export const ReferencePage = ({
|
||||
workspace,
|
||||
docCollection,
|
||||
pageId,
|
||||
metaMapping,
|
||||
parentIds,
|
||||
@@ -33,7 +33,7 @@ export const ReferencePage = ({
|
||||
return pageMode === 'edgeless' ? <EdgelessIcon /> : <PageIcon />;
|
||||
}, [pageMode]);
|
||||
|
||||
const references = useBlockSuitePageReferences(workspace, pageId);
|
||||
const references = useBlockSuitePageReferences(docCollection, pageId);
|
||||
const referencesToShow = useMemo(() => {
|
||||
return [
|
||||
...new Set(
|
||||
@@ -59,13 +59,13 @@ export const ReferencePage = ({
|
||||
data-type="reference-page"
|
||||
data-testid={`reference-page-${pageId}`}
|
||||
active={active}
|
||||
to={`/workspace/${workspace.id}/${pageId}`}
|
||||
to={`/workspace/${docCollection.id}/${pageId}`}
|
||||
icon={icon}
|
||||
collapsed={collapsible ? collapsed : undefined}
|
||||
onCollapsedChange={setCollapsed}
|
||||
postfix={
|
||||
<PostfixItem
|
||||
workspace={workspace}
|
||||
docCollection={docCollection}
|
||||
pageId={pageId}
|
||||
pageTitle={pageTitle}
|
||||
isReferencePage={true}
|
||||
@@ -83,7 +83,7 @@ export const ReferencePage = ({
|
||||
return (
|
||||
<ReferencePage
|
||||
key={ref}
|
||||
workspace={workspace}
|
||||
docCollection={docCollection}
|
||||
pageId={ref}
|
||||
metaMapping={metaMapping}
|
||||
parentIds={new Set([...parentIds, pageId])}
|
||||
|
||||
+5
-5
@@ -2,21 +2,21 @@ import { IconButton } from '@affine/component/ui/button';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
|
||||
import { PlusIcon } from '@blocksuite/icons';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
|
||||
import { usePageHelper } from '../../../blocksuite/block-suite-page-list/utils';
|
||||
|
||||
type AddFavouriteButtonProps = {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
pageId?: string;
|
||||
};
|
||||
|
||||
export const AddFavouriteButton = ({
|
||||
workspace,
|
||||
docCollection,
|
||||
pageId,
|
||||
}: AddFavouriteButtonProps) => {
|
||||
const { createPage, createLinkedPage } = usePageHelper(workspace);
|
||||
const { setDocMeta } = useDocMetaHelper(workspace);
|
||||
const { createPage, createLinkedPage } = usePageHelper(docCollection);
|
||||
const { setDocMeta } = useDocMetaHelper(docCollection);
|
||||
const handleAddFavorite = useAsyncCallback(
|
||||
async e => {
|
||||
if (pageId) {
|
||||
|
||||
+4
-2
@@ -11,7 +11,9 @@ import * as styles from './styles.css';
|
||||
|
||||
const emptyPageIdSet = new Set<string>();
|
||||
|
||||
export const FavoriteList = ({ workspace }: FavoriteListProps) => {
|
||||
export const FavoriteList = ({
|
||||
docCollection: workspace,
|
||||
}: FavoriteListProps) => {
|
||||
const metas = useBlockSuiteDocMeta(workspace);
|
||||
const dropItemId = getDropItemId('favorites');
|
||||
|
||||
@@ -51,7 +53,7 @@ export const FavoriteList = ({ workspace }: FavoriteListProps) => {
|
||||
pageId={pageMeta.id}
|
||||
// memo?
|
||||
parentIds={emptyPageIdSet}
|
||||
workspace={workspace}
|
||||
docCollection={workspace}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
|
||||
+3
-3
@@ -20,7 +20,7 @@ import {
|
||||
import * as styles from './styles.css';
|
||||
|
||||
export const FavouritePage = ({
|
||||
workspace,
|
||||
docCollection: workspace,
|
||||
pageId,
|
||||
metaMapping,
|
||||
parentIds,
|
||||
@@ -86,7 +86,7 @@ export const FavouritePage = ({
|
||||
{...listeners}
|
||||
postfix={
|
||||
<PostfixItem
|
||||
workspace={workspace}
|
||||
docCollection={workspace}
|
||||
pageId={pageId}
|
||||
pageTitle={pageTitle}
|
||||
inFavorites={true}
|
||||
@@ -102,7 +102,7 @@ export const FavouritePage = ({
|
||||
return (
|
||||
<ReferencePage
|
||||
key={id}
|
||||
workspace={workspace}
|
||||
docCollection={workspace}
|
||||
pageId={id}
|
||||
metaMapping={metaMapping}
|
||||
parentIds={new Set([pageId])}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import type { DeleteCollectionInfo } from '@affine/env/filter';
|
||||
import type { Workspace } from '@blocksuite/store';
|
||||
import type { DocCollection } from '@blocksuite/store';
|
||||
|
||||
export type FavoriteListProps = {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
};
|
||||
|
||||
export type CollectionsListProps = {
|
||||
workspace: Workspace;
|
||||
docCollection: DocCollection;
|
||||
info: DeleteCollectionInfo;
|
||||
onCreate?: () => void;
|
||||
};
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { ImportIcon } from '@blocksuite/icons';
|
||||
|
||||
import type { BlockSuiteWorkspace } from '../../shared';
|
||||
import type { DocCollection } from '../../shared';
|
||||
import { MenuItem } from '../app-sidebar';
|
||||
import { usePageHelper } from '../blocksuite/block-suite-page-list/utils';
|
||||
|
||||
const ImportPage = ({
|
||||
blocksuiteWorkspace,
|
||||
}: {
|
||||
blocksuiteWorkspace: BlockSuiteWorkspace;
|
||||
}) => {
|
||||
const ImportPage = ({ docCollection }: { docCollection: DocCollection }) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const { importFile } = usePageHelper(blocksuiteWorkspace);
|
||||
const { importFile } = usePageHelper(docCollection);
|
||||
return (
|
||||
<MenuItem icon={<ImportIcon />} onClick={importFile}>
|
||||
{t['Import']()}
|
||||
|
||||
@@ -100,7 +100,7 @@ export const RootAppSidebar = ({
|
||||
}: RootAppSidebarProps): ReactElement => {
|
||||
const currentWorkspaceId = currentWorkspace.id;
|
||||
const { appSettings } = useAppSettingHelper();
|
||||
const blockSuiteWorkspace = currentWorkspace.blockSuiteWorkspace;
|
||||
const docCollection = currentWorkspace.docCollection;
|
||||
const t = useAFFiNEI18N();
|
||||
const [openUserWorkspaceList, setOpenUserWorkspaceList] = useAtom(
|
||||
openWorkspaceListModalAtom
|
||||
@@ -114,7 +114,7 @@ export const RootAppSidebar = ({
|
||||
}, [createPage, openPage]);
|
||||
|
||||
const { trashModal, setTrashModal, handleOnConfirm } =
|
||||
useTrashModalHelper(blockSuiteWorkspace);
|
||||
useTrashModalHelper(docCollection);
|
||||
const deletePageTitles = trashModal.pageTitles;
|
||||
const trashConfirmOpen = trashModal.open;
|
||||
const onTrashConfirmOpenChange = useCallback(
|
||||
@@ -164,12 +164,12 @@ export const RootAppSidebar = ({
|
||||
.then(name => {
|
||||
const id = nanoid();
|
||||
collection.addCollection(createEmptyCollection(id, { name }));
|
||||
navigateHelper.jumpToCollection(blockSuiteWorkspace.id, id);
|
||||
navigateHelper.jumpToCollection(docCollection.id, id);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
}, [blockSuiteWorkspace.id, collection, navigateHelper, open]);
|
||||
}, [docCollection.id, collection, navigateHelper, open]);
|
||||
|
||||
const allPageActive = currentPath === '/all';
|
||||
|
||||
@@ -227,7 +227,7 @@ export const RootAppSidebar = ({
|
||||
</span>
|
||||
</RouteMenuLinkItem>
|
||||
<AppSidebarJournalButton
|
||||
workspace={currentWorkspace.blockSuiteWorkspace}
|
||||
docCollection={currentWorkspace.docCollection}
|
||||
/>
|
||||
{runtimeConfig.enableNewSettingModal ? (
|
||||
<MenuItem
|
||||
@@ -244,14 +244,14 @@ export const RootAppSidebar = ({
|
||||
|
||||
<SidebarScrollableContainer>
|
||||
<CategoryDivider label={t['com.affine.rootAppSidebar.favorites']()}>
|
||||
<AddFavouriteButton workspace={blockSuiteWorkspace} />
|
||||
<AddFavouriteButton docCollection={docCollection} />
|
||||
</CategoryDivider>
|
||||
<FavoriteList workspace={blockSuiteWorkspace} />
|
||||
<FavoriteList docCollection={docCollection} />
|
||||
<CategoryDivider label={t['com.affine.rootAppSidebar.collections']()}>
|
||||
<AddCollectionButton node={node} onClick={handleCreateCollection} />
|
||||
</CategoryDivider>
|
||||
<CollectionsList
|
||||
workspace={blockSuiteWorkspace}
|
||||
docCollection={docCollection}
|
||||
info={userInfo}
|
||||
onCreate={handleCreateCollection}
|
||||
/>
|
||||
@@ -268,7 +268,7 @@ export const RootAppSidebar = ({
|
||||
{t['com.affine.workspaceSubPath.trash']()}
|
||||
</span>
|
||||
</RouteMenuLinkItem>
|
||||
<ImportPage blocksuiteWorkspace={blockSuiteWorkspace} />
|
||||
<ImportPage docCollection={docCollection} />
|
||||
</SidebarScrollableContainer>
|
||||
<SidebarContainer>
|
||||
{environment.isDesktop ? <UpdaterButton /> : <AppDownloadButton />}
|
||||
|
||||
@@ -2,7 +2,7 @@ import {
|
||||
useJournalInfoHelper,
|
||||
useJournalRouteHelper,
|
||||
} from '@affine/core/hooks/use-journal';
|
||||
import type { BlockSuiteWorkspace } from '@affine/core/shared';
|
||||
import type { DocCollection } from '@affine/core/shared';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { TodayIcon, TomorrowIcon, YesterdayIcon } from '@blocksuite/icons';
|
||||
import { Doc, useServiceOptional } from '@toeverything/infra';
|
||||
@@ -11,17 +11,17 @@ import { useParams } from 'react-router-dom';
|
||||
import { MenuItem } from '../app-sidebar';
|
||||
|
||||
interface AppSidebarJournalButtonProps {
|
||||
workspace: BlockSuiteWorkspace;
|
||||
docCollection: DocCollection;
|
||||
}
|
||||
|
||||
export const AppSidebarJournalButton = ({
|
||||
workspace,
|
||||
docCollection,
|
||||
}: AppSidebarJournalButtonProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const currentPage = useServiceOptional(Doc);
|
||||
const { openToday } = useJournalRouteHelper(workspace);
|
||||
const { openToday } = useJournalRouteHelper(docCollection);
|
||||
const { journalDate, isJournal } = useJournalInfoHelper(
|
||||
workspace,
|
||||
docCollection,
|
||||
currentPage?.id
|
||||
);
|
||||
const params = useParams();
|
||||
|
||||
Reference in New Issue
Block a user