Files
MindScope/components/questionnaire/test/private/DASS21Calculator.tsx
T
2026-06-22 22:59:01 +02:00

95 lines
3.4 KiB
TypeScript

import { QuestionType } from "@/types";
interface DASS21CalculatorProps {
answers: { [key: number]: string };
questions: QuestionType[];
}
export const calculateDASS21Results = ({ answers }: DASS21CalculatorProps): any => {
// DASS-21 calculation logic
// Depression dimension items: 3, 5, 10, 13, 16, 17, 21
// Anxiety dimension items: 2, 4, 7, 9, 15, 19, 20
// Stress dimension items: 1, 6, 8, 11, 12, 14, 18
const depressionItems = [3, 5, 10, 13, 16, 17, 21];
const anxietyItems = [2, 4, 7, 9, 15, 19, 20];
const stressItems = [1, 6, 8, 11, 12, 14, 18];
let depressionScore = 0;
let anxietyScore = 0;
let stressScore = 0;
let totalScore = 0;
// Calculate dimension scores
Object.entries(answers).forEach(([questionId, score]) => {
const questionNum = parseInt(questionId);
const scoreValue = parseInt(score);
totalScore += scoreValue;
if (depressionItems.includes(questionNum)) {
depressionScore += scoreValue;
} else if (anxietyItems.includes(questionNum)) {
anxietyScore += scoreValue;
} else if (stressItems.includes(questionNum)) {
stressScore += scoreValue;
}
});
// DASS-21 scores need to be multiplied by 2 for comparison with DASS-42
const finalDepressionScore = depressionScore * 2;
const finalAnxietyScore = anxietyScore * 2;
const finalStressScore = stressScore * 2;
// Determine severity level for each dimension
const getDepressionSeverity = (score: number) => {
if (score <= 9) return "normal";
if (score <= 13) return "mild";
if (score <= 20) return "moderate";
if (score <= 27) return "severe";
return "extremely_severe";
};
const getAnxietySeverity = (score: number) => {
if (score <= 7) return "normal";
if (score <= 9) return "mild";
if (score <= 14) return "moderate";
if (score <= 19) return "severe";
return "extremely_severe";
};
const getStressSeverity = (score: number) => {
if (score <= 14) return "normal";
if (score <= 18) return "mild";
if (score <= 25) return "moderate";
if (score <= 33) return "severe";
return "extremely_severe";
};
const depressionSeverity = getDepressionSeverity(finalDepressionScore);
const anxietySeverity = getAnxietySeverity(finalAnxietyScore);
const stressSeverity = getStressSeverity(finalStressScore);
// Determine overall severity level
const isAnySevere = depressionSeverity === "severe" || depressionSeverity === "extremely_severe" ||
anxietySeverity === "severe" || anxietySeverity === "extremely_severe" ||
stressSeverity === "severe" || stressSeverity === "extremely_severe";
return {
totalScore,
depressionScore: finalDepressionScore,
anxietyScore: finalAnxietyScore,
stressScore: finalStressScore,
depressionSeverity,
anxietySeverity,
stressSeverity,
factorScores: {
"depression": finalDepressionScore,
"anxiety": finalAnxietyScore,
"stress": finalStressScore
},
positiveItemCount: Object.values(answers).filter(score => parseInt(score) >= 2).length,
positiveItemAverage: totalScore / Object.keys(answers).length,
isSevere: isAnySevere
};
};