feat: single page sharing support (#1805)

Co-authored-by: Himself65 <himself65@outlook.com>
This commit is contained in:
JimmFly
2023-04-12 06:58:11 +08:00
committed by GitHub
parent f3af128baf
commit 2e823c2fee
17 changed files with 652 additions and 31 deletions
@@ -8,6 +8,7 @@ import type { Page } from '@blocksuite/store';
import { assertExists } from '@blocksuite/store';
import { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import { renderHook } from '@testing-library/react';
import { useBlockSuiteWorkspacePageIsPublic } from '@toeverything/hooks/use-blocksuite-workspace-page-is-public';
import { useBlockSuiteWorkspacePageTitle } from '@toeverything/hooks/use-blocksuite-workspace-page-title';
import { describe, expect, test } from 'vitest';
import { beforeEach } from 'vitest';
@@ -60,3 +61,16 @@ describe('useBlockSuiteWorkspacePageTitle', () => {
expect(pageTitleHook.result.current).toBe('1');
});
});
describe('useBlockSuiteWorkspacePageIsPublic', () => {
test('basic', async () => {
const page = blockSuiteWorkspace.getPage('page0') as Page;
expect(page).not.toBeNull();
const hook = renderHook(() => useBlockSuiteWorkspacePageIsPublic(page));
expect(hook.result.current[0]).toBe(false);
hook.result.current[1](true);
expect(page.meta.isPublic).toBe(true);
hook.rerender();
expect(hook.result.current[0]).toBe(true);
});
});
@@ -0,0 +1,24 @@
import type { Page } from '@blocksuite/store';
import { useCallback, useEffect, useState } from 'react';
declare module '@blocksuite/store' {
interface PageMeta {
isPublic?: boolean;
}
}
export function useBlockSuiteWorkspacePageIsPublic(page: Page) {
const [isPublic, set] = useState<boolean>(() => page.meta.isPublic ?? false);
useEffect(() => {
page.workspace.meta.pageMetasUpdated.on(() => {
set(page.meta.isPublic ?? false);
});
}, []);
const setIsPublic = useCallback((isPublic: boolean) => {
set(isPublic);
page.workspace.setPageMeta(page.id, {
isPublic,
});
}, []);
return [isPublic, setIsPublic] as const;
}