From 0d4f4503a77925d41c1ea177926fab000a747199 Mon Sep 17 00:00:00 2001 From: Alexandre Segura Date: Mon, 14 Oct 2024 06:36:09 +0200 Subject: [PATCH] Move code to Redux actions. --- .../checkout/PaymentMethodEdenred.js | 44 +++---------------- src/redux/Checkout/actions.js | 42 ++++++++++++++++++ 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/src/navigation/checkout/PaymentMethodEdenred.js b/src/navigation/checkout/PaymentMethodEdenred.js index 95de9680b..2f55f0f9a 100644 --- a/src/navigation/checkout/PaymentMethodEdenred.js +++ b/src/navigation/checkout/PaymentMethodEdenred.js @@ -2,16 +2,11 @@ import React, { useEffect } from 'react'; import { connect } from 'react-redux'; import { Button, Text, VStack, HStack, Box, Skeleton } from 'native-base'; import { useTranslation } from 'react-i18next'; -import { authorize } from 'react-native-app-auth'; -import 'react-native-get-random-values'; -import { v4 as uuidv4 } from 'uuid'; import { useNavigation } from '@react-navigation/native'; -import Config from 'react-native-config'; import _ from 'lodash'; import { - updateEdenredCredentials, - loadPaymentDetails, checkout, + loadPaymentDetailsOrAuthorizeEdenred, } from '../../redux/Checkout/actions'; import { selectCart, @@ -20,39 +15,14 @@ import CreditCard from './components/CreditCard'; import { formatPrice } from '../../utils/formatting' import HeaderHeightAwareKeyboardAvoidingView from '../../components/HeaderHeightAwareKeyboardAvoidingView'; -const Edenred = ({ clientId, baseURL, cart, paymentDetailsLoaded, loadPaymentDetails, paymentDetails, errors, checkout, updateEdenredCredentials, authorizationEndpoint }) => { +const Edenred = ({ cart, paymentDetailsLoaded, paymentDetails, errors, checkout, loadPaymentDetailsOrAuthorizeEdenred }) => { const navigation = useNavigation(); const { t } = useTranslation(); useEffect(() => { - if (cart.hasEdenredCredentials) { - loadPaymentDetails() - } else { - authorize({ - clientId: clientId, - redirectUrl: `${Config.APP_AUTH_REDIRECT_SCHEME}://edenred`, - serviceConfiguration: { - authorizationEndpoint: `${authorizationEndpoint}/connect/authorize`, - tokenEndpoint: `${baseURL}/edenred/connect/token`, - }, - additionalParameters: { - acr_values: 'tenant:fr-ctrtku', - nonce: uuidv4(), - ui_locales: 'fr-FR', - }, - scopes: ['openid', 'edg-xp-mealdelivery-api', 'offline_access'], - dangerouslyAllowInsecureHttpRequests: __DEV__, - useNonce: false, - usePKCE: false, - }).then(result => { - updateEdenredCredentials(result.accessToken, result.refreshToken); - }).catch(error => { - console.log(error) - navigation.navigate('CheckoutPaymentMethodCard'); - }); - } - }, [ baseURL, cart.hasEdenredCredentials, clientId, loadPaymentDetails, navigation, updateEdenredCredentials, authorizationEndpoint ]); + loadPaymentDetailsOrAuthorizeEdenred(); + }, [ cart.hasEdenredCredentials, loadPaymentDetailsOrAuthorizeEdenred ]); if (paymentDetailsLoaded && paymentDetails.payments.length === 2) { @@ -104,20 +74,16 @@ const Edenred = ({ clientId, baseURL, cart, paymentDetailsLoaded, loadPaymentDet function mapStateToProps(state) { return { cart: selectCart(state)?.cart, - clientId: state.app.settings.edenred_client_id, - baseURL: state.app.baseURL, paymentDetailsLoaded: state.checkout.paymentDetailsLoaded, paymentDetails: state.checkout.paymentDetails, errors: state.checkout.errors, - authorizationEndpoint: state.app.settings.edenred_authorization_endpoint, }; } function mapDispatchToProps(dispatch) { return { - loadPaymentDetails: () => dispatch(loadPaymentDetails()), - updateEdenredCredentials: (accessToken, refreshToken) => dispatch(updateEdenredCredentials(accessToken, refreshToken)), checkout: (cardholderName, savedCardSelected, saveCard) => dispatch(checkout(cardholderName, savedCardSelected, saveCard, true)), + loadPaymentDetailsOrAuthorizeEdenred: () => dispatch(loadPaymentDetailsOrAuthorizeEdenred()), }; } diff --git a/src/redux/Checkout/actions.js b/src/redux/Checkout/actions.js index b167364ed..a4a599397 100644 --- a/src/redux/Checkout/actions.js +++ b/src/redux/Checkout/actions.js @@ -7,6 +7,10 @@ import { import _ from 'lodash'; import { createAction } from '@reduxjs/toolkit'; import { createAction as createFsAction } from 'redux-actions'; +import { authorize } from 'react-native-app-auth'; +import Config from 'react-native-config'; +import 'react-native-get-random-values'; +import { v4 as uuidv4 } from 'uuid'; import * as Sentry from '@sentry/react-native'; import i18next from 'i18next'; @@ -1899,3 +1903,41 @@ export function setPaymentMethod(paymentMethod, cb) { .catch(e => dispatch(checkoutFailure(e))); }; } + +export function loadPaymentDetailsOrAuthorizeEdenred() { + + return (dispatch, getState) => { + + const cart = selectCart(getState())?.cart; + const { baseURL, settings } = getState().app; + + const clientId = settings.edenred_client_id; + const authorizationEndpoint = settings.edenred_authorization_endpoint; + + if (cart.hasEdenredCredentials) { + dispatch(loadPaymentDetails()); + } else { + authorize({ + clientId: clientId, + redirectUrl: `${Config.APP_AUTH_REDIRECT_SCHEME}://edenred`, + serviceConfiguration: { + authorizationEndpoint: `${authorizationEndpoint}/connect/authorize`, + tokenEndpoint: `${baseURL}/edenred/connect/token`, + }, + additionalParameters: { + acr_values: 'tenant:fr-ctrtku', + nonce: uuidv4(), + ui_locales: 'fr-FR', + }, + scopes: ['openid', 'edg-xp-mealdelivery-api', 'offline_access'], + dangerouslyAllowInsecureHttpRequests: __DEV__, + useNonce: false, + usePKCE: false, + }).then(result => { + dispatch(updateEdenredCredentials(result.accessToken, result.refreshToken)); + }).catch(error => { + NavigationHolder.navigate('CheckoutPaymentMethodCard'); + }); + } + }; +}