63 lines
2.2 KiB
TypeScript
63 lines
2.2 KiB
TypeScript
import { useCallback, useEffect, useState } from 'react';
|
|
import { InteractiveSpeakingExercise, LevelPart, SpeakingExercise } from "@/interfaces/exam";
|
|
import { Section } from '@/stores/examEditor/types';
|
|
|
|
interface CheckGenerateProps {
|
|
section: Section | null;
|
|
sections: Array<{ sectionId: number; state: Section }>;
|
|
id?: string;
|
|
focusedSection: number;
|
|
}
|
|
|
|
const useCanGenerate = ({ section, sections, id, focusedSection }: CheckGenerateProps) => {
|
|
const checkCanGenerate = useCallback(() => {
|
|
if (!section) return false;
|
|
|
|
|
|
const exercise = id
|
|
? (sections.find(s => s.sectionId === 1)?.state as LevelPart)
|
|
?.exercises?.find(ex => ex.id === id) ?? section
|
|
: section;
|
|
|
|
const sectionId = id ? (exercise as SpeakingExercise | InteractiveSpeakingExercise).sectionId : focusedSection;
|
|
|
|
switch (sectionId) {
|
|
case 1: {
|
|
const currentSection = exercise as InteractiveSpeakingExercise;
|
|
return currentSection.first_title &&
|
|
currentSection.second_title &&
|
|
currentSection.prompts?.length > 2 &&
|
|
currentSection.prompts.every(prompt => prompt.text)
|
|
;
|
|
}
|
|
case 2: {
|
|
const currentSection = exercise as SpeakingExercise;
|
|
return currentSection.title &&
|
|
currentSection.text &&
|
|
currentSection.prompts?.length > 0 &&
|
|
currentSection.prompts.every(prompt => prompt)
|
|
;
|
|
}
|
|
case 3: {
|
|
const currentSection = exercise as InteractiveSpeakingExercise;
|
|
return currentSection.title &&
|
|
currentSection.prompts?.length > 0 &&
|
|
currentSection.prompts.every(prompt => prompt.text)
|
|
;
|
|
}
|
|
default:
|
|
return false;
|
|
}
|
|
}, [section, sections, id, focusedSection]);
|
|
|
|
const [canGenerate, setCanGenerate] = useState(checkCanGenerate());
|
|
|
|
useEffect(() => {
|
|
setCanGenerate(checkCanGenerate());
|
|
}, [checkCanGenerate, section]);
|
|
|
|
return canGenerate;
|
|
};
|
|
|
|
export default useCanGenerate;
|