diff --git a/src/pages/agent-office/components/TaskTab.jsx b/src/pages/agent-office/components/TaskTab.jsx index 967920f..2091e8a 100644 --- a/src/pages/agent-office/components/TaskTab.jsx +++ b/src/pages/agent-office/components/TaskTab.jsx @@ -11,6 +11,22 @@ const STATUS_STYLE = { rejected: { bg: '#7f1d1d', fg: '#fca5a5' } }; +// result_data는 백엔드에서 dict 또는 string 둘 다 올 수 있다. +// React child로 직접 못 그리는 객체는 stringify, string은 parse 시도 후 pretty, +// 둘 다 안 되면 원본 문자열을 그대로 표시. +function formatResultData(rd) { + if (rd == null) return ''; + if (typeof rd === 'object') { + try { return JSON.stringify(rd, null, 2); } + catch { return String(rd); } + } + if (typeof rd === 'string') { + try { return JSON.stringify(JSON.parse(rd), null, 2); } + catch { return rd; } + } + return String(rd); +} + function formatTime(ts) { if (!ts) return ''; const d = new Date(ts); @@ -46,10 +62,7 @@ export default function TaskTab({ agentId, refreshTrigger }) { {expanded === task.id && task.result_data && (
- {(() => {
- try { return JSON.stringify(JSON.parse(task.result_data), null, 2); }
- catch { return task.result_data; }
- })()}
+ {formatResultData(task.result_data)}
)}
diff --git a/src/pages/agent-office/components/TaskTab.test.jsx b/src/pages/agent-office/components/TaskTab.test.jsx
index 7d93092..15592e4 100644
--- a/src/pages/agent-office/components/TaskTab.test.jsx
+++ b/src/pages/agent-office/components/TaskTab.test.jsx
@@ -1,5 +1,5 @@
import { describe, it, expect, vi } from 'vitest';
-import { render, screen, waitFor } from '@testing-library/react';
+import { render, screen, waitFor, fireEvent } from '@testing-library/react';
import TaskTab from './TaskTab.jsx';
const mockGetAgentTasks = vi.fn();
@@ -33,4 +33,55 @@ describe('TaskTab response shape handling', () => {
render(