components/ 拆为三层:
- providers/ — 状态管理(App/Theme/SettingsProvider)
- shell/ — 应用外壳(Layout/NavBar/PageDispatcher)
- ui/ — 通用 UI 原子(FloatingPanel/LegalTextModal)
pages/ 重命名 + 重组:
- headers/ → panels/ NavBar 触发的面板页
- login/ → auth/ 认证模块(含注册/忘记密码)
- settings/blocks/ → sections/
- home/components/ → panels/ features/ controls/ hooks/
按职责分:panels(布局壳) + features(功能面板) + controls(表单控件) + hooks
其他清理:
- 删除空占位 Test3.tsx
- HomeContext 从 HomeContent 拆出独立文件
- uploadValidation 内联到 ImageInput
- 修复过时注释(useUI → controls)
141 lines
3.7 KiB
TypeScript
141 lines
3.7 KiB
TypeScript
// ============================================================
|
||
// SettingsProvider — 设置项集中状态管理 Context + Provider + Hook
|
||
//
|
||
// 职责:
|
||
// - 存储路径的集中管理(read/write/clear)
|
||
// - 持久化到 localStorage,遵循 ele-heixiu-* 键名规范
|
||
// - 全局组件通过 useSettings() 消费
|
||
// ============================================================
|
||
|
||
import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
|
||
|
||
// ---------- localStorage 键 ----------
|
||
|
||
const OUTPUT_PATH_KEY = 'ele-heixiu-output-path';
|
||
const TEAM_REPO_PATH_KEY = 'ele-heixiu-team-repo-path';
|
||
|
||
// ---------- Context 类型 ----------
|
||
|
||
export interface SettingsContextValue {
|
||
/** 大模型产物存储仓库路径 */
|
||
outputPath: string;
|
||
/** 团队创作存储仓库路径(企业版) */
|
||
teamRepoPath: string;
|
||
/** 设置产物输出路径 */
|
||
setOutputPath: (path: string) => void;
|
||
/** 设置团队创作仓库路径 */
|
||
setTeamRepoPath: (path: string) => void;
|
||
/** 清除产物输出路径 */
|
||
clearOutputPath: () => void;
|
||
/** 清除团队创作仓库路径 */
|
||
clearTeamRepoPath: () => void;
|
||
}
|
||
|
||
export const SettingsContext = createContext<SettingsContextValue | null>(null);
|
||
|
||
// ---------- 工具函数(localStorage 读写)----------
|
||
|
||
export function readStoredOutputPath(): string {
|
||
try {
|
||
return localStorage.getItem(OUTPUT_PATH_KEY) || '';
|
||
} catch {
|
||
return '';
|
||
}
|
||
}
|
||
|
||
export function writeStoredOutputPath(path: string): void {
|
||
try {
|
||
localStorage.setItem(OUTPUT_PATH_KEY, path);
|
||
} catch {
|
||
/* 静默忽略 */
|
||
}
|
||
}
|
||
|
||
export function clearStoredOutputPath(): void {
|
||
try {
|
||
localStorage.removeItem(OUTPUT_PATH_KEY);
|
||
} catch {
|
||
/* 静默忽略 */
|
||
}
|
||
}
|
||
|
||
export function readStoredTeamRepoPath(): string {
|
||
try {
|
||
return localStorage.getItem(TEAM_REPO_PATH_KEY) || '';
|
||
} catch {
|
||
return '';
|
||
}
|
||
}
|
||
|
||
export function writeStoredTeamRepoPath(path: string): void {
|
||
try {
|
||
localStorage.setItem(TEAM_REPO_PATH_KEY, path);
|
||
} catch {
|
||
/* 静默忽略 */
|
||
}
|
||
}
|
||
|
||
export function clearStoredTeamRepoPath(): void {
|
||
try {
|
||
localStorage.removeItem(TEAM_REPO_PATH_KEY);
|
||
} catch {
|
||
/* 静默忽略 */
|
||
}
|
||
}
|
||
|
||
// ---------- Consumer Hook ----------
|
||
|
||
export function useSettings(): SettingsContextValue {
|
||
const ctx = useContext(SettingsContext);
|
||
if (!ctx) {
|
||
throw new Error('useSettings() 必须在 <SettingsProvider> 内部调用');
|
||
}
|
||
return ctx;
|
||
}
|
||
|
||
// ---------- Provider 组件 ----------
|
||
|
||
interface SettingsProviderProps {
|
||
children: ReactNode;
|
||
}
|
||
|
||
export function SettingsProvider({ children }: SettingsProviderProps) {
|
||
const [outputPath, setOutputPathState] = useState<string>(readStoredOutputPath);
|
||
const [teamRepoPath, setTeamRepoPathState] = useState<string>(readStoredTeamRepoPath);
|
||
|
||
// ---------- outputPath ----------
|
||
|
||
const setOutputPath = useCallback((path: string) => {
|
||
setOutputPathState(path);
|
||
writeStoredOutputPath(path);
|
||
}, []);
|
||
|
||
const clearOutputPath = useCallback(() => {
|
||
setOutputPathState('');
|
||
clearStoredOutputPath();
|
||
}, []);
|
||
|
||
// ---------- teamRepoPath ----------
|
||
|
||
const setTeamRepoPath = useCallback((path: string) => {
|
||
setTeamRepoPathState(path);
|
||
writeStoredTeamRepoPath(path);
|
||
}, []);
|
||
|
||
const clearTeamRepoPath = useCallback(() => {
|
||
setTeamRepoPathState('');
|
||
clearStoredTeamRepoPath();
|
||
}, []);
|
||
|
||
const value: SettingsContextValue = {
|
||
outputPath,
|
||
teamRepoPath,
|
||
setOutputPath,
|
||
setTeamRepoPath,
|
||
clearOutputPath,
|
||
clearTeamRepoPath,
|
||
};
|
||
|
||
return <SettingsContext.Provider value={value}>{children}</SettingsContext.Provider>;
|
||
}
|