diff --git a/apps/web/src/atoms/public-workspace/index.ts b/apps/web/src/atoms/public-workspace/index.ts index 9e5ffbeb15..21c28a1098 100644 --- a/apps/web/src/atoms/public-workspace/index.ts +++ b/apps/web/src/atoms/public-workspace/index.ts @@ -39,7 +39,6 @@ export const publicBlockSuiteAtom = atom>( id: workspaceId, blockSuiteWorkspace, flavour: RemWorkspaceFlavour.LOCAL, - syncBinary: () => Promise.resolve(workspace), providers: [], }; dataCenter.workspaces.push(workspace); diff --git a/apps/web/src/blocksuite/index.ts b/apps/web/src/blocksuite/index.ts index 51ad3c6446..8bacc7f5a7 100644 --- a/apps/web/src/blocksuite/index.ts +++ b/apps/web/src/blocksuite/index.ts @@ -2,17 +2,19 @@ import { config } from '@affine/env'; import { BlockSuiteWorkspace, Provider } from '../shared'; import { + createAffineWebSocketProvider, createBroadCastChannelProvider, createIndexedDBProvider, - createWebSocketProvider, } from './providers'; +import { createAffineDownloadProvider } from './providers/affine'; export const createAffineProviders = ( blockSuiteWorkspace: BlockSuiteWorkspace ): Provider[] => { return ( [ - createWebSocketProvider(blockSuiteWorkspace), + createAffineDownloadProvider(blockSuiteWorkspace), + createAffineWebSocketProvider(blockSuiteWorkspace), config.enableBroadCastChannelProvider && createBroadCastChannelProvider(blockSuiteWorkspace), config.enableIndexedDBProvider && diff --git a/apps/web/src/blocksuite/providers/affine/index.ts b/apps/web/src/blocksuite/providers/affine/index.ts new file mode 100644 index 0000000000..fa78f9a3a4 --- /dev/null +++ b/apps/web/src/blocksuite/providers/affine/index.ts @@ -0,0 +1,43 @@ +import { assertExists } from '@blocksuite/store'; + +import { AffineDownloadProvider, BlockSuiteWorkspace } from '../../../shared'; +import { apis } from '../../../shared/apis'; +import { providerLogger } from '../../logger'; + +const hashMap = new Map(); + +export const createAffineDownloadProvider = ( + blockSuiteWorkspace: BlockSuiteWorkspace +): AffineDownloadProvider => { + assertExists(blockSuiteWorkspace.room); + const id = blockSuiteWorkspace.room; + return { + flavour: 'affine-download', + background: true, + connect: () => { + providerLogger.info('connect download provider', id); + if (hashMap.has(id)) { + providerLogger.debug('applyUpdate'); + BlockSuiteWorkspace.Y.applyUpdate( + blockSuiteWorkspace.doc, + new Uint8Array(hashMap.get(id) as ArrayBuffer) + ); + return; + } + apis.downloadWorkspace(id, false).then(binary => { + hashMap.set(id, binary); + providerLogger.debug('applyUpdate'); + BlockSuiteWorkspace.Y.applyUpdate( + blockSuiteWorkspace.doc, + new Uint8Array(binary) + ); + }); + }, + disconnect: () => { + providerLogger.info('disconnect download provider', id); + }, + cleanup: () => { + hashMap.delete(id); + }, + }; +}; diff --git a/apps/web/src/blocksuite/providers/broad-cast-channel/index.ts b/apps/web/src/blocksuite/providers/broad-cast-channel/index.ts index 1050df4bdb..96fbfef59f 100644 --- a/apps/web/src/blocksuite/providers/broad-cast-channel/index.ts +++ b/apps/web/src/blocksuite/providers/broad-cast-channel/index.ts @@ -76,6 +76,7 @@ export const createBroadCastChannelProvider = ( }; return { flavour: 'broadcast-channel', + background: false, connect: () => { assertExists(blockSuiteWorkspace.room); broadcastChannel = Object.assign( diff --git a/apps/web/src/blocksuite/providers/index.ts b/apps/web/src/blocksuite/providers/index.ts index d08575f810..c22b223f22 100644 --- a/apps/web/src/blocksuite/providers/index.ts +++ b/apps/web/src/blocksuite/providers/index.ts @@ -11,12 +11,13 @@ import { apis } from '../../shared/apis'; import { providerLogger } from '../logger'; import { createBroadCastChannelProvider } from './broad-cast-channel'; -const createWebSocketProvider = ( +const createAffineWebSocketProvider = ( blockSuiteWorkspace: BlockSuiteWorkspace ): AffineWebSocketProvider => { let webSocketProvider: WebsocketProvider | null = null; return { flavour: 'affine-websocket', + background: false, cleanup: () => { assertExists(webSocketProvider); webSocketProvider.destroy(); @@ -54,37 +55,39 @@ const createWebSocketProvider = ( const createIndexedDBProvider = ( blockSuiteWorkspace: BlockSuiteWorkspace ): LocalIndexedDBProvider => { - let indexdbProvider: IndexeddbPersistence | null = null; + let indexeddbProvider: IndexeddbPersistence | null = null; return { flavour: 'local-indexeddb', + // fixme: remove background long polling + background: true, cleanup: () => { - assertExists(indexdbProvider); - indexdbProvider.clearData(); + assertExists(indexeddbProvider); + indexeddbProvider.clearData(); }, connect: () => { providerLogger.info( 'connect indexeddb provider', blockSuiteWorkspace.room ); - indexdbProvider = new IndexeddbPersistence( + indexeddbProvider = new IndexeddbPersistence( blockSuiteWorkspace.room as string, blockSuiteWorkspace.doc ); }, disconnect: () => { - assertExists(indexdbProvider); + assertExists(indexeddbProvider); providerLogger.info( 'disconnect indexeddb provider', blockSuiteWorkspace.room ); - indexdbProvider.destroy(); - indexdbProvider = null; + indexeddbProvider.destroy(); + indexeddbProvider = null; }, }; }; export { + createAffineWebSocketProvider, createBroadCastChannelProvider, createIndexedDBProvider, - createWebSocketProvider, }; diff --git a/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx b/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx index ed4e2602ca..0d527ee142 100644 --- a/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx +++ b/apps/web/src/components/affine/workspace-setting-detail/panel/general/index.tsx @@ -4,7 +4,7 @@ import { assertExists } from '@blocksuite/store'; import React, { useState } from 'react'; import { useIsWorkspaceOwner } from '../../../../../hooks/affine/use-is-workspace-owner'; -import { refreshDataCenter } from '../../../../../hooks/use-workspaces'; +import { useBlockSuiteWorkspaceName } from '../../../../../hooks/use-blocksuite-workspace-name'; import { RemWorkspaceFlavour } from '../../../../../shared'; import { Upload } from '../../../../pure/file-upload'; import { @@ -31,17 +31,16 @@ export const GeneralPanel: React.FC = ({ }) => { const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); - const [workspaceName, setWorkspaceName] = useState( - workspace.blockSuiteWorkspace.meta.name + const [name, setName] = useBlockSuiteWorkspaceName( + workspace.blockSuiteWorkspace ); + const [input, setInput] = useState(name); const isOwner = useIsWorkspaceOwner(workspace); const [showEditInput, setShowEditInput] = useState(false); const { t } = useTranslation(); - const handleUpdateWorkspaceName = () => { - workspace.blockSuiteWorkspace.meta.setName(workspaceName); - // fixme(himself65): don't refresh - refreshDataCenter(); + const handleUpdateWorkspaceName = (name: string) => { + setName(name); }; const fileChange = async (file: File) => { @@ -50,8 +49,6 @@ export const GeneralPanel: React.FC = ({ assertExists(blobs); const blobId = await blobs.set(blob); workspace.blockSuiteWorkspace.meta.setAvatar(blobId); - // fixme(himself65): don't refresh - refreshDataCenter(); }; return ( @@ -84,7 +81,7 @@ export const GeneralPanel: React.FC = ({
- {workspace.blockSuiteWorkspace.meta.name} + {name} {isOwner && ( { @@ -103,23 +100,21 @@ export const GeneralPanel: React.FC = ({ { - setWorkspaceName(newName); + setInput(newName); }} >