From c90d511251eda6097f1258f85f9bb52722451502 Mon Sep 17 00:00:00 2001 From: Cats Juice Date: Thu, 17 Jul 2025 17:21:51 +0800 Subject: [PATCH] feat(core): server version check for selfhost login (#13247) close AF-2752; ## Summary by CodeRabbit * **New Features** * Added a version compatibility check for self-hosted environments during sign-in, displaying a clear error message and upgrade instructions if the server version is outdated. * **Style** * Updated the appearance of the notification icon in the mobile header for improved visual consistency. --- packages/frontend/core/package.json | 2 + .../use-selfhost-login-version-guard.tsx | 57 +++++++++++++++++++ .../core/src/components/sign-in/sign-in.tsx | 16 ++++++ .../src/mobile/views/home-header/index.tsx | 9 ++- yarn.lock | 4 +- 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 packages/frontend/core/src/components/hooks/affine/use-selfhost-login-version-guard.tsx diff --git a/packages/frontend/core/package.json b/packages/frontend/core/package.json index e49f8fff8e..7c490455ae 100644 --- a/packages/frontend/core/package.json +++ b/packages/frontend/core/package.json @@ -83,6 +83,7 @@ "react-transition-state": "^2.2.0", "react-virtuoso": "^4.12.3", "rxjs": "^7.8.1", + "semver": "^7.7.2", "ses": "^1.10.0", "shiki": "^3.7.0", "socket.io-client": "^4.8.1", @@ -100,6 +101,7 @@ "@types/bytes": "^3.1.5", "@types/image-blob-reduce": "^4.1.4", "@types/lodash-es": "^4.17.12", + "@types/semver": "^7", "@vanilla-extract/css": "^1.17.0", "fake-indexeddb": "^6.0.0", "lodash-es": "^4.17.21", diff --git a/packages/frontend/core/src/components/hooks/affine/use-selfhost-login-version-guard.tsx b/packages/frontend/core/src/components/hooks/affine/use-selfhost-login-version-guard.tsx new file mode 100644 index 0000000000..03deadf703 --- /dev/null +++ b/packages/frontend/core/src/components/hooks/affine/use-selfhost-login-version-guard.tsx @@ -0,0 +1,57 @@ +import type { Server } from '@affine/core/modules/cloud'; +import { useLiveData } from '@toeverything/infra'; +import { cssVarV2 } from '@toeverything/theme/v2'; +import semver from 'semver'; + +const rules = [ + { + min: '0.23.0', + tip: (receivedVersion: string, requiredVersion: string) => ( +
+

+ Your server version{' '} + {receivedVersion} is not compatible + with current client. Please upgrade your server to{' '} + {requiredVersion} or higher to use + this client. +

+
+ Instructions: +
+ + https://docs.affine.pro/self-host-affine/install/upgrade + +
+
+ ), + }, +]; + +/** + * Return the error tip if the server version is not meet the requirement + */ +export const useSelfhostLoginVersionGuard = (server: Server) => { + const serverVersion = + useLiveData(server.config$.selector(c => c.version)) ?? '0.0.0'; + + for (const rule of rules) { + if (semver.lt(serverVersion, rule.min)) { + return rule.tip(serverVersion, rule.min); + } + } + + return null; +}; diff --git a/packages/frontend/core/src/components/sign-in/sign-in.tsx b/packages/frontend/core/src/components/sign-in/sign-in.tsx index 09126c08c5..e9bf6d7c86 100644 --- a/packages/frontend/core/src/components/sign-in/sign-in.tsx +++ b/packages/frontend/core/src/components/sign-in/sign-in.tsx @@ -27,6 +27,7 @@ import { useState, } from 'react'; +import { useSelfhostLoginVersionGuard } from '../hooks/affine/use-selfhost-login-version-guard'; import type { SignInState } from '.'; import { Back } from './back'; import * as style from './style.css'; @@ -54,6 +55,7 @@ export const SignInStep = ({ const serverName = useLiveData( serverService.server.config$.selector(c => c.serverName) ); + const versionError = useSelfhostLoginVersionGuard(serverService.server); const isSelfhosted = useLiveData( serverService.server.config$.selector( c => c.type === ServerDeploymentType.Selfhosted @@ -125,6 +127,20 @@ export const SignInStep = ({ })); }, [changeState]); + if (versionError && isSelfhosted) { + return ( + + + +
{versionError}
+
+
+ ); + } + return ( { ref={floatWorkspaceCardRef} /> }> -
+
{notificationCount > 0 && (