import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { LocalTask, MissionBrief, SubtaskActivity, putFeedback, updateMissionBrief } from '../../../api'; import { StatusBadge } from '../../shared/StatusBadge'; import { SubtasksPanel, type SubtaskFilePreviewHandler } from './SubtasksPanel'; import { ContextUsageGauge } from '../ContextUsageGauge'; import { ReflectionBadge } from '../ReflectionBadge'; const GOOD_TAGS = ['出力の精度が高い', 'フォーマットが適切', '指示をよく理解していた', '速度が適切だった']; const BAD_TAGS = ['出力の精度が低い', 'フォーマットが不適切', '指示と違う結果になった', '不要な作業をしていた', '途中で止まった / ASKが多すぎた']; function FeedbackPanel({ task }: { task: LocalTask }) { const { t } = useTranslation('detail'); const qc = useQueryClient(); const isComplete = task.latestJob?.status === 'succeeded' || task.latestJob?.status === 'failed'; const hasFeedback = !!task.feedbackRating; const [rating, setRating] = useState<'good' | 'bad' | null>(task.feedbackRating ?? null); const [selectedTags, setSelectedTags] = useState(task.feedbackTags ?? []); const [comment, setComment] = useState(task.feedbackComment ?? ''); const [editing, setEditing] = useState(!hasFeedback); const mutation = useMutation({ mutationFn: (fb: { rating: 'good' | 'bad'; tags: string[]; comment?: string }) => putFeedback(task.id, fb), onSuccess: () => { qc.invalidateQueries({ queryKey: ['localTasks'] }); qc.invalidateQueries({ queryKey: ['localTaskDetail', task.id] }); setEditing(false); }, }); if (!isComplete) return null; const tags = rating === 'good' ? GOOD_TAGS : rating === 'bad' ? BAD_TAGS : []; const toggleTag = (tag: string) => { setSelectedTags(prev => prev.includes(tag) ? prev.filter(t => t !== tag) : [...prev, tag]); }; const handleSubmit = () => { if (!rating) return; mutation.mutate({ rating, tags: selectedTags, comment: comment || undefined }); }; const handleRatingClick = (r: 'good' | 'bad') => { setRating(r); setSelectedTags([]); setEditing(true); }; if (!editing && hasFeedback) { return (
{t('feedback.title')} {task.feedbackRating === 'good' ? '👍' : '👎'}
{task.feedbackTags && task.feedbackTags.length > 0 && (
{task.feedbackTags.map(tag => ( {tag} ))}
)} {task.feedbackComment && (
{task.feedbackComment}
)}
); } return (
{t('feedback.title')}
{rating && ( <>
{tags.map(tag => ( ))}