diff --git a/apps/web/src/components/workspace-modal/WorkspaceCard.tsx b/apps/web/src/components/workspace-modal/WorkspaceCard.tsx index 26e8d0ef6f..2e292fc86a 100644 --- a/apps/web/src/components/workspace-modal/WorkspaceCard.tsx +++ b/apps/web/src/components/workspace-modal/WorkspaceCard.tsx @@ -19,22 +19,22 @@ const WorkspaceType = ({ workspaceData }: { workspaceData: WorkspaceUnit }) => { if (workspaceData.provider === 'local') { return ( -

+

- {t('Local Workspace')} + {t('Local Workspace')}

); } return isOwner ? ( -

+

- {t('Cloud Workspace')} + {t('Cloud Workspace')}

) : ( -

+

- {t('Joined Workspace')} + {t('Joined Workspace')}

); }; @@ -66,15 +66,15 @@ export const WorkspaceCard = ({ {workspaceData.provider === 'local' && ( -

+

- {t('Available Offline')} + {t('Available Offline')}

)} {workspaceData.published && ( -

+

- {t('Published to Web')} + {t('Published to Web')}

)} diff --git a/apps/web/src/components/workspace-modal/styles.ts b/apps/web/src/components/workspace-modal/styles.ts index f7857ab493..1abe775cb8 100644 --- a/apps/web/src/components/workspace-modal/styles.ts +++ b/apps/web/src/components/workspace-modal/styles.ts @@ -18,6 +18,7 @@ export const StyledSplitLine = styled.div(({ theme }) => { export const StyleWorkspaceInfo = styled.div(({ theme }) => { return { marginLeft: '15px', + width: '202px', p: { color: theme.colors.popoverColor, height: '20px', @@ -27,6 +28,11 @@ export const StyleWorkspaceInfo = styled.div(({ theme }) => { svg: { marginRight: '10px', fontSize: '16px', + flexShrink: 0, + }, + span: { + flexGrow: 1, + ...textEllipsis(1), }, }; }); diff --git a/apps/web/src/components/workspace-setting/general/General.tsx b/apps/web/src/components/workspace-setting/general/General.tsx index f8988e7331..ab1557f773 100644 --- a/apps/web/src/components/workspace-setting/general/General.tsx +++ b/apps/web/src/components/workspace-setting/general/General.tsx @@ -5,7 +5,7 @@ import { StyledEditButton, } from './style'; import { StyledSettingKey, StyledRow } from '../style'; -import { FlexWrapper } from '@affine/component'; +import { FlexWrapper, MuiAvatar } from '@affine/component'; import { useCallback, useState } from 'react'; import { Button } from '@affine/component'; @@ -24,6 +24,7 @@ import { CameraIcon } from './icons'; import { Upload } from '@/components/file-upload'; import { MuiFade } from '@affine/component'; import { useGlobalState } from '@/store/app'; +import { EmailIcon } from '@blocksuite/icons'; export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); @@ -143,6 +144,30 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { + {!isOwner && ( + + {t('Workspace Owner')} + + + + + {currentWorkspace?.owner?.name} + + + )} + {!isOwner && ( + + {t('Members')} + + {currentWorkspace?.memberCount} + + + )} + {t('Workspace Type')} {isOwner ? ( diff --git a/apps/web/src/components/workspace-setting/style.ts b/apps/web/src/components/workspace-setting/style.ts index a68941b093..275ec491f7 100644 --- a/apps/web/src/components/workspace-setting/style.ts +++ b/apps/web/src/components/workspace-setting/style.ts @@ -47,7 +47,6 @@ export const WorkspaceSettingTagItem = styled('li')<{ isActive?: boolean }>( export const StyledSettingKey = styled.div(({ theme }) => { return { width: '140px', - textAlign: 'right', fontSize: theme.font.base, fontWeight: 500, marginRight: '56px', diff --git a/apps/web/src/components/workspace-slider-bar/WorkspaceSelector/styles.ts b/apps/web/src/components/workspace-slider-bar/WorkspaceSelector/styles.ts index 00ef11c4d0..0671439091 100644 --- a/apps/web/src/components/workspace-slider-bar/WorkspaceSelector/styles.ts +++ b/apps/web/src/components/workspace-slider-bar/WorkspaceSelector/styles.ts @@ -1,12 +1,18 @@ import { MuiAvatar, textEllipsis } from '@affine/component'; import { styled } from '@affine/component'; -export const SelectorWrapper = styled('div')({ - height: '100%', - display: 'flex', - alignItems: 'center', - ':hover': { - cursor: 'pointer', - }, +export const SelectorWrapper = styled('div')(({ theme }) => { + return { + height: '42px', + display: 'flex', + alignItems: 'center', + padding: '0 12px', + borderRadius: '5px', + color: theme.colors.textColor, + ':hover': { + cursor: 'pointer', + background: theme.colors.hoverBackground, + }, + }; }); export const Avatar = styled(MuiAvatar)({ @@ -19,7 +25,6 @@ export const WorkspaceName = styled('span')(({ theme }) => { marginLeft: '12px', fontSize: theme.font.h6, fontWeight: 500, - color: theme.colors.iconColor, marginTop: '4px', flexGrow: 1, ...textEllipsis(1), diff --git a/apps/web/src/components/workspace-slider-bar/index.tsx b/apps/web/src/components/workspace-slider-bar/index.tsx index da6c530f92..2add732b8b 100644 --- a/apps/web/src/components/workspace-slider-bar/index.tsx +++ b/apps/web/src/components/workspace-slider-bar/index.tsx @@ -4,7 +4,6 @@ import { StyledArrowButton, StyledLink, StyledListItem, - StyledListItemForWorkspace, StyledNewPageButton, StyledSliderBar, StyledSliderBarWrapper, @@ -112,9 +111,8 @@ export const WorkSpaceSliderBar = () => { - - - + + { return { flexGrow: 1, diff --git a/apps/web/src/pages/workspace/[workspaceId]/setting.tsx b/apps/web/src/pages/workspace/[workspaceId]/setting.tsx index e650db1995..93374c5a26 100644 --- a/apps/web/src/pages/workspace/[workspaceId]/setting.tsx +++ b/apps/web/src/pages/workspace/[workspaceId]/setting.tsx @@ -31,10 +31,12 @@ const useTabMap = () => { const { t } = useTranslation(); const isOwner = useGlobalState(store => store.isOwner); const tabMap: { + id: string; name: string; panelRender: (workspace: WorkspaceUnit) => ReactNode; }[] = [ { + id: 'General', name: t('General'), panelRender: workspace => , }, @@ -44,40 +46,37 @@ const useTabMap = () => { // panelRender: workspace => , // }, { + id: 'Collaboration', name: t('Collaboration'), panelRender: workspace => , }, { + id: 'Publish', name: t('Publish'), panelRender: workspace => , }, // TODO: next version will finish this feature { + id: 'Export', name: t('Export'), panelRender: workspace => , }, ]; - const [activeTab, setActiveTab] = useState(tabMap[0].name); - const handleTabChange = (tab: string) => { - setActiveTab(tab); + const [activeTab, setActiveTab] = useState(tabMap[0].id); + const handleTabChange = (tabId: string) => { + setActiveTab(tabId); }; const activeTabPanelRender = tabMap.find( - tab => tab.name === activeTab + tab => tab.id === activeTab )?.panelRender; - let tableArr: { - name: string; - panelRender: (workspace: WorkspaceUnit) => ReactNode; - }[] = tabMap; - if (!isOwner) { - tableArr = [ - { - name: 'General', - panelRender: workspace => , - }, - ]; - } - return { activeTabPanelRender, tableArr, handleTabChange, activeTab }; + + return { + activeTabPanelRender, + tabMap: isOwner ? tabMap : tabMap.slice(0, 1), + handleTabChange, + activeTab, + }; }; const StyledIndicator = styled.div(({ theme }) => { @@ -101,8 +100,9 @@ const WorkspaceSetting = () => { const currentWorkspace = useGlobalState( useCallback(store => store.currentDataCenterWorkspace, []) ); - const { activeTabPanelRender, tableArr, handleTabChange, activeTab } = + const { activeTabPanelRender, tabMap, handleTabChange, activeTab } = useTabMap(); + const [indicatorState, setIndicatorState] = useState< Pick >({ @@ -133,14 +133,14 @@ const WorkspaceSetting = () => { - {tableArr.map(({ name }) => { + {tabMap.map(({ id, name }) => { return ( { - handleTabChange(name); + handleTabChange(id); }} > {name} diff --git a/apps/web/src/store/app/datacenter/index.tsx b/apps/web/src/store/app/datacenter/index.tsx index d24c075bc8..3905a75b07 100644 --- a/apps/web/src/store/app/datacenter/index.tsx +++ b/apps/web/src/store/app/datacenter/index.tsx @@ -55,9 +55,8 @@ export const createDataCenterActions: GlobalActionsCreator< // isOwner is useful only in the cloud isOwner = true; } else { - const userInfo = get().user; - // We must ensure workspace.owner exists, then ensure id same. - isOwner = workspace?.owner && userInfo?.id === workspace.owner.id; + const userInfo = get().user; // We must ensure workspace.owner exists, then ensure id same. + isOwner = isOwner = userInfo?.id === workspace?.owner?.id; } const pageList = diff --git a/apps/web/src/store/app/user/index.ts b/apps/web/src/store/app/user/index.ts index 8076a4ec88..5257f73a28 100644 --- a/apps/web/src/store/app/user/index.ts +++ b/apps/web/src/store/app/user/index.ts @@ -23,15 +23,25 @@ export const createUserActions: GlobalActionsCreator = ( ) => { return { login: async () => { - const { dataCenter } = get(); + const { dataCenter, currentDataCenterWorkspace: workspace } = get(); try { await dataCenter.login(); const user = (await dataCenter.getUserInfo()) as User; + if (!user) { // Add ErrorBoundary throw new Error('User info not found'); } - set({ user }); + + let isOwner; + if (workspace?.provider === 'local') { + // isOwner is useful only in the cloud + isOwner = true; + } else { + isOwner = user?.id === workspace?.owner?.id; + } + + set({ user, isOwner }); return user; } catch (error) { return null; // login failed diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index cb3e2d0578..f334def5d7 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -190,5 +190,7 @@ "Edit": "Edit", "Sign out description": "Signing out will cause the unsynchronised content to be lost.", "Help and Feedback": "Help and Feedback", - "Please make sure you are online": "Please make sure you are online" + "Please make sure you are online": "Please make sure you are online", + "Workspace Owner": "Workspace Owner", + "Members": "Members" }