'use client';
import React from 'react';
import { calculatePSS10Results } from '../../test/private/PSS10Calculator';
import { useScopedI18n } from '@/locales/client';
interface PSS10ResultProps {
answers: string[];
}
export function PSS10Result({ answers }: PSS10ResultProps) {
const t = useScopedI18n('components.pss10Result');
// Convert answer format to the format required by calculator
const answersMap: { [key: number]: string } = {};
answers.forEach((answer, index) => {
answersMap[index + 1] = answer;
});
const results = calculatePSS10Results({
answers: answersMap,
questions: []
});
const severityDescriptions = {
low: t('severityDescriptions.low'),
moderate: t('severityDescriptions.moderate'),
high: t('severityDescriptions.high')
};
const getSeverityColor = (severity: string) => {
switch (severity) {
case "low": return "text-green-600 bg-green-50 border-green-200";
case "moderate": return "text-yellow-600 bg-yellow-50 border-yellow-200";
case "high": return "text-red-600 bg-red-50 border-red-200";
default: return "text-gray-600 bg-gray-50 border-gray-200";
}
};
const questionTexts = [
t('questions.0'), t('questions.1'), t('questions.2'), t('questions.3'), t('questions.4'),
t('questions.5'), t('questions.6'), t('questions.7'), t('questions.8'), t('questions.9')
];
const getScoreInterpretation = (score: number) => {
if (score <= 13) return { level: t('scoreInterpretation.low_level'), color: "text-green-600", desc: t('scoreInterpretation.low_desc') };
if (score <= 26) return { level: t('scoreInterpretation.moderate_level'), color: "text-yellow-600", desc: t('scoreInterpretation.moderate_desc') };
return { level: t('scoreInterpretation.high_level'), color: "text-red-600", desc: t('scoreInterpretation.high_desc') };
};
const scoreInterp = getScoreInterpretation(results.totalScore);
return (
{/* Overall score */}
{/* Severity level description */}
{t('labels.result_interpretation')}
{severityDescriptions[results.severity as keyof typeof severityDescriptions]}
{t('labels.score_interpretation')}:
- • {t('scoring.total_range')}
- • {t('scoring.stress_perception_desc')}
- • {t('scoring.coping_ability_desc')}
{t('labels.reference_standards')}:
- • {t('scoring.range_0_13')}
- • {t('scoring.range_14_26')}
- • {t('scoring.range_27_40')}
{/* Subscale analysis */}
{t('labels.subscale_analysis')}
{/* Stress perception */}
{t('subscales.stress_perception_title')} ({results.stressPerceptionScore}/24分)
{t('subscales.stress_perception_desc')}
{/* Coping ability */}
{t('subscales.coping_ability_title')} ({results.copingAbilityScore}/16分)
{t('subscales.coping_ability_desc')}
{/* Item analysis */}
{t('labels.item_analysis')}
{results.itemAnalysis.map((item: any, index: number) => (
{index + 1}. {questionTexts[index]}
{item.isReverse && (
{t('labels.reverse_scoring')}
)}
{t('labels.original_score')}: {item.originalScore} {item.isReverse ? `→ ${t('labels.actual_score')}: ${item.actualScore}` : ''}
= 3 ? 'text-red-600' :
item.actualScore >= 2 ? 'text-yellow-600' : 'text-green-600'
}`}>
{item.actualScore}
{item.isHigh && (
{t('labels.high_stress')}
)}
))}
{results.highScoreItemCount > 0 && (
{t('labels.high_score_reminder')}
{t('highScoreAnalysis.message', { count: results.highScoreItemCount })}
)}
{/* Stress management recommendations */}
{t('labels.stress_management_advice')}
{results.severity === "low" ? (
{t('advice.maintain_good_state')}:
- {t('advice.maintain_good_state_item_1')}
- {t('advice.maintain_good_state_item_2')}
- {t('advice.maintain_good_state_item_3')}
- {t('advice.maintain_good_state_item_4')}
) : (
{t('advice.stress_management_strategies')}:
{/* Short-term strategies */}
{t('advice.short_term_strategies')}
- {t('advice.short_term_item_1')}
- {t('advice.short_term_item_2')}
- {t('advice.short_term_item_3')}
- {t('advice.short_term_item_4')}
- {t('advice.short_term_item_5')}
{/* Long-term strategies */}
{t('advice.long_term_strategies')}
- {t('advice.long_term_item_1')}
- {t('advice.long_term_item_2')}
- {t('advice.long_term_item_3')}
- {t('advice.long_term_item_4')}
- {t('advice.long_term_item_5')}
)}
{results.severity === "high" && (
{t('advice.high_stress_warning')}
)}
{t('labels.note')}:{t('disclaimer')}
);
}
interface MetricCardProps {
title: string;
value: React.ReactNode;
className?: string;
}
function MetricCard({ title, value, className = '' }: MetricCardProps) {
return (
{title}
{value}
);
}