Merge remote-tracking branch 'origin/feat/datacenter-dev' into feat/datacenter-dev

This commit is contained in:
alt0
2023-01-12 19:51:00 +08:00
7 changed files with 108 additions and 69 deletions

View File

@@ -64,6 +64,14 @@ export const useWorkspaceHelper = () => {
currentWorkspace && (await dataCenter.leaveWorkspace(currentWorkspace?.id));
};
const acceptInvite = async (inviteCode: string) => {
let inviteInfo;
if (inviteCode) {
inviteInfo = await dataCenter.acceptInvitation(inviteCode);
}
return inviteInfo;
};
return {
createWorkspace,
publishWorkspace,
@@ -71,5 +79,6 @@ export const useWorkspaceHelper = () => {
enableWorkspace,
deleteWorkSpace,
leaveWorkSpace,
acceptInvite,
};
};

View File

@@ -1,44 +1,37 @@
import { useWorkspaceHelper } from '@/hooks/use-workspace-helper';
import { useAppState } from '@/providers/app-state-provider';
import { styled } from '@/styles';
import { Empty } from '@/ui/empty';
import { Avatar } from '@mui/material';
// import { getDataCenter } from '@affine/datacenter';
// import { Avatar } from '@mui/material';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
const User = ({ name, avatar }: { name: string; avatar?: string }) => {
return (
<UserContent>
{avatar ? (
<Avatar src={avatar}></Avatar>
) : (
<UserIcon>{name.slice(0, 1)}</UserIcon>
)}
<span>{name}</span>
</UserContent>
);
};
// const User = ({ name, avatar }: { name: string; avatar?: string }) => {
// return (
// <UserContent>
// {avatar ? (
// <Avatar src={avatar}></Avatar>
// ) : (
// <UserIcon>{name.slice(0, 1)}</UserIcon>
// )}
// <span>{name}</span>
// </UserContent>
// );
// };
export default function DevPage() {
const router = useRouter();
const [successInvited, setSuccessInvited] = useState<boolean>(false);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const [inviteData, setInviteData] = useState<any>(null);
const { acceptInvite } = useWorkspaceHelper();
const { user } = useAppState();
useEffect(() => {
// getDataCenter()
// .then(dc =>
// dc.apis.acceptInviting({
// invitingCode: router.query.invite_code as string,
// })
// )
// .then(data => {
// setSuccessInvited(true);
// setInviteData(data);
// })
// .catch(err => {
// console.log('err: ', err);
// });
setSuccessInvited(true);
setInviteData(null);
router.query.invite_code &&
acceptInvite(router.query.invite_code as string).then(data => {
if (data && data.accepted) {
setSuccessInvited(true);
user && router.push(`/workspace/${data.workspace_id}`);
}
});
}, [router.query.invite_code]);
return (
@@ -47,11 +40,12 @@ export default function DevPage() {
<Empty width={310} height={310}></Empty>
<Content>
<User name={inviteData?.name ? inviteData.name : '-'}></User> invited
you to join
<User
{/* TODO add inviteInfo*/}
{/* <User name={inviteData?.name ? inviteData.name : '-'}></User> invited */}
{/* you to join */}
{/* <User
name={inviteData?.workspaceName ? inviteData.workspaceName : '-'}
></User>
></User> */}
{successInvited ? (
<Status>
<svg

View File

@@ -416,13 +416,14 @@ export class DataCenter {
/**
* accept invitation
* @param {string} inviteCode
* @returns {Promise<Permission | null>} permission
*/
async acceptInvitation(inviteCode: string, providerStr = 'affine') {
const provider = this.providerMap.get(providerStr);
if (provider) {
return await provider.acceptInvitation(inviteCode);
}
return [];
return null;
}
onMessage(cb: (message: Message) => void) {

View File

@@ -102,10 +102,19 @@ export class AffineProvider extends BaseProvider {
});
}
private _handlerAffineListMessage({ ws_details, metadata }: ChannelMessage) {
private async _handlerAffineListMessage({
ws_details,
metadata,
}: ChannelMessage) {
this._logger('receive server message');
Object.entries(ws_details).forEach(async ([id, detail]) => {
const addedWorkspaces: WorkspaceUnit[] = [];
const removeWorkspaceList = this._workspaces.list().map(w => w.id);
for (const [id, detail] of Object.entries(ws_details)) {
const { name, avatar } = metadata[id];
const index = removeWorkspaceList.indexOf(id);
if (index !== -1) {
removeWorkspaceList.splice(index, 1);
}
assert(name);
const workspace = {
name: name,
@@ -122,15 +131,20 @@ export class AffineProvider extends BaseProvider {
syncMode: 'core' as SyncMode,
};
if (this._workspaces.get(id)) {
// update workspaces
this._workspaces.update(id, workspace);
} else {
const workspaceUnit = await loadWorkspaceUnit(
{ id, ...workspace },
this._apis
);
this._workspaces.add(workspaceUnit);
addedWorkspaces.push(workspaceUnit);
}
});
}
// add workspaces
this._workspaces.add(addedWorkspaces);
// remove workspaces
this._workspaces.remove(removeWorkspaceList);
}
private _getWebsocketProvider(workspace: BlocksuiteWorkspace) {
@@ -386,7 +400,7 @@ export class AffineProvider extends BaseProvider {
return this._apis.getWorkspaceMembers({ id });
}
public override async acceptInvitation(invitingCode: string): Promise<void> {
await this._apis.acceptInviting({ invitingCode });
public override async acceptInvitation(invitingCode: string) {
return await this._apis.acceptInviting({ invitingCode });
}
}

View File

@@ -197,13 +197,13 @@ export interface AcceptInvitingParams {
export async function acceptInviting(
params: AcceptInvitingParams
): Promise<void> {
await bareClient
.post(`api/invitation/${params.invitingCode}`)
.catch(error => {
sendMessage(messageCode.acceptInvitingFailed);
throw new RequestError('accept inviting failed', error);
});
): Promise<Permission> {
try {
return bareClient.post(`api/invitation/${params.invitingCode}`).json();
} catch (error) {
sendMessage(messageCode.acceptInvitingFailed);
throw new RequestError('accept inviting failed', error);
}
}
export async function uploadBlob(params: { blob: Blob }): Promise<string> {

View File

@@ -4,6 +4,7 @@ import { Logger, User } from '../types';
import type { WorkspaceUnitCollectionScope } from '../workspace-unit-collection';
import type { WorkspaceUnitCtorParams, WorkspaceUnit } from '../workspace-unit';
import { Member } from './affine/apis';
import { Permission } from './affine/apis/workspace.js';
const defaultLogger = () => {
return;
@@ -233,8 +234,10 @@ export class BaseProvider {
* @param {string} inviteCode
* @returns
*/
public async acceptInvitation(inviteCode: string): Promise<void> {
public async acceptInvitation(
inviteCode: string
): Promise<Permission | null> {
inviteCode;
return;
return null;
}
}

View File

@@ -8,7 +8,7 @@ export interface WorkspaceUnitCollectionScope {
get: (workspaceId: string) => WorkspaceUnit | undefined;
list: () => WorkspaceUnit[];
add: (workspace: WorkspaceUnit | WorkspaceUnit[]) => void;
remove: (workspaceId: string) => boolean;
remove: (workspaceId: string | string[]) => boolean;
clear: () => void;
update: (
workspaceId: string,
@@ -18,7 +18,7 @@ export interface WorkspaceUnitCollectionScope {
export interface WorkspaceUnitCollectionChangeEvent {
added?: WorkspaceUnit[];
deleted?: WorkspaceUnit;
deleted?: WorkspaceUnit[];
updated?: WorkspaceUnit;
}
@@ -62,16 +62,22 @@ export class WorkspaceUnitCollection {
const workspaceUnits = Array.isArray(workspaceUnit)
? workspaceUnit
: [workspaceUnit];
let added = false;
workspaceUnits.forEach(workspaceUnit => {
if (this._workspaceUnitMap.has(workspaceUnit.id)) {
// FIXME: multiple add same workspace
return;
}
added = true;
this._workspaceUnitMap.set(workspaceUnit.id, workspaceUnit);
scopedWorkspaceIds.add(workspaceUnit.id);
});
if (!added) {
return;
}
this._events.emit('change', [
{
added: workspaceUnits,
@@ -79,27 +85,39 @@ export class WorkspaceUnitCollection {
]);
};
const remove = (workspaceId: string) => {
if (!scopedWorkspaceIds.has(workspaceId)) {
return true;
}
const remove = (workspaceId: string | string[]) => {
const workspaceIds = Array.isArray(workspaceId)
? workspaceId
: [workspaceId];
const workspaceUnits: WorkspaceUnit[] = [];
const workspaceUnit = this._workspaceUnitMap.get(workspaceId);
if (workspaceUnit) {
const ret = this._workspaceUnitMap.delete(workspaceId);
// If deletion failed, return.
if (!ret) {
return ret;
workspaceIds.forEach(workspaceId => {
if (!scopedWorkspaceIds.has(workspaceId)) {
return;
}
const workspaceUnit = this._workspaceUnitMap.get(workspaceId);
if (workspaceUnit) {
const ret = this._workspaceUnitMap.delete(workspaceId);
// If deletion failed, return.
if (!ret) {
return;
}
scopedWorkspaceIds.delete(workspaceId);
workspaceUnits.push(workspaceUnit);
scopedWorkspaceIds.delete(workspaceId);
}
});
this._events.emit('change', [
{
deleted: workspaceUnit,
} as WorkspaceUnitCollectionChangeEvent,
]);
if (!workspaceUnits.length) {
return false;
}
this._events.emit('change', [
{
deleted: workspaceUnits,
} as WorkspaceUnitCollectionChangeEvent,
]);
return true;
};