feat: workspace setting

This commit is contained in:
DiamondThree
2023-01-09 21:13:23 +08:00
parent 93866e56d2
commit 10072148d1
11 changed files with 77 additions and 61 deletions

View File

@@ -1,5 +1,5 @@
import { Workspace } from '@/hooks/mock-data/mock';
import { styled } from '@/styles'; import { styled } from '@/styles';
import { Workspace } from '@affine/datacenter';
export const ExportPageTitleContainer = styled('div')(() => { export const ExportPageTitleContainer = styled('div')(() => {
return { return {

View File

@@ -17,12 +17,13 @@ import { Button, IconButton } from '@/ui/button';
import { InviteMembers } from '../invite-members/index'; import { InviteMembers } from '../invite-members/index';
import { Menu, MenuItem } from '@/ui/menu'; import { Menu, MenuItem } from '@/ui/menu';
import { Empty } from '@/ui/empty'; import { Empty } from '@/ui/empty';
import { // import {
deleteMember, // deleteMember,
getMembers, // getMembers,
User, // User,
Workspace, // Workspace,
} from '@/hooks/mock-data/mock'; // } from '@/hooks/mock-data/mock';
import { Workspace } from '@affine/datacenter';
import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider';
import { StyledMemberWarp } from './general/style'; import { StyledMemberWarp } from './general/style';
import { useConfirm } from '@/providers/ConfirmProvider'; import { useConfirm } from '@/providers/ConfirmProvider';
@@ -30,7 +31,9 @@ import { useConfirm } from '@/providers/ConfirmProvider';
// import { useAppState } from '@/providers/app-state-provider'; // import { useAppState } from '@/providers/app-state-provider';
export const MembersPage = ({ workspace }: { workspace: Workspace }) => { export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
const [isInviteModalShow, setIsInviteModalShow] = useState(false); const [isInviteModalShow, setIsInviteModalShow] = useState(false);
const [members, setMembers] = useState<User[]>([]); const [members, setMembers] = useState<[{ name: string; email: string }]>([
{ name: 'affine', email: 'tttt' },
]);
const { user, login, updateWorkspaceMeta } = useTemporaryHelper(); const { user, login, updateWorkspaceMeta } = useTemporaryHelper();
const { confirm } = useConfirm(); const { confirm } = useConfirm();
// const refreshMembers = useCallback(() => { // const refreshMembers = useCallback(() => {
@@ -48,8 +51,8 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
// }); // });
// }, [workspace.id]); // }, [workspace.id]);
const setMembersList = () => { const setMembersList = () => {
const members = getMembers(workspace.id); // const members = getMembers(workspace.id);
members && setMembers(members); // members && setMembers(members);
}; };
useEffect(() => { useEffect(() => {
setMembersList(); setMembersList();
@@ -58,7 +61,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
return ( return (
<div> <div>
{workspace.type === 'cloud' ? ( {workspace.provider === 'cloud' ? (
<> <>
<StyledMemberTitleContainer> <StyledMemberTitleContainer>
<StyledMemberNameContainer> <StyledMemberNameContainer>
@@ -67,13 +70,6 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
<StyledMemberRoleContainer>Access level</StyledMemberRoleContainer> <StyledMemberRoleContainer>Access level</StyledMemberRoleContainer>
</StyledMemberTitleContainer> </StyledMemberTitleContainer>
<StyledMemberListContainer> <StyledMemberListContainer>
{members.length === 0 && (
<Empty
width={648}
sx={{ marginTop: '60px' }}
height={300}
></Empty>
)}
{members.length ? ( {members.length ? (
members.map((member, index) => { members.map((member, index) => {
return ( return (
@@ -103,7 +99,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
<> <>
<MenuItem <MenuItem
onClick={() => { onClick={() => {
deleteMember(workspace.id, 0); // deleteMember(workspace.id, 0);
setMembersList(); setMembersList();
// confirm({ // confirm({
// title: 'Delete Member?', // title: 'Delete Member?',
@@ -142,7 +138,11 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
); );
}) })
) : ( ) : (
<></> <Empty
width={648}
sx={{ marginTop: '60px' }}
height={300}
></Empty>
)} )}
</StyledMemberListContainer> </StyledMemberListContainer>
<StyledMemberButtonContainer> <StyledMemberButtonContainer>

View File

@@ -9,20 +9,20 @@ import {
import { Button } from '@/ui/button'; import { Button } from '@/ui/button';
import Input from '@/ui/input'; import Input from '@/ui/input';
import { toast } from '@/ui/toast'; import { toast } from '@/ui/toast';
import { Workspace } from '@/hooks/mock-data/mock';
import { useTemporaryHelper } from '@/providers/temporary-helper-provider';
import { useConfirm } from '@/providers/ConfirmProvider'; import { useConfirm } from '@/providers/ConfirmProvider';
// import { useAppState } from '@/providers/app-state-provider3';
import { useWorkspaceHelper } from '@/hooks/use-workspace-helper';
import { Workspace } from '@affine/datacenter';
export const PublishPage = ({ workspace }: { workspace: Workspace }) => { export const PublishPage = ({ workspace }: { workspace: Workspace }) => {
console.log('workspace: ', workspace);
const shareUrl = const shareUrl =
window.location.host + '/workspace/' + workspace.id + '?share=true'; window.location.host + '/workspace/' + workspace.id + '?share=true';
const { publishWorkspace } = useWorkspaceHelper();
const { login, updateWorkspaceMeta, user } = useTemporaryHelper();
const { confirm } = useConfirm(); const { confirm } = useConfirm();
const togglePublic = (flag: boolean) => { const togglePublic = (flag: boolean) => {
updateWorkspaceMeta(workspace.id, { isPublish: flag }); workspace.id && publishWorkspace(workspace?.id, flag);
}; };
const copyUrl = () => { const copyUrl = () => {
@@ -34,22 +34,23 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => {
confirm({ confirm({
title: 'Enable AFFiNE Cloud?', title: 'Enable AFFiNE Cloud?',
content: `If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.`, content: `If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.`,
confirmText: user ? 'Enable' : 'Sign in and Enable', confirmText:
workspace.provider === 'local' ? 'Enable' : 'Sign in and Enable',
cancelText: 'Skip', cancelText: 'Skip',
}).then(confirm => { }).then(confirm => {
if (confirm) { if (confirm) {
if (user) { // if (user) {
updateWorkspaceMeta(workspace.id, { type: 'cloud' }); // updateWorkspaceMeta(workspace.id, { type: 'cloud' });
} else { // } else {
login(); // login();
updateWorkspaceMeta(workspace.id, { type: 'cloud' }); // updateWorkspaceMeta(workspace.id, { type: 'cloud' });
} // }
} }
}); });
}; };
return ( return (
<> <>
{workspace.type === 'cloud' ? ( {workspace.provider === 'cloud' ? (
<div> <div>
<StyledPublishContent> <StyledPublishContent>
{workspace?.isPublish ? ( {workspace?.isPublish ? (

View File

@@ -6,9 +6,8 @@ import {
import { DownloadIcon } from '@blocksuite/icons'; import { DownloadIcon } from '@blocksuite/icons';
import { Button } from '@/ui/button'; import { Button } from '@/ui/button';
import { Menu, MenuItem } from '@/ui/menu'; import { Menu, MenuItem } from '@/ui/menu';
import { deleteMember, Workspace } from '@/hooks/mock-data/mock';
import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider';
import { Workspace } from '@affine/datacenter';
export const SyncPage = ({ workspace }: { workspace: Workspace }) => { export const SyncPage = ({ workspace }: { workspace: Workspace }) => {
const { currentWorkspace, updateWorkspaceMeta } = useTemporaryHelper(); const { currentWorkspace, updateWorkspaceMeta } = useTemporaryHelper();
@@ -49,7 +48,7 @@ export const SyncPage = ({ workspace }: { workspace: Workspace }) => {
<> <>
<MenuItem <MenuItem
onClick={() => { onClick={() => {
deleteMember(workspace.id, 0); // deleteMember(workspace.id, 0);
}} }}
icon={<DownloadIcon />} icon={<DownloadIcon />}
> >
@@ -57,7 +56,7 @@ export const SyncPage = ({ workspace }: { workspace: Workspace }) => {
</MenuItem> </MenuItem>
<MenuItem <MenuItem
onClick={() => { onClick={() => {
deleteMember(workspace.id, 0); // deleteMember(workspace.id, 0);
}} }}
icon={<DownloadIcon />} icon={<DownloadIcon />}
> >

View File

@@ -20,7 +20,7 @@ import { MembersPage } from './MembersPage';
import { PublishPage } from './PublishPage'; import { PublishPage } from './PublishPage';
import { ExportPage } from './ExportPage'; import { ExportPage } from './ExportPage';
import { SyncPage } from './SyncPage'; import { SyncPage } from './SyncPage';
import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { useAppState } from '@/providers/app-state-provider';
enum ActiveTab { enum ActiveTab {
'general' = 'general', 'general' = 'general',
@@ -115,7 +115,7 @@ export const WorkspaceSetting = ({
setActiveTab(tab); setActiveTab(tab);
}; };
const { currentWorkspace } = useTemporaryHelper(); const { currentMetaWorkSpace } = useAppState();
const handleClickClose = () => { const handleClickClose = () => {
onClose && onClose(); onClose && onClose();
}; };
@@ -142,20 +142,20 @@ export const WorkspaceSetting = ({
</StyledSettingSidebar> </StyledSettingSidebar>
) : null} ) : null}
<StyledSettingContent> <StyledSettingContent>
{activeTab === ActiveTab.general && currentWorkspace && ( {activeTab === ActiveTab.general && currentMetaWorkSpace && (
<GeneralPage workspace={currentWorkspace} /> <GeneralPage workspace={currentMetaWorkSpace} />
)} )}
{activeTab === ActiveTab.sync && currentWorkspace && ( {activeTab === ActiveTab.sync && currentMetaWorkSpace && (
<SyncPage workspace={currentWorkspace} /> <SyncPage workspace={currentMetaWorkSpace} />
)} )}
{activeTab === ActiveTab.members && currentWorkspace && ( {activeTab === ActiveTab.members && currentMetaWorkSpace && (
<MembersPage workspace={currentWorkspace} /> <MembersPage workspace={currentMetaWorkSpace} />
)} )}
{activeTab === ActiveTab.publish && currentWorkspace && ( {activeTab === ActiveTab.publish && currentMetaWorkSpace && (
<PublishPage workspace={currentWorkspace} /> <PublishPage workspace={currentMetaWorkSpace} />
)} )}
{activeTab === ActiveTab.export && currentWorkspace && ( {activeTab === ActiveTab.export && currentMetaWorkSpace && (
<ExportPage workspace={currentWorkspace} /> <ExportPage workspace={currentMetaWorkSpace} />
)} )}
</StyledSettingContent> </StyledSettingContent>
</StyledSettingContainer> </StyledSettingContainer>

View File

@@ -14,9 +14,9 @@ import { WorkspaceDelete } from './delete';
// import { debounce } from '@/utils'; // import { debounce } from '@/utils';
import { WorkspaceLeave } from './leave'; import { WorkspaceLeave } from './leave';
import { Upload } from '@/components/file-upload'; import { Upload } from '@/components/file-upload';
import { Workspace } from '@/hooks/mock-data/mock';
import { WorkspaceAvatar } from '@/components/workspace-avatar'; import { WorkspaceAvatar } from '@/components/workspace-avatar';
import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider';
import { Workspace } from '@affine/datacenter';
export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { export const GeneralPage = ({ workspace }: { workspace: Workspace }) => {
// const { refreshWorkspacesMeta } = useAppState(); // const { refreshWorkspacesMeta } = useAppState();
const { updateWorkspaceMeta } = useTemporaryHelper(); const { updateWorkspaceMeta } = useTemporaryHelper();
@@ -124,7 +124,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => {
<StyledSettingH2 marginTop={20}>Workspace Type</StyledSettingH2> <StyledSettingH2 marginTop={20}>Workspace Type</StyledSettingH2>
<StyledSettingInputContainer> <StyledSettingInputContainer>
<code>{workspace.type} </code> <code>{workspace.provider} </code>
</StyledSettingInputContainer> </StyledSettingInputContainer>
<StyledDeleteButtonContainer> <StyledDeleteButtonContainer>
{isOwner ? ( {isOwner ? (

View File

@@ -15,8 +15,9 @@ import { useRouter } from 'next/router';
import { import {
deleteWorkspace, deleteWorkspace,
getWorkspaces, getWorkspaces,
Workspace, // Workspace,
} from '@/hooks/mock-data/mock'; } from '@/hooks/mock-data/mock';
import { Workspace } from '@affine/datacenter';
interface WorkspaceDeleteProps { interface WorkspaceDeleteProps {
open: boolean; open: boolean;
@@ -55,7 +56,7 @@ export const WorkspaceDelete = ({
<StyledModalWrapper> <StyledModalWrapper>
<ModalCloseButton onClick={onClose} /> <ModalCloseButton onClick={onClose} />
<StyledModalHeader>Delete Workspace</StyledModalHeader> <StyledModalHeader>Delete Workspace</StyledModalHeader>
{workspace.type === 'local' ? ( {workspace.provider === 'local' ? (
<StyledTextContent> <StyledTextContent>
Deleting ( Deleting (
<StyledWorkspaceName>{workspace.name}</StyledWorkspaceName>) cannot <StyledWorkspaceName>{workspace.name}</StyledWorkspaceName>) cannot

View File

@@ -5,7 +5,8 @@ import { WorkspaceAvatar } from '@/components/workspace-avatar';
import { useAppState } from '@/providers/app-state-provider'; import { useAppState } from '@/providers/app-state-provider';
export const WorkspaceSelector = () => { export const WorkspaceSelector = () => {
const [workspaceListShow, setWorkspaceListShow] = useState(false); const [workspaceListShow, setWorkspaceListShow] = useState(false);
const { currentWorkspace, workspaceList } = useAppState(); const { currentMetaWorkSpace, workspaceList } = useAppState();
console.log('currentMetaWorkSpace: ', currentMetaWorkSpace);
useEffect(() => { useEffect(() => {
if (workspaceList.length === 0) { if (workspaceList.length === 0) {
@@ -24,7 +25,7 @@ export const WorkspaceSelector = () => {
<Avatar <Avatar
alt="Affine" alt="Affine"
data-testid="workspace-avatar" data-testid="workspace-avatar"
src={currentWorkspace.meta.avatar} src={currentMetaWorkSpace?.avatar}
> >
<div <div
style={{ style={{
@@ -33,12 +34,12 @@ export const WorkspaceSelector = () => {
> >
<WorkspaceAvatar <WorkspaceAvatar
size={28} size={28}
name={currentWorkspace.meta.name ?? 'AFFiNE'} name={currentMetaWorkSpace?.name ?? 'AFFiNE'}
/> />
</div> </div>
</Avatar> </Avatar>
<WorkspaceName data-testid="workspace-name"> <WorkspaceName data-testid="workspace-name">
{currentWorkspace?.meta.name ?? 'AFFiNE'} {currentMetaWorkSpace?.name ?? 'AFFiNE'}
</WorkspaceName> </WorkspaceName>
</SelectorWrapper> </SelectorWrapper>
<WorkspaceModal <WorkspaceModal

View File

@@ -13,7 +13,15 @@ export const useWorkspaceHelper = () => {
} }
return null; return null;
}; };
// const updateWorkspace = async (workspace: Workspace) => {};
const publishWorkspace = async (workspaceId: string, publish: boolean) => {
dataCenter.setWorkspacePublish(workspaceId, publish);
};
return { return {
createWorkspace, createWorkspace,
publishWorkspace,
}; };
}; };

View File

@@ -49,6 +49,9 @@ export const AppStateProvider = ({
dataCenter.workspaces[0].id dataCenter.workspaces[0].id
); );
} }
const currentMetaWorkSpace = dataCenter.workspaces.find(item => {
return item.id === currentWorkspace.room;
});
setAppState({ setAppState({
dataCenter, dataCenter,
@@ -60,6 +63,7 @@ export const AppStateProvider = ({
currentPage: null, currentPage: null,
editor: null, editor: null,
synced: true, synced: true,
currentMetaWorkSpace: currentMetaWorkSpace ?? null,
}); });
}; };
@@ -106,7 +110,6 @@ export const AppStateProvider = ({
}; };
const loadWorkspace = async (workspaceId: string) => { const loadWorkspace = async (workspaceId: string) => {
console.log('workspaceId: ', workspaceId);
const { dataCenter, workspaceList, currentWorkspaceId } = appState; const { dataCenter, workspaceList, currentWorkspaceId } = appState;
if (!workspaceList.find(v => v.id === workspaceId)) { if (!workspaceList.find(v => v.id === workspaceId)) {
return; return;
@@ -115,12 +118,14 @@ export const AppStateProvider = ({
return; return;
} }
const workspace = await dataCenter.loadWorkspace(workspaceId); const workspace = await dataCenter.loadWorkspace(workspaceId);
console.log('workspace: ', workspace); const currentMetaWorkSpace = dataCenter.workspaces.find(item => {
return item.id === workspace.room;
});
setAppState({ setAppState({
...appState, ...appState,
currentWorkspace: await dataCenter.loadWorkspace(workspaceId), currentWorkspace: workspace,
currentWorkspaceId: workspaceId, currentWorkspaceId: workspaceId,
currentMetaWorkSpace: currentMetaWorkSpace ?? null,
}); });
}; };

View File

@@ -12,6 +12,7 @@ export type AppStateValue = {
user: User | undefined; user: User | undefined;
workspaceList: Workspace[]; workspaceList: Workspace[];
currentWorkspace: StoreWorkspace; currentWorkspace: StoreWorkspace;
currentMetaWorkSpace: Workspace | null;
currentWorkspaceId: string; currentWorkspaceId: string;
pageList: PageMeta[]; pageList: PageMeta[];
currentPage: StorePage | null; currentPage: StorePage | null;