refactor: unify synced and un-synced affine workspace (#1299)

This commit is contained in:
Himself65
2023-03-03 13:58:15 -06:00
committed by GitHub
parent 296cd215c1
commit 50ff9b0c5c
7 changed files with 19 additions and 71 deletions

View File

@@ -4,11 +4,11 @@ import { CloseIcon } from '@blocksuite/icons';
import React from 'react'; import React from 'react';
import { useCurrentUser } from '../../../hooks/current/use-current-user'; import { useCurrentUser } from '../../../hooks/current/use-current-user';
import { AffineRemoteWorkspace } from '../../../shared'; import { AffineWorkspace } from '../../../shared';
import { Content, ContentTitle, Header, StyleButton, StyleTips } from './style'; import { Content, ContentTitle, Header, StyleButton, StyleTips } from './style';
interface EnableAffineCloudModalProps { interface EnableAffineCloudModalProps {
workspace: AffineRemoteWorkspace; workspace: AffineWorkspace;
open: boolean; open: boolean;
onConfirm: () => void; onConfirm: () => void;
onClose: () => void; onClose: () => void;

View File

@@ -19,7 +19,7 @@ import { lockMutex } from '../../../../../atoms';
import { useMembers } from '../../../../../hooks/affine/use-members'; import { useMembers } from '../../../../../hooks/affine/use-members';
import { transformWorkspace } from '../../../../../plugins'; import { transformWorkspace } from '../../../../../plugins';
import { import {
AffineRemoteWorkspace, AffineWorkspace,
LocalWorkspace, LocalWorkspace,
RemWorkspaceFlavour, RemWorkspaceFlavour,
} from '../../../../../shared'; } from '../../../../../shared';
@@ -45,7 +45,7 @@ import {
const AffineRemoteCollaborationPanel: React.FC< const AffineRemoteCollaborationPanel: React.FC<
Omit<PanelProps, 'workspace'> & { Omit<PanelProps, 'workspace'> & {
workspace: AffineRemoteWorkspace; workspace: AffineWorkspace;
} }
> = ({ workspace }) => { > = ({ workspace }) => {
const [isInviteModalShow, setIsInviteModalShow] = useState(false); const [isInviteModalShow, setIsInviteModalShow] = useState(false);
@@ -213,7 +213,7 @@ const LocalCollaborationPanel: React.FC<
export const CollaborationPanel: React.FC<PanelProps> = props => { export const CollaborationPanel: React.FC<PanelProps> = props => {
switch (props.workspace.flavour) { switch (props.workspace.flavour) {
case RemWorkspaceFlavour.AFFINE: { case RemWorkspaceFlavour.AFFINE: {
const workspace = props.workspace as AffineRemoteWorkspace; const workspace = props.workspace as AffineWorkspace;
return ( return (
<AffineRemoteCollaborationPanel {...props} workspace={workspace} /> <AffineRemoteCollaborationPanel {...props} workspace={workspace} />
); );

View File

@@ -13,7 +13,7 @@ import { lockMutex } from '../../../../../atoms';
import { useToggleWorkspacePublish } from '../../../../../hooks/affine/use-toggle-workspace-publish'; import { useToggleWorkspacePublish } from '../../../../../hooks/affine/use-toggle-workspace-publish';
import { import {
AffineOfficialWorkspace, AffineOfficialWorkspace,
AffineRemoteWorkspace, AffineWorkspace,
LocalWorkspace, LocalWorkspace,
RemWorkspaceFlavour, RemWorkspaceFlavour,
} from '../../../../../shared'; } from '../../../../../shared';
@@ -25,7 +25,7 @@ export type PublishPanelProps = {
}; };
export type PublishPanelAffineProps = { export type PublishPanelAffineProps = {
workspace: AffineRemoteWorkspace; workspace: AffineWorkspace;
}; };
const PublishPanelAffine: React.FC<PublishPanelAffineProps> = ({ const PublishPanelAffine: React.FC<PublishPanelAffineProps> = ({

View File

@@ -2,11 +2,11 @@ import { useCallback } from 'react';
import { mutate } from 'swr'; import { mutate } from 'swr';
import { QueryKey } from '../../plugins/affine/fetcher'; import { QueryKey } from '../../plugins/affine/fetcher';
import { AffineRemoteWorkspace } from '../../shared'; import { AffineWorkspace } from '../../shared';
import { apis } from '../../shared/apis'; import { apis } from '../../shared/apis';
import { refreshDataCenter } from '../use-workspaces'; import { refreshDataCenter } from '../use-workspaces';
export function useToggleWorkspacePublish(workspace: AffineRemoteWorkspace) { export function useToggleWorkspacePublish(workspace: AffineWorkspace) {
return useCallback( return useCallback(
async (isPublish: boolean) => { async (isPublish: boolean) => {
await apis.updateWorkspace({ await apis.updateWorkspace({

View File

@@ -1,9 +1,6 @@
import { createAffineProviders } from '../../blocksuite'; import { createAffineProviders } from '../../blocksuite';
import { Unreachable } from '../../components/affine/affine-error-eoundary'; import { Unreachable } from '../../components/affine/affine-error-eoundary';
import { import { AffineWorkspace, RemWorkspaceFlavour } from '../../shared';
AffineRemoteUnSyncedWorkspace,
RemWorkspaceFlavour,
} from '../../shared';
import { apis } from '../../shared/apis'; import { apis } from '../../shared/apis';
import { createEmptyBlockSuiteWorkspace } from '../../utils'; import { createEmptyBlockSuiteWorkspace } from '../../utils';
@@ -48,7 +45,7 @@ export const fetcher = async (
// fixme: token could be expired // fixme: token could be expired
({ api: '/api/workspace', token: apis.auth.token }[k]) ({ api: '/api/workspace', token: apis.auth.token }[k])
); );
const remWorkspace: AffineRemoteUnSyncedWorkspace = { const remWorkspace: AffineWorkspace = {
...workspace, ...workspace,
flavour: RemWorkspaceFlavour.AFFINE, flavour: RemWorkspaceFlavour.AFFINE,
blockSuiteWorkspace, blockSuiteWorkspace,

View File

@@ -9,8 +9,7 @@ import { WorkspaceSettingDetail } from '../../components/affine/workspace-settin
import { BlockSuitePageList } from '../../components/blocksuite/block-suite-page-list'; import { BlockSuitePageList } from '../../components/blocksuite/block-suite-page-list';
import { PageDetailEditor } from '../../components/page-detail-editor'; import { PageDetailEditor } from '../../components/page-detail-editor';
import { import {
AffineRemoteSyncedWorkspace, AffineWorkspace,
AffineRemoteUnSyncedWorkspace,
BlockSuiteWorkspace, BlockSuiteWorkspace,
LoadPriority, LoadPriority,
RemWorkspaceFlavour, RemWorkspaceFlavour,
@@ -20,10 +19,9 @@ import { createEmptyBlockSuiteWorkspace } from '../../utils';
import { WorkspacePlugin } from '..'; import { WorkspacePlugin } from '..';
import { fetcher, QueryKey } from './fetcher'; import { fetcher, QueryKey } from './fetcher';
const kAffineLocal = 'affine-local-storage'; const kAffineLocal = 'affine-local-storage-v2';
const schema = z.object({ const schema = z.object({
id: z.string(), id: z.string(),
firstBinarySynced: z.boolean(),
type: z.number(), type: z.number(),
public: z.boolean(), public: z.boolean(),
permission: z.number(), permission: z.number(),
@@ -66,9 +64,8 @@ export const AffinePlugin: WorkspacePlugin<RemWorkspaceFlavour.AFFINE> = {
// fixme: token could be expired // fixme: token could be expired
({ api: '/api/workspace', token: apis.auth.token }[k]) ({ api: '/api/workspace', token: apis.auth.token }[k])
); );
const affineWorkspace: AffineRemoteSyncedWorkspace = { const affineWorkspace: AffineWorkspace = {
...workspace, ...workspace,
firstBinarySynced: true,
blockSuiteWorkspace, blockSuiteWorkspace,
providers: [...createAffineProviders(blockSuiteWorkspace)], providers: [...createAffineProviders(blockSuiteWorkspace)],
flavour: RemWorkspaceFlavour.AFFINE, flavour: RemWorkspaceFlavour.AFFINE,
@@ -93,7 +90,7 @@ export const AffinePlugin: WorkspacePlugin<RemWorkspaceFlavour.AFFINE> = {
localStorage.removeItem(kAffineLocal); localStorage.removeItem(kAffineLocal);
} }
} }
const promise: Promise<AffineRemoteUnSyncedWorkspace[]> = preload( const promise: Promise<AffineWorkspace[]> = preload(
QueryKey.getWorkspaces, QueryKey.getWorkspaces,
fetcher fetcher
); );
@@ -122,13 +119,10 @@ export const AffinePlugin: WorkspacePlugin<RemWorkspaceFlavour.AFFINE> = {
return workspaces; return workspaces;
}) })
.then(ws => { .then(ws => {
const workspaces = ws.filter( const workspaces = ws.filter(Boolean) as AffineWorkspace[];
Boolean
) as AffineRemoteSyncedWorkspace[];
const dump = workspaces.map(workspace => { const dump = workspaces.map(workspace => {
return { return {
id: workspace.id, id: workspace.id,
firstBinarySynced: workspace.firstBinarySynced,
type: workspace.type, type: workspace.type,
public: workspace.public, public: workspace.public,
permission: workspace.permission, permission: workspace.permission,

View File

@@ -3,10 +3,6 @@ import { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import { NextPage } from 'next'; import { NextPage } from 'next';
import { ReactElement, ReactNode } from 'react'; import { ReactElement, ReactNode } from 'react';
import { createAffineProviders } from '../blocksuite';
import { createEmptyBlockSuiteWorkspace } from '../utils';
import { apis } from './apis';
export { BlockSuiteWorkspace }; export { BlockSuiteWorkspace };
declare global { declare global {
@@ -21,20 +17,11 @@ export const enum RemWorkspaceFlavour {
} }
export interface FlavourToWorkspace { export interface FlavourToWorkspace {
[RemWorkspaceFlavour.AFFINE]: [RemWorkspaceFlavour.AFFINE]: AffineWorkspace;
| AffineRemoteUnSyncedWorkspace
| AffineRemoteSyncedWorkspace;
[RemWorkspaceFlavour.LOCAL]: LocalWorkspace; [RemWorkspaceFlavour.LOCAL]: LocalWorkspace;
} }
export interface AffineRemoteSyncedWorkspace extends RemoteWorkspace { export interface AffineWorkspace extends RemoteWorkspace {
flavour: RemWorkspaceFlavour.AFFINE;
firstBinarySynced: true;
blockSuiteWorkspace: BlockSuiteWorkspace;
providers: Provider[];
}
export interface AffineRemoteUnSyncedWorkspace extends RemoteWorkspace {
flavour: RemWorkspaceFlavour.AFFINE; flavour: RemWorkspaceFlavour.AFFINE;
// empty // empty
blockSuiteWorkspace: BlockSuiteWorkspace; blockSuiteWorkspace: BlockSuiteWorkspace;
@@ -48,33 +35,6 @@ export interface LocalWorkspace {
providers: Provider[]; providers: Provider[];
} }
export const transformToAffineSyncedWorkspace = async (
unSyncedWorkspace: AffineRemoteUnSyncedWorkspace,
binary: ArrayBuffer
): Promise<AffineRemoteSyncedWorkspace> => {
const blockSuiteWorkspace = createEmptyBlockSuiteWorkspace(
unSyncedWorkspace.id,
(k: string) =>
// fixme: token could be expired
({ api: '/api/workspace', token: apis.auth.token }[k])
);
BlockSuiteWorkspace.Y.applyUpdate(
blockSuiteWorkspace.doc,
new Uint8Array(binary)
);
return new Promise(resolve => {
// Fixme: https://github.com/toeverything/blocksuite/issues/1350
setTimeout(() => {
resolve({
...unSyncedWorkspace,
blockSuiteWorkspace,
firstBinarySynced: true,
providers: [...createAffineProviders(blockSuiteWorkspace)],
});
}, 0);
});
};
export type BaseProvider = { export type BaseProvider = {
flavour: string; flavour: string;
// if this is true, we will connect the provider on the background // if this is true, we will connect the provider on the background
@@ -106,10 +66,7 @@ export type Provider =
| AffineWebSocketProvider | AffineWebSocketProvider
| BroadCastChannelProvider; | BroadCastChannelProvider;
export type AffineRemoteWorkspace = export type AffineOfficialWorkspace = AffineWorkspace | LocalWorkspace;
| AffineRemoteSyncedWorkspace
| AffineRemoteUnSyncedWorkspace;
export type AffineOfficialWorkspace = AffineRemoteWorkspace | LocalWorkspace;
export type RemWorkspace = AffineOfficialWorkspace; export type RemWorkspace = AffineOfficialWorkspace;