重构客户端登录页并更新品牌图标

This commit is contained in:
baiyanyun
2026-06-30 15:09:46 +08:00
parent 44fe160880
commit 5d87c9eee7
16 changed files with 607 additions and 155 deletions

View File

@@ -39,6 +39,7 @@ import {
syncConfigToServer,
normalizeServerHost,
loginAndRegister,
isLoggedIn as checkIsLoggedIn,
} from "./services/core/auth";
import {
APP_DISPLAY_NAME,
@@ -49,6 +50,7 @@ import type { QuickInitConfig } from "@shared/types/quickInit";
import type { UpdateState } from "@shared/types/updateTypes";
import { t, getCurrentLang } from "./services/core/i18n";
import SetupWizard from "./components/setup/SetupWizard";
import LoginPage from "./components/setup/LoginPage";
import SetupDependencies from "./components/setup/SetupDependencies";
import ClientPage from "./components/pages/ClientPage";
import SettingsPage from "./components/pages/SettingsPage";
@@ -187,6 +189,9 @@ function App() {
// 初始化向导状态
// ============================================
const [isSetupComplete, setIsSetupComplete] = useState<boolean | null>(null);
const [isLoggedIn, setIsLoggedIn] = useState<boolean | null>(null);
const [loginStep1Config, setLoginStep1Config] =
useState<Step1Config>(DEFAULT_STEP1_CONFIG);
const setupJustCompleted = useRef(false);
// 内存变量:标记服务是否由登录流程启动(不持久化)
const loginStartedRef = useRef(false);
@@ -392,6 +397,10 @@ function App() {
const checkSetup = async () => {
try {
const completed = await setupService.isSetupCompleted();
const step1 = await setupService.getStep1Config();
setLoginStep1Config(step1);
const loggedIn = await checkIsLoggedIn();
setIsLoggedIn(loggedIn);
// 每次启动优先读取 quick init 配置
if (completed) {
@@ -411,6 +420,7 @@ function App() {
} catch (error) {
log.error("Failed to check setup status:", error);
setIsSetupComplete(true);
setIsLoggedIn(false);
}
};
checkSetup();
@@ -445,6 +455,8 @@ function App() {
// ============================================
const handleAuthChange = useCallback(async () => {
const user = await authService.getAuthUser();
const loggedIn = await checkIsLoggedIn();
setIsLoggedIn(loggedIn);
if (user) {
setUsername(
user.displayName || user.username || t("Claw.App.defaultUsername"),
@@ -459,6 +471,29 @@ function App() {
loginStartedRef.current = true;
}, []);
const ensureDefaultLoginConfig = useCallback(async () => {
const currentConfig = await setupService.getStep1Config();
const nextConfig: Step1Config = {
...DEFAULT_STEP1_CONFIG,
...currentConfig,
serverHost: currentConfig.serverHost || DEFAULT_STEP1_CONFIG.serverHost,
workspaceDir:
currentConfig.workspaceDir || DEFAULT_STEP1_CONFIG.workspaceDir,
};
await setupService.saveStep1Config(nextConfig);
setLoginStep1Config(nextConfig);
return nextConfig;
}, []);
const handleFullscreenLoginSuccess = useCallback(async () => {
await setupService.completeStep2();
await setupService.completeSetup();
setupJustCompleted.current = true;
setIsSetupComplete(true);
await handleAuthChange();
setAuthRefreshTrigger((v) => v + 1);
}, [handleAuthChange]);
// ============================================
// 主界面下必需依赖检查:仅当存在「未安装」或「错误」时进入依赖安装
// 版本以当前真实安装为准outdated 不触发(用户可在依赖 Tab 手动升级)
@@ -1106,7 +1141,8 @@ function App() {
// ============================================
if (
isSetupComplete === null ||
(isSetupComplete && needsRequiredDepsReinstall === null)
isLoggedIn === null ||
(isLoggedIn && isSetupComplete && needsRequiredDepsReinstall === null)
) {
return (
<I18nContext.Provider value={i18nContextValue}>
@@ -1120,6 +1156,20 @@ function App() {
);
}
if (!isLoggedIn) {
return (
<I18nContext.Provider value={i18nContextValue}>
<ConfigProvider theme={currentTheme}>
<LoginPage
step1Config={loginStep1Config}
onLoginStart={ensureDefaultLoginConfig}
onLoginSuccess={handleFullscreenLoginSuccess}
/>
</ConfigProvider>
</I18nContext.Provider>
);
}
// ============================================
// 渲染:初始化向导
// ============================================