fix(presentation): 修复 presentation 模块类型错误和语法问题
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

- 创建 types.ts 定义完整的类型系统
- 重写 DocumentRenderer.tsx 修复语法错误
- 重写 QuizRenderer.tsx 修复语法错误
- 重写 PresentationContainer.tsx 添加类型守卫
- 重写 TypeSwitcher.tsx 修复类型引用
- 更新 index.ts 移除不存在的 ChartRenderer 导出

审计结果:
- 类型检查: 通过
- 单元测试: 222 passed
- 构建: 成功
This commit is contained in:
iven
2026-03-26 17:19:28 +08:00
parent d0c6319fc1
commit b7f3d94950
71 changed files with 15896 additions and 1133 deletions

View File

@@ -28,6 +28,7 @@ export interface PipelineInfo {
displayName: string;
description: string;
category: string;
industry: string;
tags: string[];
icon: string;
version: string;
@@ -75,10 +76,12 @@ export class PipelineClient {
*/
static async listPipelines(options?: {
category?: string;
industry?: string;
}): Promise<PipelineInfo[]> {
try {
const pipelines = await invoke<PipelineInfo[]>('pipeline_list', {
category: options?.category || null,
industry: options?.industry || null,
});
return pipelines;
} catch (error) {
@@ -206,20 +209,28 @@ export class PipelineClient {
pollIntervalMs: number = 1000
): Promise<PipelineRunResponse> {
// Start the pipeline
console.log('[DEBUG runAndWait] Starting pipeline:', request.pipelineId);
const { runId } = await this.runPipeline(request);
console.log('[DEBUG runAndWait] Got runId:', runId);
// Poll for progress until completion
let result = await this.getProgress(runId);
console.log('[DEBUG runAndWait] Initial progress:', result.status, result.message);
let pollCount = 0;
while (result.status === 'running' || result.status === 'pending') {
if (onProgress) {
onProgress(result);
}
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
pollCount++;
console.log(`[DEBUG runAndWait] Poll #${pollCount} for runId:`, runId);
result = await this.getProgress(runId);
console.log(`[DEBUG runAndWait] Progress:`, result.status, result.message);
}
console.log('[DEBUG runAndWait] Final result:', result.status, result.error || 'no error');
return result;
}
}
@@ -330,6 +341,7 @@ import { useState, useEffect, useCallback } from 'react';
export interface UsePipelineOptions {
category?: string;
industry?: string;
autoRefresh?: boolean;
refreshInterval?: number;
}
@@ -345,6 +357,7 @@ export function usePipelines(options: UsePipelineOptions = {}) {
try {
const result = await PipelineClient.listPipelines({
category: options.category,
industry: options.industry,
});
setPipelines(result);
} catch (err) {
@@ -352,24 +365,28 @@ export function usePipelines(options: UsePipelineOptions = {}) {
} finally {
setLoading(false);
}
}, [options.category]);
}, [options.category, options.industry]);
const refresh = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await PipelineClient.refresh();
// Filter by category if specified
const filtered = options.category
? result.filter((p) => p.category === options.category)
: result;
// Filter by category and industry if specified
let filtered = result;
if (options.category) {
filtered = filtered.filter((p) => p.category === options.category);
}
if (options.industry) {
filtered = filtered.filter((p) => p.industry === options.industry);
}
setPipelines(filtered);
} catch (err) {
setError(err instanceof Error ? err.message : String(err));
} finally {
setLoading(false);
}
}, [options.category]);
}, [options.category, options.industry]);
useEffect(() => {
loadPipelines();