From ce9fe4140e58fb38e0a74eb6fc97ee9c7a32944c Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Sun, 3 Aug 2025 12:31:36 +0530 Subject: [PATCH 1/2] Merge initialSettingsPage.troubleshoot.description translation --- .../BaseHTMLEngineProvider.tsx | 1 + .../HTMLRenderers/ConciergeLinkRenderer.tsx | 41 +++++++++++++++++++ .../HTMLEngineProvider/HTMLRenderers/index.ts | 2 + src/languages/de.ts | 4 +- src/languages/en.ts | 4 +- src/languages/es.ts | 4 +- src/languages/fr.ts | 4 +- src/languages/it.ts | 4 +- src/languages/ja.ts | 4 +- src/languages/nl.ts | 4 +- src/languages/pl.ts | 4 +- src/languages/pt-BR.ts | 4 +- src/languages/zh-hans.ts | 3 +- .../Troubleshoot/TroubleshootPage.tsx | 17 ++------ 14 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx diff --git a/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.tsx b/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.tsx index 6122c257509b..cda0c6ea7bf3 100755 --- a/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.tsx +++ b/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.tsx @@ -130,6 +130,7 @@ function BaseHTMLEngineProvider({textSelectable = false, children, enableExperim 'mention-report': HTMLElementModel.fromCustomModel({tagName: 'mention-report', contentModel: HTMLContentModel.textual}), 'mention-here': HTMLElementModel.fromCustomModel({tagName: 'mention-here', contentModel: HTMLContentModel.textual}), 'mention-short': HTMLElementModel.fromCustomModel({tagName: 'mention-short', contentModel: HTMLContentModel.textual}), + 'concierge-link': HTMLElementModel.fromCustomModel({tagName: 'concierge-link', contentModel: HTMLContentModel.textual}), 'next-step': HTMLElementModel.fromCustomModel({ tagName: 'next-step', mixedUAStyles: {...styles.textLabelSupporting, ...styles.lh16}, diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx b/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx new file mode 100644 index 000000000000..b973e52eebe0 --- /dev/null +++ b/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import type {StyleProp, TextStyle} from 'react-native'; +import type {CustomRendererProps, TPhrasing, TText} from 'react-native-render-html'; +import {TNodeChildrenRenderer} from 'react-native-render-html'; +import * as HTMLEngineUtils from '@components/HTMLEngineProvider/htmlEngineUtils'; +import Text from '@components/Text'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {navigateToConciergeChat} from '@userActions/Report'; + +type ConciergeLinkRendererProps = CustomRendererProps; + +function ConciergeLinkRenderer({tnode}: ConciergeLinkRendererProps) { + const styles = useThemeStyles(); + + // Define link style based on context + let linkStyle: StyleProp = styles.link; + + // Special handling for links in RBR to maintain consistent font size + if (HTMLEngineUtils.isChildOfRBR(tnode)) { + linkStyle = [ + styles.link, + { + fontSize: HTMLEngineUtils.getFontSizeOfRBRChild(tnode), + }, + ]; + } + + return ( + navigateToConciergeChat()} + suppressHighlighting + > + + + ); +} + +ConciergeLinkRenderer.displayName = 'ConciergeLinkRenderer'; + +export default ConciergeLinkRenderer; diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/index.ts b/src/components/HTMLEngineProvider/HTMLRenderers/index.ts index 60670838ef20..bdbc0618a473 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/index.ts +++ b/src/components/HTMLEngineProvider/HTMLRenderers/index.ts @@ -1,6 +1,7 @@ import type {CustomTagRendererRecord} from 'react-native-render-html'; import AnchorRenderer from './AnchorRenderer'; import CodeRenderer from './CodeRenderer'; +import ConciergeLinkRenderer from './ConciergeLinkRenderer'; import DeletedActionRenderer from './DeletedActionRenderer'; import EditedRenderer from './EditedRenderer'; import EmojiRenderer from './EmojiRenderer'; @@ -38,6 +39,7 @@ const HTMLEngineProviderComponentList: CustomTagRendererRecord = { emoji: EmojiRenderer, 'next-step-email': NextStepEmailRenderer, 'deleted-action': DeletedActionRenderer, + 'concierge-link': ConciergeLinkRenderer, /* eslint-enable @typescript-eslint/naming-convention */ }; diff --git a/src/languages/de.ts b/src/languages/de.ts index f047a04f6754..463a877a3f9d 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -1521,8 +1521,8 @@ const translations = { clearCacheAndRestart: 'Cache leeren und neu starten', viewConsole: 'Debug-Konsole anzeigen', debugConsole: 'Debug-Konsole', - description: 'Verwenden Sie die untenstehenden Tools, um das Expensify-Erlebnis zu unterstützen. Wenn Sie auf Probleme stoßen, bitte', - submitBug: 'einen Fehler melden', + description: + 'Verwenden Sie die folgenden Tools, um Probleme mit Expensify zu beheben. Wenn Sie auf Probleme stoßen, melden Sie bitte einen Fehler.', confirmResetDescription: 'Alle nicht gesendeten Entwurfsnachrichten gehen verloren, aber der Rest Ihrer Daten ist sicher.', resetAndRefresh: 'Zurücksetzen und aktualisieren', clientSideLogging: 'Client-seitiges Logging', diff --git a/src/languages/en.ts b/src/languages/en.ts index 43b033502526..1163baf86b56 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1501,8 +1501,8 @@ const translations = { clearCacheAndRestart: 'Clear cache and restart', viewConsole: 'View debug console', debugConsole: 'Debug console', - description: 'Use the tools below to help troubleshoot the Expensify experience. If you encounter any issues, please', - submitBug: 'submit a bug', + description: + 'Use the tools below to help troubleshoot the Expensify experience. If you encounter any issues, please submit a bug.', confirmResetDescription: 'All unsent draft messages will be lost, but the rest of your data is safe.', resetAndRefresh: 'Reset and refresh', clientSideLogging: 'Client side logging', diff --git a/src/languages/es.ts b/src/languages/es.ts index d9ea77c217ed..c1bb49f3fd17 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1498,8 +1498,8 @@ const translations = { clearCacheAndRestart: 'Borrar caché y reiniciar', viewConsole: 'Ver la consola de depuración', debugConsole: 'Consola de depuración', - description: 'Utilice las herramientas que aparecen a continuación para solucionar los problemas de Expensify. Si tiene algún problema, por favor', - submitBug: 'envíe un informe de error', + description: + 'Utilice las herramientas que aparecen a continuación para solucionar los problemas de Expensify. Si tiene algún problema, por favor envíe un informe de error.', confirmResetDescription: 'Todos los borradores no enviados se perderán, pero el resto de tus datos estarán a salvo.', resetAndRefresh: 'Restablecer y actualizar', clientSideLogging: 'Registro a nivel cliente', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 8338f6b0be75..a037d20c74f6 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -1522,8 +1522,8 @@ const translations = { clearCacheAndRestart: 'Effacer le cache et redémarrer', viewConsole: 'Afficher la console de débogage', debugConsole: 'Console de débogage', - description: "Utilisez les outils ci-dessous pour vous aider à résoudre les problèmes liés à l'expérience Expensify. Si vous rencontrez des problèmes, veuillez", - submitBug: 'soumettre un bug', + description: + "Utilisez les outils ci-dessous pour vous aider à résoudre les problèmes liés à l'utilisation d'Expensify. Si vous rencontrez des problèmes, veuillez soumettre un bug.", confirmResetDescription: 'Tous les brouillons de messages non envoyés seront perdus, mais le reste de vos données est en sécurité.', resetAndRefresh: 'Réinitialiser et actualiser', clientSideLogging: 'Journalisation côté client', diff --git a/src/languages/it.ts b/src/languages/it.ts index cc758ca9efd2..f7a214b7e757 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -1515,8 +1515,8 @@ const translations = { clearCacheAndRestart: 'Cancella cache e riavvia', viewConsole: 'Visualizza console di debug', debugConsole: 'Console di debug', - description: "Usa gli strumenti qui sotto per aiutarti a risolvere i problemi con l'esperienza Expensify. Se incontri problemi, per favore", - submitBug: 'segnala un bug', + description: + 'Utilizzate gli strumenti qui sotto per risolvere i problemi di Expensify. Se riscontrate problemi, inviate un bug.', confirmResetDescription: 'Tutti i messaggi di bozza non inviati andranno persi, ma il resto dei tuoi dati è al sicuro.', resetAndRefresh: 'Reimposta e aggiorna', clientSideLogging: 'Registrazione lato client', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index c8fd5c1d50cf..18977abe29be 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -1515,8 +1515,8 @@ const translations = { clearCacheAndRestart: 'キャッシュをクリアして再起動', viewConsole: 'デバッグコンソールを表示', debugConsole: 'デバッグコンソール', - description: 'Expensifyの体験をトラブルシューティングするために、以下のツールを使用してください。問題が発生した場合は、どうぞ', - submitBug: 'バグを提出する', + description: + 'Expensifyのトラブルシューティングには以下のツールをご利用ください。問題が発生した場合は、バグをご報告ください。', confirmResetDescription: '送信されていないすべての下書きメッセージは失われますが、その他のデータは安全です。', resetAndRefresh: 'リセットして更新', clientSideLogging: 'クライアントサイドのログ記録', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 4d251c624e00..d520fbf22b63 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -1517,8 +1517,8 @@ const translations = { clearCacheAndRestart: 'Cache wissen en opnieuw starten', viewConsole: 'Bekijk debugconsole', debugConsole: 'Debugconsole', - description: 'Gebruik de onderstaande tools om de Expensify-ervaring te helpen oplossen. Als u problemen ondervindt, neem dan alstublieft', - submitBug: 'een bug indienen', + description: + 'Gebruik de onderstaande hulpmiddelen om problemen met Expensify op te lossen. Als je problemen tegenkomt, dien dan een bug in.', confirmResetDescription: 'Alle niet-verzonden conceptberichten gaan verloren, maar de rest van uw gegevens is veilig.', resetAndRefresh: 'Reset en vernieuwen', clientSideLogging: 'Client-side logging', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 1bda5db8e213..d397612e49fb 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -1513,8 +1513,8 @@ const translations = { clearCacheAndRestart: 'Wyczyść pamięć podręczną i uruchom ponownie', viewConsole: 'Wyświetl konsolę debugowania', debugConsole: 'Konsola debugowania', - description: 'Użyj poniższych narzędzi, aby pomóc w rozwiązywaniu problemów z działaniem Expensify. Jeśli napotkasz jakiekolwiek problemy, proszę', - submitBug: 'zgłoś błąd', + description: + 'Skorzystaj z poniższych narzędzi, aby pomóc w rozwiązywaniu problemów z Expensify. Jeśli napotkasz jakiekolwiek problemy, zgłoś błąd.', confirmResetDescription: 'Wszystkie niesłane wiadomości robocze zostaną utracone, ale reszta Twoich danych jest bezpieczna.', resetAndRefresh: 'Zresetuj i odśwież', clientSideLogging: 'Logowanie po stronie klienta', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 412073883c1c..012e28798ba0 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -1513,8 +1513,8 @@ const translations = { clearCacheAndRestart: 'Limpar cache e reiniciar', viewConsole: 'Ver console de depuração', debugConsole: 'Console de depuração', - description: 'Use as ferramentas abaixo para ajudar a solucionar problemas na experiência do Expensify. Se você encontrar algum problema, por favor', - submitBug: 'enviar um bug', + description: + 'Use as ferramentas abaixo para ajudar a solucionar problemas na experiência da Expensify. Se você encontrar algum problema, envie um bug.', confirmResetDescription: 'Todas as mensagens de rascunho não enviadas serão perdidas, mas o restante dos seus dados está seguro.', resetAndRefresh: 'Redefinir e atualizar', clientSideLogging: 'Registro no lado do cliente', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 6bf0c1884a0b..37101513d2ec 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -1500,8 +1500,7 @@ const translations = { clearCacheAndRestart: '清除缓存并重启', viewConsole: '查看调试控制台', debugConsole: '调试控制台', - description: '使用以下工具帮助解决Expensify体验中的问题。如果您遇到任何问题,请', - submitBug: '提交错误报告', + description: '使用以下工具帮助排除 Expensify 体验中的故障。如果遇到任何问题,请提交错误', confirmResetDescription: '所有未发送的草稿消息将会丢失,但您的其他数据是安全的。', resetAndRefresh: '重置并刷新', clientSideLogging: '客户端日志记录', diff --git a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx index f5c2c6f8133b..db4e2d80c293 100644 --- a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx +++ b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx @@ -11,14 +11,13 @@ import LottieAnimations from '@components/LottieAnimations'; import MenuItemList from '@components/MenuItemList'; import {useOptionsList} from '@components/OptionListContextProvider'; import RecordTroubleshootDataToolMenu from '@components/RecordTroubleshootDataToolMenu'; +import RenderHTML from '@components/RenderHTML'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; import Switch from '@components/Switch'; import TestToolMenu from '@components/TestToolMenu'; import TestToolRow from '@components/TestToolRow'; -import Text from '@components/Text'; -import TextLink from '@components/TextLink'; import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -29,7 +28,6 @@ import {setShouldMaskOnyxState} from '@libs/actions/MaskOnyx'; import ExportOnyxState from '@libs/ExportOnyxState'; import Navigation from '@libs/Navigation/Navigation'; import {clearOnyxAndResetApp} from '@userActions/App'; -import {navigateToConciergeChat} from '@userActions/Report'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -122,16 +120,9 @@ function TroubleshootPage() { illustrationStyle={illustrationStyle} titleStyles={styles.accountSettingsSectionTitle} renderSubtitle={() => ( - - {translate('initialSettingsPage.troubleshoot.description')}{' '} - navigateToConciergeChat()} - > - {translate('initialSettingsPage.troubleshoot.submitBug')} - - . - + + + )} > From dd46bc624ee934f9fd8325024207da9e90ffc223 Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Tue, 5 Aug 2025 10:42:55 +0530 Subject: [PATCH 2/2] Stable ref --- .../HTMLRenderers/ConciergeLinkRenderer.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx b/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx index b973e52eebe0..a6161d4b7aba 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx +++ b/src/components/HTMLEngineProvider/HTMLRenderers/ConciergeLinkRenderer.tsx @@ -5,10 +5,17 @@ import {TNodeChildrenRenderer} from 'react-native-render-html'; import * as HTMLEngineUtils from '@components/HTMLEngineProvider/htmlEngineUtils'; import Text from '@components/Text'; import useThemeStyles from '@hooks/useThemeStyles'; -import {navigateToConciergeChat} from '@userActions/Report'; +import {navigateToConciergeChat as navigateToConciergeChatAction} from '@userActions/Report'; type ConciergeLinkRendererProps = CustomRendererProps; +/** + * Simple wrapper to create a stable reference without passing event args to navigation function. + */ +function navigateToConciergeChat() { + navigateToConciergeChatAction(); +} + function ConciergeLinkRenderer({tnode}: ConciergeLinkRendererProps) { const styles = useThemeStyles(); @@ -28,7 +35,7 @@ function ConciergeLinkRenderer({tnode}: ConciergeLinkRendererProps) { return ( navigateToConciergeChat()} + onPress={navigateToConciergeChat} suppressHighlighting >