refactor: Context 与 Provider 合并 — 消除 contexts/ 目录,一文件一状态单元

- ThemeContext + useTheme → ThemeProvider.tsx(原 hooks/use-theme.ts 删除)
- AppContext + useAppContext → AppProvider.tsx(原 contexts/app-context.ts 删除)
- SettingsContext + useSettings → SettingsProvider.tsx(原 contexts/settings-context.ts 删除)
- HomeContext + useHomeContext → HomeContent.tsx(原 contexts/home-context.ts 删除)
- 删除空的 contexts/ 目录,20+ 导入路径同步更新
- TypeScript 编译通过(npx tsc --noEmit 零错误)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 14:02:48 +08:00
parent eb12248a62
commit 53df926973
25 changed files with 248 additions and 291 deletions

View File

@@ -1,13 +1,12 @@
// ============================================================
// HomeContent — 首页三列正文布局 + HomeProvider
// HomeContent — 首页三列正文布局 + HomeProviderContext + Provider + Hook
// 可拖拽调整三栏宽度,所有数据请求在登录后发送
// ============================================================
import { useState, useCallback, useRef, useEffect, useMemo } from 'react';
import { createContext, useContext, useState, useCallback, useRef, useEffect, useMemo } from 'react';
import { theme as antTheme, Empty } from 'antd';
import { HomeContext } from '@/contexts/home-context';
import { useAppContext } from '@/contexts/app-context';
import { useAppContext } from '@/components/AppProvider';
import type { ModelsListResponseBody, TaskInfoItemResponseBody } from '@/services/modules';
import { LeftPanel } from './components/LeftPanel';
import { CenterPanel } from './components/CenterPanel';
@@ -17,6 +16,38 @@ import { Typography } from 'antd';
const { Text } = Typography;
// ---------- Context 类型 ----------
export interface HomeContextValue {
/** 当前选中的模型 */
selectedModel: ModelsListResponseBody | null;
setSelectedModel: (model: ModelsListResponseBody | null) => void;
/** 任务记录分页 — 当前页码 */
taskPage: number;
/** 任务记录分页 — 每页条数 */
taskPageSize: number;
setTaskPage: (page: number) => void;
setTaskPageSize: (size: number) => void;
/** 当前选中的任务记录(用于右侧预览) */
selectedTask: TaskInfoItemResponseBody | null;
setSelectedTask: (task: TaskInfoItemResponseBody | null) => void;
/** 侧边栏折叠状态 */
isLeftCollapsed: boolean;
toggleLeftCollapsed: () => void;
}
export const HomeContext = createContext<HomeContextValue | null>(null);
// ---------- Consumer Hook ----------
export function useHomeContext(): HomeContextValue {
const ctx = useContext(HomeContext);
if (!ctx) {
throw new Error('useHomeContext() 必须在 <HomeContent> 内部调用');
}
return ctx;
}
// ---------- 常量 ----------
/** 左列最小/默认宽度 */

View File

@@ -25,8 +25,8 @@ import {
} from '@ant-design/icons';
import type { UploadFile } from 'antd/es/upload';
import { useHomeContext } from '@/contexts/home-context';
import { useAppContext } from '@/contexts/app-context';
import { useHomeContext } from '@/pages/home/HomeContent';
import { useAppContext } from '@/components/AppProvider';
import { useSubmitTask } from '@/hooks/use-api';
import { emit, EVENTS } from '@/utils/event-bus';
import type { ModelsListResponseBody, TaskInfoItemResponseBody } from '@/services/modules';

View File

