From 9fe4b066f9a3b5af14883d3e1697b70016e36407 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 10 Jan 2023 14:29:18 +0800 Subject: [PATCH 001/104] chore: update i18n keys --- packages/app/src/components/header/Header.tsx | 4 +- packages/app/src/components/header/utils.tsx | 15 ++--- .../src/components/invite-members/index.tsx | 10 ++-- .../src/components/loading/PageLoading.tsx | 6 +- .../login-modal/LoginOptionButton.tsx | 14 +++-- .../app/src/components/login-modal/index.tsx | 7 ++- .../app/src/components/mobile-modal/index.tsx | 13 ++-- .../app/src/components/page-list/Empty.tsx | 11 +++- .../app/src/components/page-list/index.tsx | 4 +- .../app/src/components/quick-search/Input.tsx | 8 ++- .../src/components/workspace-modal/index.tsx | 17 +++--- .../workspace-setting/ExportPage.tsx | 11 +++- .../workspace-setting/MembersPage.tsx | 28 +++++---- .../workspace-setting/PublishPage.tsx | 28 ++++----- .../components/workspace-setting/SyncPage.tsx | 2 + .../workspace-setting/general/General.tsx | 16 ++--- .../general/delete/Delete.tsx | 34 +++++++---- .../workspace-setting/general/leave/Leave.tsx | 11 ++-- .../components/workspace-slider-bar/index.tsx | 2 +- packages/app/src/libs/i18n/resources/en.json | 59 ++++++++++++++++++- .../src/pages/workspace/[workspaceId]/all.tsx | 1 + .../workspace/[workspaceId]/favorite.tsx | 5 +- .../pages/workspace/[workspaceId]/trash.tsx | 6 +- 23 files changed, 210 insertions(+), 102 deletions(-) diff --git a/packages/app/src/components/header/Header.tsx b/packages/app/src/components/header/Header.tsx index 9db8149d5e..41fced5907 100644 --- a/packages/app/src/components/header/Header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -7,7 +7,7 @@ import { StyledCloseButton, } from './styles'; import CloseIcon from '@mui/icons-material/Close'; -import { getWarningMessage, shouldShowWarning } from './utils'; +import { useWarningMessage, shouldShowWarning } from './utils'; import EditorOptionMenu from './header-right-items/EditorOptionMenu'; import TrashButtonGroup from './header-right-items/TrashButtonGroup'; import ThemeModeSwitch from './header-right-items/theme-mode-switch'; @@ -22,7 +22,7 @@ const BrowserWarning = ({ }) => { return ( - {getWarningMessage()} + {useWarningMessage()} diff --git a/packages/app/src/components/header/utils.tsx b/packages/app/src/components/header/utils.tsx index dd9ff50127..30f67418bd 100644 --- a/packages/app/src/components/header/utils.tsx +++ b/packages/app/src/components/header/utils.tsx @@ -1,4 +1,5 @@ import getIsMobile from '@/utils/get-is-mobile'; +import { Trans, useTranslation } from 'react-i18next'; // Inspire by https://stackoverflow.com/a/4900484/8415727 const getChromeVersion = () => { const raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); @@ -19,20 +20,20 @@ export const shouldShowWarning = () => { ); }; -export const getWarningMessage = () => { +export const useWarningMessage = () => { + const { t } = useTranslation(); if (!getIsChrome()) { return ( - We recommend the Chrome browser for optimal experience. + + We recommend the Chrome browser for optimal + experience. + ); } if (getChromeVersion() < minimumChromeVersion) { - return ( - - Please upgrade to the latest version of Chrome for the best experience. - - ); + return {t('upgradeBrowser')}; } return ''; }; diff --git a/packages/app/src/components/invite-members/index.tsx b/packages/app/src/components/invite-members/index.tsx index 6fb020fc52..6190649a9b 100644 --- a/packages/app/src/components/invite-members/index.tsx +++ b/packages/app/src/components/invite-members/index.tsx @@ -7,6 +7,7 @@ import { useState } from 'react'; // import { getDataCenter } from '@affine/datacenter'; import { Avatar } from '@mui/material'; import { setMember } from '@/hooks/mock-data/mock'; +import { useTranslation } from 'react-i18next'; interface LoginModalProps { open: boolean; onClose: () => void; @@ -54,6 +55,7 @@ export const InviteMembers = ({ const [showTip, setShowTip] = useState(false); // eslint-disable-next-line @typescript-eslint/no-explicit-any const [userData, setUserData] = useState({}); + const { t } = useTranslation(); const inputChange = (value: string) => { setShowMember(true); if (gmailReg.test(value)) { @@ -101,7 +103,7 @@ export const InviteMembers = ({ /> - Invite members + {t('Invite Members')} { setShowMember(false); }} - placeholder="Search mail (Gmail support only)" + placeholder={t('Invite placeholder')} > {showMember ? ( {showTip ? ( - Non-Gmail is not supported + {t('Non-Gmail is not supported')} ) : ( {userData?.avatar_url ? ( @@ -154,7 +156,7 @@ export const InviteMembers = ({ // }); }} > - Invite + {t('Invite')} diff --git a/packages/app/src/components/loading/PageLoading.tsx b/packages/app/src/components/loading/PageLoading.tsx index 025eba7687..0369d19b6f 100644 --- a/packages/app/src/components/loading/PageLoading.tsx +++ b/packages/app/src/components/loading/PageLoading.tsx @@ -1,5 +1,6 @@ import { styled } from '@/styles'; import Loading from './Loading'; +import { useTranslation } from 'react-i18next'; // Used for the full page loading const StyledLoadingContainer = styled('div')(() => { @@ -17,12 +18,13 @@ const StyledLoadingContainer = styled('div')(() => { }; }); -export const PageLoading = ({ text = 'Loading...' }: { text?: string }) => { +export const PageLoading = ({ text }: { text?: string }) => { + const { t } = useTranslation(); return (
-

{text}

+

{text ? text : t('Loading')}

); diff --git a/packages/app/src/components/login-modal/LoginOptionButton.tsx b/packages/app/src/components/login-modal/LoginOptionButton.tsx index c1384bc8eb..3da3010127 100644 --- a/packages/app/src/components/login-modal/LoginOptionButton.tsx +++ b/packages/app/src/components/login-modal/LoginOptionButton.tsx @@ -3,9 +3,10 @@ import { styled } from '@/styles'; import { Button } from '@/ui/button'; // import { useModal } from '@/providers/GlobalModalProvider'; import { GoogleIcon, StayLogOutIcon } from './Icons'; - +import { useTranslation } from 'react-i18next'; export const GoogleLoginButton = () => { // const { triggerLoginModal } = useModal(); + const { t } = useTranslation(); return ( { @@ -24,8 +25,10 @@ export const GoogleLoginButton = () => { - Continue with Google - Set up an AFFiNE account to sync data + {t('Continue with Google')} + + {t('Set up an AFFiNE account to sync data')} + @@ -33,6 +36,7 @@ export const GoogleLoginButton = () => { }; export const StayLogOutButton = () => { + const { t } = useTranslation(); return ( @@ -40,8 +44,8 @@ export const StayLogOutButton = () => { - Stay logged out - All changes are saved locally + {t('Stay logged out')} + {t('All changes are saved locally')} diff --git a/packages/app/src/components/login-modal/index.tsx b/packages/app/src/components/login-modal/index.tsx index f398383196..1af4aab2ae 100644 --- a/packages/app/src/components/login-modal/index.tsx +++ b/packages/app/src/components/login-modal/index.tsx @@ -3,13 +3,14 @@ import { styled } from '@/styles'; import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; import { TextButton } from '@/ui/button'; import { GoogleLoginButton, StayLogOutButton } from './LoginOptionButton'; - +import { useTranslation } from 'react-i18next'; interface LoginModalProps { open: boolean; onClose: () => void; } export const LoginModal = ({ open, onClose }: LoginModalProps) => { + const { t } = useTranslation(); return ( @@ -23,12 +24,12 @@ export const LoginModal = ({ open, onClose }: LoginModalProps) => { /> - Currently not logged in + {t('NotLoggedIn')}
- }>Clear local data + }>{t('ClearData')}
diff --git a/packages/app/src/components/mobile-modal/index.tsx b/packages/app/src/components/mobile-modal/index.tsx index ff9796359b..9142a5f170 100644 --- a/packages/app/src/components/mobile-modal/index.tsx +++ b/packages/app/src/components/mobile-modal/index.tsx @@ -3,8 +3,10 @@ import Modal, { ModalCloseButton, ModalWrapper } from '@/ui/modal'; import getIsMobile from '@/utils/get-is-mobile'; import { StyledButton, StyledContent, StyledTitle } from './styles'; import bg from './bg.png'; +import { useTranslation } from 'react-i18next'; export const MobileModal = () => { const [showModal, setShowModal] = useState(getIsMobile()); + const { t } = useTranslation(); return ( { }} /> - Ooops! + {t('Ooops!')} -

Looks like you are browsing on a mobile device.

-

- We are still working on mobile support and recommend you use a - desktop device. -

+

{t('mobile device')}

+

{t('mobile device description')}

{ setShowModal(false); }} > - Got it + {t('Got it')}
diff --git a/packages/app/src/components/page-list/Empty.tsx b/packages/app/src/components/page-list/Empty.tsx index ef13e1b117..f7a4e838b4 100644 --- a/packages/app/src/components/page-list/Empty.tsx +++ b/packages/app/src/components/page-list/Empty.tsx @@ -1,6 +1,9 @@ import React from 'react'; import { Empty } from '@/ui/empty'; -export const PageListEmpty = () => { +import { useTranslation } from 'react-i18next'; +export const PageListEmpty = (props: { listType: string }) => { + const { listType } = props; + const { t } = useTranslation(); return (
{ height={300} sx={{ marginTop: '100px', marginBottom: '30px' }} /> -

Tips: Click Add to Favourites/Trash and the page will appear here.

-

(Designer is grappling with designing)

+ {listType === 'all' &&

{t('emptyAllPages')}

} + {listType === 'favorite' &&

{t('emptyFavourite')}

} + {listType === 'trash' &&

{t('emptyTrash')}

} +

{t('still designed')}

); }; diff --git a/packages/app/src/components/page-list/index.tsx b/packages/app/src/components/page-list/index.tsx index 429ee6bbb9..1423406d58 100644 --- a/packages/app/src/components/page-list/index.tsx +++ b/packages/app/src/components/page-list/index.tsx @@ -67,16 +67,18 @@ export const PageList = ({ pageList, showFavoriteTag = false, isTrash = false, + listType, }: { pageList: PageMeta[]; showFavoriteTag?: boolean; isTrash?: boolean; + listType?: 'all' | 'trash' | 'favorite'; }) => { const router = useRouter(); const { currentWorkspaceId } = useAppState(); const { t } = useTranslation(); if (pageList.length === 0) { - return ; + return ; } return ( diff --git a/packages/app/src/components/quick-search/Input.tsx b/packages/app/src/components/quick-search/Input.tsx index 69d47a16a1..960f764c2c 100644 --- a/packages/app/src/components/quick-search/Input.tsx +++ b/packages/app/src/components/quick-search/Input.tsx @@ -9,6 +9,7 @@ import { SearchIcon } from '@blocksuite/icons'; import { StyledInputContent, StyledLabel } from './style'; import { Command } from 'cmdk'; import { useAppState } from '@/providers/app-state-provider'; +import { useTranslation } from 'react-i18next'; export const Input = (props: { query: string; setQuery: Dispatch>; @@ -17,6 +18,7 @@ export const Input = (props: { const [isComposition, setIsComposition] = useState(false); const [inputValue, setInputValue] = useState(''); const inputRef = useRef(null); + const { t } = useTranslation(); const { currentWorkspaceId, workspaceList, currentWorkspace } = useAppState(); const isPublish = workspaceList.find( meta => String(meta.id) === String(currentWorkspaceId) @@ -80,8 +82,10 @@ export const Input = (props: { }} placeholder={ isPublish - ? `Search in ${currentWorkspace?.meta.name}` - : 'Quick Search...' + ? t('Quick search placeholder2', { + workspace = currentWorkspace?.meta.name, + }) + : t('Quick search placeholder') } /> diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 641d8fbd30..40142a256d 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -16,7 +16,7 @@ import { WorkspaceAvatar } from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; import { useUserHelper } from '@/hooks/use-user-helper'; - +import { useTranslation } from 'react-i18next'; interface WorkspaceModalProps { open: boolean; onClose: () => void; @@ -28,6 +28,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { const { workspaceList, currentWorkspace } = useAppState(); const { login, user } = useUserHelper(); const router = useRouter(); + const { t } = useTranslation(); return (
@@ -36,7 +37,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { style={{ padding: '10px', display: 'flex', flexDirection: 'column' }} >
- My Workspaces + {t('My Workspaces')} {/* */} { marginRight: '10px', }} /> - Create Or Import + {t('Create Or Import')}

- Tips:Workspace is your virtual space to capture, create and plan - as just one person or together as a team. + {t('Tips')} + {t('Workspace description')}

@@ -135,10 +136,10 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { ) : ( )}
diff --git a/packages/app/src/components/workspace-setting/ExportPage.tsx b/packages/app/src/components/workspace-setting/ExportPage.tsx index 85d2b52799..fc95c119f2 100644 --- a/packages/app/src/components/workspace-setting/ExportPage.tsx +++ b/packages/app/src/components/workspace-setting/ExportPage.tsx @@ -1,6 +1,6 @@ import { styled } from '@/styles'; import { Workspace } from '@affine/datacenter'; - +import { Trans } from 'react-i18next'; export const ExportPageTitleContainer = styled('div')(() => { return { display: 'flex', @@ -12,8 +12,13 @@ export const ExportPageTitleContainer = styled('div')(() => { export const ExportPage = ({ workspace }: { workspace: Workspace }) => { return ( - Export Workspace{' '} - {workspace.name} Is Comming + + Export Workspace + + {{ workspace: workspace.name }} + + Is Comming + ); }; diff --git a/packages/app/src/components/workspace-setting/MembersPage.tsx b/packages/app/src/components/workspace-setting/MembersPage.tsx index ea0b68536b..fb303b69b5 100644 --- a/packages/app/src/components/workspace-setting/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/MembersPage.tsx @@ -27,6 +27,7 @@ import { Workspace } from '@affine/datacenter'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { StyledMemberWarp } from './general/style'; import { useConfirm } from '@/providers/ConfirmProvider'; +import { useTranslation } from 'react-i18next'; // import { useAppState } from '@/providers/app-state-provider'; export const MembersPage = ({ workspace }: { workspace: Workspace }) => { @@ -36,6 +37,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { ]); const { user, login, updateWorkspaceMeta } = useTemporaryHelper(); const { confirm } = useConfirm(); + const { t } = useTranslation(); // const refreshMembers = useCallback(() => { // getDataCenter() // .then(dc => @@ -66,9 +68,11 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { <> - Users({members.length}) + {t('Users')} ({members.length}) - Access level + + {t('Access level')} + {members.length ? ( @@ -92,7 +96,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { ? 'Member' : 'Workspace Owner' : 'Pending'} */} - Pending + {t('Pending')} { }} icon={} > - Delete + {t('Delete')} } @@ -154,7 +158,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { type="primary" shape="circle" > - Invite Members + {t('Invite Members')} { @@ -172,19 +176,17 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { ) : ( -
- Collaborating with other members requires AFFiNE Cloud service. -
+
{t('Collaboration Description')}
diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index e3c36b9343..26961a221e 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -13,12 +13,13 @@ import { useConfirm } from '@/providers/ConfirmProvider'; // import { useAppState } from '@/providers/app-state-provider3'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { Workspace } from '@affine/datacenter'; +import { useTranslation } from 'react-i18next'; export const PublishPage = ({ workspace }: { workspace: Workspace }) => { const shareUrl = window.location.host + '/workspace/' + workspace.id + '?share=true'; const { publishWorkspace } = useWorkspaceHelper(); - + const { t } = useTranslation(); const { confirm } = useConfirm(); const togglePublic = (flag: boolean) => { @@ -32,11 +33,11 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { const enableAffineCloud = () => { confirm({ - title: 'Enable AFFiNE Cloud?', - content: `If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.`, + title: `${t('Enable AFFiNE Cloud')}?`, + content: t('Enable AFFiNE Cloud Description'), confirmText: - workspace.provider === 'local' ? 'Enable' : 'Sign in and Enable', - cancelText: 'Skip', + workspace.provider === 'local' ? t('Enable') : t('Sign in and Enable'), + cancelText: t('Skip'), }).then(confirm => { if (confirm) { // if (user) { @@ -56,22 +57,21 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { {workspace?.isPublish ? ( <> - Publishing to web requires AFFiNE Cloud service . + {t('Publishing')} - Share with link + {t('Share with link')} ) : ( - After publishing to the web, everyone can view the content of - this workspace through the link. + {'Publishing Description'} )} @@ -83,7 +83,7 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { type="primary" shape="circle" > - Stop publishing + {t('Stop publishing')} ) : ( )}
@@ -101,7 +101,7 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { <> - Publishing to web requires AFFiNE Cloud service. + {t('Publishing')} @@ -112,7 +112,7 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { type="primary" shape="circle" > - Enable AFFiNE Cloud + {t('Enable AFFiNE Cloud')} diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index 1c3cdaea8f..00bbeb9785 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -8,9 +8,11 @@ import { Button } from '@/ui/button'; import { Menu, MenuItem } from '@/ui/menu'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { Workspace } from '@affine/datacenter'; +import { Trans, useTranslation } from 'react-i18next'; export const SyncPage = ({ workspace }: { workspace: Workspace }) => { console.log('workspace: ', workspace); const { currentWorkspace, updateWorkspaceMeta } = useTemporaryHelper(); + const { t } = useTranslation(); return (
diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index 87278ce734..6dee18e82e 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -17,6 +17,7 @@ import { Upload } from '@/components/file-upload'; import { WorkspaceAvatar } from '@/components/workspace-avatar'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { Workspace } from '@affine/datacenter'; +import { useTranslation } from 'react-i18next'; export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { // const { refreshWorkspacesMeta } = useAppState(); const { updateWorkspaceMeta } = useTemporaryHelper(); @@ -24,6 +25,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { const [showLeave, setShowLeave] = useState(false); const [uploading, setUploading] = useState(false); const [workspaceName, setWorkspaceName] = useState(''); + const { t } = useTranslation(); // const debouncedRefreshWorkspacesMeta = debounce(() => { // refreshWorkspacesMeta(); // }, 100); @@ -68,7 +70,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { return workspace ? (
- Workspace Icon + {t('Workspace Icon')}
{ accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" fileChange={fileChange} > - + {/* TODO: add upload logic */} - Workspace Name + {t('Workspace Name')} { '' )} */} - Workspace Type + {t('Workspace Type')} {workspace.provider} @@ -130,7 +132,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { {isOwner ? ( <> { ) : ( <> void; @@ -31,6 +31,7 @@ export const WorkspaceDelete = ({ workspace, }: WorkspaceDeleteProps) => { const [deleteStr, setDeleteStr] = useState(''); + const { t } = useTranslation(); const router = useRouter(); const handlerInputChange = (workspaceName: string) => { @@ -55,31 +56,40 @@ export const WorkspaceDelete = ({ - Delete Workspace + {t('Delete Workspace')} {workspace.provider === 'local' ? ( - Deleting ( - {workspace.name}) cannot - be undone, please proceed with caution. along with all its content. + + Deleting ( + + {{ workspace: workspace.name }} + + ) cannot be undone, please proceed with caution. along with all + its content. + ) : ( - Deleting ( - {workspace.name}) will - delete both local and cloud data, this operation cannot be undone, - please proceed with caution. + + Deleting ( + + {{ workspace: workspace.name }} + + ) will delete both local and cloud data, this operation cannot be + undone, please proceed with caution. + )} diff --git a/packages/app/src/components/workspace-setting/general/leave/Leave.tsx b/packages/app/src/components/workspace-setting/general/leave/Leave.tsx index e34b4ac257..730c1cedbf 100644 --- a/packages/app/src/components/workspace-setting/general/leave/Leave.tsx +++ b/packages/app/src/components/workspace-setting/general/leave/Leave.tsx @@ -7,6 +7,7 @@ import { } from './style'; import { ModalCloseButton } from '@/ui/modal'; import { Button } from '@/ui/button'; +import { useTranslation } from 'react-i18next'; // import { getDataCenter } from '@affine/datacenter'; // import { useAppState } from '@/providers/app-state-provider'; @@ -22,6 +23,7 @@ export const WorkspaceLeave = ({ onClose, workspaceId, }: WorkspaceDeleteProps) => { + const { t } = useTranslation(); console.log('workspaceId: ', workspaceId); // const router = useRouter(); // const { refreshWorkspacesMeta } = useAppState(); @@ -37,14 +39,13 @@ export const WorkspaceLeave = ({ - Leave Workspace + {t('Leave Workspace')} - After you leave, you will not be able to access all the contents of - this workspace. + {t('Leave Workspace Description')} diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index c40dc31c11..18862017d5 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -157,7 +157,7 @@ export const WorkSpaceSliderBar = () => { setShowWorkspaceSetting(true); }} > - Setting + {t('Settings')} Chrome browser for optimal experience.", + "upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience.", + "Invite Members": "Invite Members", + "Invite placeholder": "Search mail (Gmail support only)", + "Non-Gmail": "Non-Gmail is not supported", + "Invite": "Invite", + "Loading": "Loading...", + "NotLoggedIn": "Currently not logged in", + "ClearData": "Clear local data", + "Continue with Google": "Continue with Google", + "Set up an AFFiNE account to sync data": "Set up an AFFiNE account to sync data", + "Stay logged out": "Stay logged out", + "All changes are saved locally": "All changes are saved locally", + "Ooops!": "Ooops!", + "mobile device": "Looks like you are browsing on a mobile device.", + "mobile device description": "We are still working on mobile support and recommend you use a desktop device.", + "Got it": "Got it", + "emptyAllPages": "This workspace is empty. Create a new page to begin editing.", + "emptyFavourite": "Click Add to Favourites and the page will appear here.", + "emptyTrash": "Click Add to Trash and the page will appear here.", + "still designed": "(This page is still being designed.)", + "My Workspaces": "My Workspaces", + "Create Or Import": "Create Or Import", + "Tips": "Tips: ", + "login success": "Login success", + "Sign in": "Sign in AFFiNE Cloud", + "Sign out": "Sign out of AFFiNE Cloud", + "Delete Workspace": "Delete Workspace", + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. along with all its content.", + "Delete Workspace Description2": "Deleting (<1>{{workspace}}) will delete both local and cloud data, this operation cannot be undone, please proceed with caution.", + "Delete Workspace placeholder": "Please type “Delete” to confirm", + "Leave Workspace": "Leave Workspace", + "Leave Workspace Description": "After you leave, you will not be able to access all the contents of this workspace.", + "Leave": "Leave", + "Workspace Icon": "Workspace Icon", + "Workspace Name": "Workspace Name", + "Workspace Type": "Workspace Type", + "Export Workspace": "Export Workspace <1>{{workspace}} Is Coming", + "Users": "Users", + "Access level": "Access level", + "Pending": "Pending", + "Collaboration Description": "Collaborating with other members requires AFFiNE Cloud service.", + "Enable AFFiNE Cloud": "Enable AFFiNE Cloud", + "Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronised via AFFiNE Cloud.", + "Enable": "Enable", + "Sign in and Enable": "Sign in and Enable", + "Skip": "Skip", + "Publishing": "Publishing to web requires AFFiNE Cloud service.", + "Share with link": "Share with link", + "Copy Link": "Copy Link", + "Publishing Description": "After publishing to the web, everyone can view the content of this workspace through the link.", + "Stop publishing": "Stop publishing", + "Publish to web": "Publish to web", + "Sync Description": "{{workspaceName}} is Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud." } diff --git a/packages/app/src/pages/workspace/[workspaceId]/all.tsx b/packages/app/src/pages/workspace/[workspaceId]/all.tsx index 18f6e2a64b..6464a903bb 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/all.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/all.tsx @@ -14,6 +14,7 @@ const All = () => { !p.trash)} showFavoriteTag={true} + listType="all" /> ); diff --git a/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx b/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx index d787f34e1b..689bd3ead4 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx @@ -13,7 +13,10 @@ export const Favorite = () => { }> {t('Favourites')} - p.favorite && !p.trash)} /> + p.favorite && !p.trash)} + listType="favorite" + /> ); }; diff --git a/packages/app/src/pages/workspace/[workspaceId]/trash.tsx b/packages/app/src/pages/workspace/[workspaceId]/trash.tsx index 2343b39138..e2baa990af 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/trash.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/trash.tsx @@ -11,7 +11,11 @@ export const Trash = () => { return ( <> }>{t('Trash')} - p.trash)} isTrash={true} /> + p.trash)} + isTrash={true} + listType="trash" + /> ); }; From 57749561757cd6df1ff2e87b25f275390a02da23 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 10 Jan 2023 14:53:27 +0800 Subject: [PATCH 002/104] chore: update i18n keys --- .../components/workspace-setting/SyncPage.tsx | 23 +++++++++++-------- .../workspace-setting/WorkspaceSetting.tsx | 16 +++++++------ packages/app/src/libs/i18n/resources/en.json | 9 +++++++- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index 00bbeb9785..0cb0069d2d 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -20,9 +20,7 @@ export const SyncPage = ({ workspace }: { workspace: Workspace }) => { {currentWorkspace?.type === 'local' ? ( <> - {currentWorkspace.name} is Local Workspace. All data is stored on - the current device. You can enable AFFiNE Cloud for this workspace - to keep data in sync with the cloud. + {t('Sync Description', { workspaceName: currentWorkspace.name })} @@ -35,15 +33,20 @@ export const SyncPage = ({ workspace }: { workspace: Workspace }) => { type="primary" shape="circle" > - Enable AFFiNE Cloud + {t('Enable AFFiNE Cloud')} ) : ( <> - {currentWorkspace && currentWorkspace.name} is Cloud - Workspace. All data will be synchronized and saved to the AFFiNE + + + {{ workspaceName: currentWorkspace && currentWorkspace.name }} + + is Cloud Workspace. All data will be synchronized and saved to + the AFFiNE + { }} icon={} > - Download core data to device + {t('Download data to device', { CoreOrAll: 'core' })} { @@ -63,14 +66,16 @@ export const SyncPage = ({ workspace }: { workspace: Workspace }) => { }} icon={} > - Download all data to device + {t('Download data to device', { CoreOrAll: 'all' })} } placement="bottom-end" disablePortal={true} > - + diff --git a/packages/app/src/components/workspace-setting/WorkspaceSetting.tsx b/packages/app/src/components/workspace-setting/WorkspaceSetting.tsx index c0213c2cca..64ffd5b8f9 100644 --- a/packages/app/src/components/workspace-setting/WorkspaceSetting.tsx +++ b/packages/app/src/components/workspace-setting/WorkspaceSetting.tsx @@ -21,6 +21,7 @@ import { PublishPage } from './PublishPage'; import { ExportPage } from './ExportPage'; import { SyncPage } from './SyncPage'; import { useAppState } from '@/providers/app-state-provider'; +import { useTranslation } from 'react-i18next'; enum ActiveTab { 'general' = 'general', @@ -41,6 +42,7 @@ type WorkspaceSettingProps = { }; const WorkspaceSettingTab = ({ activeTab, onTabChange }: SettingTabProps) => { + const { t } = useTranslation(); return ( { - General + {t('General')} { - Sync + {t('Sync')} { - Collaboration + {t('Collaboration')} { - Publish + {t('Publish')} { - Export + {t('Export')} ); @@ -114,7 +116,7 @@ export const WorkspaceSetting = ({ const handleTabChange = (tab: ActiveTab) => { setActiveTab(tab); }; - + const { t } = useTranslation(); const { currentMetaWorkSpace } = useAppState(); const handleClickClose = () => { onClose && onClose(); @@ -133,7 +135,7 @@ export const WorkspaceSetting = ({ {isOwner ? ( - Workspace Settings + {t('Workspace Settings')} {{workspaceName}} is Cloud Workspace. All data will be synchronized and saved to the AFFiNE", + "Download data to device": "Download {{CoreOrAll}} data to device", + "General": "General", + "Sync": "Sync", + "Collaboration": "Collaboration", + "Publish": "Publish", + "Workspace Settings": "Workspace Settings" } From 807762cf1a6d9ca5d34e1bffd2f3c0aef9aaa1a4 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 14:39:19 +0800 Subject: [PATCH 003/104] feat: add sync scripts --- packages/i18n/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/i18n/package.json b/packages/i18n/package.json index cc559528e3..2f9cf000e3 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -10,7 +10,10 @@ ".": "./dist/src/index.js" }, "scripts": { - "build": "tsc --project ./tsconfig.json" + "build": "tsc --project ./tsconfig.json", + "sync-languages": "NODE_OPTIONS=--experimental-fetch ts-node src/scripts/sync.ts", + "sync-languages:check": "pnpm run sync-languages --check", + "download-resources": "NODE_OPTIONS=--experimental-fetch ts-node src/scripts/download.ts" }, "keywords": [], "repository": { From 635216194f3a466b46d7a5bc9a2f093d73e9d14d Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 14:39:39 +0800 Subject: [PATCH 004/104] feat: add readme for i18n --- packages/i18n/README.md | 62 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/i18n/README.md diff --git a/packages/i18n/README.md b/packages/i18n/README.md new file mode 100644 index 0000000000..7cd4fba1bf --- /dev/null +++ b/packages/i18n/README.md @@ -0,0 +1,62 @@ +# i18n + +## Usages + +- Update missing translations into the base resources, a.k.a the `src/resources/en.json` +- Replace literal text with translation keys + +```tsx +import { useTranslation } from '@affine/i18n'; + +// src/resources/en.json +// { +// 'Text': 'some text', +// 'Switch to language': 'Switch to {{language}}', // <- you can interpolation by curly brackets +// }; + +const App = () => { + const { t } = useTranslation(); + + const changeLanguage = (language: string) => { + i18n.changeLanguage(language); + }; + + return ( +
+
{t('Text')}
+ + + +
+ ); +}; +``` + +## How the i18n workflow works? + +- When the `src/resources/en.json`(base language) updated and merged to the develop branch, will trigger the `languages-sync` action. +- The `languages-sync` action will check the base language and add missing translations to the Tolgee platform. +- This way, partners from the community can update the translations. +- Finally, the `languages-download` action will regularly download the latest translation resources from the Tolgee platform. + +## How to sync translations manually + +- Set token as environment variable + +```shell +export TOLGEE_API_KEY=tgpak_XXXXXXX +``` + +- Run the `sync-languages:check` to check all languages +- Run the `sync-languages` script to add new keys to the tolgee platform + +## References + +- [AFFiNE | Tolgee](https://i18n.affine.pro/) +- [Tolgee Documentation](https://tolgee.io/docs/) +- [i18next](https://www.i18next.com/) +- [react-i18next](https://react.i18next.com/) From dae7f99fe8c4c51452e4fb4c06684c449b4060c7 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 14:39:57 +0800 Subject: [PATCH 005/104] chore: rename dir --- packages/i18n/src/{script => scripts}/api.ts | 0 packages/i18n/src/{script => scripts}/download.ts | 0 packages/i18n/src/{script => scripts}/request.ts | 0 packages/i18n/src/{script => scripts}/sync.ts | 0 packages/i18n/src/{script => scripts}/utils.ts | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename packages/i18n/src/{script => scripts}/api.ts (100%) rename packages/i18n/src/{script => scripts}/download.ts (100%) rename packages/i18n/src/{script => scripts}/request.ts (100%) rename packages/i18n/src/{script => scripts}/sync.ts (100%) rename packages/i18n/src/{script => scripts}/utils.ts (100%) diff --git a/packages/i18n/src/script/api.ts b/packages/i18n/src/scripts/api.ts similarity index 100% rename from packages/i18n/src/script/api.ts rename to packages/i18n/src/scripts/api.ts diff --git a/packages/i18n/src/script/download.ts b/packages/i18n/src/scripts/download.ts similarity index 100% rename from packages/i18n/src/script/download.ts rename to packages/i18n/src/scripts/download.ts diff --git a/packages/i18n/src/script/request.ts b/packages/i18n/src/scripts/request.ts similarity index 100% rename from packages/i18n/src/script/request.ts rename to packages/i18n/src/scripts/request.ts diff --git a/packages/i18n/src/script/sync.ts b/packages/i18n/src/scripts/sync.ts similarity index 100% rename from packages/i18n/src/script/sync.ts rename to packages/i18n/src/scripts/sync.ts diff --git a/packages/i18n/src/script/utils.ts b/packages/i18n/src/scripts/utils.ts similarity index 100% rename from packages/i18n/src/script/utils.ts rename to packages/i18n/src/scripts/utils.ts From c3d68a44ce57d41b6076f595f46086972c100126 Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Wed, 11 Jan 2023 15:12:18 +0800 Subject: [PATCH 006/104] feat: add interaction to search button --- .../components/header/QuickSearchButton.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/header/QuickSearchButton.tsx b/packages/app/src/components/header/QuickSearchButton.tsx index 0b28e43b09..ffe1fe7e14 100644 --- a/packages/app/src/components/header/QuickSearchButton.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -4,6 +4,20 @@ import { Tooltip } from '@/ui/tooltip'; import { ArrowDownIcon } from '@blocksuite/icons'; import { useModal } from '@/providers/GlobalModalProvider'; import { useTranslation } from '@affine/i18n'; +import { styled } from '@/styles'; + +const StyledIconButtonWithAnimate = styled(IconButton)(() => { + return { + svg: { + transition: 'transform 0.15s ease-in-out', + }, + ':hover': { + svg: { + transform: 'translateY(3px)', + }, + }, + }; +}); export const QuickSearchButton = ({ onClick, ...props @@ -12,7 +26,7 @@ export const QuickSearchButton = ({ const { t } = useTranslation(); return ( - { @@ -21,7 +35,7 @@ export const QuickSearchButton = ({ }} > - + ); }; From 98692ba790b2bdd7dccad18674f870928c9664ee Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 15:27:45 +0800 Subject: [PATCH 007/104] feat: add ts-node --- packages/i18n/package.json | 5 +- pnpm-lock.yaml | 94 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 2f9cf000e3..eb6c30a1a1 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -11,9 +11,9 @@ }, "scripts": { "build": "tsc --project ./tsconfig.json", - "sync-languages": "NODE_OPTIONS=--experimental-fetch ts-node src/scripts/sync.ts", + "sync-languages": "NODE_OPTIONS=--experimental-fetch ts-node-esm src/scripts/sync.ts", "sync-languages:check": "pnpm run sync-languages --check", - "download-resources": "NODE_OPTIONS=--experimental-fetch ts-node src/scripts/download.ts" + "download-resources": "NODE_OPTIONS=--experimental-fetch ts-node-esm src/scripts/download.ts" }, "keywords": [], "repository": { @@ -27,6 +27,7 @@ }, "devDependencies": { "@types/prettier": "^2.7.2", + "ts-node": "^10.9.1", "typescript": "^4.8.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 722b006877..a6a2417511 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,7 @@ importers: i18next: ^21.9.1 prettier: ^2.7.1 react-i18next: ^11.18.4 + ts-node: ^10.9.1 typescript: ^4.8.4 dependencies: i18next: 21.10.0 @@ -171,6 +172,7 @@ importers: react-i18next: 11.18.6_i18next@21.10.0 devDependencies: '@types/prettier': 2.7.2 + ts-node: 10.9.1_typescript@4.9.3 typescript: 4.9.3 packages/logger: @@ -1711,6 +1713,13 @@ packages: prettier: 2.7.1 dev: true + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + /@emotion/babel-plugin/11.10.2: resolution: {integrity: sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==} peerDependencies: @@ -2481,6 +2490,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /@lit/reactive-element/1.4.1: resolution: {integrity: sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==} dev: false @@ -3280,6 +3296,22 @@ packages: resolution: {integrity: sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==} dev: false + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: @@ -3616,9 +3648,15 @@ packages: acorn: 8.8.0 dev: true + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} + hasBin: true dev: true /aggregate-error/3.1.0: @@ -3693,6 +3731,10 @@ packages: engines: {node: '>=12'} dev: true + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -4189,6 +4231,10 @@ packages: yaml: 1.10.2 dev: false + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + /cross-spawn/5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -4368,6 +4414,11 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6294,6 +6345,10 @@ packages: semver: 6.3.0 dev: true + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + /map-obj/1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -7906,6 +7961,36 @@ packages: engines: {node: '>=8'} dev: true + /ts-node/10.9.1_typescript@4.9.3: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + acorn: 8.8.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -8151,6 +8236,10 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true @@ -8601,6 +8690,11 @@ packages: lib0: 0.2.52 dev: false + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} From bad5dda67e416492fcf1531060f97585a49271c3 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 15:28:34 +0800 Subject: [PATCH 008/104] fix: module not find --- packages/i18n/src/scripts/api.ts | 2 +- packages/i18n/src/scripts/download.ts | 8 ++++---- packages/i18n/src/scripts/sync.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/i18n/src/scripts/api.ts b/packages/i18n/src/scripts/api.ts index ae286fe584..657e3c245c 100644 --- a/packages/i18n/src/scripts/api.ts +++ b/packages/i18n/src/scripts/api.ts @@ -1,5 +1,5 @@ // cSpell:ignore Tolgee -import { fetchTolgee } from './request'; +import { fetchTolgee } from './request.js'; /** * Returns all project languages diff --git a/packages/i18n/src/scripts/download.ts b/packages/i18n/src/scripts/download.ts index a43e84bf22..7aa0740c6e 100644 --- a/packages/i18n/src/scripts/download.ts +++ b/packages/i18n/src/scripts/download.ts @@ -2,8 +2,8 @@ import fs from 'node:fs/promises'; import path from 'node:path'; import { format } from 'prettier'; -import { getAllProjectLanguages, getRemoteTranslations } from './api'; -import type { TranslationRes } from './utils'; +import { getAllProjectLanguages, getRemoteTranslations } from './api.js'; +import type { TranslationRes } from './utils.js'; const RES_DIR = path.resolve(process.cwd(), 'src', 'resources'); @@ -66,7 +66,7 @@ const main = async () => { ); const availableLanguages = languagesWithTranslations.filter( - language => language.completeRate > 0 + language => language.completeRate === 1 ); availableLanguages @@ -90,7 +90,7 @@ const main = async () => { console.log('Generating meta data...'); const code = `// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. // Run \`pnpm run download-resources\` to regenerate. - // To overwrite this, please overwrite ${path.basename(__filename)} + // To overwrite this, please overwrite download.ts script. ${availableLanguages .map( language => diff --git a/packages/i18n/src/scripts/sync.ts b/packages/i18n/src/scripts/sync.ts index 80b16a5024..b89734e4c4 100644 --- a/packages/i18n/src/scripts/sync.ts +++ b/packages/i18n/src/scripts/sync.ts @@ -1,8 +1,8 @@ // cSpell:ignore Tolgee import { readFile } from 'fs/promises'; import path from 'path'; -import { createsNewKey, getRemoteTranslations } from './api'; -import type { TranslationRes } from './utils'; +import { createsNewKey, getRemoteTranslations } from './api.js'; +import type { TranslationRes } from './utils.js'; const BASE_JSON_PATH = path.resolve( process.cwd(), From 41174c74d762c1d9ed4c1fed3ce89b57a6193659 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 15:29:32 +0800 Subject: [PATCH 009/104] chore: sync resources --- packages/i18n/src/resources/bn.json | 1 - packages/i18n/src/resources/en.json | 30 ++++++------ packages/i18n/src/resources/fr.json | 1 - packages/i18n/src/resources/index.ts | 59 +----------------------- packages/i18n/src/resources/sr.json | 1 - packages/i18n/src/resources/zh-Hans.json | 1 - packages/i18n/src/resources/zh-Hant.json | 1 - 7 files changed, 18 insertions(+), 76 deletions(-) delete mode 100644 packages/i18n/src/resources/bn.json delete mode 100644 packages/i18n/src/resources/fr.json delete mode 100644 packages/i18n/src/resources/sr.json delete mode 100644 packages/i18n/src/resources/zh-Hans.json delete mode 100644 packages/i18n/src/resources/zh-Hant.json diff --git a/packages/i18n/src/resources/bn.json b/packages/i18n/src/resources/bn.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/bn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index 761f649c18..a331fb89dd 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -1,11 +1,8 @@ { "Quick search": "Quick search", - "Quick search placeholder": "Quick Search...", - "Quick search placeholder2": "Search in {{workspace}}", "All pages": "All pages", "Favourites": "Favourites", "No item": "No item", - "Settings": "Settings", "Import": "Import", "Trash": "Trash", "New Page": "New Page", @@ -14,8 +11,6 @@ "Find results": "Find {{number}} results", "Collapse sidebar": "Collapse sidebar", "Expand sidebar": "Expand sidebar", - "Removed from Favourites": "Removed from Favourites", - "Remove from favourites": "Remove from favourites", "Added to Favourites": "Added to Favourites", "Add to favourites": "Add to favourites", "Paper": "Paper", @@ -37,7 +32,6 @@ "Delete page?": "Delete page?", "Delete permanently?": "Delete permanently?", "will be moved to Trash": "{{title}} will be moved to Trash", - "Once deleted, you can't undo this action.": "Once deleted, you can't undo this action.", "Moved to Trash": "Moved to Trash", "Permanently deleted": "Permanently deleted", "restored": "{{title}} restored", @@ -57,7 +51,6 @@ "Strikethrough": "Strikethrough", "Inline code": "Inline code", "Code block": "Code block", - "Link": "Hyperlink (with selected text)", "Body text": "Body text", "Heading": "Heading {{number}}", "Increase indent": "Increase indent", @@ -65,6 +58,11 @@ "Markdown Syntax": "Markdown Syntax", "Divider": "Divider", "404 - Page Not Found": "404 - Page Not Found", + "Once deleted, you can't undo this action": { + "": "Once deleted, you can't undo this action." + }, + "Remove from favourites": "Remove from favourites", + "Removed from Favourites": "Removed from Favourites", "New Workspace": "New Workspace", "Workspace description": "Workspace is your virtual space to capture, create and plan as just one person or together as a team.", "Create": "Create", @@ -79,6 +77,10 @@ "TrashButtonGroupTitle": "Permanently delete", "TrashButtonGroupDescription": "Once deleted, you can't undo this action. Do you confirm?", "Delete permanently": "Delete permanently", + "Link": "Hyperlink (with selected text)", + "Quick search placeholder": "Quick Search...", + "Quick search placeholder2": "Search in {{workspace}}", + "Settings": "Settings", "recommendBrowser": " We recommend the <1>Chrome browser for optimal experience.", "upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience.", "Invite Members": "Invite Members", @@ -104,19 +106,15 @@ "Create Or Import": "Create Or Import", "Tips": "Tips: ", "login success": "Login success", - "Sign in": "Sign in AFFiNE Cloud", "Sign out": "Sign out of AFFiNE Cloud", "Delete Workspace": "Delete Workspace", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. along with all its content.", "Delete Workspace Description2": "Deleting (<1>{{workspace}}) will delete both local and cloud data, this operation cannot be undone, please proceed with caution.", "Delete Workspace placeholder": "Please type “Delete” to confirm", "Leave Workspace": "Leave Workspace", - "Leave Workspace Description": "After you leave, you will not be able to access all the contents of this workspace.", "Leave": "Leave", "Workspace Icon": "Workspace Icon", "Workspace Name": "Workspace Name", "Workspace Type": "Workspace Type", - "Export Workspace": "Export Workspace <1>{{workspace}} Is Coming", "Users": "Users", "Access level": "Access level", "Pending": "Pending", @@ -132,12 +130,16 @@ "Publishing Description": "After publishing to the web, everyone can view the content of this workspace through the link.", "Stop publishing": "Stop publishing", "Publish to web": "Publish to web", - "Sync Description": "{{workspaceName}} is Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", - "Sync Description2": "<1>{{workspaceName}} is Cloud Workspace. All data will be synchronized and saved to the AFFiNE", "Download data to device": "Download {{CoreOrAll}} data to device", "General": "General", "Sync": "Sync", "Collaboration": "Collaboration", "Publish": "Publish", - "Workspace Settings": "Workspace Settings" + "Workspace Settings": "Workspace Settings", + "Export Workspace": "Export Workspace <1>{{workspace}} is coming soon", + "Leave Workspace Description": "After you leave, you will no longer be able to access the contents of this workspace.", + "Sign in": "Sign in to AFFiNE Cloud", + "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", + "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost." } diff --git a/packages/i18n/src/resources/fr.json b/packages/i18n/src/resources/fr.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/fr.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/index.ts b/packages/i18n/src/resources/index.ts index 329fa9c679..2081ad8aaf 100644 --- a/packages/i18n/src/resources/index.ts +++ b/packages/i18n/src/resources/index.ts @@ -1,16 +1,11 @@ // THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. // Run `pnpm run download-resources` to regenerate. -// To overwrite this, please overwrite download.ts +// To overwrite this, please overwrite download.ts script. import en from './en.json'; -import zh_Hans from './zh-Hans.json'; -import zh_Hant from './zh-Hant.json'; -import sr from './sr.json'; -import fr from './fr.json'; -import bn from './bn.json'; export const LOCALES = [ { - id: 1000016008, + id: 1000040001, name: 'English', tag: 'en', originalName: 'English', @@ -19,54 +14,4 @@ export const LOCALES = [ completeRate: 1, res: en, }, - { - id: 1000016009, - name: 'Simplified Chinese', - tag: 'zh-Hans', - originalName: '简体中文', - flagEmoji: '🇨🇳', - base: false, - completeRate: 1, - res: zh_Hans, - }, - { - id: 1000016012, - name: 'Traditional Chinese', - tag: 'zh-Hant', - originalName: '繁體中文', - flagEmoji: '🇭🇰', - base: false, - completeRate: 1, - res: zh_Hant, - }, - { - id: 1000034005, - name: 'Serbian', - tag: 'sr', - originalName: 'српски', - flagEmoji: '🇷🇸', - base: false, - completeRate: 0.9166666666666666, - res: sr, - }, - { - id: 1000034008, - name: 'French', - tag: 'fr', - originalName: 'français', - flagEmoji: '🇫🇷', - base: false, - completeRate: 1, - res: fr, - }, - { - id: 1000034010, - name: 'Bangla', - tag: 'bn', - originalName: 'বাংলা', - flagEmoji: '🇧🇩', - base: false, - completeRate: 0.7083333333333334, - res: bn, - }, ] as const; diff --git a/packages/i18n/src/resources/sr.json b/packages/i18n/src/resources/sr.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/sr.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/zh-Hans.json b/packages/i18n/src/resources/zh-Hans.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/zh-Hans.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/zh-Hant.json b/packages/i18n/src/resources/zh-Hant.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/zh-Hant.json +++ /dev/null @@ -1 +0,0 @@ -{} From ad73c414837a07d8337a2627c04cc7a20c017a5c Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 15:46:43 +0800 Subject: [PATCH 010/104] feat: add workflow to auto update i18n json --- .github/workflows/languages-download.yml.bak | 89 ++++++++++++++++++++ .github/workflows/languages-sync.yml.bak | 63 ++++++++++++++ packages/i18n/src/resources/en.json | 3 +- 3 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/languages-download.yml.bak create mode 100644 .github/workflows/languages-sync.yml.bak diff --git a/.github/workflows/languages-download.yml.bak b/.github/workflows/languages-download.yml.bak new file mode 100644 index 0000000000..570d3bd8ed --- /dev/null +++ b/.github/workflows/languages-download.yml.bak @@ -0,0 +1,89 @@ +name: Download Languages Resources + +on: + # schedule: + # - cron: "0 0 * * 5" # At 00:00(UTC) on Friday. + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +# See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # The concurrency group contains the workflow name and the branch name for + # pull requests or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +# This action need write permission to create pull requests +# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions +permissions: + contents: write + pull-requests: write + +jobs: + main: + strategy: + matrix: + node-version: [18] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use pnpm + uses: pnpm/action-setup@v2 + with: + version: 7 + + - name: Use Node.js ${{ matrix.node-version }} + # https://github.com/actions/setup-node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install node modules + run: pnpm install + + - name: Sync Languages + working-directory: ./packages/i18n + run: pnpm run download-resources + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} + + - name: Push Branch + id: push + run: | + git add packages/i18n + # Do not proceed if there are no file differences + COMMIT=$(git rev-parse --verify origin/$TARGET_BRANCH || echo HEAD) + FILES_CHANGED=$(git diff-index --name-only --cached $COMMIT | wc -l) + if [[ "$FILES_CHANGED" = "0" ]]; then + echo "No file changes detected." + echo "::set-output name=skipPR::true" + exit 0 + fi + git config user.name 'github-actions[bot]' + git config user.email 'github-actions[bot]@users.noreply.github.com' + git commit --message 'feat(i18n): new translations' --no-verify + git remote set-url origin "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY" + git push --force origin HEAD:$TARGET_BRANCH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TARGET_BRANCH: bot/new-translations + + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + + # see https://github.com/repo-sync/pull-request + - name: Create Pull Request + if: steps.push.outputs.skipPR != 'true' + uses: repo-sync/pull-request@v2 + with: + source_branch: 'bot/new-translations' # If blank, default: triggered branch + destination_branch: "master" + pr_title: Update i18n (${{ steps.date.outputs.date }}) # Title of pull request + pr_label: 'data,bot' # Comma-separated list (no spaces) + github_token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/languages-sync.yml.bak b/.github/workflows/languages-sync.yml.bak new file mode 100644 index 0000000000..2a62fdd8ff --- /dev/null +++ b/.github/workflows/languages-sync.yml.bak @@ -0,0 +1,63 @@ +name: Languages Sync + +on: + # push: + # branches: [ "feat/sync-languages" ] + # paths: + # - 'packages/i18n/**' + # - '.github/workflows/languages-sync.yml' + # pull_request: + # branches: [ "feat/sync-languages" ] + # paths: + # - 'packages/i18n/**' + # - '.github/workflows/languages-sync.yml' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +# See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # The concurrency group contains the workflow name and the branch name for + # pull requests or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +jobs: + main: + strategy: + matrix: + node-version: [18] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use pnpm + uses: pnpm/action-setup@v2 + with: + version: 7 + + - name: Use Node.js ${{ matrix.node-version }} + # https://github.com/actions/setup-node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install node modules + run: pnpm install + + - name: Check Language Key + if: github.ref != 'feat/sync-languages' + working-directory: ./packages/i18n + run: pnpm run sync-languages:check + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} + + - name: Sync Languages + if: github.ref == 'feat/sync-languages' + working-directory: ./packages/i18n + run: pnpm run sync-languages + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} \ No newline at end of file diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index a331fb89dd..61fb5c2ba4 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -141,5 +141,6 @@ "Sign in": "Sign in to AFFiNE Cloud", "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost." + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost.", + "test auto update": "test" } From abc749458635b25b0c570a1a20cf025330ad2d21 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 15:55:50 +0800 Subject: [PATCH 011/104] chore: test workflow --- .github/workflows/languages-download.yml | 89 ++++++++++++++++++++ .github/workflows/languages-download.yml.bak | 89 -------------------- .github/workflows/languages-sync.yml | 63 ++++++++++++++ .github/workflows/languages-sync.yml.bak | 63 -------------- 4 files changed, 152 insertions(+), 152 deletions(-) create mode 100644 .github/workflows/languages-download.yml delete mode 100644 .github/workflows/languages-download.yml.bak create mode 100644 .github/workflows/languages-sync.yml delete mode 100644 .github/workflows/languages-sync.yml.bak diff --git a/.github/workflows/languages-download.yml b/.github/workflows/languages-download.yml new file mode 100644 index 0000000000..a3f8469038 --- /dev/null +++ b/.github/workflows/languages-download.yml @@ -0,0 +1,89 @@ +name: Download Languages Resources + +on: + # schedule: + # - cron: "0 0 * * 5" # At 00:00(UTC) on Friday. + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +# See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # The concurrency group contains the workflow name and the branch name for + # pull requests or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +# This action need write permission to create pull requests +# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions +permissions: + contents: write + pull-requests: write + +jobs: + main: + strategy: + matrix: + node-version: [18] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use pnpm + uses: pnpm/action-setup@v2 + with: + version: 7 + + - name: Use Node.js ${{ matrix.node-version }} + # https://github.com/actions/setup-node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install node modules + run: pnpm install + + - name: Sync Languages + working-directory: ./packages/i18n + run: pnpm run download-resources + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} + + - name: Push Branch + id: push + run: | + git add packages/i18n + # Do not proceed if there are no file differences + COMMIT=$(git rev-parse --verify origin/$TARGET_BRANCH || echo HEAD) + FILES_CHANGED=$(git diff-index --name-only --cached $COMMIT | wc -l) + if [[ "$FILES_CHANGED" = "0" ]]; then + echo "No file changes detected." + echo "::set-output name=skipPR::true" + exit 0 + fi + git config user.name 'github-actions[bot]' + git config user.email 'github-actions[bot]@users.noreply.github.com' + git commit --message 'feat(i18n): new translations' --no-verify + git remote set-url origin "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY" + git push --force origin HEAD:$TARGET_BRANCH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TARGET_BRANCH: bot/new-translations + + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + + # see https://github.com/repo-sync/pull-request + - name: Create Pull Request + if: steps.push.outputs.skipPR != 'true' + uses: repo-sync/pull-request@v2 + with: + source_branch: 'bot/new-translations' # If blank, default: triggered branch + destination_branch: 'master' + pr_title: Update i18n (${{ steps.date.outputs.date }}) # Title of pull request + pr_label: 'data,bot' # Comma-separated list (no spaces) + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/languages-download.yml.bak b/.github/workflows/languages-download.yml.bak deleted file mode 100644 index 570d3bd8ed..0000000000 --- a/.github/workflows/languages-download.yml.bak +++ /dev/null @@ -1,89 +0,0 @@ -name: Download Languages Resources - -on: - # schedule: - # - cron: "0 0 * * 5" # At 00:00(UTC) on Friday. - workflow_dispatch: - -# Cancels all previous workflow runs for pull requests that have not completed. -# See https://docs.github.com/en/actions/using-jobs/using-concurrency -concurrency: - # The concurrency group contains the workflow name and the branch name for - # pull requests or the commit hash for any other events. - group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} - cancel-in-progress: true - -# This action need write permission to create pull requests -# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions -permissions: - contents: write - pull-requests: write - -jobs: - main: - strategy: - matrix: - node-version: [18] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Use pnpm - uses: pnpm/action-setup@v2 - with: - version: 7 - - - name: Use Node.js ${{ matrix.node-version }} - # https://github.com/actions/setup-node - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - cache: 'pnpm' - - - name: Install node modules - run: pnpm install - - - name: Sync Languages - working-directory: ./packages/i18n - run: pnpm run download-resources - env: - TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} - - - name: Push Branch - id: push - run: | - git add packages/i18n - # Do not proceed if there are no file differences - COMMIT=$(git rev-parse --verify origin/$TARGET_BRANCH || echo HEAD) - FILES_CHANGED=$(git diff-index --name-only --cached $COMMIT | wc -l) - if [[ "$FILES_CHANGED" = "0" ]]; then - echo "No file changes detected." - echo "::set-output name=skipPR::true" - exit 0 - fi - git config user.name 'github-actions[bot]' - git config user.email 'github-actions[bot]@users.noreply.github.com' - git commit --message 'feat(i18n): new translations' --no-verify - git remote set-url origin "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY" - git push --force origin HEAD:$TARGET_BRANCH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TARGET_BRANCH: bot/new-translations - - - name: Get current date - id: date - run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - - # see https://github.com/repo-sync/pull-request - - name: Create Pull Request - if: steps.push.outputs.skipPR != 'true' - uses: repo-sync/pull-request@v2 - with: - source_branch: 'bot/new-translations' # If blank, default: triggered branch - destination_branch: "master" - pr_title: Update i18n (${{ steps.date.outputs.date }}) # Title of pull request - pr_label: 'data,bot' # Comma-separated list (no spaces) - github_token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml new file mode 100644 index 0000000000..50fe3dbec1 --- /dev/null +++ b/.github/workflows/languages-sync.yml @@ -0,0 +1,63 @@ +name: Languages Sync + +on: + # push: + # branches: [ "feat/sync-languages" ] + # paths: + # - 'packages/i18n/**' + # - '.github/workflows/languages-sync.yml' + # pull_request: + # branches: [ "feat/sync-languages" ] + # paths: + # - 'packages/i18n/**' + # - '.github/workflows/languages-sync.yml' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +# See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # The concurrency group contains the workflow name and the branch name for + # pull requests or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +jobs: + main: + strategy: + matrix: + node-version: [18] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use pnpm + uses: pnpm/action-setup@v2 + with: + version: 7 + + - name: Use Node.js ${{ matrix.node-version }} + # https://github.com/actions/setup-node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install node modules + run: pnpm install + + - name: Check Language Key + if: github.ref != 'feat/sync-languages' + working-directory: ./packages/i18n + run: pnpm run sync-languages:check + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} + + - name: Sync Languages + if: github.ref == 'feat/sync-languages' + working-directory: ./packages/i18n + run: pnpm run sync-languages + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} diff --git a/.github/workflows/languages-sync.yml.bak b/.github/workflows/languages-sync.yml.bak deleted file mode 100644 index 2a62fdd8ff..0000000000 --- a/.github/workflows/languages-sync.yml.bak +++ /dev/null @@ -1,63 +0,0 @@ -name: Languages Sync - -on: - # push: - # branches: [ "feat/sync-languages" ] - # paths: - # - 'packages/i18n/**' - # - '.github/workflows/languages-sync.yml' - # pull_request: - # branches: [ "feat/sync-languages" ] - # paths: - # - 'packages/i18n/**' - # - '.github/workflows/languages-sync.yml' - workflow_dispatch: - -# Cancels all previous workflow runs for pull requests that have not completed. -# See https://docs.github.com/en/actions/using-jobs/using-concurrency -concurrency: - # The concurrency group contains the workflow name and the branch name for - # pull requests or the commit hash for any other events. - group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} - cancel-in-progress: true - -jobs: - main: - strategy: - matrix: - node-version: [18] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Use pnpm - uses: pnpm/action-setup@v2 - with: - version: 7 - - - name: Use Node.js ${{ matrix.node-version }} - # https://github.com/actions/setup-node - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - cache: 'pnpm' - - - name: Install node modules - run: pnpm install - - - name: Check Language Key - if: github.ref != 'feat/sync-languages' - working-directory: ./packages/i18n - run: pnpm run sync-languages:check - env: - TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} - - - name: Sync Languages - if: github.ref == 'feat/sync-languages' - working-directory: ./packages/i18n - run: pnpm run sync-languages - env: - TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} \ No newline at end of file From 93ef92e15bc3d113e0ed14b7b87a7164832531c7 Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Wed, 11 Jan 2023 16:01:27 +0800 Subject: [PATCH 012/104] chore: adding code block background color, line number color, fixing landing page case sensitivity --- packages/app/src/styles/theme.ts | 6 ++++++ packages/app/src/styles/types.ts | 5 +++++ packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/app/src/styles/theme.ts b/packages/app/src/styles/theme.ts index 1412e00285..f317397fae 100644 --- a/packages/app/src/styles/theme.ts +++ b/packages/app/src/styles/theme.ts @@ -20,6 +20,7 @@ export const getLightTheme = ( popoverBackground: '#fff', tooltipBackground: '#6880FF', codeBackground: '#f2f5f9', + codeBlockBackground: '#fafbfd', warningBackground: '#FFF9C7', errorBackground: '#FFDED8', @@ -40,6 +41,7 @@ export const getLightTheme = ( disableColor: '#C0C0C0', warningColor: '#906616', errorColor: '#EB4335', + lineNumberColor: '#888A9E', }, font: { xs: '12px', @@ -96,6 +98,7 @@ export const getDarkTheme = ( editorMode === 'edgeless' ? lightTheme.colors.codeBackground : '#505662', + codeBlockBackground: '#36383D', warningBackground: '#FFF9C7', errorBackground: '#FFDED8', @@ -117,6 +120,7 @@ export const getDarkTheme = ( disableColor: '#4b4b4b', warningColor: '#906616', errorColor: '#EB4335', + lineNumberColor: '#888A9E', }, shadow: { popover: @@ -154,12 +158,14 @@ export const globalThemeVariables: ( '--affine-popover-color': theme.colors.popoverColor, '--affine-input-color': theme.colors.inputColor, '--affine-code-color': theme.colors.codeColor, + '--affine-code-block-background': theme.colors.codeBlockBackground, '--affine-quote-color': theme.colors.quoteColor, '--affine-selected-color': theme.colors.selectedColor, '--affine-placeholder-color': theme.colors.placeHolderColor, '--affine-border-color': theme.colors.borderColor, '--affine-disable-color': theme.colors.disableColor, '--affine-tooltip-color': theme.colors.tooltipColor, + '--affine-line-number-color': theme.colors.lineNumberColor, '--affine-modal-shadow': theme.shadow.modal, '--affine-popover-shadow': theme.shadow.popover, diff --git a/packages/app/src/styles/types.ts b/packages/app/src/styles/types.ts index 85b12df586..81816ad611 100644 --- a/packages/app/src/styles/types.ts +++ b/packages/app/src/styles/types.ts @@ -25,6 +25,7 @@ export interface AffineTheme { hoverBackground: string; innerHoverBackground: string; codeBackground: string; + codeBlockBackground: string; warningBackground: string; errorBackground: string; // Use for the page`s text @@ -47,6 +48,7 @@ export interface AffineTheme { disableColor: string; warningColor: string; errorColor: string; + lineNumberColor: string; }; font: { xs: string; // tiny @@ -90,6 +92,8 @@ export interface AffineThemeCSSVariables { '--affine-popover-background': AffineTheme['colors']['popoverBackground']; '--affine-hover-background': AffineTheme['colors']['hoverBackground']; '--affine-code-background': AffineTheme['colors']['codeBackground']; + + '--affine-code-block-background': AffineTheme['colors']['codeBlockBackground']; '--affine-tooltip-background': AffineTheme['colors']['tooltipBackground']; '--affine-text-color': AffineTheme['colors']['textColor']; @@ -107,6 +111,7 @@ export interface AffineThemeCSSVariables { '--affine-border-color': AffineTheme['colors']['borderColor']; '--affine-disable-color': AffineTheme['colors']['disableColor']; '--affine-tooltip-color': AffineTheme['colors']['tooltipColor']; + '--affine-line-number-color': AffineTheme['colors']['lineNumberColor']; '--affine-modal-shadow': AffineTheme['shadow']['modal']; '--affine-popover-shadow': AffineTheme['shadow']['popover']; diff --git a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md b/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md index 130b2918b8..91e2fe48c0 100644 --- a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md +++ b/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md @@ -39,7 +39,7 @@ docker run -it --name affine -d -v [YOUR_PATH]:/app/data -p 3000:3000 ghcr.io/to [] What about a code block? ````` -```javascript +```JavaScript console.log('Hello world'); ``` From e3469b435f83c5b36d6b3fe5f0036b16e142af47 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 16:19:46 +0800 Subject: [PATCH 013/104] chore: update workflow --- .github/workflows/languages-sync.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml index 50fe3dbec1..3cacc35749 100644 --- a/.github/workflows/languages-sync.yml +++ b/.github/workflows/languages-sync.yml @@ -1,16 +1,16 @@ name: Languages Sync on: - # push: - # branches: [ "feat/sync-languages" ] - # paths: - # - 'packages/i18n/**' - # - '.github/workflows/languages-sync.yml' - # pull_request: - # branches: [ "feat/sync-languages" ] - # paths: - # - 'packages/i18n/**' - # - '.github/workflows/languages-sync.yml' + push: + branches: ['master'] + paths: + - 'packages/i18n/**' + - '.github/workflows/languages-sync.yml' + pull_request: + branches: ['master'] + paths: + - 'packages/i18n/**' + - '.github/workflows/languages-sync.yml' workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. @@ -49,14 +49,14 @@ jobs: run: pnpm install - name: Check Language Key - if: github.ref != 'feat/sync-languages' + if: github.ref != 'refs/heads/master' working-directory: ./packages/i18n run: pnpm run sync-languages:check env: TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} - name: Sync Languages - if: github.ref == 'feat/sync-languages' + if: github.ref == 'refs/heads/master' working-directory: ./packages/i18n run: pnpm run sync-languages env: From 4e25fa3054b39add45c849efb3b7ac69ca6efcd4 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Wed, 11 Jan 2023 16:40:46 +0800 Subject: [PATCH 014/104] chore: disable outdated feature --- packages/app/src/components/header/Header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/header/Header.tsx b/packages/app/src/components/header/Header.tsx index 9db8149d5e..51c462907d 100644 --- a/packages/app/src/components/header/Header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -40,7 +40,7 @@ const HeaderRightItems: Record = { editorOptionMenu: , trashButtonGroup: , themeModeSwitch: , - syncUser: , + syncUser: null, //, }; export const Header = ({ From 9c2afb2a7b9f0d00544e3fc30f294e6fb0962fd5 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 16:51:45 +0800 Subject: [PATCH 015/104] feat: add auto download --- .github/workflows/languages-download.yml | 4 ++-- packages/i18n/src/resources/en.json | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/languages-download.yml b/.github/workflows/languages-download.yml index a3f8469038..c7292bd917 100644 --- a/.github/workflows/languages-download.yml +++ b/.github/workflows/languages-download.yml @@ -1,8 +1,8 @@ name: Download Languages Resources on: - # schedule: - # - cron: "0 0 * * 5" # At 00:00(UTC) on Friday. + schedule: + - cron: '0 0 * * 5' # At 00:00(UTC) on Friday. workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index 61fb5c2ba4..a331fb89dd 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -141,6 +141,5 @@ "Sign in": "Sign in to AFFiNE Cloud", "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost.", - "test auto update": "test" + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost." } From 0be59eef607762bccb1692d182fab7d5298bdf6c Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 17:25:16 +0800 Subject: [PATCH 016/104] test: skip searchArrowButton test case --- tests/quick-search.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/quick-search.spec.ts b/tests/quick-search.spec.ts index 9d4dbf2add..b1049acce9 100644 --- a/tests/quick-search.spec.ts +++ b/tests/quick-search.spec.ts @@ -32,7 +32,7 @@ test.describe('Open quick search', () => { await expect(quickSearch).toBeVisible(); }); - test('Click arrowDown icon after title', async ({ page }) => { + test.skip('Click arrowDown icon after title', async ({ page }) => { await newPage(page); const quickSearchButton = page.locator( '[data-testid=header-quickSearchButton]' From 18ecf52f622300e055c52a413edbe05885dfb24d Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 17:26:06 +0800 Subject: [PATCH 017/104] chore: remove searchArrowButton --- packages/app/src/components/header/EditorHeader.tsx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/app/src/components/header/EditorHeader.tsx b/packages/app/src/components/header/EditorHeader.tsx index b343179496..491174f578 100644 --- a/packages/app/src/components/header/EditorHeader.tsx +++ b/packages/app/src/components/header/EditorHeader.tsx @@ -1,14 +1,8 @@ import React, { useEffect, useState } from 'react'; -import { - StyledSearchArrowWrapper, - StyledSwitchWrapper, - StyledTitle, - StyledTitleWrapper, -} from './styles'; +import { StyledSwitchWrapper, StyledTitle, StyledTitleWrapper } from './styles'; import { Content } from '@/ui/layout'; import { useAppState } from '@/providers/app-state-provider/context'; import EditorModeSwitch from '@/components/editor-mode-switch'; -import QuickSearchButton from './QuickSearchButton'; import Header from './Header'; import usePropsUpdated from '@/hooks/use-props-updated'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; @@ -64,9 +58,9 @@ export const EditorHeader = () => { /> {title} - + {/* - + */} )} From 2c32d4614f3d6be4b2e776ee1c157f98e3e49083 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 17:26:39 +0800 Subject: [PATCH 018/104] chore: update words --- packages/app/src/components/header/QuickSearchButton.tsx | 2 +- packages/app/src/components/quick-search/Results.tsx | 2 +- packages/i18n/src/resources/en.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/header/QuickSearchButton.tsx b/packages/app/src/components/header/QuickSearchButton.tsx index 0b28e43b09..f5d2023500 100644 --- a/packages/app/src/components/header/QuickSearchButton.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -11,7 +11,7 @@ export const QuickSearchButton = ({ const { triggerQuickSearchModal } = useModal(); const { t } = useTranslation(); return ( - + ) ) : ( - + {List.map(link => { return ( Date: Wed, 11 Jan 2023 17:39:14 +0800 Subject: [PATCH 019/104] chore: remove unused import --- packages/app/src/components/header/Header.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app/src/components/header/Header.tsx b/packages/app/src/components/header/Header.tsx index 51c462907d..4b7a6fcf73 100644 --- a/packages/app/src/components/header/Header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -11,7 +11,6 @@ import { getWarningMessage, shouldShowWarning } from './utils'; import EditorOptionMenu from './header-right-items/EditorOptionMenu'; import TrashButtonGroup from './header-right-items/TrashButtonGroup'; import ThemeModeSwitch from './header-right-items/theme-mode-switch'; -import SyncUser from './header-right-items/SyncUser'; const BrowserWarning = ({ show, From a7e6d16930e2348610299cf667901d2db10b4d53 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 17:43:14 +0800 Subject: [PATCH 020/104] chore: add date --- packages/app/src/components/contact-modal/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/app/src/components/contact-modal/index.tsx b/packages/app/src/components/contact-modal/index.tsx index 3cd4d04f85..6ec64fc144 100644 --- a/packages/app/src/components/contact-modal/index.tsx +++ b/packages/app/src/components/contact-modal/index.tsx @@ -76,6 +76,8 @@ export const ContactModal = ({ link: 'https://community.affine.pro', }, ]; + const date = new Date(); + const year = date.getFullYear(); return (

-

Copyright © 2022 Toeverything

+

Copyright © {year} Toeverything

From fe189e383bf50f9d8d4fcf3737684d13d8b27de1 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 17:44:21 +0800 Subject: [PATCH 021/104] chore: remove unused import --- packages/app/src/components/header/Header.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app/src/components/header/Header.tsx b/packages/app/src/components/header/Header.tsx index 51c462907d..4b7a6fcf73 100644 --- a/packages/app/src/components/header/Header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -11,7 +11,6 @@ import { getWarningMessage, shouldShowWarning } from './utils'; import EditorOptionMenu from './header-right-items/EditorOptionMenu'; import TrashButtonGroup from './header-right-items/TrashButtonGroup'; import ThemeModeSwitch from './header-right-items/theme-mode-switch'; -import SyncUser from './header-right-items/SyncUser'; const BrowserWarning = ({ show, From 3357c3d43b1d487bc6983f2fde78332c8406ade1 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 18:03:29 +0800 Subject: [PATCH 022/104] test: skip cloud sync --- tests/libs/page-logic.ts | 13 ++++++++----- tests/login.spec.ts | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/libs/page-logic.ts b/tests/libs/page-logic.ts index 09385a4cb0..4ee958d7e7 100644 --- a/tests/libs/page-logic.ts +++ b/tests/libs/page-logic.ts @@ -5,9 +5,12 @@ export async function newPage(page: Page) { } export async function clickPageMoreActions(page: Page) { - return page - .getByTestId('editor-header-items') - .getByRole('button') - .nth(2) - .click(); + return ( + page + .getByTestId('editor-header-items') + .getByRole('button') + //FIXME: temporary change due to cloud sync icon being hidden + .nth(1) + .click() + ); } diff --git a/tests/login.spec.ts b/tests/login.spec.ts index ed7185259f..f5feb9d9c5 100644 --- a/tests/login.spec.ts +++ b/tests/login.spec.ts @@ -15,7 +15,7 @@ test.describe('Login Flow', () => { .click(); }); - test('Open login modal by click cloud-unsync-icon', async ({ page }) => { + test.skip('Open login modal by click cloud-unsync-icon', async ({ page }) => { await page.getByTestId('cloud-unsync-icon').click(); await page.waitForTimeout(800); From 8cdfb2edba4cf132cd7517a1387ed433b143b22f Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 18:19:01 +0800 Subject: [PATCH 023/104] chore: update json --- packages/i18n/src/resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index a331fb89dd..2831a8aafe 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -15,7 +15,7 @@ "Add to favourites": "Add to favourites", "Paper": "Paper", "Edgeless": "Edgeless", - "Switch to": "Switch to", + "Jump to": "Jump to", "Convert to ": "Convert to ", "Page": "Page", "Export": "Export", From 5749b5f71197df7ddd030b527c141c1c4b7da8fe Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 18:26:58 +0800 Subject: [PATCH 024/104] test: skip cloud sync --- tests/libs/page-logic.ts | 13 ++++++++----- tests/login.spec.ts | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/libs/page-logic.ts b/tests/libs/page-logic.ts index 09385a4cb0..bb6c71d2ba 100644 --- a/tests/libs/page-logic.ts +++ b/tests/libs/page-logic.ts @@ -5,9 +5,12 @@ export async function newPage(page: Page) { } export async function clickPageMoreActions(page: Page) { - return page - .getByTestId('editor-header-items') - .getByRole('button') - .nth(2) - .click(); + return ( + page + .getByTestId('editor-header-items') + .getByRole('button') + //FIXME: temporary change due to cloud sync icon being hidden + .nth(0) + .click() + ); } diff --git a/tests/login.spec.ts b/tests/login.spec.ts index ed7185259f..f5feb9d9c5 100644 --- a/tests/login.spec.ts +++ b/tests/login.spec.ts @@ -15,7 +15,7 @@ test.describe('Login Flow', () => { .click(); }); - test('Open login modal by click cloud-unsync-icon', async ({ page }) => { + test.skip('Open login modal by click cloud-unsync-icon', async ({ page }) => { await page.getByTestId('cloud-unsync-icon').click(); await page.waitForTimeout(800); From af92417c817f18a3e0c18ac86c4c0f96dc504569 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 18:43:19 +0800 Subject: [PATCH 025/104] chore: delete workflow action --- .github/workflows/languages-download.yml | 89 ------------------------ .github/workflows/languages-sync.yml | 63 ----------------- 2 files changed, 152 deletions(-) delete mode 100644 .github/workflows/languages-download.yml delete mode 100644 .github/workflows/languages-sync.yml diff --git a/.github/workflows/languages-download.yml b/.github/workflows/languages-download.yml deleted file mode 100644 index c7292bd917..0000000000 --- a/.github/workflows/languages-download.yml +++ /dev/null @@ -1,89 +0,0 @@ -name: Download Languages Resources - -on: - schedule: - - cron: '0 0 * * 5' # At 00:00(UTC) on Friday. - workflow_dispatch: - -# Cancels all previous workflow runs for pull requests that have not completed. -# See https://docs.github.com/en/actions/using-jobs/using-concurrency -concurrency: - # The concurrency group contains the workflow name and the branch name for - # pull requests or the commit hash for any other events. - group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} - cancel-in-progress: true - -# This action need write permission to create pull requests -# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions -permissions: - contents: write - pull-requests: write - -jobs: - main: - strategy: - matrix: - node-version: [18] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Use pnpm - uses: pnpm/action-setup@v2 - with: - version: 7 - - - name: Use Node.js ${{ matrix.node-version }} - # https://github.com/actions/setup-node - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - cache: 'pnpm' - - - name: Install node modules - run: pnpm install - - - name: Sync Languages - working-directory: ./packages/i18n - run: pnpm run download-resources - env: - TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} - - - name: Push Branch - id: push - run: | - git add packages/i18n - # Do not proceed if there are no file differences - COMMIT=$(git rev-parse --verify origin/$TARGET_BRANCH || echo HEAD) - FILES_CHANGED=$(git diff-index --name-only --cached $COMMIT | wc -l) - if [[ "$FILES_CHANGED" = "0" ]]; then - echo "No file changes detected." - echo "::set-output name=skipPR::true" - exit 0 - fi - git config user.name 'github-actions[bot]' - git config user.email 'github-actions[bot]@users.noreply.github.com' - git commit --message 'feat(i18n): new translations' --no-verify - git remote set-url origin "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY" - git push --force origin HEAD:$TARGET_BRANCH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TARGET_BRANCH: bot/new-translations - - - name: Get current date - id: date - run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - - # see https://github.com/repo-sync/pull-request - - name: Create Pull Request - if: steps.push.outputs.skipPR != 'true' - uses: repo-sync/pull-request@v2 - with: - source_branch: 'bot/new-translations' # If blank, default: triggered branch - destination_branch: 'master' - pr_title: Update i18n (${{ steps.date.outputs.date }}) # Title of pull request - pr_label: 'data,bot' # Comma-separated list (no spaces) - github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml deleted file mode 100644 index 3cacc35749..0000000000 --- a/.github/workflows/languages-sync.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Languages Sync - -on: - push: - branches: ['master'] - paths: - - 'packages/i18n/**' - - '.github/workflows/languages-sync.yml' - pull_request: - branches: ['master'] - paths: - - 'packages/i18n/**' - - '.github/workflows/languages-sync.yml' - workflow_dispatch: - -# Cancels all previous workflow runs for pull requests that have not completed. -# See https://docs.github.com/en/actions/using-jobs/using-concurrency -concurrency: - # The concurrency group contains the workflow name and the branch name for - # pull requests or the commit hash for any other events. - group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} - cancel-in-progress: true - -jobs: - main: - strategy: - matrix: - node-version: [18] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Use pnpm - uses: pnpm/action-setup@v2 - with: - version: 7 - - - name: Use Node.js ${{ matrix.node-version }} - # https://github.com/actions/setup-node - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - cache: 'pnpm' - - - name: Install node modules - run: pnpm install - - - name: Check Language Key - if: github.ref != 'refs/heads/master' - working-directory: ./packages/i18n - run: pnpm run sync-languages:check - env: - TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} - - - name: Sync Languages - if: github.ref == 'refs/heads/master' - working-directory: ./packages/i18n - run: pnpm run sync-languages - env: - TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} From 7831a65cbeeb22b1086388f8714dcf709e20fe1c Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 11 Jan 2023 19:35:11 +0800 Subject: [PATCH 026/104] chore: update readme --- packages/i18n/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/i18n/README.md b/packages/i18n/README.md index 7cd4fba1bf..f8ad64372a 100644 --- a/packages/i18n/README.md +++ b/packages/i18n/README.md @@ -36,13 +36,6 @@ const App = () => { }; ``` -## How the i18n workflow works? - -- When the `src/resources/en.json`(base language) updated and merged to the develop branch, will trigger the `languages-sync` action. -- The `languages-sync` action will check the base language and add missing translations to the Tolgee platform. -- This way, partners from the community can update the translations. -- Finally, the `languages-download` action will regularly download the latest translation resources from the Tolgee platform. - ## How to sync translations manually - Set token as environment variable From c28cca1a13d5ada9ae1e2d35dfbe3ed07206d1c1 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Wed, 11 Jan 2023 23:59:06 +0800 Subject: [PATCH 027/104] fix: nextconfig dev url --- packages/app/next.config.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/app/next.config.js b/packages/app/next.config.js index 7d81e5c273..478bbfa12e 100644 --- a/packages/app/next.config.js +++ b/packages/app/next.config.js @@ -11,12 +11,10 @@ const EDITOR_VERSION = enableDebugLocal const profileTarget = { ac: '100.85.73.88:12001', - dev: '192.168.65.20:3000', + dev: '100.77.180.48:11001', local: '127.0.0.1:3000', }; -// 100.77.180.48:11001 - const getRedirectConfig = profile => { const target = profileTarget[profile || 'dev'] || profileTarget['dev']; From 1d3dd8aa7713e7a75bb1ce7851513cf1f97edb87 Mon Sep 17 00:00:00 2001 From: himself65 Date: Thu, 12 Jan 2023 00:53:53 +0800 Subject: [PATCH 028/104] feat: support flags in workspace --- packages/app/package.json | 6 +- packages/data-center/package.json | 4 +- packages/data-center/src/datacenter.ts | 7 ++- pnpm-lock.yaml | 78 +++++++++++++++++--------- 4 files changed, 61 insertions(+), 34 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 9bc91a9259..b68de96c0b 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,10 +11,10 @@ "dependencies": { "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.4.0-20230110112105-ef07332", - "@blocksuite/editor": "0.4.0-20230110112105-ef07332", + "@blocksuite/blocks": "0.4.0-20230111164952-fea266a", + "@blocksuite/editor": "0.4.0-20230111164952-fea266a", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.4.0-20230110112105-ef07332", + "@blocksuite/store": "0.4.0-20230111164952-fea266a", "@emotion/css": "^11.10.0", "@emotion/react": "^11.10.4", "@emotion/server": "^11.10.0", diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 606f6e196c..597e9e46a7 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -26,8 +26,8 @@ "typescript": "^4.8.4" }, "dependencies": { - "@blocksuite/blocks": "0.4.0-20230110112105-ef07332", - "@blocksuite/store": "0.4.0-20230110112105-ef07332", + "@blocksuite/blocks": "0.4.0-20230111164952-fea266a", + "@blocksuite/store": "0.4.0-20230111164952-fea266a", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index 59f72b6afc..079a766c73 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -102,7 +102,12 @@ export class DataCenter { const providerId = await this._getProvider(id, params.providerId); // init workspace & register block schema - const workspace = new Workspace({ room: id }).register(BlockSchema); + const workspace = new Workspace({ + room: id, + defaultFlags: { + enable_drag_handle: false, + }, + }).register(BlockSchema); const Provider = this._providers.get(providerId); assert(Provider); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6a2417511..f1d36703e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,10 @@ importers: specifiers: '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.4.0-20230110112105-ef07332 - '@blocksuite/editor': 0.4.0-20230110112105-ef07332 + '@blocksuite/blocks': 0.4.0-20230111164952-fea266a + '@blocksuite/editor': 0.4.0-20230111164952-fea266a '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.4.0-20230110112105-ef07332 + '@blocksuite/store': 0.4.0-20230111164952-fea266a '@emotion/css': ^11.10.0 '@emotion/react': ^11.10.4 '@emotion/server': ^11.10.0 @@ -81,10 +81,10 @@ importers: dependencies: '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.4.0-20230110112105-ef07332_yjs@13.5.44 - '@blocksuite/editor': 0.4.0-20230110112105-ef07332_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/editor': 0.4.0-20230111164952-fea266a_yjs@13.5.44 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.4.0-20230110112105-ef07332_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 '@emotion/css': 11.10.0 '@emotion/react': 11.10.4_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.0 @@ -123,8 +123,8 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.4.0-20230110112105-ef07332 - '@blocksuite/store': 0.4.0-20230110112105-ef07332 + '@blocksuite/blocks': 0.4.0-20230111164952-fea266a + '@blocksuite/store': 0.4.0-20230111164952-fea266a '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -140,8 +140,8 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.44 dependencies: - '@blocksuite/blocks': 0.4.0-20230110112105-ef07332_yjs@13.5.44 - '@blocksuite/store': 0.4.0-20230110112105-ef07332_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -1455,16 +1455,17 @@ packages: to-fast-properties: 2.0.0 dev: true - /@blocksuite/blocks/0.4.0-20230110112105-ef07332_yjs@13.5.44: - resolution: {integrity: sha512-dtwZRCWtirmheRQaITPOC/D9LZ3yFuYztqL/y2mz/BRSfHj8I71OVcX0HjFXx2TUdzhkea1GNYbp4226zZIiRA==} + /@blocksuite/blocks/0.4.0-20230111164952-fea266a_yjs@13.5.44: + resolution: {integrity: sha512-bphgTV5YkEfsqkvRJdbH8TevG6l9b9WHTliETJ4UksX4sxOsRDJk0v4XcluIDZXDv4TQ8fc45d5s5uaab48xQQ==} dependencies: - '@blocksuite/phasor': 0.4.0-20230110112105-ef07332_yjs@13.5.44 - '@blocksuite/store': 0.4.0-20230110112105-ef07332_yjs@13.5.44 + '@blocksuite/global': 0.4.0-20230111164952-fea266a + '@blocksuite/phasor': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 '@tldraw/intersect': 1.8.0 autosize: 5.0.2 highlight.js: 11.7.0 hotkeys-js: 3.10.1 - lit: 2.5.0 + lit: 2.6.0 perfect-freehand: 1.2.0 quill: 1.3.7 quill-cursors: 4.0.0 @@ -1475,12 +1476,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-20230110112105-ef07332_yjs@13.5.44: - resolution: {integrity: sha512-UqLVEZq/bKRJfe3e/Teur7grlnSo6oG55s00WSWu+nTIHnvgasIePJ6rpGC/pXwYdsuvVQnQzGesnrapNVtXqA==} + /@blocksuite/editor/0.4.0-20230111164952-fea266a_yjs@13.5.44: + resolution: {integrity: sha512-pVHH9nu9FwQErrPI6dHfMUCVtPEaNuB4PhHmyrcrVIgTGaGKdAQZ7PrsEqvjeWnIoX2l6s4u9XCFgdAsxybSfQ==} dependencies: - '@blocksuite/blocks': 0.4.0-20230110112105-ef07332_yjs@13.5.44 - '@blocksuite/store': 0.4.0-20230110112105-ef07332_yjs@13.5.44 - lit: 2.5.0 + '@blocksuite/blocks': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + lit: 2.6.0 marked: 4.2.5 turndown: 7.1.1 transitivePeerDependencies: @@ -1490,6 +1491,10 @@ packages: - yjs dev: false + /@blocksuite/global/0.4.0-20230111164952-fea266a: + resolution: {integrity: sha512-R2nXYIfyBaSMbLGF/aOUgRPFpWYs+bbK1/E9wChQGvC1D8UhQ6WRUt/khzM/GpdvnmIhmMyolJZ6LjEjGAo6Wg==} + dev: false + /@blocksuite/icons/2.0.4_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-Ewx30d3W6MXJGPXYvv48UpvAVfDB+gIVu90sHZX5curnSn+e1DdpCVfL0DeZA7Iyq6aLbxnKVzOAewlfoP8kDQ==} peerDependencies: @@ -1500,19 +1505,20 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.4.0-20230110112105-ef07332_yjs@13.5.44: - resolution: {integrity: sha512-R5j/iK7WBFSk7vSk8HEAsxDwr+xDeY7JuzdGzzwnkcOaxuM6Eea6g0vMw7DPuWDAkvlcP7JsgXLnzWgFZh7qmA==} + /@blocksuite/phasor/0.4.0-20230111164952-fea266a_yjs@13.5.44: + resolution: {integrity: sha512-AHxLIHi2s3fcfzbx8URVer3LGlZnVKvW+ttpRKIm8a3vkZqaXwb9+8gL8Ajh6YkOvf9Nb1Y5471978284BwCfw==} peerDependencies: yjs: ^13 dependencies: yjs: 13.5.44 dev: false - /@blocksuite/store/0.4.0-20230110112105-ef07332_yjs@13.5.44: - resolution: {integrity: sha512-NisHLf0uSyFu5DUZD13QSsp33C9vnd7Jf7jdLOAPztQ2U05NcGFopjM2InhwBmtmQSHrd/qi25PjgnAJ7/HSNQ==} + /@blocksuite/store/0.4.0-20230111164952-fea266a_yjs@13.5.44: + resolution: {integrity: sha512-2iMDGtbrFK2AO8+j17Z1kpsVzpkFY91+IMD2lorqlGrK8zj2Ane8JypcARFXJJ6rG8yRbB+P8GDLTXXvj+ZgmQ==} peerDependencies: yjs: ^13 dependencies: + '@blocksuite/global': 0.4.0-20230111164952-fea266a '@types/flexsearch': 0.7.3 '@types/quill': 1.3.10 buffer: 6.0.3 @@ -2497,6 +2503,10 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@lit-labs/ssr-dom-shim/1.0.0: + resolution: {integrity: sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==} + dev: false + /@lit/reactive-element/1.4.1: resolution: {integrity: sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==} dev: false @@ -2505,6 +2515,12 @@ packages: resolution: {integrity: sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==} dev: false + /@lit/reactive-element/1.6.0: + resolution: {integrity: sha512-33H04h4tx9NVEADti0haZTNxssCnqZlMlyjri5k9kwDWAe2W1iENroZt7VWwmsPhlWUD8sSoPXSHqd0DdL29Pw==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.0.0 + dev: false + /@manypkg/find-root/1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -6212,6 +6228,12 @@ packages: '@types/trusted-types': 2.0.2 dev: false + /lit-html/2.6.0: + resolution: {integrity: sha512-slNAAYfvC7LxeryDOnPFl5uTpxGYGJ6UR9SFmfY+gQ+sf30z1atDPXlgjcSTtwymNdlwDhfGjq+EemQRXp9z1g==} + dependencies: + '@types/trusted-types': 2.0.2 + dev: false + /lit/2.4.0: resolution: {integrity: sha512-fdgzxEtLrZFQU/BqTtxFQCLwlZd9bdat+ltzSFjvWkZrs7eBmeX0L5MHUMb3kYIkuS8Xlfnii/iI5klirF8/Xg==} dependencies: @@ -6220,12 +6242,12 @@ packages: lit-html: 2.4.0 dev: false - /lit/2.5.0: - resolution: {integrity: sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==} + /lit/2.6.0: + resolution: {integrity: sha512-GUKVozhomdYlFVuB4UNipbPB5RcXNX4ns43uDA1gSTZN1oHe7mnj05fpYbESxXfxg/Gn905HTIzymCFrr/cn3A==} dependencies: - '@lit/reactive-element': 1.5.0 + '@lit/reactive-element': 1.6.0 lit-element: 3.2.2 - lit-html: 2.5.0 + lit-html: 2.6.0 dev: false /load-yaml-file/0.2.0: From 89866378ef1a3e18c29911cf863940b4603ec766 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 13:02:32 +0800 Subject: [PATCH 029/104] feat: add i18n keys auto sync --- .github/workflows/languages-sync.yml | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/languages-sync.yml diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml new file mode 100644 index 0000000000..1bb8049e66 --- /dev/null +++ b/.github/workflows/languages-sync.yml @@ -0,0 +1,63 @@ +name: Languages Sync + +on: + # push: + # branches: [ "develop", "master" ] + # paths: + # - 'libs/datasource/i18n/**' + # - '.github/workflows/languages-sync.yml' + # pull_request: + # branches: [ "develop", "master" ] + # paths: + # - 'libs/datasource/i18n/**' + # - '.github/workflows/languages-sync.yml' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +# See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # The concurrency group contains the workflow name and the branch name for + # pull requests or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +jobs: + main: + strategy: + matrix: + node-version: [18] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use pnpm + uses: pnpm/action-setup@v2 + with: + version: 7 + + - name: Use Node.js ${{ matrix.node-version }} + # https://github.com/actions/setup-node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install node modules + run: pnpm install + + - name: Check Language Key + if: github.ref != 'refs/heads/master' + working-directory: ./packages/i18n + run: pnpm run sync-languages:check + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} + + - name: Sync Languages + if: github.ref == 'refs/heads/master' + working-directory: ./packages/i18n + run: pnpm run sync-languages + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} From 2867cb07c5bf5e52a5e76a2b8bf053c790439781 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 14:16:49 +0800 Subject: [PATCH 030/104] feat: add push and pr events --- .github/workflows/languages-sync.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml index 1bb8049e66..3cacc35749 100644 --- a/.github/workflows/languages-sync.yml +++ b/.github/workflows/languages-sync.yml @@ -1,16 +1,16 @@ name: Languages Sync on: - # push: - # branches: [ "develop", "master" ] - # paths: - # - 'libs/datasource/i18n/**' - # - '.github/workflows/languages-sync.yml' - # pull_request: - # branches: [ "develop", "master" ] - # paths: - # - 'libs/datasource/i18n/**' - # - '.github/workflows/languages-sync.yml' + push: + branches: ['master'] + paths: + - 'packages/i18n/**' + - '.github/workflows/languages-sync.yml' + pull_request: + branches: ['master'] + paths: + - 'packages/i18n/**' + - '.github/workflows/languages-sync.yml' workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. From b2f44f9fab9c720adc7119ae54b271d63f3a264b Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 14:29:18 +0800 Subject: [PATCH 031/104] chore: update readme --- packages/i18n/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/i18n/README.md b/packages/i18n/README.md index f8ad64372a..ec443f6fc8 100644 --- a/packages/i18n/README.md +++ b/packages/i18n/README.md @@ -36,6 +36,12 @@ const App = () => { }; ``` +## How the i18n workflow works? + +- When the `src/resources/en.json`(base language) updated and merged to the develop branch, will trigger the `languages-sync` action. +- The `languages-sync` action will check the base language and add missing translations to the Tolgee platform. +- This way, partners from the community can update the translations. + ## How to sync translations manually - Set token as environment variable @@ -45,7 +51,8 @@ export TOLGEE_API_KEY=tgpak_XXXXXXX ``` - Run the `sync-languages:check` to check all languages -- Run the `sync-languages` script to add new keys to the tolgee platform +- Run the `sync-languages` script to add new keys to the Tolgee platform +- Run the `download-resources` script to download the latest full-translation translation resources from the Tolgee platform ## References From b855f71ebfcfc990cf90d118d689c3429a831658 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 14:32:45 +0800 Subject: [PATCH 032/104] test: test ci --- packages/i18n/src/resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index 2831a8aafe..4dd82e101e 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -141,5 +141,6 @@ "Sign in": "Sign in to AFFiNE Cloud", "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost." + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost", + "test case": "test case" } From 082894d08cf24902eefc36958fec1f7738bd4dff Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 14:52:07 +0800 Subject: [PATCH 033/104] chore: restore en.json --- packages/i18n/src/resources/en.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index 4dd82e101e..2831a8aafe 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -141,6 +141,5 @@ "Sign in": "Sign in to AFFiNE Cloud", "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost", - "test case": "test case" + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost." } From 13de557d24c6afdb0689a3ec7da76d476de6530a Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Thu, 12 Jan 2023 14:59:44 +0800 Subject: [PATCH 034/104] chore: update BlockSuite version including introducing feature flag, adding upgrade npm script --- package.json | 3 +- packages/app/package.json | 6 +-- packages/data-center/package.json | 9 ++-- pnpm-lock.yaml | 68 ++++++++++++++----------------- update-dep.sh | 5 +++ 5 files changed, 45 insertions(+), 46 deletions(-) create mode 100755 update-dep.sh diff --git a/package.json b/package.json index b5b2f829d5..ff238c9c08 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "test:unit": "playwright test --config=playwright.config.unit.ts", "postinstall": "husky install", "notify": "node --experimental-modules scripts/notify.mjs", - "check:ci": "pnpm lint & pnpm test" + "check:ci": "pnpm lint & pnpm test", + "update:blocksuite": "chmod 755 update-dep.sh && sh update-dep.sh" }, "lint-staged": { "*": "prettier --write --ignore-unknown", diff --git a/packages/app/package.json b/packages/app/package.json index b68de96c0b..31fa964621 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,10 +11,10 @@ "dependencies": { "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.4.0-20230111164952-fea266a", - "@blocksuite/editor": "0.4.0-20230111164952-fea266a", + "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", + "@blocksuite/editor": "0.4.0-20230111171650-bc63456", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.4.0-20230111164952-fea266a", + "@blocksuite/store": "0.4.0-20230111171650-bc63456", "@emotion/css": "^11.10.0", "@emotion/react": "^11.10.4", "@emotion/server": "^11.10.0", diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 597e9e46a7..f97871413a 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -26,8 +26,9 @@ "typescript": "^4.8.4" }, "dependencies": { - "@blocksuite/blocks": "0.4.0-20230111164952-fea266a", - "@blocksuite/store": "0.4.0-20230111164952-fea266a", + "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", + "@blocksuite/editor": "0.4.0-20230111171650-bc63456", + "@blocksuite/store": "0.4.0-20230111171650-bc63456", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", @@ -36,8 +37,8 @@ "ky-universal": "^0.11.0", "lib0": "^0.2.58", "swr": "^2.0.0", - "yjs": "^13.5.44", - "y-protocols": "^1.0.5" + "y-protocols": "^1.0.5", + "yjs": "^13.5.44" }, "peerDependencies": { "@blocksuite/blocks": "0.3.1-*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1d36703e2..a7f96d5abe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,10 @@ importers: specifiers: '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.4.0-20230111164952-fea266a - '@blocksuite/editor': 0.4.0-20230111164952-fea266a + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456 '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.4.0-20230111164952-fea266a + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@emotion/css': ^11.10.0 '@emotion/react': ^11.10.4 '@emotion/server': ^11.10.0 @@ -81,10 +81,10 @@ importers: dependencies: '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.4.0-20230111164952-fea266a_yjs@13.5.44 - '@blocksuite/editor': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@emotion/css': 11.10.0 '@emotion/react': 11.10.4_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.0 @@ -123,8 +123,9 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.4.0-20230111164952-fea266a - '@blocksuite/store': 0.4.0-20230111164952-fea266a + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456 + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -140,8 +141,9 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.44 dependencies: - '@blocksuite/blocks': 0.4.0-20230111164952-fea266a_yjs@13.5.44 - '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -1455,12 +1457,12 @@ packages: to-fast-properties: 2.0.0 dev: true - /@blocksuite/blocks/0.4.0-20230111164952-fea266a_yjs@13.5.44: - resolution: {integrity: sha512-bphgTV5YkEfsqkvRJdbH8TevG6l9b9WHTliETJ4UksX4sxOsRDJk0v4XcluIDZXDv4TQ8fc45d5s5uaab48xQQ==} + /@blocksuite/blocks/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-7fpb++pT9laoyLFWl4h09v7TUqZ/9udMrC1qxdX2XFgMPJjg3MJ9RG+Ud2s/zqZ1SkU1+0hMBvJP5ci9vV44gw==} dependencies: - '@blocksuite/global': 0.4.0-20230111164952-fea266a - '@blocksuite/phasor': 0.4.0-20230111164952-fea266a_yjs@13.5.44 - '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/global': 0.4.0-20230111171650-bc63456 + '@blocksuite/phasor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@tldraw/intersect': 1.8.0 autosize: 5.0.2 highlight.js: 11.7.0 @@ -1476,11 +1478,11 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-20230111164952-fea266a_yjs@13.5.44: - resolution: {integrity: sha512-pVHH9nu9FwQErrPI6dHfMUCVtPEaNuB4PhHmyrcrVIgTGaGKdAQZ7PrsEqvjeWnIoX2l6s4u9XCFgdAsxybSfQ==} + /@blocksuite/editor/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-NbghDNWDGHXXfEqgnNhbw7zewGRyx9LUzOv1FmY2WVhzDu02MSrTWxMduChH1/tfLHRLe6jusmZKS9BNSUPynA==} dependencies: - '@blocksuite/blocks': 0.4.0-20230111164952-fea266a_yjs@13.5.44 - '@blocksuite/store': 0.4.0-20230111164952-fea266a_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 lit: 2.6.0 marked: 4.2.5 turndown: 7.1.1 @@ -1491,8 +1493,8 @@ packages: - yjs dev: false - /@blocksuite/global/0.4.0-20230111164952-fea266a: - resolution: {integrity: sha512-R2nXYIfyBaSMbLGF/aOUgRPFpWYs+bbK1/E9wChQGvC1D8UhQ6WRUt/khzM/GpdvnmIhmMyolJZ6LjEjGAo6Wg==} + /@blocksuite/global/0.4.0-20230111171650-bc63456: + resolution: {integrity: sha512-/Kqg73vPLzxiWp6UqRmRoKfYmH4Sij3mU52RJf9adyywZOdM5e9E1gvPP+Eruz/x2jJ1uzR5/ivFqp5t688/tg==} dev: false /@blocksuite/icons/2.0.4_w5j4k42lgipnm43s3brx6h3c34: @@ -1505,20 +1507,20 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.4.0-20230111164952-fea266a_yjs@13.5.44: - resolution: {integrity: sha512-AHxLIHi2s3fcfzbx8URVer3LGlZnVKvW+ttpRKIm8a3vkZqaXwb9+8gL8Ajh6YkOvf9Nb1Y5471978284BwCfw==} + /@blocksuite/phasor/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-fzmrG8KVJXkm5YyvHpPG1RRFhXjzuOey8OIoDu+/z87n9HJc4SkOd9JKH6wEL37F7P5ZoEM9Yl9YHxQjUc4/CA==} peerDependencies: yjs: ^13 dependencies: yjs: 13.5.44 dev: false - /@blocksuite/store/0.4.0-20230111164952-fea266a_yjs@13.5.44: - resolution: {integrity: sha512-2iMDGtbrFK2AO8+j17Z1kpsVzpkFY91+IMD2lorqlGrK8zj2Ane8JypcARFXJJ6rG8yRbB+P8GDLTXXvj+ZgmQ==} + /@blocksuite/store/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-f/PKFPadA0KZq/wSLxxlS29c4SDuMfzHN1/gdrxFEIY0gC8caK2jZnT4K62R9Nquik/mXL60h8fBVAkQ0KbHzg==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-20230111164952-fea266a + '@blocksuite/global': 0.4.0-20230111171650-bc63456 '@types/flexsearch': 0.7.3 '@types/quill': 1.3.10 buffer: 6.0.3 @@ -2511,10 +2513,6 @@ packages: resolution: {integrity: sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==} dev: false - /@lit/reactive-element/1.5.0: - resolution: {integrity: sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==} - dev: false - /@lit/reactive-element/1.6.0: resolution: {integrity: sha512-33H04h4tx9NVEADti0haZTNxssCnqZlMlyjri5k9kwDWAe2W1iENroZt7VWwmsPhlWUD8sSoPXSHqd0DdL29Pw==} dependencies: @@ -6212,8 +6210,8 @@ packages: /lit-element/3.2.2: resolution: {integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==} dependencies: - '@lit/reactive-element': 1.5.0 - lit-html: 2.5.0 + '@lit/reactive-element': 1.6.0 + lit-html: 2.6.0 dev: false /lit-html/2.4.0: @@ -6222,12 +6220,6 @@ packages: '@types/trusted-types': 2.0.2 dev: false - /lit-html/2.5.0: - resolution: {integrity: sha512-bLHosg1XL3JRUcKdSVI0sLCs0y1wWrj2sqqAN3cZ7bDDPNgmDHH29RV48x6Wz3ZmkxIupaE+z7uXSZ/pXWAO1g==} - dependencies: - '@types/trusted-types': 2.0.2 - dev: false - /lit-html/2.6.0: resolution: {integrity: sha512-slNAAYfvC7LxeryDOnPFl5uTpxGYGJ6UR9SFmfY+gQ+sf30z1atDPXlgjcSTtwymNdlwDhfGjq+EemQRXp9z1g==} dependencies: diff --git a/update-dep.sh b/update-dep.sh new file mode 100755 index 0000000000..3c9e1cd39a --- /dev/null +++ b/update-dep.sh @@ -0,0 +1,5 @@ +#!/bin/bash +cd packages/app +pnpm i @blocksuite/store@nightly @blocksuite/blocks@nightly @blocksuite/editor@nightly +cd ../data-center +pnpm i @blocksuite/store@nightly @blocksuite/blocks@nightly @blocksuite/editor@nightly From 3d6361ba3d566f84b76fffc74dcd866dcf5c3446 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 15:02:23 +0800 Subject: [PATCH 035/104] feat: add en.json codeOwners --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f80d334591..98be545ece 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,3 @@ **/project.json @darkskygit **/pnpm-lock.yaml @darkskygit +**/en.json @JimmFly \ No newline at end of file From 9ae9bb8092f9e050c7332ba827adf596f6166c9c Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Thu, 12 Jan 2023 15:11:49 +0800 Subject: [PATCH 036/104] feat: add affine request error msg --- packages/data-center/src/datacenter.ts | 2 +- packages/data-center/src/message/code.ts | 58 ++++++++ packages/data-center/src/message/message.ts | 32 +++-- .../data-center/src/provider/affine/affine.ts | 25 ++-- .../src/provider/affine/apis/request.ts | 16 ++- .../src/provider/affine/apis/workspace.ts | 133 +++++++++++++----- packages/data-center/src/provider/base.ts | 9 +- .../data-center/src/provider/local/local.ts | 2 +- packages/data-center/src/types/index.ts | 1 + 9 files changed, 217 insertions(+), 61 deletions(-) diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index 0e6dee8271..551fa009cf 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -23,7 +23,7 @@ export class DataCenter { private readonly _workspaceUnitCollection = new WorkspaceUnitCollection(); private readonly _logger = getLogger('dc'); private _workspaceInstances: Map = new Map(); - private _messageCenter = new MessageCenter(); + private _messageCenter = MessageCenter.getInstance(); /** * A mainProvider must exist as the only data trustworthy source. */ diff --git a/packages/data-center/src/message/code.ts b/packages/data-center/src/message/code.ts index 271ffc8d38..d7df926960 100644 --- a/packages/data-center/src/message/code.ts +++ b/packages/data-center/src/message/code.ts @@ -1,3 +1,61 @@ export enum MessageCode { loginError, + noPermission, + loadListFailed, + getDetailFailed, + createWorkspaceFailed, + getMembersFailed, + updateWorkspaceFailed, + deleteWorkspaceFailed, + inviteMemberFailed, + removeMemberFailed, + acceptInvitingFailed, + getBlobFailed, + leaveWorkspaceFailed, + downloadWorkspaceFailed, } + +export const messages = { + [MessageCode.loginError]: { + message: 'Login failed', + }, + [MessageCode.noPermission]: { + message: 'No permission', + }, + [MessageCode.loadListFailed]: { + message: 'Load list failed', + }, + [MessageCode.getDetailFailed]: { + message: 'Get detail failed', + }, + [MessageCode.createWorkspaceFailed]: { + message: 'Create workspace failed', + }, + [MessageCode.getMembersFailed]: { + message: 'Get members failed', + }, + [MessageCode.updateWorkspaceFailed]: { + message: 'Update workspace failed', + }, + [MessageCode.deleteWorkspaceFailed]: { + message: 'Delete workspace failed', + }, + [MessageCode.inviteMemberFailed]: { + message: 'Invite member failed', + }, + [MessageCode.removeMemberFailed]: { + message: 'Remove member failed', + }, + [MessageCode.acceptInvitingFailed]: { + message: 'Accept inviting failed', + }, + [MessageCode.getBlobFailed]: { + message: 'Get blob failed', + }, + [MessageCode.leaveWorkspaceFailed]: { + message: 'Leave workspace failed', + }, + [MessageCode.downloadWorkspaceFailed]: { + message: 'Download workspace failed', + }, +}; diff --git a/packages/data-center/src/message/message.ts b/packages/data-center/src/message/message.ts index 6de9c75795..4becebc2ff 100644 --- a/packages/data-center/src/message/message.ts +++ b/packages/data-center/src/message/message.ts @@ -1,24 +1,36 @@ import { Observable } from 'lib0/observable'; import { Message } from '../types'; -import { MessageCode } from './code.js'; +import { MessageCode, messages } from './code.js'; export class MessageCenter extends Observable { + private _messages: Record> = + messages; constructor() { super(); } - public send(message: MessageCode) { - this.emit('message', [message]); + static instance: MessageCenter; + + static getInstance() { + if (!MessageCenter.instance) { + MessageCenter.instance = new MessageCenter(); + } + return MessageCenter.instance; + } + + static messageCode = MessageCode; + + public getMessageSender(provider: string) { + return this._send.bind(this, provider); + } + + private _send(provider: string, messageCode: MessageCode) { + this.emit('message', [ + { ...this._messages[messageCode], provider, code: messageCode }, + ]); } public onMessage(callback: (message: Message) => void) { this.on('message', callback); } - - private messages: Record = { - [MessageCode.loginError]: { - code: MessageCode.loginError, - message: 'Login failed', - }, - }; } diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index 5abb451e62..d4c4027772 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -2,7 +2,6 @@ import { BaseProvider } from '../base.js'; import type { ProviderConstructorParams, CreateWorkspaceInfoParams, - WorkspaceMeta0, } from '../base'; import type { User } from '../../types'; import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; @@ -12,8 +11,6 @@ import { WebsocketProvider } from './sync.js'; // import { IndexedDBProvider } from '../local/indexeddb'; import { getApis, Workspace } from './apis/index.js'; import type { Apis, WorkspaceDetail, Callback } from './apis'; -import { setDefaultAvatar } from '../utils.js'; -import { MessageCode } from '../../message/index.js'; import { token } from './apis/token.js'; import { WebsocketClient } from './channel'; import { @@ -24,6 +21,7 @@ import { import { WorkspaceUnit } from '../../workspace-unit.js'; import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js'; import type { SyncMode } from '../../workspace-unit'; +import { MessageCenter } from 'src/message/message.js'; type ChannelMessage = { ws_list: Workspace[]; @@ -42,7 +40,6 @@ const { export class AffineProvider extends BaseProvider { public id = 'affine'; - private _workspacesCache: Map = new Map(); private _onTokenRefresh?: Callback = undefined; private _wsMap: Map = new Map(); private _apis: Apis; @@ -121,7 +118,7 @@ export class AffineProvider extends BaseProvider { }, published: detail.public, memberCount: detail.member_count, - provider: 'affine', + provider: this.id, syncMode: 'core' as SyncMode, }; if (this._workspaces.get(id)) { @@ -207,7 +204,7 @@ export class AffineProvider extends BaseProvider { owner: undefined, published: w.public, memberCount: 1, - provider: 'affine', + provider: this.id, syncMode: 'core', }, this._apis @@ -232,7 +229,7 @@ export class AffineProvider extends BaseProvider { this._connectChannel(); } if (!user) { - this._messageCenter.send(MessageCode.loginError); + this._sendMessage(MessageCenter.messageCode.loginError); } } @@ -257,17 +254,17 @@ export class AffineProvider extends BaseProvider { } public override async clear(): Promise { - for (const w of this._workspacesCache.values()) { - if (w.room) { + for (const w of this._workspaces.list()) { + if (w.id) { try { - await this.deleteWorkspace(w.room); - this._workspaces.remove(w.room); + await this.deleteWorkspace(w.id); + this._workspaces.remove(w.id); } catch (e) { this._logger('has a problem of delete workspace ', e); } } } - this._workspacesCache.clear(); + this._workspaces.clear(); } public override async closeWorkspace(id: string) { @@ -313,7 +310,7 @@ export class AffineProvider extends BaseProvider { owner: await this.getUserInfo(), published: false, memberCount: 1, - provider: 'affine', + provider: this.id, syncMode: 'core', }); @@ -358,7 +355,7 @@ export class AffineProvider extends BaseProvider { owner: await this.getUserInfo(), published: false, memberCount: 1, - provider: 'affine', + provider: this.id, syncMode: 'core', }); diff --git a/packages/data-center/src/provider/affine/apis/request.ts b/packages/data-center/src/provider/affine/apis/request.ts index ce5b64eebe..2520b1d535 100644 --- a/packages/data-center/src/provider/affine/apis/request.ts +++ b/packages/data-center/src/provider/affine/apis/request.ts @@ -1,7 +1,11 @@ -import kyOrigin from 'ky'; import ky from 'ky-universal'; +import { MessageCenter } from '../../../message/index.js'; import { token } from './token.js'; +const messageCenter = MessageCenter.getInstance(); + +const _sendMessage = messageCenter.getMessageSender('affine'); + export const bareClient = ky.extend({ prefixUrl: 'http://localhost:8080', retry: 1, @@ -41,5 +45,15 @@ export const client = bareClient.extend({ request.headers.set('Authorization', token.token); }, ], + + beforeError: [ + error => { + const { response } = error; + if (response.status === 401) { + _sendMessage(MessageCenter.messageCode.noPermission); + } + return error; + }, + ], }, }); diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 6151946660..0ac62a203f 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -1,6 +1,19 @@ +import { MessageCenter } from 'src/message/message.js'; import { bareClient, client } from './request.js'; import type { User } from './user'; +const messageCenter = MessageCenter.getInstance(); + +const sendMessage = messageCenter.getMessageSender('affine'); + +const { messageCode } = MessageCenter; + +class RequestError extends Error { + constructor(message: string) { + super(message); + this.name = 'RequestError'; + } +} export interface GetWorkspaceDetailParams { id: string; } @@ -26,13 +39,18 @@ export interface Workspace { } export async function getWorkspaces(): Promise { - return client - .get('api/workspace', { - headers: { - 'Cache-Control': 'no-cache', - }, - }) - .json(); + try { + return client + .get('api/workspace', { + headers: { + 'Cache-Control': 'no-cache', + }, + }) + .json(); + } catch (error) { + sendMessage(messageCode.loadListFailed); + throw new RequestError('load list failed'); + } } export interface WorkspaceDetail extends Workspace { @@ -43,7 +61,13 @@ export interface WorkspaceDetail extends Workspace { export async function getWorkspaceDetail( params: GetWorkspaceDetailParams ): Promise { - return client.get(`api/workspace/${params.id}`).json(); + try { + const response = client.get(`api/workspace/${params.id}`); + return response.json(); + } catch (error) { + sendMessage(messageCode.getDetailFailed); + throw new RequestError('get detail failed'); + } } export interface Permission { @@ -74,7 +98,12 @@ export interface GetWorkspaceMembersParams { export async function getWorkspaceMembers( params: GetWorkspaceDetailParams ): Promise { - return client.get(`api/workspace/${params.id}/permission`).json(); + try { + return client.get(`api/workspace/${params.id}/permission`).json(); + } catch (error) { + sendMessage(messageCode.getMembersFailed); + throw new RequestError('get members failed'); + } } export interface CreateWorkspaceParams { @@ -84,7 +113,12 @@ export interface CreateWorkspaceParams { export async function createWorkspace( params: CreateWorkspaceParams ): Promise<{ id: string }> { - return client.post('api/workspace', { json: params }).json(); + try { + return client.post('api/workspace', { json: params }).json(); + } catch (error) { + sendMessage(messageCode.createWorkspaceFailed); + throw new RequestError('create workspace failed'); + } } export interface UpdateWorkspaceParams { @@ -95,13 +129,18 @@ export interface UpdateWorkspaceParams { export async function updateWorkspace( params: UpdateWorkspaceParams ): Promise<{ public: boolean | null }> { - return client - .post(`api/workspace/${params.id}`, { - json: { - public: params.public, - }, - }) - .json(); + try { + return client + .post(`api/workspace/${params.id}`, { + json: { + public: params.public, + }, + }) + .json(); + } catch (error) { + sendMessage(messageCode.updateWorkspaceFailed); + throw new RequestError('update workspace failed'); + } } export interface DeleteWorkspaceParams { @@ -111,7 +150,10 @@ export interface DeleteWorkspaceParams { export async function deleteWorkspace( params: DeleteWorkspaceParams ): Promise { - await client.delete(`api/workspace/${params.id}`); + await client.delete(`api/workspace/${params.id}`).catch(() => { + sendMessage(messageCode.deleteWorkspaceFailed); + throw new RequestError('delete workspace failed'); + }); } export interface InviteMemberParams { @@ -123,13 +165,18 @@ export interface InviteMemberParams { * Notice: Only support normal(contrast to private) workspace. */ export async function inviteMember(params: InviteMemberParams): Promise { - return client - .post(`api/workspace/${params.id}/permission`, { - json: { - email: params.email, - }, - }) - .json(); + try { + return client + .post(`api/workspace/${params.id}/permission`, { + json: { + email: params.email, + }, + }) + .json(); + } catch (error) { + sendMessage(messageCode.inviteMemberFailed); + throw new RequestError('invite member failed'); + } } export interface RemoveMemberParams { @@ -137,7 +184,10 @@ export interface RemoveMemberParams { } export async function removeMember(params: RemoveMemberParams): Promise { - await client.delete(`api/permission/${params.permissionId}`); + await client.delete(`api/permission/${params.permissionId}`).catch(() => { + sendMessage(messageCode.removeMemberFailed); + throw new RequestError('remove member failed'); + }); } export interface AcceptInvitingParams { @@ -147,7 +197,10 @@ export interface AcceptInvitingParams { export async function acceptInviting( params: AcceptInvitingParams ): Promise { - await bareClient.post(`api/invitation/${params.invitingCode}`); + await bareClient.post(`api/invitation/${params.invitingCode}`).catch(() => { + sendMessage(messageCode.acceptInvitingFailed); + throw new RequestError('accept inviting failed'); + }); } export async function uploadBlob(params: { blob: Blob }): Promise { @@ -157,7 +210,12 @@ export async function uploadBlob(params: { blob: Blob }): Promise { export async function getBlob(params: { blobId: string; }): Promise { - return client.get(`api/blob/${params.blobId}`).arrayBuffer(); + try { + return client.get(`api/blob/${params.blobId}`).arrayBuffer(); + } catch (error) { + sendMessage(messageCode.getBlobFailed); + throw new RequestError('get blob failed'); + } } export interface LeaveWorkspaceParams { @@ -165,15 +223,26 @@ export interface LeaveWorkspaceParams { } export async function leaveWorkspace({ id }: LeaveWorkspaceParams) { - await client.delete(`api/workspace/${id}/permission`).json(); + await client + .delete(`api/workspace/${id}/permission`) + .json() + .catch(() => { + sendMessage(messageCode.leaveWorkspaceFailed); + throw new RequestError('leave workspace failed'); + }); } export async function downloadWorkspace( workspaceId: string, published = false ): Promise { - if (published) { - return bareClient.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); + try { + if (published) { + return bareClient.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); + } + return client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); + } catch (error) { + sendMessage(messageCode.downloadWorkspaceFailed); + throw new RequestError('download workspace failed'); } - return client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); } diff --git a/packages/data-center/src/provider/base.ts b/packages/data-center/src/provider/base.ts index 653efb6bc6..0f0a23ead3 100644 --- a/packages/data-center/src/provider/base.ts +++ b/packages/data-center/src/provider/base.ts @@ -22,10 +22,15 @@ export type UpdateWorkspaceMetaParams = Partial< >; export class BaseProvider { + /** provider id */ public readonly id: string = 'base'; + /** workspace unit collection */ protected _workspaces!: WorkspaceUnitCollectionScope; protected _logger!: Logger; - protected _messageCenter!: MessageCenter; + /** send message with message center */ + protected _sendMessage!: ReturnType< + InstanceType['getMessageSender'] + >; public constructor({ logger, @@ -34,7 +39,7 @@ export class BaseProvider { }: ProviderConstructorParams) { this._logger = (logger || defaultLogger) as Logger; this._workspaces = workspaces; - this._messageCenter = messageCenter; + this._sendMessage = messageCenter.getMessageSender(this.id); } /** diff --git a/packages/data-center/src/provider/local/local.ts b/packages/data-center/src/provider/local/local.ts index ad71943067..4ceb2a7a73 100644 --- a/packages/data-center/src/provider/local/local.ts +++ b/packages/data-center/src/provider/local/local.ts @@ -100,7 +100,7 @@ export class LocalProvider extends BaseProvider { owner: undefined, syncMode: 'core', memberCount: 1, - provider: 'local', + provider: this.id, }); this._workspaces.add(workspaceUnit); this._storeWorkspaces(this._workspaces.list()); diff --git a/packages/data-center/src/types/index.ts b/packages/data-center/src/types/index.ts index ea85ded82f..33343f939f 100644 --- a/packages/data-center/src/types/index.ts +++ b/packages/data-center/src/types/index.ts @@ -25,4 +25,5 @@ export type Logger = ReturnType; export type Message = { code: number; message: string; + provider: string; }; From 819ab7417844ab49498ed37b8c6e62fd10348728 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Thu, 12 Jan 2023 15:24:40 +0800 Subject: [PATCH 037/104] feat: add cause of Request error --- .../src/provider/affine/apis/workspace.ts | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 0ac62a203f..0101832d28 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -9,9 +9,10 @@ const sendMessage = messageCenter.getMessageSender('affine'); const { messageCode } = MessageCenter; class RequestError extends Error { - constructor(message: string) { + constructor(message: string, cause: unknown | null = null) { super(message); this.name = 'RequestError'; + this.cause = cause; } } export interface GetWorkspaceDetailParams { @@ -49,7 +50,7 @@ export async function getWorkspaces(): Promise { .json(); } catch (error) { sendMessage(messageCode.loadListFailed); - throw new RequestError('load list failed'); + throw new RequestError('load list failed', error); } } @@ -66,7 +67,7 @@ export async function getWorkspaceDetail( return response.json(); } catch (error) { sendMessage(messageCode.getDetailFailed); - throw new RequestError('get detail failed'); + throw new RequestError('get detail failed', error); } } @@ -102,7 +103,7 @@ export async function getWorkspaceMembers( return client.get(`api/workspace/${params.id}/permission`).json(); } catch (error) { sendMessage(messageCode.getMembersFailed); - throw new RequestError('get members failed'); + throw new RequestError('get members failed', error); } } @@ -117,7 +118,7 @@ export async function createWorkspace( return client.post('api/workspace', { json: params }).json(); } catch (error) { sendMessage(messageCode.createWorkspaceFailed); - throw new RequestError('create workspace failed'); + throw new RequestError('create workspace failed', error); } } @@ -139,7 +140,7 @@ export async function updateWorkspace( .json(); } catch (error) { sendMessage(messageCode.updateWorkspaceFailed); - throw new RequestError('update workspace failed'); + throw new RequestError('update workspace failed', error); } } @@ -150,9 +151,9 @@ export interface DeleteWorkspaceParams { export async function deleteWorkspace( params: DeleteWorkspaceParams ): Promise { - await client.delete(`api/workspace/${params.id}`).catch(() => { + await client.delete(`api/workspace/${params.id}`).catch(error => { sendMessage(messageCode.deleteWorkspaceFailed); - throw new RequestError('delete workspace failed'); + throw new RequestError('delete workspace failed', error); }); } @@ -175,7 +176,7 @@ export async function inviteMember(params: InviteMemberParams): Promise { .json(); } catch (error) { sendMessage(messageCode.inviteMemberFailed); - throw new RequestError('invite member failed'); + throw new RequestError('invite member failed', error); } } @@ -184,9 +185,9 @@ export interface RemoveMemberParams { } export async function removeMember(params: RemoveMemberParams): Promise { - await client.delete(`api/permission/${params.permissionId}`).catch(() => { + await client.delete(`api/permission/${params.permissionId}`).catch(error => { sendMessage(messageCode.removeMemberFailed); - throw new RequestError('remove member failed'); + throw new RequestError('remove member failed', error); }); } @@ -197,10 +198,12 @@ export interface AcceptInvitingParams { export async function acceptInviting( params: AcceptInvitingParams ): Promise { - await bareClient.post(`api/invitation/${params.invitingCode}`).catch(() => { - sendMessage(messageCode.acceptInvitingFailed); - throw new RequestError('accept inviting failed'); - }); + await bareClient + .post(`api/invitation/${params.invitingCode}`) + .catch(error => { + sendMessage(messageCode.acceptInvitingFailed); + throw new RequestError('accept inviting failed', error); + }); } export async function uploadBlob(params: { blob: Blob }): Promise { @@ -214,7 +217,7 @@ export async function getBlob(params: { return client.get(`api/blob/${params.blobId}`).arrayBuffer(); } catch (error) { sendMessage(messageCode.getBlobFailed); - throw new RequestError('get blob failed'); + throw new RequestError('get blob failed', error); } } @@ -226,9 +229,9 @@ export async function leaveWorkspace({ id }: LeaveWorkspaceParams) { await client .delete(`api/workspace/${id}/permission`) .json() - .catch(() => { + .catch(error => { sendMessage(messageCode.leaveWorkspaceFailed); - throw new RequestError('leave workspace failed'); + throw new RequestError('leave workspace failed', error); }); } @@ -243,6 +246,6 @@ export async function downloadWorkspace( return client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); } catch (error) { sendMessage(messageCode.downloadWorkspaceFailed); - throw new RequestError('download workspace failed'); + throw new RequestError('download workspace failed', error); } } From a45040a95649fa56c9ecc6ddedcd868c7dc07037 Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Thu, 12 Jan 2023 16:13:26 +0800 Subject: [PATCH 038/104] fix: deleting bash script, using npm script to be cross platform compatible --- package.json | 2 +- update-dep.sh | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100755 update-dep.sh diff --git a/package.json b/package.json index ff238c9c08..43d76b7e12 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "postinstall": "husky install", "notify": "node --experimental-modules scripts/notify.mjs", "check:ci": "pnpm lint & pnpm test", - "update:blocksuite": "chmod 755 update-dep.sh && sh update-dep.sh" + "update:blocksuite": "pnpm i --filter @affine/app --filter @affine/datacenter @blocksuite/blocks@nightly @blocksuite/store@nightly @blocksuite/editor@nightly" }, "lint-staged": { "*": "prettier --write --ignore-unknown", diff --git a/update-dep.sh b/update-dep.sh deleted file mode 100755 index 3c9e1cd39a..0000000000 --- a/update-dep.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd packages/app -pnpm i @blocksuite/store@nightly @blocksuite/blocks@nightly @blocksuite/editor@nightly -cd ../data-center -pnpm i @blocksuite/store@nightly @blocksuite/blocks@nightly @blocksuite/editor@nightly From 69e30ba8884e6f95e45215d942202be42420b256 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 17:02:45 +0800 Subject: [PATCH 039/104] chore: remove hover tip --- .../src/components/header/EditorHeader.tsx | 12 ++++++--- .../components/header/QuickSearchButton.tsx | 25 ++++++++----------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/app/src/components/header/EditorHeader.tsx b/packages/app/src/components/header/EditorHeader.tsx index 491174f578..7662eccbae 100644 --- a/packages/app/src/components/header/EditorHeader.tsx +++ b/packages/app/src/components/header/EditorHeader.tsx @@ -1,11 +1,17 @@ import React, { useEffect, useState } from 'react'; -import { StyledSwitchWrapper, StyledTitle, StyledTitleWrapper } from './styles'; +import { + StyledSearchArrowWrapper, + StyledSwitchWrapper, + StyledTitle, + StyledTitleWrapper, +} from './styles'; import { Content } from '@/ui/layout'; import { useAppState } from '@/providers/app-state-provider/context'; import EditorModeSwitch from '@/components/editor-mode-switch'; import Header from './Header'; import usePropsUpdated from '@/hooks/use-props-updated'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; +import QuickSearchButton from './QuickSearchButton'; export const EditorHeader = () => { const [title, setTitle] = useState(''); @@ -58,9 +64,9 @@ export const EditorHeader = () => { /> {title} - {/* + - */} + )} diff --git a/packages/app/src/components/header/QuickSearchButton.tsx b/packages/app/src/components/header/QuickSearchButton.tsx index f5d2023500..64e3657448 100644 --- a/packages/app/src/components/header/QuickSearchButton.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -1,28 +1,23 @@ import React from 'react'; import { IconButton, IconButtonProps } from '@/ui/button'; -import { Tooltip } from '@/ui/tooltip'; import { ArrowDownIcon } from '@blocksuite/icons'; import { useModal } from '@/providers/GlobalModalProvider'; -import { useTranslation } from '@affine/i18n'; export const QuickSearchButton = ({ onClick, ...props }: Omit) => { const { triggerQuickSearchModal } = useModal(); - const { t } = useTranslation(); return ( - - { - onClick?.(e); - triggerQuickSearchModal(); - }} - > - - - + { + onClick?.(e); + triggerQuickSearchModal(); + }} + > + + ); }; From 251cfc2340d850ad7d3eac2ddfd36b41f63109e6 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Thu, 12 Jan 2023 17:16:44 +0800 Subject: [PATCH 040/104] fix: message in affine --- packages/data-center/src/provider/affine/affine.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index 309af9570d..944d19c7fe 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -21,7 +21,7 @@ import { import { WorkspaceUnit } from '../../workspace-unit.js'; import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js'; import type { SyncMode } from '../../workspace-unit'; -import { MessageCenter } from 'src/message/message.js'; +import { MessageCenter } from '../../message/index.js'; type ChannelMessage = { ws_list: Workspace[]; From 11edef1bbdc893045ecf8c0d99756db121055878 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Thu, 12 Jan 2023 17:18:40 +0800 Subject: [PATCH 041/104] feat: add new workspaces by arrays --- .../data-center/src/provider/affine/affine.ts | 30 +++++++++++++++---- .../src/provider/affine/apis/workspace.ts | 2 +- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index d4c4027772..c389363abb 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -21,7 +21,7 @@ import { import { WorkspaceUnit } from '../../workspace-unit.js'; import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js'; import type { SyncMode } from '../../workspace-unit'; -import { MessageCenter } from 'src/message/message.js'; +import { MessageCenter } from '../../message/index.js'; type ChannelMessage = { ws_list: Workspace[]; @@ -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,26 @@ 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); } - }); + } + if (addedWorkspaces.length) { + // add workspaces + this._workspaces.add(addedWorkspaces); + } + if (removeWorkspaceList.length) { + // remove workspaces + removeWorkspaceList.forEach(id => { + this._workspaces.remove(id); + }); + } } private _getWebsocketProvider(workspace: BlocksuiteWorkspace) { diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 0101832d28..f2455810eb 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -1,4 +1,4 @@ -import { MessageCenter } from 'src/message/message.js'; +import { MessageCenter } from '../../../message/index.js'; import { bareClient, client } from './request.js'; import type { User } from './user'; From 03a827e75952d7002e752221a22be4ce3c923ad1 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 17:28:18 +0800 Subject: [PATCH 042/104] chore: update searchArrowButton style --- .../components/header/QuickSearchButton.tsx | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/app/src/components/header/QuickSearchButton.tsx b/packages/app/src/components/header/QuickSearchButton.tsx index a1c68ffba8..dfc00eef14 100644 --- a/packages/app/src/components/header/QuickSearchButton.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -1,12 +1,10 @@ import React from 'react'; import { IconButton, IconButtonProps } from '@/ui/button'; -import { Tooltip } from '@/ui/tooltip'; import { ArrowDownIcon } from '@blocksuite/icons'; import { useModal } from '@/providers/GlobalModalProvider'; -import { useTranslation } from '@affine/i18n'; import { styled } from '@/styles'; -const StyledIconButtonWithAnimate = styled(IconButton)(() => { +const StyledIconButtonWithAnimate = styled(IconButton)(({ theme }) => { return { svg: { transition: 'transform 0.15s ease-in-out', @@ -15,6 +13,9 @@ const StyledIconButtonWithAnimate = styled(IconButton)(() => { svg: { transform: 'translateY(3px)', }, + '::after': { + background: theme.colors.pageBackground, + }, }, }; }); @@ -23,20 +24,17 @@ export const QuickSearchButton = ({ ...props }: Omit) => { const { triggerQuickSearchModal } = useModal(); - const { t } = useTranslation(); return ( - - { - onClick?.(e); - triggerQuickSearchModal(); - }} - > - - - + { + onClick?.(e); + triggerQuickSearchModal(); + }} + > + + ); }; From a0c9f9a49c25668cc85df6e7cd1de7232b0cad59 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Thu, 12 Jan 2023 17:33:12 +0800 Subject: [PATCH 043/104] feat: add backhome --- packages/app/src/components/404/index.tsx | 16 +++++++++++++++- packages/app/src/pages/404.tsx | 4 ---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/404/index.tsx b/packages/app/src/components/404/index.tsx index 8ed4232807..36f1b90a34 100644 --- a/packages/app/src/components/404/index.tsx +++ b/packages/app/src/components/404/index.tsx @@ -1,10 +1,24 @@ import { NotFoundTitle, PageContainer } from './styles'; import { useTranslation } from '@affine/i18n'; +import { Button } from '@/ui/button'; +import { useRouter } from 'next/router'; export const NotfoundPage = () => { const { t } = useTranslation(); + const router = useRouter(); return ( - {t('404 - Page Not Found')} + + {t('404 - Page Not Found')} +

+ +

+
); }; diff --git a/packages/app/src/pages/404.tsx b/packages/app/src/pages/404.tsx index 74f25f07ed..0eef5261e5 100644 --- a/packages/app/src/pages/404.tsx +++ b/packages/app/src/pages/404.tsx @@ -1,9 +1,5 @@ import NotfoundPage from '@/components/404'; -import { useAppState } from '@/providers/app-state-provider'; export default function Custom404() { - const { workspaceList } = useAppState(); - console.log('workspaceList: ', workspaceList); - return ; } From 0b623a522b828f8bab1922671fa37d1bf634f515 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Thu, 12 Jan 2023 17:38:18 +0800 Subject: [PATCH 044/104] feat: add remove workspace by ids --- .../data-center/src/provider/affine/affine.ts | 16 ++---- .../src/workspace-unit-collection.ts | 54 ++++++++++++------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index c389363abb..88dab8485b 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -141,16 +141,10 @@ export class AffineProvider extends BaseProvider { addedWorkspaces.push(workspaceUnit); } } - if (addedWorkspaces.length) { - // add workspaces - this._workspaces.add(addedWorkspaces); - } - if (removeWorkspaceList.length) { - // remove workspaces - removeWorkspaceList.forEach(id => { - this._workspaces.remove(id); - }); - } + // add workspaces + this._workspaces.add(addedWorkspaces); + // remove workspaces + this._workspaces.remove(removeWorkspaceList); } private _getWebsocketProvider(workspace: BlocksuiteWorkspace) { @@ -174,7 +168,7 @@ export class AffineProvider extends BaseProvider { blocksuiteWorkspace: BlocksuiteWorkspace, published = false ) { - const { doc, room: workspaceId } = blocksuiteWorkspace; + const { room: workspaceId } = blocksuiteWorkspace; assert(workspaceId, 'Blocksuite Workspace without room(workspaceId).'); const updates = await this._apis.downloadWorkspace(workspaceId, published); await applyUpdate(blocksuiteWorkspace, new Uint8Array(updates)); diff --git a/packages/data-center/src/workspace-unit-collection.ts b/packages/data-center/src/workspace-unit-collection.ts index 7d55762560..b51f5d160f 100644 --- a/packages/data-center/src/workspace-unit-collection.ts +++ b/packages/data-center/src/workspace-unit-collection.ts @@ -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; }; From dedf03ae5063db3d1300ef1735b65c169f1bc5c9 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 17:47:46 +0800 Subject: [PATCH 045/104] feat: add temporary language switch button --- .../components/workspace-slider-bar/index.tsx | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 4663afa56a..b81204f1e9 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -70,7 +70,7 @@ export const WorkSpaceSliderBar = () => { const { currentWorkspace } = useAppState(); const { openPage, createPage } = usePageHelper(); const router = useRouter(); - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const [showTip, setShowTip] = useState(false); const [show, setShow] = useLocalStorage('AFFiNE_SLIDE_BAR', false, true); const currentWorkspaceId = currentWorkspace?.id; @@ -84,7 +84,9 @@ export const WorkSpaceSliderBar = () => { ? `/workspace/${currentWorkspaceId}/setting` : '', }; - + const changeLanguage = (event: string) => { + i18n.changeLanguage(event); + }; return ( <> @@ -176,6 +178,20 @@ export const WorkSpaceSliderBar = () => { {t('Trash')} + { + changeLanguage('en'); + }} + > + change to English + + { + changeLanguage('zh-Hans'); + }} + > + 切换到中文 + { const pageId = await createPage(); From cf6b1731b02c50bcf9a208aa961babfca9a4bddd Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 17:53:11 +0800 Subject: [PATCH 046/104] chore: update translation --- packages/i18n/src/resources/en.json | 8 +- packages/i18n/src/resources/index.ts | 11 ++ packages/i18n/src/resources/zh-Hans.json | 148 +++++++++++++++++++++++ 3 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 packages/i18n/src/resources/zh-Hans.json diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index 2831a8aafe..6886bbacb5 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -15,7 +15,6 @@ "Add to favourites": "Add to favourites", "Paper": "Paper", "Edgeless": "Edgeless", - "Jump to": "Jump to", "Convert to ": "Convert to ", "Page": "Page", "Export": "Export", @@ -57,12 +56,13 @@ "Reduce indent": "Reduce indent", "Markdown Syntax": "Markdown Syntax", "Divider": "Divider", - "404 - Page Not Found": "404 - Page Not Found", "Once deleted, you can't undo this action": { "": "Once deleted, you can't undo this action." }, "Remove from favourites": "Remove from favourites", "Removed from Favourites": "Removed from Favourites", + "Jump to": "Jump to", + "404 - Page Not Found": "404 - Page Not Found", "New Workspace": "New Workspace", "Workspace description": "Workspace is your virtual space to capture, create and plan as just one person or together as a team.", "Create": "Create", @@ -141,5 +141,7 @@ "Sign in": "Sign in to AFFiNE Cloud", "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost." + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost.", + "core": "core", + "all": "all" } diff --git a/packages/i18n/src/resources/index.ts b/packages/i18n/src/resources/index.ts index 2081ad8aaf..cf5c5fc729 100644 --- a/packages/i18n/src/resources/index.ts +++ b/packages/i18n/src/resources/index.ts @@ -2,6 +2,7 @@ // Run `pnpm run download-resources` to regenerate. // To overwrite this, please overwrite download.ts script. import en from './en.json'; +import zh_Hans from './zh-Hans.json'; export const LOCALES = [ { @@ -14,4 +15,14 @@ export const LOCALES = [ completeRate: 1, res: en, }, + { + id: 1000040004, + name: 'Simplified Chinese', + tag: 'zh-Hans', + originalName: '简体中文', + flagEmoji: '🇨🇳', + base: false, + completeRate: 1, + res: zh_Hans, + }, ] as const; diff --git a/packages/i18n/src/resources/zh-Hans.json b/packages/i18n/src/resources/zh-Hans.json new file mode 100644 index 0000000000..2a2e17c660 --- /dev/null +++ b/packages/i18n/src/resources/zh-Hans.json @@ -0,0 +1,148 @@ +{ + "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", + "Quick search": "快速搜索", + "All pages": "全部页面", + "Favourites": "收藏夹", + "No item": "无项目", + "Import": "导入", + "Trash": "垃圾箱", + "New Page": "新建页面", + "New Keyword Page": "新建 “{{query}}“ 为标题的页面 ", + "Find 0 result": "找到 0 个结果", + "Find results": "找到 {{number}} 个结果", + "Collapse sidebar": "折叠侧边栏", + "Expand sidebar": "展开侧边栏", + "Added to Favourites": "已收藏", + "Add to favourites": "加入收藏", + "Paper": "文档", + "Edgeless": "无界", + "Convert to ": "转换为", + "Page": "页面", + "Export": "导出", + "Export to HTML": "导出为 HTML", + "Export to Markdown": "导出为 Markdown", + "Delete": "删除", + "Title": "标题", + "Untitled": "未命名", + "Created": "已创建", + "Updated": "已更新", + "Open in new tab": "在新标签页打开", + "Favourite": "收藏", + "Favourited": "已收藏", + "Delete page?": "确定要删除页面?", + "Delete permanently?": "是否永久删除?", + "will be moved to Trash": "{{title}} 将被移到垃圾箱", + "Once deleted, you can't undo this action": { + "": "一旦删除,将无法撤销!" + }, + "Moved to Trash": "已移到垃圾箱", + "Permanently deleted": "已永久删除", + "restored": "{{title}} 已恢复", + "Cancel": "取消", + "Keyboard Shortcuts": "键盘快捷键", + "Contact Us": "联系我们", + "Official Website": "官网", + "Get in touch!": "保持联络!", + "AFFiNE Community": "AFFiNE 社区", + "How is AFFiNE Alpha different?": "AFFiNE Alpha有何不同?", + "Shortcuts": "快捷键", + "Undo": "撤销", + "Redo": "重做", + "Bold": "粗体", + "Italic": "斜体", + "Underline": "下划线", + "Strikethrough": "删除线", + "Inline code": "行内代码", + "Code block": "代码块", + "Link": "超链接(选定文本)", + "Body text": "正文", + "Heading": "标题 {{number}}", + "Increase indent": "增加缩进", + "Reduce indent": "减少缩进", + "Markdown Syntax": "Markdown 语法", + "Divider": "分割线", + "404 - Page Not Found": "404 - 页面不见了", + "Remove from favourites": "从收藏中移除", + "Removed from Favourites": "已从收藏中移除", + "New Workspace": "新建工作区", + "Workspace description": "工作区是为个人和团队进行引用、创建和规划的虚拟空间。", + "Create": "创建", + "Select": "选择", + "Text": "文本(即将上线)", + "Shape": "图形", + "Sticky": "便利贴(即将上线)", + "Pen": "笔(即将上线)", + "Connector": "链接(即将上线)", + "Upload": "上传", + "Restore it": "恢复TA", + "TrashButtonGroupTitle": "永久删除", + "TrashButtonGroupDescription": "一旦删除,将无法撤消此操作。确定吗?", + "Delete permanently": "永久删除", + "Quick search placeholder": "快速搜索...", + "Quick search placeholder2": "在{{workspace}} 中搜索", + "Settings": "设置", + "recommendBrowser": "建议使用 <1>Chrome 浏览器以获得最佳体验。", + "upgradeBrowser": "请升级到最新版本的 Chrome 以获得最佳体验。", + "Invite Members": "邀请成员", + "Invite placeholder": "搜索邮件(仅支持Gmail)", + "Non-Gmail": "不支持非Gmail邮箱", + "Invite": "邀请", + "Loading": "加载中...", + "NotLoggedIn": "当前未登录", + "ClearData": "清除本地数据", + "Continue with Google": "谷歌登录以继续", + "Set up an AFFiNE account to sync data": "设置AFFiNE帐户以同步数据", + "Stay logged out": "保持登出状态", + "All changes are saved locally": "所有改动已保存到本地", + "Ooops!": "啊哦!", + "mobile device": "貌似你正在移动设备上浏览。", + "mobile device description": "我们仍在进行移动端的支持工作,建议使用桌面设备。", + "Got it": "知道了", + "emptyAllPages": "此工作区为空。创建新页面并开始编辑。", + "emptyFavourite": "单击“添加到收藏夹”,页面将显示在此处。", + "emptyTrash": "单击“添加到垃圾箱”,页面将显示在此处。", + "still designed": "(此页面仍在设计中。)", + "My Workspaces": "我的工作区", + "Create Or Import": "创建或导入", + "Tips": "提示:", + "login success": "登录成功", + "Sign in": "登录 AFFiNE 云", + "Sign out": "登出 AFFiNE 云", + "Delete Workspace": "删除工作空间", + "Delete Workspace Description": "正在删除 (<1>{{workspace}}) ,此操作无法撤销,所有内容将会丢失。", + "Delete Workspace Description2": "正在删除(<1>{{workspace}}),将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。", + "Delete Workspace placeholder": "请输入”Delete“以确认", + "Leave Workspace": "退出工作区", + "Leave Workspace Description": "退出后,您将无法再访问此工作区的内容。", + "Jump to": "跳转到", + "Leave": "退出", + "Workspace Icon": "工作区图标", + "Workspace Name": "工作区名称", + "Workspace Type": "工作区类型", + "Export Workspace": "导出工作区 <1>{{workspace}} 即将上线", + "Users": "用户", + "Access level": "访问权限", + "Pending": "待定", + "Collaboration Description": "与其他成员协作需要AFFiNE云服务支持。", + "Enable AFFiNE Cloud": "启用 AFFiNE 云服务", + "Enable AFFiNE Cloud Description": "如启用,此工作区中的数据将通过AFFiNE Cloud进行备份和同步。", + "Enable": "启动", + "Sign in and Enable": "登录并启用", + "Skip": "跳过", + "Publishing": "发布到web需要AFFiNE云服务。", + "Share with link": "通过链接分享", + "Copy Link": "复制链接", + "Publishing Description": "发布到web后,所有人都可以通过链接查看此工作区的内容。", + "Stop publishing": "中止发布", + "Publish to web": "发布到web", + "Sync Description": "{{workspaceName}}是本地工作区,所有数据都存储在当前设备上。您可以为此工作区启用AFFiNE Cloud,以使数据与云端保持同步。", + "Sync Description2": "<1>{{workspaceName}}是云端工作区。所有数据将同步并保存到AFFiNE Cloud。", + "Download data to device": "下载{{CoreOrAll}}数据到设备", + "General": "常规", + "Sync": "同步", + "Collaboration": "协作", + "Publish": "发布", + "Workspace Settings": "工作区设置", + "core": "核心", + "all": "全部" +} From cf47098631db5134d66ea78e153ea2b75380ce01 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Thu, 12 Jan 2023 18:13:44 +0800 Subject: [PATCH 047/104] feat: fix access permission api --- packages/data-center/src/datacenter.ts | 3 ++- packages/data-center/src/provider/affine/affine.ts | 4 ++-- .../src/provider/affine/apis/workspace.ts | 14 +++++++------- packages/data-center/src/provider/base.ts | 7 +++++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index 551fa009cf..e8876ac2d6 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -416,13 +416,14 @@ export class DataCenter { /** * accept invitation * @param {string} inviteCode + * @returns {Promise} 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) { diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index 88dab8485b..6e14e82513 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -399,7 +399,7 @@ export class AffineProvider extends BaseProvider { return this._apis.getWorkspaceMembers({ id }); } - public override async acceptInvitation(invitingCode: string): Promise { - await this._apis.acceptInviting({ invitingCode }); + public override async acceptInvitation(invitingCode: string) { + return await this._apis.acceptInviting({ invitingCode }); } } diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index f2455810eb..09574b3e82 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -197,13 +197,13 @@ export interface AcceptInvitingParams { export async function acceptInviting( params: AcceptInvitingParams -): Promise { - await bareClient - .post(`api/invitation/${params.invitingCode}`) - .catch(error => { - sendMessage(messageCode.acceptInvitingFailed); - throw new RequestError('accept inviting failed', error); - }); +): Promise { + 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 { diff --git a/packages/data-center/src/provider/base.ts b/packages/data-center/src/provider/base.ts index 0f0a23ead3..eb9a68d748 100644 --- a/packages/data-center/src/provider/base.ts +++ b/packages/data-center/src/provider/base.ts @@ -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 { + public async acceptInvitation( + inviteCode: string + ): Promise { inviteCode; - return; + return null; } } From 32a5788504ac9c78ffef66a27d0c6670ccde491f Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Thu, 12 Jan 2023 18:36:57 +0800 Subject: [PATCH 048/104] feat: add invite info --- .../app/src/hooks/use-workspace-helper.ts | 9 +++ .../app/src/pages/invite/[invite_code].tsx | 63 +++++++++---------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/packages/app/src/hooks/use-workspace-helper.ts b/packages/app/src/hooks/use-workspace-helper.ts index f1dee901d3..480ba409c1 100644 --- a/packages/app/src/hooks/use-workspace-helper.ts +++ b/packages/app/src/hooks/use-workspace-helper.ts @@ -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, }; }; diff --git a/packages/app/src/pages/invite/[invite_code].tsx b/packages/app/src/pages/invite/[invite_code].tsx index e007a6cd25..22122db138 100644 --- a/packages/app/src/pages/invite/[invite_code].tsx +++ b/packages/app/src/pages/invite/[invite_code].tsx @@ -1,44 +1,36 @@ +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 ( - - {avatar ? ( - - ) : ( - {name.slice(0, 1)} - )} - {name} - - ); -}; +// const User = ({ name, avatar }: { name: string; avatar?: string }) => { +// return ( +// +// {avatar ? ( +// +// ) : ( +// {name.slice(0, 1)} +// )} +// {name} +// +// ); +// }; export default function DevPage() { const router = useRouter(); const [successInvited, setSuccessInvited] = useState(false); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const [inviteData, setInviteData] = useState(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); + 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 +39,12 @@ export default function DevPage() { - invited - you to join - invited */} + {/* you to join */} + {/* + > */} {successInvited ? ( Date: Thu, 12 Jan 2023 18:37:43 +0800 Subject: [PATCH 049/104] fix: add error catch --- packages/app/src/pages/invite/[invite_code].tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/app/src/pages/invite/[invite_code].tsx b/packages/app/src/pages/invite/[invite_code].tsx index 22122db138..342fa7c481 100644 --- a/packages/app/src/pages/invite/[invite_code].tsx +++ b/packages/app/src/pages/invite/[invite_code].tsx @@ -25,12 +25,13 @@ export default function DevPage() { const { acceptInvite } = useWorkspaceHelper(); const { user } = useAppState(); useEffect(() => { - 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 && + 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 ( From c8fb9868884fc854ea2d9cc6e84506f70eaca3d4 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Jan 2023 18:57:55 +0800 Subject: [PATCH 050/104] chore: update translation --- .../workspace-setting/member/MembersPage.tsx | 21 ++++++++++--------- .../pages/workspace/[workspaceId]/setting.tsx | 5 +++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/app/src/components/workspace-setting/member/MembersPage.tsx b/packages/app/src/components/workspace-setting/member/MembersPage.tsx index 45ab2c30da..e93e65b6e6 100644 --- a/packages/app/src/components/workspace-setting/member/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/member/MembersPage.tsx @@ -26,11 +26,12 @@ import { toast } from '@/ui/toast'; import useMembers from '@/hooks/use-members'; import Loading from '@/components/loading'; import { Wrapper } from '@/ui/layout'; +import { useTranslation } from '@affine/i18n'; export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); const { members, removeMember, loaded } = useMembers(); - + const { t } = useTranslation(); // FIXME: DELETE THIS const { user, login, updateWorkspaceMeta } = useTemporaryHelper(); const { confirm } = useConfirm(); @@ -51,10 +52,10 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { <> - Users({members.length}) + {t('Users')} ({members.length}) - Access level + {t('Access level')} {members.map((member, index) => { @@ -138,7 +139,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { type="primary" shape="circle" > - Invite Members + {t('Invite Members')} { @@ -158,17 +159,17 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { return ( - <>Collaborating with other members requires AFFiNE Cloud service. + <>{t('Collaboration Description')} diff --git a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx index e8c40aacf2..55426cc604 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx @@ -24,6 +24,7 @@ import { import { useAppState } from '@/providers/app-state-provider'; import WorkspaceLayout from '@/components/workspace-layout'; import { WorkspaceUnit } from '@affine/datacenter'; +import { useTranslation } from '@affine/i18n'; type TabNames = 'general' | 'members' | 'publish' | 'sync' | 'export'; @@ -61,7 +62,7 @@ const tabMap: { const WorkspaceSetting = () => { const { currentWorkspace } = useAppState(); - + const { t } = useTranslation(); const [activeTab, setActiveTab] = useState(tabMap[0].name); const handleTabChange = (tab: TabNames) => { setActiveTab(tab); @@ -75,7 +76,7 @@ const WorkspaceSetting = () => { - Workspace Settings + {t('Workspace Settings')} {tabMap.map(({ icon, name }) => { From cea3d13805663b3b467d3d8aca3e14f7a299b08c Mon Sep 17 00:00:00 2001 From: alt0 Date: Thu, 12 Jan 2023 19:50:26 +0800 Subject: [PATCH 051/104] fix: workspace avatar --- .../{index.tsx => Avatar.tsx} | 6 ++- .../workspace-avatar/WorkspaceUnitAvatar.tsx | 39 +++++++++++++++++++ .../src/components/workspace-avatar/index.ts | 2 + .../src/components/workspace-modal/index.tsx | 8 +--- .../WorkspaceSelector/WorkspaceSelector.tsx | 8 ++-- .../src/provider/local/indexeddb/utils.ts | 1 + .../data-center/src/provider/local/local.ts | 2 + pnpm-lock.yaml | 24 ------------ 8 files changed, 55 insertions(+), 35 deletions(-) rename packages/app/src/components/workspace-avatar/{index.tsx => Avatar.tsx} (88%) create mode 100644 packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx create mode 100644 packages/app/src/components/workspace-avatar/index.ts diff --git a/packages/app/src/components/workspace-avatar/index.tsx b/packages/app/src/components/workspace-avatar/Avatar.tsx similarity index 88% rename from packages/app/src/components/workspace-avatar/index.tsx rename to packages/app/src/components/workspace-avatar/Avatar.tsx index 22f5fdd048..c01808e68f 100644 --- a/packages/app/src/components/workspace-avatar/index.tsx +++ b/packages/app/src/components/workspace-avatar/Avatar.tsx @@ -23,7 +23,11 @@ export const WorkspaceAvatar = (props: IWorkspaceAvatar) => { }} > - +
) : ( diff --git a/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx new file mode 100644 index 0000000000..8a390bddda --- /dev/null +++ b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx @@ -0,0 +1,39 @@ +import { useState, useEffect } from 'react'; +import type { WorkspaceUnit } from '@affine/datacenter'; +import { WorkspaceAvatar as Avatar } from './Avatar'; + +const useAvatar = (workspaceUnit?: WorkspaceUnit) => { + const [avatarUrl, setAvatarUrl] = useState(''); + const avatarId = + workspaceUnit?.avatar || workspaceUnit?.blocksuiteWorkspace?.meta.avatar; + useEffect(() => { + if (avatarId && workspaceUnit?.blocksuiteWorkspace?.blobs) { + workspaceUnit.blocksuiteWorkspace.blobs.then(blobs => { + blobs?.get(avatarId).then(url => setAvatarUrl(url || '')); + }); + } else { + setAvatarUrl(''); + } + }, [avatarId]); + + return avatarUrl; +}; + +export const WorkspaceUnitAvatar = ({ + size = 20, + name, + workspaceUnit, +}: { + size?: number; + name?: string; + workspaceUnit?: WorkspaceUnit | null; +}) => { + const avatarUrl = useAvatar(workspaceUnit || undefined); + return ( + + ); +}; diff --git a/packages/app/src/components/workspace-avatar/index.ts b/packages/app/src/components/workspace-avatar/index.ts new file mode 100644 index 0000000000..8d6dfe17ba --- /dev/null +++ b/packages/app/src/components/workspace-avatar/index.ts @@ -0,0 +1,2 @@ +export { WorkspaceAvatar } from './Avatar'; +export { WorkspaceUnitAvatar } from './WorkspaceUnitAvatar'; diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 4328224d8c..a34abdb878 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -10,7 +10,7 @@ import { AddIcon, } from '@blocksuite/icons'; import { toast } from '@/ui/toast'; -import { WorkspaceAvatar } from '@/components/workspace-avatar'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; import { useConfirm } from '@/providers/ConfirmProvider'; @@ -65,11 +65,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { marginRight: '10px', }} > - +
{ const [workspaceListShow, setWorkspaceListShow] = useState(false); @@ -23,17 +23,17 @@ export const WorkspaceSelector = () => {
-
diff --git a/packages/data-center/src/provider/local/indexeddb/utils.ts b/packages/data-center/src/provider/local/indexeddb/utils.ts index 0a83282a6a..68a4172eb3 100644 --- a/packages/data-center/src/provider/local/indexeddb/utils.ts +++ b/packages/data-center/src/provider/local/indexeddb/utils.ts @@ -20,6 +20,7 @@ export const writeUpdatesToLocal = async ( if (updatesStore) { await idb.addAutoKey(updatesStore, currState); } + db.close(); }; export const applyLocalUpdates = async ( diff --git a/packages/data-center/src/provider/local/local.ts b/packages/data-center/src/provider/local/local.ts index 7388c4b2ab..f9b819ea40 100644 --- a/packages/data-center/src/provider/local/local.ts +++ b/packages/data-center/src/provider/local/local.ts @@ -8,6 +8,7 @@ import type { import { varStorage as storage } from 'lib0/storage'; import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store'; import { IndexedDBProvider } from './indexeddb/indexeddb.js'; +import { applyLocalUpdates } from './indexeddb/utils.js'; import assert from 'assert'; import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js'; import type { WorkspaceUnit } from '../../workspace-unit'; @@ -48,6 +49,7 @@ export class LocalProvider extends BaseProvider { workspace: BlocksuiteWorkspace ): Promise { assert(workspace.room); + await applyLocalUpdates(workspace); await this.linkLocal(workspace); return workspace; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4844bc6a23..f608cb2fab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3011,7 +3011,6 @@ packages: /@next/env/13.1.0: resolution: {integrity: sha512-6iNixFzCndH+Bl4FetQzOMjxCJqg8fs0LAlZviig1K6mIjOWH2m2oPcHcOg1Ta5VCe7Bx5KG1Hs+NrWDUkBt9A==} - dev: false /@next/eslint-plugin-next/12.3.1: resolution: {integrity: sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw==} @@ -3034,7 +3033,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false optional: true /@next/swc-android-arm64/12.3.1: @@ -3052,7 +3050,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /@next/swc-darwin-arm64/12.3.1: @@ -3070,7 +3067,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@next/swc-darwin-x64/12.3.1: @@ -3088,7 +3084,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@next/swc-freebsd-x64/12.3.1: @@ -3106,7 +3101,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false optional: true /@next/swc-linux-arm-gnueabihf/12.3.1: @@ -3124,7 +3118,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@next/swc-linux-arm64-gnu/12.3.1: @@ -3142,7 +3135,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@next/swc-linux-arm64-musl/12.3.1: @@ -3160,7 +3152,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@next/swc-linux-x64-gnu/12.3.1: @@ -3178,7 +3169,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@next/swc-linux-x64-musl/12.3.1: @@ -3196,7 +3186,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@next/swc-win32-arm64-msvc/12.3.1: @@ -3214,7 +3203,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@next/swc-win32-ia32-msvc/12.3.1: @@ -3232,7 +3220,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /@next/swc-win32-x64-msvc/12.3.1: @@ -3250,7 +3237,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@nodelib/fs.scandir/2.1.5: @@ -3613,7 +3599,6 @@ packages: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: tslib: 2.4.0 - dev: false /@szmarczak/http-timer/5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -4580,7 +4565,6 @@ packages: /client-only/0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false /cliui/6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -7512,7 +7496,6 @@ packages: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -7635,7 +7618,6 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -7986,7 +7968,6 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false /preferred-pm/3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} @@ -8156,7 +8137,6 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: false /react-i18next/11.18.6_i18next@21.10.0: resolution: {integrity: sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==} @@ -8253,7 +8233,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - dev: false /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -8531,7 +8510,6 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - dev: false /schema-utils/2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} @@ -8690,7 +8668,6 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: false /source-map-support/0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -8939,7 +8916,6 @@ packages: dependencies: client-only: 0.0.1 react: 18.2.0 - dev: false /stylis/4.0.13: resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} From f892af6dcd548a6b3f765adbbf830913550c30e0 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Fri, 13 Jan 2023 09:59:44 +0800 Subject: [PATCH 052/104] fix:workspace avatar --- .../src/components/workspace-setting/general/General.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index 0ced889c68..6921282d7b 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -13,7 +13,10 @@ import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceDelete } from './delete'; import { WorkspaceLeave } from './leave'; import { Upload } from '@/components/file-upload'; -import { WorkspaceAvatar } from '@/components/workspace-avatar'; +import { + WorkspaceAvatar, + WorkspaceUnitAvatar, +} from '@/components/workspace-avatar'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { @@ -49,10 +52,10 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { marginRight: '20px', }} > -
Date: Fri, 13 Jan 2023 14:02:37 +0800 Subject: [PATCH 053/104] feat: add language switch in workspace modal --- .../app/src/components/workspace-modal/index.tsx | 3 ++- .../src/components/workspace-slider-bar/index.tsx | 14 -------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index a5f2369c4b..2822fbb367 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -15,6 +15,7 @@ import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; import { useConfirm } from '@/providers/ConfirmProvider'; import { useTranslation } from '@affine/i18n'; +import { LanguageMenu } from './languageMenu'; interface WorkspaceModalProps { open: boolean; @@ -37,7 +38,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { >
{t('My Workspaces')} - {/* */} + { {t('Trash')} - { - changeLanguage('en'); - }} - > - change to English - - { - changeLanguage('zh-Hans'); - }} - > - 切换到中文 - { const pageId = await createPage(); From 8f38504009ad6d21c6fa96f976bc18c082171a63 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Fri, 13 Jan 2023 14:07:33 +0800 Subject: [PATCH 054/104] chore: remove unused function --- packages/app/src/components/workspace-slider-bar/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 75ad72ea33..e5ec3b8e00 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -84,9 +84,6 @@ export const WorkSpaceSliderBar = () => { ? `/workspace/${currentWorkspaceId}/setting` : '', }; - const changeLanguage = (event: string) => { - i18n.changeLanguage(event); - }; return ( <> From b57d8d35295b5f2ab8baf745de3cc9cb07980485 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Fri, 13 Jan 2023 14:08:12 +0800 Subject: [PATCH 055/104] chore: remove unused variable --- packages/app/src/components/workspace-slider-bar/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index e5ec3b8e00..ce6f8d43d3 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -70,7 +70,7 @@ export const WorkSpaceSliderBar = () => { const { currentWorkspace } = useAppState(); const { openPage, createPage } = usePageHelper(); const router = useRouter(); - const { t, i18n } = useTranslation(); + const { t } = useTranslation(); const [showTip, setShowTip] = useState(false); const [show, setShow] = useLocalStorage('AFFiNE_SLIDE_BAR', false, true); const currentWorkspaceId = currentWorkspace?.id; From d1c9a4070576a0143e51b9b7c7f2e111c7a85dbd Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Fri, 13 Jan 2023 14:11:29 +0800 Subject: [PATCH 056/104] fix: lint error --- .../workspace-avatar/WorkspaceUnitAvatar.tsx | 7 ++-- .../app/src/pages/invite/[invite_code].tsx | 33 +++++++------------ 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx index 8a390bddda..4144d9645d 100644 --- a/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx +++ b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx @@ -6,15 +6,16 @@ const useAvatar = (workspaceUnit?: WorkspaceUnit) => { const [avatarUrl, setAvatarUrl] = useState(''); const avatarId = workspaceUnit?.avatar || workspaceUnit?.blocksuiteWorkspace?.meta.avatar; + const blobs = workspaceUnit?.blocksuiteWorkspace?.blobs; useEffect(() => { - if (avatarId && workspaceUnit?.blocksuiteWorkspace?.blobs) { - workspaceUnit.blocksuiteWorkspace.blobs.then(blobs => { + if (avatarId && blobs) { + blobs.then(blobs => { blobs?.get(avatarId).then(url => setAvatarUrl(url || '')); }); } else { setAvatarUrl(''); } - }, [avatarId]); + }, [avatarId, blobs]); return avatarUrl; }; diff --git a/packages/app/src/pages/invite/[invite_code].tsx b/packages/app/src/pages/invite/[invite_code].tsx index 342fa7c481..872b3f927a 100644 --- a/packages/app/src/pages/invite/[invite_code].tsx +++ b/packages/app/src/pages/invite/[invite_code].tsx @@ -1,5 +1,4 @@ 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'; @@ -23,16 +22,14 @@ export default function DevPage() { const router = useRouter(); const [successInvited, setSuccessInvited] = useState(false); const { acceptInvite } = useWorkspaceHelper(); - const { user } = useAppState(); useEffect(() => { 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]); + }, [router, acceptInvite]); return ( @@ -98,16 +95,16 @@ export default function DevPage() { ); } -const UserIcon = styled('div')({ - display: 'inline-block', - width: '28px', - height: '28px', - borderRadius: '50%', - backgroundColor: '#FFF5AB', - textAlign: 'center', - color: '#896406', - lineHeight: '28px', -}); +// const UserIcon = styled('div')({ +// display: 'inline-block', +// width: '28px', +// height: '28px', +// borderRadius: '50%', +// backgroundColor: '#FFF5AB', +// textAlign: 'center', +// color: '#896406', +// lineHeight: '28px', +// }); const Invited = styled('div')(({ theme }) => { return { @@ -126,14 +123,6 @@ const Content = styled('div')({ marginTop: '35px', }); -const UserContent = styled('span')({ - fontSize: '18px', - marginLeft: '12px', - span: { - padding: '0 12px', - }, -}); - const Status = styled('div')(() => { return { marginTop: '16px', From 3efc4b554b52d5dfb38769b3f263b891284318be Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 14:50:15 +0800 Subject: [PATCH 057/104] Merge remote-tracking branch 'origin/master' into feat/datacenter (#727) --- package.json | 3 +- packages/app/package.json | 6 +- packages/data-center/package.json | 4 +- pnpm-lock.yaml | 192 ++++++++++++++++++++++++------ 4 files changed, 162 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 2838c7b64e..967a98bfa4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "test:unit": "playwright test --config=playwright.config.unit.ts", "postinstall": "husky install", "notify": "node --experimental-modules scripts/notify.mjs", - "check:ci": "pnpm lint & pnpm test" + "check:ci": "pnpm lint & pnpm test", + "update:blocksuite": "pnpm i --filter @affine/app --filter @affine/datacenter @blocksuite/blocks@nightly @blocksuite/store@nightly && pnpm i --filter @affine/app @blocksuite/editor@nightly" }, "lint-staged": { "*": "prettier --write --ignore-unknown", diff --git a/packages/app/package.json b/packages/app/package.json index aece2897f9..31fa964621 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,10 +11,10 @@ "dependencies": { "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.3.1-20230109032243-37ad3ba", - "@blocksuite/editor": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", + "@blocksuite/editor": "0.4.0-20230111171650-bc63456", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/store": "0.4.0-20230111171650-bc63456", "@emotion/css": "^11.10.0", "@emotion/react": "^11.10.4", "@emotion/server": "^11.10.0", diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 4dce08d73c..d8e0f47f1b 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -26,8 +26,8 @@ "typescript": "^4.8.4" }, "dependencies": { - "@blocksuite/blocks": "0.3.1-20230109032243-37ad3ba", - "@blocksuite/store": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", + "@blocksuite/store": "0.4.0-20230111171650-bc63456", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f608cb2fab..d7edf50741 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,10 +46,10 @@ importers: specifiers: '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba - '@blocksuite/editor': 0.3.1-20230109032243-37ad3ba + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456 '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@emotion/css': ^11.10.0 '@emotion/react': ^11.10.4 '@emotion/server': ^11.10.0 @@ -87,10 +87,10 @@ importers: dependencies: '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/editor': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@emotion/css': 11.10.0 '@emotion/react': 11.10.4_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.0 @@ -129,8 +129,8 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -145,8 +145,8 @@ importers: typescript: ^4.8.4 y-protocols: ^1.0.5 dependencies: - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/store': 0.4.0-20230111171650-bc63456 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -168,6 +168,7 @@ importers: i18next: ^21.9.1 prettier: ^2.7.1 react-i18next: ^11.18.4 + ts-node: ^10.9.1 typescript: ^4.8.4 dependencies: i18next: 21.10.0 @@ -175,6 +176,7 @@ importers: react-i18next: 11.18.6_i18next@21.10.0 devDependencies: '@types/prettier': 2.7.2 + ts-node: 10.9.1_typescript@4.9.3 typescript: 4.9.3 packages/logger: @@ -1499,16 +1501,17 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@blocksuite/blocks/0.3.1-20230109032243-37ad3ba: - resolution: {integrity: sha512-UTlbk0Is7TMRBbvUyM2nivbqM/TLwRj1qArMYbOmvDGUNYadWo68cTwv/Ej2WwiKn22q4/4JHryGsv3gTCRz1Q==} + /@blocksuite/blocks/0.4.0-20230111171650-bc63456: + resolution: {integrity: sha512-7fpb++pT9laoyLFWl4h09v7TUqZ/9udMrC1qxdX2XFgMPJjg3MJ9RG+Ud2s/zqZ1SkU1+0hMBvJP5ci9vV44gw==} dependencies: - '@blocksuite/phasor': 0.3.1-20230109032243-37ad3ba - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba + '@blocksuite/global': 0.4.0-20230111171650-bc63456 + '@blocksuite/phasor': 0.4.0-20230111171650-bc63456 + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@tldraw/intersect': 1.8.0 autosize: 5.0.2 highlight.js: 11.7.0 hotkeys-js: 3.10.1 - lit: 2.5.0 + lit: 2.6.1 perfect-freehand: 1.2.0 quill: 1.3.7 quill-cursors: 4.0.0 @@ -1519,16 +1522,17 @@ packages: - yjs dev: false - /@blocksuite/blocks/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-UTlbk0Is7TMRBbvUyM2nivbqM/TLwRj1qArMYbOmvDGUNYadWo68cTwv/Ej2WwiKn22q4/4JHryGsv3gTCRz1Q==} + /@blocksuite/blocks/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-7fpb++pT9laoyLFWl4h09v7TUqZ/9udMrC1qxdX2XFgMPJjg3MJ9RG+Ud2s/zqZ1SkU1+0hMBvJP5ci9vV44gw==} dependencies: - '@blocksuite/phasor': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/global': 0.4.0-20230111171650-bc63456 + '@blocksuite/phasor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@tldraw/intersect': 1.8.0 autosize: 5.0.2 highlight.js: 11.7.0 hotkeys-js: 3.10.1 - lit: 2.5.0 + lit: 2.6.1 perfect-freehand: 1.2.0 quill: 1.3.7 quill-cursors: 4.0.0 @@ -1539,12 +1543,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-bYbMn4EL/od+xP4K3u2kJT08kJBpK6H7b4cbRb9No3SUwgNHvvVNxia/QH1AQXyKaZQj/DHFgVxrw9GKo2GIPA==} + /@blocksuite/editor/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-NbghDNWDGHXXfEqgnNhbw7zewGRyx9LUzOv1FmY2WVhzDu02MSrTWxMduChH1/tfLHRLe6jusmZKS9BNSUPynA==} dependencies: - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - lit: 2.5.0 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + lit: 2.6.1 marked: 4.2.5 turndown: 7.1.1 transitivePeerDependencies: @@ -1554,6 +1558,10 @@ packages: - yjs dev: false + /@blocksuite/global/0.4.0-20230111171650-bc63456: + resolution: {integrity: sha512-/Kqg73vPLzxiWp6UqRmRoKfYmH4Sij3mU52RJf9adyywZOdM5e9E1gvPP+Eruz/x2jJ1uzR5/ivFqp5t688/tg==} + dev: false + /@blocksuite/icons/2.0.4_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-Ewx30d3W6MXJGPXYvv48UpvAVfDB+gIVu90sHZX5curnSn+e1DdpCVfL0DeZA7Iyq6aLbxnKVzOAewlfoP8kDQ==} peerDependencies: @@ -1564,25 +1572,26 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.3.1-20230109032243-37ad3ba: - resolution: {integrity: sha512-mL1gSQ3rzrjdQSbWPtgyMXpbbl266UUjw26d0aIjkOh+iMMI6rWtmKWDoiDkO7tejIjwSNQ4w5zJOjJRIj+mSA==} + /@blocksuite/phasor/0.4.0-20230111171650-bc63456: + resolution: {integrity: sha512-fzmrG8KVJXkm5YyvHpPG1RRFhXjzuOey8OIoDu+/z87n9HJc4SkOd9JKH6wEL37F7P5ZoEM9Yl9YHxQjUc4/CA==} peerDependencies: yjs: ^13 dev: false - /@blocksuite/phasor/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-mL1gSQ3rzrjdQSbWPtgyMXpbbl266UUjw26d0aIjkOh+iMMI6rWtmKWDoiDkO7tejIjwSNQ4w5zJOjJRIj+mSA==} + /@blocksuite/phasor/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-fzmrG8KVJXkm5YyvHpPG1RRFhXjzuOey8OIoDu+/z87n9HJc4SkOd9JKH6wEL37F7P5ZoEM9Yl9YHxQjUc4/CA==} peerDependencies: yjs: ^13 dependencies: yjs: 13.5.44 dev: false - /@blocksuite/store/0.3.1-20230109032243-37ad3ba: - resolution: {integrity: sha512-zOUz19jfhuhsUkx9BGEQPZWbPyD/AgX0LB7ShVRdd3YM73x25hD6tPLLz1HEV2b69XokC0P9oSru4aNomm4jkg==} + /@blocksuite/store/0.4.0-20230111171650-bc63456: + resolution: {integrity: sha512-f/PKFPadA0KZq/wSLxxlS29c4SDuMfzHN1/gdrxFEIY0gC8caK2jZnT4K62R9Nquik/mXL60h8fBVAkQ0KbHzg==} peerDependencies: yjs: ^13 dependencies: + '@blocksuite/global': 0.4.0-20230111171650-bc63456 '@types/flexsearch': 0.7.3 '@types/quill': 1.3.10 buffer: 6.0.3 @@ -1598,11 +1607,12 @@ packages: - utf-8-validate dev: false - /@blocksuite/store/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-zOUz19jfhuhsUkx9BGEQPZWbPyD/AgX0LB7ShVRdd3YM73x25hD6tPLLz1HEV2b69XokC0P9oSru4aNomm4jkg==} + /@blocksuite/store/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-f/PKFPadA0KZq/wSLxxlS29c4SDuMfzHN1/gdrxFEIY0gC8caK2jZnT4K62R9Nquik/mXL60h8fBVAkQ0KbHzg==} peerDependencies: yjs: ^13 dependencies: + '@blocksuite/global': 0.4.0-20230111171650-bc63456 '@types/flexsearch': 0.7.3 '@types/quill': 1.3.10 buffer: 6.0.3 @@ -1803,6 +1813,13 @@ packages: prettier: 2.7.1 dev: true + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + /@emotion/babel-plugin/11.10.2: resolution: {integrity: sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==} peerDependencies: @@ -2802,6 +2819,17 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@lit-labs/ssr-dom-shim/1.0.0: + resolution: {integrity: sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==} + dev: false + /@lit/reactive-element/1.4.1: resolution: {integrity: sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==} dev: false @@ -2810,6 +2838,12 @@ packages: resolution: {integrity: sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==} dev: false + /@lit/reactive-element/1.6.1: + resolution: {integrity: sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.0.0 + dev: false + /@manypkg/find-root/1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -3617,6 +3651,22 @@ packages: resolution: {integrity: sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==} dev: false + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + /@types/babel__core/7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: @@ -4018,9 +4068,15 @@ packages: acorn: 8.8.0 dev: true + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} + hasBin: true dev: true /aggregate-error/3.1.0: @@ -4108,6 +4164,10 @@ packages: picomatch: 2.3.1 dev: true + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -4709,6 +4769,10 @@ packages: yaml: 1.10.2 dev: false + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + /cross-spawn/5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -4902,6 +4966,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -7230,6 +7299,12 @@ packages: '@types/trusted-types': 2.0.2 dev: false + /lit-html/2.6.1: + resolution: {integrity: sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==} + dependencies: + '@types/trusted-types': 2.0.2 + dev: false + /lit/2.4.0: resolution: {integrity: sha512-fdgzxEtLrZFQU/BqTtxFQCLwlZd9bdat+ltzSFjvWkZrs7eBmeX0L5MHUMb3kYIkuS8Xlfnii/iI5klirF8/Xg==} dependencies: @@ -7238,12 +7313,12 @@ packages: lit-html: 2.4.0 dev: false - /lit/2.5.0: - resolution: {integrity: sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==} + /lit/2.6.1: + resolution: {integrity: sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==} dependencies: - '@lit/reactive-element': 1.5.0 + '@lit/reactive-element': 1.6.1 lit-element: 3.2.2 - lit-html: 2.5.0 + lit-html: 2.6.1 dev: false /load-yaml-file/0.2.0: @@ -7363,6 +7438,10 @@ packages: semver: 6.3.0 dev: true + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + /makeerror/1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -9075,6 +9154,36 @@ packages: engines: {node: '>=8'} dev: true + /ts-node/10.9.1_typescript@4.9.3: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + acorn: 8.8.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -9325,6 +9434,10 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true @@ -9798,6 +9911,11 @@ packages: lib0: 0.2.52 dev: false + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} From 03ff4c3e3db4efa46c868763b191df7bac112020 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 15:09:56 +0800 Subject: [PATCH 058/104] fix: upload origin doc when enable cloud (#729) --- .../data-center/src/provider/affine/affine.ts | 37 +++++++++++-------- .../src/provider/affine/apis/workspace.ts | 4 +- .../data-center/src/provider/affine/utils.ts | 34 ----------------- 3 files changed, 24 insertions(+), 51 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index c8078c4cdc..793d7e7cd9 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -13,11 +13,7 @@ import { getApis, Workspace } from './apis/index.js'; import type { Apis, WorkspaceDetail, Callback } from './apis'; import { token } from './apis/token.js'; import { WebsocketClient } from './channel'; -import { - loadWorkspaceUnit, - createWorkspaceUnit, - syncToCloud, -} from './utils.js'; +import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js'; import { WorkspaceUnit } from '../../workspace-unit.js'; import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js'; import type { SyncMode } from '../../workspace-unit'; @@ -316,7 +312,22 @@ export class AffineProvider extends BaseProvider { public override async createWorkspace( meta: CreateWorkspaceInfoParams ): Promise { - const { id } = await this._apis.createWorkspace(meta); + const workspaceUnitForUpload = await createWorkspaceUnit({ + id: '', + name: meta.name, + avatar: undefined, + owner: await this.getUserInfo(), + published: false, + memberCount: 1, + provider: this.id, + syncMode: 'core', + }); + const { id } = await this._apis.createWorkspace( + new Blob([ + encodeStateAsUpdate(workspaceUnitForUpload.blocksuiteWorkspace!.doc) + .buffer, + ]) + ); const workspaceUnit = await createWorkspaceUnit({ id, @@ -329,10 +340,6 @@ export class AffineProvider extends BaseProvider { syncMode: 'core', }); - await syncToCloud( - workspaceUnit.blocksuiteWorkspace!, - this._apis.token.refresh - ); this._workspaces.add(workspaceUnit); return workspaceUnit; @@ -360,9 +367,11 @@ export class AffineProvider extends BaseProvider { public override async extendWorkspace( workspaceUnit: WorkspaceUnit ): Promise { - const { id } = await this._apis.createWorkspace({ - name: workspaceUnit.name, - }); + const { id } = await this._apis.createWorkspace( + new Blob([ + encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace!.doc).buffer, + ]) + ); const newWorkspaceUnit = new WorkspaceUnit({ id, name: workspaceUnit.name, @@ -381,8 +390,6 @@ export class AffineProvider extends BaseProvider { encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace.doc) ); - await syncToCloud(blocksuiteWorkspace, this._apis.token.refresh); - newWorkspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace); this._workspaces.add(newWorkspaceUnit); diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 106dc72b04..584db159fe 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -112,10 +112,10 @@ export interface CreateWorkspaceParams { } export async function createWorkspace( - params: CreateWorkspaceParams + encodedYDoc: Blob ): Promise<{ id: string }> { try { - return client.post('api/workspace', { json: params }).json(); + return client.post('api/workspace', { body: encodedYDoc }).json(); } catch (error) { sendMessage(messageCode.createWorkspaceFailed); throw new RequestError('create workspace failed', error); diff --git a/packages/data-center/src/provider/affine/utils.ts b/packages/data-center/src/provider/affine/utils.ts index 93c2f56007..4bb401fbf2 100644 --- a/packages/data-center/src/provider/affine/utils.ts +++ b/packages/data-center/src/provider/affine/utils.ts @@ -1,10 +1,7 @@ -import assert from 'assert'; -import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; import { WorkspaceUnit } from '../../workspace-unit.js'; import type { WorkspaceUnitCtorParams } from '../../workspace-unit'; import { createBlocksuiteWorkspace } from '../../utils/index.js'; import type { Apis } from './apis'; -import { WebsocketProvider } from './sync.js'; import { setDefaultAvatar } from '../utils.js'; import { applyUpdate } from '../../utils/index.js'; @@ -42,37 +39,6 @@ export const loadWorkspaceUnit = async ( return workspaceUnit; }; -export const syncToCloud = async ( - blocksuiteWorkspace: BlocksuiteWorkspace, - refreshToken: string -) => { - const workspaceId = blocksuiteWorkspace.room; - assert(workspaceId, 'Blocksuite workspace without room(workspaceId).'); - - const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${ - window.location.host - }/api/sync/`; - - const ws = new WebsocketProvider( - wsUrl, - workspaceId, - blocksuiteWorkspace.doc, - { - params: { token: refreshToken }, - } - ); - - await new Promise((resolve, reject) => { - ws.once('synced', () => { - // FIXME: we don't when send local data to cloud successfully, so hack to wait 1s. - // Server will support this by add a new api. - setTimeout(resolve, 1000); - }); - ws.once('lost-connection', () => reject()); - ws.once('connection-error', () => reject()); - }); -}; - export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => { const workspaceUnit = new WorkspaceUnit(params); From 7fb5aae8b5d04d2a3cda7bb29f9fc445b62769e7 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Fri, 13 Jan 2023 15:25:33 +0800 Subject: [PATCH 059/104] fix: deepscan error and warning (#728) --- .../app/src/components/quick-search/index.tsx | 2 +- .../workspace-setting/PublishPage.tsx | 2 +- .../components/workspace-setting/SyncPage.tsx | 2 +- .../workspace-setting/member/MembersPage.tsx | 2 +- .../SelectorPopperContent.tsx | 183 ------------------ .../CreateWorkspaceItem.tsx | 39 ---- .../CreateWorkspaceItem/index.ts | 1 - .../workspace-create/WorkspaceCreate.tsx | 123 ------------ .../workspace-create/index.ts | 1 - .../workspace-create/style.ts | 63 ------ .../WorkspaceItem/PrivateWorkspaceItem.tsx | 63 ------ .../WorkspaceItem/FooterSetting.tsx | 32 --- .../WorkspaceItem/FooterUsers.tsx | 29 --- .../WorkspaceItem/WorkspaceItem.tsx | 100 ---------- .../WorkspaceItem/WorkspaceItem/index.ts | 1 - .../WorkspaceSelector/WorkspaceItem/index.ts | 3 - packages/app/src/hooks/use-members.ts | 2 +- .../app/src/hooks/use-workspace-helper.ts | 5 +- .../providers/app-state-provider/Provider.tsx | 4 +- .../data-center/src/provider/affine/affine.ts | 2 - packages/data-center/src/workspace-unit.ts | 2 +- 21 files changed, 10 insertions(+), 651 deletions(-) delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx delete mode 100644 packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts diff --git a/packages/app/src/components/quick-search/index.tsx b/packages/app/src/components/quick-search/index.tsx index 4000ce7756..9d6e477968 100644 --- a/packages/app/src/components/quick-search/index.tsx +++ b/packages/app/src/components/quick-search/index.tsx @@ -94,7 +94,7 @@ export const QuickSearch = ({ open, onClose }: TransitionsModalProps) => { setShowCreatePage={setShowCreatePage} /> - {currentWorkspace?.isPublish ? ( + {currentWorkspace?.published ? ( <> ) : showCreatePage ? ( <> diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index 86fbf399f9..d61bf4fcf9 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -34,7 +34,7 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {workspace.provider === 'affine' ? (
- {workspace?.published ? ( + {workspace.published ? ( <> {t('Publishing')} diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index fe677b33a1..7d56d0233c 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -15,7 +15,7 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { return (
- {workspace?.provider === 'local' ? ( + {workspace.provider === 'local' ? ( <> {t('Sync Description', { diff --git a/packages/app/src/components/workspace-setting/member/MembersPage.tsx b/packages/app/src/components/workspace-setting/member/MembersPage.tsx index 4f96371ba0..dc6a7132f3 100644 --- a/packages/app/src/components/workspace-setting/member/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/member/MembersPage.tsx @@ -48,7 +48,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {loaded && members.length === 0 && ( )} - {loaded && members.length && ( + {loaded && members.length > 0 && ( <> diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx deleted file mode 100644 index 287523689e..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx +++ /dev/null @@ -1,183 +0,0 @@ -// import { InformationIcon, LogOutIcon } from '@blocksuite/icons'; -// import { styled } from '@/styles'; -// import { Divider } from '@/ui/divider'; -// import { useAppState } from '@/providers/app-state-provider'; -// import { SelectorPopperContainer } from './styles'; -// import { -// PrivateWorkspaceItem, -// WorkspaceItem, -// CreateWorkspaceItem, -// ListItem, -// LoginItem, -// } from './WorkspaceItem'; -// import { WorkspaceSetting } from '@/components/workspace-setting'; -// import { useCallback, useEffect, useState } from 'react'; -// import { WorkspaceInfo } from '@affine/datacenter'; -// import { useModal } from '@/providers/GlobalModalProvider'; - -// export type WorkspaceDetails = Record< -// string, -// { memberCount: number; owner: { id: string; name: string } } -// >; - -// type SelectorPopperContentProps = { -// isShow: boolean; -// }; - -// export const SelectorPopperContent = ({ -// isShow, -// }: SelectorPopperContentProps) => { -// const { user, workspacesMeta, refreshWorkspacesMeta } = useAppState(); -// const [settingWorkspaceId, setSettingWorkspaceId] = useState( -// null -// ); -// const [workSpaceDetails, setWorkSpaceDetails] = useState( -// {} -// ); -// const { triggerContactModal } = useModal(); - -// const handleClickSettingWorkspace = (workspaceId: string) => { -// setSettingWorkspaceId(workspaceId); -// }; -// const handleCloseWorkSpace = () => { -// setSettingWorkspaceId(null); -// }; -// const settingWorkspace = settingWorkspaceId -// ? workspacesMeta.find(workspace => workspace.id === settingWorkspaceId) -// : undefined; - -// const refreshDetails = useCallback(async () => { -// const workspaceDetailList = await Promise.all( -// workspacesMeta.map(async ({ id, type }) => { -// if (user) { -// if (type === WorkspaceType.Private) { -// return { id, member_count: 1, owner: user }; -// } else { -// // const dc = await getDataCenter(); -// // const data = await dc.apis.getWorkspaceDetail({ id }); -// // return { id, ...data } || { id, member_count: 0, owner: user }; -// } -// } -// }) -// ); -// const workSpaceDetails: WorkspaceDetails = {}; -// workspaceDetailList.forEach(details => { -// if (details) { -// const { id, member_count, owner } = details; -// if (!owner) return; -// workSpaceDetails[id] = { -// memberCount: member_count || 1, -// owner: { -// id: owner.id, -// name: owner.name, -// }, -// }; -// } -// }); -// setWorkSpaceDetails(workSpaceDetails); -// }, [user, workspacesMeta]); - -// useEffect(() => { -// if (isShow) { -// setSettingWorkspaceId(null); -// refreshWorkspacesMeta(); -// refreshDetails(); -// } -// // eslint-disable-next-line react-hooks/exhaustive-deps -// }, [isShow]); - -// return !user ? ( -// -// -// -// } -// name="About AFFiNE" -// onClick={() => triggerContactModal()} -// /> -// -// ) : ( -// -// workspace.type === WorkspaceType.Private -// )?.id -// } -// /> -// -// Workspace -// -// {workspacesMeta.map(workspace => { -// return workspace.type !== WorkspaceType.Private ? ( -// -// ) : null; -// })} -// -// -// {settingWorkspace ? ( -// -// ) : null} -// -// } -// name="About AFFiNE" -// onClick={() => triggerContactModal()} -// /> -// } -// name="Sign out" -// onClick={() => { -// console.log('Sign out'); -// // FIXME: remove token from local storage and reload the page -// localStorage.removeItem('affine_token'); -// window.location.reload(); -// }} -// /> -// -// ); -// }; - -// const StyledDivider = styled(Divider)({ -// margin: '8px 12px', -// width: 'calc(100% - 24px)', -// }); - -// const WorkspaceGroupTitle = styled('div')(({ theme }) => { -// return { -// color: theme.colors.iconColor, -// fontSize: theme.font.sm, -// lineHeight: '30px', -// height: '30px', -// padding: '0 12px', -// }; -// }); - -// const WorkspaceWrapper = styled('div')(() => { -// return { -// maxHeight: '200px', -// overflow: 'auto', -// }; -// }); -export const test = () => { - return <>; -}; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx deleted file mode 100644 index ccb6526691..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useState } from 'react'; -import { AddIcon } from '@blocksuite/icons'; -import { styled } from '@/styles'; -import { - WorkspaceItemAvatar, - WorkspaceItemWrapper, - WorkspaceItemContent, -} from '../styles'; -import { WorkspaceCreate } from './workspace-create'; - -const name = 'Create new Workspace'; - -export const CreateWorkspaceItem = () => { - const [open, setOpen] = useState(false); - return ( - <> - setOpen(true)}> - - - - - {name} - - - setOpen(false)} /> - - ); -}; - -const Name = styled('div')(({ theme }) => { - return { - color: theme.colors.quoteColor, - fontSize: theme.font.base, - fontWeight: 400, - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - }; -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts deleted file mode 100644 index 8db80b1dc7..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './CreateWorkspaceItem'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx deleted file mode 100644 index c71ee76d14..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx +++ /dev/null @@ -1,123 +0,0 @@ -// import { getDataCenter } from '@affine/datacenter'; -import Modal from '@/ui/modal'; -import Input from '@/ui/input'; -import { - StyledModalHeader, - StyledTextContent, - StyledModalWrapper, - StyledInputContent, - StyledButtonContent, - StyledButton, -} from './style'; -import { useState } from 'react'; -import { ModalCloseButton } from '@/ui/modal'; -// import router from 'next/router'; -// import { useAppState } from '@/providers/app-state-provider'; - -interface WorkspaceCreateProps { - open: boolean; - onClose: () => void; -} - -const DefaultHeadImgColors = [ - ['#C6F2F3', '#0C6066'], - ['#FFF5AB', '#896406'], - ['#FFCCA7', '#8F4500'], - ['#FFCECE', '#AF1212'], - ['#E3DEFF', '#511AAB'], -]; - -export const WorkspaceCreate = ({ open, onClose }: WorkspaceCreateProps) => { - const [workspaceName, setWorkspaceId] = useState(''); - const [creating, setCreating] = useState(false); - // const { refreshWorkspacesMeta } = useAppState(); - const handlerInputChange = (workspaceName: string) => { - setWorkspaceId(workspaceName); - }; - const createDefaultHeadImg = (workspaceName: string) => { - const canvas = document.createElement('canvas'); - canvas.height = 100; - canvas.width = 100; - const ctx = canvas.getContext('2d'); - return new Promise((resolve, reject) => { - if (ctx) { - const randomNumber = Math.floor(Math.random() * 5); - const randomColor = DefaultHeadImgColors[randomNumber]; - ctx.fillStyle = randomColor[0]; - ctx.fillRect(0, 0, 100, 100); - ctx.font = "600 50px 'PingFang SC', 'Microsoft Yahei'"; - ctx.fillStyle = randomColor[1]; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillText(workspaceName[0], 50, 50); - canvas.toBlob(blob => { - if (blob) { - // const blobId = getDataCenter().then(dc => - // dc.apis.uploadBlob({ blob }) - // ); - // resolve(blobId); - } else { - reject(); - } - }, 'image/png'); - } else { - reject(); - } - }); - }; - const handleCreateWorkspace = async () => { - setCreating(true); - const blobId = await createDefaultHeadImg(workspaceName).catch(() => { - setCreating(false); - }); - if (blobId) { - // getDataCenter() - // .then(dc => - // dc.apis.createWorkspace({ name: workspaceName, avatar: blobId }) - // ) - // .then(async data => { - // await refreshWorkspacesMeta(); - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // router.push(`/workspace/${data.id}`); - // onClose(); - // }) - // .catch(err => { - // console.log(err, 'err'); - // }) - // .finally(() => { - // setCreating(false); - // }); - } - }; - return ( - - - - Create new Workspace - - Workspaces are shared environments where teams can collaborate. After - creating a Workspace, you can invite others to join. - - - - - - - Create - - - - - ); -}; - -export default WorkspaceCreate; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts deleted file mode 100644 index 85746bc70d..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './WorkspaceCreate'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts deleted file mode 100644 index 4c5162a94f..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { styled } from '@/styles'; -import { Button } from '@/ui/button'; - -export const StyledModalWrapper = styled('div')(({ theme }) => { - return { - position: 'relative', - padding: '0px', - width: '460px', - background: theme.colors.popoverBackground, - borderRadius: '12px', - }; -}); - -export const StyledModalHeader = styled('div')(({ theme }) => { - return { - margin: '44px 0px 12px 0px', - width: '460px', - fontWeight: '600', - fontSize: '20px;', - textAlign: 'center', - color: theme.colors.popoverColor, - }; -}); - -// export const StyledModalContent = styled('div')(({ theme }) => {}); - -export const StyledTextContent = styled('div')(() => { - return { - margin: 'auto', - width: '425px', - fontFamily: 'Avenir Next', - fontStyle: 'normal', - fontWeight: '400', - fontSize: '18px', - lineHeight: '26px', - textAlign: 'center', - }; -}); - -export const StyledInputContent = styled('div')(() => { - return { - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - margin: '40px 0 24px 0', - }; -}); - -export const StyledButtonContent = styled('div')(() => { - return { - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - margin: '0px 0 32px 0', - }; -}); - -export const StyledButton = styled(Button)(() => { - return { - width: '260px', - justifyContent: 'center', - }; -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx deleted file mode 100644 index b9d9522a91..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx +++ /dev/null @@ -1,63 +0,0 @@ -// import { styled } from '@/styles'; -// import { useAppState } from '@/providers/app-state-provider'; -// import { -// WorkspaceItemAvatar, -// PrivateWorkspaceWrapper, -// WorkspaceItemContent, -// } from './styles'; -// import { useRouter } from 'next/router'; - -// type PrivateWorkspaceItemProps = { -// privateWorkspaceId?: string; -// }; - -// export const PrivateWorkspaceItem = ({ -// privateWorkspaceId, -// }: PrivateWorkspaceItemProps) => { -// const { user } = useAppState(); -// const router = useRouter(); -// const handleClick = () => { -// if (privateWorkspaceId) { -// router.push(`/workspace/${privateWorkspaceId}`); -// } -// }; -// if (user) { -// const Username = user.name; -// return ( -// -// -// {Username} -// -// -// {Username} -// {user.email} -// -// -// ); -// } -// return null; -// }; - -// const Name = styled('div')(({ theme }) => { -// return { -// color: theme.colors.quoteColor, -// fontSize: theme.font.base, -// fontWeight: 500, -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// whiteSpace: 'nowrap', -// }; -// }); - -// const Email = styled('div')(({ theme }) => { -// return { -// color: theme.colors.iconColor, -// fontSize: theme.font.sm, -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// whiteSpace: 'nowrap', -// }; -// }); -export const test = () => { - return <>; -}; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx deleted file mode 100644 index eb761058b6..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { SettingsIcon } from '@blocksuite/icons'; -import { styled } from '@/styles'; -import { IconButton } from '@/ui/button'; -import { MouseEventHandler } from 'react'; - -type SettingProps = { - onClick?: () => void; -}; - -export const FooterSetting = ({ onClick }: SettingProps) => { - const handleClick: MouseEventHandler = e => { - e.stopPropagation(); - onClick && onClick(); - }; - return ( - { - e.stopPropagation(); - handleClick(e); - }} - > - - - ); -}; - -const Wrapper = styled(IconButton)(() => { - return { - fontSize: '20px', - }; -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx deleted file mode 100644 index c241555877..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { UsersIcon } from '@blocksuite/icons'; -import { styled } from '@/styles'; -import { IconButton } from '@/ui/button'; - -type FooterUsersProps = { - memberCount: number; -}; - -export const FooterUsers = ({ memberCount = 1 }: FooterUsersProps) => { - return ( - - <> - - {memberCount > 99 ? '99+' : memberCount} - - - ); -}; - -const Wrapper = styled(IconButton)({ - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - fontSize: '16px', -}); - -const Tip = styled('span')({ - fontSize: '12px', -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx deleted file mode 100644 index 3833f1b516..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx +++ /dev/null @@ -1,100 +0,0 @@ -// import { useRouter } from 'next/router'; -// import { styled } from '@/styles'; -// import { -// WorkspaceItemAvatar, -// WorkspaceItemWrapper, -// WorkspaceItemContent, -// } from '../styles'; -// import { FooterSetting } from './FooterSetting'; -// import { FooterUsers } from './FooterUsers'; -// import { WorkspaceType } from '@affine/datacenter'; -// import { useAppState } from '@/providers/app-state-provider'; - -// interface WorkspaceItemProps { -// id: string; -// name: string; -// icon: string; -// type: WorkspaceType; -// memberCount: number; -// onClickSetting?: (workspaceId: string) => void; -// } - -// export const WorkspaceItem = ({ -// id, -// name, -// icon, -// type, -// onClickSetting, -// memberCount, -// }: WorkspaceItemProps) => { -// const router = useRouter(); - -// const { currentWorkspaceId } = useAppState(); - -// const handleClickSetting = async () => { -// onClickSetting && onClickSetting(id); -// }; - -// return ( -// { -// router.push(`/workspace/${id}`); -// }} -// canSet={ -// type !== WorkspaceType.Private && currentWorkspaceId === String(id) -// } -// > -// -// {name.charAt(0)} -// -// -// {name} -// -//
-// -// -//
-//
-// ); -// }; - -// const Name = styled('div')(({ theme }) => { -// return { -// color: theme.colors.quoteColor, -// fontSize: theme.font.sm, -// fontWeight: 400, -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// whiteSpace: 'nowrap', -// }; -// }); - -// const StyledWrapper = styled(WorkspaceItemWrapper)<{ canSet: boolean }>( -// ({ canSet }) => { -// return { -// '& .footer-setting': { -// display: 'none', -// }, -// ':hover .footer-users': { -// display: canSet ? 'none' : '', -// }, -// ':hover .footer-setting': { -// display: canSet ? 'block' : 'none', -// }, -// }; -// } -// ); - -// const Footer = styled('div')({ -// width: '42px', -// flex: '0 42px', -// fontSize: '20px', -// display: 'flex', -// alignItems: 'center', -// justifyContent: 'center', -// marginLeft: '12px', -// }); - -export const test = () => { - return <>; -}; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts deleted file mode 100644 index 60080d5a77..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './WorkspaceItem'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts index 2c8649631c..59d6e170a4 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts @@ -1,5 +1,2 @@ -export * from './PrivateWorkspaceItem'; -// export * from './WorkspaceItem'; -export * from './CreateWorkspaceItem'; export * from './ListItem'; export * from './LoginItem'; diff --git a/packages/app/src/hooks/use-members.ts b/packages/app/src/hooks/use-members.ts index 3011c94f83..a0e7cd8156 100644 --- a/packages/app/src/hooks/use-members.ts +++ b/packages/app/src/hooks/use-members.ts @@ -22,7 +22,7 @@ export const useMembers = () => { const inviteMember = async (email: string) => { currentWorkspace && dataCenter && - (await dataCenter.inviteMember(currentWorkspace?.id, email)); + (await dataCenter.inviteMember(currentWorkspace.id, email)); }; const removeMember = async (permissionId: number) => { diff --git a/packages/app/src/hooks/use-workspace-helper.ts b/packages/app/src/hooks/use-workspace-helper.ts index 480ba409c1..64387a9848 100644 --- a/packages/app/src/hooks/use-workspace-helper.ts +++ b/packages/app/src/hooks/use-workspace-helper.ts @@ -57,11 +57,10 @@ export const useWorkspaceHelper = () => { }; const deleteWorkSpace = async () => { - currentWorkspace && - (await dataCenter.deleteWorkspace(currentWorkspace?.id)); + currentWorkspace && (await dataCenter.deleteWorkspace(currentWorkspace.id)); }; const leaveWorkSpace = async () => { - currentWorkspace && (await dataCenter.leaveWorkspace(currentWorkspace?.id)); + currentWorkspace && (await dataCenter.leaveWorkspace(currentWorkspace.id)); }; const acceptInvite = async (inviteCode: string) => { diff --git a/packages/app/src/providers/app-state-provider/Provider.tsx b/packages/app/src/providers/app-state-provider/Provider.tsx index 3e864b76d2..77b50384fa 100644 --- a/packages/app/src/providers/app-state-provider/Provider.tsx +++ b/packages/app/src/providers/app-state-provider/Provider.tsx @@ -105,10 +105,10 @@ export const AppStateProvider = ({ // isOwner is useful only in the cloud isOwner = true; } else { - isOwner = workspace?.owner && user?.id === workspace?.owner?.id; + isOwner = workspace.owner && user?.id === workspace.owner.id; } const pageList = - (workspace?.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]) ?? []; + (workspace.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]) ?? []; setAppState({ ...appState, currentWorkspace: workspace, diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index 793d7e7cd9..b71019b91a 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -244,9 +244,7 @@ export class AffineProvider extends BaseProvider { } public override async getUserInfo(): Promise { - await this.init(); const user = this._apis.token.user; - await this.init; return user ? { id: user.id, diff --git a/packages/data-center/src/workspace-unit.ts b/packages/data-center/src/workspace-unit.ts index 5bc4bf8aef..1560ec7bf6 100644 --- a/packages/data-center/src/workspace-unit.ts +++ b/packages/data-center/src/workspace-unit.ts @@ -52,7 +52,7 @@ export class WorkspaceUnit { } setBlocksuiteWorkspace(blocksuiteWorkspace: BlocksuiteWorkspace | null) { - if (blocksuiteWorkspace && blocksuiteWorkspace?.room !== this.id) { + if (blocksuiteWorkspace && blocksuiteWorkspace.room !== this.id) { throw new Error('Workspace id inconsistent.'); } this._blocksuiteWorkspace = blocksuiteWorkspace; From ba9a57d4ae1f47a3ad1c231ea15b646594332f92 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 15:33:42 +0800 Subject: [PATCH 060/104] fix: error TS2742: The inferred type of 'bareClient' cannot be name (#731) --- packages/data-center/src/provider/affine/apis/request.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/data-center/src/provider/affine/apis/request.ts b/packages/data-center/src/provider/affine/apis/request.ts index 2520b1d535..c5bdf7e300 100644 --- a/packages/data-center/src/provider/affine/apis/request.ts +++ b/packages/data-center/src/provider/affine/apis/request.ts @@ -2,11 +2,13 @@ import ky from 'ky-universal'; import { MessageCenter } from '../../../message/index.js'; import { token } from './token.js'; +type KyInstance = typeof ky; + const messageCenter = MessageCenter.getInstance(); const _sendMessage = messageCenter.getMessageSender('affine'); -export const bareClient = ky.extend({ +export const bareClient: KyInstance = ky.extend({ prefixUrl: 'http://localhost:8080', retry: 1, hooks: { @@ -26,7 +28,7 @@ export const bareClient = ky.extend({ }, }); -export const client = bareClient.extend({ +export const client: KyInstance = bareClient.extend({ hooks: { beforeRequest: [ async request => { From 21d24ad54284bb4d8aac969cd75f3a5450703c69 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 15:54:21 +0800 Subject: [PATCH 061/104] fix: deepscan error (#733) --- packages/app/src/components/editor/index.tsx | 2 +- .../src/pages/public-workspace/[workspaceId]/[pageId].tsx | 2 +- packages/app/src/providers/app-state-provider/Provider.tsx | 7 ++++--- packages/data-center/src/datacenter.ts | 4 +++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/app/src/components/editor/index.tsx b/packages/app/src/components/editor/index.tsx index 3d62a9323a..e7d962e8dd 100644 --- a/packages/app/src/components/editor/index.tsx +++ b/packages/app/src/components/editor/index.tsx @@ -60,7 +60,7 @@ export const Editor = ({ page, workspace, setEditor }: Props) => { } setEditor(editor); - document.title = page?.meta.title || 'Untitled'; + document.title = page.meta.title || 'Untitled'; return ret; }, [workspace, page, setEditor]); diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx index 734e627f3e..a3629580b5 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx @@ -25,7 +25,7 @@ const Page: NextPageWithLayout = () => { p => p.id === router.query.pageId ) ) { - const page = data.blocksuiteWorkspace?.getPage( + const page = data.blocksuiteWorkspace.getPage( router.query.pageId as string ); page && setPage(page); diff --git a/packages/app/src/providers/app-state-provider/Provider.tsx b/packages/app/src/providers/app-state-provider/Provider.tsx index 77b50384fa..59cfee3344 100644 --- a/packages/app/src/providers/app-state-provider/Provider.tsx +++ b/packages/app/src/providers/app-state-provider/Provider.tsx @@ -101,14 +101,15 @@ export const AppStateProvider = ({ } const workspace = (await dataCenter.loadWorkspace(workspaceId)) ?? null; let isOwner; - if (workspace.provider === 'local') { + if (workspace?.provider === 'local') { // isOwner is useful only in the cloud isOwner = true; } else { - isOwner = workspace.owner && user?.id === workspace.owner.id; + // We must ensure workspace.owner exists, then ensure id same. + isOwner = workspace?.owner && user?.id === workspace.owner.id; } const pageList = - (workspace.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]) ?? []; + (workspace?.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]) ?? []; setAppState({ ...appState, currentWorkspace: workspace, diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index e8876ac2d6..1488d8b84d 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -150,7 +150,9 @@ export class DataCenter { * @param {string} workspaceId workspace id * @returns {Promise} */ - public async loadWorkspace(workspaceId: string) { + public async loadWorkspace( + workspaceId: string + ): Promise { const workspaceUnit = this._workspaceUnitCollection.find(workspaceId); assert(workspaceUnit, 'Workspace not found'); const currentProvider = this.providerMap.get(workspaceUnit.provider); From 2c1eee11948aae093b8d51fcf9e0fde56b1437c2 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 17:10:08 +0800 Subject: [PATCH 062/104] fix: websocket should be link to blocksuiteWorkspace, not workspace id (#735) --- .../data-center/src/provider/affine/affine.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index b71019b91a..a07340f08a 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -37,7 +37,7 @@ const { export class AffineProvider extends BaseProvider { public id = 'affine'; private _onTokenRefresh?: Callback = undefined; - private _wsMap: Map = new Map(); + private _wsMap: Map = new Map(); private _apis: Apis; private _channel?: WebsocketClient; // private _idbMap: Map = new Map(); @@ -147,7 +147,7 @@ export class AffineProvider extends BaseProvider { const { doc, room } = workspace; assert(room); assert(doc); - let ws = this._wsMap.get(room); + let ws = this._wsMap.get(workspace); if (!ws) { const wsUrl = `${ window.location.protocol === 'https:' ? 'wss' : 'ws' @@ -155,7 +155,7 @@ export class AffineProvider extends BaseProvider { ws = new WebsocketProvider(wsUrl, room, doc, { params: { token: this._apis.token.refresh }, }); - this._wsMap.set(room, ws); + this._wsMap.set(workspace, ws); } return ws; } @@ -182,8 +182,8 @@ export class AffineProvider extends BaseProvider { this.linkLocal(workspace); const ws = this._getWebsocketProvider(workspace); // close all websocket links - Array.from(this._wsMap.entries()).forEach(([id, ws]) => { - if (id !== room) { + Array.from(this._wsMap.entries()).forEach(([blocksuiteWorkspace, ws]) => { + if (blocksuiteWorkspace !== workspace) { ws.disconnect(); } }); @@ -279,7 +279,13 @@ export class AffineProvider extends BaseProvider { public override async closeWorkspace(id: string) { // const idb = this._idbMap.get(id); // idb?.destroy(); - const ws = this._wsMap.get(id); + const workspaceUnit = this._workspaces.get(id); + const ws = workspaceUnit?.blocksuiteWorkspace + ? this._wsMap.get(workspaceUnit?.blocksuiteWorkspace) + : null; + if (!ws) { + console.error('close workspace websocket which not exist.'); + } ws?.disconnect(); } From c95667eafbe7f92181281025aad5abac9bebce2b Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Fri, 13 Jan 2023 17:16:15 +0800 Subject: [PATCH 063/104] fix: fix reconnect logic (#730) --- .../src/provider/affine/channel.ts | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/data-center/src/provider/affine/channel.ts b/packages/data-center/src/provider/affine/channel.ts index 1503a8b450..da9e81c35e 100644 --- a/packages/data-center/src/provider/affine/channel.ts +++ b/packages/data-center/src/provider/affine/channel.ts @@ -3,13 +3,13 @@ import { Logger } from 'src/types'; import { token } from './apis/token'; import * as url from 'lib0/url'; -const RECONNECT_INTERVAL_TIME = 5000; +const RECONNECT_INTERVAL_TIME = 500; const MAX_RECONNECT_TIMES = 50; export class WebsocketClient extends websocket.WebsocketClient { public shouldReconnect = false; - private _reconnectInterval: number | null = null; private _logger: Logger; + private _retryTimes = 0; constructor( serverUrl: string, logger: Logger, @@ -34,30 +34,28 @@ export class WebsocketClient extends websocket.WebsocketClient { this.on('connect', () => { this._logger('Affine channel connected'); this.shouldReconnect = true; - if (this._reconnectInterval) { - window.clearInterval(this._reconnectInterval); - } + this._retryTimes = 0; }); this.on('disconnect', ({ error }: { error: Error }) => { if (error) { - let times = 0; // Try reconnect if connect error has occurred - this._reconnectInterval = window.setInterval(() => { - if (this.shouldReconnect && token.isLogin && !this.connected) { - try { - this.connect(); - this._logger(`try reconnect channel ${++times} times`); - if (times > MAX_RECONNECT_TIMES) { + if (this.shouldReconnect && token.isLogin && !this.connected) { + try { + setTimeout(() => { + if (this._retryTimes <= MAX_RECONNECT_TIMES) { + this.connect(); + this._logger( + `try reconnect channel ${++this._retryTimes} times` + ); + } else { this._logger('reconnect failed, max reconnect times reached'); - this._reconnectInterval && - window.clearInterval(this._reconnectInterval); } - } catch (e) { - this._logger('reconnect failed', e); - } + }, RECONNECT_INTERVAL_TIME); + } catch (e) { + this._logger('reconnect failed', e); } - }, RECONNECT_INTERVAL_TIME); + } } }); } From 911cc3e2179d412b41d374f1ec13c242818f166c Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Fri, 13 Jan 2023 17:41:13 +0800 Subject: [PATCH 064/104] Fix/publish style (#732) --- .../workspace-setting/PublishPage.tsx | 44 ++++++++++--------- .../components/workspace-setting/SyncPage.tsx | 2 +- .../workspace-setting/general/General.tsx | 23 +++++----- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index d61bf4fcf9..f2a87c7d51 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -55,27 +55,29 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => {
)}
- {workspace.published ? ( - - ) : ( - - )} + + {workspace.published ? ( + + ) : ( + + )} +
) : ( diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index 7d56d0233c..72f1d08fda 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -69,7 +69,7 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { placement="bottom-end" disablePortal={true} > - diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index 8b444bb55f..7d9294f276 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -12,7 +12,7 @@ import Input from '@/ui/input'; import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceDelete } from './delete'; import { WorkspaceLeave } from './leave'; -import { Upload } from '@/components/file-upload'; +// import { Upload } from '@/components/file-upload'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; @@ -20,7 +20,7 @@ import { useTranslation } from '@affine/i18n'; export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); - const [uploading, setUploading] = useState(false); + // const [uploading, setUploading] = useState(false); const [workspaceName, setWorkspaceName] = useState(workspace.name); const { currentWorkspace, isOwner } = useAppState(); const { updateWorkspace } = useWorkspaceHelper(); @@ -34,13 +34,13 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { updateWorkspace({ name: workspaceName }, currentWorkspace); }; - const fileChange = async (file: File) => { - setUploading(true); - const blob = new Blob([file], { type: file.type }); - currentWorkspace && - (await updateWorkspace({ avatarBlob: blob }, currentWorkspace)); - setUploading(false); - }; + // const fileChange = async (file: File) => { + // setUploading(true); + // const blob = new Blob([file], { type: file.type }); + // currentWorkspace && + // (await updateWorkspace({ avatarBlob: blob }, currentWorkspace)); + // setUploading(false); + // }; return workspace ? (
@@ -58,12 +58,13 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { workspaceUnit={workspace} />
- - + */} {/* TODO: add upload logic */} {t('Workspace Name')} From a739c1f773b7a98dbf71698ec1b3c959f40c0f26 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 18:29:02 +0800 Subject: [PATCH 065/104] =?UTF-8?q?fix:=20@blocksuite/store=20was=20alread?= =?UTF-8?q?y=20imported.=20This=20breaks=20constructor=20=E2=80=A6=20(#736?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …checks and will lead to issues --- packages/data-center/package.json | 7 +--- pnpm-lock.yaml | 66 +++---------------------------- 2 files changed, 7 insertions(+), 66 deletions(-) diff --git a/packages/data-center/package.json b/packages/data-center/package.json index d8e0f47f1b..11031a8e4c 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -23,7 +23,8 @@ "@playwright/test": "^1.29.1", "@types/debug": "^4.1.7", "fake-indexeddb": "4.0.1", - "typescript": "^4.8.4" + "typescript": "^4.8.4", + "yjs": "^13.5.44" }, "dependencies": { "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", @@ -37,9 +38,5 @@ "lib0": "^0.2.58", "swr": "^2.0.0", "y-protocols": "^1.0.5" - }, - "peerDependencies": { - "@blocksuite/blocks": "0.3.1-*", - "@blocksuite/store": "0.3.1-*" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7edf50741..e3871e7978 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,9 +144,10 @@ importers: swr: ^2.0.0 typescript: ^4.8.4 y-protocols: ^1.0.5 + yjs: ^13.5.44 dependencies: - '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 - '@blocksuite/store': 0.4.0-20230111171650-bc63456 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -161,6 +162,7 @@ importers: '@types/debug': 4.1.7 fake-indexeddb: 4.0.1 typescript: 4.9.3 + yjs: 13.5.44 packages/i18n: specifiers: @@ -1501,27 +1503,6 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@blocksuite/blocks/0.4.0-20230111171650-bc63456: - resolution: {integrity: sha512-7fpb++pT9laoyLFWl4h09v7TUqZ/9udMrC1qxdX2XFgMPJjg3MJ9RG+Ud2s/zqZ1SkU1+0hMBvJP5ci9vV44gw==} - dependencies: - '@blocksuite/global': 0.4.0-20230111171650-bc63456 - '@blocksuite/phasor': 0.4.0-20230111171650-bc63456 - '@blocksuite/store': 0.4.0-20230111171650-bc63456 - '@tldraw/intersect': 1.8.0 - autosize: 5.0.2 - highlight.js: 11.7.0 - hotkeys-js: 3.10.1 - lit: 2.6.1 - perfect-freehand: 1.2.0 - quill: 1.3.7 - quill-cursors: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - yjs - dev: false - /@blocksuite/blocks/0.4.0-20230111171650-bc63456_yjs@13.5.44: resolution: {integrity: sha512-7fpb++pT9laoyLFWl4h09v7TUqZ/9udMrC1qxdX2XFgMPJjg3MJ9RG+Ud2s/zqZ1SkU1+0hMBvJP5ci9vV44gw==} dependencies: @@ -1572,12 +1553,6 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.4.0-20230111171650-bc63456: - resolution: {integrity: sha512-fzmrG8KVJXkm5YyvHpPG1RRFhXjzuOey8OIoDu+/z87n9HJc4SkOd9JKH6wEL37F7P5ZoEM9Yl9YHxQjUc4/CA==} - peerDependencies: - yjs: ^13 - dev: false - /@blocksuite/phasor/0.4.0-20230111171650-bc63456_yjs@13.5.44: resolution: {integrity: sha512-fzmrG8KVJXkm5YyvHpPG1RRFhXjzuOey8OIoDu+/z87n9HJc4SkOd9JKH6wEL37F7P5ZoEM9Yl9YHxQjUc4/CA==} peerDependencies: @@ -1586,27 +1561,6 @@ packages: yjs: 13.5.44 dev: false - /@blocksuite/store/0.4.0-20230111171650-bc63456: - resolution: {integrity: sha512-f/PKFPadA0KZq/wSLxxlS29c4SDuMfzHN1/gdrxFEIY0gC8caK2jZnT4K62R9Nquik/mXL60h8fBVAkQ0KbHzg==} - peerDependencies: - yjs: ^13 - dependencies: - '@blocksuite/global': 0.4.0-20230111171650-bc63456 - '@types/flexsearch': 0.7.3 - '@types/quill': 1.3.10 - buffer: 6.0.3 - flexsearch: 0.7.21 - idb-keyval: 6.2.0 - ky: 0.33.1 - lib0: 0.2.58 - y-protocols: 1.0.5 - y-webrtc: 10.2.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /@blocksuite/store/0.4.0-20230111171650-bc63456_yjs@13.5.44: resolution: {integrity: sha512-f/PKFPadA0KZq/wSLxxlS29c4SDuMfzHN1/gdrxFEIY0gC8caK2jZnT4K62R9Nquik/mXL60h8fBVAkQ0KbHzg==} peerDependencies: @@ -6571,7 +6525,6 @@ packages: /isomorphic.js/0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - dev: false /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} @@ -7216,19 +7169,11 @@ packages: type-check: 0.4.0 dev: true - /lib0/0.2.52: - resolution: {integrity: sha512-CjxlM7UgICfN6b2OPALBXchIBiNk6jE+1g7JP8ha+dh1xKRDSYpH0WQl1+rMqCju49xUnwPG34v4CR5/rPOZhg==} - engines: {node: '>=14'} - dependencies: - isomorphic.js: 0.2.5 - dev: false - /lib0/0.2.58: resolution: {integrity: sha512-6ovqPaYfOKU7GkkVxz/wjMR0zsqmNsISLvH+h9Lx5YNtWDZey69aYsTGXaSVpUPpJ+ZFtIvcZHsTGL3MbwOM8A==} engines: {node: '>=14'} dependencies: isomorphic.js: 0.2.5 - dev: false /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} @@ -9908,8 +9853,7 @@ packages: /yjs/13.5.44: resolution: {integrity: sha512-UL+abIh2lQonqXfaJ+en7z9eGshpY11j1zNLc2kDYs0vrTjee4gZJUXC3ZsuhP6geQt0IRU04epCGRaVPQAVCA==} dependencies: - lib0: 0.2.52 - dev: false + lib0: 0.2.58 /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} From b8efa9aa2572dbc7089135fd841fb96910cb7e30 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 18:42:37 +0800 Subject: [PATCH 066/104] fix: change request baseUrl to dynamic (#737) --- packages/data-center/src/provider/affine/apis/request.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/data-center/src/provider/affine/apis/request.ts b/packages/data-center/src/provider/affine/apis/request.ts index c5bdf7e300..306ac5b9e7 100644 --- a/packages/data-center/src/provider/affine/apis/request.ts +++ b/packages/data-center/src/provider/affine/apis/request.ts @@ -9,7 +9,7 @@ const messageCenter = MessageCenter.getInstance(); const _sendMessage = messageCenter.getMessageSender('affine'); export const bareClient: KyInstance = ky.extend({ - prefixUrl: 'http://localhost:8080', + prefixUrl: '/', retry: 1, hooks: { // afterResponse: [ From e1234df1412498f32c7550be8e9be031ada8435d Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 13 Jan 2023 21:06:10 +0800 Subject: [PATCH 067/104] feat: throw error if user not found --- packages/app/src/providers/app-state-provider/Provider.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/app/src/providers/app-state-provider/Provider.tsx b/packages/app/src/providers/app-state-provider/Provider.tsx index 59cfee3344..9ec23cd69c 100644 --- a/packages/app/src/providers/app-state-provider/Provider.tsx +++ b/packages/app/src/providers/app-state-provider/Provider.tsx @@ -134,7 +134,11 @@ export const AppStateProvider = ({ const login = async () => { const { dataCenter } = appState; await dataCenter.login(); + const user = (await dataCenter.getUserInfo()) as User; + if (!user) { + throw new Error('User info not found'); + } setAppState({ ...appState, user, From d6007a54e7197b7d6e1352e3bb149eb3265080e0 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 13 Jan 2023 21:21:20 +0800 Subject: [PATCH 068/104] feat: add danger to sign out button --- packages/app/src/components/workspace-modal/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index b9e833a27a..910d0fbacd 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -143,6 +143,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { ) : ( )} + {!loaded && ( + + + + )} Date: Fri, 13 Jan 2023 22:17:10 +0800 Subject: [PATCH 070/104] feat: add loading for PublishPage --- .../workspace-setting/PublishPage.tsx | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index f2a87c7d51..d8692acbb4 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -5,7 +5,7 @@ import { StyledPublishExplanation, StyledSettingH2, } from './style'; - +import { useState } from 'react'; import { Button } from '@/ui/button'; import Input from '@/ui/input'; import { toast } from '@/ui/toast'; @@ -13,10 +13,13 @@ import { toast } from '@/ui/toast'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { useTranslation } from '@affine/i18n'; +import Loading from '@/components/loading'; +import { Wrapper } from '@/ui/layout'; export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const shareUrl = window.location.host + '/public-workspace/' + workspace.id; const { publishWorkspace, enableWorkspace } = useWorkspaceHelper(); const { t } = useTranslation(); + const [loaded, setLoaded] = useState(true); const togglePublic = async (flag: boolean) => { await publishWorkspace(workspace.id.toString(), flag); }; @@ -58,8 +61,10 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {workspace.published ? ( ) : ( - {/* */} + )} From af2359154184849ba52ab75acfabddc4b31fb333 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Sat, 14 Jan 2023 10:07:59 +0800 Subject: [PATCH 077/104] chore: support 4 environments for developers --- packages/app/next.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/app/next.config.js b/packages/app/next.config.js index 478bbfa12e..2e54ff005a 100644 --- a/packages/app/next.config.js +++ b/packages/app/next.config.js @@ -12,6 +12,9 @@ const EDITOR_VERSION = enableDebugLocal const profileTarget = { ac: '100.85.73.88:12001', dev: '100.77.180.48:11001', + test: '100.77.180.48:11001', + stage: '', + pro: 'http://pathfinder.affine.pro', local: '127.0.0.1:3000', }; From c7c8ea71037433a2fb872f34c1291ab3404ecfc2 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Sat, 14 Jan 2023 10:12:38 +0800 Subject: [PATCH 078/104] chore: remove unused code --- .../app/src/pages/public-workspace/[workspaceId]/[pageId].tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx index 81ae823295..4993246384 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx @@ -7,8 +7,6 @@ import { useRouter } from 'next/router'; import { Page as PageStore, Workspace } from '@blocksuite/store'; import { PageLoading } from '@/components/loading'; -import { useTranslation } from '@affine/i18n'; - const DynamicBlocksuite = dynamic(() => import('@/components/editor'), { ssr: false, }); @@ -18,7 +16,7 @@ const Page: NextPageWithLayout = () => { const { dataCenter } = useAppState(); const router = useRouter(); const [loaded, setLoaded] = useState(false); - const { t } = useTranslation(); + useEffect(() => { dataCenter .loadPublicWorkspace(router.query.workspaceId as string) From cc00f2cb2dc52c490b04f4000c7be5b4a6688027 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Mon, 16 Jan 2023 18:23:09 +0800 Subject: [PATCH 079/104] fix: fix logout --- packages/data-center/src/provider/affine/affine.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index d806ed2f46..025ef96d39 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -407,6 +407,7 @@ export class AffineProvider extends BaseProvider { token.clear(); this._channel?.disconnect(); this._wsMap.forEach(ws => ws.disconnect()); + this._workspaces.clear(); storage.removeItem('token'); } From 84dd82aa968b4733fd7f836864190a2520466393 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Tue, 17 Jan 2023 10:26:50 +0800 Subject: [PATCH 080/104] feat: improve clear logic --- packages/data-center/src/workspace-unit-collection.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/data-center/src/workspace-unit-collection.ts b/packages/data-center/src/workspace-unit-collection.ts index b51f5d160f..c44ef3feb0 100644 --- a/packages/data-center/src/workspace-unit-collection.ts +++ b/packages/data-center/src/workspace-unit-collection.ts @@ -122,9 +122,7 @@ export class WorkspaceUnitCollection { }; const clear = () => { - scopedWorkspaceIds.forEach(id => { - remove(id); - }); + remove(Array.from(scopedWorkspaceIds)); }; const update = (workspaceId: string, meta: UpdateWorkspaceUnitParams) => { From d64ae51c94a9feafe3a6bba3cb23fa6879e8324e Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 17 Jan 2023 17:46:34 +0800 Subject: [PATCH 081/104] chore: remove setting tabs icon --- .../pages/workspace/[workspaceId]/setting.tsx | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx index 2a78641d69..ce45fb0f32 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx @@ -4,15 +4,8 @@ import { StyledSettingSidebar, StyledSettingSidebarHeader, StyledSettingTabContainer, - StyledSettingTagIconContainer, WorkspaceSettingTagItem, } from '@/components/workspace-setting/style'; -import { - EditIcon, - UsersIcon, - PublishIcon, - CloudInsyncIcon, -} from '@blocksuite/icons'; import { ReactElement, ReactNode, useState } from 'react'; import { GeneralPage, @@ -30,32 +23,26 @@ type TabNames = 'general' | 'members' | 'publish' | 'sync' | 'export'; const tabMap: { name: TabNames; - icon: ReactNode; panelRender: (workspace: WorkspaceUnit) => ReactNode; }[] = [ { name: 'general', - icon: , panelRender: workspace => , }, { name: 'members', - icon: , panelRender: workspace => , }, { name: 'publish', - icon: , panelRender: workspace => , }, { name: 'sync', - icon: , panelRender: workspace => , }, { name: 'export', - icon: , panelRender: workspace => , }, ]; @@ -74,14 +61,12 @@ const WorkspaceSetting = () => { )?.panelRender; let tableArr: { name: TabNames; - icon: ReactNode; panelRender: (workspace: WorkspaceUnit) => ReactNode; }[] = tabMap; if (!isOwner) { tableArr = [ { name: 'general', - icon: , panelRender: workspace => , }, ]; @@ -93,7 +78,7 @@ const WorkspaceSetting = () => { {t('Workspace Settings')} - {tableArr.map(({ icon, name }) => { + {tableArr.map(({ name }) => { return ( { handleTabChange(name); }} > - - {icon} - {name} ); From de9248b78462ba2d0c6752e833f12d4ae45cca30 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Wed, 18 Jan 2023 01:27:31 +0800 Subject: [PATCH 082/104] feat:workspaces list style --- .../src/components/workspace-modal/index.tsx | 210 ++++++++++-------- pnpm-lock.yaml | 24 ++ 2 files changed, 138 insertions(+), 96 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 5c0424b772..24ceefc288 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -3,12 +3,7 @@ import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; import { Button } from '@/ui/button'; import { useState } from 'react'; import { CreateWorkspaceModal } from '../create-workspace'; -import { - CloudUnsyncedIcon, - CloudInsyncIcon, - UsersIcon, - AddIcon, -} from '@blocksuite/icons'; +import { CloudUnsyncedIcon, UsersIcon, AddIcon } from '@blocksuite/icons'; import { toast } from '@/ui/toast'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; @@ -26,7 +21,7 @@ interface WorkspaceModalProps { export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); const { confirm } = useConfirm(); - const { workspaceList, currentWorkspace, login, user, logout } = + const { workspaceList, currentWorkspace, login, user, logout, isOwner } = useAppState(); const router = useRouter(); const { t } = useTranslation(); @@ -35,8 +30,12 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => {
{t('My Workspaces')} @@ -61,77 +60,68 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { active={item.id === currentWorkspace?.id} key={index} > - -
- -
+
+ +
- + + {item.name || 'AFFiNE'} - -
- - {(item.provider === 'local' || !item.provider) && ( - + + {isOwner ? ( + item.provider === 'local' ? ( +

+ + Local Workspace +

+ ) : ( +

+ + Cloud Workspace +

+ ) + ) : ( +

+ + Joined Workspace +

)} - {item.provider === 'affine' && ( - + {item.provider === 'local' && ( +

+ + All data can be accessed offline +

)} - {item.published && } -
- {/* {item.isLocal ? 'isLocal' : ''}/ */} + {item.published && ( +

+ Published to Web +

+ )} + ); })} -
  • - -
  • + { + setCreateWorkspaceOpen(true); + }} + > +
    + + + +
    + + + New workspace +

    Crete or import

    +
    +
    -

    + {/*

    {t('Tips')} {t('Workspace description')} -

    +

    */}
    {!user ? ( @@ -178,24 +168,6 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { open={createWorkspaceOpen} onClose={() => { setCreateWorkspaceOpen(false); - onClose(); - // confirm({ - // title: 'Enable 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', - // cancelText: 'Skip', - // }).then(confirm => { - // if (confirm) { - // if (user) { - // // workspaceId && - // // updateWorkspaceMeta(workspaceId, { isPublish: true }); - // } else { - // // login(); - // // workspaceId && - // // updateWorkspaceMeta(workspaceId, { isPublish: true }); - // } - // } - // }); }} > @@ -210,7 +182,6 @@ const Header = styled('div')({ }); const Content = styled('div')({ - padding: '0 20px', flexDirection: 'column', alignItems: 'center', gap: '16px', @@ -233,24 +204,71 @@ const Footer = styled('div')({ }); const WorkspaceList = styled('div')({ + maxHeight: '514px', + overflow: 'auto', display: 'grid', - gridRowGap: '10px', - gridColumnGap: '10px', + gridRowGap: '24px', + gridColumnGap: '24px', fontSize: '16px', + marginTop: '36px', gridTemplateColumns: 'repeat(2, 1fr)', }); export const WorkspaceItem = styled.div<{ - active: boolean; + active?: boolean; }>(({ theme, active }) => { - const backgroundColor = active ? theme.colors.hoverBackground : 'transparent'; + const borderColor = active ? theme.colors.primaryColor : 'transparent'; return { cursor: 'pointer', - padding: '8px', - border: '1px solid #eee', - backgroundColor: backgroundColor, + padding: '16px', + height: '124px', + boxShadow: theme.shadow.modal, + display: 'flex', + borderRadius: '12px', + border: `1px solid ${borderColor}`, ':hover': { background: theme.colors.hoverBackground, + '.add-icon': { + border: `1.5px dashed ${theme.colors.primaryColor}`, + svg: { + fill: theme.colors.primaryColor, + }, + }, }, }; }); + +const StyleWorkspaceInfo = styled.div(({ theme }) => { + return { + marginLeft: '16px', + p: { + fontSize: theme.font.xs, + lineHeight: '16px', + }, + svg: { + verticalAlign: 'sub', + marginRight: '10px', + }, + }; +}); + +const StyleWorkspaceTitle = styled.div(({ theme }) => { + return { + fontSize: theme.font.base, + fontWeight: 600, + lineHeight: '24px', + marginBottom: '8px', + }; +}); + +const StyleWorkspaceAdd = styled.div(() => { + return { + width: '58px', + height: '58px', + borderRadius: '100%', + textAlign: 'center', + background: '#f4f5fa', + border: '1.5px dashed #f4f5fa', + lineHeight: '58px', + }; +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3871e7978..c3ea50ad04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2999,6 +2999,7 @@ packages: /@next/env/13.1.0: resolution: {integrity: sha512-6iNixFzCndH+Bl4FetQzOMjxCJqg8fs0LAlZviig1K6mIjOWH2m2oPcHcOg1Ta5VCe7Bx5KG1Hs+NrWDUkBt9A==} + dev: false /@next/eslint-plugin-next/12.3.1: resolution: {integrity: sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw==} @@ -3021,6 +3022,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true /@next/swc-android-arm64/12.3.1: @@ -3038,6 +3040,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: false optional: true /@next/swc-darwin-arm64/12.3.1: @@ -3055,6 +3058,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@next/swc-darwin-x64/12.3.1: @@ -3072,6 +3076,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true /@next/swc-freebsd-x64/12.3.1: @@ -3089,6 +3094,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm-gnueabihf/12.3.1: @@ -3106,6 +3112,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm64-gnu/12.3.1: @@ -3123,6 +3130,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm64-musl/12.3.1: @@ -3140,6 +3148,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-x64-gnu/12.3.1: @@ -3157,6 +3166,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-x64-musl/12.3.1: @@ -3174,6 +3184,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-win32-arm64-msvc/12.3.1: @@ -3191,6 +3202,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@next/swc-win32-ia32-msvc/12.3.1: @@ -3208,6 +3220,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true /@next/swc-win32-x64-msvc/12.3.1: @@ -3225,6 +3238,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true /@nodelib/fs.scandir/2.1.5: @@ -3587,6 +3601,7 @@ packages: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: tslib: 2.4.0 + dev: false /@szmarczak/http-timer/5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -4579,6 +4594,7 @@ packages: /client-only/0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false /cliui/6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -7520,6 +7536,7 @@ packages: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: false /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -7642,6 +7659,7 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: false /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -7992,6 +8010,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false /preferred-pm/3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} @@ -8161,6 +8180,7 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: false /react-i18next/11.18.6_i18next@21.10.0: resolution: {integrity: sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==} @@ -8257,6 +8277,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -8534,6 +8555,7 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false /schema-utils/2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} @@ -8692,6 +8714,7 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false /source-map-support/0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -8940,6 +8963,7 @@ packages: dependencies: client-only: 0.0.1 react: 18.2.0 + dev: false /stylis/4.0.13: resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} From e8a5d9b784f5c802db82390e0fbbc96e1bad2e91 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Wed, 18 Jan 2023 02:12:51 +0800 Subject: [PATCH 083/104] feat: login style --- .../src/components/workspace-modal/index.tsx | 135 +++++++++++++----- 1 file changed, 99 insertions(+), 36 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 24ceefc288..e944e00d2c 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -1,11 +1,20 @@ import { styled } from '@/styles'; import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; -import { Button } from '@/ui/button'; +import { IconButton } from '@/ui/button'; import { useState } from 'react'; import { CreateWorkspaceModal } from '../create-workspace'; -import { CloudUnsyncedIcon, UsersIcon, AddIcon } from '@blocksuite/icons'; +import { + CloudUnsyncedIcon, + UsersIcon, + AddIcon, + LogOutIcon, + CloudInsyncIcon, +} from '@blocksuite/icons'; import { toast } from '@/ui/toast'; -import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; +import { + WorkspaceAvatar, + WorkspaceUnitAvatar, +} from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; import { useConfirm } from '@/providers/ConfirmProvider'; @@ -82,7 +91,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { ) ) : (

    - + Joined Workspace

    )} @@ -125,7 +134,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => {
    {!user ? ( - + + + + Sign in to sync with AFFINE Cloud + ) : ( - +
    +
    + +
    + +

    {user.name}

    +

    {user.email}

    +
    +
    + { + confirm({ + title: 'Sign out?', + + content: `All data has been stored in the cloud. `, + confirmText: 'Sign out', + cancelText: 'Cancel', + }).then(async confirm => { + if (confirm) { + if (user) { + await logout(); + router.replace(`/workspace`); + toast('Enabled success'); + } + } + }); + }} + > + + +
    +
    )} {!loaded && ( @@ -196,15 +223,8 @@ const ContentTitle = styled('span')({ paddingBottom: '16px', }); -const Footer = styled('div')({ - height: '70px', - paddingLeft: '24px', - marginTop: '32px', - textAlign: 'center', -}); - const WorkspaceList = styled('div')({ - maxHeight: '514px', + height: '500px', overflow: 'auto', display: 'grid', gridRowGap: '24px', @@ -270,5 +290,48 @@ const StyleWorkspaceAdd = styled.div(() => { background: '#f4f5fa', border: '1.5px dashed #f4f5fa', lineHeight: '58px', + marginTop: '2px', + }; +}); + +const Footer = styled('div')({ + paddingTop: '16px', +}); + +const StyleUserInfo = styled.div(({ theme }) => { + return { + textAlign: 'left', + marginLeft: '16px', + marginTop: '16px', + flex: 1, + p: { + lineHeight: '24px', + color: theme.colors.iconColor, + }, + 'p:nth-child(1)': { + color: theme.colors.textColor, + fontWeight: 600, + }, + }; +}); + +const StyleSignIn = styled.div(({ theme }) => { + return { + cursor: 'pointer', + fontSize: '16px', + fontWeight: 700, + span: { + display: 'inline-block', + width: '40px', + height: '40px', + borderRadius: '40px', + backgroundColor: theme.colors.innerHoverBackground, + textAlign: 'center', + lineHeight: '44px', + marginRight: '16px', + svg: { + fill: theme.colors.primaryColor, + }, + }, }; }); From 68dc20cd2e88561c821f121d8acb4e747cb4703e Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 15:27:54 +0800 Subject: [PATCH 084/104] chore: add themeModeSwitch to default Item --- packages/app/src/components/header/Header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/header/Header.tsx b/packages/app/src/components/header/Header.tsx index 41fced5907..a8a50bfefe 100644 --- a/packages/app/src/components/header/Header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -44,7 +44,7 @@ const HeaderRightItems: Record = { }; export const Header = ({ - rightItems = ['syncUser'], + rightItems = ['syncUser', 'themeModeSwitch'], children, }: PropsWithChildren<{ rightItems?: HeaderRightItemNames[] }>) => { const [showWarning, setShowWarning] = useState(shouldShowWarning()); From 32babd80269d31bee261e6c060f8b391d87ad34d Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 15:30:03 +0800 Subject: [PATCH 085/104] chore: update General style --- .../workspace-setting/general/General.tsx | 26 ++++--- .../src/components/workspace-setting/style.ts | 72 ++++++++++++++----- 2 files changed, 69 insertions(+), 29 deletions(-) diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index 7d9294f276..2ac37c53c3 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -3,15 +3,17 @@ import { // StyledSettingAvatar, StyledSettingAvatarContent, StyledSettingInputContainer, + StyledDoneButtonContainer, + StyledInput, } from './style'; import { StyledSettingH2 } from '../style'; import { useState } from 'react'; -import { Button, TextButton } from '@/ui/button'; -import Input from '@/ui/input'; +import { Button } from '@/ui/button'; import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceDelete } from './delete'; import { WorkspaceLeave } from './leave'; +import { DoneIcon, CloudUnsyncedIcon } from '@blocksuite/icons'; // import { Upload } from '@/components/file-upload'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { WorkspaceUnit } from '@affine/datacenter'; @@ -44,7 +46,7 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { return workspace ? (
    - {t('Workspace Icon')} + Workspace Avatar
    { {t('Workspace Name')} - + > {isOwner ? ( - { handleUpdateWorkspaceName(); }} - style={{ marginLeft: '0px' }} > - ✔️ - + + ) : null} {t('Workspace Type')} - {workspace.provider} + + Local workspace {isOwner ? ( @@ -99,6 +102,7 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { - - + {buttonDirection === 'row' ? ( + + + + + ) : ( + + + + + )} ); diff --git a/packages/app/src/ui/confirm/styles.ts b/packages/app/src/ui/confirm/styles.ts index ef2c86155d..3646cdcc38 100644 --- a/packages/app/src/ui/confirm/styles.ts +++ b/packages/app/src/ui/confirm/styles.ts @@ -3,8 +3,10 @@ import { ModalWrapper } from '@/ui/modal'; export const StyledModalWrapper = styled(ModalWrapper)(() => { return { - width: '460px', - padding: '46px 60px 32px', + minWidth: '460px', + maxWidth: '560px', + maxHeight: '292px', + padding: '44px 84px 32px 84px', }; }); @@ -14,6 +16,7 @@ export const StyledConfirmTitle = styled.div(({ theme }) => { fontWeight: 600, textAlign: 'center', color: theme.colors.popoverColor, + lineHeight: '28px', }; }); @@ -23,12 +26,21 @@ export const StyledConfirmContent = styled.div(({ theme }) => { textAlign: 'center', marginTop: '12px', color: theme.colors.textColor, + lineHeight: '26px', }; }); -export const StyledButtonWrapper = styled.div(() => { +export const StyledColumnButtonWrapper = styled.div(() => { return { ...displayFlex('center', 'center'), + flexDirection: 'column', + marginTop: '32px', + }; +}); +export const StyledRowButtonWrapper = styled.div(() => { + return { + ...displayFlex('center', 'center'), + flexDirection: 'row', marginTop: '32px', }; }); From 74d7b7ab9da466f23efb99547cb2bb952279d3e1 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 15:58:24 +0800 Subject: [PATCH 088/104] chore: update button ui component --- packages/app/src/ui/button/styles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/ui/button/styles.ts b/packages/app/src/ui/button/styles.ts index 54cda81dcc..8cbf57f685 100644 --- a/packages/app/src/ui/button/styles.ts +++ b/packages/app/src/ui/button/styles.ts @@ -182,7 +182,7 @@ export const StyledButton = styled('button', { paddingLeft: padding, paddingRight: padding, border: '1px solid', - ...displayInlineFlex('flex-start', 'center'), + ...displayInlineFlex('center', 'center'), position: 'relative', // TODO: disabled color is not decided ...(disabled From 48ac7aad60dca4dfafef98b15a78d709e3888289 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 16:00:00 +0800 Subject: [PATCH 089/104] chore: update General delete button style --- .../general/delete/Delete.tsx | 4 ++- .../workspace-setting/general/delete/style.ts | 18 ++++++----- .../workspace-setting/general/style.ts | 31 +++++++++++++++++-- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx index c6db311e2e..3fcab8c158 100644 --- a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx +++ b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx @@ -46,7 +46,7 @@ export const WorkspaceDelete = ({ - {t('Delete Workspace')} + {t('Delete Workspace')}? {workspace.provider === 'local' ? ( @@ -75,6 +75,8 @@ export const WorkspaceDelete = ({ onChange={handlerInputChange} placeholder={t('Delete Workspace placeholder')} value={deleteStr} + width={284} + height={42} > diff --git a/packages/app/src/components/workspace-setting/general/delete/style.ts b/packages/app/src/components/workspace-setting/general/delete/style.ts index 939ba638bc..d029d54fea 100644 --- a/packages/app/src/components/workspace-setting/general/delete/style.ts +++ b/packages/app/src/components/workspace-setting/general/delete/style.ts @@ -4,20 +4,20 @@ export const StyledModalWrapper = styled('div')(({ theme }) => { return { position: 'relative', padding: '0px', - width: '460px', + width: '560px', background: theme.colors.popoverBackground, borderRadius: '12px', + height: '312px', }; }); export const StyledModalHeader = styled('div')(({ theme }) => { return { margin: '44px 0px 12px 0px', - width: '460px', + width: '560px', fontWeight: '600', fontSize: '20px;', - textAlign: 'left', - paddingLeft: '20px', + textAlign: 'center', color: theme.colors.popoverColor, }; }); @@ -37,21 +37,25 @@ export const StyledTextContent = styled('div')(() => { }; }); -export const StyledInputContent = styled('div')(() => { +export const StyledInputContent = styled('div')(({ theme }) => { return { display: 'flex', flexDirection: 'row', justifyContent: 'center', - margin: '20px 0 24px 0', + margin: '32px 0', + fontSize: theme.font.base, }; }); export const StyledButtonContent = styled('div')(() => { return { + position: 'absolute', + left: '50%', + transform: 'translateX(-50%)', + bottom: '32px', display: 'flex', flexDirection: 'row', justifyContent: 'center', - margin: '0px 0 32px 0', }; }); diff --git a/packages/app/src/components/workspace-setting/general/style.ts b/packages/app/src/components/workspace-setting/general/style.ts index 739ec24aec..c46f9706c9 100644 --- a/packages/app/src/components/workspace-setting/general/style.ts +++ b/packages/app/src/components/workspace-setting/general/style.ts @@ -1,15 +1,42 @@ -import { styled } from '@/styles'; +import { displayFlex, styled } from '@/styles'; import MuiAvatar from '@mui/material/Avatar'; +import IconButton from '@/ui/button/IconButton'; +import Input from '@/ui/input'; export const StyledSettingInputContainer = styled('div')(() => { return { marginTop: '12px', + width: '100%', + ...displayFlex('flex-start', 'center'), }; }); export const StyledDeleteButtonContainer = styled('div')(() => { return { - marginTop: '30px', + position: 'absolute', + bottom: '0', + left: '50%', + marginBottom: '20px', + transform: 'translateX(-50%)', + }; +}); +export const StyledDoneButtonContainer = styled(IconButton)(({ theme }) => { + return { + border: `1px solid ${theme.colors.borderColor}`, + borderRadius: '10px', + height: '32px', + overflow: 'hidden', + marginLeft: '20px', + ':hover': { + borderColor: theme.colors.primaryColor, + }, + }; +}); +export const StyledInput = styled(Input)(({ theme }) => { + return { + border: `1px solid ${theme.colors.borderColor}`, + borderRadius: '10px', + fontSize: theme.font.sm, }; }); From 5006c2360aa8e6fee09195d51ee3c23f61c66df5 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 16:00:23 +0800 Subject: [PATCH 090/104] chore: update publishPage style --- .../workspace-setting/PublishPage.tsx | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index d8692acbb4..4ff35d776d 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -4,6 +4,7 @@ import { StyledPublishCopyContainer, StyledPublishExplanation, StyledSettingH2, + StyledStopPublishContainer, } from './style'; import { useState } from 'react'; import { Button } from '@/ui/button'; @@ -42,7 +43,9 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {t('Publishing')} - {t('Share with link')} + + {t('Share with link')} + @@ -54,24 +57,27 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { ) : ( - {'Publishing Description'} + {t('Publishing Description')} )} - - {workspace.published ? ( + + {workspace.published ? ( + - ) : ( + + ) : ( + - )} - + + )}
    ) : ( From 09fb0f8dfcdcaaa08f16c42f1d5b2cab8d4978b1 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 16:00:41 +0800 Subject: [PATCH 091/104] chore: update syncPage style --- .../components/workspace-setting/SyncPage.tsx | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index 72f1d08fda..f65a24ab7b 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -2,6 +2,8 @@ import { StyledPublishContent, StyledPublishCopyContainer, StyledPublishExplanation, + StyledWorkspaceName, + StyledWorkspaceType, } from './style'; import { DownloadIcon } from '@blocksuite/icons'; import { Button } from '@/ui/button'; @@ -9,6 +11,7 @@ import { Menu, MenuItem } from '@/ui/menu'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { Trans, useTranslation } from '@affine/i18n'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const { enableWorkspace } = useWorkspaceHelper(); const { t } = useTranslation(); @@ -18,11 +21,20 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {workspace.provider === 'local' ? ( <> - {t('Sync Description', { - workspaceName: workspace.name ?? 'Affine', - })} + + +  {workspace.name}  + + is a Local Workspace. - + + All data is stored on the current device. You can enable AFFiNE + Cloud for this workspace to keep data in sync with the cloud. + From 9702e9e38022528003395c4c309aa368aa025f9a Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 16:01:11 +0800 Subject: [PATCH 092/104] chore: update settings page style --- .../pages/workspace/[workspaceId]/setting.tsx | 80 ++++++++++--------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx index ce45fb0f32..11de4aa598 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx @@ -2,7 +2,6 @@ import { StyledSettingContainer, StyledSettingContent, StyledSettingSidebar, - StyledSettingSidebarHeader, StyledSettingTabContainer, WorkspaceSettingTagItem, } from '@/components/workspace-setting/style'; @@ -14,35 +13,38 @@ import { ExportPage, SyncPage, } from '@/components/workspace-setting'; +import { SettingsIcon } from '@blocksuite/icons'; import { useAppState } from '@/providers/app-state-provider'; import WorkspaceLayout from '@/components/workspace-layout'; import { WorkspaceUnit } from '@affine/datacenter'; import { useTranslation } from '@affine/i18n'; +import { PageListHeader } from '@/components/header'; -type TabNames = 'general' | 'members' | 'publish' | 'sync' | 'export'; +type TabNames = 'General' | 'Sync' | 'Collaboration' | 'Publish' | 'Export'; const tabMap: { name: TabNames; panelRender: (workspace: WorkspaceUnit) => ReactNode; }[] = [ { - name: 'general', + name: 'General', panelRender: workspace => , }, { - name: 'members', - panelRender: workspace => , - }, - { - name: 'publish', - panelRender: workspace => , - }, - { - name: 'sync', + name: 'Sync', panelRender: workspace => , }, { - name: 'export', + name: 'Collaboration', + panelRender: workspace => , + }, + { + name: 'Publish', + panelRender: workspace => , + }, + + { + name: 'Export', panelRender: workspace => , }, ]; @@ -66,38 +68,38 @@ const WorkspaceSetting = () => { if (!isOwner) { tableArr = [ { - name: 'general', + name: 'General', panelRender: workspace => , }, ]; } return ( - - - - {t('Workspace Settings')} - - - {tableArr.map(({ name }) => { - return ( - { - handleTabChange(name); - }} - > - {name} - - ); - })} - - + <> + + }>{t('Settings')} + + + {tableArr.map(({ name }) => { + return ( + { + handleTabChange(name); + }} + > + {name} + + ); + })} + + - - {currentWorkspace && activeTabPanelRender?.(currentWorkspace)} - - + + {currentWorkspace && activeTabPanelRender?.(currentWorkspace)} + + + ); }; WorkspaceSetting.getLayout = function getLayout(page: ReactElement) { From e352dc7f6187bd4e6382dd3e1281e37755b928c2 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 16:01:39 +0800 Subject: [PATCH 093/104] chore: update membersPage style --- .../member/InviteMemberModal.tsx | 8 +- .../workspace-setting/member/MembersPage.tsx | 112 +++++++++--------- .../workspace-setting/member/style.ts | 10 +- .../app/src/hooks/use-workspace-helper.ts | 2 + 4 files changed, 71 insertions(+), 61 deletions(-) diff --git a/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx b/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx index c965e6c0bf..7bd542efb6 100644 --- a/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx +++ b/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx @@ -122,6 +122,7 @@ export const InviteMemberModal = ({ +
    @@ -80,30 +98,30 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { {isOwner ? ( item.provider === 'local' ? (

    - + Local Workspace

    ) : (

    - + Cloud Workspace

    ) ) : (

    - + Joined Workspace

    )} {item.provider === 'local' && (

    - + All data can be accessed offline

    )} {item.published && (

    - Published to Web + Published to Web

    )} @@ -132,14 +150,17 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { {t('Workspace description')}

    */}
    + { + setLoginOpen(false); + }} + >
    {!user ? ( { - setLoaded(false); - await login(); - toast(t('login success')); - setLoaded(true); + setLoginOpen(true); }} > @@ -149,7 +170,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { ) : (
    -
    +
    {

    {user.name}

    {user.email}

    -
    +
    { confirm({ title: 'Sign out?', - content: `All data has been stored in the cloud. `, confirmText: 'Sign out', cancelText: 'Cancel', @@ -185,11 +205,6 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => {
    )} - {!loaded && ( - - - - )}
    { }; const Header = styled('div')({ - position: 'relative', - height: '44px', + display: 'flex', }); const Content = styled('div')({ @@ -214,17 +228,21 @@ const Content = styled('div')({ gap: '16px', flex: 1, }); - -const ContentTitle = styled('span')({ +const HeaderOption = styled.div(() => { + return { + marginLeft: '16px', + }; +}); +const ContentTitle = styled('div')({ fontSize: '20px', - lineHeight: '28px', + lineHeight: '24px', fontWeight: 600, textAlign: 'left', - paddingBottom: '16px', + flex: 1, }); const WorkspaceList = styled('div')({ - height: '500px', + maxHeight: '500px', overflow: 'auto', display: 'grid', gridRowGap: '24px', @@ -266,8 +284,8 @@ const StyleWorkspaceInfo = styled.div(({ theme }) => { lineHeight: '16px', }, svg: { - verticalAlign: 'sub', - marginRight: '10px', + verticalAlign: 'text-bottom', + marginRight: '8px', }, }; }); @@ -320,6 +338,7 @@ const StyleSignIn = styled.div(({ theme }) => { cursor: 'pointer', fontSize: '16px', fontWeight: 700, + color: theme.colors.iconColor, span: { display: 'inline-block', width: '40px', diff --git a/packages/app/src/components/workspace-modal/languageMenu.tsx b/packages/app/src/components/workspace-modal/languageMenu.tsx index 58bedcb47a..d8f907663d 100644 --- a/packages/app/src/components/workspace-modal/languageMenu.tsx +++ b/packages/app/src/components/workspace-modal/languageMenu.tsx @@ -1,10 +1,11 @@ import { LOCALES } from '@affine/i18n'; -import UnfoldMoreIcon from '@mui/icons-material/UnfoldMore'; -import type { TooltipProps } from '@mui/material'; +import { TooltipProps } from '@mui/material'; import { styled } from '@/styles'; -import { Button, Tooltip } from '@mui/material'; +import { Tooltip } from '@mui/material'; import { useState } from 'react'; import { useTranslation } from '@affine/i18n'; +import { ArrowDownIcon } from '@blocksuite/icons'; +import { Button } from '@/ui/button'; export const LanguageMenu = () => { const { i18n } = useTranslation(); @@ -23,6 +24,7 @@ export const LanguageMenu = () => { {LOCALES.map(option => { return ( { @@ -40,14 +42,14 @@ export const LanguageMenu = () => { open={show} > { setShow(!show); }} > {languageName} - + @@ -56,8 +58,6 @@ export const LanguageMenu = () => { const StyledContainer = styled('div')(() => ({ display: 'flex', - flexDirection: 'row', - justifyContent: 'center', alignItems: 'center', })); @@ -88,8 +88,6 @@ const ListItem = styled(Button)(({ theme }) => ({ })); const StyledTitleButton = styled(Button)(({ theme }) => ({ - position: 'absolute', - right: '50px', color: theme.colors.popoverColor, fontSize: theme.font.sm, })); diff --git a/packages/app/src/ui/button/styles.ts b/packages/app/src/ui/button/styles.ts index 54cda81dcc..3e021c23dd 100644 --- a/packages/app/src/ui/button/styles.ts +++ b/packages/app/src/ui/button/styles.ts @@ -202,6 +202,7 @@ export const StyledButton = styled('button', { }, '>span': { marginLeft: '5px', + width: '100%', }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore From e8a472a1fe6884931f4f947a250ec8e3faa6ba6a Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 18 Jan 2023 16:18:10 +0800 Subject: [PATCH 096/104] chore: update membersPage font-size --- .../src/components/workspace-setting/member/MembersPage.tsx | 2 +- packages/app/src/components/workspace-setting/member/style.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/workspace-setting/member/MembersPage.tsx b/packages/app/src/components/workspace-setting/member/MembersPage.tsx index dc6a7132f3..e4b787854c 100644 --- a/packages/app/src/components/workspace-setting/member/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/member/MembersPage.tsx @@ -159,7 +159,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { return ( - <>{t('Collaboration Description')} + {t('Collaboration Description')} + +
    + + + + ); +}; + +const Header = styled('div')({ + position: 'relative', + height: '44px', +}); + +const Content = styled('div')({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: '16px', +}); + +const ContentTitle = styled('h1')({ + fontSize: '20px', + lineHeight: '28px', + fontWeight: 600, + textAlign: 'center', + paddingBottom: '16px', +}); + +const SignDes = styled('div')(({ theme }) => { + return { + fontWeight: 400, + color: theme.colors.textColor, + fontSize: '16px', + }; +}); + +const StyleCheck = styled('span')(() => { + return { + display: 'inline-block', + cursor: 'pointer', + + svg: { + verticalAlign: 'sub', + marginRight: '8px', + }, + }; +}); + +const StyleTips = styled('span')(() => { + return { + userSelect: 'none', + }; +}); diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 104cf5719b..c0dd2a8bd3 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -11,19 +11,18 @@ import { PublishIcon, CloseIcon, } from '@blocksuite/icons'; -import { toast } from '@/ui/toast'; import { WorkspaceAvatar, WorkspaceUnitAvatar, } from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; -import { useConfirm } from '@/providers/ConfirmProvider'; import { useTranslation } from '@affine/i18n'; import { LanguageMenu } from './languageMenu'; import { CloudIcon, LineIcon, LocalIcon, OfflineIcon } from './icons'; import { LoginModal } from '../login-modal'; +import { LogoutModal } from '../logout-modal'; interface WorkspaceModalProps { open: boolean; onClose: () => void; @@ -31,12 +30,12 @@ interface WorkspaceModalProps { export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); - const { confirm } = useConfirm(); const { workspaceList, currentWorkspace, user, logout, isOwner } = useAppState(); const router = useRouter(); const { t } = useTranslation(); const [loginOpen, setLoginOpen] = useState(false); + const [logoutOpen, setLogoutOpen] = useState(false); return (
    @@ -184,20 +183,21 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => {
    { - confirm({ - title: 'Sign out?', - content: `All data has been stored in the cloud. `, - confirmText: 'Sign out', - cancelText: 'Cancel', - }).then(async confirm => { - if (confirm) { - if (user) { - await logout(); - router.replace(`/workspace`); - toast('Enabled success'); - } - } - }); + setLogoutOpen(true); + // confirm({ + // title: 'Sign out?', + // content: `All data has been stored in the cloud. `, + // confirmText: 'Sign out', + // cancelText: 'Cancel', + // }).then(async confirm => { + // // if (confirm) { + // // if (user) { + // // await logout(); + // // router.replace(`/workspace`); + // // toast('Enabled success'); + // // } + // // } + // }); }} > @@ -212,6 +212,16 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { setCreateWorkspaceOpen(false); }} > + { + if (!wait) { + await logout(); + router.replace(`/workspace`); + } + setLogoutOpen(false); + }} + >
    From 7e23aa4618ca5364c36e5f761b6d6a0c52a4ca40 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 09:46:12 +0800 Subject: [PATCH 098/104] fix: rewrite workspacesetting layout --- .../src/components/header/PageListHeader.tsx | 4 +- packages/app/src/components/header/styles.ts | 32 ++--- .../workspace-setting/ExportPage.tsx | 2 +- .../workspace-setting/general/General.tsx | 118 +++++++++++------- .../workspace-setting/general/style.ts | 24 +++- .../workspace-setting/member/style.ts | 2 +- .../src/components/workspace-setting/style.ts | 38 +++--- 7 files changed, 119 insertions(+), 101 deletions(-) diff --git a/packages/app/src/components/header/PageListHeader.tsx b/packages/app/src/components/header/PageListHeader.tsx index 43a1c976b9..99efff25de 100644 --- a/packages/app/src/components/header/PageListHeader.tsx +++ b/packages/app/src/components/header/PageListHeader.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren, ReactNode } from 'react'; import Header from './Header'; import { StyledPageListTittleWrapper } from './styles'; -import QuickSearchButton from './QuickSearchButton'; +// import QuickSearchButton from './QuickSearchButton'; export type PageListHeaderProps = PropsWithChildren<{ icon?: ReactNode; @@ -12,7 +12,7 @@ export const PageListHeader = ({ icon, children }: PageListHeaderProps) => { {icon} {children} - + {/* */}
    ); diff --git a/packages/app/src/components/header/styles.ts b/packages/app/src/components/header/styles.ts index 1deb826faa..146164eebd 100644 --- a/packages/app/src/components/header/styles.ts +++ b/packages/app/src/components/header/styles.ts @@ -3,35 +3,25 @@ import { displayFlex, styled } from '@/styles'; export const StyledHeaderContainer = styled.div<{ hasWarning: boolean }>( ({ hasWarning }) => { return { - position: 'relative', height: hasWarning ? '96px' : '60px', }; } ); -export const StyledHeader = styled.div<{ hasWarning: boolean }>( - ({ hasWarning }) => { - return { - height: '60px', - width: '100%', - ...displayFlex('flex-end', 'center'), - background: 'var(--affine-page-background)', - transition: 'background-color 0.5s', - position: 'absolute', - left: '0', - top: hasWarning ? '36px' : '0', - padding: '0 22px', - zIndex: 99, - }; - } -); +export const StyledHeader = styled.div<{ hasWarning: boolean }>(() => { + return { + height: '60px', + width: '100%', + ...displayFlex('flex-end', 'center'), + background: 'var(--affine-page-background)', + transition: 'background-color 0.5s', + zIndex: 99, + }; +}); export const StyledTitle = styled('div')(({ theme }) => ({ width: '720px', height: '100%', - position: 'absolute', - left: 0, - right: 0, - top: 0, + margin: 'auto', ...displayFlex('center', 'center'), diff --git a/packages/app/src/components/workspace-setting/ExportPage.tsx b/packages/app/src/components/workspace-setting/ExportPage.tsx index 83830f1777..e3cf6117f6 100644 --- a/packages/app/src/components/workspace-setting/ExportPage.tsx +++ b/packages/app/src/components/workspace-setting/ExportPage.tsx @@ -4,7 +4,7 @@ import { Trans } from '@affine/i18n'; export const ExportPageTitleContainer = styled('div')(() => { return { display: 'flex', - marginTop: '60px', + fontWeight: '500', flex: 1, }; diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index 2ac37c53c3..c8919b30cc 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -5,6 +5,8 @@ import { StyledSettingInputContainer, StyledDoneButtonContainer, StyledInput, + StyledProviderInfo, + StyleGeneral, } from './style'; import { StyledSettingH2 } from '../style'; @@ -13,12 +15,13 @@ import { Button } from '@/ui/button'; import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceDelete } from './delete'; import { WorkspaceLeave } from './leave'; -import { DoneIcon, CloudUnsyncedIcon } from '@blocksuite/icons'; +import { DoneIcon, UsersIcon } from '@blocksuite/icons'; // import { Upload } from '@/components/file-upload'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { useTranslation } from '@affine/i18n'; +import { CloudIcon, LocalIcon } from '@/components/workspace-modal/icons'; export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); @@ -45,57 +48,76 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { // }; return workspace ? ( -
    - Workspace Avatar - -
    - -
    - {/* TODO: Wait for image sync to complete */} - {/* +
    + Workspace Avatar + +
    + +
    + {/* TODO: Wait for image sync to complete */} + {/* */} - {/* TODO: add upload logic */} -
    - {t('Workspace Name')} - - - {isOwner ? ( - { - handleUpdateWorkspaceName(); - }} - > - - - ) : null} - - {t('Workspace Type')} - - - Local workspace - + {/* TODO: add upload logic */} + + {t('Workspace Name')} + + + {isOwner ? ( + { + handleUpdateWorkspaceName(); + }} + > + + + ) : null} + + {t('Workspace Type')} + + {isOwner ? ( + currentWorkspace?.provider === 'local' ? ( + + + Local Workspace + + ) : ( + + + All data can be accessed offline + + ) + ) : ( + + + Joined Workspace + + )} + +
    + {isOwner ? ( <> @@ -137,6 +159,6 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { )} -
    + ) : null; }; diff --git a/packages/app/src/components/workspace-setting/general/style.ts b/packages/app/src/components/workspace-setting/general/style.ts index c46f9706c9..9e76f13e0f 100644 --- a/packages/app/src/components/workspace-setting/general/style.ts +++ b/packages/app/src/components/workspace-setting/general/style.ts @@ -13,11 +13,14 @@ export const StyledSettingInputContainer = styled('div')(() => { export const StyledDeleteButtonContainer = styled('div')(() => { return { - position: 'absolute', - bottom: '0', - left: '50%', - marginBottom: '20px', - transform: 'translateX(-50%)', + textAlign: 'center', + }; +}); +export const StyleGeneral = styled('div')(() => { + return { + display: 'flex', + flexDirection: 'column', + height: '100%', }; }); export const StyledDoneButtonContainer = styled(IconButton)(({ theme }) => { @@ -53,3 +56,14 @@ export const StyledSettingAvatarContent = styled('div')(() => { export const StyledSettingAvatar = styled(MuiAvatar)(() => { return { height: '72px', width: '72px', marginRight: '24px' }; }); + +export const StyledProviderInfo = styled('p')(({ theme }) => { + return { + color: theme.colors.iconColor, + fontSize: theme.font.sm, + svg: { + verticalAlign: 'sub', + marginRight: '10px', + }, + }; +}); diff --git a/packages/app/src/components/workspace-setting/member/style.ts b/packages/app/src/components/workspace-setting/member/style.ts index 2b259828c9..d861b192a1 100644 --- a/packages/app/src/components/workspace-setting/member/style.ts +++ b/packages/app/src/components/workspace-setting/member/style.ts @@ -109,7 +109,7 @@ export const StyledMemberWarp = styled('div')(() => { return { display: 'flex', flexDirection: 'column', - padding: '48px 0', + padding: '0 0 48px 0', fontWeight: '500', fontSize: '18px', }; diff --git a/packages/app/src/components/workspace-setting/style.ts b/packages/app/src/components/workspace-setting/style.ts index 430c6780ef..c855b767d9 100644 --- a/packages/app/src/components/workspace-setting/style.ts +++ b/packages/app/src/components/workspace-setting/style.ts @@ -4,23 +4,27 @@ export const StyledSettingContainer = styled('div')(() => { return { display: 'flex', flexDirection: 'column', - marginTop: '24px', - marginLeft: '48px', - overflow: 'auto', + + padding: '0 34px 20px 48px', + height: '100vh', }; }); export const StyledSettingSidebar = styled('div')(() => { { return { - flexShrink: 0, - flexGrow: 0, + // height: '48px', + marginTop: '50px', }; } }); export const StyledSettingContent = styled('div')(() => { - return {}; + return { + overflow: 'hidden', + flex: 1, + paddingTop: '48px', + }; }); export const StyledSetting = styled('div')(({ theme }) => { @@ -48,7 +52,6 @@ export const StyledSettingTabContainer = styled('ul')(() => { { return { display: 'flex', - marginTop: '25px', }; } }); @@ -58,8 +61,7 @@ export const WorkspaceSettingTagItem = styled('li')<{ isActive?: boolean }>( { return { display: 'flex', - position: 'relative', - margin: '0 48px 8px 0', + margin: '0 48px 0 0', height: '34px', color: isActive ? theme.colors.primaryColor : theme.colors.textColor, fontWeight: '500', @@ -67,16 +69,9 @@ export const WorkspaceSettingTagItem = styled('li')<{ isActive?: boolean }>( lineHeight: theme.font.lineHeightBase, cursor: 'pointer', transition: 'all 0.15s ease', - '::after': { - content: '""', - width: '100%', - height: '2px', - background: isActive ? theme.colors.primaryColor : 'transparent', - transition: 'all 0.15s ease', - position: 'absolute', - left: '0', - bottom: '0', - }, + borderBottom: `2px solid ${ + isActive ? theme.colors.primaryColor : 'none' + }`, ':hover': { color: theme.colors.primaryColor }, }; } @@ -87,9 +82,6 @@ export const StyledSettingTagIconContainer = styled('div')(() => { return { display: 'flex', alignItems: 'center', - marginRight: '14.64px', - width: '14.47px', - fontSize: '14.47px', }; }); @@ -112,7 +104,7 @@ export const StyledPublishExplanation = styled('div')(() => { fontSize: '18px', lineHeight: '26px', flex: 1, - marginTop: '60px', + marginBottom: '22px', }; }); From ba7a4378ad357c758b741f7bccf658638830009b Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 10:26:51 +0800 Subject: [PATCH 099/104] fix: rewrite member style --- .../workspace-setting/member/MembersPage.tsx | 8 ++++--- .../workspace-setting/member/style.ts | 22 +++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/app/src/components/workspace-setting/member/MembersPage.tsx b/packages/app/src/components/workspace-setting/member/MembersPage.tsx index e4b787854c..b72d607238 100644 --- a/packages/app/src/components/workspace-setting/member/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/member/MembersPage.tsx @@ -12,6 +12,7 @@ import { StyledMoreVerticalButton, StyledPublishExplanation, StyledMemberWarp, + StyledMemberContainer, } from './style'; import { MoreVerticalIcon, EmailIcon, TrashIcon } from '@blocksuite/icons'; import { useState } from 'react'; @@ -31,14 +32,14 @@ import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); const { members, removeMember, loaded } = useMembers(); + const { t } = useTranslation(); - // FIXME: DELETE THIS const { enableWorkspace } = useWorkspaceHelper(); const { confirm } = useConfirm(); if (workspace.provider === 'affine') { return ( - <> + {!loaded && ( @@ -57,6 +58,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {t('Access level')} +
    {members.map((member, index) => { const user = Object.assign( @@ -153,7 +155,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { open={isInviteModalShow} > - +
    ); } diff --git a/packages/app/src/components/workspace-setting/member/style.ts b/packages/app/src/components/workspace-setting/member/style.ts index d861b192a1..46eeaa9bed 100644 --- a/packages/app/src/components/workspace-setting/member/style.ts +++ b/packages/app/src/components/workspace-setting/member/style.ts @@ -1,14 +1,21 @@ import { styled } from '@/styles'; import MuiAvatar from '@mui/material/Avatar'; -export const StyledMemberTitleContainer = styled('div')(() => { +export const StyledMemberTitleContainer = styled('li')(() => { return { display: 'flex', - marginTop: '60px', fontWeight: '500', + marginBottom: '32px', flex: 1, }; }); +export const StyledMemberContainer = styled('div')(() => { + return { + display: 'flex', + height: '100%', + flexDirection: 'column', + }; +}); export const StyledMemberAvatar = styled(MuiAvatar)(() => { return { height: '40px', width: '40px' }; @@ -18,8 +25,7 @@ export const StyledMemberNameContainer = styled('div')(() => { return { display: 'flex', alignItems: 'center', - width: '402px', - flex: 2, + flex: '2 0 402px', }; }); @@ -27,17 +33,15 @@ export const StyledMemberRoleContainer = styled('div')(() => { return { display: 'flex', alignItems: 'center', - width: '222px', - flex: 1, + flex: '1 0 222px', }; }); export const StyledMemberListContainer = styled('ul')(() => { return { - marginTop: '15px', overflowY: 'scroll', width: '100%', - maxHeight: 'calc(100vh - 300px)', + flex: 1, }; }); @@ -60,7 +64,7 @@ export const StyledMemberName = styled('div')(({ theme }) => { return { fontWeight: '400', fontSize: '18px', - lineHeight: '16px', + lineHeight: '26px', color: theme.colors.textColor, }; }); From 6d41090e2784b781e2e4c250057f955a5237e7bb Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 10:38:05 +0800 Subject: [PATCH 100/104] feat: rewrite enable affile cloud --- .../src/components/enable-workspace/index.tsx | 24 +++++++++++++++++++ .../workspace-setting/PublishPage.tsx | 18 +++----------- .../components/workspace-setting/SyncPage.tsx | 14 ++--------- .../workspace-setting/member/MembersPage.tsx | 13 ++-------- 4 files changed, 31 insertions(+), 38 deletions(-) create mode 100644 packages/app/src/components/enable-workspace/index.tsx diff --git a/packages/app/src/components/enable-workspace/index.tsx b/packages/app/src/components/enable-workspace/index.tsx new file mode 100644 index 0000000000..3cc28b25d4 --- /dev/null +++ b/packages/app/src/components/enable-workspace/index.tsx @@ -0,0 +1,24 @@ +import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; +import { Button } from '@/ui/button'; +import { useTranslation } from '@affine/i18n'; +import { useState } from 'react'; + +export const EnableWorkspaceButton = () => { + const { t } = useTranslation(); + const { enableWorkspace } = useWorkspaceHelper(); + const [loading, setLoading] = useState(false); + return ( + + ); +}; diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index 4ff35d776d..3d65ac8676 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -16,9 +16,10 @@ import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { useTranslation } from '@affine/i18n'; import Loading from '@/components/loading'; import { Wrapper } from '@/ui/layout'; +import { EnableWorkspaceButton } from '../enable-workspace'; export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const shareUrl = window.location.host + '/public-workspace/' + workspace.id; - const { publishWorkspace, enableWorkspace } = useWorkspaceHelper(); + const { publishWorkspace } = useWorkspaceHelper(); const { t } = useTranslation(); const [loaded, setLoaded] = useState(true); const togglePublic = async (flag: boolean) => { @@ -30,9 +31,6 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { toast('Copied url to clipboard'); }; - const enableAffineCloud = async () => { - await enableWorkspace(); - }; return ( <> {workspace.provider === 'affine' ? ( @@ -100,17 +98,7 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { - +
    diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index f65a24ab7b..c9d0523f6e 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -9,11 +9,10 @@ import { DownloadIcon } from '@blocksuite/icons'; import { Button } from '@/ui/button'; import { Menu, MenuItem } from '@/ui/menu'; import { WorkspaceUnit } from '@affine/datacenter'; -import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { Trans, useTranslation } from '@affine/i18n'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; +import { EnableWorkspaceButton } from '../enable-workspace'; export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { - const { enableWorkspace } = useWorkspaceHelper(); const { t } = useTranslation(); return (
    @@ -36,16 +35,7 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { Cloud for this workspace to keep data in sync with the cloud. - + ) : ( diff --git a/packages/app/src/components/workspace-setting/member/MembersPage.tsx b/packages/app/src/components/workspace-setting/member/MembersPage.tsx index b72d607238..b1b64ffa0e 100644 --- a/packages/app/src/components/workspace-setting/member/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/member/MembersPage.tsx @@ -27,14 +27,13 @@ import useMembers from '@/hooks/use-members'; import Loading from '@/components/loading'; import { Wrapper } from '@/ui/layout'; import { useTranslation } from '@affine/i18n'; -import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; +import { EnableWorkspaceButton } from '@/components/enable-workspace'; export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); const { members, removeMember, loaded } = useMembers(); const { t } = useTranslation(); - const { enableWorkspace } = useWorkspaceHelper(); const { confirm } = useConfirm(); if (workspace.provider === 'affine') { @@ -163,15 +162,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {t('Collaboration Description')} - + ); From 0fa44f82dd7671c26e67ffca5aebdfea6aaf2c9b Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 11:23:41 +0800 Subject: [PATCH 101/104] feat: rewrite publish style --- .../workspace-setting/PublishPage.tsx | 66 ++++++++++--------- .../src/components/workspace-setting/style.ts | 38 +++++------ 2 files changed, 50 insertions(+), 54 deletions(-) diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index 3d65ac8676..a30b72bdf7 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -14,16 +14,18 @@ import { toast } from '@/ui/toast'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { useTranslation } from '@affine/i18n'; -import Loading from '@/components/loading'; -import { Wrapper } from '@/ui/layout'; import { EnableWorkspaceButton } from '../enable-workspace'; export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const shareUrl = window.location.host + '/public-workspace/' + workspace.id; const { publishWorkspace } = useWorkspaceHelper(); const { t } = useTranslation(); - const [loaded, setLoaded] = useState(true); + const [loaded, setLoaded] = useState(false); const togglePublic = async (flag: boolean) => { - await publishWorkspace(workspace.id.toString(), flag); + try { + await publishWorkspace(workspace.id.toString(), flag); + } catch (e) { + toast('Failed to publish workspace'); + } }; const copyUrl = () => { @@ -34,17 +36,21 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { return ( <> {workspace.provider === 'affine' ? ( -
    +
    {workspace.published ? ( <> - {t('Publishing')} + The current workspace has been published to the web, everyone + can view the contents of this workspace through the link. - - {t('Share with link')} - + + + {t('Share with link')} + +
    )} @@ -64,10 +84,11 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { ) : ( - - - + <> )}
    ) : ( <> - {t('Publishing')} + Publishing to web requires AFFiNE Cloud service. - +
    - +
    )} - {!loaded && ( - - - - )} ); }; diff --git a/packages/app/src/components/workspace-setting/style.ts b/packages/app/src/components/workspace-setting/style.ts index c855b767d9..2f95a29b89 100644 --- a/packages/app/src/components/workspace-setting/style.ts +++ b/packages/app/src/components/workspace-setting/style.ts @@ -1,4 +1,4 @@ -import { displayFlex, styled } from '@/styles'; +import { styled } from '@/styles'; export const StyledSettingContainer = styled('div')(() => { return { @@ -85,26 +85,25 @@ export const StyledSettingTagIconContainer = styled('div')(() => { }; }); -export const StyledSettingH2 = styled('h2')<{ marginTop?: number }>( - ({ marginTop, theme }) => { - return { - fontWeight: '500', - fontSize: theme.font.base, - lineHeight: theme.font.lineHeightBase, - marginTop: marginTop ? `${marginTop}px` : '0px', - }; - } -); +export const StyledSettingH2 = styled('h2')<{ + marginTop?: number; + marginBottom?: number; +}>(({ marginTop, marginBottom, theme }) => { + return { + fontWeight: '500', + fontSize: theme.font.base, + lineHeight: theme.font.lineHeightBase, + marginTop: marginTop ? `${marginTop}px` : '0px', + marginBottom: marginBottom ? `${marginBottom}px` : '0px', + }; +}); export const StyledPublishExplanation = styled('div')(() => { return { - ...displayFlex('row', 'center', 'center'), paddingRight: '48px', fontWeight: '500', fontSize: '18px', lineHeight: '26px', - flex: 1, - marginBottom: '22px', }; }); @@ -126,21 +125,14 @@ export const StyledWorkspaceType = styled('div')(() => { export const StyledPublishCopyContainer = styled('div')(() => { return { marginTop: '12px', - display: 'flex', - flexDirection: 'column', - alignItems: 'start', - justifyContent: 'center', marginBottom: '20px', paddingTop: '20px', + flex: 1, }; }); export const StyledStopPublishContainer = styled('div')(() => { return { - position: 'absolute', - bottom: '0', - left: '50%', - transform: 'translateX(-50%)', - marginBottom: '20px', + textAlign: 'center', }; }); From 9a717f7ed2e7bfa64c7ec5878519ff03460cf0e0 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 11:36:04 +0800 Subject: [PATCH 102/104] feat: rewrite async style --- .../src/components/workspace-avatar/Avatar.tsx | 7 +++++++ .../workspace-avatar/WorkspaceUnitAvatar.tsx | 3 +++ .../src/components/workspace-setting/SyncPage.tsx | 15 +++++++-------- .../components/workspace-setting/member/style.ts | 2 +- .../app/src/components/workspace-setting/style.ts | 10 ++++++++-- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/packages/app/src/components/workspace-avatar/Avatar.tsx b/packages/app/src/components/workspace-avatar/Avatar.tsx index c01808e68f..e9bea0aadd 100644 --- a/packages/app/src/components/workspace-avatar/Avatar.tsx +++ b/packages/app/src/components/workspace-avatar/Avatar.tsx @@ -3,6 +3,7 @@ interface IWorkspaceAvatar { size: number; name: string; avatar: string; + style?: React.CSSProperties; } export const WorkspaceAvatar = (props: IWorkspaceAvatar) => { @@ -14,12 +15,15 @@ export const WorkspaceAvatar = (props: IWorkspaceAvatar) => { {props.avatar ? (
    @@ -33,6 +37,7 @@ export const WorkspaceAvatar = (props: IWorkspaceAvatar) => { ) : (
    { borderRadius: '50%', textAlign: 'center', lineHeight: size + 'px', + display: 'inline-block', + verticalAlign: 'middle', }} > {(props.name || 'AFFiNE').substring(0, 1)} diff --git a/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx index 4144d9645d..bdb8431e2c 100644 --- a/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx +++ b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx @@ -24,10 +24,12 @@ export const WorkspaceUnitAvatar = ({ size = 20, name, workspaceUnit, + style, }: { size?: number; name?: string; workspaceUnit?: WorkspaceUnit | null; + style?: React.CSSProperties; }) => { const avatarUrl = useAvatar(workspaceUnit || undefined); return ( @@ -35,6 +37,7 @@ export const WorkspaceUnitAvatar = ({ size={size} name={name || workspaceUnit?.name || ''} avatar={avatarUrl} + style={style} /> ); }; diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index c9d0523f6e..6969461a38 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -1,6 +1,6 @@ import { + StyleAsync, StyledPublishContent, - StyledPublishCopyContainer, StyledPublishExplanation, StyledWorkspaceName, StyledWorkspaceType, @@ -24,19 +24,18 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { size={32} name={workspace.name} workspaceUnit={workspace} + style={{ marginRight: '12px' }} /> - -  {workspace.name}  - + {workspace.name}; is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud. - + - + ) : ( <> @@ -47,7 +46,7 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { the AFFiNE - + @@ -76,7 +75,7 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {t('Download data to device', { CoreOrAll: 'all' })} - + )} diff --git a/packages/app/src/components/workspace-setting/member/style.ts b/packages/app/src/components/workspace-setting/member/style.ts index 46eeaa9bed..ce18dcb0ad 100644 --- a/packages/app/src/components/workspace-setting/member/style.ts +++ b/packages/app/src/components/workspace-setting/member/style.ts @@ -105,7 +105,7 @@ export const StyledPublishExplanation = styled('div')(() => { fontSize: '18px', lineHeight: '26px', flex: 1, - marginTop: '60px', + marginTop: '64px', }; }); diff --git a/packages/app/src/components/workspace-setting/style.ts b/packages/app/src/components/workspace-setting/style.ts index 2f95a29b89..dcde665f31 100644 --- a/packages/app/src/components/workspace-setting/style.ts +++ b/packages/app/src/components/workspace-setting/style.ts @@ -107,14 +107,14 @@ export const StyledPublishExplanation = styled('div')(() => { marginBottom: '22px', }; }); -export const StyledWorkspaceName = styled('div')(() => { +export const StyledWorkspaceName = styled('span')(() => { return { fontWeight: '400', fontSize: '18px', lineHeight: '26px', }; }); -export const StyledWorkspaceType = styled('div')(() => { +export const StyledWorkspaceType = styled('span')(() => { return { fontWeight: '500', fontSize: '18px', @@ -148,3 +148,9 @@ export const StyledPublishContent = styled('div')(() => { flexDirection: 'column', }; }); + +export const StyleAsync = styled('div')(() => { + return { + marginTop: '64px', + }; +}); From 77b1dff68b6099a5c8f963a46eb537f334225d5c Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 11:50:04 +0800 Subject: [PATCH 103/104] feat: avatar upload --- .../workspace-setting/general/General.tsx | 45 ++++++++++--------- .../workspace-setting/general/icons.tsx | 20 +++++++++ .../workspace-setting/general/style.ts | 25 +++++++++++ 3 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 packages/app/src/components/workspace-setting/general/icons.tsx diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index c8919b30cc..0207cb6a95 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -7,6 +7,7 @@ import { StyledInput, StyledProviderInfo, StyleGeneral, + StyledAvatar, } from './style'; import { StyledSettingH2 } from '../style'; @@ -22,10 +23,11 @@ import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { useTranslation } from '@affine/i18n'; import { CloudIcon, LocalIcon } from '@/components/workspace-modal/icons'; +import { CameraIcon } from './icons'; +import { Upload } from '@/components/file-upload'; export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); - // const [uploading, setUploading] = useState(false); const [workspaceName, setWorkspaceName] = useState(workspace.name); const { currentWorkspace, isOwner } = useAppState(); const { updateWorkspace } = useWorkspaceHelper(); @@ -39,31 +41,34 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { updateWorkspace({ name: workspaceName }, currentWorkspace); }; - // const fileChange = async (file: File) => { - // setUploading(true); - // const blob = new Blob([file], { type: file.type }); - // currentWorkspace && - // (await updateWorkspace({ avatarBlob: blob }, currentWorkspace)); - // setUploading(false); - // }; + const fileChange = async (file: File) => { + const blob = new Blob([file], { type: file.type }); + currentWorkspace && + (await updateWorkspace({ avatarBlob: blob }, currentWorkspace)); + }; return workspace ? (
    Workspace Avatar -
    - -
    + + + <> +
    + +
    + + +
    +
    {/* TODO: Wait for image sync to complete */} {/* { + return ( + + + + + + ); +}; diff --git a/packages/app/src/components/workspace-setting/general/style.ts b/packages/app/src/components/workspace-setting/general/style.ts index 9e76f13e0f..d2e8d7b4d2 100644 --- a/packages/app/src/components/workspace-setting/general/style.ts +++ b/packages/app/src/components/workspace-setting/general/style.ts @@ -67,3 +67,28 @@ export const StyledProviderInfo = styled('p')(({ theme }) => { }, }; }); + +export const StyledAvatar = styled('div')(() => { + return { + position: 'relative', + marginRight: '20px', + cursor: 'pointer', + ':hover': { + '.camera-icon': { + display: 'block', + }, + }, + '.camera-icon': { + position: 'absolute', + display: 'none', + width: '100%', + height: '100%', + borderRadius: '50%', + backgroundColor: 'rgba(60, 61, 63, 0.5)', + top: 0, + left: 0, + textAlign: 'center', + lineHeight: '72px', + }, + }; +}); From bccb0cc5ffa404a131d8d9f567a21237bb877b8a Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 23 Jan 2023 11:58:51 +0800 Subject: [PATCH 104/104] feat: svg lint --- .../src/components/edgeless-toolbar/reply.svg | 2 +- .../app/src/components/logout-modal/icon.tsx | 8 +++---- .../workspace-modal/icons/index.tsx | 22 +++++++++---------- .../workspace-setting/general/icons.tsx | 4 ++-- tests/local-first-workspace.spec.ts | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/app/src/components/edgeless-toolbar/reply.svg b/packages/app/src/components/edgeless-toolbar/reply.svg index bfe127a193..7b9f8f2a2e 100644 --- a/packages/app/src/components/edgeless-toolbar/reply.svg +++ b/packages/app/src/components/edgeless-toolbar/reply.svg @@ -1,3 +1,3 @@ - + diff --git a/packages/app/src/components/logout-modal/icon.tsx b/packages/app/src/components/logout-modal/icon.tsx index 4fb10d74db..df23248b78 100644 --- a/packages/app/src/components/logout-modal/icon.tsx +++ b/packages/app/src/components/logout-modal/icon.tsx @@ -10,8 +10,8 @@ export const Check = () => { > @@ -37,8 +37,8 @@ export const UnCheck = () => { xmlns="http://www.w3.org/2000/svg" > diff --git a/packages/app/src/components/workspace-modal/icons/index.tsx b/packages/app/src/components/workspace-modal/icons/index.tsx index 3697e6f6f2..773a8383f3 100644 --- a/packages/app/src/components/workspace-modal/icons/index.tsx +++ b/packages/app/src/components/workspace-modal/icons/index.tsx @@ -8,8 +8,8 @@ export const LocalIcon = () => { xmlns="http://www.w3.org/2000/svg" > @@ -27,8 +27,8 @@ export const OfflineIcon = () => { xmlns="http://www.w3.org/2000/svg" > @@ -45,8 +45,8 @@ export const PublishedIcon = () => { xmlns="http://www.w3.org/2000/svg" > @@ -71,12 +71,12 @@ export const CloudIcon = () => { d="M2.5 11.3744C2.5 13.837 4.51472 15.8333 7 15.8333L13.75 15.8333C15.8211 15.8333 17.5 14.1532 17.5 12.0807C17.5 10.5419 16.5744 9.12069 15.25 8.54163C15.1098 6.10205 13.07 4.16663 10.5744 4.16663C8.62616 4.16663 6.95578 5.40527 6.25 7.08329C4 7.44788 2.5 9.33336 2.5 11.3744Z" stroke="#60A5FA" stroke-width="1.25" - stroke-linecap="round" - stroke-linejoin="round" + strokeLinecap="round" + strokeLinejoin="round" /> @@ -93,7 +93,7 @@ export const LineIcon = () => { fill="none" xmlns="http://www.w3.org/2000/svg" > - + ); }; diff --git a/packages/app/src/components/workspace-setting/general/icons.tsx b/packages/app/src/components/workspace-setting/general/icons.tsx index 9487d8dc66..a126cafc0f 100644 --- a/packages/app/src/components/workspace-setting/general/icons.tsx +++ b/packages/app/src/components/workspace-setting/general/icons.tsx @@ -9,8 +9,8 @@ export const CameraIcon = () => { xmlns="http://www.w3.org/2000/svg" > diff --git a/tests/local-first-workspace.spec.ts b/tests/local-first-workspace.spec.ts index 39b10c6aea..014b839fc9 100644 --- a/tests/local-first-workspace.spec.ts +++ b/tests/local-first-workspace.spec.ts @@ -12,7 +12,7 @@ test.describe('Local first default workspace', () => { test.skip('Default workspace avatar', async ({ page }) => { const workspaceAvatar = page.getByTestId('workspace-avatar'); expect(await workspaceAvatar.innerHTML()).toBe( - '' + '' ); }); });