import React, { useState, useEffect } from 'react'; import { Modal } from '../ui/modal'; import Button from '../ui/button/Button'; import { CalendarIcon, ClockIcon } from '../../icons'; import { getAccountTimezone } from '../../utils/timezone'; interface Content { id: number; title: string; scheduled_publish_at?: string | null; } interface ScheduleContentModalProps { isOpen: boolean; onClose: () => void; content: Content | null; onSchedule: (contentId: number, scheduledDate: string) => Promise; mode?: 'schedule' | 'reschedule'; } const ScheduleContentModal: React.FC = ({ isOpen, onClose, content, onSchedule, mode = 'schedule' }) => { const [selectedDate, setSelectedDate] = useState(''); const [selectedTime, setSelectedTime] = useState('09:00'); const [isSubmitting, setIsSubmitting] = useState(false); useEffect(() => { if (isOpen && content) { if (mode === 'reschedule' && content.scheduled_publish_at) { // Pre-fill with existing schedule const existingDate = new Date(content.scheduled_publish_at); const dateStr = existingDate.toISOString().split('T')[0]; const hours = existingDate.getHours().toString().padStart(2, '0'); const minutes = existingDate.getMinutes().toString().padStart(2, '0'); setSelectedDate(dateStr); setSelectedTime(`${hours}:${minutes}`); } else { // Default to tomorrow at 9:00 AM const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); const dateStr = tomorrow.toISOString().split('T')[0]; setSelectedDate(dateStr); setSelectedTime('09:00'); } } }, [isOpen, content, mode]); const handleSubmit = async () => { if (!content || !selectedDate || !selectedTime) return; // Combine date and time into ISO string const scheduledDateTime = new Date(`${selectedDate}T${selectedTime}`); // Validate future date if (scheduledDateTime <= new Date()) { alert('Please select a future date and time'); return; } setIsSubmitting(true); try { await onSchedule(content.id, scheduledDateTime.toISOString()); onClose(); } catch (error) { console.error('Failed to schedule:', error); } finally { setIsSubmitting(false); } }; const formatPreviewDate = () => { if (!selectedDate || !selectedTime) return ''; try { const dateTime = new Date(`${selectedDate}T${selectedTime}`); return dateTime.toLocaleString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: '2-digit', hour12: true, timeZone: getAccountTimezone(), }); } catch (error) { return ''; } }; if (!content) return null; return (
{/* Header */}

{mode === 'reschedule' ? 'Reschedule' : 'Schedule'} Content Publishing

Content: "{content.title}"

{/* Date/Time Selection */}
{/* Date Picker */}
setSelectedDate(e.target.value)} min={new Date().toISOString().split('T')[0]} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" disabled={isSubmitting} />
{/* Time Picker */}
setSelectedTime(e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" disabled={isSubmitting} />
{/* Preview */} {selectedDate && selectedTime && (

Preview: {formatPreviewDate()} ({getAccountTimezone()})

)}
{/* Actions */}
); }; export default ScheduleContentModal;