import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { authFetch } from '../../services/apiClient'; import { X, Building2 } from 'lucide-react'; import { MeetingRoom } from '../../types'; import { CURRENT_USER_MOCK } from '../../constants'; interface BookMeetingRoomModalProps { purpose: string; defaultDate?: string; onBooked: (roomName?: string) => void; onClose: () => void; } export const BookMeetingRoomModal: React.FC = ({ purpose, defaultDate = new Date().toISOString().split('T')[0], onBooked, onClose }) => { const [rooms, setRooms] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [date, setDate] = useState(defaultDate); const [startTime, setStartTime] = useState('10:00'); const [endTime, setEndTime] = useState('11:00'); const [roomId, setRoomId] = useState(''); useEffect(() => { const fetchRooms = async () => { try { const res = await authFetch('/api/office/meeting-rooms'); if (res.ok) { const data = await res.json(); const normalized = (Array.isArray(data) ? data : []).map((r: any) => ({ id: r.id, name: r.name || '', capacity: r.capacity || 0, location: r.location, isActive: r.is_active !== false })); setRooms(normalized.filter((r: MeetingRoom) => r.isActive !== false)); if (normalized.length > 0 && !roomId) setRoomId(String(normalized[0].id)); } } catch (e) { console.error(e); setError('Не удалось загрузить переговорные'); } finally { setLoading(false); } }; fetchRooms(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!roomId || !date || !startTime || !endTime) { setError('Заполните дату, время и выберите переговорную'); return; } const startDateTime = new Date(`${date}T${startTime}`); const endDateTime = new Date(`${date}T${endTime}`); if (endDateTime <= startDateTime) { setError('Время окончания должно быть позже начала'); return; } setError(null); setSaving(true); try { const res = await authFetch('/api/office/meeting-bookings', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ roomId: parseInt(roomId), bookedBy: CURRENT_USER_MOCK.name, startTime: startDateTime.toISOString(), endTime: endDateTime.toISOString(), purpose }) }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.error || 'Ошибка бронирования'); } const room = rooms.find(r => r.id === parseInt(roomId)); onBooked(room?.name); onClose(); } catch (err) { setError(err instanceof Error ? err.message : 'Ошибка бронирования'); } finally { setSaving(false); } }; const modalContent = (
e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} >

Забронировать переговорную

{error && (
{error}
)}

{purpose}

setDate(e.target.value)} className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm" required />
setStartTime(e.target.value)} className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm" required />
setEndTime(e.target.value)} className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm" required />
{loading ? (

Загрузка...

) : ( )}
); return typeof document !== 'undefined' && document.body ? createPortal(modalContent, document.body) : modalContent; };