refactor: 代码清理 — 删除 AppError、重命名 replacePaths、修正 detectExportFormat、统一 PATH 长度、优化 BOM 检查、添加同步注释

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 22:14:13 +08:00
parent 613fb51fd7
commit 1ce3ebfd9e
10 changed files with 35 additions and 65 deletions
+3 -3
View File
@@ -12,8 +12,8 @@
"dir": ""
},
"path": {
"maxSystemLength": 2048,
"maxUserLength": 2048,
"maxCombinedLength": 8191
"maxSystemLength": 32767,
"maxUserLength": 32767,
"maxCombinedLength": 32767
}
}
+12 -9
View File
@@ -2,7 +2,7 @@
* 导入导出模块 — 对应 C 版 import_export.c
* 支持 JSON、CSV、TXT 三种格式
*/
export type ExportFormat = 'json' | 'csv';
export type ExportFormat = 'json' | 'csv' | 'txt';
export interface ExportData {
system: string[];
@@ -11,7 +11,9 @@ export interface ExportData {
/** 根据文件扩展名检测格式 */
export function detectExportFormat(filepath: string): ExportFormat {
if (filepath.toLowerCase().endsWith('.csv')) return 'csv';
const lower = filepath.toLowerCase();
if (lower.endsWith('.csv')) return 'csv';
if (lower.endsWith('.txt')) return 'txt';
return 'json';
}
@@ -65,10 +67,10 @@ export function importFromCsv(content: string): ImportResult {
let hasHeader = false;
for (const rawLine of lines) {
// 跳过 BOM
let line = rawLine;
if (line.startsWith('')) {
for (let i = 0; i < lines.length; i++) {
// 跳过 BOM(仅首行)
let line = lines[i];
if (i === 0 && line.startsWith('')) {
line = line.slice(1);
}
@@ -174,9 +176,10 @@ export function importFromTxt(content: string): string[] {
const paths: string[] = [];
const lines = content.split(/\r?\n/);
for (let line of lines) {
// 跳过 BOM
if (line.startsWith('')) line = line.slice(1);
for (let i = 0; i < lines.length; i++) {
// 跳过 BOM(仅首行)
let line = lines[i];
if (i === 0 && line.startsWith('')) line = line.slice(1);
const trimmed = line.trim();
if (trimmed.length === 0 || trimmed.startsWith('#')) continue;
+2 -1
View File
@@ -26,7 +26,8 @@ export function join_path(paths: string[]): string {
return paths.join(';');
}
/** 分割 PATH 字符串 */
/** 分割 PATH 字符串
* 注意:Rust 端 src-tauri/src/commands/registry.rs 有相同逻辑的 split_path,修改时需同步两端。 */
export function split_path(raw: string): string[] {
return raw
.split(';')
+4 -4
View File
@@ -92,9 +92,9 @@ export function useAppActions(activeTab: TabId, dialogs: DialogState) {
if (result.system.length > 0 && result.user.length > 0) {
setImportDialog({ open: true, system: result.system, user: result.user });
} else if (result.system.length > 0) {
useAppStore.getState().importPaths(TargetType.SYSTEM, result.system);
useAppStore.getState().replacePaths(TargetType.SYSTEM, result.system);
} else if (result.user.length > 0) {
useAppStore.getState().importPaths(TargetType.USER, result.user);
useAppStore.getState().replacePaths(TargetType.USER, result.user);
}
}, [setImportDialog]);
@@ -159,8 +159,8 @@ export function useAppActions(activeTab: TabId, dialogs: DialogState) {
const handleImportSelect = useCallback((target: 'system' | 'user' | 'both') => {
const { system, user } = dialogs.importDialog;
const flat = flattenImportResult({ system, user }, target);
if (flat.system.length > 0) useAppStore.getState().importPaths(TargetType.SYSTEM, flat.system);
if (flat.user.length > 0) useAppStore.getState().importPaths(TargetType.USER, flat.user);
if (flat.system.length > 0) useAppStore.getState().replacePaths(TargetType.SYSTEM, flat.system);
if (flat.user.length > 0) useAppStore.getState().replacePaths(TargetType.USER, flat.user);
setImportDialog({ open: false, system: [], user: [] });
}, [dialogs.importDialog, setImportDialog]);
+7 -7
View File
@@ -34,7 +34,7 @@ interface AppState {
moveUp: (index: number, target: TargetType) => void;
moveDown: (index: number, target: TargetType) => void;
cleanPaths: (target: TargetType, validateFn: (p: string) => boolean) => string[];
importPaths: (target: TargetType, importPaths: string[]) => void;
replacePaths: (target: TargetType, newPaths: string[]) => void;
clearPaths: (target: TargetType) => void;
undo: () => void;
@@ -169,18 +169,18 @@ export const useAppStore = create<AppState>((set, get) => ({
return removed;
},
importPaths: (target, importPaths) => {
if (importPaths.length === 0) return;
replacePaths: (target, newPaths) => {
if (newPaths.length === 0) return;
const state = get();
const list = target === TargetType.SYSTEM ? state.sysPaths : state.userPaths;
state.undoRedo.push({
type: OperationType.IMPORT, target, index: 0, count: importPaths.length,
oldPaths: [...list], newPaths: [...importPaths],
type: OperationType.IMPORT, target, index: 0, count: newPaths.length,
oldPaths: [...list], newPaths: [...newPaths],
});
if (target === TargetType.SYSTEM) set({ sysPaths: [...importPaths], selectedIndices: [] });
else set({ userPaths: [...importPaths], selectedIndices: [] });
if (target === TargetType.SYSTEM) set({ sysPaths: [...newPaths], selectedIndices: [] });
else set({ userPaths: [...newPaths], selectedIndices: [] });
get()._markDirty();
},