// room-modal.jsx — Add / Edit room const ROOM_TYPES = ['Standard', 'Deluxe', 'Suite', 'Suite Panorama']; const BED_OPTIONS = [ '1 giường đôi', '2 giường đơn', '1 giường King', '2 giường Queen', '1 giường King + sofa', '1 giường Super King', '1 King + 1 đơn', ]; const FEATURE_SUGGESTIONS = [ { g: 'View', items: ['Hướng vườn', 'View núi', 'View thung lũng', 'View rừng thông', 'View hồ', 'View toàn cảnh'] }, { g: 'Không gian', items: ['Ban công', 'Ban công lớn', 'Sân riêng', 'Sân thượng', 'Sân thượng ngắm sao'] }, { g: 'Tiện nghi', items: ['Bồn tắm', 'Bồn tắm ngoài trời', 'Jacuzzi', 'Vòi sen mưa', 'Bếp nhỏ', 'Bếp riêng'] }, { g: 'Sưởi & TV', items: ['Lò sưởi điện', 'Lò sưởi củi', 'Tivi 4K', 'Máy lạnh', 'Máy pha cà phê'] }, { g: 'Làm việc', items: ['Wi-Fi nhanh', 'Bàn làm việc', 'Phòng họp nhỏ'] }, { g: 'Khác', items: ['Pet-friendly', 'Family friendly', 'Honeymoon setup', 'Tủ lạnh mini'] }, ]; const INITIAL_STATUSES = [ { k: 'available', l: 'Sẵn sàng đón khách', c: '#137333' }, { k: 'cleaning', l: 'Cần dọn', c: '#f29900' }, { k: 'maintenance', l: 'Bảo trì', c: '#5f6368' }, ]; function RoomModal({ room, existingRooms, onClose, onSave, onDelete }) { const isEdit = !!room; const [form, setForm] = React.useState(() => { if (room) return { ...room, features: room.features ? [...room.features] : [] }; // Default for new room — auto-suggest next number based on highest floor const maxNum = existingRooms.reduce((mx, r) => Math.max(mx, parseInt(r.number) || 0), 0); return { number: maxNum > 0 ? String(maxNum + 1) : '101', name: '', floor: maxNum > 0 ? Math.floor(maxNum / 100) || 1 : 1, type: 'Standard', bed: '1 giường đôi', cap: 2, price: 850000, status: 'available', features: [], }; }); const [customFeature, setCustomFeature] = React.useState(''); const set = (k, v) => setForm(f => ({ ...f, [k]: v })); const toggleFeature = (f) => { setForm(curr => ({ ...curr, features: curr.features.includes(f) ? curr.features.filter(x => x !== f) : [...curr.features, f], })); }; const addCustomFeature = () => { const v = customFeature.trim(); if (!v) return; if (!form.features.includes(v)) setForm(curr => ({ ...curr, features: [...curr.features, v] })); setCustomFeature(''); }; // Duplicate number check const numConflict = existingRooms.some(r => r.number === form.number && r.id !== form.id); const canSave = form.number && !numConflict && form.bed && form.price > 0; const handleSave = () => { if (!canSave) return; const id = form.id || ('r' + form.number); onSave({ ...form, id, price: Number(form.price), cap: Number(form.cap), floor: Number(form.floor) }); }; // Preview card const previewType = form.type.startsWith('Suite') ? 'Suite' : form.type; return (
e.stopPropagation()} style={{ width: 760 }}>

{isEdit ? 'Sửa phòng' : 'Thêm phòng mới'}

{isEdit ? `Phòng ${room.number} · ${room.name || room.type}` : 'Tạo phòng cho Windy Hill Homestay'}
{/* Form */}
set('number', e.target.value.trim())} placeholder="101" /> {numConflict && (
Số phòng đã tồn tại
)}
set('floor', +e.target.value || 1)} />
set('cap', +e.target.value || 1)} />
khách tối đa
set('name', e.target.value)} placeholder="VD: Phòng Mây, Suite Đỉnh Núi, Hidden Garden…" />
Đặt tên gợi cảm để khách dễ nhớ — bỏ trống thì hiển thị "Phòng {form.number}"
set('price', +e.target.value || 0)} />
Hiển thị: {VND(form.price)}
Bấm chip để chọn · {form.features.length} đã chọn
{FEATURE_SUGGESTIONS.map(g => (
{g.g}
{g.items.map(f => ( ))}
))}
setCustomFeature(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); addCustomFeature(); } }} style={{ flex: 1, border: '1px solid var(--line-strong)', padding: '8px 11px', borderRadius: 'var(--r-sm)', fontSize: 13, background: 'var(--bg)', color: 'var(--ink)' }} />
{/* Live preview */}
Xem trước card
{previewType === 'Suite' ? ( <> ) : previewType === 'Deluxe' ? ( ) : ( )} P.{form.number || '—'} · Tầng {form.floor} s.k === form.status)?.c }} /> {INITIAL_STATUSES.find(s => s.k === form.status)?.l.split(' ')[0]}
{form.name || ('Phòng ' + (form.number || '?'))}
{form.bed} {form.cap} {VNDshort(form.price)}đ/đêm
{form.features.length > 0 && (
{form.features.slice(0, 4).map((f, i) => ( {f} ))} {form.features.length > 4 && +{form.features.length - 4}}
)}
{isEdit && onDelete && ( )}
{isEdit ? `Sửa đổi: P.${form.number} · ${form.type}` : 'Phòng mới sẽ xuất hiện trên Timeline và trang Quản lý phòng'}
); } window.RoomModal = RoomModal;