Gateprep / frontend /src /hooks /useTestFormEditor.js
banu4prasad's picture
code refactor and shadcn UI
9e2df12
Raw
History Blame Contribute Delete
1.89 kB
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 }
}