import Link from 'next/link'; import { ReactNode } from 'react'; import { Bot, Copy, Download, FileText } from 'lucide-react'; import { toast } from 'sonner'; import { Button } from '@/components/ui/button'; import { useScopedI18n } from '@/locales/client'; import { Questionnaire } from '@/types'; import { AssessmentRecord } from '@/lib/assessment-types'; import { recordToMarkdown } from '@/lib/assessment-export'; interface ResultContainerProps { title: string; id: string; children: ReactNode; questionnaire?: Questionnaire; answers?: string[]; questionnaireResults?: Record; record?: AssessmentRecord; profileName?: string; } function aiPrompt() { return [ '请根据以下测评记录,用中文进行温和、非诊断式解读。', '请重点分析:主要倾向、可能优势、需要留意的风险、后续可执行建议。', '如果我明确要求你记住,请只记住适合长期追踪的测评背景和变化,不要记住真实身份信息。', '注意:这不是医学或心理诊断。', ].join('\n'); } export function ResultContainer({ title, id, children, questionnaire, answers, questionnaireResults, record, profileName = '未命名档案', }: ResultContainerProps) { const t = useScopedI18n( 'component.questionnaire.result.public.resultContainer' ); const handleCopyResultLink = async () => { try { await navigator.clipboard.writeText( `${window.location.origin}${window.location.pathname}`, ); toast.success(t('copySuccess')); } catch { toast.error(t('copyError')); } }; const buildResultMarkdown = () => { if (record) { return `${aiPrompt()}\n\n${recordToMarkdown(record, profileName)}`; } if (!questionnaire || !answers || !questionnaireResults) { return null; } const currentTime = new Date().toLocaleString(); let resultData = `${aiPrompt()}\n\n# ${t('copyTemplate.title')}\n\n`; resultData += `## ${t('copyTemplate.basicInfo')}\n`; resultData += `- ${t('copyTemplate.questionnaireName')}: ${questionnaire.title}\n`; resultData += `- ${t('copyTemplate.questionnaireId')}: ${id}\n`; resultData += `- ${t('copyTemplate.assessmentTime')}: ${currentTime}\n`; resultData += `- ${t('copyTemplate.questionCount')}: ${questionnaire.questions.length}\n\n`; resultData += `## ${t('copyTemplate.questionsAndAnswers')}\n`; Object.entries(questionnaireResults).forEach(([question, answer], index) => { resultData += `${index + 1}. ${question}\n ${t('copyTemplate.answer')}: ${answer}\n\n`; }); resultData += `## ${t('copyTemplate.usage')}\n`; resultData += `${t('copyTemplate.disclaimer')}\n\n`; resultData += `${t('copyTemplate.source')}: ${t('copyTemplate.platform')}\n`; resultData += `${t('copyTemplate.website')}: ${window.location.origin}\n`; return resultData; }; const handleCopyResultData = async () => { const resultData = buildResultMarkdown(); if (!resultData) { toast.error(t('copyResultDataError')); return; } try { await navigator.clipboard.writeText(resultData); toast.success(t('copyResultDataSuccess')); } catch { toast.error(t('copyResultDataError')); } }; const handleDownloadResultData = () => { const resultData = buildResultMarkdown(); if (!resultData) { toast.error(t('downloadResultDataError')); return; } const blob = new Blob([resultData], { type: 'text/markdown;charset=utf-8' }); const url = URL.createObjectURL(blob); const anchor = document.createElement('a'); anchor.href = url; anchor.download = `${id}-result.md`; anchor.click(); URL.revokeObjectURL(url); toast.success(t('downloadResultDataSuccess')); }; return (

{title} - {t('resultText')}

{children}

可以复制完整记录给 ChatGPT 解读。若想长期追踪,可以在 ChatGPT 中明确说“请记住我的测评背景和后续变化”;不建议提交真实姓名、手机号等身份信息。

); }