mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-16 17:46:18 +08:00
feat: add meta info into workspace
This commit is contained in:
+1
@@ -44,6 +44,7 @@ export const SelectorPopperContent = () => {
|
||||
{workspacesMeta.map(workspace => {
|
||||
return (
|
||||
<WorkspaceItem
|
||||
type={workspace.type}
|
||||
key={workspace.id}
|
||||
id={workspace.id}
|
||||
name={`workspace-${workspace.id}`}
|
||||
|
||||
+19
-11
@@ -7,11 +7,13 @@ import {
|
||||
} from '../styles';
|
||||
import { FooterSetting } from './FooterSetting';
|
||||
import { FooterUsers } from './FooterUsers';
|
||||
import { WorkspaceType } from '@pathfinder/data-services';
|
||||
|
||||
interface WorkspaceItemProps {
|
||||
id: string;
|
||||
name: string;
|
||||
icon: string;
|
||||
type: WorkspaceType;
|
||||
onClick?: (workspaceId: string) => void;
|
||||
}
|
||||
|
||||
@@ -19,6 +21,7 @@ export const WorkspaceItem = ({
|
||||
id,
|
||||
name,
|
||||
icon,
|
||||
type,
|
||||
onClick,
|
||||
}: WorkspaceItemProps) => {
|
||||
const router = useRouter();
|
||||
@@ -32,6 +35,7 @@ export const WorkspaceItem = ({
|
||||
onClick={() => {
|
||||
router.push(`/workspace/${id}`);
|
||||
}}
|
||||
isPrivate={type === WorkspaceType.Private}
|
||||
>
|
||||
<WorkspaceItemAvatar alt={name} src={icon}>
|
||||
{name.charAt(0)}
|
||||
@@ -58,17 +62,21 @@ const Name = styled('div')(({ theme }) => {
|
||||
};
|
||||
});
|
||||
|
||||
const StyledWrapper = styled(WorkspaceItemWrapper)({
|
||||
'& .footer-setting': {
|
||||
display: 'none',
|
||||
},
|
||||
':hover .footer-users': {
|
||||
display: 'none',
|
||||
},
|
||||
':hover .footer-setting': {
|
||||
display: 'block',
|
||||
},
|
||||
});
|
||||
const StyledWrapper = styled(WorkspaceItemWrapper)<{ isPrivate: boolean }>(
|
||||
({ isPrivate }) => {
|
||||
return {
|
||||
'& .footer-setting': {
|
||||
display: 'none',
|
||||
},
|
||||
':hover .footer-users': {
|
||||
display: isPrivate ? 'block' : 'none',
|
||||
},
|
||||
':hover .footer-setting': {
|
||||
display: isPrivate ? 'none' : 'block',
|
||||
},
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
const Footer = styled('div')({
|
||||
width: '42px',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useEffect } from 'react';
|
||||
import type { Page } from '@blocksuite/store';
|
||||
import {
|
||||
createWebsocketDocProvider,
|
||||
// createWebsocketDocProvider,
|
||||
IndexedDBDocProvider,
|
||||
Workspace,
|
||||
} from '@blocksuite/store';
|
||||
@@ -13,17 +13,18 @@ import type {
|
||||
LoadWorkspaceHandler,
|
||||
CreateEditorHandler,
|
||||
} from './context';
|
||||
import { downloadWorkspace } from '@pathfinder/data-services';
|
||||
|
||||
const getEditorParams = (workspaceId: string) => {
|
||||
const providers = [];
|
||||
const params = new URLSearchParams(location.search);
|
||||
// const room = params.get('room') ?? 'AFFINE-pathfinder';
|
||||
if (params.get('syncMode') === 'websocket') {
|
||||
const WebsocketDocProvider = createWebsocketDocProvider(
|
||||
`ws://${window.location.host}/collaboration/`
|
||||
);
|
||||
providers.push(WebsocketDocProvider);
|
||||
}
|
||||
// if (params.get('syncMode') === 'websocket') {
|
||||
// const WebsocketDocProvider = createWebsocketDocProvider(
|
||||
// `ws://${window.location.host}/collaboration/`
|
||||
// );
|
||||
// providers.push(WebsocketDocProvider);
|
||||
// }
|
||||
|
||||
providers.push(IndexedDBDocProvider);
|
||||
|
||||
@@ -44,7 +45,7 @@ const DynamicBlocksuite = ({
|
||||
}: Props) => {
|
||||
useEffect(() => {
|
||||
const openWorkspace: LoadWorkspaceHandler = (workspaceId: string) =>
|
||||
new Promise(resolve => {
|
||||
new Promise(async resolve => {
|
||||
const workspace = new Workspace({
|
||||
...getEditorParams(workspaceId as string),
|
||||
}).register(BlockSchema);
|
||||
@@ -53,7 +54,12 @@ const DynamicBlocksuite = ({
|
||||
p => p instanceof IndexedDBDocProvider
|
||||
);
|
||||
if (indexDBProvider) {
|
||||
(indexDBProvider as IndexedDBDocProvider)?.on('synced', () => {
|
||||
(indexDBProvider as IndexedDBDocProvider)?.on('synced', async () => {
|
||||
const updates = await downloadWorkspace({ workspaceId });
|
||||
updates &&
|
||||
Workspace.Y.applyUpdate(workspace.doc, new Uint8Array(updates));
|
||||
// if after update, the space:meta is empty, then we need to get map with doc
|
||||
workspace.doc.getMap('space:meta');
|
||||
resolve(workspace);
|
||||
});
|
||||
} else {
|
||||
|
||||
@@ -118,6 +118,13 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
|
||||
useEffect(() => {
|
||||
const callback = async (user: AccessTokenMessage | null) => {
|
||||
const workspacesMeta = user ? await getWorkspaces() : [];
|
||||
const workspaces = await Promise.all(
|
||||
workspacesMeta.map(async ({ id }) => {
|
||||
const workspace = (await loadWorkspaceHandler?.(id)) || null;
|
||||
return workspace;
|
||||
})
|
||||
);
|
||||
// TODO: add meta info to workspace meta
|
||||
setState(state => ({ ...state, user: user, workspacesMeta }));
|
||||
};
|
||||
authorizationEvent.onChange(callback);
|
||||
@@ -125,7 +132,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
|
||||
return () => {
|
||||
authorizationEvent.removeCallback(callback);
|
||||
};
|
||||
}, []);
|
||||
}, [loadWorkspaceHandler]);
|
||||
|
||||
const context = useMemo(
|
||||
() => ({
|
||||
|
||||
Reference in New Issue
Block a user