diff --git a/src/languages/de.ts b/src/languages/de.ts index d47ee109cef7..08d5c429603d 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -8676,6 +8676,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc bookACallTextBottom: 'Wir würden uns freuen, mit Ihnen zu telefonieren, um die Gründe besser zu verstehen. Sie können einen Anruf mit einer*m unserer leitenden Produktmanager*innen buchen, um Ihre Bedürfnisse zu besprechen.', takeMeToExpensifyClassic: 'Bring mich zu Expensify Classic', + goBackJustOnce: 'Nur dieses Mal zurück', }, listBoundary: { errorMessage: 'Beim Laden weiterer Nachrichten ist ein Fehler aufgetreten', diff --git a/src/languages/en.ts b/src/languages/en.ts index 500ce46cc363..a87d255c0acd 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -8696,6 +8696,7 @@ const translations = { bookACallTextTop: 'By switching to Expensify Classic, you will miss out on:', bookACallTextBottom: 'We’d be excited to get on a call with you to understand why. You can book a call with one of our senior product managers to discuss your needs.', takeMeToExpensifyClassic: 'Take me to Expensify Classic', + goBackJustOnce: 'Go back just once', }, listBoundary: { errorMessage: 'An error occurred while loading more messages', diff --git a/src/languages/es.ts b/src/languages/es.ts index 2fce892db4ad..143d9b86e83c 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -8846,6 +8846,7 @@ ${amount} para ${merchant} - ${date}`, bookACallTextTop: 'Al cambiar a Expensify Classic, se perderá:', bookACallTextBottom: 'Nos encantaría hablar con usted para entender por qué. Puede concertar una llamada con uno de nuestros jefes de producto para hablar de sus necesidades.', takeMeToExpensifyClassic: 'Llévame a Expensify Classic', + goBackJustOnce: 'Volver solo esta vez', }, listBoundary: { errorMessage: 'Se ha producido un error al cargar más mensajes', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 3c89403ecda6..c5df707af9cb 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -8699,6 +8699,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e bookACallTextBottom: 'Nous serions ravis d’organiser un appel avec vous pour comprendre pourquoi. Vous pouvez réserver un appel avec l’un de nos chefs de produit senior pour discuter de vos besoins.', takeMeToExpensifyClassic: 'M’emmener vers Expensify Classic', + goBackJustOnce: 'Revenir une seule fois', }, listBoundary: { errorMessage: 'Une erreur est survenue lors du chargement de messages supplémentaires', diff --git a/src/languages/it.ts b/src/languages/it.ts index 1edee6987844..f74c7e10991b 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -8668,6 +8668,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, bookACallTextBottom: 'Saremmo felici di fare una chiamata con te per capirne il motivo. Puoi prenotare una chiamata con uno dei nostri senior product manager per discutere delle tue esigenze.', takeMeToExpensifyClassic: 'Portami a Expensify Classic', + goBackJustOnce: 'Torna solo per questa volta', }, listBoundary: { errorMessage: 'Si è verificato un errore durante il caricamento di altri messaggi', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 1dc8f623dc97..2900ceea376c 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -8560,6 +8560,7 @@ ${reportName} bookACallTextTop: 'Expensify Classic に切り替えると、次の機能が利用できなくなります:', bookACallTextBottom: 'ぜひお電話で理由をお聞かせください。お客様のニーズについて話し合うために、シニアプロダクトマネージャーとの通話を予約できます。', takeMeToExpensifyClassic: 'Expensify Classic に移動', + goBackJustOnce: '一度だけ戻る', }, listBoundary: { errorMessage: 'さらにメッセージを読み込む際にエラーが発生しました', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 9737a63f7ac4..38a277a75d6c 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -8637,6 +8637,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, bookACallTextTop: 'Als je overschakelt naar Expensify Classic, loop je het volgende mis:', bookACallTextBottom: 'We spreken graag met je om te begrijpen waarom. Je kunt een gesprek inplannen met een van onze senior productmanagers om je behoeften te bespreken.', takeMeToExpensifyClassic: 'Breng me naar Expensify Classic', + goBackJustOnce: 'Eenmalig teruggaan', }, listBoundary: { errorMessage: 'Er is een fout opgetreden bij het laden van meer berichten', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index fb15ccba6e0d..8a3b63e9f885 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -8625,6 +8625,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, bookACallTextBottom: 'Chętnie umówimy się z Tobą na rozmowę, aby zrozumieć dlaczego. Możesz zarezerwować rozmowę z jednym z naszych starszych menedżerów produktu, aby omówić swoje potrzeby.', takeMeToExpensifyClassic: 'Przejdź do Expensify Classic', + goBackJustOnce: 'Wróć tylko raz', }, listBoundary: { errorMessage: 'Wystąpił błąd podczas wczytywania kolejnych wiadomości', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 018d4b2863f6..e2ae20d089eb 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -8632,6 +8632,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, bookACallTextBottom: 'Ficaríamos muito animados em fazer uma ligação com você para entender o motivo. Você pode agendar uma chamada com um de nossos gerentes de produto sêniores para discutir suas necessidades.', takeMeToExpensifyClassic: 'Leve-me para o Expensify Classic', + goBackJustOnce: 'Voltar apenas desta vez', }, listBoundary: { errorMessage: 'Ocorreu um erro ao carregar mais mensagens', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 7f51cc4422fe..73fc9ac4f724 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -8416,6 +8416,7 @@ ${reportName} bookACallTextTop: '切换回 Expensify 经典版后,您将无法享受:', bookACallTextBottom: '我们非常期待与您通话以了解原因。您可以预约与我们的一位资深产品经理通话,讨论您的需求。', takeMeToExpensifyClassic: '带我前往 Expensify 经典版', + goBackJustOnce: '仅此一次返回', }, listBoundary: { errorMessage: '加载更多消息时出错', diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx index 43c860112258..10f588cd79ec 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx @@ -1,5 +1,7 @@ import React, {useCallback} from 'react'; import type {OnyxEntry} from 'react-native-onyx'; +import Button from '@components/Button'; +import FixedFooter from '@components/FixedFooter'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; import type {FormOnyxValues} from '@components/Form/types'; @@ -19,10 +21,14 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import {saveResponse} from '@libs/actions/ExitSurvey'; +import {setErrorFields} from '@libs/actions/FormActions'; +import {getMicroSecondOnyxErrorWithMessage} from '@libs/ErrorUtils'; +import Log from '@libs/Log'; import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import StatusBar from '@libs/StatusBar'; import Navigation from '@navigation/Navigation'; import variables from '@styles/variables'; +import {openOldDotLink} from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import {DYNAMIC_ROUTES} from '@src/ROUTES'; @@ -52,7 +58,30 @@ function DynamicExitSurveyReasonPage() { saveResponse(draftResponse); Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path), {forceReplace: true}); }, [draftResponse]); - useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.CTRL_ENTER, submitForm); + + const goBackJustOnce = useCallback(() => { + Log.info('[ExitSurvey] User chose Go back just once'); + Navigation.dismissModal(); + openOldDotLink(CONST.OLDDOT_URLS.INBOX, true); + }, []); + + const switchToClassic = useCallback(() => { + Log.info('[ExitSurvey] User chose Switch to Classic'); + if (!draftResponse.trim()) { + setErrorFields(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM, { + [INPUT_IDS.RESPONSE]: getMicroSecondOnyxErrorWithMessage(translate('common.error.fieldRequired')), + }); + return; + } + if (draftResponse.length > CONST.MAX_COMMENT_LENGTH) { + setErrorFields(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM, { + [INPUT_IDS.RESPONSE]: getMicroSecondOnyxErrorWithMessage(translate('common.error.characterLimitExceedCounter', draftResponse.length, CONST.MAX_COMMENT_LENGTH)), + }); + return; + } + submitForm(); + }, [draftResponse, submitForm, translate]); + useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.CTRL_ENTER, switchToClassic); const formTopMarginsStyle = styles.mt3; const baseResponseInputContainerStyle = styles.mt3; @@ -79,8 +108,9 @@ function DynamicExitSurveyReasonPage() { formID={ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM} style={[styles.flex1, styles.mh5, formTopMarginsStyle, StyleUtils.getMaximumHeight(formMaxHeight)]} onSubmit={submitForm} - submitButtonText={translate('common.next')} - shouldValidateOnBlur + submitButtonText="" + isSubmitButtonVisible={false} + shouldValidateOnBlur={false} validate={(values: FormOnyxValues) => { const errors: Errors = {}; const response = values[INPUT_IDS.RESPONSE] ?? ''; @@ -110,11 +140,27 @@ function DynamicExitSurveyReasonPage() { ref={inputCallbackRef} containerStyles={[baseResponseInputContainerStyle]} shouldSaveDraft - shouldSubmitForm /> )} + +