From ee2e1687df9ff9bb16a1cb9a5024dcdffe10edcd Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Thu, 9 Feb 2023 23:10:52 +0800 Subject: [PATCH 01/13] fix: store user info locally --- .../provider/affine/__tests__/mock-apis.ts | 2 +- .../data-center/src/provider/affine/affine.ts | 92 +++++++++---------- .../src/provider/affine/apis/index.ts | 19 +++- .../src/provider/affine/apis/request.ts | 1 + .../src/provider/affine/apis/token.ts | 79 +++++++++++----- .../src/provider/affine/storage.ts | 4 +- 6 files changed, 117 insertions(+), 80 deletions(-) diff --git a/packages/data-center/src/provider/affine/__tests__/mock-apis.ts b/packages/data-center/src/provider/affine/__tests__/mock-apis.ts index b05b9cd663..21a36c7690 100644 --- a/packages/data-center/src/provider/affine/__tests__/mock-apis.ts +++ b/packages/data-center/src/provider/affine/__tests__/mock-apis.ts @@ -1,7 +1,7 @@ import type { Apis, AccessTokenMessage } from '../apis'; const user: AccessTokenMessage = { - create_at: Date.now(), + created_at: Date.now(), exp: 100000000, email: 'demo@demo.demo', id: '123', diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index e8e564e090..d3f1109505 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -5,13 +5,11 @@ import type { } from '../base'; import type { User } from '../../types'; import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; -import { storage } from './storage.js'; import assert from 'assert'; 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 { token } from './apis/token.js'; +import type { Apis, WorkspaceDetail } from './apis'; import { WebsocketClient } from './channel'; import { loadWorkspaceUnit, @@ -40,10 +38,10 @@ const { export class AffineProvider extends BaseProvider { public id = 'affine'; - private _onTokenRefresh?: Callback = undefined; private _wsMap: Map = new Map(); private _apis: Apis; private _channel?: WebsocketClient; + private _refreshToken?: string; // private _idbMap: Map = new Map(); private _workspaceLoadingQueue: Set = new Set(); @@ -53,40 +51,25 @@ export class AffineProvider extends BaseProvider { } override async init() { - this._onTokenRefresh = () => { - if (this._apis.token.refresh) { - storage.setItem('token', this._apis.token.refresh); + this._apis.token.onChange(() => { + if (this._apis.token.isLogin) { + this._reconnectChannel(); + } else { + this._destroyChannel(); } - }; + }); - this._apis.token.onChange(this._onTokenRefresh); - - // initial login token - if (this._apis.token.isExpired) { - try { - const refreshToken = storage.getItem('token'); - if (!refreshToken) return; - await this._apis.token.refreshToken(refreshToken); - - if (this._apis.token.refresh) { - storage.set('token', this._apis.token.refresh); - } - - assert(this._apis.token.isLogin); - } catch (_) { - // this._logger('Authorization failed, fallback to local mode'); - } - } else { - storage.setItem('token', this._apis.token.refresh); - } - - if (token.isLogin) { - this._connectChannel(); + if (this._apis.token.isExpired && this._apis.token.refresh) { + // do we need to await the following? + this._apis.token.refreshToken(); } } - private _connectChannel() { - if (!this._channel) { + private _reconnectChannel() { + if (this._refreshToken !== this._apis.token.refresh) { + // need to reconnect + this._destroyChannel(); + this._channel = new WebsocketClient( `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${ window.location.host @@ -98,10 +81,21 @@ export class AffineProvider extends BaseProvider { }, } ); + + this._channel.on('message', (msg: ChannelMessage) => { + this._handlerAffineListMessage(msg); + }); + + this._refreshToken = this._apis.token.refresh; + } + } + + private _destroyChannel() { + if (this._channel) { + this._channel.disconnect(); + this._channel.destroy(); + this._channel = undefined; } - this._channel.on('message', (msg: ChannelMessage) => { - this._handlerAffineListMessage(msg); - }); } private async _handlerAffineListMessage({ @@ -111,7 +105,7 @@ export class AffineProvider extends BaseProvider { this._logger('receive server message'); const newlyCreatedWorkspaces: WorkspaceUnit[] = []; const currentWorkspaceIds = this._workspaces.list().map(w => w.id); - const newlyRemovedWorkspacecIds = currentWorkspaceIds; + const newlyRemovedWorkspaceIds = currentWorkspaceIds; for (const [id, detail] of Object.entries(ws_details)) { const { name, avatar } = metadata[id]; @@ -121,7 +115,7 @@ export class AffineProvider extends BaseProvider { const workspaceIndex = currentWorkspaceIds.indexOf(id); const ifWorkspaceExist = workspaceIndex !== -1; if (ifWorkspaceExist) { - newlyRemovedWorkspacecIds.splice(workspaceIndex, 1); + newlyRemovedWorkspaceIds.splice(workspaceIndex, 1); } /** @@ -163,7 +157,7 @@ export class AffineProvider extends BaseProvider { this._workspaces.add(newlyCreatedWorkspaces); // sync newlyRemoveWorkspaces to context - this._workspaces.remove(newlyRemovedWorkspacecIds); + this._workspaces.remove(newlyRemovedWorkspaceIds); } private _getWebsocketProvider(workspace: BlocksuiteWorkspace) { @@ -181,8 +175,8 @@ export class AffineProvider extends BaseProvider { awareness: workspace.awarenessStore.awareness, }); workspace.awarenessStore.awareness.setLocalStateField('user', { - name: token.user?.name ?? 'other', - id: Number(token.user?.id ?? -1), + name: this._apis.token.user?.name ?? 'other', + id: Number(this._apis.token.user?.id ?? -1), color: '#ffa500', }); @@ -261,23 +255,22 @@ export class AffineProvider extends BaseProvider { } override async auth() { - const refreshToken = await storage.getItem('token'); - if (refreshToken) { - await this._apis.token.refreshToken(refreshToken); + if (this._apis.token.isLogin) { + await this._apis.token.refreshToken(); if (this._apis.token.isLogin && !this._apis.token.isExpired) { // login success return; } } + const user = await this._apis.signInWithGoogle?.(); - if (!this._channel?.connected) { - this._connectChannel(); - } + if (!user) { this._sendMessage(MessageCenter.messageCode.loginError); } } + // TODO: may need to update related workspace attributes on user info change? public override async getUserInfo(): Promise { const user = this._apis.token.user; return user @@ -441,11 +434,10 @@ export class AffineProvider extends BaseProvider { } public override async logout(): Promise { - token.clear(); - this._channel?.disconnect(); + this._apis.token.clear(); + this._destroyChannel(); this._wsMap.forEach(ws => ws.disconnect()); this._workspaces.clear(false); - storage.removeItem('token'); } public override async getWorkspaceMembers(id: string) { diff --git a/packages/data-center/src/provider/affine/apis/index.ts b/packages/data-center/src/provider/affine/apis/index.ts index d3ac780887..27eebb5131 100644 --- a/packages/data-center/src/provider/affine/apis/index.ts +++ b/packages/data-center/src/provider/affine/apis/index.ts @@ -6,11 +6,20 @@ import * as user from './user.js'; import * as workspace from './workspace.js'; import { token } from './token.js'; -export type Apis = typeof user & - Omit & { - signInWithGoogle: ReturnType[0]; - onAuthStateChanged: ReturnType[1]; - } & { token: typeof token }; +// See https://twitter.com/mattpocockuk/status/1622730173446557697 +// TODO: move to ts utils? +type Prettify = { + [K in keyof T]: T[K]; + // eslint-disable-next-line @typescript-eslint/ban-types +} & {}; + +export type Apis = Prettify< + typeof user & + Omit & { + signInWithGoogle: ReturnType[0]; + onAuthStateChanged: ReturnType[1]; + } & { token: typeof token } +>; export const getApis = (): Apis => { const [signInWithGoogle, onAuthStateChanged] = getAuthorizer(); diff --git a/packages/data-center/src/provider/affine/apis/request.ts b/packages/data-center/src/provider/affine/apis/request.ts index 306ac5b9e7..29f90e19df 100644 --- a/packages/data-center/src/provider/affine/apis/request.ts +++ b/packages/data-center/src/provider/affine/apis/request.ts @@ -43,6 +43,7 @@ export const client: KyInstance = bareClient.extend({ beforeRetry: [ async ({ request }) => { + console.log('beforeRetry'); await token.refreshToken(); request.headers.set('Authorization', token.token); }, diff --git a/packages/data-center/src/provider/affine/apis/token.ts b/packages/data-center/src/provider/affine/apis/token.ts index 5b8e165929..60cc8deb39 100644 --- a/packages/data-center/src/provider/affine/apis/token.ts +++ b/packages/data-center/src/provider/affine/apis/token.ts @@ -5,9 +5,10 @@ import { decode } from 'js-base64'; import { getLogger } from '../../../logger.js'; import { bareClient } from './request.js'; +import { storage } from '../storage.js'; export interface AccessTokenMessage { - create_at: number; + created_at: number; exp: number; email: string; id: string; @@ -29,55 +30,85 @@ type LoginResponse = { refresh: string; }; -const login = (params: LoginParams): Promise => +// TODO: organize storage keys in a better way +const AFFINE_LOGIN_STORAGE_KEY = 'affine:login'; + +/** + * Use refresh token to get a new access token (JWT) + * The returned token also contains the user info payload. + */ +const doLogin = (params: LoginParams): Promise => bareClient.post('api/user/token', { json: params }).json(); export class Token { private readonly _logger; - private _accessToken!: string; - private _refreshToken!: string; + private _accessToken = ''; // idtoken (JWT) + private _refreshToken = ''; - private _user!: AccessTokenMessage | null; + private _user: AccessTokenMessage | null = null; private _padding?: Promise; constructor() { this._logger = getLogger('token'); this._logger.enabled = true; - this._setToken(); // fill with default value + this.restoreLogin(); } get user() { return this._user; } - private _setToken(login?: LoginResponse) { - this._accessToken = login?.token || ''; - this._refreshToken = login?.refresh || ''; - + setLogin(login: LoginResponse) { + this._accessToken = login.token; + this._refreshToken = login.refresh; this._user = Token.parse(this._accessToken); - if (login) { - this._logger('set login', login); - this.triggerChange(this._user); - } else { - this._logger('empty login'); + + this.triggerChange(this._user); + this.storeLogin(); + } + + private storeLogin() { + if (this.refresh) { + const { token, refresh } = this; + storage.setItem( + AFFINE_LOGIN_STORAGE_KEY, + JSON.stringify({ token, refresh }) + ); + } + } + + private restoreLogin() { + const loginStr = storage.getItem(AFFINE_LOGIN_STORAGE_KEY); + if (!loginStr) { + return; + } + try { + const login: LoginResponse = JSON.parse(loginStr); + this.setLogin(login); + } catch (err) { + this._logger('Failed to parse login info', err); } } async initToken(token: string) { - const tokens = await login({ token, type: 'Google' }); - this._setToken(tokens); + const res = await doLogin({ token, type: 'Google' }); + this.setLogin(res); return this._user; } - async refreshToken(token?: string) { + async refreshToken(refreshToken?: string) { if (!this._padding) { - this._padding = login({ + this._padding = doLogin({ type: 'Refresh', - token: this._refreshToken || token!, + token: refreshToken || this._refreshToken, }); + this._refreshToken = refreshToken || this._refreshToken; + } + const res = await this._padding; + if (!refreshToken || refreshToken !== this._refreshToken) { + this.setLogin(res); } - this._setToken(await this._padding); this._padding = undefined; } @@ -95,7 +126,7 @@ export class Token { get isExpired() { if (!this._user) return true; - return Date.now() - this._user.create_at > this._user.exp; + return Date.now() > this._user.exp; } static parse(token: string): AccessTokenMessage | null { @@ -128,7 +159,9 @@ export class Token { } clear() { - this._setToken(); + this._accessToken = ''; + this._refreshToken = ''; + storage.removeItem(AFFINE_LOGIN_STORAGE_KEY); } } diff --git a/packages/data-center/src/provider/affine/storage.ts b/packages/data-center/src/provider/affine/storage.ts index 4ac1b74697..95031de655 100644 --- a/packages/data-center/src/provider/affine/storage.ts +++ b/packages/data-center/src/provider/affine/storage.ts @@ -1 +1,3 @@ -export { varStorage as storage } from 'lib0/storage'; +import { varStorage } from 'lib0/storage'; + +export const storage = varStorage as Storage; From 385e9afba65112b21c9ce4bafb6d17efae06edf2 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Thu, 9 Feb 2023 23:12:36 +0800 Subject: [PATCH 02/13] fix: token exp --- packages/data-center/src/provider/affine/apis/token.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/data-center/src/provider/affine/apis/token.ts b/packages/data-center/src/provider/affine/apis/token.ts index 60cc8deb39..5451ba1f96 100644 --- a/packages/data-center/src/provider/affine/apis/token.ts +++ b/packages/data-center/src/provider/affine/apis/token.ts @@ -126,7 +126,8 @@ export class Token { get isExpired() { if (!this._user) return true; - return Date.now() > this._user.exp; + // exp is in seconds + return Date.now() > this._user.exp * 1000; } static parse(token: string): AccessTokenMessage | null { From d524fe3c6cf7d65b6abf085e7045da80c2b11fa4 Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Fri, 10 Feb 2023 03:09:05 +0800 Subject: [PATCH 03/13] chore: bump BlockSuite version (#910) Co-authored-by: QiShaoXuan Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com> Co-authored-by: DarkSky --- package.json | 5 + packages/app/package.json | 6 +- packages/app/src/components/editor/index.tsx | 11 ++ .../app/src/components/help-island/Icons.tsx | 6 +- .../app/src/components/help-island/index.tsx | 114 ++++++------- .../app/src/components/help-island/style.ts | 136 +++++++-------- .../src/components/workspace-layout/index.tsx | 11 +- .../src/components/workspace-layout/styles.ts | 9 + packages/app/src/pages/temporary.css | 7 + packages/component/package.json | 2 +- packages/component/src/ui/mui.ts | 3 +- packages/data-center/package.json | 4 +- patches/next@13.1.0.patch | 15 ++ pnpm-lock.yaml | 155 ++++++++++-------- tests/contact-us.spec.ts | 1 + tests/shortcuts.spec.ts | 1 + 16 files changed, 276 insertions(+), 210 deletions(-) create mode 100644 patches/next@13.1.0.patch diff --git a/package.json b/package.json index 6f59b72897..d1bf76efe4 100644 --- a/package.json +++ b/package.json @@ -77,5 +77,10 @@ "**/__tests__/**", "**/tests/**" ] + }, + "pnpm": { + "patchedDependencies": { + "next@13.1.0": "patches/next@13.1.0.patch" + } } } diff --git a/packages/app/package.json b/packages/app/package.json index 39dcfda30e..3a1f655483 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -12,10 +12,10 @@ "@affine/component": "workspace:*", "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.4.0-alpha.2", - "@blocksuite/editor": "0.4.0-alpha.2", + "@blocksuite/blocks": "0.4.0-alpha.3", + "@blocksuite/editor": "0.4.0-alpha.3", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.4.0-alpha.2", + "@blocksuite/store": "0.4.0-alpha.3", "@emotion/css": "^11.10.5", "@emotion/react": "^11.10.5", "@emotion/server": "^11.10.0", diff --git a/packages/app/src/components/editor/index.tsx b/packages/app/src/components/editor/index.tsx index 176777f86f..46ea39204c 100644 --- a/packages/app/src/components/editor/index.tsx +++ b/packages/app/src/components/editor/index.tsx @@ -22,15 +22,26 @@ export const Editor = ({ page, workspace, setEditor }: Props) => { const editorContainer = useRef(null); // const { currentWorkspace, currentPage, setEditor } = useAppState(); useEffect(() => { + let blockHubElement: HTMLElement | null = null; const ret = () => { const node = editorContainer.current; while (node?.firstChild) { node.removeChild(node.firstChild); } + + blockHubElement?.remove(); }; const editor = new EditorContainer(); editor.page = page; + editor.createBlockHub().then(blockHub => { + const toolWrapper = document.querySelector('#toolWrapper'); + if (!toolWrapper) { + throw new Error('Can not find toolWrapper'); + } + blockHubElement = blockHub; + toolWrapper.appendChild(blockHub); + }); editorContainer.current?.appendChild(editor); if (page.isEmpty) { const isFirstPage = workspace?.meta.pageMetas.length === 1; diff --git a/packages/app/src/components/help-island/Icons.tsx b/packages/app/src/components/help-island/Icons.tsx index 7c8797265d..427e078dc8 100644 --- a/packages/app/src/components/help-island/Icons.tsx +++ b/packages/app/src/components/help-island/Icons.tsx @@ -1,16 +1,16 @@ export const HelpIcon = () => { return ( ); diff --git a/packages/app/src/components/help-island/index.tsx b/packages/app/src/components/help-island/index.tsx index 4f7b126843..714e43d04a 100644 --- a/packages/app/src/components/help-island/index.tsx +++ b/packages/app/src/components/help-island/index.tsx @@ -2,85 +2,71 @@ import { useState } from 'react'; import { StyledIsland, StyledIconWrapper, - StyledIslandWrapper, - StyledTransformIcon, + StyledAnimateWrapper, + StyledTriggerWrapper, } from './style'; import { CloseIcon, ContactIcon, HelpIcon, KeyboardIcon } from './Icons'; -import { MuiGrow } from '@affine/component'; import { Tooltip } from '@affine/component'; + import { useTranslation } from '@affine/i18n'; import { useModal } from '@/providers/GlobalModalProvider'; -import { useTheme } from '@/providers/ThemeProvider'; -import useCurrentPageMeta from '@/hooks/use-current-page-meta'; +import { MuiFade } from '@affine/component'; export type IslandItemNames = 'contact' | 'shortcuts'; export const HelpIsland = ({ showList = ['contact', 'shortcuts'], }: { showList?: IslandItemNames[]; }) => { - const [showContent, setShowContent] = useState(false); - const { mode } = useTheme(); - const { mode: editorMode } = useCurrentPageMeta() || {}; + const [spread, setShowSpread] = useState(false); const { triggerShortcutsModal, triggerContactModal } = useModal(); - const isEdgelessDark = mode === 'dark' && editorMode === 'edgeless'; const { t } = useTranslation(); return ( - <> - { - setShowContent(true); - }} - onMouseLeave={() => { - setShowContent(false); - }} - > - - - {showList.includes('contact') && ( - - { - setShowContent(false); - triggerContactModal(); - }} - > - - - - )} - {showList.includes('shortcuts') && ( - - { - setShowContent(false); - triggerShortcutsModal(); - }} - > - - - - )} - - + { + setShowSpread(!spread); + }} + > + + {showList.includes('contact') && ( + + { + setShowSpread(false); + triggerContactModal(); + }} + > + + + + )} + {showList.includes('shortcuts') && ( + + { + setShowSpread(false); + triggerShortcutsModal(); + }} + > + + + + )} + -
- - - - - - -
-
- + + + + + + + + + + +
); }; diff --git a/packages/app/src/components/help-island/style.ts b/packages/app/src/components/help-island/style.ts index 46b2e271ac..9095344182 100644 --- a/packages/app/src/components/help-island/style.ts +++ b/packages/app/src/components/help-island/style.ts @@ -1,71 +1,77 @@ -import { displayFlex, styled } from '@affine/component'; +import { displayFlex, positionAbsolute, styled } from '@affine/component'; -export const StyledIsland = styled('div')(({ theme }) => { +export const StyledIsland = styled('div')<{ + spread: boolean; +}>(({ theme, spread }) => { return { - width: '32px', - height: '32px', - color: theme.colors.iconColor, - position: 'fixed', - right: '30px', - bottom: '30px', - borderRadius: '50%', - zIndex: theme.zIndex.popover, - }; -}); -export const StyledTransformIcon = styled('div', { - shouldForwardProp: prop => prop !== 'in', -})<{ in: boolean }>(({ in: isIn, theme }) => ({ - height: '32px', - width: '32px', - borderRadius: '50%', - position: 'absolute', - left: '0', - right: '0', - bottom: '0', - top: '0', - margin: 'auto', - ...displayFlex('center', 'center'), - opacity: isIn ? 1 : 0, - backgroundColor: isIn - ? theme.colors.hoverBackground - : theme.colors.pageBackground, -})); -export const StyledIconWrapper = styled('div')<{ isEdgelessDark: boolean }>( - ({ theme, isEdgelessDark }) => { - return { - color: isEdgelessDark - ? theme.colors.popoverBackground - : theme.colors.iconColor, - marginBottom: '24px', - ...displayFlex('center', 'center'), - cursor: 'pointer', - backgroundColor: isEdgelessDark - ? 'transparent' - : theme.colors.pageBackground, - borderRadius: '50%', - width: '32px', - height: '32px', - transition: 'background-color 0.3s', - position: 'relative', - ':hover': { - color: isEdgelessDark - ? theme.colors.iconColor - : theme.colors.primaryColor, - backgroundColor: theme.colors.hoverBackground, - }, - }; - } -); - -export const StyledIslandWrapper = styled('div')(({ theme }) => { - return { - position: 'absolute', - bottom: '100%', - left: '0', - width: '100%', - color: theme.colors.iconColor, + transition: 'box-shadow 0.2s', + width: '44px', + position: 'relative', + boxShadow: spread + ? '4px 4px 7px rgba(58, 76, 92, 0.04), -4px -4px 13px rgba(58, 76, 92, 0.02), 6px 6px 36px rgba(58, 76, 92, 0.06)' + : 'unset', + padding: '0 4px 44px', + borderRadius: '10px', + backgroundColor: theme.colors.pageBackground, ':hover': { - color: theme.colors.popoverColor, + boxShadow: + '4px 4px 7px rgba(58, 76, 92, 0.04), -4px -4px 13px rgba(58, 76, 92, 0.02), 6px 6px 36px rgba(58, 76, 92, 0.06)', + }, + '::after': { + content: '""', + width: '36px', + height: '1px', + background: spread ? theme.colors.borderColor : 'transparent', + ...positionAbsolute({ + left: 0, + right: 0, + bottom: '44px', + }), + margin: 'auto', + transition: 'background 0.15s', + }, + }; +}); +export const StyledIconWrapper = styled('div')(({ theme }) => { + return { + color: theme.colors.iconColor, + ...displayFlex('center', 'center'), + cursor: 'pointer', + backgroundColor: theme.colors.pageBackground, + borderRadius: '5px', + width: '36px', + height: '36px', + margin: '4px auto 4px', + transition: 'background-color 0.2s', + position: 'relative', + ':hover': { + color: theme.colors.primaryColor, + backgroundColor: theme.colors.hoverBackground, + }, + }; +}); + +export const StyledAnimateWrapper = styled('div', { + shouldForwardProp: prop => prop !== 'spread', +})<{ spread: boolean }>(({ spread }) => ({ + height: spread ? '88px' : '0', + transition: 'height 0.2s cubic-bezier(0, 0, 0.55, 1.6)', + overflow: 'hidden', +})); + +export const StyledTriggerWrapper = styled('div')(({ theme }) => { + return { + width: '36px', + height: '36px', + cursor: 'pointer', + backgroundColor: theme.colors.pageBackground, + color: theme.colors.iconColor, + borderRadius: '5px', + ...displayFlex('center', 'center'), + ...positionAbsolute({ left: '4px', bottom: '4px' }), + ':hover': { + color: theme.colors.primaryColor, + backgroundColor: theme.colors.hoverBackground, }, }; }); diff --git a/packages/app/src/components/workspace-layout/index.tsx b/packages/app/src/components/workspace-layout/index.tsx index b77d86fada..eca2b6bbb0 100644 --- a/packages/app/src/components/workspace-layout/index.tsx +++ b/packages/app/src/components/workspace-layout/index.tsx @@ -1,7 +1,7 @@ import HelpIsland from '@/components/help-island'; import { WorkSpaceSliderBar } from '@/components/workspace-slider-bar'; import { useRouter } from 'next/router'; -import { StyledPage, StyledWrapper } from './styles'; +import { StyledPage, StyledToolWrapper, StyledWrapper } from './styles'; import { PropsWithChildren } from 'react'; import useEnsureWorkspace from '@/hooks/use-ensure-workspace'; import { PageLoading } from '@/components/loading'; @@ -19,7 +19,14 @@ export const WorkspaceLayout = ({ children }: PropsWithChildren) => { {children} - + +
+ {/* Slot for block hub */} +
+ +
); diff --git a/packages/app/src/components/workspace-layout/styles.ts b/packages/app/src/components/workspace-layout/styles.ts index 4c246db801..979f342dfd 100644 --- a/packages/app/src/components/workspace-layout/styles.ts +++ b/packages/app/src/components/workspace-layout/styles.ts @@ -16,3 +16,12 @@ export const StyledWrapper = styled('div')(() => { position: 'relative', }; }); + +export const StyledToolWrapper = styled('div')(({ theme }) => { + return { + position: 'fixed', + right: '30px', + bottom: '30px', + zIndex: theme.zIndex.popover, + }; +}); diff --git a/packages/app/src/pages/temporary.css b/packages/app/src/pages/temporary.css index 9bda7bdcf9..3df1e639f5 100644 --- a/packages/app/src/pages/temporary.css +++ b/packages/app/src/pages/temporary.css @@ -6,3 +6,10 @@ .affine-default-page-block-container { width: 686px !important; } + +affine-block-hub { + position: unset !important; +} +.block-hub-menu-container { + position: unset !important; +} diff --git a/packages/component/package.json b/packages/component/package.json index 4cf948d9c3..4117e52f4c 100644 --- a/packages/component/package.json +++ b/packages/component/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@affine/i18n": "workspace:*", - "@blocksuite/editor": "0.4.0-alpha.2", + "@blocksuite/editor": "0.4.0-alpha.3", "@blocksuite/icons": "^2.0.2", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", diff --git a/packages/component/src/ui/mui.ts b/packages/component/src/ui/mui.ts index 1d0a7f0b57..3d8281e38d 100644 --- a/packages/component/src/ui/mui.ts +++ b/packages/component/src/ui/mui.ts @@ -3,5 +3,6 @@ import MuiCollapse from '@mui/material/Collapse'; import MuiSlide from '@mui/material/Slide'; import MuiAvatar from '@mui/material/Avatar'; import MuiGrow from '@mui/material/Grow'; +import MuiFade from '@mui/material/Fade'; -export { MuiBreadcrumbs, MuiCollapse, MuiSlide, MuiAvatar, MuiGrow }; +export { MuiBreadcrumbs, MuiCollapse, MuiSlide, MuiAvatar, MuiGrow, MuiFade }; diff --git a/packages/data-center/package.json b/packages/data-center/package.json index f2b7382a99..9ee7ef4942 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -27,8 +27,8 @@ "yjs": "^13.5.45" }, "dependencies": { - "@blocksuite/blocks": "0.4.0-alpha.2", - "@blocksuite/store": "0.4.0-alpha.2", + "@blocksuite/blocks": "0.4.0-alpha.3", + "@blocksuite/store": "0.4.0-alpha.3", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", diff --git a/patches/next@13.1.0.patch b/patches/next@13.1.0.patch new file mode 100644 index 0000000000..b2788691ee --- /dev/null +++ b/patches/next@13.1.0.patch @@ -0,0 +1,15 @@ +diff --git a/dist/server/config.js b/dist/server/config.js +index 3222d6521a5473994ad1d42914106d9c611e18b8..b9ea8fbd541c9ce1a8c33c25ab0f493981f9b3e3 100644 +--- a/dist/server/config.js ++++ b/dist/server/config.js +@@ -180,8 +180,8 @@ const isAboveNodejs16 = (0, _semver).gte(process.version, NODE_16_VERSION); + const isAboveNodejs18 = (0, _semver).gte(process.version, NODE_18_VERSION); + const experimentalWarning = (0, _utils).execOnce((configFileName, features)=>{ + const s = features.length > 1 ? "s" : ""; +- Log.warn(_chalk.default.bold(`You have enabled experimental feature${s} (${features.join(", ")}) in ${configFileName}.`)); +- Log.warn(`Experimental features are not covered by semver, and may cause unexpected or broken application behavior. ` + `Use at your own risk.`); ++ // Log.warn(_chalk.default.bold(`You have enabled experimental feature${s} (${features.join(", ")}) in ${configFileName}.`)); ++ // Log.warn(`Experimental features are not covered by semver, and may cause unexpected or broken application behavior. ` + `Use at your own risk.`); + if (features.includes("appDir")) { + Log.info(`Thank you for testing \`appDir\` please leave your feedback at https://nextjs.link/app-feedback`); + } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27cd7654f5..3caffd7e8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,10 @@ lockfileVersion: 5.4 +patchedDependencies: + next@13.1.0: + hash: rdilrli7uexa22ralt77ekax24 + path: patches/next@13.1.0.patch + importers: .: @@ -47,10 +52,10 @@ importers: '@affine/component': workspace:* '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.4.0-alpha.2 - '@blocksuite/editor': 0.4.0-alpha.2 + '@blocksuite/blocks': 0.4.0-alpha.3 + '@blocksuite/editor': 0.4.0-alpha.3 '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.4.0-alpha.2 + '@blocksuite/store': 0.4.0-alpha.3 '@emotion/css': ^11.10.5 '@emotion/react': ^11.10.5 '@emotion/server': ^11.10.0 @@ -89,10 +94,10 @@ importers: '@affine/component': link:../component '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.4.0-alpha.2_yjs@13.5.45 - '@blocksuite/editor': 0.4.0-alpha.2_yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-alpha.3_yjs@13.5.45 + '@blocksuite/editor': 0.4.0-alpha.3_yjs@13.5.45 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45 + '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 '@emotion/css': 11.10.5 '@emotion/react': 11.10.5_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.5 @@ -107,7 +112,7 @@ importers: css-spring: 4.1.0 dayjs: 1.11.7 lit: 2.6.1 - next: 13.1.0_biqbaboplfbrettd7655fr4n2y + next: 13.1.0_rdilrli7uexa22ralt77ekax24_biqbaboplfbrettd7655fr4n2y next-debug-local: 0.1.5 prettier: 2.7.1 quill: 1.3.7 @@ -132,7 +137,7 @@ importers: packages/component: specifiers: '@affine/i18n': workspace:* - '@blocksuite/editor': 0.4.0-alpha.2 + '@blocksuite/editor': 0.4.0-alpha.3 '@blocksuite/icons': ^2.0.2 '@emotion/react': ^11.10.5 '@emotion/styled': ^11.10.5 @@ -156,7 +161,7 @@ importers: webpack: ^5.75.0 dependencies: '@affine/i18n': link:../i18n - '@blocksuite/editor': 0.4.0-alpha.2 + '@blocksuite/editor': 0.4.0-alpha.3 '@blocksuite/icons': 2.0.4_3stiutgnnbnfnf3uowm5cip22i '@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i '@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se @@ -182,8 +187,8 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.4.0-alpha.2 - '@blocksuite/store': 0.4.0-alpha.2 + '@blocksuite/blocks': 0.4.0-alpha.3 + '@blocksuite/store': 0.4.0-alpha.3 '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -201,8 +206,8 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.45 dependencies: - '@blocksuite/blocks': 0.4.0-alpha.2_yjs@13.5.45 - '@blocksuite/store': 0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-alpha.3_yjs@13.5.45 + '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -2615,21 +2620,21 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@blocksuite/blocks/0.4.0-alpha.2: - resolution: {integrity: sha512-rsG1wXNmZpZrCQeADLYkJyFQJ6tTW5QutmN9kr5e1HI3cZgV6n1szcDBh+/32xp6xFn1q1RgknYVNS6jHsbd+A==} + /@blocksuite/blocks/0.4.0-alpha.3: + resolution: {integrity: sha512-DKRWJmNhaCLQSMYRdVMR6okuWRjvU3o+NZcrnXitNzEH2jes7gl9DxpCI4kfAWTGHKLtblDqkMwRtKJhhxE8ng==} dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 - '@blocksuite/phasor': 0.4.0-alpha.2_lit@2.6.1 - '@blocksuite/store': 0.4.0-alpha.2_lit@2.6.1 - '@blocksuite/virgo': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/phasor': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/virgo': 0.4.0-alpha.3_lit@2.6.1 '@popperjs/core': 2.11.6 autosize: 5.0.2 highlight.js: 11.7.0 hotkeys-js: 3.10.1 lit: 2.6.1 quill: 1.3.7 - quill-cursors: 4.0.0 - zod: 3.20.2 + quill-cursors: 4.0.2 + zod: 3.20.5 transitivePeerDependencies: - bufferutil - supports-color @@ -2637,21 +2642,21 @@ packages: - yjs dev: false - /@blocksuite/blocks/0.4.0-alpha.2_yjs@13.5.45: - resolution: {integrity: sha512-rsG1wXNmZpZrCQeADLYkJyFQJ6tTW5QutmN9kr5e1HI3cZgV6n1szcDBh+/32xp6xFn1q1RgknYVNS6jHsbd+A==} + /@blocksuite/blocks/0.4.0-alpha.3_yjs@13.5.45: + resolution: {integrity: sha512-DKRWJmNhaCLQSMYRdVMR6okuWRjvU3o+NZcrnXitNzEH2jes7gl9DxpCI4kfAWTGHKLtblDqkMwRtKJhhxE8ng==} dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 - '@blocksuite/phasor': 0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45 - '@blocksuite/store': 0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45 - '@blocksuite/virgo': 0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/phasor': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/virgo': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 '@popperjs/core': 2.11.6 autosize: 5.0.2 highlight.js: 11.7.0 hotkeys-js: 3.10.1 lit: 2.6.1 quill: 1.3.7 - quill-cursors: 4.0.0 - zod: 3.20.2 + quill-cursors: 4.0.2 + zod: 3.20.5 transitivePeerDependencies: - bufferutil - supports-color @@ -2659,12 +2664,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-alpha.2: - resolution: {integrity: sha512-77+uY8ljus+W70sf3J5sjzS6jzfLXeA5wBnPVALtq7LBIzkQesFZ/FCewpPPaqDy3Up8rnq4mvWDB2GCbpmwuA==} + /@blocksuite/editor/0.4.0-alpha.3: + resolution: {integrity: sha512-PLF8apMEOzvwS8sliZFRyHrgWKwR5XgpeIoqZ3CTUXvmkZ2cX6d8UP+GjS6GWKZarbpGJNtvuABYTFraJycMig==} dependencies: - '@blocksuite/blocks': 0.4.0-alpha.2 - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 - '@blocksuite/store': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/blocks': 0.4.0-alpha.3 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1 lit: 2.6.1 marked: 4.2.12 turndown: 7.1.1 @@ -2675,12 +2680,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-alpha.2_yjs@13.5.45: - resolution: {integrity: sha512-77+uY8ljus+W70sf3J5sjzS6jzfLXeA5wBnPVALtq7LBIzkQesFZ/FCewpPPaqDy3Up8rnq4mvWDB2GCbpmwuA==} + /@blocksuite/editor/0.4.0-alpha.3_yjs@13.5.45: + resolution: {integrity: sha512-PLF8apMEOzvwS8sliZFRyHrgWKwR5XgpeIoqZ3CTUXvmkZ2cX6d8UP+GjS6GWKZarbpGJNtvuABYTFraJycMig==} dependencies: - '@blocksuite/blocks': 0.4.0-alpha.2_yjs@13.5.45 - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 - '@blocksuite/store': 0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-alpha.3_yjs@13.5.45 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 lit: 2.6.1 marked: 4.2.12 turndown: 7.1.1 @@ -2691,8 +2696,8 @@ packages: - yjs dev: false - /@blocksuite/global/0.4.0-alpha.2_lit@2.6.1: - resolution: {integrity: sha512-LS58Itk+rrHmU51rEl6X4yqVpNRW9GCZBSrlLnlxSBaqqOwa7aE57vF2zfDiamjBXmCnwbcdAlucyMoHcuqrGA==} + /@blocksuite/global/0.4.0-alpha.3_lit@2.6.1: + resolution: {integrity: sha512-nCxWV8PoZNgoIMQjBX/c9x7BrvivCabY712bHy89K/QSNgXlKsPT0KN3tuLHdm96/q+3Suf6RhvB60SurPYv1g==} peerDependencies: lit: ^2.6 peerDependenciesMeta: @@ -2701,7 +2706,7 @@ packages: dependencies: ansi-colors: 4.1.3 lit: 2.6.1 - zod: 3.20.2 + zod: 3.20.5 dev: false /@blocksuite/icons/2.0.4_3stiutgnnbnfnf3uowm5cip22i: @@ -2724,12 +2729,12 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.4.0-alpha.2_lit@2.6.1: - resolution: {integrity: sha512-+T9hXOyadQh5A2TpzOvY7KntBImzt8fVMfgq0McGnPQP8whSDmgKmGn0N442ObUM09X9XwzmF1i2claYIiPW+g==} + /@blocksuite/phasor/0.4.0-alpha.3_lit@2.6.1: + resolution: {integrity: sha512-GLw+LPK5avc/fXZk9fxtAQtYxovTHMPrEs48OJtSlrVqvTAJwGQpK3W2BL7HKBhgHlsbOcaBQ2pAaqKAFypwEw==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 fractional-indexing: 3.2.0 nanoid: 4.0.1 perfect-freehand: 1.2.0 @@ -2737,12 +2742,12 @@ packages: - lit dev: false - /@blocksuite/phasor/0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-+T9hXOyadQh5A2TpzOvY7KntBImzt8fVMfgq0McGnPQP8whSDmgKmGn0N442ObUM09X9XwzmF1i2claYIiPW+g==} + /@blocksuite/phasor/0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-GLw+LPK5avc/fXZk9fxtAQtYxovTHMPrEs48OJtSlrVqvTAJwGQpK3W2BL7HKBhgHlsbOcaBQ2pAaqKAFypwEw==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 fractional-indexing: 3.2.0 nanoid: 4.0.1 perfect-freehand: 1.2.0 @@ -2751,23 +2756,23 @@ packages: - lit dev: false - /@blocksuite/store/0.4.0-alpha.2_lit@2.6.1: - resolution: {integrity: sha512-Tezn9P5EoggO03lBAusYTldUW+twoXSfaU+mJoTSCbW4DC8aDpgFRZgZlxjon2MC1aZnz1sShjFa6zKkNerRFg==} + /@blocksuite/store/0.4.0-alpha.3_lit@2.6.1: + resolution: {integrity: sha512-Ib8vjhMIC4PeWrbfz7usiXKIgw0VYPujfWwDZ3fDq+OWHbb2KzfnXBQ93W5oDZhv0tVpxoT2RYCtVSvrh7sY5A==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 '@types/flexsearch': 0.7.3 buffer: 6.0.3 flexsearch: 0.7.21 idb-keyval: 6.2.0 ky: 0.33.2 - lib0: 0.2.61 + lib0: 0.2.62 merge: 2.1.1 nanoid: 4.0.1 y-protocols: 1.0.5 y-webrtc: 10.2.4 - zod: 3.20.2 + zod: 3.20.5 transitivePeerDependencies: - bufferutil - lit @@ -2775,24 +2780,24 @@ packages: - utf-8-validate dev: false - /@blocksuite/store/0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-Tezn9P5EoggO03lBAusYTldUW+twoXSfaU+mJoTSCbW4DC8aDpgFRZgZlxjon2MC1aZnz1sShjFa6zKkNerRFg==} + /@blocksuite/store/0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-Ib8vjhMIC4PeWrbfz7usiXKIgw0VYPujfWwDZ3fDq+OWHbb2KzfnXBQ93W5oDZhv0tVpxoT2RYCtVSvrh7sY5A==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 '@types/flexsearch': 0.7.3 buffer: 6.0.3 flexsearch: 0.7.21 idb-keyval: 6.2.0 ky: 0.33.2 - lib0: 0.2.61 + lib0: 0.2.62 merge: 2.1.1 nanoid: 4.0.1 y-protocols: 1.0.5 y-webrtc: 10.2.4 yjs: 13.5.45 - zod: 3.20.2 + zod: 3.20.5 transitivePeerDependencies: - bufferutil - lit @@ -2800,23 +2805,23 @@ packages: - utf-8-validate dev: false - /@blocksuite/virgo/0.4.0-alpha.2_lit@2.6.1: - resolution: {integrity: sha512-ZLyQeBULa4yD0+wlP56miSZi4ljWYLvvZH54CEplVsOFqtYs0LruBsELc6z7cBkfJR1awdeJxNj/6qgKEwP5FA==} + /@blocksuite/virgo/0.4.0-alpha.3_lit@2.6.1: + resolution: {integrity: sha512-uEa2bH2XCNI5whF3LUJAOogmv+5gux4m80dge7dXslw+6UfbdS6tDTP268a0k7FCPiV7suAcGbT/y5wZUbJ0ow==} peerDependencies: lit: ^2 yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 lit: 2.6.1 dev: false - /@blocksuite/virgo/0.4.0-alpha.2_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-ZLyQeBULa4yD0+wlP56miSZi4ljWYLvvZH54CEplVsOFqtYs0LruBsELc6z7cBkfJR1awdeJxNj/6qgKEwP5FA==} + /@blocksuite/virgo/0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-uEa2bH2XCNI5whF3LUJAOogmv+5gux4m80dge7dXslw+6UfbdS6tDTP268a0k7FCPiV7suAcGbT/y5wZUbJ0ow==} peerDependencies: lit: ^2 yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.2_lit@2.6.1 + '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 lit: 2.6.1 yjs: 13.5.45 dev: false @@ -12871,6 +12876,13 @@ packages: dependencies: isomorphic.js: 0.2.5 + /lib0/0.2.62: + resolution: {integrity: sha512-DY0G8AaQloUvpiss7EpAo/t4R82b9m/AydbQRNAa9Khssn9oGDJnSN8Q1qQ8u82Wog4iaT1O8yM+DfhzGCrrpQ==} + engines: {node: '>=14'} + dependencies: + isomorphic.js: 0.2.5 + dev: false + /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} @@ -13645,7 +13657,7 @@ packages: babel-loader: 8.3.0 clean-webpack-plugin: 4.0.0 globby: 11.1.0 - next: 13.1.0_biqbaboplfbrettd7655fr4n2y + next: 13.1.0_rdilrli7uexa22ralt77ekax24_biqbaboplfbrettd7655fr4n2y terser-webpack-plugin: 5.3.6 workbox-webpack-plugin: 6.5.4 workbox-window: 6.5.4 @@ -13704,7 +13716,7 @@ packages: - babel-plugin-macros dev: false - /next/13.1.0_biqbaboplfbrettd7655fr4n2y: + /next/13.1.0_rdilrli7uexa22ralt77ekax24_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-lQMZH1V94L5IL/WaihQkTYabSY73aqgrkGPJB5uz+2O3ES4I3losV/maXLY7l7x5e+oNyE9N81upNQ8uRsR5/A==} engines: {node: '>=14.6.0'} hasBin: true @@ -13746,6 +13758,7 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + patched: true /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -14972,6 +14985,10 @@ packages: resolution: {integrity: sha512-nCwCZtQPl4EnxJSheHtb067Jo48A6mc8/t7waGSLqXvbE68a5vHBFfMOQPZI7jxjksbDhpfzQta3a3/MoPvKzQ==} dev: false + /quill-cursors/4.0.2: + resolution: {integrity: sha512-/5mEfB6rDXwBy9rt3XieMKmQE8+OMnMBi2DFwea3t06QXH6i/NsICpteEoC++WGkQ/qyurIACUNnY7eBVh4Bmg==} + dev: false + /quill-delta/3.6.3: resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==} engines: {node: '>=0.10'} @@ -18046,7 +18063,7 @@ packages: engines: {node: '>=12'} hasBin: true dependencies: - lib0: 0.2.61 + lib0: 0.2.62 simple-peer: 9.11.1 y-protocols: 1.0.5 optionalDependencies: @@ -18160,8 +18177,8 @@ packages: engines: {node: '>=10'} dev: true - /zod/3.20.2: - resolution: {integrity: sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==} + /zod/3.20.5: + resolution: {integrity: sha512-BTAAliwfoB9dWf2hC+TXlyWKk/YTqRGZjHQR0WLC2A2pzierWo7KuQ1ebjS4SNaFaxg/lDItzl9/QTgLjcHbgw==} dev: false /zwitch/1.0.5: diff --git a/tests/contact-us.spec.ts b/tests/contact-us.spec.ts index baf972d326..8a0a930565 100644 --- a/tests/contact-us.spec.ts +++ b/tests/contact-us.spec.ts @@ -26,6 +26,7 @@ test.describe('Open contact us', () => { const faqIcon = page.locator('[data-testid=faq-icon]'); const box = await faqIcon.boundingBox(); expect(box?.x).not.toBeUndefined(); + await faqIcon.click(); await page.mouse.move((box?.x ?? 0) + 10, (box?.y ?? 0) + 10); await page.mouse.move((box?.x ?? 0) + 5, (box?.y ?? 0) + 5); diff --git a/tests/shortcuts.spec.ts b/tests/shortcuts.spec.ts index a4a522dcaf..c46f9834f8 100644 --- a/tests/shortcuts.spec.ts +++ b/tests/shortcuts.spec.ts @@ -10,6 +10,7 @@ test.describe('Shortcuts Modal', () => { const box = await faqIcon.boundingBox(); expect(box?.x).not.toBeUndefined(); await page.mouse.move((box?.x ?? 0) + 5, (box?.y ?? 0) + 5); + await faqIcon.click(); const shortcutsIcon = page.locator('[data-testid=shortcuts-icon]'); expect(await shortcutsIcon.isVisible()).toEqual(true); From 1824ce1e80ba687787e104611f2dc1302908f198 Mon Sep 17 00:00:00 2001 From: Himself65 Date: Thu, 9 Feb 2023 13:46:25 -0600 Subject: [PATCH 04/13] chore: bump version (#937) --- packages/app/package.json | 6 +- packages/component/package.json | 2 +- packages/data-center/package.json | 4 +- pnpm-lock.yaml | 124 +++++++++++++++--------------- scripts/upgrade-blocksuite.sh | 9 ++- 5 files changed, 76 insertions(+), 69 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 3a1f655483..45187e271a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -12,10 +12,10 @@ "@affine/component": "workspace:*", "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.4.0-alpha.3", - "@blocksuite/editor": "0.4.0-alpha.3", + "@blocksuite/blocks": "0.4.0-20230209191848-0a912e3", + "@blocksuite/editor": "0.4.0-20230209191848-0a912e3", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.4.0-alpha.3", + "@blocksuite/store": "0.4.0-20230209191848-0a912e3", "@emotion/css": "^11.10.5", "@emotion/react": "^11.10.5", "@emotion/server": "^11.10.0", diff --git a/packages/component/package.json b/packages/component/package.json index 4117e52f4c..6f717692c8 100644 --- a/packages/component/package.json +++ b/packages/component/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@affine/i18n": "workspace:*", - "@blocksuite/editor": "0.4.0-alpha.3", + "@blocksuite/editor": "0.4.0-20230209191848-0a912e3", "@blocksuite/icons": "^2.0.2", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 9ee7ef4942..1fceb10d61 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -27,8 +27,8 @@ "yjs": "^13.5.45" }, "dependencies": { - "@blocksuite/blocks": "0.4.0-alpha.3", - "@blocksuite/store": "0.4.0-alpha.3", + "@blocksuite/blocks": "0.4.0-20230209191848-0a912e3", + "@blocksuite/store": "0.4.0-20230209191848-0a912e3", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3caffd7e8c..7b43fdb020 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,10 +52,10 @@ importers: '@affine/component': workspace:* '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.4.0-alpha.3 - '@blocksuite/editor': 0.4.0-alpha.3 + '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3 + '@blocksuite/editor': 0.4.0-20230209191848-0a912e3 '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.4.0-alpha.3 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3 '@emotion/css': ^11.10.5 '@emotion/react': ^11.10.5 '@emotion/server': ^11.10.0 @@ -94,10 +94,10 @@ importers: '@affine/component': link:../component '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.4.0-alpha.3_yjs@13.5.45 - '@blocksuite/editor': 0.4.0-alpha.3_yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 + '@blocksuite/editor': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 '@emotion/css': 11.10.5 '@emotion/react': 11.10.5_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.5 @@ -137,7 +137,7 @@ importers: packages/component: specifiers: '@affine/i18n': workspace:* - '@blocksuite/editor': 0.4.0-alpha.3 + '@blocksuite/editor': 0.4.0-20230209191848-0a912e3 '@blocksuite/icons': ^2.0.2 '@emotion/react': ^11.10.5 '@emotion/styled': ^11.10.5 @@ -161,7 +161,7 @@ importers: webpack: ^5.75.0 dependencies: '@affine/i18n': link:../i18n - '@blocksuite/editor': 0.4.0-alpha.3 + '@blocksuite/editor': 0.4.0-20230209191848-0a912e3 '@blocksuite/icons': 2.0.4_3stiutgnnbnfnf3uowm5cip22i '@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i '@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se @@ -187,8 +187,8 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.4.0-alpha.3 - '@blocksuite/store': 0.4.0-alpha.3 + '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3 '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -206,8 +206,8 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.45 dependencies: - '@blocksuite/blocks': 0.4.0-alpha.3_yjs@13.5.45 - '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -2620,13 +2620,13 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@blocksuite/blocks/0.4.0-alpha.3: - resolution: {integrity: sha512-DKRWJmNhaCLQSMYRdVMR6okuWRjvU3o+NZcrnXitNzEH2jes7gl9DxpCI4kfAWTGHKLtblDqkMwRtKJhhxE8ng==} + /@blocksuite/blocks/0.4.0-20230209191848-0a912e3: + resolution: {integrity: sha512-OnGaBTdLVAapQ0DzO6CeqYOZff1yB+IIb2BFNydOu6mkZpwJwp3wRUwSAi5dLiMOETzCq4Z7eojW2IadqWhdyw==} dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 - '@blocksuite/phasor': 0.4.0-alpha.3_lit@2.6.1 - '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1 - '@blocksuite/virgo': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/phasor': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/virgo': 0.4.0-20230209191848-0a912e3_lit@2.6.1 '@popperjs/core': 2.11.6 autosize: 5.0.2 highlight.js: 11.7.0 @@ -2634,7 +2634,7 @@ packages: lit: 2.6.1 quill: 1.3.7 quill-cursors: 4.0.2 - zod: 3.20.5 + zod: 3.20.6 transitivePeerDependencies: - bufferutil - supports-color @@ -2642,13 +2642,13 @@ packages: - yjs dev: false - /@blocksuite/blocks/0.4.0-alpha.3_yjs@13.5.45: - resolution: {integrity: sha512-DKRWJmNhaCLQSMYRdVMR6okuWRjvU3o+NZcrnXitNzEH2jes7gl9DxpCI4kfAWTGHKLtblDqkMwRtKJhhxE8ng==} + /@blocksuite/blocks/0.4.0-20230209191848-0a912e3_yjs@13.5.45: + resolution: {integrity: sha512-OnGaBTdLVAapQ0DzO6CeqYOZff1yB+IIb2BFNydOu6mkZpwJwp3wRUwSAi5dLiMOETzCq4Z7eojW2IadqWhdyw==} dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 - '@blocksuite/phasor': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 - '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 - '@blocksuite/virgo': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/phasor': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/virgo': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 '@popperjs/core': 2.11.6 autosize: 5.0.2 highlight.js: 11.7.0 @@ -2656,7 +2656,7 @@ packages: lit: 2.6.1 quill: 1.3.7 quill-cursors: 4.0.2 - zod: 3.20.5 + zod: 3.20.6 transitivePeerDependencies: - bufferutil - supports-color @@ -2664,12 +2664,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-alpha.3: - resolution: {integrity: sha512-PLF8apMEOzvwS8sliZFRyHrgWKwR5XgpeIoqZ3CTUXvmkZ2cX6d8UP+GjS6GWKZarbpGJNtvuABYTFraJycMig==} + /@blocksuite/editor/0.4.0-20230209191848-0a912e3: + resolution: {integrity: sha512-xKD+zdgPIO9JGauVLqwJOaDaOQj56P+ksIkSu5bi6/mXbemk9D4eDiEAK++cAOOwNUTHJUM3JcGBSHt5ripd5A==} dependencies: - '@blocksuite/blocks': 0.4.0-alpha.3 - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 - '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1 lit: 2.6.1 marked: 4.2.12 turndown: 7.1.1 @@ -2680,12 +2680,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-alpha.3_yjs@13.5.45: - resolution: {integrity: sha512-PLF8apMEOzvwS8sliZFRyHrgWKwR5XgpeIoqZ3CTUXvmkZ2cX6d8UP+GjS6GWKZarbpGJNtvuABYTFraJycMig==} + /@blocksuite/editor/0.4.0-20230209191848-0a912e3_yjs@13.5.45: + resolution: {integrity: sha512-xKD+zdgPIO9JGauVLqwJOaDaOQj56P+ksIkSu5bi6/mXbemk9D4eDiEAK++cAOOwNUTHJUM3JcGBSHt5ripd5A==} dependencies: - '@blocksuite/blocks': 0.4.0-alpha.3_yjs@13.5.45 - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 - '@blocksuite/store': 0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 lit: 2.6.1 marked: 4.2.12 turndown: 7.1.1 @@ -2696,8 +2696,8 @@ packages: - yjs dev: false - /@blocksuite/global/0.4.0-alpha.3_lit@2.6.1: - resolution: {integrity: sha512-nCxWV8PoZNgoIMQjBX/c9x7BrvivCabY712bHy89K/QSNgXlKsPT0KN3tuLHdm96/q+3Suf6RhvB60SurPYv1g==} + /@blocksuite/global/0.4.0-20230209191848-0a912e3_lit@2.6.1: + resolution: {integrity: sha512-ILUBzQ+sgD46GyGTEK9KyqkqcmCHxyHIrc3Y/q1oPtbN4yO3jJtEM1kmrfJ31oDT8PjjklqCiNHYtYsWuxuuug==} peerDependencies: lit: ^2.6 peerDependenciesMeta: @@ -2706,7 +2706,7 @@ packages: dependencies: ansi-colors: 4.1.3 lit: 2.6.1 - zod: 3.20.5 + zod: 3.20.6 dev: false /@blocksuite/icons/2.0.4_3stiutgnnbnfnf3uowm5cip22i: @@ -2729,12 +2729,12 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.4.0-alpha.3_lit@2.6.1: - resolution: {integrity: sha512-GLw+LPK5avc/fXZk9fxtAQtYxovTHMPrEs48OJtSlrVqvTAJwGQpK3W2BL7HKBhgHlsbOcaBQ2pAaqKAFypwEw==} + /@blocksuite/phasor/0.4.0-20230209191848-0a912e3_lit@2.6.1: + resolution: {integrity: sha512-7plV7v9F4KoqbGUZCyyI78HzxfZlP6jNZ9I8PEEap+JlUtsmryxHrEVC/oEta4FW6kBflmtQm46YOAlz3bBQFw==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 fractional-indexing: 3.2.0 nanoid: 4.0.1 perfect-freehand: 1.2.0 @@ -2742,12 +2742,12 @@ packages: - lit dev: false - /@blocksuite/phasor/0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-GLw+LPK5avc/fXZk9fxtAQtYxovTHMPrEs48OJtSlrVqvTAJwGQpK3W2BL7HKBhgHlsbOcaBQ2pAaqKAFypwEw==} + /@blocksuite/phasor/0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-7plV7v9F4KoqbGUZCyyI78HzxfZlP6jNZ9I8PEEap+JlUtsmryxHrEVC/oEta4FW6kBflmtQm46YOAlz3bBQFw==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 fractional-indexing: 3.2.0 nanoid: 4.0.1 perfect-freehand: 1.2.0 @@ -2756,12 +2756,12 @@ packages: - lit dev: false - /@blocksuite/store/0.4.0-alpha.3_lit@2.6.1: - resolution: {integrity: sha512-Ib8vjhMIC4PeWrbfz7usiXKIgw0VYPujfWwDZ3fDq+OWHbb2KzfnXBQ93W5oDZhv0tVpxoT2RYCtVSvrh7sY5A==} + /@blocksuite/store/0.4.0-20230209191848-0a912e3_lit@2.6.1: + resolution: {integrity: sha512-QMUWLW6VR+XGN9ENlRy7DvGQgDKMDKpQeRdc3XYvQKE1h3TAkeh4mQw5fWKN0c8tj45W7orzU1PIXATmHT0/FQ==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 '@types/flexsearch': 0.7.3 buffer: 6.0.3 flexsearch: 0.7.21 @@ -2772,7 +2772,7 @@ packages: nanoid: 4.0.1 y-protocols: 1.0.5 y-webrtc: 10.2.4 - zod: 3.20.5 + zod: 3.20.6 transitivePeerDependencies: - bufferutil - lit @@ -2780,12 +2780,12 @@ packages: - utf-8-validate dev: false - /@blocksuite/store/0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-Ib8vjhMIC4PeWrbfz7usiXKIgw0VYPujfWwDZ3fDq+OWHbb2KzfnXBQ93W5oDZhv0tVpxoT2RYCtVSvrh7sY5A==} + /@blocksuite/store/0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-QMUWLW6VR+XGN9ENlRy7DvGQgDKMDKpQeRdc3XYvQKE1h3TAkeh4mQw5fWKN0c8tj45W7orzU1PIXATmHT0/FQ==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 '@types/flexsearch': 0.7.3 buffer: 6.0.3 flexsearch: 0.7.21 @@ -2797,7 +2797,7 @@ packages: y-protocols: 1.0.5 y-webrtc: 10.2.4 yjs: 13.5.45 - zod: 3.20.5 + zod: 3.20.6 transitivePeerDependencies: - bufferutil - lit @@ -2805,25 +2805,27 @@ packages: - utf-8-validate dev: false - /@blocksuite/virgo/0.4.0-alpha.3_lit@2.6.1: - resolution: {integrity: sha512-uEa2bH2XCNI5whF3LUJAOogmv+5gux4m80dge7dXslw+6UfbdS6tDTP268a0k7FCPiV7suAcGbT/y5wZUbJ0ow==} + /@blocksuite/virgo/0.4.0-20230209191848-0a912e3_lit@2.6.1: + resolution: {integrity: sha512-KSIVFf+xfwDoPKcw8OCD1HmCsOXGpuZoP1FgCSGsCWtYoG/jOseF//1VPCrM3A9uL0fOd3mdXRUBYXFFVgdxow==} peerDependencies: lit: ^2 yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 lit: 2.6.1 + zod: 3.20.6 dev: false - /@blocksuite/virgo/0.4.0-alpha.3_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-uEa2bH2XCNI5whF3LUJAOogmv+5gux4m80dge7dXslw+6UfbdS6tDTP268a0k7FCPiV7suAcGbT/y5wZUbJ0ow==} + /@blocksuite/virgo/0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-KSIVFf+xfwDoPKcw8OCD1HmCsOXGpuZoP1FgCSGsCWtYoG/jOseF//1VPCrM3A9uL0fOd3mdXRUBYXFFVgdxow==} peerDependencies: lit: ^2 yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-alpha.3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 lit: 2.6.1 yjs: 13.5.45 + zod: 3.20.6 dev: false /@changesets/apply-release-plan/6.1.3: @@ -18177,8 +18179,8 @@ packages: engines: {node: '>=10'} dev: true - /zod/3.20.5: - resolution: {integrity: sha512-BTAAliwfoB9dWf2hC+TXlyWKk/YTqRGZjHQR0WLC2A2pzierWo7KuQ1ebjS4SNaFaxg/lDItzl9/QTgLjcHbgw==} + /zod/3.20.6: + resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==} dev: false /zwitch/1.0.5: diff --git a/scripts/upgrade-blocksuite.sh b/scripts/upgrade-blocksuite.sh index 4a25a65986..e197be434f 100755 --- a/scripts/upgrade-blocksuite.sh +++ b/scripts/upgrade-blocksuite.sh @@ -1,6 +1,11 @@ #!/usr/bin/env bash # Usage: -# ./scripts/upgrade-blocksuite.sh # ./scripts/upgrade-blocksuite.sh --latest +# ./scripts/upgrade-blocksuite.sh 0.4.0-20230209191848-0a912e3 + +if [ "$1" == "--latest" ]; then + pnpm up "@blocksuite/*" "!@blocksuite/icons" -r -i --latest +else + pnpm up "@blocksuite/*@${1}" "!@blocksuite/icons" -r +fi -pnpm up "@blocksuite/*" "!@blocksuite/icons" -r -i "$@" From 02aea468ca9f730d35d227ba686469b2c248244a Mon Sep 17 00:00:00 2001 From: Himself65 Date: Thu, 9 Feb 2023 19:31:46 -0600 Subject: [PATCH 05/13] chore: bump version (#938) --- packages/app/package.json | 6 +- packages/component/package.json | 6 +- packages/component/src/ui/modal/Modal.tsx | 2 +- pnpm-lock.yaml | 183 +++++++++------------- 4 files changed, 78 insertions(+), 119 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 45187e271a..f8710d0840 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -22,9 +22,9 @@ "@emotion/styled": "^11.10.5", "@fontsource/poppins": "^4.5.10", "@fontsource/space-mono": "^4.5.10", - "@mui/base": "=5.0.0-alpha.101", - "@mui/icons-material": "=5.10.9", - "@mui/material": "=5.8.6", + "@mui/base": "=5.0.0-alpha.117", + "@mui/icons-material": "=5.11.0", + "@mui/material": "=5.11.8", "@toeverything/pathfinder-logger": "workspace:@affine/logger@*", "cmdk": "^0.1.20", "css-spring": "^4.1.0", diff --git a/packages/component/package.json b/packages/component/package.json index 6f717692c8..a04e1bdb40 100644 --- a/packages/component/package.json +++ b/packages/component/package.json @@ -12,9 +12,9 @@ "@blocksuite/icons": "^2.0.2", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", - "@mui/base": "=5.0.0-alpha.101", - "@mui/icons-material": "=5.10.9", - "@mui/material": "=5.8.6", + "@mui/base": "=5.0.0-alpha.117", + "@mui/icons-material": "=5.11.0", + "@mui/material": "=5.11.8", "lit": "^2.6.1", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/packages/component/src/ui/modal/Modal.tsx b/packages/component/src/ui/modal/Modal.tsx index 705f56ab6a..bce56fe98b 100644 --- a/packages/component/src/ui/modal/Modal.tsx +++ b/packages/component/src/ui/modal/Modal.tsx @@ -40,7 +40,7 @@ export const Modal = (props: ModalProps) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b43fdb020..755fb04fa6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,9 +62,9 @@ importers: '@emotion/styled': ^11.10.5 '@fontsource/poppins': ^4.5.10 '@fontsource/space-mono': ^4.5.10 - '@mui/base': '=5.0.0-alpha.101' - '@mui/icons-material': '=5.10.9' - '@mui/material': '=5.8.6' + '@mui/base': '=5.0.0-alpha.117' + '@mui/icons-material': '=5.11.0' + '@mui/material': '=5.11.8' '@toeverything/pathfinder-logger': workspace:@affine/logger@* '@types/node': 18.7.18 '@types/react': 18.0.20 @@ -104,9 +104,9 @@ importers: '@emotion/styled': 11.10.5_s7uipz3r575xmfz2gje3lxfqua '@fontsource/poppins': 4.5.10 '@fontsource/space-mono': 4.5.10 - '@mui/base': 5.0.0-alpha.101_7ey2zzynotv32rpkwno45fsx4e - '@mui/icons-material': 5.10.9_rfq7yokapveszvfjgyiq2i3rfq - '@mui/material': 5.8.6_pmppvr4gtvd6vpdr5yl42vjwtu + '@mui/base': 5.0.0-alpha.117_7ey2zzynotv32rpkwno45fsx4e + '@mui/icons-material': 5.11.0_ixytn77exq5nzezlwja6xe4jxi + '@mui/material': 5.11.8_pmppvr4gtvd6vpdr5yl42vjwtu '@toeverything/pathfinder-logger': link:../logger cmdk: 0.1.21_7ey2zzynotv32rpkwno45fsx4e css-spring: 4.1.0 @@ -141,9 +141,9 @@ importers: '@blocksuite/icons': ^2.0.2 '@emotion/react': ^11.10.5 '@emotion/styled': ^11.10.5 - '@mui/base': '=5.0.0-alpha.101' - '@mui/icons-material': '=5.10.9' - '@mui/material': '=5.8.6' + '@mui/base': '=5.0.0-alpha.117' + '@mui/icons-material': '=5.11.0' + '@mui/material': '=5.11.8' '@storybook/addon-actions': ^6.5.16 '@storybook/addon-essentials': ^6.5.16 '@storybook/addon-links': ^6.5.16 @@ -165,9 +165,9 @@ importers: '@blocksuite/icons': 2.0.4_3stiutgnnbnfnf3uowm5cip22i '@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i '@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se - '@mui/base': 5.0.0-alpha.101_5ndqzdd6t4rivxsukjv3i3ak2q - '@mui/icons-material': 5.10.9_obkgatwej4mwurjrbit43rknru - '@mui/material': 5.8.6_rqh7qj4464ntrqrt6banhaqg4q + '@mui/base': 5.0.0-alpha.117_5ndqzdd6t4rivxsukjv3i3ak2q + '@mui/icons-material': 5.11.0_3psqo62dtzuc5tpd3awdluze4i + '@mui/material': 5.11.8_rqh7qj4464ntrqrt6banhaqg4q lit: 2.6.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -4007,8 +4007,8 @@ packages: glob-to-regexp: 0.3.0 dev: true - /@mui/base/5.0.0-alpha.101_5ndqzdd6t4rivxsukjv3i3ak2q: - resolution: {integrity: sha512-a54BcXvArGOKUZ2zyS/7B9GNhAGgfomEQSkfEZ88Nc9jKvXA+Mppenfz5o4JCAnD8c4VlePmz9rKOYvvum1bZw==} + /@mui/base/5.0.0-alpha.117_5ndqzdd6t4rivxsukjv3i3ak2q: + resolution: {integrity: sha512-3GlRSZdSrvDQ4k03dSV2rM+97JbNWimFOqGsE7n7Mi8WuBSYCgnPe56bQp3E5cShOrTn11dGH8FRCmVMcCEXqQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -4020,8 +4020,8 @@ packages: dependencies: '@babel/runtime': 7.20.7 '@emotion/is-prop-valid': 1.2.0 - '@mui/types': 7.2.0_@types+react@18.0.27 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/types': 7.2.3_@types+react@18.0.27 + '@mui/utils': 5.11.7_react@18.2.0 '@popperjs/core': 2.11.6 '@types/react': 18.0.27 clsx: 1.2.1 @@ -4031,8 +4031,8 @@ packages: react-is: 18.2.0 dev: false - /@mui/base/5.0.0-alpha.101_7ey2zzynotv32rpkwno45fsx4e: - resolution: {integrity: sha512-a54BcXvArGOKUZ2zyS/7B9GNhAGgfomEQSkfEZ88Nc9jKvXA+Mppenfz5o4JCAnD8c4VlePmz9rKOYvvum1bZw==} + /@mui/base/5.0.0-alpha.117_7ey2zzynotv32rpkwno45fsx4e: + resolution: {integrity: sha512-3GlRSZdSrvDQ4k03dSV2rM+97JbNWimFOqGsE7n7Mi8WuBSYCgnPe56bQp3E5cShOrTn11dGH8FRCmVMcCEXqQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -4044,8 +4044,8 @@ packages: dependencies: '@babel/runtime': 7.20.7 '@emotion/is-prop-valid': 1.2.0 - '@mui/types': 7.2.0_@types+react@18.0.20 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/types': 7.2.3_@types+react@18.0.20 + '@mui/utils': 5.11.7_react@18.2.0 '@popperjs/core': 2.11.6 '@types/react': 18.0.20 clsx: 1.2.1 @@ -4055,56 +4055,12 @@ packages: react-is: 18.2.0 dev: false - /@mui/base/5.0.0-alpha.87_5ndqzdd6t4rivxsukjv3i3ak2q: - resolution: {integrity: sha512-PuxRYrvG63Yj/UTwf4hSwZ5ClMv88iXHK+5hUV1CrG3kNPo6FFQiIFNRaNpRt/3nsXj6+xygJByNFA8m4Leetg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.20.7 - '@emotion/is-prop-valid': 1.2.0 - '@mui/types': 7.2.0_@types+react@18.0.27 - '@mui/utils': 5.10.9_react@18.2.0 - '@popperjs/core': 2.11.6 - '@types/react': 18.0.27 - clsx: 1.2.1 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-is: 17.0.2 + /@mui/core-downloads-tracker/5.11.8: + resolution: {integrity: sha512-n/uJRIwZAaJaROaOA4VzycxDo27cusnrRzfycnAkAP5gBndwOJQ1CXjd1Y7hJe5eorj/ukixC7IZD+qCClMCMg==} dev: false - /@mui/base/5.0.0-alpha.87_7ey2zzynotv32rpkwno45fsx4e: - resolution: {integrity: sha512-PuxRYrvG63Yj/UTwf4hSwZ5ClMv88iXHK+5hUV1CrG3kNPo6FFQiIFNRaNpRt/3nsXj6+xygJByNFA8m4Leetg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.20.7 - '@emotion/is-prop-valid': 1.2.0 - '@mui/types': 7.2.0_@types+react@18.0.20 - '@mui/utils': 5.10.9_react@18.2.0 - '@popperjs/core': 2.11.6 - '@types/react': 18.0.20 - clsx: 1.2.1 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-is: 17.0.2 - dev: false - - /@mui/icons-material/5.10.9_obkgatwej4mwurjrbit43rknru: - resolution: {integrity: sha512-sqClXdEM39WKQJOQ0ZCPTptaZgqwibhj2EFV9N0v7BU1PO8y4OcX/a2wIQHn4fNuDjIZktJIBrmU23h7aqlGgg==} + /@mui/icons-material/5.11.0_3psqo62dtzuc5tpd3awdluze4i: + resolution: {integrity: sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -4115,13 +4071,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.20.7 - '@mui/material': 5.8.6_rqh7qj4464ntrqrt6banhaqg4q + '@mui/material': 5.11.8_rqh7qj4464ntrqrt6banhaqg4q '@types/react': 18.0.27 react: 18.2.0 dev: false - /@mui/icons-material/5.10.9_rfq7yokapveszvfjgyiq2i3rfq: - resolution: {integrity: sha512-sqClXdEM39WKQJOQ0ZCPTptaZgqwibhj2EFV9N0v7BU1PO8y4OcX/a2wIQHn4fNuDjIZktJIBrmU23h7aqlGgg==} + /@mui/icons-material/5.11.0_ixytn77exq5nzezlwja6xe4jxi: + resolution: {integrity: sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -4132,13 +4088,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.20.7 - '@mui/material': 5.8.6_pmppvr4gtvd6vpdr5yl42vjwtu + '@mui/material': 5.11.8_pmppvr4gtvd6vpdr5yl42vjwtu '@types/react': 18.0.20 react: 18.2.0 dev: false - /@mui/material/5.8.6_pmppvr4gtvd6vpdr5yl42vjwtu: - resolution: {integrity: sha512-9fo5AiNHs+HY5ArMzsDMFrAmJSRw90y/qu81oDIszgK7Bfrm8GuI7Eb0mO6WADWPEyKOzOov/WZsm4G6jPEM4g==} + /@mui/material/5.11.8_pmppvr4gtvd6vpdr5yl42vjwtu: + resolution: {integrity: sha512-MpIVmtj9VJBhPHvPWoMkfCPpmVGXT4q43PtCJsdKIdc7W9/nG3Kpqw2oWyw+UxG5xG7eLhmfRFGPKvj4/WopEQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -4157,10 +4113,11 @@ packages: '@babel/runtime': 7.20.7 '@emotion/react': 11.10.5_w5j4k42lgipnm43s3brx6h3c34 '@emotion/styled': 11.10.5_s7uipz3r575xmfz2gje3lxfqua - '@mui/base': 5.0.0-alpha.87_7ey2zzynotv32rpkwno45fsx4e - '@mui/system': 5.10.10_rzxw6anggsjmiyyhdfmgehw6ye - '@mui/types': 7.2.0_@types+react@18.0.20 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/base': 5.0.0-alpha.117_7ey2zzynotv32rpkwno45fsx4e + '@mui/core-downloads-tracker': 5.11.8 + '@mui/system': 5.11.8_rzxw6anggsjmiyyhdfmgehw6ye + '@mui/types': 7.2.3_@types+react@18.0.20 + '@mui/utils': 5.11.7_react@18.2.0 '@types/react': 18.0.20 '@types/react-transition-group': 4.4.5 clsx: 1.2.1 @@ -4168,12 +4125,12 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - react-is: 17.0.2 + react-is: 18.2.0 react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y dev: false - /@mui/material/5.8.6_rqh7qj4464ntrqrt6banhaqg4q: - resolution: {integrity: sha512-9fo5AiNHs+HY5ArMzsDMFrAmJSRw90y/qu81oDIszgK7Bfrm8GuI7Eb0mO6WADWPEyKOzOov/WZsm4G6jPEM4g==} + /@mui/material/5.11.8_rqh7qj4464ntrqrt6banhaqg4q: + resolution: {integrity: sha512-MpIVmtj9VJBhPHvPWoMkfCPpmVGXT4q43PtCJsdKIdc7W9/nG3Kpqw2oWyw+UxG5xG7eLhmfRFGPKvj4/WopEQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -4192,10 +4149,11 @@ packages: '@babel/runtime': 7.20.7 '@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i '@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se - '@mui/base': 5.0.0-alpha.87_5ndqzdd6t4rivxsukjv3i3ak2q - '@mui/system': 5.10.10_gzalmy7izvhol7vh4xfy3dq6ua - '@mui/types': 7.2.0_@types+react@18.0.27 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/base': 5.0.0-alpha.117_5ndqzdd6t4rivxsukjv3i3ak2q + '@mui/core-downloads-tracker': 5.11.8 + '@mui/system': 5.11.8_gzalmy7izvhol7vh4xfy3dq6ua + '@mui/types': 7.2.3_@types+react@18.0.27 + '@mui/utils': 5.11.7_react@18.2.0 '@types/react': 18.0.27 '@types/react-transition-group': 4.4.5 clsx: 1.2.1 @@ -4203,12 +4161,12 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - react-is: 17.0.2 + react-is: 18.2.0 react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y dev: false - /@mui/private-theming/5.10.9_3stiutgnnbnfnf3uowm5cip22i: - resolution: {integrity: sha512-BN7/CnsVPVyBaQpDTij4uV2xGYHHHhOgpdxeYLlIu+TqnsVM7wUeF+37kXvHovxM6xmL5qoaVUD98gDC0IZnHg==} + /@mui/private-theming/5.11.7_3stiutgnnbnfnf3uowm5cip22i: + resolution: {integrity: sha512-XzRTSZdc8bhuUdjablTNv3kFkZ/XIMlKkOqqJCU0G8W3tWGXpau2DXkafPd1ddjPhF9zF3qLKNGgKCChYItjgA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -4218,14 +4176,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.20.7 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/utils': 5.11.7_react@18.2.0 '@types/react': 18.0.27 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/private-theming/5.10.9_w5j4k42lgipnm43s3brx6h3c34: - resolution: {integrity: sha512-BN7/CnsVPVyBaQpDTij4uV2xGYHHHhOgpdxeYLlIu+TqnsVM7wUeF+37kXvHovxM6xmL5qoaVUD98gDC0IZnHg==} + /@mui/private-theming/5.11.7_w5j4k42lgipnm43s3brx6h3c34: + resolution: {integrity: sha512-XzRTSZdc8bhuUdjablTNv3kFkZ/XIMlKkOqqJCU0G8W3tWGXpau2DXkafPd1ddjPhF9zF3qLKNGgKCChYItjgA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -4235,14 +4193,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.20.7 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/utils': 5.11.7_react@18.2.0 '@types/react': 18.0.20 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine/5.10.8_dovxhg2tvkkxkdnqyoum6wzcxm: - resolution: {integrity: sha512-w+y8WI18EJV6zM/q41ug19cE70JTeO6sWFsQ7tgePQFpy6ToCVPh0YLrtqxUZXSoMStW5FMw0t9fHTFAqPbngw==} + /@mui/styled-engine/5.11.8_dovxhg2tvkkxkdnqyoum6wzcxm: + resolution: {integrity: sha512-iSpZp9AoeictsDi5xAQ4PGXu7mKtQyzMl7ZaWpHIGMFpsNnfY3NQNg+wkj/gpsAZ+Zg+IIyD+t+ig71Kr9fa0w==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -4263,8 +4221,8 @@ packages: react: 18.2.0 dev: false - /@mui/system/5.10.10_gzalmy7izvhol7vh4xfy3dq6ua: - resolution: {integrity: sha512-TXwtKN0adKpBrZmO+eilQWoPf2veh050HLYrN78Kps9OhlvO70v/2Kya0+mORFhu9yhpAwjHXO8JII/R4a5ZLA==} + /@mui/system/5.11.8_gzalmy7izvhol7vh4xfy3dq6ua: + resolution: {integrity: sha512-zhroUcxAw2x/dISBJKhGbD70DOYCwMFRo7o/LUYTiUfQkfmLhRfEf1bopWgY9nYstn7QOxOq9fA3aR3pHrUTbw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -4282,10 +4240,10 @@ packages: '@babel/runtime': 7.20.7 '@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i '@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se - '@mui/private-theming': 5.10.9_3stiutgnnbnfnf3uowm5cip22i - '@mui/styled-engine': 5.10.8_dovxhg2tvkkxkdnqyoum6wzcxm - '@mui/types': 7.2.0_@types+react@18.0.27 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/private-theming': 5.11.7_3stiutgnnbnfnf3uowm5cip22i + '@mui/styled-engine': 5.11.8_dovxhg2tvkkxkdnqyoum6wzcxm + '@mui/types': 7.2.3_@types+react@18.0.27 + '@mui/utils': 5.11.7_react@18.2.0 '@types/react': 18.0.27 clsx: 1.2.1 csstype: 3.1.1 @@ -4293,8 +4251,8 @@ packages: react: 18.2.0 dev: false - /@mui/system/5.10.10_rzxw6anggsjmiyyhdfmgehw6ye: - resolution: {integrity: sha512-TXwtKN0adKpBrZmO+eilQWoPf2veh050HLYrN78Kps9OhlvO70v/2Kya0+mORFhu9yhpAwjHXO8JII/R4a5ZLA==} + /@mui/system/5.11.8_rzxw6anggsjmiyyhdfmgehw6ye: + resolution: {integrity: sha512-zhroUcxAw2x/dISBJKhGbD70DOYCwMFRo7o/LUYTiUfQkfmLhRfEf1bopWgY9nYstn7QOxOq9fA3aR3pHrUTbw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -4312,10 +4270,10 @@ packages: '@babel/runtime': 7.20.7 '@emotion/react': 11.10.5_w5j4k42lgipnm43s3brx6h3c34 '@emotion/styled': 11.10.5_s7uipz3r575xmfz2gje3lxfqua - '@mui/private-theming': 5.10.9_w5j4k42lgipnm43s3brx6h3c34 - '@mui/styled-engine': 5.10.8_dovxhg2tvkkxkdnqyoum6wzcxm - '@mui/types': 7.2.0_@types+react@18.0.20 - '@mui/utils': 5.10.9_react@18.2.0 + '@mui/private-theming': 5.11.7_w5j4k42lgipnm43s3brx6h3c34 + '@mui/styled-engine': 5.11.8_dovxhg2tvkkxkdnqyoum6wzcxm + '@mui/types': 7.2.3_@types+react@18.0.20 + '@mui/utils': 5.11.7_react@18.2.0 '@types/react': 18.0.20 clsx: 1.2.1 csstype: 3.1.1 @@ -4323,8 +4281,8 @@ packages: react: 18.2.0 dev: false - /@mui/types/7.2.0_@types+react@18.0.20: - resolution: {integrity: sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA==} + /@mui/types/7.2.3_@types+react@18.0.20: + resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==} peerDependencies: '@types/react': '*' peerDependenciesMeta: @@ -4334,8 +4292,8 @@ packages: '@types/react': 18.0.20 dev: false - /@mui/types/7.2.0_@types+react@18.0.27: - resolution: {integrity: sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA==} + /@mui/types/7.2.3_@types+react@18.0.27: + resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==} peerDependencies: '@types/react': '*' peerDependenciesMeta: @@ -4345,8 +4303,8 @@ packages: '@types/react': 18.0.27 dev: false - /@mui/utils/5.10.9_react@18.2.0: - resolution: {integrity: sha512-2tdHWrq3+WCy+G6TIIaFx3cg7PorXZ71P375ExuX61od1NOAJP1mK90VxQ8N4aqnj2vmO3AQDkV4oV2Ktvt4bA==} + /@mui/utils/5.11.7_react@18.2.0: + resolution: {integrity: sha512-8uyNDeVHZA804Ego20Erv8TpxlbqTe/EbhTI2H1UYr4/RiIbBprat8W4Qqr2UQIsC/b3DLz+0RQ6R/E5BxEcLA==} engines: {node: '>=12.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 @@ -15146,6 +15104,7 @@ packages: /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} From 7bd69809e9affad5178b4c947db44b2682c678f7 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Fri, 10 Feb 2023 12:00:36 +0800 Subject: [PATCH 06/13] fix: html tag should have correct lang attr (#884) --- packages/app/src/pages/_app.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index ca96b8ef68..f572774a0e 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -21,6 +21,8 @@ import { useAppState } from '@/providers/app-state-provider'; import { PageLoading } from '@/components/loading'; import Head from 'next/head'; import '@affine/i18n'; +import { useTranslation } from '@affine/i18n'; +import React from 'react'; const ThemeProvider = dynamic(() => import('@/providers/ThemeProvider'), { ssr: false, @@ -39,6 +41,11 @@ type AppPropsWithLayout = AppProps & { const App = ({ Component, pageProps }: AppPropsWithLayout) => { const getLayout = Component.getLayout || (page => page); + const { i18n } = useTranslation(); + + React.useEffect(() => { + document.documentElement.lang = i18n.language; + }, [i18n.language]); return ( <> From 26c308147cd547c83f95725dbc71f4cf4630c7b3 Mon Sep 17 00:00:00 2001 From: Himself65 Date: Thu, 9 Feb 2023 22:01:10 -0600 Subject: [PATCH 07/13] feat: add `exportWorkspaceYDoc` (#942) --- packages/data-center/src/workspace-unit.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/data-center/src/workspace-unit.ts b/packages/data-center/src/workspace-unit.ts index 1560ec7bf6..6b1548e26f 100644 --- a/packages/data-center/src/workspace-unit.ts +++ b/packages/data-center/src/workspace-unit.ts @@ -74,4 +74,11 @@ export class WorkspaceUnit { syncMode: this.syncMode, }; } + + /** + * @internal only for debug use + */ + exportWorkspaceYDoc(): void { + this._blocksuiteWorkspace?.exportYDoc(); + } } From 323d7c96f79cae9d49328a788620db8d0707368e Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Fri, 10 Feb 2023 12:02:52 +0800 Subject: [PATCH 08/13] chore: bump BlockSuite version & remove old edgeless toolbar (#941) --- packages/app/package.json | 6 +- .../workspace/[workspaceId]/[pageId].tsx | 2 - packages/data-center/package.json | 4 +- pnpm-lock.yaml | 86 +++++++++++-------- 4 files changed, 53 insertions(+), 45 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index f8710d0840..4771ed5a02 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -12,10 +12,10 @@ "@affine/component": "workspace:*", "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.4.0-20230209191848-0a912e3", - "@blocksuite/editor": "0.4.0-20230209191848-0a912e3", + "@blocksuite/blocks": "0.4.0-20230210031655-264744e", + "@blocksuite/editor": "0.4.0-20230210031655-264744e", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.4.0-20230209191848-0a912e3", + "@blocksuite/store": "0.4.0-20230210031655-264744e", "@emotion/css": "^11.10.5", "@emotion/react": "^11.10.5", "@emotion/server": "^11.10.0", diff --git a/packages/app/src/pages/workspace/[workspaceId]/[pageId].tsx b/packages/app/src/pages/workspace/[workspaceId]/[pageId].tsx index a8f6284b1d..003ec723da 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/[pageId].tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/[pageId].tsx @@ -6,7 +6,6 @@ import { useState, } from 'react'; import { EditorHeader } from '@/components/header'; -import EdgelessToolbar from '@/components/edgeless-toolbar'; import MobileModal from '@/components/mobile-modal'; import { useAppState } from '@/providers/app-state-provider'; import type { NextPageWithLayout } from '../..//_app'; @@ -43,7 +42,6 @@ const Page: NextPageWithLayout = () => { setEditor={setEditorHandler} /> )} - ); }; diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 1fceb10d61..3366259b10 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -27,8 +27,8 @@ "yjs": "^13.5.45" }, "dependencies": { - "@blocksuite/blocks": "0.4.0-20230209191848-0a912e3", - "@blocksuite/store": "0.4.0-20230209191848-0a912e3", + "@blocksuite/blocks": "0.4.0-20230210031655-264744e", + "@blocksuite/store": "0.4.0-20230210031655-264744e", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 755fb04fa6..3ded455840 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,10 +52,10 @@ importers: '@affine/component': workspace:* '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3 - '@blocksuite/editor': 0.4.0-20230209191848-0a912e3 + '@blocksuite/blocks': 0.4.0-20230210031655-264744e + '@blocksuite/editor': 0.4.0-20230210031655-264744e '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.4.0-20230209191848-0a912e3 + '@blocksuite/store': 0.4.0-20230210031655-264744e '@emotion/css': ^11.10.5 '@emotion/react': ^11.10.5 '@emotion/server': ^11.10.0 @@ -94,10 +94,10 @@ importers: '@affine/component': link:../component '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 - '@blocksuite/editor': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-20230210031655-264744e_tryoyswiy2ympczjdv3b3agdeu + '@blocksuite/editor': 0.4.0-20230210031655-264744e_j74rmblk7sdmtedyaf3ziv736m '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/store': 0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45 '@emotion/css': 11.10.5 '@emotion/react': 11.10.5_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.5 @@ -187,8 +187,8 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3 - '@blocksuite/store': 0.4.0-20230209191848-0a912e3 + '@blocksuite/blocks': 0.4.0-20230210031655-264744e + '@blocksuite/store': 0.4.0-20230210031655-264744e '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -206,8 +206,8 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.45 dependencies: - '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 - '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-20230210031655-264744e_tryoyswiy2ympczjdv3b3agdeu + '@blocksuite/store': 0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -2642,13 +2642,15 @@ packages: - yjs dev: false - /@blocksuite/blocks/0.4.0-20230209191848-0a912e3_yjs@13.5.45: - resolution: {integrity: sha512-OnGaBTdLVAapQ0DzO6CeqYOZff1yB+IIb2BFNydOu6mkZpwJwp3wRUwSAi5dLiMOETzCq4Z7eojW2IadqWhdyw==} + /@blocksuite/blocks/0.4.0-20230210031655-264744e_tryoyswiy2ympczjdv3b3agdeu: + resolution: {integrity: sha512-QG9RQGwpkv/IRuWIK+ku56yqbXhbE5mXYDN3zt/5ZkwQtPc/hnORbwDNomgDOxmXVxJpkyucCQPxR/8DcHaOZA==} + peerDependencies: + '@blocksuite/store': 0.4.0-20230210031655-264744e dependencies: - '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 - '@blocksuite/phasor': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 - '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 - '@blocksuite/virgo': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/global': 0.4.0-20230210031655-264744e_lit@2.6.1 + '@blocksuite/phasor': 0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45 + '@blocksuite/store': 0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45 + '@blocksuite/virgo': 0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45 '@popperjs/core': 2.11.6 autosize: 5.0.2 highlight.js: 11.7.0 @@ -2658,9 +2660,6 @@ packages: quill-cursors: 4.0.2 zod: 3.20.6 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - yjs dev: false @@ -2680,20 +2679,18 @@ packages: - yjs dev: false - /@blocksuite/editor/0.4.0-20230209191848-0a912e3_yjs@13.5.45: - resolution: {integrity: sha512-xKD+zdgPIO9JGauVLqwJOaDaOQj56P+ksIkSu5bi6/mXbemk9D4eDiEAK++cAOOwNUTHJUM3JcGBSHt5ripd5A==} + /@blocksuite/editor/0.4.0-20230210031655-264744e_j74rmblk7sdmtedyaf3ziv736m: + resolution: {integrity: sha512-sIQoA7mwTfbPhc0NFbADA/6EddHxjZGN1b2/nwLLJgZFWEbLA2++iVHN1SXyI0Pyvw7gLnlVgCRBTw1rh+wU6Q==} + peerDependencies: + '@blocksuite/blocks': 0.4.0-20230210031655-264744e + '@blocksuite/store': 0.4.0-20230210031655-264744e dependencies: - '@blocksuite/blocks': 0.4.0-20230209191848-0a912e3_yjs@13.5.45 - '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 - '@blocksuite/store': 0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45 + '@blocksuite/blocks': 0.4.0-20230210031655-264744e_tryoyswiy2ympczjdv3b3agdeu + '@blocksuite/global': 0.4.0-20230210031655-264744e_lit@2.6.1 + '@blocksuite/store': 0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45 lit: 2.6.1 marked: 4.2.12 turndown: 7.1.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - yjs dev: false /@blocksuite/global/0.4.0-20230209191848-0a912e3_lit@2.6.1: @@ -2709,6 +2706,19 @@ packages: zod: 3.20.6 dev: false + /@blocksuite/global/0.4.0-20230210031655-264744e_lit@2.6.1: + resolution: {integrity: sha512-pKFZUeNIgXjqBlq/iTMPWSpweuunAlbNr1WtECp+q0Qlf84osq1nDVKwjWvJCrzP28j5lREUX7OQ1I0hzlcN0g==} + peerDependencies: + lit: ^2.6 + peerDependenciesMeta: + lit: + optional: true + dependencies: + ansi-colors: 4.1.3 + lit: 2.6.1 + zod: 3.20.6 + dev: false + /@blocksuite/icons/2.0.4_3stiutgnnbnfnf3uowm5cip22i: resolution: {integrity: sha512-Ewx30d3W6MXJGPXYvv48UpvAVfDB+gIVu90sHZX5curnSn+e1DdpCVfL0DeZA7Iyq6aLbxnKVzOAewlfoP8kDQ==} peerDependencies: @@ -2742,12 +2752,12 @@ packages: - lit dev: false - /@blocksuite/phasor/0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-7plV7v9F4KoqbGUZCyyI78HzxfZlP6jNZ9I8PEEap+JlUtsmryxHrEVC/oEta4FW6kBflmtQm46YOAlz3bBQFw==} + /@blocksuite/phasor/0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-+s37mAPF3+/3ucl26VlSk/pm+AFsMiXpSpXV6f9abfqfxZZ4ESBErDVOsQzSLUZviselNeFN4NHD4wcbcgJ0JA==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230210031655-264744e_lit@2.6.1 fractional-indexing: 3.2.0 nanoid: 4.0.1 perfect-freehand: 1.2.0 @@ -2780,12 +2790,12 @@ packages: - utf-8-validate dev: false - /@blocksuite/store/0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-QMUWLW6VR+XGN9ENlRy7DvGQgDKMDKpQeRdc3XYvQKE1h3TAkeh4mQw5fWKN0c8tj45W7orzU1PIXATmHT0/FQ==} + /@blocksuite/store/0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-VGwArRovIHtz9WLtn46EC8Y900zBS0DDzYgdZo7Krc6czB1QKSMkzeQucaLsY2IE99EawAV4B9fU1vafzmwKCw==} peerDependencies: yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230210031655-264744e_lit@2.6.1 '@types/flexsearch': 0.7.3 buffer: 6.0.3 flexsearch: 0.7.21 @@ -2816,13 +2826,13 @@ packages: zod: 3.20.6 dev: false - /@blocksuite/virgo/0.4.0-20230209191848-0a912e3_lit@2.6.1+yjs@13.5.45: - resolution: {integrity: sha512-KSIVFf+xfwDoPKcw8OCD1HmCsOXGpuZoP1FgCSGsCWtYoG/jOseF//1VPCrM3A9uL0fOd3mdXRUBYXFFVgdxow==} + /@blocksuite/virgo/0.4.0-20230210031655-264744e_lit@2.6.1+yjs@13.5.45: + resolution: {integrity: sha512-cjG5ADQVM6HafeSoV1ym1voa04WD4fHJE887ZpXUFfj73OcU9EUAOGdjoocJyV9EzmWWeBA9QB/jMmx408v3pg==} peerDependencies: lit: ^2 yjs: ^13 dependencies: - '@blocksuite/global': 0.4.0-20230209191848-0a912e3_lit@2.6.1 + '@blocksuite/global': 0.4.0-20230210031655-264744e_lit@2.6.1 lit: 2.6.1 yjs: 13.5.45 zod: 3.20.6 From 094e73b7fb0fa7a880f00b34b61ad4fc135854dc Mon Sep 17 00:00:00 2001 From: Himself65 Date: Thu, 9 Feb 2023 22:03:15 -0600 Subject: [PATCH 09/13] refactor: use zustand in global modal (#940) --- packages/app/package.json | 3 +- .../components/header/QuickSearchButton.tsx | 2 +- .../header/header-right-items/SyncUser.tsx | 2 +- .../app/src/components/help-island/index.tsx | 2 +- .../app/src/components/quick-search/index.tsx | 2 +- .../WorkspaceItem/LoginItem.tsx | 2 +- .../components/workspace-slider-bar/index.tsx | 2 +- packages/app/src/pages/_app.tsx | 2 +- .../[workspaceId]/[pageId].tsx | 2 +- .../public-workspace/[workspaceId]/index.tsx | 2 +- .../app/src/providers/GlobalModalProvider.tsx | 123 --------------- packages/app/src/store/globalModal/index.tsx | 146 ++++++++++++++++++ pnpm-lock.yaml | 18 +++ 13 files changed, 175 insertions(+), 133 deletions(-) delete mode 100644 packages/app/src/providers/GlobalModalProvider.tsx create mode 100644 packages/app/src/store/globalModal/index.tsx diff --git a/packages/app/package.json b/packages/app/package.json index 4771ed5a02..236d8ca3b3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -37,7 +37,8 @@ "quill-cursors": "^4.0.0", "react": "18.2.0", "react-dom": "18.2.0", - "yjs": "^13.5.45" + "yjs": "^13.5.45", + "zustand": "^4.3.2" }, "devDependencies": { "@types/node": "18.7.18", diff --git a/packages/app/src/components/header/QuickSearchButton.tsx b/packages/app/src/components/header/QuickSearchButton.tsx index 9b73c096f6..d32be2c03f 100644 --- a/packages/app/src/components/header/QuickSearchButton.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { IconButton, IconButtonProps } from '@affine/component'; import { ArrowDownIcon } from '@blocksuite/icons'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; import { styled } from '@affine/component'; const StyledIconButtonWithAnimate = styled(IconButton)(({ theme }) => { diff --git a/packages/app/src/components/header/header-right-items/SyncUser.tsx b/packages/app/src/components/header/header-right-items/SyncUser.tsx index 0cedea6fec..8724f6b42b 100644 --- a/packages/app/src/components/header/header-right-items/SyncUser.tsx +++ b/packages/app/src/components/header/header-right-items/SyncUser.tsx @@ -1,5 +1,5 @@ import { CloudUnsyncedIcon } from '@blocksuite/icons'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; import { useAppState } from '@/providers/app-state-provider'; import { IconButton } from '@affine/component'; diff --git a/packages/app/src/components/help-island/index.tsx b/packages/app/src/components/help-island/index.tsx index 714e43d04a..0f01f27132 100644 --- a/packages/app/src/components/help-island/index.tsx +++ b/packages/app/src/components/help-island/index.tsx @@ -9,7 +9,7 @@ import { CloseIcon, ContactIcon, HelpIcon, KeyboardIcon } from './Icons'; import { Tooltip } from '@affine/component'; import { useTranslation } from '@affine/i18n'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; import { MuiFade } from '@affine/component'; export type IslandItemNames = 'contact' | 'shortcuts'; export const HelpIsland = ({ diff --git a/packages/app/src/components/quick-search/index.tsx b/packages/app/src/components/quick-search/index.tsx index 3ca942444a..5df443c0a1 100644 --- a/packages/app/src/components/quick-search/index.tsx +++ b/packages/app/src/components/quick-search/index.tsx @@ -11,7 +11,7 @@ import { Results } from './Results'; import { Footer } from './Footer'; import { Command } from 'cmdk'; import { useEffect, useState } from 'react'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; import { getUaHelper } from '@/utils'; import { useRouter } from 'next/router'; import { PublishedResults } from './PublishedResults'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx index 7ea99ecce4..a000de38f6 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx @@ -1,4 +1,4 @@ -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; import { styled } from '@affine/component'; import { AffineIcon } from '../../icons/Icons'; import { diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 5c98f28ff3..7507569fd2 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -23,7 +23,7 @@ import { import Link from 'next/link'; import { MuiCollapse } from '@affine/component'; import { Tooltip } from '@affine/component'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; import { useAppState } from '@/providers/app-state-provider'; import { IconButton } from '@affine/component'; import useLocalStorage from '@/hooks/use-local-storage'; diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index f572774a0e..562d3657a0 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -12,7 +12,7 @@ import type { PropsWithChildren, ReactElement, ReactNode } from 'react'; import type { NextPage } from 'next'; import { AppStateProvider } from '@/providers/app-state-provider'; import ConfirmProvider from '@/providers/ConfirmProvider'; -import { ModalProvider } from '@/providers/GlobalModalProvider'; +import { ModalProvider } from '@/store/globalModal'; // import AppStateProvider2 from '@/providers/app-state-provider2/provider'; import { useRouter } from 'next/router'; diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx index 4ccda04b71..8411740687 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx @@ -11,7 +11,7 @@ import { IconButton } from '@affine/component'; import NextLink from 'next/link'; import { PaperIcon, SearchIcon } from '@blocksuite/icons'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; const DynamicBlocksuite = dynamic(() => import('@/components/editor'), { ssr: false, diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx b/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx index 37aaa7317d..4640d595fe 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx @@ -11,7 +11,7 @@ import { import { Breadcrumbs } from '@affine/component'; import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { SearchIcon } from '@blocksuite/icons'; -import { useModal } from '@/providers/GlobalModalProvider'; +import { useModal } from '@/store/globalModal'; const All = () => { const { dataCenter } = useAppState(); const router = useRouter(); diff --git a/packages/app/src/providers/GlobalModalProvider.tsx b/packages/app/src/providers/GlobalModalProvider.tsx deleted file mode 100644 index 76a0365dfc..0000000000 --- a/packages/app/src/providers/GlobalModalProvider.tsx +++ /dev/null @@ -1,123 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -import { - createContext, - useCallback, - useContext, - useEffect, - useState, -} from 'react'; -import type { PropsWithChildren } from 'react'; -import ShortcutsModal from '@/components/shortcuts-modal'; -import ContactModal from '@/components/contact-modal'; -import QuickSearch from '@/components/quick-search'; -import { ImportModal } from '@/components/import'; -import { LoginModal } from '@/components/login-modal'; - -type ModalContextValue = { - triggerShortcutsModal: () => void; - triggerContactModal: () => void; - triggerQuickSearchModal: (visible?: boolean) => void; - triggerImportModal: () => void; - triggerLoginModal: () => void; -}; -type ModalContextProps = PropsWithChildren>; -type ModalMap = { - contact: boolean; - shortcuts: boolean; - quickSearch: boolean; - import: boolean; - login: boolean; -}; - -export const ModalContext = createContext({ - triggerShortcutsModal: () => {}, - triggerContactModal: () => {}, - triggerQuickSearchModal: () => {}, - triggerImportModal: () => {}, - triggerLoginModal: () => {}, -}); - -export const useModal = () => useContext(ModalContext); - -export const ModalProvider = ({ - children, -}: PropsWithChildren) => { - const [modalMap, setModalMap] = useState({ - contact: false, - shortcuts: false, - quickSearch: false, - import: false, - login: false, - }); - - const triggerHandler = useCallback( - (key: keyof ModalMap, visible?: boolean) => { - setModalMap({ - ...modalMap, - [key]: visible ?? !modalMap[key], - }); - }, - [modalMap] - ); - useEffect(() => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - window.triggerHandler = () => triggerHandler('login'); - }, [triggerHandler]); - - return ( - { - triggerHandler('shortcuts'); - }, - triggerContactModal: () => { - triggerHandler('contact'); - }, - triggerQuickSearchModal: (visible?) => { - triggerHandler('quickSearch', visible); - }, - triggerImportModal: () => { - triggerHandler('import'); - }, - triggerLoginModal: () => { - triggerHandler('login'); - }, - }} - > - { - triggerHandler('contact', false); - }} - > - { - triggerHandler('shortcuts', false); - }} - > - { - triggerHandler('quickSearch', false); - }} - > - { - triggerHandler('import', false); - }} - > - { - triggerHandler('login', false); - }} - /> - {children} - - ); -}; - -export default ModalProvider; diff --git a/packages/app/src/store/globalModal/index.tsx b/packages/app/src/store/globalModal/index.tsx new file mode 100644 index 0000000000..337a8fff6f --- /dev/null +++ b/packages/app/src/store/globalModal/index.tsx @@ -0,0 +1,146 @@ +import type React from 'react'; +import { createContext, useCallback, useContext, useMemo } from 'react'; +import { createStore, useStore } from 'zustand'; +import { combine, subscribeWithSelector } from 'zustand/middleware'; +import { UseBoundStore } from 'zustand/react'; +import ContactModal from '@/components/contact-modal'; +import ShortcutsModal from '@/components/shortcuts-modal'; +import QuickSearch from '@/components/quick-search'; +import { LoginModal } from '@/components/login-modal'; +import ImportModal from '@/components/import'; + +export type ModalState = { + contact: boolean; + shortcuts: boolean; + quickSearch: boolean; + import: boolean; + login: boolean; +}; + +export type ModalActions = { + triggerShortcutsModal: () => void; + triggerContactModal: () => void; + triggerQuickSearchModal: (visible?: boolean) => void; + triggerImportModal: () => void; + triggerLoginModal: () => void; +}; + +const create = () => + createStore( + subscribeWithSelector( + combine( + { + contact: false, + shortcuts: false, + quickSearch: false, + import: false, + login: false, + }, + set => ({ + triggerShortcutsModal: () => { + set(({ shortcuts }) => ({ + shortcuts: !shortcuts, + })); + }, + triggerContactModal: () => { + set(({ contact }) => ({ + contact: !contact, + })); + }, + triggerQuickSearchModal: (visible?: boolean) => { + set(({ quickSearch }) => ({ + quickSearch: visible ?? !quickSearch, + })); + }, + triggerImportModal: () => { + set(state => ({ + import: !state.import, + })); + }, + triggerLoginModal: () => { + set(({ login }) => ({ + login: !login, + })); + }, + }) + ) + ) + ); +type Store = ReturnType; + +const ModalContext = createContext(null); + +export const useModalApi = () => { + const api = useContext(ModalContext); + if (!api) { + throw new Error('cannot find modal context'); + } + return api; +}; + +export const useModal: UseBoundStore = (( + selector: Parameters>[0], + equals: Parameters>[1] +) => { + const api = useModalApi(); + return useStore(api, selector, equals); + // eslint-disable-next-line @typescript-eslint/no-explicit-any +}) as any; + +const Modals: React.FC = function Modal() { + const api = useModalApi(); + return ( + <> + state.contact)} + onClose={useCallback(() => { + api.setState({ + contact: false, + }); + }, [api])} + > + state.shortcuts)} + onClose={useCallback(() => { + api.setState({ + shortcuts: false, + }); + }, [api])} + > + state.quickSearch)} + onClose={useCallback(() => { + api.setState({ + quickSearch: false, + }); + }, [api])} + > + state.import)} + onClose={useCallback(() => { + api.setState({ + import: false, + }); + }, [api])} + > + state.login)} + onClose={useCallback(() => { + api.setState({ + login: false, + }); + }, [api])} + /> + + ); +}; + +export const ModalProvider: React.FC = + function ModelProvider({ children }) { + return ( + create(), [])}> + + {children} + + ); + }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ded455840..5026a0261d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,6 +90,7 @@ importers: react-dom: 18.2.0 typescript: ^4.9.5 yjs: ^13.5.45 + zustand: ^4.3.2 dependencies: '@affine/component': link:../component '@affine/datacenter': link:../data-center @@ -120,6 +121,7 @@ importers: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 yjs: 13.5.45 + zustand: 4.3.2_react@18.2.0 devDependencies: '@types/node': 18.7.18 '@types/react': 18.0.20 @@ -18152,6 +18154,22 @@ packages: resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==} dev: false + /zustand/4.3.2_react@18.2.0: + resolution: {integrity: sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw==} + engines: {node: '>=12.7.0'} + peerDependencies: + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + dependencies: + react: 18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false + /zwitch/1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} dev: true From 944c455c3d29ca70be67ed0335295d6c622d8ede Mon Sep 17 00:00:00 2001 From: Whitewater Date: Fri, 10 Feb 2023 12:03:37 +0800 Subject: [PATCH 10/13] feat: enable slash menu by default (#939) --- packages/data-center/src/utils/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/data-center/src/utils/index.ts b/packages/data-center/src/utils/index.ts index 3a8e618489..5c93abd900 100644 --- a/packages/data-center/src/utils/index.ts +++ b/packages/data-center/src/utils/index.ts @@ -10,6 +10,7 @@ export const createBlocksuiteWorkspace = ( ) => { return new BlocksuiteWorkspace({ room: workspaceId, + defaultFlags: { enable_slash_menu: true }, ...workspaceOption, }) .register(builtInSchemas) From 8615d4b3af98a3aab19346901996db13e08590e4 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Fri, 10 Feb 2023 12:04:03 +0800 Subject: [PATCH 11/13] chore: update skiped test (#933) --- tests/console.spec.ts | 28 ++++++++++------------------ tests/contact-us.spec.ts | 17 ----------------- 2 files changed, 10 insertions(+), 35 deletions(-) diff --git a/tests/console.spec.ts b/tests/console.spec.ts index 4238db4eef..6ff7d5d719 100644 --- a/tests/console.spec.ts +++ b/tests/console.spec.ts @@ -1,28 +1,20 @@ +import fs from 'fs'; +import path from 'path'; import { expect } from '@playwright/test'; import { test } from './libs/playwright.js'; import { loadPage } from './libs/load-page.js'; +import { fileURLToPath } from 'url'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const pkgPath = path.join(__dirname, '../packages/app/package.json'); +const record = fs.readFileSync(pkgPath, 'utf8'); +const temp = JSON.parse(record); loadPage(); - test.describe('web console', () => { - // TODO: playwright need to support json import in esm - test.skip('editor version', async ({ page }) => { - // TODO: playwright need to support json import in esm - // const pkg = await import('./../packages/app/package.json', { - // assert: { type: 'json' }, - // }); - const pkg = {} as any; - - // https://playwright.dev/docs/evaluating - // https://github.com/microsoft/playwright/issues/13059 - // Get the handle to a specific function. - //Later on, call this function with some arguments. - // const msg = await getEditoVersionHandle.evaluate((post, args) => post); - // console.log(getEditoVersionHandle); + test('editor version', async ({ page }) => { + const pkgEditorVersion = temp.dependencies['@blocksuite/editor']; const editoVersion = await page.evaluate(() => window.__editoVersion); - // const documentEditorVersion = await page.inputValue('input#editor-version'); - const pkgEditorVersion = pkg.dependencies['@blocksuite/editor']; - expect(editoVersion).toBe(pkgEditorVersion); }); }); diff --git a/tests/contact-us.spec.ts b/tests/contact-us.spec.ts index 8a0a930565..c4fcfacb75 100644 --- a/tests/contact-us.spec.ts +++ b/tests/contact-us.spec.ts @@ -5,23 +5,6 @@ import { loadPage } from './libs/load-page.js'; loadPage(); test.describe('Open contact us', () => { - test.skip('Click about us', async ({ page }) => { - const currentWorkspace = page.getByTestId('current-workspace'); - await currentWorkspace.click(); - // await page.waitForTimeout(1000); - await page - .getByRole('tooltip', { - name: 'AFFiNE Log in to sync with affine About AFFiNE', - }) - .locator('div') - .filter({ hasText: 'About AFFiNE' }) - .nth(2) - .click(); - const contactUsModal = page.locator( - '[data-testid=contact-us-modal-content]' - ); - await expect(contactUsModal).toContainText('AFFiNE Community'); - }); test('Click right-bottom corner contact icon', async ({ page }) => { const faqIcon = page.locator('[data-testid=faq-icon]'); const box = await faqIcon.boundingBox(); From be27b30b015e11844a10754500e4ff4f3fbcb27c Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Fri, 10 Feb 2023 14:21:53 +0800 Subject: [PATCH 12/13] fix: rename token.ts to auth.ts to make it clear of usage --- .../data-center/src/provider/affine/affine.ts | 35 ++--- .../__tests__/{token.spec.ts => auth.spec.ts} | 8 +- .../affine/apis/{token.ts => auth.ts} | 134 +++++++++++------- .../src/provider/affine/apis/index.ts | 17 ++- .../src/provider/affine/apis/request.ts | 23 ++- .../src/provider/affine/apis/workspace.ts | 60 ++++---- .../src/provider/affine/channel.ts | 4 +- 7 files changed, 166 insertions(+), 115 deletions(-) rename packages/data-center/src/provider/affine/apis/__tests__/{token.spec.ts => auth.spec.ts} (79%) rename packages/data-center/src/provider/affine/apis/{token.ts => auth.ts} (58%) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index d3f1109505..0b28813ee3 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -51,22 +51,22 @@ export class AffineProvider extends BaseProvider { } override async init() { - this._apis.token.onChange(() => { - if (this._apis.token.isLogin) { + this._apis.auth.onChange(() => { + if (this._apis.auth.isLogin) { this._reconnectChannel(); } else { this._destroyChannel(); } }); - if (this._apis.token.isExpired && this._apis.token.refresh) { + if (this._apis.auth.isExpired && this._apis.auth.refresh) { // do we need to await the following? - this._apis.token.refreshToken(); + this._apis.auth.refreshToken(); } } private _reconnectChannel() { - if (this._refreshToken !== this._apis.token.refresh) { + if (this._refreshToken !== this._apis.auth.refresh) { // need to reconnect this._destroyChannel(); @@ -77,7 +77,7 @@ export class AffineProvider extends BaseProvider { this._logger, { params: { - token: this._apis.token.refresh, + token: this._apis.auth.refresh, }, } ); @@ -86,7 +86,7 @@ export class AffineProvider extends BaseProvider { this._handlerAffineListMessage(msg); }); - this._refreshToken = this._apis.token.refresh; + this._refreshToken = this._apis.auth.refresh; } } @@ -170,13 +170,13 @@ export class AffineProvider extends BaseProvider { window.location.protocol === 'https:' ? 'wss' : 'ws' }://${window.location.host}/api/sync/`; ws = new WebsocketProvider(wsUrl, room, doc, { - params: { token: this._apis.token.refresh }, + params: { token: this._apis.auth.refresh }, // @ts-expect-error ignore the type awareness: workspace.awarenessStore.awareness, }); workspace.awarenessStore.awareness.setLocalStateField('user', { - name: this._apis.token.user?.name ?? 'other', - id: Number(this._apis.token.user?.id ?? -1), + name: this._apis.auth.user?.name ?? 'other', + id: Number(this._apis.auth.user?.id ?? -1), color: '#ffa500', }); @@ -226,7 +226,7 @@ export class AffineProvider extends BaseProvider { } override async loadWorkspaces() { - if (!this._apis.token.isLogin) { + if (!this._apis.auth.isLogin) { return []; } const workspacesList = await this._apis.getWorkspaces(); @@ -255,9 +255,9 @@ export class AffineProvider extends BaseProvider { } override async auth() { - if (this._apis.token.isLogin) { - await this._apis.token.refreshToken(); - if (this._apis.token.isLogin && !this._apis.token.isExpired) { + if (this._apis.auth.isLogin) { + await this._apis.auth.refreshToken(); + if (this._apis.auth.isLogin && !this._apis.auth.isExpired) { // login success return; } @@ -272,7 +272,7 @@ export class AffineProvider extends BaseProvider { // TODO: may need to update related workspace attributes on user info change? public override async getUserInfo(): Promise { - const user = this._apis.token.user; + const user = this._apis.auth.user; return user ? { id: user.id, @@ -382,7 +382,7 @@ export class AffineProvider extends BaseProvider { } public override getToken(): string { - return this._apis.token.token; + return this._apis.auth.token; } public override async getUserByEmail( @@ -434,10 +434,11 @@ export class AffineProvider extends BaseProvider { } public override async logout(): Promise { - this._apis.token.clear(); + this._apis.auth.clear(); this._destroyChannel(); this._wsMap.forEach(ws => ws.disconnect()); this._workspaces.clear(false); + await this._apis.signOutFirebase(); } public override async getWorkspaceMembers(id: string) { diff --git a/packages/data-center/src/provider/affine/apis/__tests__/token.spec.ts b/packages/data-center/src/provider/affine/apis/__tests__/auth.spec.ts similarity index 79% rename from packages/data-center/src/provider/affine/apis/__tests__/token.spec.ts rename to packages/data-center/src/provider/affine/apis/__tests__/auth.spec.ts index 739bae9e91..72a271c12f 100644 --- a/packages/data-center/src/provider/affine/apis/__tests__/token.spec.ts +++ b/packages/data-center/src/provider/affine/apis/__tests__/auth.spec.ts @@ -1,10 +1,10 @@ import { test, expect } from '@playwright/test'; -import { Token } from '../token.js'; +import { Auth } from '../auth.js'; -test.describe('class Token', () => { +test.describe('class Auth', () => { test('parse tokens', () => { const tokenString = `eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzU2Nzk1MjAsImlkIjo2LCJuYW1lIjoidGVzdCIsImVtYWlsIjoidGVzdEBnbWFpbC5jb20iLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly90ZXN0LmNvbS9hdmF0YXIiLCJjcmVhdGVkX2F0IjoxNjc1Njc4OTIwMzU4fQ.R8GxrNhn3gNumtapthrP6_J5eQjXLV7i-LanSPqe7hw`; - expect(Token.parse(tokenString)).toEqual({ + expect(Auth.parseIdToken(tokenString)).toEqual({ avatar_url: 'https://test.com/avatar', created_at: 1675678920358, email: 'test@gmail.com', @@ -16,6 +16,6 @@ test.describe('class Token', () => { test('parse invalid tokens', () => { const tokenString = `eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.aaa.R8GxrNhn3gNumtapthrP6_J5eQjXLV7i-LanSPqe7hw`; - expect(Token.parse(tokenString)).toEqual(null); + expect(Auth.parseIdToken(tokenString)).toEqual(null); }); }); diff --git a/packages/data-center/src/provider/affine/apis/token.ts b/packages/data-center/src/provider/affine/apis/auth.ts similarity index 58% rename from packages/data-center/src/provider/affine/apis/token.ts rename to packages/data-center/src/provider/affine/apis/auth.ts index 5451ba1f96..cd79513f23 100644 --- a/packages/data-center/src/provider/affine/apis/token.ts +++ b/packages/data-center/src/provider/affine/apis/auth.ts @@ -1,5 +1,11 @@ import { initializeApp } from 'firebase/app'; -import { getAuth, GoogleAuthProvider, signInWithPopup } from 'firebase/auth'; +import { + type Auth as FirebaseAuth, + getAuth as getFirebaseAuth, + GoogleAuthProvider, + signInWithPopup, + signOut, +} from 'firebase/auth'; import type { User } from 'firebase/auth'; import { decode } from 'js-base64'; @@ -40,7 +46,7 @@ const AFFINE_LOGIN_STORAGE_KEY = 'affine:login'; const doLogin = (params: LoginParams): Promise => bareClient.post('api/user/token', { json: params }).json(); -export class Token { +export class Auth { private readonly _logger; private _accessToken = ''; // idtoken (JWT) private _refreshToken = ''; @@ -55,14 +61,10 @@ export class Token { this.restoreLogin(); } - get user() { - return this._user; - } - setLogin(login: LoginResponse) { this._accessToken = login.token; this._refreshToken = login.refresh; - this._user = Token.parse(this._accessToken); + this._user = Auth.parseIdToken(this._accessToken); this.triggerChange(this._user); this.storeLogin(); @@ -103,13 +105,22 @@ export class Token { type: 'Refresh', token: refreshToken || this._refreshToken, }); + this._padding.finally(() => { + // clear on settled + this._padding = undefined; + }); this._refreshToken = refreshToken || this._refreshToken; } const res = await this._padding; if (!refreshToken || refreshToken !== this._refreshToken) { this.setLogin(res); } - this._padding = undefined; + return true; + } + + get user() { + // computed through access token + return this._user; } get token() { @@ -130,7 +141,7 @@ export class Token { return Date.now() > this._user.exp * 1000; } - static parse(token: string): AccessTokenMessage | null { + static parseIdToken(token: string): AccessTokenMessage | null { try { return JSON.parse(decode(token.split('.')[1])); } catch (error) { @@ -166,55 +177,78 @@ export class Token { } } -export const token = new Token(); +export const auth = new Auth(); export const getAuthorizer = () => { - const app = initializeApp({ - apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY, - authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, - projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID, - storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET, - messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, - appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID, - measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID, - }); - try { - const firebaseAuth = getAuth(app); + let _firebaseAuth: FirebaseAuth | null = null; - const googleAuthProvider = new GoogleAuthProvider(); - - const getToken = async () => { - const currentUser = firebaseAuth.currentUser; - if (currentUser) { - await currentUser.getIdTokenResult(true); - if (!currentUser.isAnonymous) { - return currentUser.getIdToken(); - } + // getAuth will send requests on calling thus we can lazy init it + const getAuth = () => { + try { + if (!_firebaseAuth) { + const app = initializeApp({ + apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY, + authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, + projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID, + storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET, + messagingSenderId: + process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, + appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID, + measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID, + }); + _firebaseAuth = getFirebaseAuth(app); } - return; - }; + return _firebaseAuth; + } catch (error) { + getLogger('getAuthorizer')(error); + console.error('getAuthorizer', error); + return null; + } + }; - const signInWithGoogle = async () => { - const idToken = await getToken(); - let loginUser: AccessTokenMessage | null = null; - if (idToken) { - loginUser = await token.initToken(idToken); - } else { + const getToken = async () => { + const currentUser = getAuth()?.currentUser; + if (currentUser) { + await currentUser.getIdTokenResult(true); + if (!currentUser.isAnonymous) { + return currentUser.getIdToken(); + } + } + return; + }; + + const signInWithGoogle = async () => { + const idToken = await getToken(); + let loginUser: AccessTokenMessage | null = null; + if (idToken) { + loginUser = await auth.initToken(idToken); + } else { + const firebaseAuth = getAuth(); + if (firebaseAuth) { + const googleAuthProvider = new GoogleAuthProvider(); + // make sure the user has a chance to select an account + // https://developers.google.com/identity/openid-connect/openid-connect#prompt + googleAuthProvider.setCustomParameters({ + prompt: 'select_account', + }); const user = await signInWithPopup(firebaseAuth, googleAuthProvider); const idToken = await user.user.getIdToken(); - loginUser = await token.initToken(idToken); + loginUser = await auth.initToken(idToken); } - return loginUser; - }; + } + return loginUser; + }; - const onAuthStateChanged = (callback: (user: User | null) => void) => { - firebaseAuth.onAuthStateChanged(callback); - }; + const onAuthStateChanged = (callback: (user: User | null) => void) => { + getAuth()?.onAuthStateChanged(callback); + }; - return [signInWithGoogle, onAuthStateChanged] as const; - } catch (e) { - getLogger('getAuthorizer')(e); - console.error('getAuthorizer', e); - return [] as const; - } + const signOutFirebase = async () => { + const firebaseAuth = getAuth(); + if (firebaseAuth?.currentUser) { + await signOut(firebaseAuth); + } + }; + + return [signInWithGoogle, onAuthStateChanged, signOutFirebase] as const; }; diff --git a/packages/data-center/src/provider/affine/apis/index.ts b/packages/data-center/src/provider/affine/apis/index.ts index 27eebb5131..d96fc07c57 100644 --- a/packages/data-center/src/provider/affine/apis/index.ts +++ b/packages/data-center/src/provider/affine/apis/index.ts @@ -1,10 +1,10 @@ // export { token } from './token.js'; -export type { Callback } from './token.js'; +export type { Callback } from './auth.js'; -import { getAuthorizer } from './token.js'; +import { getAuthorizer } from './auth.js'; import * as user from './user.js'; import * as workspace from './workspace.js'; -import { token } from './token.js'; +import { auth } from './auth.js'; // See https://twitter.com/mattpocockuk/status/1622730173446557697 // TODO: move to ts utils? @@ -18,20 +18,23 @@ export type Apis = Prettify< Omit & { signInWithGoogle: ReturnType[0]; onAuthStateChanged: ReturnType[1]; - } & { token: typeof token } + signOutFirebase: ReturnType[2]; + } & { auth: typeof auth } >; export const getApis = (): Apis => { - const [signInWithGoogle, onAuthStateChanged] = getAuthorizer(); + const [signInWithGoogle, onAuthStateChanged, signOutFirebase] = + getAuthorizer(); return { ...user, ...workspace, signInWithGoogle, + signOutFirebase, onAuthStateChanged, - token, + auth, }; }; -export type { AccessTokenMessage } from './token'; +export type { AccessTokenMessage } from './auth'; export type { Member, Workspace, WorkspaceDetail } from './workspace'; export { WorkspaceType } from './workspace.js'; diff --git a/packages/data-center/src/provider/affine/apis/request.ts b/packages/data-center/src/provider/affine/apis/request.ts index 29f90e19df..b0a7584681 100644 --- a/packages/data-center/src/provider/affine/apis/request.ts +++ b/packages/data-center/src/provider/affine/apis/request.ts @@ -1,6 +1,6 @@ import ky from 'ky-universal'; import { MessageCenter } from '../../../message/index.js'; -import { token } from './token.js'; +import { auth } from './auth.js'; type KyInstance = typeof ky; @@ -28,13 +28,23 @@ export const bareClient: KyInstance = ky.extend({ }, }); +const refreshTokenIfExpired = async () => { + if (auth.isLogin && auth.isExpired) { + try { + await auth.refreshToken(); + } catch (err) { + return new Response('Unauthorized', { status: 401 }); + } + } +}; + export const client: KyInstance = bareClient.extend({ hooks: { beforeRequest: [ async request => { - if (token.isLogin) { - if (token.isExpired) await token.refreshToken(); - request.headers.set('Authorization', token.token); + if (auth.isLogin) { + await refreshTokenIfExpired(); + request.headers.set('Authorization', auth.token); } else { return new Response('Unauthorized', { status: 401 }); } @@ -43,9 +53,8 @@ export const client: KyInstance = bareClient.extend({ beforeRetry: [ async ({ request }) => { - console.log('beforeRetry'); - await token.refreshToken(); - request.headers.set('Authorization', token.token); + await refreshTokenIfExpired(); + request.headers.set('Authorization', auth.token); }, ], diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 584db159fe..c12fed6e66 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -41,7 +41,7 @@ export interface Workspace { export async function getWorkspaces(): Promise { try { - return client + return await client .get('api/workspace', { headers: { 'Cache-Control': 'no-cache', @@ -63,8 +63,7 @@ export async function getWorkspaceDetail( params: GetWorkspaceDetailParams ): Promise { try { - const response = client.get(`api/workspace/${params.id}`); - return response.json(); + return await client.get(`api/workspace/${params.id}`).json(); } catch (error) { sendMessage(messageCode.getDetailFailed); throw new RequestError('get detail failed', error); @@ -100,7 +99,7 @@ export async function getWorkspaceMembers( params: GetWorkspaceDetailParams ): Promise { try { - return client.get(`api/workspace/${params.id}/permission`).json(); + return await client.get(`api/workspace/${params.id}/permission`).json(); } catch (error) { sendMessage(messageCode.getMembersFailed); throw new RequestError('get members failed', error); @@ -115,7 +114,7 @@ export async function createWorkspace( encodedYDoc: Blob ): Promise<{ id: string }> { try { - return client.post('api/workspace', { body: encodedYDoc }).json(); + return await client.post('api/workspace', { body: encodedYDoc }).json(); } catch (error) { sendMessage(messageCode.createWorkspaceFailed); throw new RequestError('create workspace failed', error); @@ -131,7 +130,7 @@ export async function updateWorkspace( params: UpdateWorkspaceParams ): Promise<{ public: boolean | null }> { try { - return client + return await client .post(`api/workspace/${params.id}`, { json: { public: params.public, @@ -151,10 +150,12 @@ export interface DeleteWorkspaceParams { export async function deleteWorkspace( params: DeleteWorkspaceParams ): Promise { - await client.delete(`api/workspace/${params.id}`).catch(error => { + try { + await client.delete(`api/workspace/${params.id}`); + } catch (error) { sendMessage(messageCode.deleteWorkspaceFailed); throw new RequestError('delete workspace failed', error); - }); + } } export interface InviteMemberParams { @@ -167,13 +168,11 @@ export interface InviteMemberParams { */ export async function inviteMember(params: InviteMemberParams): Promise { try { - return client - .post(`api/workspace/${params.id}/permission`, { - json: { - email: params.email, - }, - }) - .json(); + await client.post(`api/workspace/${params.id}/permission`, { + json: { + email: params.email, + }, + }); } catch (error) { sendMessage(messageCode.inviteMemberFailed); throw new RequestError('invite member failed', error); @@ -185,10 +184,12 @@ export interface RemoveMemberParams { } export async function removeMember(params: RemoveMemberParams): Promise { - await client.delete(`api/permission/${params.permissionId}`).catch(error => { + try { + await client.delete(`api/permission/${params.permissionId}`); + } catch (error) { sendMessage(messageCode.removeMemberFailed); throw new RequestError('remove member failed', error); - }); + } } export interface AcceptInvitingParams { @@ -199,7 +200,9 @@ export async function acceptInviting( params: AcceptInvitingParams ): Promise { try { - return bareClient.post(`api/invitation/${params.invitingCode}`).json(); + return await bareClient + .post(`api/invitation/${params.invitingCode}`) + .json(); } catch (error) { sendMessage(messageCode.acceptInvitingFailed); throw new RequestError('accept inviting failed', error); @@ -214,7 +217,7 @@ export async function getBlob(params: { blobId: string; }): Promise { try { - return client.get(`api/blob/${params.blobId}`).arrayBuffer(); + return await client.get(`api/blob/${params.blobId}`).arrayBuffer(); } catch (error) { sendMessage(messageCode.getBlobFailed); throw new RequestError('get blob failed', error); @@ -226,13 +229,12 @@ export interface LeaveWorkspaceParams { } export async function leaveWorkspace({ id }: LeaveWorkspaceParams) { - await client - .delete(`api/workspace/${id}/permission`) - .json() - .catch(error => { - sendMessage(messageCode.leaveWorkspaceFailed); - throw new RequestError('leave workspace failed', error); - }); + try { + await client.delete(`api/workspace/${id}/permission`); + } catch (error) { + sendMessage(messageCode.leaveWorkspaceFailed); + throw new RequestError('leave workspace failed', error); + } } export async function downloadWorkspace( @@ -241,9 +243,11 @@ export async function downloadWorkspace( ): Promise { try { if (published) { - return bareClient.get(`api/public/doc/${workspaceId}`).arrayBuffer(); + return await bareClient + .get(`api/public/doc/${workspaceId}`) + .arrayBuffer(); } - return client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); + return await client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); } catch (error) { sendMessage(messageCode.downloadWorkspaceFailed); throw new RequestError('download workspace failed', error); diff --git a/packages/data-center/src/provider/affine/channel.ts b/packages/data-center/src/provider/affine/channel.ts index da9e81c35e..ce19a35acf 100644 --- a/packages/data-center/src/provider/affine/channel.ts +++ b/packages/data-center/src/provider/affine/channel.ts @@ -1,6 +1,6 @@ import * as websocket from 'lib0/websocket'; import { Logger } from 'src/types'; -import { token } from './apis/token'; +import { auth } from './apis/auth'; import * as url from 'lib0/url'; const RECONNECT_INTERVAL_TIME = 500; @@ -40,7 +40,7 @@ export class WebsocketClient extends websocket.WebsocketClient { this.on('disconnect', ({ error }: { error: Error }) => { if (error) { // Try reconnect if connect error has occurred - if (this.shouldReconnect && token.isLogin && !this.connected) { + if (this.shouldReconnect && auth.isLogin && !this.connected) { try { setTimeout(() => { if (this._retryTimes <= MAX_RECONNECT_TIMES) { From 6057c5637c9659a8848c853eabadea857f648b4a Mon Sep 17 00:00:00 2001 From: Himself65 Date: Fri, 10 Feb 2023 01:14:10 -0600 Subject: [PATCH 13/13] feat(component): enhance storybook preview (#943) --- packages/component/.storybook/preview.js | 14 ++++++ .../src/stories/Breadcrumbs.stories.tsx | 24 ++++++---- .../component/src/stories/Button.stories.tsx | 46 +++++++++++++++---- 3 files changed, 65 insertions(+), 19 deletions(-) diff --git a/packages/component/.storybook/preview.js b/packages/component/.storybook/preview.js index d3914580a7..e574a19ca1 100644 --- a/packages/component/.storybook/preview.js +++ b/packages/component/.storybook/preview.js @@ -1,3 +1,5 @@ +import { getLightTheme, ThemeProvider } from '../src'; + export const parameters = { actions: { argTypesRegex: '^on[A-Z].*' }, controls: { @@ -7,3 +9,15 @@ export const parameters = { }, }, }; + +const lightTheme = getLightTheme('page'); + +export const decorators = [ + Story => { + return ( + + + + ); + }, +]; diff --git a/packages/component/src/stories/Breadcrumbs.stories.tsx b/packages/component/src/stories/Breadcrumbs.stories.tsx index 38334b1793..6cc0ba07d4 100644 --- a/packages/component/src/stories/Breadcrumbs.stories.tsx +++ b/packages/component/src/stories/Breadcrumbs.stories.tsx @@ -1,19 +1,25 @@ -import React, { useMemo } from 'react'; +/* deepscan-disable USELESS_ARROW_FUNC_BIND */ +import React from 'react'; import { Meta, Story } from '@storybook/react'; -import { Breadcrumbs, getLightTheme, ThemeProvider } from '..'; +import { Breadcrumbs } from '..'; +import { Link, Typography } from '@mui/material'; export default { title: 'AFFiNE/Breadcrumbs', component: Breadcrumbs, } as Meta; -const Template: Story = args => ( - getLightTheme('page'), [])}> - - -); +const Template: Story = args => ; -export const Primary = Template.bind({}); +export const Primary = Template.bind(undefined); Primary.args = { - children: [1, 2, 3], + children: [ + + AFFiNE + , + + Docs + , + Introduction, + ], }; diff --git a/packages/component/src/stories/Button.stories.tsx b/packages/component/src/stories/Button.stories.tsx index 9fc32156e1..7030f37128 100644 --- a/packages/component/src/stories/Button.stories.tsx +++ b/packages/component/src/stories/Button.stories.tsx @@ -1,20 +1,46 @@ -import React, { useMemo } from 'react'; +/* deepscan-disable USELESS_ARROW_FUNC_BIND */ +import React from 'react'; import { Meta, Story } from '@storybook/react'; -import { Button, getLightTheme, ThemeProvider } from '..'; +import { Button } from '..'; +import { ButtonProps } from '../ui/button/interface'; export default { title: 'AFFiNE/Button', component: Button, -} as Meta; + argTypes: { + hoverBackground: { control: 'color' }, + hoverColor: { control: 'color' }, + }, +} as Meta; -const Template: Story = args => ( - getLightTheme('page'), [])}> -