diff --git a/components/dateSelect.js b/components/dateSelect.js index f5c5c4f..fbacef5 100644 --- a/components/dateSelect.js +++ b/components/dateSelect.js @@ -1,13 +1,11 @@ -import { useContext, useState } from 'react' +import React, { useContext, useState } from 'react' import useSWR from 'swr' -import { WizardContext, ACTIONS } from '../context/wizardStore' +import { WizardContext } from '../context/wizardStore' import Form from 'react-bootstrap/Form' -import moment from 'moment' -import 'react-dates/initialize' -import { DateRangePicker, SingleDatePicker } from 'react-dates' +import DayPicker, { DateUtils } from 'react-day-picker' import Required from './required' import { dateFormat } from '../helpers/date' @@ -15,21 +13,51 @@ import { dateFormat } from '../helpers/date' const fetcher = (path) => fetch(path).then((r) => r.json()) export default function DateSelect() { - const [focusedInput, setFocusedInput] = useState(null) + // const [focusedInput, setFocusedInput] = useState(null) const { state, onChange } = useContext(WizardContext) + const [range, setRange] = useState({ form: null, to: null }) const { data: daysBooked, error: fetchBookedOnError } = useSWR( '/api/daysbooked', fetcher ) + const prevBookedDay = range.from + ? daysBooked + .reverse() + .find((dayBooked) => dayBooked < dateFormat(range.from)) + : null + const nextBookedDay = range.from + ? daysBooked.find((dayBooked) => dayBooked > dateFormat(range.from)) + : null - const { multipleDays, startDate, endDate } = state.formData + console.log('from', dateFormat(range.from), 'to', dateFormat(range.to)) + console.log('prev', prevBookedDay, 'next', nextBookedDay) - function isDayBlocked(momentDay) { + function dayBeforeToday(day) { + return new Date() > day + } + + function dayBooked(day) { + return daysBooked && daysBooked.includes(dateFormat(day)) + } + + function dayDisabled(day) { return ( - daysBooked && daysBooked.some((rawDay) => momentDay.isSame(rawDay, 'day')) + dayBeforeToday(day) || + dayBooked(day) || + (prevBookedDay && day < new Date(prevBookedDay)) || + (nextBookedDay && day > new Date(nextBookedDay)) ) } + const { multipleDays } = state.formData + const { from, to } = range + const disabledDays = [dayDisabled] + const modifiers = { + dayBooked, + start: from, + end: to, + } + if (fetchBookedOnError) { return (
@@ -53,7 +81,7 @@ export default function DateSelect() { value="single" checked={multipleDays === false} onChange={() => { - setFocusedInput(null) + //setFocusedInput(null) onChange({ multipleDays: false, startDate: null, @@ -69,7 +97,7 @@ export default function DateSelect() { value="multiple" checked={multipleDays === true} onChange={() => { - setFocusedInput(null) + //setFocusedInput(null) onChange({ multipleDays: true, startDate: null, @@ -83,45 +111,18 @@ export default function DateSelect() { Datum - {multipleDays === false && ( - - onChange({ - startDate: date && dateFormat(date), - }) - } - focused={typeof focusedInput === 'boolean' && focusedInput} - onFocusChange={({ focused }) => setFocusedInput(focused)} - isDayBlocked={isDayBlocked} - id="startDate" - /> - )} + {multipleDays === false &&

not implemented

} {multipleDays === true && ( - { - onChange({ - startDate: startDate && dateFormat(startDate), - endDate: endDate && dateFormat(endDate), - }) + { + const newRange = DateUtils.addDayToRange(day, range) + setRange(newRange) }} - focusedInput={focusedInput} - onFocusChange={(focusedInput) => setFocusedInput(focusedInput)} - isDayBlocked={isDayBlocked} - minDate={moment()} /> )} diff --git a/db/index.js b/db/index.js index 39f183b..b86c38b 100644 --- a/db/index.js +++ b/db/index.js @@ -30,7 +30,10 @@ export async function getBookedDays() { 'startDate endDate' ).exec() - return bookings.map((booking) => booking.days).flat() + return bookings + .map((booking) => booking.days) + .flat() + .sort() } export async function createBooking({ diff --git a/package-lock.json b/package-lock.json index 739ff5e..3395047 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6826,6 +6826,14 @@ "react-with-styles-interface-css": "^6.0.0" } }, + "react-day-picker": { + "version": "7.4.8", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-7.4.8.tgz", + "integrity": "sha512-pp0hnxFVoRuBQcRdR1Hofw4CQtOCGVmzCNrscyvS0Q8NEc+UiYLEDqE5dk37bf0leSnBW4lheIt0CKKhuKzDVw==", + "requires": { + "prop-types": "^15.6.2" + } + }, "react-dom": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", diff --git a/package.json b/package.json index b94dcb0..3ae211b 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "react": "16.13.1", "react-bootstrap": "^1.3.0", "react-dates": "^21.8.0", + "react-day-picker": "^7.4.8", "react-dom": "16.13.1", "rebass": "^4.0.7", "swr": "^0.2.3" diff --git a/pages/_app.js b/pages/_app.js index 6958b1a..368ab51 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,5 +1,8 @@ +import React from 'react' + import 'bootstrap/dist/css/bootstrap.min.css' -import 'react-dates/lib/css/_datepicker.css' +//import 'react-dates/lib/css/_datepicker.css' +import 'react-day-picker/lib/style.css' import 'moment' import 'moment/locale/de' diff --git a/pages/index.js b/pages/index.js index 633b83e..36b078b 100644 --- a/pages/index.js +++ b/pages/index.js @@ -37,6 +37,26 @@ export default function Home() { * { box-sizing: border-box; } + .Selectable + .DayPicker-Day--selected:not(.DayPicker-Day--start):not(.DayPicker-Day--end):not(.DayPicker-Day--outside) { + background-color: #f0f8ff !important; + color: #4a90e2; + } + .Selectable .DayPicker-Day { + border-radius: 0 !important; + } + .Selectable .DayPicker-Day--start { + border-top-left-radius: 50% !important; + border-bottom-left-radius: 50% !important; + } + .Selectable .DayPicker-Day--end { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; + } + .Selectable .DayPicker-Day--dayBooked:not(.DayPicker-Day--outside) { + color: #505050; + background-color: #fcc; + } `}
)