import { useState, useRef } from 'react' import { Plus, Pencil, Trash2, ImagePlus, X as XIcon, Tag, ChevronRight } from 'lucide-react' import { cn } from '../lib/utils' import type { RoomCategory } from '../types' // ── Mock data ───────────────────────────────────────────────────────────────── const CATEGORY_COLORS = [ '#4F46E5', '#059669', '#2563EB', '#7C3AED', '#DC2626', '#D97706', '#DB2777', '#475569', ] const AMENITY_LIST = [ 'Wi-Fi', 'TV', 'AC', 'Mini-bar', 'Bathrobe', 'Jacuzzi', 'Panoramic view', 'Kitchen', 'Terrace', 'Butler', ] export const MOCK_CATEGORIES: RoomCategory[] = [ { id: 'cat1', hotelId: 'hotel-1', name: 'Стандарт', description: 'Уютные номера с базовым набором удобств. Идеально для деловых поездок и короткого отдыха.', photos: [], color: '#4F46E5', amenities: ['Wi-Fi', 'TV', 'AC'], }, { id: 'cat2', hotelId: 'hotel-1', name: 'Делюкс', description: 'Просторные номера с улучшенным интерьером, панорамными окнами и расширенным набором услуг.', photos: [], color: '#059669', amenities: ['Wi-Fi', 'TV', 'AC', 'Mini-bar', 'Bathrobe'], }, { id: 'cat3', hotelId: 'hotel-1', name: 'Люкс & Пентхаус', description: 'Роскошные апартаменты на верхних этажах с потрясающими видами, джакузи и персональным дворецким.', photos: [], color: '#7C3AED', amenities: ['Wi-Fi', 'TV', 'AC', 'Mini-bar', 'Bathrobe', 'Jacuzzi', 'Panoramic view', 'Butler', 'Terrace'], }, ] // Mock room counts per category const MOCK_ROOM_COUNTS: Record = { cat1: 8, cat2: 5, cat3: 2, } // ── Category Form Modal ──────────────────────────────────────────────────────── interface CategoryFormProps { category?: RoomCategory onClose: () => void onSave: (cat: RoomCategory) => void } function CategoryForm({ category, onClose, onSave }: CategoryFormProps) { const isEdit = !!category const [tab, setTab] = useState<'main' | 'photos'>('main') const [name, setName] = useState(category?.name ?? '') const [description, setDescription] = useState(category?.description ?? '') const [color, setColor] = useState(category?.color ?? '#4F46E5') const [amenities, setAmenities] = useState(category?.amenities ?? []) const [photos, setPhotos] = useState(category?.photos ?? []) const [photoIdx, setPhotoIdx] = useState(0) const fileRef = useRef(null) const toggleAmenity = (a: string) => setAmenities(prev => prev.includes(a) ? prev.filter(x => x !== a) : [...prev, a]) const handlePhotoUpload = (e: React.ChangeEvent) => { Array.from(e.target.files ?? []).forEach(file => { const reader = new FileReader() reader.onload = ev => { const url = ev.target?.result as string setPhotos(prev => { const next = [...prev, url]; setPhotoIdx(next.length - 1); return next }) } reader.readAsDataURL(file) }) e.target.value = '' } const removePhoto = (i: number) => { setPhotos(prev => prev.filter((_, idx) => idx !== i)) setPhotoIdx(p => Math.max(0, p - 1)) } const handleSave = () => { if (!name.trim()) return onSave({ id: category?.id ?? `cat-${Date.now()}`, hotelId: category?.hotelId ?? 'hotel-1', name: name.trim(), description, color, amenities, photos, }) } return (
{/* Header */}

{isEdit ? `Редактировать: ${category.name}` : 'Новая категория'}

{/* Tab bar */}
{(['main', 'photos'] as const).map(t => ( ))}
{/* Body */}
{tab === 'main' && ( <>
setName(e.target.value)} />
{CATEGORY_COLORS.map(c => (

Отображается в виджете бронирования как описание категории