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"
}