95 lines
3.4 KiB
TypeScript
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
|
|
};
|
|
}; |