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

89 lines
3.1 KiB
TypeScript

import { QuestionType } from "@/types";
/**
* ADHD Self-Report Scale calculator parameters interface
*/
interface ADHDCalculatorProps {
/** Answer data, key is question ID, value is selected score */
answers: { [key: number]: string };
/** Questions list */
questions: QuestionType[];
}
/**
* Calculate ADHD Self-Report Scale (ASRS-v1.1) results
*
* @param answers - User answer data, containing question ID and selected score
* @returns Calculation results, including total score, factor scores, severity level and other information
*/
export const calculateADHDResults = ({ answers }: ADHDCalculatorProps): any => {
// ADHD ASRS calculation logic
let totalScore = 0;
// Subscale score initialization: inattention and hyperactivity-impulsivity
let inattentionScore = 0; // Inattention subscale score (questions 1-9)
let hyperactivityScore = 0; // Hyperactivity-Impulsivity subscale score (questions 10-18)
// Part A screening questions (questions 1-6) - critical for screening
let partAScore = 0;
let partAPositive = 0; // Count of positive responses in Part A
// Calculate total score and subscale scores
Object.entries(answers).forEach(([questionId, score]) => {
const questionNum = parseInt(questionId);
const scoreValue = parseInt(score);
totalScore += scoreValue;
// Part A screening questions (questions 1-6)
if (questionNum >= 1 && questionNum <= 6) {
partAScore += scoreValue;
// Part A positive criteria: questions 1-4 score ≥2, questions 5-6 score ≥3
if ((questionNum >= 1 && questionNum <= 4 && scoreValue >= 2) ||
(questionNum >= 5 && questionNum <= 6 && scoreValue >= 3)) {
partAPositive++;
}
}
// Inattention subscale (questions 1-9)
if (questionNum >= 1 && questionNum <= 9) {
inattentionScore += scoreValue;
}
// Hyperactivity-Impulsivity subscale (questions 10-18)
else if (questionNum >= 10 && questionNum <= 18) {
hyperactivityScore += scoreValue;
}
});
// Determine screening result based on Part A
const screeningPositive = partAPositive >= 4;
// Determine severity level based on total score
let severity = "low";
if (totalScore >= 24 && totalScore <= 36) {
severity = "mild";
} else if (totalScore >= 37 && totalScore <= 54) {
severity = "moderate";
} else if (totalScore >= 55) {
severity = "high";
}
// Calculate factor scores
const factorScores: { [key: string]: number } = {
"inattention": inattentionScore,
"hyperactivity": hyperactivityScore,
"partA": partAScore
};
// Return complete calculation results
return {
totalScore,
factorScores,
positiveItemCount: Object.values(answers).filter(score => parseInt(score) >= 2).length,
positiveItemAverage: totalScore / Object.keys(answers).length,
isSevere: severity === "high",
severity,
screeningPositive,
partAPositive,
};
};