From 0cb35faae7f6f84af2bbc1f98f21847fc1dccd29 Mon Sep 17 00:00:00 2001 From: Kimmo Puputti Date: Thu, 14 Dec 2017 15:38:05 +0200 Subject: [PATCH 1/4] Pass in raw author instead of ensured to avoid validation errors --- src/containers/ListingPage/ListingPage.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/containers/ListingPage/ListingPage.js b/src/containers/ListingPage/ListingPage.js index 78c36c4c..fd9b1c55 100644 --- a/src/containers/ListingPage/ListingPage.js +++ b/src/containers/ListingPage/ListingPage.js @@ -276,8 +276,9 @@ export class ListingPageComponent extends Component { const isOwnListing = userAndListingAuthorAvailable && currentListing.author.id.uuid === currentUser.id.uuid; - const currentAuthor = ensureUser(authorAvailable ? currentListing.author : {}); - const currentAuthorDisplayName = currentAuthor.attributes.profile.displayName; + const currentAuthor = authorAvailable ? currentListing.author : null; + const ensuredAuthor = ensureUser(currentAuthor); + const authorDisplayName = ensuredAuthor.attributes.profile.displayName; // TODO location address is currently serialized inside address field (API will change later) // Content is something like { locationAddress: 'Street, Province, Country', building: 'A 42' }; @@ -374,7 +375,7 @@ export class ListingPageComponent extends Component { params={params} to={{ hash: '#host' }} > - {currentAuthorDisplayName} + {authorDisplayName} ); @@ -393,7 +394,7 @@ export class ListingPageComponent extends Component { From 45dd9d94554d650a7f5829d18f6ca62f35a25f3d Mon Sep 17 00:00:00 2001 From: Kimmo Puputti Date: Thu, 14 Dec 2017 15:38:37 +0200 Subject: [PATCH 2/4] Add enquiry prop type handling --- src/components/ActivityFeed/ActivityFeed.js | 2 ++ src/ducks/user.duck.js | 4 ++-- src/util/propTypes.js | 14 +++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/components/ActivityFeed/ActivityFeed.js b/src/components/ActivityFeed/ActivityFeed.js index 0d985a09..7df809c3 100644 --- a/src/components/ActivityFeed/ActivityFeed.js +++ b/src/components/ActivityFeed/ActivityFeed.js @@ -72,6 +72,7 @@ Review.propTypes = { const shouldRenderTransition = transition => { return [ propTypes.TX_TRANSITION_PREAUTHORIZE, + propTypes.TX_TRANSITION_PREAUTHORIZE_ENQUIRY, propTypes.TX_TRANSITION_ACCEPT, propTypes.TX_TRANSITION_DECLINE, propTypes.TX_TRANSITION_AUTO_DECLINE, @@ -121,6 +122,7 @@ const resolveTransitionMessage = ( switch (currentTransition) { case propTypes.TX_TRANSITION_PREAUTHORIZE: + case propTypes.TX_TRANSITION_PREAUTHORIZE_ENQUIRY: return isOwnTransition ? ( ) : ( diff --git a/src/ducks/user.duck.js b/src/ducks/user.duck.js index aed711cc..6b2aa25a 100644 --- a/src/ducks/user.duck.js +++ b/src/ducks/user.duck.js @@ -1,6 +1,6 @@ import { updatedEntities, denormalisedEntities } from '../util/data'; import { storableError } from '../util/errors'; -import { TX_TRANSITION_PREAUTHORIZE } from '../util/propTypes'; +import { TX_TRANSITION_PREAUTHORIZE, TX_TRANSITION_PREAUTHORIZE_ENQUIRY } from '../util/propTypes'; import * as log from '../util/log'; import { authInfo } from './Auth.duck'; @@ -311,7 +311,7 @@ export const fetchCurrentUserNotifications = () => (dispatch, getState, sdk) => const apiQueryParams = { only: 'sale', - last_transitions: [TX_TRANSITION_PREAUTHORIZE], + last_transitions: [TX_TRANSITION_PREAUTHORIZE, TX_TRANSITION_PREAUTHORIZE_ENQUIRY], page: 1, per_page: NOTIFICATION_PAGE_SIZE, }; diff --git a/src/util/propTypes.js b/src/util/propTypes.js index c2bd0ee5..25596aab 100644 --- a/src/util/propTypes.js +++ b/src/util/propTypes.js @@ -147,6 +147,11 @@ export const booking = shape({ // provider sees the transaction in the SalePage. export const TX_TRANSITION_PREAUTHORIZE = 'transition/preauthorize'; +// A customer can also initiate a transaction with an enquiry, and +// then transition that by preauthorization. +export const TX_TRANSITION_ENQUIRE = 'transition/enquire'; +export const TX_TRANSITION_PREAUTHORIZE_ENQUIRY = 'transition/preauthorize-enquiry'; + // When the provider accepts or declines a transaction from the // SalePage, it is transitioned with the accept or decline transition. export const TX_TRANSITION_ACCEPT = 'transition/accept'; @@ -176,6 +181,8 @@ export const TX_TRANSITION_AUTO_COMPLETE_WITHOUT_REVIEWS = 'transition/auto-complete-without-reviews'; export const TX_TRANSITIONS = [ + TX_TRANSITION_ENQUIRE, + TX_TRANSITION_PREAUTHORIZE_ENQUIRY, TX_TRANSITION_PREAUTHORIZE, TX_TRANSITION_ACCEPT, TX_TRANSITION_DECLINE, @@ -206,7 +213,12 @@ export const TX_TRANSITION_ACTORS = [ const txLastTransition = tx => ensureTransaction(tx).attributes.lastTransition; -export const txIsPreauthorized = tx => txLastTransition(tx) === TX_TRANSITION_PREAUTHORIZE; +export const txIsPreauthorized = tx => { + const transition = txLastTransition(tx); + return ( + transition === TX_TRANSITION_PREAUTHORIZE || transition === TX_TRANSITION_PREAUTHORIZE_ENQUIRY + ); +}; export const txIsAccepted = tx => txLastTransition(tx) === TX_TRANSITION_ACCEPT; From 47fe74cc72b947991865da50b9b59194b4f2c3bd Mon Sep 17 00:00:00 2001 From: Kimmo Puputti Date: Thu, 14 Dec 2017 16:02:38 +0200 Subject: [PATCH 3/4] Don't include/require data that is optional --- src/util/data.js | 2 +- src/util/propTypes.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/util/data.js b/src/util/data.js index a29a0be7..07c4158b 100644 --- a/src/util/data.js +++ b/src/util/data.js @@ -109,7 +109,7 @@ export const denormalisedEntities = (entities, type, ids) => { * * @param {Object} transaction entity object, which is to be ensured agains null values */ -export const ensureTransaction = (transaction, booking = {}, listing = {}, provider = {}) => { +export const ensureTransaction = (transaction, booking = null, listing = null, provider = null) => { const empty = { id: null, type: 'transaction', diff --git a/src/util/propTypes.js b/src/util/propTypes.js index 25596aab..f394ec23 100644 --- a/src/util/propTypes.js +++ b/src/util/propTypes.js @@ -284,8 +284,12 @@ export const transaction = shape({ createdAt: instanceOf(Date).isRequired, lastTransitionedAt: instanceOf(Date).isRequired, lastTransition: oneOf(TX_TRANSITIONS).isRequired, - payinTotal: money.isRequired, - payoutTotal: money.isRequired, + + // An enquiry won't need a total sum nor a booking so these are + // optional. + payinTotal: money, + payoutTotal: money, + lineItems: arrayOf( shape({ code: string.isRequired, From 7e19474bf9ea56fc6700279e6778cd967aa9afa5 Mon Sep 17 00:00:00 2001 From: Kimmo Puputti Date: Thu, 14 Dec 2017 16:02:58 +0200 Subject: [PATCH 4/4] Avoid breaking Inbox with enquiry transactions --- src/containers/InboxPage/InboxPage.js | 12 +++++++----- .../InboxPage/__snapshots__/InboxPage.test.js.snap | 8 ++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/containers/InboxPage/InboxPage.js b/src/containers/InboxPage/InboxPage.js index e44cf712..33689e55 100644 --- a/src/containers/InboxPage/InboxPage.js +++ b/src/containers/InboxPage/InboxPage.js @@ -121,10 +121,12 @@ export const InboxItem = props => { const isSaleNotification = !isOrder && propTypes.txIsPreauthorized(tx); const rowNotificationDot = isSaleNotification ?
: null; const lastTransitionedAt = formatDate(intl, tx.attributes.lastTransitionedAt); - const bookingStart = formatDate(intl, booking.attributes.start); - const bookingEnd = formatDate(intl, booking.attributes.end); + const bookingPrice = isOrder ? tx.attributes.payinTotal : tx.attributes.payoutTotal; - const price = formatMoney(intl, bookingPrice); + const hasBookingInfo = !!(booking && bookingPrice); + const bookingStart = hasBookingInfo ? formatDate(intl, booking.attributes.start) : null; + const bookingEnd = hasBookingInfo ? formatDate(intl, booking.attributes.end) : null; + const price = hasBookingInfo ? formatMoney(intl, bookingPrice) : null; const linkClasses = classNames(css.itemLink, { [css.bannedUserLink]: isOtherUserBanned, @@ -146,8 +148,8 @@ export const InboxItem = props => { {otherUserDisplayName}
- {bookingStart.short} - {bookingEnd.short} - {price} + {hasBookingInfo ? `${bookingStart.short} - ${bookingEnd.short}` : null} + {hasBookingInfo ? {price} : null}
diff --git a/src/containers/InboxPage/__snapshots__/InboxPage.test.js.snap b/src/containers/InboxPage/__snapshots__/InboxPage.test.js.snap index 7131cc9e..ca0b6cdd 100644 --- a/src/containers/InboxPage/__snapshots__/InboxPage.test.js.snap +++ b/src/containers/InboxPage/__snapshots__/InboxPage.test.js.snap @@ -359,9 +359,7 @@ exports[`InboxPage matches snapshot 2`] = `
- 2017-02-15 - - - 2017-02-16 + 2017-02-15 - 2017-02-16 @@ -751,9 +749,7 @@ exports[`InboxPage matches snapshot 4`] = `
- 2017-02-15 - - - 2017-02-16 + 2017-02-15 - 2017-02-16