diff --git a/CHANGELOG.md b/CHANGELOG.md index 98dc8eace..91ee9c211 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,22 @@ https://github.com/sharetribe/flex-template-web/ ## Upcoming version 2020-XX-XX +## [v8.4.1] 2020-10-20 + +### Updates from upstream (FTW-daily v6.4.1) + +- [add] Add new Stripe countires Bulgaria, Cyprus, Czech Republic, Malta and Romania to the + `StripeConnectAccountForm`. Also reorder BANK_CODE & BRANCH_CODE in UI to more logical order. + [#1371](https://github.com/sharetribe/ftw-daily/pull/1371) +- [fix] Don't pass protected data key through `ConfirmSignupForm` if protected data is empty. + [#1370](https://github.com/sharetribe/ftw-daily/pull/1370) +- [add] Update French translation file (Spanish and German translations have still missing keys). + [#1369](https://github.com/sharetribe/ftw-daily/pull/1369) +- [fix] Pass additional values from `ConfirmSignupForm` forward as user's protected data. + [#1368](https://github.com/sharetribe/ftw-daily/pull/1368) + + [v8.4.1]: https://github.com/sharetribe/ftw-hourly/compare/v8.4.0...v8.4.1 + ## [v8.4.0] 2020-10-15 ### Updates from upstream (FTW-daily v6.4.0) diff --git a/package.json b/package.json index e8c6f787e..5cc2f4164 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "8.4.0", + "version": "8.4.1", "private": true, "license": "Apache-2.0", "dependencies": { diff --git a/src/components/StripeBankAccountTokenInputField/StripeBankAccountTokenInputField.util.js b/src/components/StripeBankAccountTokenInputField/StripeBankAccountTokenInputField.util.js index e638940ea..ab82c7b23 100644 --- a/src/components/StripeBankAccountTokenInputField/StripeBankAccountTokenInputField.util.js +++ b/src/components/StripeBankAccountTokenInputField/StripeBankAccountTokenInputField.util.js @@ -38,10 +38,10 @@ export const BANK_ACCOUNT_INPUTS = [ TRANSIT_NUMBER, INSTITUTION_NUMBER, CLEARING_CODE, - BRANCH_NAME, - BRANCH_CODE, BANK_NAME, BANK_CODE, + BRANCH_NAME, + BRANCH_CODE, SORT_CODE, ROUTING_NUMBER, ACCOUNT_OWNER_NAME, @@ -165,6 +165,9 @@ export const mapInputsToStripeAccountKeys = (country, values) => { switch (country) { case 'AT': case 'BE': + case 'BG': + case 'CY': + case 'CZ': case 'DK': case 'EE': case 'FI': @@ -176,9 +179,11 @@ export const mapInputsToStripeAccountKeys = (country, values) => { case 'LV': case 'LT': case 'LU': + case 'MT': case 'NL': case 'PL': case 'PT': + case 'RO': case 'SK': case 'SI': case 'ES': diff --git a/src/containers/AuthenticationPage/AuthenticationPage.js b/src/containers/AuthenticationPage/AuthenticationPage.js index c9a5579db..2f6f006a5 100644 --- a/src/containers/AuthenticationPage/AuthenticationPage.js +++ b/src/containers/AuthenticationPage/AuthenticationPage.js @@ -42,6 +42,7 @@ import { manageDisableScrolling } from '../../ducks/UI.duck'; import css from './AuthenticationPage.css'; import { FacebookLogo } from './socialLoginLogos'; +import { isEmpty } from 'lodash'; export class AuthenticationPageComponent extends Component { constructor(props) { @@ -76,7 +77,7 @@ export class AuthenticationPageComponent extends Component { submitLogin, submitSignup, confirmError, - submitSinguoWithIdp, + submitSingupWithIdp, tab, sendVerificationEmailInProgress, sendVerificationEmailError, @@ -176,7 +177,7 @@ export class AuthenticationPageComponent extends Component { const handleSubmitConfirm = values => { const { idpToken, email, firstName, lastName, idpId } = this.state.authInfo; - const { email: newEmail, firstName: newFirstName, lastName: newLastName } = values; + const { email: newEmail, firstName: newFirstName, lastName: newLastName, ...rest } = values; // Pass email, fistName or lastName to Flex API only if user has edited them // sand they can't be fetched directly from idp provider (e.g. Facebook) @@ -187,10 +188,14 @@ export class AuthenticationPageComponent extends Component { ...(newLastName !== lastName && { lastName: newLastName }), }; - submitSinguoWithIdp({ + // If the confirm form has any additional values, pass them forward as user's protected data + const protectedData = !isEmpty(rest) ? { ...rest } : null; + + submitSingupWithIdp({ idpToken, idpId, ...authParams, + ...(!!protectedData && { protectedData }), }); }; @@ -449,7 +454,7 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => ({ submitLogin: ({ email, password }) => dispatch(login(email, password)), submitSignup: params => dispatch(signup(params)), - submitSinguoWithIdp: params => dispatch(signupWithIdp(params)), + submitSingupWithIdp: params => dispatch(signupWithIdp(params)), onResendVerificationEmail: () => dispatch(sendVerificationEmail()), onManageDisableScrolling: (componentId, disableScrolling) => dispatch(manageDisableScrolling(componentId, disableScrolling)), diff --git a/src/ducks/Auth.duck.js b/src/ducks/Auth.duck.js index db11c1ecf..3c5414517 100644 --- a/src/ducks/Auth.duck.js +++ b/src/ducks/Auth.duck.js @@ -55,7 +55,7 @@ const initialState = { signupInProgress: false, // confirm (create use with idp) - confirmErro: null, + confirmError: null, confirmInProgress: false, }; diff --git a/src/stripe-config.js b/src/stripe-config.js index f656058a6..895852068 100644 --- a/src/stripe-config.js +++ b/src/stripe-config.js @@ -21,7 +21,7 @@ export const defaultMCC = '5734'; Stripe only supports payments in certain countries, see full list at https://stripe.com/global -You can find the bank account formats from https://stripe.com/docs/connect/payouts#formats +You can find the bank account formats from https://stripe.com/docs/connect/payouts-bank-accounts */ export const stripeCountryDetails = [ @@ -50,6 +50,14 @@ export const stripeCountryDetails = [ iban: true, }, }, + { + //Bulgraia + code: 'BG', + currency: 'BGN', + accountConfig: { + iban: true, + }, + }, { // Canada code: 'CA', @@ -60,6 +68,22 @@ export const stripeCountryDetails = [ accountNumber: true, }, }, + { + //Cyprus + code: 'CY', + currency: 'EUR', + accountConfig: { + iban: true, + }, + }, + { + // Czech Republic + code: 'CZ', + currency: 'CZK', + accountConfig: { + iban: true, + }, + }, { // Denmark code: 'DK', @@ -171,6 +195,14 @@ export const stripeCountryDetails = [ iban: true, }, }, + { + // Malta + code: 'MT', + currency: 'EUR', + accountConfig: { + iban: true, + }, + }, { // Mexico code: 'MX', @@ -219,6 +251,14 @@ export const stripeCountryDetails = [ iban: true, }, }, + { + // Romania + code: 'RO', + currency: 'RON', + accountConfig: { + iban: true, + }, + }, { // Singapore code: 'SG', diff --git a/src/translations/en.json b/src/translations/en.json index 5b0f72980..49c2c925e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -965,7 +965,10 @@ "StripeConnectAccountForm.countryNames.AT": "Austria", "StripeConnectAccountForm.countryNames.AU": "Australia", "StripeConnectAccountForm.countryNames.BE": "Belgium", + "StripeConnectAccountForm.countryNames.BG": "Bulgaria", "StripeConnectAccountForm.countryNames.CA": "Canada", + "StripeConnectAccountForm.countryNames.CY": "Cyprus", + "StripeConnectAccountForm.countryNames.CZ": "Czech Republic", "StripeConnectAccountForm.countryNames.CH": "Switzerland", "StripeConnectAccountForm.countryNames.DE": "Germany", "StripeConnectAccountForm.countryNames.GR": "Greece", @@ -982,12 +985,14 @@ "StripeConnectAccountForm.countryNames.LT": "Lithuania", "StripeConnectAccountForm.countryNames.LV": "Latvia", "StripeConnectAccountForm.countryNames.LU": "Luxembourg", + "StripeConnectAccountForm.countryNames.MT": "Malta", "StripeConnectAccountForm.countryNames.MX": "Mexico", "StripeConnectAccountForm.countryNames.NL": "Netherlands", "StripeConnectAccountForm.countryNames.NO": "Norway", "StripeConnectAccountForm.countryNames.NZ": "New Zealand", "StripeConnectAccountForm.countryNames.PL": "Poland", "StripeConnectAccountForm.countryNames.PT": "Portugal", + "StripeConnectAccountForm.countryNames.RO": "Romania", "StripeConnectAccountForm.countryNames.SE": "Sweden", "StripeConnectAccountForm.countryNames.SI": "Slovenia", "StripeConnectAccountForm.countryNames.SK": "Slovakia", diff --git a/src/translations/fr.json b/src/translations/fr.json index 3f2d913af..6baabd796 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -17,11 +17,15 @@ "ActivityFeed.transitionExpire": "La demande de réservation a expiré. { displayName } n'a pas répondu assez vite.", "ActivityFeed.transitionRequest": "{ displayName } souhaite réserver un cours avec vous.", "ActivityFeed.transitionReview": "{ displayName } vous a laissé un commentaire. { reviewLink }", + "AuthenticationPage.confirmSignupInfoText": "Veuillez vérifier que vos informations sont correctes.", + "AuthenticationPage.confirmSignupWithIdpTitle": "S'inscrire avec {idp}", "AuthenticationPage.emailAlreadyInUse": "Un compte utilisant cette adresse email existe déjà. Peut-être pourriez-vous essayer de vous connecter ?", "AuthenticationPage.fixEmail": "Oups, une erreur dans votre email ? {fixEmailLink}.", "AuthenticationPage.fixEmailLinkText": "La corriger", "AuthenticationPage.loginFailed": "Cette combinaison d'email et mot de passe n'existe pas. Pourriez-vous vérifier et essayer de nouveau ?", "AuthenticationPage.loginLinkText": "Se connecter", + "AuthenticationPage.loginWithFacebook": "Se connecter avec Facebook", + "AuthenticationPage.or": "ou", "AuthenticationPage.resendEmail": "Vous n'avez pas reçu l'email ? {resendEmailLink}.", "AuthenticationPage.resendEmailLinkText": "Demandez le de nouveau", "AuthenticationPage.resendFailed": "L'envoi de l'email de vérification a échoué. Veuillez essayer de nouveau.", @@ -32,6 +36,7 @@ "AuthenticationPage.signupFailed": "L'inscription a échoué. Assurez vous que toutes les informations entrées sont correctes et essayez de nouveau.", "AuthenticationPage.signupFailedEmailAlreadyTaken": "Un compte utilisant cette adresse email existe déjà. Peut-être pourriez-vous essayer de vous connecter ?", "AuthenticationPage.signupLinkText": "S'inscrire", + "AuthenticationPage.signupWithFacebook": "S'inscrire avec Facebook", "AuthenticationPage.termsHeading": "Conditions d'utilisation", "AuthenticationPage.verifyEmailClose": "PLUS TARD", "AuthenticationPage.verifyEmailText": "Merci de nous avoir rejoint ! Il ne reste plus qu'une petite étape. Pour que nous puissions vous contacter, nous devons vérifier votre adresse email. Veuillez cliquer sur le lien que nous venons d'envoyer à {email}.", @@ -96,7 +101,8 @@ "CheckoutPage.initiateOrderAmountTooLow": "Nous n'avons pas pu traiter votre paiement car son montant total est trop faible. Veuillez contacter les administrateurs de la place de marché.", "CheckoutPage.initiateOrderError": "Le paiement a échoué. Veuillez retourner sur {listingLink} et essayer de nouveau. Si cela persiste, essayez de rafraîchir la page ou contactez les administrateurs de la place de marché.", "CheckoutPage.initiateOrderStripeError": "Le système de paiement a rencontré les erreurs suivantes : {stripeErrors}", - "CheckoutPage.listingNotFoundError": "Navré, le profil de ce professeur n'est plus disponible.", + "CheckoutPage.listingNotFoundError": "Hélas, cette annonce n'est plus disponible.", + "CheckoutPage.loadingData": "Chargement des données…", "CheckoutPage.paymentExpiredMessage": "Le paiement n'a pas été finalisé sous 15 minutes. Veuillez retourner à {listingLink} et essayer de nouveau.", "CheckoutPage.paymentInfo": "Vous ne serez facturé que si votre demande est acceptée par l'hôte.", "CheckoutPage.perDay": "par jour", @@ -108,6 +114,19 @@ "CheckoutPage.speculateFailedMessage": "Oups, quelque chose n'a pas fonctionné. Veuillez rafraîchir la page et essayer de nouveau.", "CheckoutPage.speculateTransactionError": "Impossible de charger les détails de la réservation.", "CheckoutPage.title": "Réserver {listingTitle}", + "ConfirmSignupForm.emailInvalid": "Une adresse email valide est requise", + "ConfirmSignupForm.emailLabel": "Email", + "ConfirmSignupForm.emailPlaceholder": "john.doe@example.com", + "ConfirmSignupForm.emailRequired": "Vous devez préciser une adresse email.", + "ConfirmSignupForm.firstNameLabel": "Prénom", + "ConfirmSignupForm.firstNamePlaceholder": "John", + "ConfirmSignupForm.firstNameRequired": "Vous devez préciser un prénom.", + "ConfirmSignupForm.lastNameLabel": "Nom de famille", + "ConfirmSignupForm.lastNamePlaceholder": "Doe", + "ConfirmSignupForm.lastNameRequired": "Vous devez préciser un nom de famille.", + "ConfirmSignupForm.signUp": "Continuer avec {idp}", + "ConfirmSignupForm.termsAndConditionsAcceptText": "En vous inscrivant, vous acceptez les {termsLink}", + "ConfirmSignupForm.termsAndConditionsLinkText": "conditions d'utilisations", "ContactDetailsForm.confirmChangesInfo": "Pour modifier votre adresse email, veuillez entrer votre mot de passe.", "ContactDetailsForm.confirmChangesTitle": "Confirmer les modifications", "ContactDetailsForm.emailInvalid": "Une adresse email valide est requise", @@ -130,6 +149,10 @@ "ContactDetailsForm.phoneLabel": "Numéro de téléphone", "ContactDetailsForm.phonePlaceholder": "Entrez votre numéro de téléphone", "ContactDetailsForm.resendEmailVerificationText": "Envoyer de nouveau l'email de vérification.", + "ContactDetailsForm.resetPasswordInfo": "Avez-vous oublié votre mot de passe ou n'en avez-vous pas encore un ?{resetPasswordLink}", + "ContactDetailsForm.resetPasswordLinkSent": "Les instructions pour réinitialiser votre mot de passe ont été envoyées à {email}.", + "ContactDetailsForm.resetPasswordLinkText": "Envoyer les instructions de réinitialisation.", + "ContactDetailsForm.resendPasswordLinkText": "Renvoyer les instructions.", "ContactDetailsForm.saveChanges": "Enregistrer les modifications", "ContactDetailsForm.tooManyVerificationRequests": "Trop d'email de vérification ont été envoyés.", "ContactDetailsPage.heading": "Mes informations de contact", @@ -477,6 +500,10 @@ "PasswordChangeForm.passwordRequired": "Le mot de passe actuel est requis.", "PasswordChangeForm.passwordTooLong": "Le mot de passe ne doit pas contenir plus de {maxLength} caractères", "PasswordChangeForm.passwordTooShort": "Le mot de passe doit contenir au moins {minLength} caractères", + "PasswordChangeForm.resetPasswordInfo": "Avez-vous oublié votre mot de passe ou n'en avez-vous pas encore un ?{resetPasswordLink}", + "PasswordChangeForm.resetPasswordLinkSent": "Les instructions pour réinitialiser votre mot de passe ont été envoyées à {email}.", + "PasswordChangeForm.resetPasswordLinkText": "Envoyer les instructions de réinitialisation.", + "PasswordChangeForm.resendPasswordLinkText": "Renvoyer les instructions.", "PasswordChangeForm.saveChanges": "Enregistrer les modifications", "PasswordChangePage.heading": "Mon mot de passe", "PasswordChangePage.title": "Mot de passe", @@ -520,7 +547,7 @@ "PaymentMethodsForm.billingDetailsNamePlaceholder": "Entrez votre nom…", "PaymentMethodsForm.paymentCardDetails": "Détails de la carte de paiement", "PaymentMethodsForm.genericError": "Erreur dans les informations de paiement. Veuillez essayer de nouveau.", - "PaymentMethodsForm.confirmCardPaymentError": "Nous n'avons pas pu certifier votre moyen de paiement. Veuillez vérifier vos informations et essayer de nouveau.", + "PaymentMethodsForm.confirmCardPaymentError": "Nous n'avons pas pu valider votre méthode de paiement. Veuillez vérifier vos informations et essayer de nouveau.", "PaymentMethodsForm.infoText": "J'autorise Yogatime à envoyer des instructions à l'institution financière ayant fourni ma carte bancaire pour prélever des paiements depuis mon compte, en accord avec les termes d'utilisations avec vous.", "PaymentMethodsForm.paymentHeading": "Paiement", "PaymentMethodsPage.heading": "Moyens de paiement", @@ -749,7 +776,6 @@ "SearchFiltersMobile.loadingResults": "Chargement…", "SearchFiltersMobile.noResults": "Aucun résultat.", "SearchFiltersMobile.openMapView": "Carte", - "SearchFiltersMobile.noResults": "Aucun résultat.", "SearchFiltersMobile.resetAll": "Remettre à zéro", "SearchFiltersMobile.showListings": "Voir {count, number} {count, plural, one {professeur} other {professeurs}}", "SearchFiltersPrimary.foundResults": "{count, number} {count, plural, one {résultat} other {résultats}}", @@ -887,7 +913,7 @@ "StripePaymentForm.billingDetailsNamePlaceholder": "Entrez votre nom…", "StripePaymentForm.confirmPaymentError": "Le paiement a été réalisé mais nous n'avons pu confirmer la réservation. Veuillez essayez de réserver de nouveau ! Si la réservation n'est pas confirmée dans les temps, le paiement sera entièrement remboursé.", "StripePaymentForm.genericError": "Impossible de traiter ces détails de paiement. Veuillez essayer de nouveau.", - "StripePaymentForm.confirmCardPaymentError": "Nous n'avons pu authentifier votre méthode de paiement. Veuillez vérifier vos détails d'authentifications et essayer de nouveau.", + "StripePaymentForm.confirmCardPaymentError": "Nous n'avons pas pu valider votre méthode de paiement. Veuillez vérifier vos informations et essayer de nouveau.", "StripePaymentForm.messageHeading": "Message", "StripePaymentForm.messageLabel": "Dites bonjour à votre professeur {messageOptionalText}", "StripePaymentForm.messageOptionalText": "• optionel", @@ -962,6 +988,7 @@ "StripeConnectAccountForm.createStripeAccountFailedWithStripeError": "Oups, quelque chose s'est mal passé. Le message d'erreur fourni par Stripe est : \"{stripeMessage}\"", "StripeConnectAccountForm.individualAccount": "Je suis un particulier", "StripeConnectAccountForm.createStripeAccountLinkFailed": "Oups, quelque chose n'a pas fonctionné. Veuillez contacter les administrateurs de la place de marché.", + "StripeConnectAccountForm.createStripeAccountLinkFailedWithStripeError": "Oups, quelque chose n'a pas fonctionné. Stripe a fourni le message d'erreur suivant : \"{stripeMessage}\"", "StripeConnectAccountForm.loadingStripeAccountData": "Récupération des détails de paiement…", "StripeConnectAccountForm.stripeToSText": "En enregistrant les informations, vous acceptez le {stripeConnectedAccountTermsLink}", "StripeConnectAccountForm.stripeConnectedAccountTermsLink": "Stripe Connected Account Agreement",