diff --git a/src/components/BookingBreakdown/LineItemBookingPeriod.js b/src/components/BookingBreakdown/LineItemBookingPeriod.js index f6d44922..03d49e83 100644 --- a/src/components/BookingBreakdown/LineItemBookingPeriod.js +++ b/src/components/BookingBreakdown/LineItemBookingPeriod.js @@ -40,9 +40,13 @@ const BookingPeriod = props => { const LineItemBookingPeriod = props => { const { transaction, booking, unitType } = props; - const { start: startDate, end: endDateRaw } = booking.attributes; - const localStartDate = dateFromAPIToLocalNoon(startDate); - const localEndDateRaw = dateFromAPIToLocalNoon(endDateRaw); + // Attributes: displayStart and displayEnd can be used to differentiate shown time range + // from actual start and end times used for availability reservation. It can help in situations + // where there are preparation time needed between bookings. + // Read more: https://www.sharetribe.com/api-reference/#bookings + const { start, end, displayStart, displayEnd } = booking.attributes; + const localStartDate = dateFromAPIToLocalNoon(displayStart || start); + const localEndDateRaw = dateFromAPIToLocalNoon(displayEnd || end); const isNightly = unitType === LINE_ITEM_NIGHT; const isDaily = unitType === LINE_ITEM_DAY; diff --git a/src/containers/InboxPage/InboxPage.js b/src/containers/InboxPage/InboxPage.js index 88e2a1aa..d2aaac3d 100644 --- a/src/containers/InboxPage/InboxPage.js +++ b/src/containers/InboxPage/InboxPage.js @@ -136,9 +136,13 @@ export const txState = (intl, tx, type) => { }; const bookingData = (unitType, tx, isOrder, intl) => { - const { start, end } = tx.booking.attributes; - const startDate = dateFromAPIToLocalNoon(start); - const endDateRaw = dateFromAPIToLocalNoon(end); + // Attributes: displayStart and displayEnd can be used to differentiate shown time range + // from actual start and end times used for availability reservation. It can help in situations + // where there are preparation time needed between bookings. + // Read more: https://www.sharetribe.com/api-reference/#bookings + const { start, end, displayStart, displayEnd } = tx.booking.attributes; + const startDate = dateFromAPIToLocalNoon(displayStart || start); + const endDateRaw = dateFromAPIToLocalNoon(displayEnd || end); const isDaily = unitType === LINE_ITEM_DAY; const isUnits = unitType === LINE_ITEM_UNITS; const isSingleDay = isDaily && daysBetween(startDate, endDateRaw) === 1; diff --git a/src/util/test-data.js b/src/util/test-data.js index 00a17ae3..1dfbd2b6 100644 --- a/src/util/test-data.js +++ b/src/util/test-data.js @@ -18,7 +18,9 @@ export const createBooking = (id, attributes = {}) => ({ type: 'booking', attributes: { start: new Date(Date.UTC(2017, 5, 10)), + displayStart: new Date(Date.UTC(2017, 5, 10)), end: new Date(Date.UTC(2017, 5, 10)), + displayEnd: new Date(Date.UTC(2017, 5, 10)), ...attributes, }, }); diff --git a/src/util/types.js b/src/util/types.js index 14485a17..20291d61 100644 --- a/src/util/types.js +++ b/src/util/types.js @@ -207,6 +207,17 @@ propTypes.ownListing = shape({ images: arrayOf(propTypes.image), }); +export const BOOKING_STATE_PENDING = 'pending'; +export const BOOKING_STATE_ACCEPTED = 'accepted'; +export const BOOKING_STATE_DECLINED = 'declined'; +export const BOOKING_STATE_CANCELLED = 'cancelled'; +export const BOOKING_STATES = [ + BOOKING_STATE_PENDING, + BOOKING_STATE_ACCEPTED, + BOOKING_STATE_DECLINED, + BOOKING_STATE_CANCELLED, +]; + // Denormalised booking object propTypes.booking = shape({ id: propTypes.uuid.isRequired, @@ -214,6 +225,9 @@ propTypes.booking = shape({ attributes: shape({ end: instanceOf(Date).isRequired, start: instanceOf(Date).isRequired, + displayStart: instanceOf(Date), + displayEnd: instanceOf(Date), + state: oneOf(BOOKING_STATES), }), });