43 lines
1.6 KiB
TypeScript
43 lines
1.6 KiB
TypeScript
import { AlertItem } from "../Shared/Alert";
|
|
|
|
const validateMatchSentences = (
|
|
sentences: {id: string; sentence: string; solution: string;}[],
|
|
setAlerts: React.Dispatch<React.SetStateAction<AlertItem[]>>
|
|
): boolean => {
|
|
let hasErrors = false;
|
|
|
|
const emptySentences = sentences.filter(s => !s.sentence.trim());
|
|
if (emptySentences.length > 0) {
|
|
hasErrors = true;
|
|
setAlerts(prev => {
|
|
const filteredAlerts = prev.filter(alert => !alert.tag?.startsWith('empty-sentence'));
|
|
return [...filteredAlerts, ...emptySentences.map(s => ({
|
|
variant: "error" as const,
|
|
tag: `empty-sentence-${s.id}`,
|
|
description: `Heading ${s.id} is empty`
|
|
}))];
|
|
});
|
|
} else {
|
|
setAlerts(prev => prev.filter(alert => !alert.tag?.startsWith('empty-sentence')));
|
|
}
|
|
|
|
const unmatchedSentences = sentences.filter(s => !s.solution);
|
|
if (unmatchedSentences.length > 0) {
|
|
hasErrors = true;
|
|
setAlerts(prev => {
|
|
const filteredAlerts = prev.filter(alert => !alert.tag?.startsWith('unmatched-sentence'));
|
|
return [...filteredAlerts, ...unmatchedSentences.map(s => ({
|
|
variant: "error" as const,
|
|
tag: `unmatched-sentence-${s.id}`,
|
|
description: `Heading ${s.id} has no paragraph selected`
|
|
}))];
|
|
});
|
|
} else {
|
|
setAlerts(prev => prev.filter(alert => !alert.tag?.startsWith('unmatched-sentence')));
|
|
}
|
|
|
|
return !hasErrors;
|
|
};
|
|
|
|
export default validateMatchSentences;
|