Merge pull request #639 from sharetribe/rename-transition-labels

Rename transition label references
This commit is contained in:
Kimmo Puputti 2018-01-12 09:11:23 +02:00 committed by GitHub
commit f66357fc78
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 237 additions and 254 deletions

View file

@ -9,17 +9,17 @@ import {
createReview,
} from '../../util/test-data';
import {
TX_TRANSITION_ACCEPT,
TRANSITION_ACCEPT,
TRANSITION_COMPLETE,
TRANSITION_DECLINE,
TRANSITION_EXPIRE_REVIEW_PERIOD,
TRANSITION_REQUEST,
TRANSITION_REVIEW_1_BY_CUSTOMER,
TRANSITION_REVIEW_1_BY_PROVIDER,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
TX_TRANSITION_ACTOR_CUSTOMER,
TX_TRANSITION_ACTOR_PROVIDER,
TX_TRANSITION_AUTO_COMPLETE_WITHOUT_REVIEWS,
TX_TRANSITION_DECLINE,
TX_TRANSITION_MARK_DELIVERED,
TX_TRANSITION_PREAUTHORIZE,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
} from '../../util/types';
import ActivityFeed from './ActivityFeed';
@ -83,18 +83,18 @@ export const WithTransitions = {
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 8, 10)),
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 8, 12)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_ACCEPT,
transition: TRANSITION_ACCEPT,
}),
// this should not be visible in the feed
createTxTransition({
at: new Date(Date.UTC(2017, 10, 16, 8, 12)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_AUTO_COMPLETE_WITHOUT_REVIEWS,
transition: TRANSITION_EXPIRE_REVIEW_PERIOD,
}),
],
}),
@ -115,37 +115,37 @@ export const WithMessagesTransitionsAndReviews = {
customer: createUser('user1'),
provider: createUser('user2'),
listing: createListing('Listing'),
lastTransition: TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
lastTransition: TRANSITION_REVIEW_2_BY_CUSTOMER,
transitions: [
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 8, 10)),
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 8, 12)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_ACCEPT,
transition: TRANSITION_ACCEPT,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 10, 33)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_DECLINE,
transition: TRANSITION_DECLINE,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 10, 34)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_MARK_DELIVERED,
transition: TRANSITION_COMPLETE,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 11, 34)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
transition: TRANSITION_REVIEW_1_BY_PROVIDER,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 12, 34)),
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
transition: TRANSITION_REVIEW_2_BY_CUSTOMER,
}),
],
reviews: [
@ -211,17 +211,17 @@ export const WithAReviewFromBothUsers = {
{ author: createUser('user2'), subject: createUser('user1') }
),
],
lastTransition: TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
lastTransition: TRANSITION_REVIEW_2_BY_PROVIDER,
transitions: [
createTxTransition({
at: new Date(Date.UTC(2017, 10, 9, 8, 10)),
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
transition: TRANSITION_REVIEW_1_BY_CUSTOMER,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 10, 10, 8, 10)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
transition: TRANSITION_REVIEW_2_BY_PROVIDER,
}),
],
}),
@ -257,12 +257,12 @@ class PagedFeed extends Component {
const trans1 = createTxTransition({
at: dates[0],
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
});
const trans2 = createTxTransition({
at: dates[2],
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_ACCEPT,
transition: TRANSITION_ACCEPT,
});
// Last transition timestamp is interleaved between the last two
@ -270,7 +270,7 @@ class PagedFeed extends Component {
const trans3 = createTxTransition({
at: dates[5],
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_MARK_DELIVERED,
transition: TRANSITION_COMPLETE,
});
// First message timestamp is interleaved between the first two
@ -283,7 +283,7 @@ class PagedFeed extends Component {
const transaction = createTransaction({
id: 'tx1',
lastTransition: TX_TRANSITION_MARK_DELIVERED,
lastTransition: TRANSITION_COMPLETE,
lastTransitionedAt: dates[5],
transitions: [trans1, trans2, trans3],
listing: createListing('listing'),

View file

@ -7,19 +7,19 @@ import { Avatar, InlineTextButton, ReviewRating } from '../../components';
import { formatDate } from '../../util/dates';
import { ensureTransaction, ensureUser, ensureListing, userDisplayName } from '../../util/data';
import {
TX_TRANSITION_ACCEPT,
TRANSITION_ACCEPT,
TRANSITION_CANCEL,
TRANSITION_COMPLETE,
TRANSITION_DECLINE,
TRANSITION_EXPIRE,
TRANSITION_REQUEST,
TRANSITION_REQUEST_AFTER_ENQUIRY,
TRANSITION_REVIEW_1_BY_CUSTOMER,
TRANSITION_REVIEW_1_BY_PROVIDER,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
TX_TRANSITION_ACTOR_CUSTOMER,
TX_TRANSITION_ACTOR_PROVIDER,
TX_TRANSITION_AUTO_DECLINE,
TX_TRANSITION_CANCEL,
TX_TRANSITION_DECLINE,
TX_TRANSITION_MARK_DELIVERED,
TX_TRANSITION_PREAUTHORIZE,
TX_TRANSITION_PREAUTHORIZE_ENQUIRY,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
areReviewsCompleted,
propTypes,
} from '../../util/types';
@ -87,17 +87,17 @@ Review.propTypes = {
// should be rendered in he ActivityFeed
const shouldRenderTransition = transition => {
return [
TX_TRANSITION_PREAUTHORIZE,
TX_TRANSITION_PREAUTHORIZE_ENQUIRY,
TX_TRANSITION_ACCEPT,
TX_TRANSITION_DECLINE,
TX_TRANSITION_AUTO_DECLINE,
TX_TRANSITION_CANCEL,
TX_TRANSITION_MARK_DELIVERED,
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TRANSITION_ACCEPT,
TRANSITION_CANCEL,
TRANSITION_COMPLETE,
TRANSITION_DECLINE,
TRANSITION_EXPIRE,
TRANSITION_REQUEST,
TRANSITION_REQUEST_AFTER_ENQUIRY,
TRANSITION_REVIEW_1_BY_CUSTOMER,
TRANSITION_REVIEW_1_BY_PROVIDER,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
].includes(transition);
};
@ -105,18 +105,18 @@ const shouldRenderTransition = transition => {
// given tx transition.
const isReviewTransition = transition => {
return [
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TRANSITION_REVIEW_1_BY_CUSTOMER,
TRANSITION_REVIEW_1_BY_PROVIDER,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
].includes(transition);
};
const hasUserLeftAReviewFirst = (userRole, lastTransition) => {
return (
(lastTransition === TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST &&
(lastTransition === TRANSITION_REVIEW_1_BY_CUSTOMER &&
userRole === TX_TRANSITION_ACTOR_CUSTOMER) ||
(lastTransition === TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST &&
(lastTransition === TRANSITION_REVIEW_1_BY_PROVIDER &&
userRole === TX_TRANSITION_ACTOR_PROVIDER) ||
areReviewsCompleted(lastTransition)
);
@ -134,11 +134,11 @@ const resolveTransitionMessage = (
const isOwnTransition = transition.by === ownRole;
const currentTransition = transition.transition;
const displayName = otherUsersName;
const deliveredState = lastTransition === TX_TRANSITION_MARK_DELIVERED;
const deliveredState = lastTransition === TRANSITION_COMPLETE;
switch (currentTransition) {
case TX_TRANSITION_PREAUTHORIZE:
case TX_TRANSITION_PREAUTHORIZE_ENQUIRY:
case TRANSITION_REQUEST:
case TRANSITION_REQUEST_AFTER_ENQUIRY:
return isOwnTransition ? (
<FormattedMessage id="ActivityFeed.ownTransitionRequest" values={{ listingTitle }} />
) : (
@ -147,27 +147,27 @@ const resolveTransitionMessage = (
values={{ displayName, listingTitle }}
/>
);
case TX_TRANSITION_ACCEPT:
case TRANSITION_ACCEPT:
return isOwnTransition ? (
<FormattedMessage id="ActivityFeed.ownTransitionAccept" />
) : (
<FormattedMessage id="ActivityFeed.transitionAccept" values={{ displayName }} />
);
case TX_TRANSITION_DECLINE:
case TRANSITION_DECLINE:
return isOwnTransition ? (
<FormattedMessage id="ActivityFeed.ownTransitionDecline" />
) : (
<FormattedMessage id="ActivityFeed.transitionDecline" />
);
case TX_TRANSITION_AUTO_DECLINE:
case TRANSITION_EXPIRE:
return ownRole === TX_TRANSITION_ACTOR_PROVIDER ? (
<FormattedMessage id="ActivityFeed.ownTransitionAutoDecline" />
) : (
<FormattedMessage id="ActivityFeed.transitionAutoDecline" values={{ displayName }} />
);
case TX_TRANSITION_CANCEL:
case TRANSITION_CANCEL:
return <FormattedMessage id="ActivityFeed.transitionCancel" />;
case TX_TRANSITION_MARK_DELIVERED:
case TRANSITION_COMPLETE:
// Show the leave a review link if the state is delivered or
// if current user is not the first to leave a review
const reviewLink =
@ -178,8 +178,8 @@ const resolveTransitionMessage = (
) : null;
return <FormattedMessage id="ActivityFeed.transitionComplete" values={{ reviewLink }} />;
case TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST:
case TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST:
case TRANSITION_REVIEW_1_BY_PROVIDER:
case TRANSITION_REVIEW_1_BY_CUSTOMER:
if (isOwnTransition) {
return <FormattedMessage id="ActivityFeed.ownTransitionReview" values={{ displayName }} />;
} else {
@ -197,8 +197,8 @@ const resolveTransitionMessage = (
/>
);
}
case TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND:
case TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND:
case TRANSITION_REVIEW_2_BY_PROVIDER:
case TRANSITION_REVIEW_2_BY_CUSTOMER:
if (isOwnTransition) {
return <FormattedMessage id="ActivityFeed.ownTransitionReview" values={{ displayName }} />;
} else {
@ -265,11 +265,11 @@ const Transition = props => {
if (isReviewTransition(currentTransition) && areReviewsCompleted(lastTransition)) {
const customerReview =
currentTransition === TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST ||
currentTransition === TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND;
currentTransition === TRANSITION_REVIEW_1_BY_CUSTOMER ||
currentTransition === TRANSITION_REVIEW_2_BY_CUSTOMER;
const providerReview =
currentTransition === TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST ||
currentTransition === TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND;
currentTransition === TRANSITION_REVIEW_1_BY_PROVIDER ||
currentTransition === TRANSITION_REVIEW_2_BY_PROVIDER;
if (customerReview) {
const review = reviewByAuthorId(currentTransaction, customer.id);
reviewComponent = (
@ -300,7 +300,7 @@ const Transition = props => {
};
Transition.propTypes = {
transition: propTypes.txTransition.isRequired,
transition: propTypes.transition.isRequired,
transaction: propTypes.transaction.isRequired,
currentUser: propTypes.currentUser.isRequired,
intl: intlShape.isRequired,

View file

@ -3,13 +3,13 @@ import { types as sdkTypes } from '../../util/sdkLoader';
import {
LINE_ITEM_DAY,
LINE_ITEM_NIGHT,
TX_TRANSITION_ACCEPT,
TRANSITION_ACCEPT,
TRANSITION_CANCEL,
TRANSITION_COMPLETE,
TRANSITION_DECLINE,
TRANSITION_EXPIRE,
TRANSITION_REQUEST,
TX_TRANSITION_ACTOR_CUSTOMER,
TX_TRANSITION_AUTO_DECLINE,
TX_TRANSITION_CANCEL,
TX_TRANSITION_DECLINE,
TX_TRANSITION_MARK_DELIVERED,
TX_TRANSITION_PREAUTHORIZE,
} from '../../util/types';
import config from '../../config';
import BookingBreakdown from './BookingBreakdown';
@ -34,12 +34,12 @@ const exampleTransaction = params => {
attributes: {
createdAt: created,
lastTransitionedAt: created,
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
transitions: [
{
at: created,
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
},
],
@ -206,7 +206,7 @@ export const ProviderSalePreauthorized = {
userRole: 'provider',
unitType: LINE_ITEM_NIGHT,
transaction: exampleTransaction({
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
payinTotal: new Money(4500, CURRENCY),
payoutTotal: new Money(2500, CURRENCY),
lineItems: [
@ -240,7 +240,7 @@ export const ProviderSaleAccepted = {
userRole: 'provider',
unitType: LINE_ITEM_NIGHT,
transaction: exampleTransaction({
lastTransition: TX_TRANSITION_ACCEPT,
lastTransition: TRANSITION_ACCEPT,
payinTotal: new Money(4500, CURRENCY),
payoutTotal: new Money(2500, CURRENCY),
lineItems: [
@ -274,7 +274,7 @@ export const ProviderSaleDeclined = {
userRole: 'provider',
unitType: LINE_ITEM_NIGHT,
transaction: exampleTransaction({
lastTransition: TX_TRANSITION_DECLINE,
lastTransition: TRANSITION_DECLINE,
payinTotal: new Money(4500, CURRENCY),
payoutTotal: new Money(2500, CURRENCY),
lineItems: [
@ -308,7 +308,7 @@ export const ProviderSaleAutoDeclined = {
userRole: 'provider',
unitType: LINE_ITEM_NIGHT,
transaction: exampleTransaction({
lastTransition: TX_TRANSITION_AUTO_DECLINE,
lastTransition: TRANSITION_EXPIRE,
payinTotal: new Money(4500, CURRENCY),
payoutTotal: new Money(2500, CURRENCY),
lineItems: [
@ -342,7 +342,7 @@ export const ProviderSaleDelivered = {
userRole: 'provider',
unitType: LINE_ITEM_NIGHT,
transaction: exampleTransaction({
lastTransition: TX_TRANSITION_MARK_DELIVERED,
lastTransition: TRANSITION_COMPLETE,
payinTotal: new Money(4500, CURRENCY),
payoutTotal: new Money(2500, CURRENCY),
lineItems: [
@ -376,7 +376,7 @@ export const ProviderSaleCanceled = {
userRole: 'provider',
unitType: LINE_ITEM_NIGHT,
transaction: exampleTransaction({
lastTransition: TX_TRANSITION_CANCEL,
lastTransition: TRANSITION_CANCEL,
payinTotal: new Money(0, CURRENCY),
payoutTotal: new Money(0, CURRENCY),
lineItems: [

View file

@ -13,8 +13,8 @@ import {
LINE_ITEM_NIGHT,
LINE_ITEM_PROVIDER_COMMISSION,
txIsCanceled,
txIsDeclinedOrAutodeclined,
txIsDelivered,
txIsCompleted,
txIsDeclinedOrExpired,
propTypes,
} from '../../util/types';
import { daysBetween } from '../../util/dates';
@ -216,9 +216,9 @@ export const BookingBreakdownComponent = props => {
const classes = classNames(rootClassName || css.root, className);
let providerTotalMessageId = 'BookingBreakdown.providerTotalDefault';
if (txIsDelivered(transaction)) {
if (txIsCompleted(transaction)) {
providerTotalMessageId = 'BookingBreakdown.providerTotalDelivered';
} else if (txIsDeclinedOrAutodeclined(transaction)) {
} else if (txIsDeclinedOrExpired(transaction)) {
providerTotalMessageId = 'BookingBreakdown.providerTotalDeclined';
} else if (txIsCanceled(transaction)) {
providerTotalMessageId = 'BookingBreakdown.providerTotalCanceled';

View file

@ -5,9 +5,9 @@ import { renderDeep } from '../../util/test-helpers';
import { types as sdkTypes } from '../../util/sdkLoader';
import {
LINE_ITEM_NIGHT,
TRANSITION_CANCEL,
TRANSITION_REQUEST,
TX_TRANSITION_ACTOR_CUSTOMER,
TX_TRANSITION_CANCEL,
TX_TRANSITION_PREAUTHORIZE,
} from '../../util/types';
import { BookingBreakdownComponent } from './BookingBreakdown';
@ -21,12 +21,12 @@ const exampleTransaction = params => {
attributes: {
createdAt: created,
lastTransitionedAt: created,
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
transitions: [
{
at: created,
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
},
],
@ -136,7 +136,7 @@ describe('BookingBreakdown', () => {
userRole="provider"
unitType={LINE_ITEM_NIGHT}
transaction={exampleTransaction({
lastTransition: TX_TRANSITION_CANCEL,
lastTransition: TRANSITION_CANCEL,
payinTotal: new Money(0, 'USD'),
payoutTotal: new Money(0, 'USD'),
lineItems: [

View file

@ -4,12 +4,12 @@ import classNames from 'classnames';
import {
txHasFirstReview,
txIsAccepted,
txIsAutodeclined,
txIsCanceled,
txIsCompleted,
txIsDeclined,
txIsDelivered,
txIsEnquired,
txIsPreauthorized,
txIsExpired,
txIsRequested,
txIsReviewed,
} from '../../util/types';
import { userDisplayName } from '../../util/data';
@ -212,7 +212,7 @@ export const OrderTitle = props => {
</span>
</h1>
);
} else if (txIsPreauthorized(transaction)) {
} else if (txIsRequested(transaction)) {
return (
<h1 className={classes}>
<span className={css.mainTitle}>
@ -245,7 +245,7 @@ export const OrderTitle = props => {
/>
</h1>
);
} else if (txIsAutodeclined(transaction)) {
} else if (txIsExpired(transaction)) {
return (
<h1 className={classes}>
<FormattedMessage
@ -264,7 +264,7 @@ export const OrderTitle = props => {
</h1>
);
} else if (
txIsDelivered(transaction) ||
txIsCompleted(transaction) ||
txHasFirstReview(transaction) ||
txIsReviewed(transaction)
) {
@ -292,7 +292,7 @@ export const OrderMessage = props => {
} = props;
const classes = classNames(rootClassName || css.transactionInfoMessage, className);
if (!listingDeleted && txIsPreauthorized(transaction)) {
if (!listingDeleted && txIsRequested(transaction)) {
return (
<p className={classes}>
<FormattedMessage id="TransactionPanel.orderPreauthorizedInfo" values={{ providerName }} />
@ -331,7 +331,7 @@ export const SaleTitle = props => {
/>
</h1>
);
} else if (txIsPreauthorized(transaction)) {
} else if (txIsRequested(transaction)) {
return (
<h1 className={classes}>
<FormattedMessage
@ -358,7 +358,7 @@ export const SaleTitle = props => {
/>
</h1>
);
} else if (txIsAutodeclined(transaction)) {
} else if (txIsExpired(transaction)) {
return (
<h1 className={classes}>
<FormattedMessage
@ -377,7 +377,7 @@ export const SaleTitle = props => {
</h1>
);
} else if (
txIsDelivered(transaction) ||
txIsCompleted(transaction) ||
txHasFirstReview(transaction) ||
txIsReviewed(transaction)
) {
@ -405,7 +405,7 @@ export const SaleMessage = props => {
} = props;
const classes = classNames(rootClassName || css.transactionInfoMessage, className);
if (!isCustomerBanned && txIsPreauthorized(transaction)) {
if (!isCustomerBanned && txIsRequested(transaction)) {
return (
<p className={classes}>
<FormattedMessage id="TransactionPanel.saleRequestedInfo" values={{ customerName }} />

View file

@ -2,7 +2,7 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape, FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { txIsEnquired, txIsPreauthorized, propTypes } from '../../util/types';
import { txIsEnquired, txIsRequested, propTypes } from '../../util/types';
import { ensureListing, ensureTransaction, ensureUser } from '../../util/data';
import { isMobileSafari } from '../../util/userAgent';
import { AvatarMedium, AvatarLarge, ResponsiveImage, ReviewModal } from '../../components';
@ -139,8 +139,7 @@ export class TransactionPanelComponent extends Component {
const listingDeleted = listingLoaded && currentListing.attributes.deleted;
const customerLoaded = !!currentCustomer.id;
const isCustomerBanned = customerLoaded && currentCustomer.attributes.banned;
const canShowSaleButtons =
isProvider && txIsPreauthorized(currentTransaction) && !isCustomerBanned;
const canShowSaleButtons = isProvider && txIsRequested(currentTransaction) && !isCustomerBanned;
const isProviderLoaded = !!currentProvider.id;
const isProviderBanned = isProviderLoaded && currentProvider.attributes.banned;
const canShowBookButton = isCustomer && txIsEnquired(currentTransaction) && !isProviderBanned;
@ -208,7 +207,7 @@ export class TransactionPanelComponent extends Component {
this.isMobSaf && this.state.sendMessageFormFocused,
});
const showInfoMessage = listingDeleted || (!listingDeleted && txIsPreauthorized(transaction)); // !!orderInfoMessage;
const showInfoMessage = listingDeleted || (!listingDeleted && txIsRequested(transaction)); // !!orderInfoMessage;
const feedContainerClasses = classNames(css.feedContainer, {
[css.feedContainerWithInfoAbove]: showInfoMessage,

View file

@ -12,13 +12,13 @@ import {
import { renderShallow } from '../../util/test-helpers';
import { fakeIntl } from '../../util/test-data';
import {
TX_TRANSITION_ACCEPT,
TX_TRANSITION_AUTO_DECLINE,
TX_TRANSITION_CANCELED,
TX_TRANSITION_DECLINE,
TX_TRANSITION_ENQUIRE,
TX_TRANSITION_MARK_DELIVERED,
TX_TRANSITION_PREAUTHORIZE,
TRANSITION_ACCEPT,
TRANSITION_CANCELED,
TRANSITION_COMPLETE,
TRANSITION_DECLINE,
TRANSITION_ENQUIRE,
TRANSITION_EXPIRE,
TRANSITION_REQUEST,
} from '../../util/types';
import { BreakdownMaybe } from './TransactionPanel.helpers';
import { TransactionPanelComponent } from './TransactionPanel';
@ -42,43 +42,43 @@ describe('TransactionPanel - Sale', () => {
const txEnquired = createTransaction({
id: 'sale-enquired',
lastTransition: TX_TRANSITION_ENQUIRE,
lastTransition: TRANSITION_ENQUIRE,
...baseTxAttrs,
});
const txPreauthorized = createTransaction({
id: 'sale-preauthorized',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
...baseTxAttrs,
});
const txAccepted = createTransaction({
id: 'sale-accepted',
lastTransition: TX_TRANSITION_ACCEPT,
lastTransition: TRANSITION_ACCEPT,
...baseTxAttrs,
});
const txDeclined = createTransaction({
id: 'sale-declined',
lastTransition: TX_TRANSITION_DECLINE,
lastTransition: TRANSITION_DECLINE,
...baseTxAttrs,
});
const txAutoDeclined = createTransaction({
id: 'sale-autodeclined',
lastTransition: TX_TRANSITION_AUTO_DECLINE,
lastTransition: TRANSITION_EXPIRE,
...baseTxAttrs,
});
const txCanceled = createTransaction({
id: 'sale-canceled',
lastTransition: TX_TRANSITION_CANCELED,
lastTransition: TRANSITION_CANCELED,
...baseTxAttrs,
});
const txDelivered = createTransaction({
id: 'sale-delivered',
lastTransition: TX_TRANSITION_MARK_DELIVERED,
lastTransition: TRANSITION_COMPLETE,
...baseTxAttrs,
});
@ -167,7 +167,7 @@ describe('TransactionPanel - Sale', () => {
it('renders correct total price', () => {
const transaction = createTransaction({
id: 'sale-tx',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
total: new Money(16500, 'USD'),
commission: new Money(1000, 'USD'),
booking: createBooking('booking1', {
@ -207,43 +207,43 @@ describe('TransactionPanel - Order', () => {
const txEnquired = createTransaction({
id: 'order-enquired',
lastTransition: TX_TRANSITION_ENQUIRE,
lastTransition: TRANSITION_ENQUIRE,
...baseTxAttrs,
});
const txPreauthorized = createTransaction({
id: 'order-preauthorized',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
...baseTxAttrs,
});
const txAccepted = createTransaction({
id: 'order-accepted',
lastTransition: TX_TRANSITION_ACCEPT,
lastTransition: TRANSITION_ACCEPT,
...baseTxAttrs,
});
const txDeclined = createTransaction({
id: 'order-declined',
lastTransition: TX_TRANSITION_DECLINE,
lastTransition: TRANSITION_DECLINE,
...baseTxAttrs,
});
const txAutoDeclined = createTransaction({
id: 'order-autodeclined',
lastTransition: TX_TRANSITION_AUTO_DECLINE,
lastTransition: TRANSITION_EXPIRE,
...baseTxAttrs,
});
const txCanceled = createTransaction({
id: 'order-canceled',
lastTransition: TX_TRANSITION_CANCELED,
lastTransition: TRANSITION_CANCELED,
...baseTxAttrs,
});
const txDelivered = createTransaction({
id: 'order-delivered',
lastTransition: TX_TRANSITION_MARK_DELIVERED,
lastTransition: TRANSITION_COMPLETE,
...baseTxAttrs,
});
@ -334,7 +334,7 @@ describe('TransactionPanel - Order', () => {
it('renders correct total price', () => {
const tx = createTransaction({
id: 'order-tx',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
total: new Money(16500, 'USD'),
booking: createBooking('booking1', {
start: new Date(Date.UTC(2017, 5, 10)),

View file

@ -14,8 +14,8 @@ import { unitDivisor, convertMoneyToNumber, convertUnitToSubUnit } from '../../u
import {
LINE_ITEM_DAY,
LINE_ITEM_NIGHT,
TRANSITION_REQUEST,
TX_TRANSITION_ACTOR_CUSTOMER,
TX_TRANSITION_PREAUTHORIZE,
propTypes,
} from '../../util/types';
import config from '../../config';
@ -51,7 +51,7 @@ const estimatedTransaction = (unitType, bookingStart, bookingEnd, unitPrice) =>
attributes: {
createdAt: now,
lastTransitionedAt: now,
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
payinTotal: totalPrice,
payoutTotal: totalPrice,
lineItems: [
@ -68,7 +68,7 @@ const estimatedTransaction = (unitType, bookingStart, bookingEnd, unitPrice) =>
{
at: now,
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
},
],
},

View file

@ -4,7 +4,7 @@ import Decimal from 'decimal.js';
import { types as sdkTypes } from '../../util/sdkLoader';
import { renderShallow } from '../../util/test-helpers';
import { fakeIntl, fakeFormProps } from '../../util/test-data';
import { LINE_ITEM_NIGHT, TX_TRANSITION_PREAUTHORIZE } from '../../util/types';
import { LINE_ITEM_NIGHT, TRANSITION_REQUEST } from '../../util/types';
import { BookingBreakdown } from '../../components';
import { BookingDatesFormComponent } from './BookingDatesForm';
@ -51,7 +51,7 @@ describe('BookingDatesForm', () => {
expect(userRole).toEqual('customer');
expect(booking.attributes.start).toEqual(startDate);
expect(booking.attributes.end).toEqual(endDate);
expect(transaction.attributes.lastTransition).toEqual(TX_TRANSITION_PREAUTHORIZE);
expect(transaction.attributes.lastTransition).toEqual(TRANSITION_REQUEST);
expect(transaction.attributes.payinTotal).toEqual(new Money(2198, 'USD'));
expect(transaction.attributes.payoutTotal).toEqual(new Money(2198, 'USD'));
expect(transaction.attributes.lineItems).toEqual([

View file

@ -1,7 +1,7 @@
import { pick } from 'lodash';
import { updatedEntities, denormalisedEntities } from '../../util/data';
import { storableError } from '../../util/errors';
import { TX_TRANSITION_PREAUTHORIZE } from '../../util/types';
import { TRANSITION_REQUEST } from '../../util/types';
import * as log from '../../util/log';
import { fetchCurrentUserHasOrdersSuccess } from '../../ducks/user.duck';
@ -107,7 +107,7 @@ export const speculateTransactionError = e => ({
export const initiateOrder = (orderParams, initialMessage) => (dispatch, getState, sdk) => {
dispatch(initiateOrderRequest());
const bodyParams = {
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
params: orderParams,
};
return sdk.transactions
@ -161,7 +161,7 @@ export const speculateTransaction = (listingId, bookingStart, bookingEnd) => (
) => {
dispatch(speculateTransactionRequest());
const bodyParams = {
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
params: {
listingId,
bookingStart,

View file

@ -10,10 +10,10 @@ import {
txHasFirstReview,
txIsAccepted,
txIsCanceled,
txIsDeclinedOrAutodeclined,
txIsDelivered,
txIsCompleted,
txIsDeclinedOrExpired,
txIsEnquired,
txIsPreauthorized,
txIsRequested,
txIsReviewed,
propTypes,
} from '../../util/types';
@ -67,7 +67,7 @@ const txState = (intl, tx, isOrder) => {
id: 'InboxPage.stateAccepted',
}),
};
} else if (txIsDeclinedOrAutodeclined(tx)) {
} else if (txIsDeclinedOrExpired(tx)) {
return {
nameClassName: css.nameDeclined,
bookingClassName: css.bookingDeclined,
@ -87,7 +87,7 @@ const txState = (intl, tx, isOrder) => {
id: 'InboxPage.stateCanceled',
}),
};
} else if (txIsDelivered(tx) || txHasFirstReview(tx) || txIsReviewed(tx)) {
} else if (txIsCompleted(tx) || txHasFirstReview(tx) || txIsReviewed(tx)) {
return {
nameClassName: css.nameDelivered,
bookingClassName: css.bookingDelivered,
@ -156,7 +156,7 @@ export const InboxItem = props => {
const otherUserDisplayName = userDisplayName(otherUser, bannedUserDisplayName);
const stateData = txState(intl, tx, isOrder);
const isSaleNotification = !isOrder && txIsPreauthorized(tx);
const isSaleNotification = !isOrder && txIsRequested(tx);
const rowNotificationDot = isSaleNotification ? <div className={css.notificationDot} /> : null;
const lastTransitionedAt = formatDate(intl, tx.attributes.lastTransitionedAt);

View file

@ -10,7 +10,7 @@ import {
} from '../../util/test-data';
import { InboxPageComponent, InboxItem } from './InboxPage';
import routeConfiguration from '../../routeConfiguration';
import { LINE_ITEM_NIGHT, TX_TRANSITION_PREAUTHORIZE } from '../../util/types';
import { LINE_ITEM_NIGHT, TRANSITION_REQUEST } from '../../util/types';
const noop = () => null;
@ -49,7 +49,7 @@ describe('InboxPage', () => {
transactions: [
createTransaction({
id: 'order-1',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
customer,
provider,
lastTransitionedAt: new Date(Date.UTC(2017, 0, 15)),
@ -57,7 +57,7 @@ describe('InboxPage', () => {
}),
createTransaction({
id: 'order-2',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
customer,
provider,
lastTransitionedAt: new Date(Date.UTC(2016, 0, 15)),
@ -103,7 +103,7 @@ describe('InboxPage', () => {
transactions: [
createTransaction({
id: 'sale-1',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
customer,
provider,
lastTransitionedAt: new Date(Date.UTC(2017, 0, 15)),
@ -111,7 +111,7 @@ describe('InboxPage', () => {
}),
createTransaction({
id: 'sale-2',
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
customer,
provider,
lastTransitionedAt: new Date(Date.UTC(2016, 0, 15)),

View file

@ -3,7 +3,7 @@ import { types as sdkTypes } from '../../util/sdkLoader';
import { storableError } from '../../util/errors';
import { addMarketplaceEntities } from '../../ducks/marketplaceData.duck';
import { updatedEntities, denormalisedEntities } from '../../util/data';
import { TX_TRANSITION_ENQUIRE } from '../../util/types';
import { TRANSITION_ENQUIRE } from '../../util/types';
import { fetchCurrentUser } from '../../ducks/user.duck';
const { UUID } = sdkTypes;
@ -130,7 +130,7 @@ export const fetchReviews = listingId => (dispatch, getState, sdk) => {
export const sendEnquiry = (listingId, message) => (dispatch, getState, sdk) => {
dispatch(sendEnquiryRequest());
const bodyParams = {
transition: TX_TRANSITION_ENQUIRE,
transition: TRANSITION_ENQUIRE,
params: { listingId },
};
return sdk.transactions

View file

@ -2,12 +2,12 @@ import { pick } from 'lodash';
import { types as sdkTypes } from '../../util/sdkLoader';
import { isTransactionsTransitionInvalidTransition, storableError } from '../../util/errors';
import {
TX_TRANSITION_ACCEPT,
TX_TRANSITION_DECLINE,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
TRANSITION_ACCEPT,
TRANSITION_DECLINE,
TRANSITION_REVIEW_1_BY_CUSTOMER,
TRANSITION_REVIEW_1_BY_PROVIDER,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
} from '../../util/types';
import * as log from '../../util/log';
import { updatedEntities, denormalisedEntities } from '../../util/data';
@ -254,7 +254,7 @@ export const acceptSale = id => (dispatch, getState, sdk) => {
dispatch(acceptSaleRequest());
return sdk.transactions
.transition({ id, transition: TX_TRANSITION_ACCEPT, params: {} }, { expand: true })
.transition({ id, transition: TRANSITION_ACCEPT, params: {} }, { expand: true })
.then(response => {
dispatch(addMarketplaceEntities(response));
dispatch(acceptSaleSuccess());
@ -265,7 +265,7 @@ export const acceptSale = id => (dispatch, getState, sdk) => {
dispatch(acceptSaleError(storableError(e)));
log.error(e, 'accept-sale-failed', {
txId: id,
transition: TX_TRANSITION_ACCEPT,
transition: TRANSITION_ACCEPT,
});
throw e;
});
@ -278,7 +278,7 @@ export const declineSale = id => (dispatch, getState, sdk) => {
dispatch(declineSaleRequest());
return sdk.transactions
.transition({ id, transition: TX_TRANSITION_DECLINE, params: {} }, { expand: true })
.transition({ id, transition: TRANSITION_DECLINE, params: {} }, { expand: true })
.then(response => {
dispatch(addMarketplaceEntities(response));
dispatch(declineSaleSuccess());
@ -289,7 +289,7 @@ export const declineSale = id => (dispatch, getState, sdk) => {
dispatch(declineSaleError(storableError(e)));
log.error(e, 'reject-sale-failed', {
txId: id,
transition: TX_TRANSITION_DECLINE,
transition: TRANSITION_DECLINE,
});
throw e;
});
@ -374,12 +374,10 @@ export const sendMessage = (txId, message) => (dispatch, getState, sdk) => {
const REVIEW_TX_INCLUDES = ['reviews', 'reviews.author', 'reviews.subject'];
// If other party has already sent a review, we need to make transition to
// TX_TRANSITION_REVIEW_BY_<CUSTOMER/PROVIDER>_SECOND
// TRANSITION_REVIEW_2_BY_<CUSTOMER/PROVIDER>
const sendReviewAsSecond = (id, params, role, dispatch, sdk) => {
const transition =
role === CUSTOMER
? TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND
: TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND;
role === CUSTOMER ? TRANSITION_REVIEW_2_BY_CUSTOMER : TRANSITION_REVIEW_2_BY_PROVIDER;
const include = REVIEW_TX_INCLUDES;
@ -400,15 +398,13 @@ const sendReviewAsSecond = (id, params, role, dispatch, sdk) => {
};
// If other party has not yet sent a review, we need to make transition to
// TX_TRANSITION_REVIEW_BY_<CUSTOMER/PROVIDER>_FIRST
// TRANSITION_REVIEW_1_BY_<CUSTOMER/PROVIDER>
// However, the other party might have made the review after previous data synch point.
// So, error is likely to happen and then we must try another state transition
// by calling sendReviewAsSecond().
const sendReviewAsFirst = (id, params, role, dispatch, sdk) => {
const transition =
role === CUSTOMER
? TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST
: TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST;
role === CUSTOMER ? TRANSITION_REVIEW_1_BY_CUSTOMER : TRANSITION_REVIEW_1_BY_PROVIDER;
const include = REVIEW_TX_INCLUDES;
return sdk.transactions
@ -437,8 +433,8 @@ export const sendReview = (role, tx, reviewRating, reviewContent) => (dispatch,
const txStateOtherPartyFirst =
role === CUSTOMER
? tx.attributes.lastTransition === TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST
: tx.attributes.lastTransition === TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST;
? tx.attributes.lastTransition === TRANSITION_REVIEW_1_BY_PROVIDER
: tx.attributes.lastTransition === TRANSITION_REVIEW_1_BY_CUSTOMER;
dispatch(sendReviewRequest());

View file

@ -8,7 +8,7 @@ import {
fakeIntl,
} from '../../util/test-data';
import { renderShallow } from '../../util/test-helpers';
import { TX_TRANSITION_PREAUTHORIZE } from '../../util/types';
import { TRANSITION_REQUEST } from '../../util/types';
import { TransactionPageComponent } from './TransactionPage';
const noop = () => null;
@ -18,7 +18,7 @@ describe('TransactionPage - Sale', () => {
const txId = 'tx-sale-1';
const transaction = createTransaction({
id: txId,
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
booking: createBooking('booking1', {
start: new Date(Date.UTC(2017, 5, 10)),
end: new Date(Date.UTC(2017, 5, 13)),
@ -60,7 +60,7 @@ describe('TransactionPage - Order', () => {
const txId = 'tx-order-1';
const transaction = createTransaction({
id: txId,
lastTransition: TX_TRANSITION_PREAUTHORIZE,
lastTransition: TRANSITION_REQUEST,
booking: createBooking('booking1', {
start: new Date(Date.UTC(2017, 5, 10)),
end: new Date(Date.UTC(2017, 5, 13)),

View file

@ -1,6 +1,6 @@
import { updatedEntities, denormalisedEntities } from '../util/data';
import { storableError } from '../util/errors';
import { TX_TRANSITION_PREAUTHORIZE, TX_TRANSITION_PREAUTHORIZE_ENQUIRY } from '../util/types';
import { TRANSITION_REQUEST, TRANSITION_REQUEST_AFTER_ENQUIRY } from '../util/types';
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, TX_TRANSITION_PREAUTHORIZE_ENQUIRY],
last_transitions: [TRANSITION_REQUEST, TRANSITION_REQUEST_AFTER_ENQUIRY],
page: 1,
per_page: NOTIFICATION_PAGE_SIZE,
};

View file

@ -2,10 +2,10 @@ import Decimal from 'decimal.js';
import { types as sdkTypes } from './sdkLoader';
import { nightsBetween } from '../util/dates';
import {
TX_TRANSITION_ACCEPT,
TRANSITION_ACCEPT,
TRANSITION_REQUEST,
TX_TRANSITION_ACTOR_CUSTOMER,
TX_TRANSITION_ACTOR_PROVIDER,
TX_TRANSITION_PREAUTHORIZE,
} from '../util/types';
const { UUID, LatLng, Money } = sdkTypes;
@ -96,7 +96,7 @@ export const createTxTransition = options => {
return {
at: new Date(Date.UTC(2017, 4, 1)),
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
...options,
};
};
@ -104,7 +104,7 @@ export const createTxTransition = options => {
export const createTransaction = options => {
const {
id,
lastTransition = TX_TRANSITION_ACCEPT,
lastTransition = TRANSITION_ACCEPT,
total = new Money(1000, 'USD'),
commission = new Money(100, 'USD'),
booking = null,
@ -117,12 +117,12 @@ export const createTransaction = options => {
createTxTransition({
at: new Date(Date.UTC(2017, 4, 1)),
by: TX_TRANSITION_ACTOR_CUSTOMER,
transition: TX_TRANSITION_PREAUTHORIZE,
transition: TRANSITION_REQUEST,
}),
createTxTransition({
at: new Date(Date.UTC(2017, 5, 1)),
by: TX_TRANSITION_ACTOR_PROVIDER,
transition: TX_TRANSITION_ACCEPT,
transition: TRANSITION_ACCEPT,
}),
],
} = options;

View file

@ -160,62 +160,56 @@ propTypes.booking = shape({
}),
});
// When the customer requests a booking, a transaction is created. The
// initial state is preauthorized that is transitioned with the
// initial preauthorize transition. The customer can see this
// transaction in the OrderPage that is linked from the InboxPage. The
// provider sees the transaction in the SalePage.
export const TX_TRANSITION_PREAUTHORIZE = 'transition/preauthorize';
// When a customer makes a booking to a listing, a transaction is
// created with the initial request transition.
export const TRANSITION_REQUEST = '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';
// then transition that with a request.
export const TRANSITION_ENQUIRE = 'transition/enquire';
export const TRANSITION_REQUEST_AFTER_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';
export const TX_TRANSITION_DECLINE = 'transition/decline';
export const TRANSITION_ACCEPT = 'transition/accept';
export const TRANSITION_DECLINE = 'transition/decline';
// If the backend automatically declines the transaction, it is
// transitioned with the auto-decline transition.
export const TX_TRANSITION_AUTO_DECLINE = 'transition/auto-decline';
// The backend automatically expire the transaction.
export const TRANSITION_EXPIRE = 'transition/auto-decline';
// Admin can also cancel the transition.
export const TX_TRANSITION_CANCEL = 'transition/cancel';
export const TRANSITION_CANCEL = 'transition/cancel';
// If the is marked as delivered in the backend, it is transitioned
// with the mark-delivered transition.
export const TX_TRANSITION_MARK_DELIVERED = 'transition/mark-delivered';
// The backend will mark the transaction completed.
export const TRANSITION_COMPLETE = 'transition/mark-delivered';
// Review transitions
// Reviews are given through transaction transitions.
// Either party (provider or customer) can be the first to give a review.
export const TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST = 'transition/review-by-provider-first';
export const TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND = 'transition/review-by-provider-second';
export const TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST = 'transition/review-by-customer-first';
export const TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND = 'transition/review-by-customer-second';
export const TX_TRANSITION_MARK_REVIEWED_BY_CUSTOMER = 'transition/mark-reviewed-by-customer';
export const TX_TRANSITION_MARK_REVIEWED_BY_PROVIDER = 'transition/mark-reviewed-by-provider';
export const TX_TRANSITION_AUTO_COMPLETE_WITHOUT_REVIEWS =
'transition/auto-complete-without-reviews';
// Reviews are given through transaction transitions. Review 1 can be
// by provider or customer, and review 2 will be the other party of
// the transaction.
export const TRANSITION_REVIEW_1_BY_PROVIDER = 'transition/review-by-provider-first';
export const TRANSITION_REVIEW_2_BY_PROVIDER = 'transition/review-by-provider-second';
export const TRANSITION_REVIEW_1_BY_CUSTOMER = 'transition/review-by-customer-first';
export const TRANSITION_REVIEW_2_BY_CUSTOMER = 'transition/review-by-customer-second';
export const TRANSITION_EXPIRE_CUSTOMER_REVIEW_PERIOD = 'transition/mark-reviewed-by-customer';
export const TRANSITION_EXPIRE_PROVIDER_REVIEW_PERIOD = 'transition/mark-reviewed-by-provider';
export const TRANSITION_EXPIRE_REVIEW_PERIOD = '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,
TX_TRANSITION_AUTO_DECLINE,
TX_TRANSITION_CANCEL,
TX_TRANSITION_MARK_DELIVERED,
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TX_TRANSITION_MARK_REVIEWED_BY_CUSTOMER,
TX_TRANSITION_MARK_REVIEWED_BY_PROVIDER,
TX_TRANSITION_AUTO_COMPLETE_WITHOUT_REVIEWS,
export const TRANSITIONS = [
TRANSITION_ACCEPT,
TRANSITION_CANCEL,
TRANSITION_COMPLETE,
TRANSITION_DECLINE,
TRANSITION_ENQUIRE,
TRANSITION_EXPIRE,
TRANSITION_EXPIRE_CUSTOMER_REVIEW_PERIOD,
TRANSITION_EXPIRE_PROVIDER_REVIEW_PERIOD,
TRANSITION_EXPIRE_REVIEW_PERIOD,
TRANSITION_REQUEST,
TRANSITION_REQUEST_AFTER_ENQUIRY,
TRANSITION_REVIEW_1_BY_CUSTOMER,
TRANSITION_REVIEW_1_BY_PROVIDER,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
];
// Roles of actors that perform transaction transitions
@ -233,52 +227,46 @@ export const TX_TRANSITION_ACTORS = [
const txLastTransition = tx => ensureTransaction(tx).attributes.lastTransition;
export const txIsEnquired = tx => txLastTransition(tx) === TX_TRANSITION_ENQUIRE;
export const txIsEnquired = tx => txLastTransition(tx) === TRANSITION_ENQUIRE;
export const txIsPreauthorized = tx => {
export const txIsRequested = tx => {
const transition = txLastTransition(tx);
return (
transition === TX_TRANSITION_PREAUTHORIZE || transition === TX_TRANSITION_PREAUTHORIZE_ENQUIRY
);
return transition === TRANSITION_REQUEST || transition === TRANSITION_REQUEST_AFTER_ENQUIRY;
};
export const txIsAccepted = tx => txLastTransition(tx) === TX_TRANSITION_ACCEPT;
export const txIsAccepted = tx => txLastTransition(tx) === TRANSITION_ACCEPT;
export const txIsDeclined = tx => txLastTransition(tx) === TX_TRANSITION_DECLINE;
export const txIsDeclined = tx => txLastTransition(tx) === TRANSITION_DECLINE;
export const txIsAutodeclined = tx => txLastTransition(tx) === TX_TRANSITION_AUTO_DECLINE;
export const txIsExpired = tx => txLastTransition(tx) === TRANSITION_EXPIRE;
export const txIsDeclinedOrAutodeclined = tx => txIsDeclined(tx) || txIsAutodeclined(tx);
export const txIsDeclinedOrExpired = tx => txIsDeclined(tx) || txIsExpired(tx);
export const txIsCanceled = tx => txLastTransition(tx) === TX_TRANSITION_CANCEL;
export const txIsCanceled = tx => txLastTransition(tx) === TRANSITION_CANCEL;
export const txIsDelivered = tx => txLastTransition(tx) === TX_TRANSITION_MARK_DELIVERED;
export const txIsCompleted = tx => txLastTransition(tx) === TRANSITION_COMPLETE;
export const txHasFirstReview = tx => firstReviewTransitions.includes(txLastTransition(tx));
export const txIsReviewed = tx => areReviewsCompleted(txLastTransition(tx));
// TODO: rename to `transition`
propTypes.txTransition = shape({
propTypes.transition = shape({
at: instanceOf(Date).isRequired,
by: oneOf(TX_TRANSITION_ACTORS).isRequired,
transition: oneOf(TX_TRANSITIONS).isRequired,
transition: oneOf(TRANSITIONS).isRequired,
});
const firstReviewTransitions = [
TX_TRANSITION_REVIEW_BY_PROVIDER_FIRST,
TX_TRANSITION_REVIEW_BY_CUSTOMER_FIRST,
];
const firstReviewTransitions = [TRANSITION_REVIEW_1_BY_CUSTOMER, TRANSITION_REVIEW_1_BY_PROVIDER];
// Check if tx transition is followed by a state where
// reviews are completed
export const areReviewsCompleted = transition => {
return [
TX_TRANSITION_REVIEW_BY_PROVIDER_SECOND,
TX_TRANSITION_REVIEW_BY_CUSTOMER_SECOND,
TX_TRANSITION_MARK_REVIEWED_BY_CUSTOMER,
TX_TRANSITION_MARK_REVIEWED_BY_PROVIDER,
TX_TRANSITION_AUTO_COMPLETE_WITHOUT_REVIEWS,
TRANSITION_EXPIRE_CUSTOMER_REVIEW_PERIOD,
TRANSITION_EXPIRE_PROVIDER_REVIEW_PERIOD,
TRANSITION_EXPIRE_REVIEW_PERIOD,
TRANSITION_REVIEW_2_BY_CUSTOMER,
TRANSITION_REVIEW_2_BY_PROVIDER,
].includes(transition);
};
@ -318,7 +306,7 @@ propTypes.transaction = shape({
attributes: shape({
createdAt: instanceOf(Date).isRequired,
lastTransitionedAt: instanceOf(Date).isRequired,
lastTransition: oneOf(TX_TRANSITIONS).isRequired,
lastTransition: oneOf(TRANSITIONS).isRequired,
// An enquiry won't need a total sum nor a booking so these are
// optional.
@ -335,7 +323,7 @@ propTypes.transaction = shape({
reversal: bool.isRequired,
})
).isRequired,
transitions: arrayOf(propTypes.txTransition).isRequired,
transitions: arrayOf(propTypes.transition).isRequired,
}),
booking: propTypes.booking,
listing: propTypes.listing,