diff --git a/src/components/bookings/BookingModal.tsx b/src/components/bookings/BookingModal.tsx index 753db0c..2327033 100644 --- a/src/components/bookings/BookingModal.tsx +++ b/src/components/bookings/BookingModal.tsx @@ -108,7 +108,7 @@ export function BookingModal({ open, draft, rooms, bookings = [], onClose, onSav const rentalGetMaxEnd = (start: number) => { const next = rentalDayBookings.filter(b => !b.isFullDay && b.startHour >= start + 1) .sort((a, b) => a.startHour - b.startHour)[0] - return next ? next.startHour : (rentalObj?.closeHour ?? 22) + return next ? next.startHour - rentalBreakH : (rentalObj?.closeHour ?? 22) } const rentalEffStart = rentalAvailStarts.includes(rentalStartH) ? rentalStartH : (rentalAvailStarts[0] ?? rentalObj?.openHour ?? 8) const rentalAvailEnds = rentalHourOptions(rentalEffStart + 1, rentalGetMaxEnd(rentalEffStart)) diff --git a/src/components/rental/RentalBookingModal.tsx b/src/components/rental/RentalBookingModal.tsx index 89872fb..8450757 100644 --- a/src/components/rental/RentalBookingModal.tsx +++ b/src/components/rental/RentalBookingModal.tsx @@ -21,6 +21,15 @@ function hourOptions(from: number, to: number): number[] { return Array.from({ length: to - from + 1 }, (_, i) => from + i) } +function maskPhone(raw: string): string { + const d = raw.replace(/\D/g, '').replace(/^8/, '7').replace(/^(?!7)/, '7').slice(0, 11) + if (d.length <= 1) return d.length === 0 ? '' : '+7' + if (d.length <= 4) return `+7 (${d.slice(1)}` + if (d.length <= 7) return `+7 (${d.slice(1, 4)}) ${d.slice(4)}` + if (d.length <= 9) return `+7 (${d.slice(1, 4)}) ${d.slice(4, 7)}-${d.slice(7)}` + return `+7 (${d.slice(1, 4)}) ${d.slice(4, 7)}-${d.slice(7, 9)}-${d.slice(9, 11)}` +} + function formatHour(h: number): string { return `${h}:00` } @@ -100,21 +109,21 @@ export function RentalBookingModal({ !timedBookings.some(b => h >= b.startHour && h < b.endHour + breakHours), ) - // Max end hour for a given start: limited by the next booking that starts after `start` + // Max end hour for a given start: limited by next booking minus buffer const getMaxEndHour = (start: number) => { const next = timedBookings .filter(b => b.startHour >= start + 1) .sort((a, b) => a.startHour - b.startHour)[0] - return next ? next.startHour : obj.closeHour + return next ? next.startHour - breakHours : obj.closeHour } - const availableEndHours = hourOptions(startHour + 1, getMaxEndHour(startHour)) - // If current startHour is blocked, snap to first available const effectiveStartHour = availableStartHours.includes(startHour) ? startHour : (availableStartHours[0] ?? obj.openHour) + const availableEndHours = hourOptions(effectiveStartHour + 1, getMaxEndHour(effectiveStartHour)) + const hours = isFullDay ? obj.closeHour - obj.openHour : Math.max(0, endHour - effectiveStartHour) @@ -400,7 +409,7 @@ export function RentalBookingModal({ className={cn('input pl-8 text-sm', phoneRequired && !guestPhone.trim() && 'border-red-400 focus:ring-red-400')} placeholder={phoneRequired ? '+7 999 000 11 22 (обязательно)' : '+7 999 000 11 22'} value={guestPhone} - onChange={e => setGuestPhone(e.target.value)} + onChange={e => setGuestPhone(maskPhone(e.target.value))} /> {phoneRequired && !guestPhone.trim() && (