Sidebar restructure: - Основное: Шахматка, Бронирования, Номера, Категории номеров, Доступность - Модули: Уборка + all active addon modules (including Documents) - Управление: План этажей, Каналы, Модули, Настройки - Разработчикам: API ModulesContext: documents module now active by default (version bump to 3) HousekeepingPage: added «Планы уборки» tab with: - Уборка при выезде: auto task creation, priority (high/normal), inspection toggle - Ежедневная уборка: interval (every 1/2/3/7 days), start from day N of stay - Уборка по запросу: guest-initiated via QR, priority selection - Генеральная уборка: deep clean every N days toggle - Проверка после уборки: inspection task after any cleaning - Автоназначение горничной: assign based on shift schedule Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
import { createContext, useContext, useState } from 'react'
|
|
import type { ModuleStatus } from '../data/modulesData'
|
|
|
|
const DEFAULT_STATUSES: Record<string, ModuleStatus> = {
|
|
'housekeeping': 'active',
|
|
'channel-manager': 'active',
|
|
'wifi-auth': 'active',
|
|
'payments': 'active',
|
|
'tv-welcome': 'active',
|
|
'smart-locks': 'active',
|
|
'olap-reports': 'active',
|
|
'website-builder': 'active',
|
|
'booking-widget': 'active',
|
|
'pos': 'active',
|
|
'reviews': 'active',
|
|
'room-service': 'active',
|
|
'rental': 'active',
|
|
'migration': 'active',
|
|
'documents': 'active',
|
|
}
|
|
|
|
interface ModulesContextValue {
|
|
statuses: Record<string, ModuleStatus>
|
|
setStatus: (id: string, status: ModuleStatus) => void
|
|
isActive: (id: string) => boolean
|
|
}
|
|
|
|
const ModulesContext = createContext<ModulesContextValue | null>(null)
|
|
|
|
const MODULES_VERSION = '3'
|
|
|
|
export function ModulesProvider({ children }: { children: React.ReactNode }) {
|
|
const [statuses, setStatuses] = useState<Record<string, ModuleStatus>>(() => {
|
|
try {
|
|
// Reset stored statuses when version changes so new defaults apply
|
|
const storedVersion = localStorage.getItem('hotelsync-modules-ver')
|
|
if (storedVersion !== MODULES_VERSION) {
|
|
localStorage.removeItem('hotelsync-modules')
|
|
localStorage.setItem('hotelsync-modules-ver', MODULES_VERSION)
|
|
return DEFAULT_STATUSES
|
|
}
|
|
const stored = localStorage.getItem('hotelsync-modules')
|
|
return stored ? { ...DEFAULT_STATUSES, ...JSON.parse(stored) } : DEFAULT_STATUSES
|
|
} catch {
|
|
return DEFAULT_STATUSES
|
|
}
|
|
})
|
|
|
|
const setStatus = (id: string, status: ModuleStatus) => {
|
|
setStatuses(prev => {
|
|
const next = { ...prev, [id]: status }
|
|
localStorage.setItem('hotelsync-modules', JSON.stringify(next))
|
|
return next
|
|
})
|
|
}
|
|
|
|
const isActive = (id: string) => statuses[id] === 'active' || statuses[id] === 'trial'
|
|
|
|
return (
|
|
<ModulesContext.Provider value={{ statuses, setStatus, isActive }}>
|
|
{children}
|
|
</ModulesContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function useModules() {
|
|
const ctx = useContext(ModulesContext)
|
|
if (!ctx) throw new Error('useModules must be used within ModulesProvider')
|
|
return ctx
|
|
}
|