Spaces:
Running
Running
| import { useState, useCallback } from 'react' | |
| import toast from 'react-hot-toast' | |
| export function getTestFormValidationError(testForm) { | |
| if (!testForm.title.trim()) return 'Title required' | |
| const durationMinutes = Number(testForm.duration_minutes) | |
| const isDurationValid = Number.isFinite(durationMinutes) && durationMinutes >= 5 && durationMinutes <= 360 | |
| if (!isDurationValid) return 'Duration must be between 5 and 360 minutes' | |
| return null | |
| } | |
| export function useTestFormEditor(test, updateTestDetails) { | |
| const [isEditingTest, setIsEditingTest] = useState(false) | |
| const [testForm, setTestForm] = useState({ title: '', description: '', duration_minutes: 180 }) | |
| const [savingTest, setSavingTest] = useState(false) | |
| const startEditingTest = useCallback(() => { | |
| setTestForm({ | |
| title: test?.title || '', | |
| description: test?.description || '', | |
| duration_minutes: test?.duration_minutes || 180, | |
| }) | |
| setIsEditingTest(true) | |
| }, [test]) | |
| const saveTest = useCallback(async (event) => { | |
| event.preventDefault() | |
| const validationError = getTestFormValidationError(testForm) | |
| if (validationError) { toast.error(validationError); return } | |
| const durationMinutes = Number(testForm.duration_minutes) | |
| setSavingTest(true) | |
| try { | |
| await updateTestDetails({ | |
| title: testForm.title.trim(), | |
| description: testForm.description.trim(), | |
| duration_minutes: durationMinutes, | |
| }) | |
| setIsEditingTest(false) | |
| toast.success('Test updated') | |
| } catch (err) { | |
| toast.error(err.response?.data?.detail || 'Failed to update test') | |
| } finally { | |
| setSavingTest(false) | |
| } | |
| }, [testForm, updateTestDetails]) | |
| const cancelEditingTest = useCallback(() => { | |
| setIsEditingTest(false) | |
| }, []) | |
| return { isEditingTest, testForm, setTestForm, savingTest, startEditingTest, saveTest, cancelEditingTest } | |
| } | |