@@ -8,7 +8,7 @@ import { Tabs, Spin, Empty, Tag, Typography, Button, Result, message, theme as a
import { AppstoreOutlined } from '@ant-design/icons';
import { useModelList } from '@/hooks/use-api';
import { useHomeContext } from '@/contexts/home-context';
import { useHomeContext } from '@/pages/home/HomeContent';
import { resolveCategoryLabel, MODEL_CATEGORIES } from '@/services/modules';
import type { ModelsListResponseBody, ModelCategoryStringEnum } from '@/services/modules';

View File

@@ -11,7 +11,7 @@ import {
CloseCircleOutlined,
} from '@ant-design/icons';
import { useHomeContext } from '@/contexts/home-context';
import { useHomeContext } from '@/pages/home/HomeContent';
import { useTaskDetail } from '@/hooks/use-api';
import type { TaskStatusString } from '@/services/modules';

View File

@@ -18,9 +18,9 @@ import type { FilterValue, SorterResult } from 'antd/es/table/interface';
import { HistoryOutlined, SearchOutlined, SettingOutlined } from '@ant-design/icons';
import { useTaskList, useModelList } from '@/hooks/use-api';
import { useAppContext } from '@/contexts/app-context';
import { useHomeContext } from '@/contexts/home-context';
import { useTheme } from '@/hooks/use-theme';
import { useAppContext } from '@/components/AppProvider';
import { useHomeContext } from '@/pages/home/HomeContent';
import { useTheme } from '@/components/ThemeProvider';
import { on, off, EVENTS } from '@/utils/event-bus';
import type {
TaskInfoItemResponseBody,

View File

@@ -12,7 +12,7 @@ import { useState, useCallback } from 'react';
import { Modal, Input, Button, Typography, App } from 'antd';
import { LockOutlined, KeyOutlined, SafetyOutlined } from '@ant-design/icons';
import { useTheme } from '@/hooks/use-theme.ts';
import { useTheme } from '@/components/ThemeProvider';
import { AuthAPI } from '@/services/modules';
import { validatePassword, validateConfirmPassword } from '../config/validators';

View File

@@ -18,7 +18,7 @@ import {
KeyOutlined,
} from '@ant-design/icons';
import { useTheme } from '@/hooks/use-theme.ts';
import { useTheme } from '@/components/ThemeProvider';
import { AuthAPI } from '@/services/modules';
import {
validatePhone,

View File

@@ -10,8 +10,8 @@
import { useState, useCallback } from 'react';
import { Modal, Tabs, Typography, App } from 'antd';
import { useAppContext } from '@/contexts/app-context.ts';
import { useTheme } from '@/hooks/use-theme.ts';
import { useAppContext } from '@/components/AppProvider';
import { useTheme } from '@/components/ThemeProvider';
import { LoginForm } from './components/LoginForm';
import { RegisterForm } from './components/RegisterForm';
import { ForgotPasswordModal } from './components/ForgotPasswordModal';

View File

@@ -14,7 +14,7 @@
import { useCallback } from 'react';
import { Modal } from 'antd';
import { SettingOutlined, CloseOutlined } from '@ant-design/icons';
import { useAppContext } from '@/contexts/app-context';
import { useAppContext } from '@/components/AppProvider';
import { isMacOS } from '@/utils/platform';
import { ThemeSetting } from './blocks/ThemeSetting';
import { StoragePathSetting } from './blocks/StoragePathSetting';

View File

@@ -9,7 +9,7 @@ import { useState, useCallback } from 'react';
import { Card, Button, Input, Typography, Space, App } from 'antd';
import { FolderOpenOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons';
import type { Edition } from '@shared/types';
import { useSettings } from '@/contexts/settings-context';
import { useSettings } from '@/components/SettingsProvider';
import { hasIpc, safeIpcInvoke } from '@/utils/ipc';
import { BIDIRECTIONAL } from '@shared/constants/ipc-channels';

View File

@@ -9,7 +9,7 @@ import {
InfoCircleOutlined,
EnvironmentOutlined,
} from '@ant-design/icons';
import { useAppContext } from '@/contexts/app-context';
import { useAppContext } from '@/components/AppProvider';
import { getPlatformName } from '@/utils/platform';
import { APP_VERSION } from '@shared/constants/version';
import { getEditionName } from '@shared/constants/app';

View File

@@ -4,7 +4,7 @@
import { Card, Segmented, Typography } from 'antd';
import { BulbOutlined, BulbFilled } from '@ant-design/icons';
import { useTheme } from '@/hooks/use-theme';
import { useTheme } from '@/components/ThemeProvider';
const { Text } = Typography;