59 lines
2.1 KiB
TypeScript
59 lines
2.1 KiB
TypeScript
import { AlertItem } from "../../Shared/Alert";
|
|
|
|
|
|
export const validateWriteBlanks = (
|
|
solutions: { id: string; solution: string[] }[],
|
|
maxWords: number,
|
|
setAlerts: React.Dispatch<React.SetStateAction<AlertItem[]>>
|
|
): boolean => {
|
|
let isValid = true;
|
|
|
|
const emptySolutions = solutions.flatMap(s =>
|
|
s.solution.map((sol, index) => ({
|
|
blankId: s.id,
|
|
solutionIndex: index,
|
|
isEmpty: !sol.trim()
|
|
}))
|
|
).filter(({ isEmpty }) => isEmpty);
|
|
|
|
if (emptySolutions.length > 0) {
|
|
isValid = false;
|
|
setAlerts(prev => {
|
|
const filtered = prev.filter(a => !a.tag?.startsWith('empty-solution'));
|
|
return [...filtered, ...emptySolutions.map(({ blankId, solutionIndex }) => ({
|
|
variant: "error" as const,
|
|
tag: `empty-solution-${blankId}-${solutionIndex}`,
|
|
description: `Solution ${solutionIndex + 1} for blank ${blankId} cannot be empty`
|
|
}))];
|
|
});
|
|
} else {
|
|
setAlerts(prev => prev.filter(a => !a.tag?.startsWith('empty-solution')));
|
|
}
|
|
|
|
if (maxWords > 0) {
|
|
const invalidWordCount = solutions.flatMap(s =>
|
|
s.solution.map((sol, index) => ({
|
|
blankId: s.id,
|
|
solutionIndex: index,
|
|
wordCount: sol.trim().split(/\s+/).length
|
|
}))
|
|
).filter(({ wordCount }) => wordCount > maxWords);
|
|
|
|
if (invalidWordCount.length > 0) {
|
|
isValid = false;
|
|
setAlerts(prev => {
|
|
const filtered = prev.filter(a => !a.tag?.startsWith('word-count'));
|
|
return [...filtered, ...invalidWordCount.map(({ blankId, solutionIndex, wordCount }) => ({
|
|
variant: "error" as const,
|
|
tag: `word-count-${blankId}-${solutionIndex}`,
|
|
description: `Solution ${solutionIndex + 1} for blank ${blankId} exceeds maximum of ${maxWords} words (current: ${wordCount} words)`
|
|
}))];
|
|
});
|
|
} else {
|
|
setAlerts(prev => prev.filter(a => !a.tag?.startsWith('word-count')));
|
|
}
|
|
}
|
|
|
|
return isValid;
|
|
};
|