import { useState } from 'react' import { experimentManagement } from '../lib/supabase' import type { Experiment } from '../lib/supabase' interface ScheduleModalProps { experiment: Experiment onClose: () => void onScheduleUpdated: (experiment: Experiment) => void } export function ScheduleModal({ experiment, onClose, onScheduleUpdated }: ScheduleModalProps) { const [loading, setLoading] = useState(false) const [error, setError] = useState(null) // Initialize with existing scheduled date or current date/time const getInitialDateTime = () => { if (experiment.scheduled_date) { const date = new Date(experiment.scheduled_date) return { date: date.toISOString().split('T')[0], time: date.toTimeString().slice(0, 5) } } const now = new Date() // Set to next hour by default now.setHours(now.getHours() + 1, 0, 0, 0) return { date: now.toISOString().split('T')[0], time: now.toTimeString().slice(0, 5) } } const [dateTime, setDateTime] = useState(getInitialDateTime()) const isScheduled = !!experiment.scheduled_date const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError(null) setLoading(true) try { // Validate date/time const selectedDateTime = new Date(`${dateTime.date}T${dateTime.time}`) const now = new Date() if (selectedDateTime <= now) { setError('Scheduled date and time must be in the future') setLoading(false) return } // Schedule the experiment const updatedExperiment = await experimentManagement.scheduleExperiment( experiment.id, selectedDateTime.toISOString() ) onScheduleUpdated(updatedExperiment) onClose() } catch (err: any) { setError(err.message || 'Failed to schedule experiment') console.error('Schedule experiment error:', err) } finally { setLoading(false) } } const handleRemoveSchedule = async () => { if (!confirm('Are you sure you want to remove the schedule for this experiment?')) { return } setError(null) setLoading(true) try { const updatedExperiment = await experimentManagement.removeExperimentSchedule(experiment.id) onScheduleUpdated(updatedExperiment) onClose() } catch (err: any) { setError(err.message || 'Failed to remove schedule') console.error('Remove schedule error:', err) } finally { setLoading(false) } } const handleCancel = () => { onClose() } return (
e.stopPropagation()}> {/* Close Button */} {/* Header */}

{isScheduled ? 'Update Schedule' : 'Schedule Experiment'}

{/* Experiment Info */}

Experiment #{experiment.experiment_number}

{experiment.reps_required} reps required • {experiment.soaking_duration_hr}h soaking

{/* Error Message */} {error && (
{error}
)} {/* Current Schedule (if exists) */} {isScheduled && (
Currently Scheduled

{new Date(experiment.scheduled_date!).toLocaleString()}

)} {/* Schedule Form */}
setDateTime({ ...dateTime, date: e.target.value })} className="h-11 w-full rounded-lg border appearance-none px-4 py-2.5 text-sm shadow-theme-xs placeholder:text-gray-400 focus:outline-hidden focus:ring-3 dark:bg-gray-900 dark:text-white/90 dark:placeholder:text-white/30 bg-transparent text-gray-800 border-gray-300 focus:border-brand-300 focus:ring-brand-500/20 dark:border-gray-700 dark:focus:border-brand-800" required />
setDateTime({ ...dateTime, time: e.target.value })} className="h-11 w-full rounded-lg border appearance-none px-4 py-2.5 text-sm shadow-theme-xs placeholder:text-gray-400 focus:outline-hidden focus:ring-3 dark:bg-gray-900 dark:text-white/90 dark:placeholder:text-white/30 bg-transparent text-gray-800 border-gray-300 focus:border-brand-300 focus:ring-brand-500/20 dark:border-gray-700 dark:focus:border-brand-800" required />
{/* Action Buttons */}
{isScheduled && ( )}
) }