From d3f750048b01ee6d546b0e2b06f7e59ef5bb7acf Mon Sep 17 00:00:00 2001 From: Payton Swick Date: Thu, 8 Aug 2019 14:01:23 -0400 Subject: [PATCH] EditCardDetails: Refactor to a functional component --- .../payment/edit-card-details/index.jsx | 147 ++++++++---------- 1 file changed, 63 insertions(+), 84 deletions(-) diff --git a/client/me/purchases/payment/edit-card-details/index.jsx b/client/me/purchases/payment/edit-card-details/index.jsx index de4504f2e3fb6e..7c0a4e773e5b07 100644 --- a/client/me/purchases/payment/edit-card-details/index.jsx +++ b/client/me/purchases/payment/edit-card-details/index.jsx @@ -5,7 +5,7 @@ */ import page from 'page'; import PropTypes from 'prop-types'; -import React, { Component, Fragment } from 'react'; +import React, { Fragment } from 'react'; import { connect } from 'react-redux'; /** @@ -26,105 +26,84 @@ import { getByPurchaseId, hasLoadedUserPurchasesFromServer } from 'state/purchas import { getCurrentUserId } from 'state/current-user/selectors'; import { getSelectedSite } from 'state/ui/selectors'; import { getStoredCardById, hasLoadedStoredCardsFromServer } from 'state/stored-cards/selectors'; -import { isDataLoading } from 'me/purchases/utils'; import { isRequestingSites } from 'state/sites/selectors'; import { managePurchase, purchasesRoot } from 'me/purchases/paths'; import { recordTracksEvent } from 'state/analytics/actions'; -class EditCardDetails extends Component { - static propTypes = { - card: PropTypes.object, - clearPurchases: PropTypes.func.isRequired, - hasLoadedSites: PropTypes.bool.isRequired, - hasLoadedStoredCardsFromServer: PropTypes.bool.isRequired, - hasLoadedUserPurchasesFromServer: PropTypes.bool.isRequired, - purchaseId: PropTypes.number.isRequired, - purchase: PropTypes.object, - selectedSite: PropTypes.object, - siteSlug: PropTypes.string.isRequired, - userId: PropTypes.number, - }; - - createCardToken = ( ...args ) => createCardToken( 'card_update', ...args ); - - redirectIfDataIsInvalid( props = this.props ) { - if ( isDataLoading( props ) ) { - return true; - } +function EditCardDetails( props ) { + const isDataLoading = ! props.hasLoadedSites || ! props.hasLoadedUserPurchasesFromServer; + const isDataValid = ( { purchase, selectedSite } ) => purchase && selectedSite; - if ( ! this.isDataValid( props ) ) { - page( purchasesRoot ); - } + if ( ! isDataLoading && ! isDataValid( props ) ) { + // Redirect if invalid data + page( purchasesRoot ); } - isDataValid( props = this.props ) { - const { purchase, selectedSite } = props; + if ( isDataLoading || ! props.hasLoadedStoredCardsFromServer ) { + return ( + + + + - return purchase && selectedSite; + + + ); } - recordFormSubmitEvent = () => - void this.props.recordTracksEvent( 'calypso_purchases_credit_card_form_submit', { - product_slug: this.props.purchase.productSlug, + const recordFormSubmitEvent = () => + void props.recordTracksEvent( 'calypso_purchases_credit_card_form_submit', { + product_slug: props.purchase.productSlug, } ); - successCallback = () => { - const { id } = this.props.purchase; - - this.props.clearPurchases(); - - page( managePurchase( this.props.siteSlug, id ) ); + const successCallback = () => { + const { id } = props.purchase; + props.clearPurchases(); + page( managePurchase( props.siteSlug, id ) ); }; - componentWillMount() { - this.redirectIfDataIsInvalid(); - } - - componentWillReceiveProps( nextProps ) { - this.redirectIfDataIsInvalid( nextProps ); - } - - render() { - if ( isDataLoading( this.props ) || ! this.props.hasLoadedStoredCardsFromServer ) { - return ( - - - - - - - - ); - } - - return ( -
- - - - { titles.editCardDetails } - - - -
- ); - } + const createCardUpdateToken = ( ...args ) => createCardToken( 'card_update', ...args ); + + return ( +
+ + + + { titles.editCardDetails } + + + +
+ ); } +EditCardDetails.propTypes = { + card: PropTypes.object, + clearPurchases: PropTypes.func.isRequired, + hasLoadedSites: PropTypes.bool.isRequired, + hasLoadedStoredCardsFromServer: PropTypes.bool.isRequired, + hasLoadedUserPurchasesFromServer: PropTypes.bool.isRequired, + purchaseId: PropTypes.number.isRequired, + purchase: PropTypes.object, + selectedSite: PropTypes.object, + siteSlug: PropTypes.string.isRequired, + userId: PropTypes.number, +}; + const mapStateToProps = ( state, { cardId, purchaseId } ) => ( { card: getStoredCardById( state, cardId ), hasLoadedSites: ! isRequestingSites( state ),