import Link from 'next/link'; import { ReactNode } from 'react'; import { Button } from '@/components/ui/button'; import { useScopedI18n } from '@/locales/client'; import { Copy, Download, FileText } from 'lucide-react'; import { toast } from 'sonner'; import { Questionnaire } from '@/types'; interface ResultContainerProps { title: string; id: string; children: ReactNode; questionnaire?: Questionnaire; answers?: string[]; questionnaireResults?: Record; } export function ResultContainer({ title, id, children, questionnaire, answers, questionnaireResults }: 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 (!questionnaire || !answers || !questionnaireResults) { return null; } const currentTime = new Date().toLocaleString(); let resultData = `# ${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}
); }