From cb947d799f18fc80c00925cdb3af0a85a1a25799 Mon Sep 17 00:00:00 2001 From: Faizan Shoukat Abbasi Date: Fri, 2 Jan 2026 20:33:21 +0500 Subject: [PATCH 1/5] 78073: Update ghost text in Expense Threads / Reports --- src/languages/de.ts | 3 +++ src/languages/en.ts | 3 +++ src/languages/es.ts | 3 +++ src/languages/fr.ts | 3 +++ src/languages/it.ts | 3 +++ src/languages/ja.ts | 3 +++ src/languages/nl.ts | 3 +++ src/languages/pl.ts | 3 +++ src/languages/pt-BR.ts | 3 +++ src/languages/zh-hans.ts | 3 +++ .../ReportActionCompose.tsx | 25 ++++++++++++++++++- 11 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 42b52f8c4703..6975c3dbeb6e 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -872,6 +872,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Einklappen', expand: 'Erweitern', + askConciergeToCreate: 'Bitten Sie Concierge AI, eine Ausgabe zu erstellen ...', + askConciergeToUpdate: 'Bitte Concierge AI bitten, eine Ausgabe zu aktualisieren...', + askConciergeToCorrect: 'Bitten Sie Concierge AI, eine Ausgabe zu korrigieren...', }, reportActionContextMenu: { copyMessage: 'Nachricht kopieren', diff --git a/src/languages/en.ts b/src/languages/en.ts index 7efa6462efd1..561878a5bca5 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -851,6 +851,9 @@ const translations = { addAttachment: 'Add attachment', writeSomething: 'Write something...', blockedFromConcierge: 'Communication is barred', + askConciergeToCreate: 'Ask Concierge AI to create an expense...', + askConciergeToUpdate: 'Ask Concierge AI to update an expense...', + askConciergeToCorrect: 'Ask Concierge AI to correct an expense...', fileUploadFailed: 'Upload failed. File is not supported.', localTime: ({user, time}: LocalTimeParams) => `It's ${time} for ${user}`, edited: '(edited)', diff --git a/src/languages/es.ts b/src/languages/es.ts index 258c1b22faee..bef0e741c59a 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -565,6 +565,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Colapsar', expand: 'Expandir', + askConciergeToCreate: 'Pídele a Concierge AI que cree un gasto...', + askConciergeToUpdate: 'Pídele a Concierge AI que actualice un gasto...', + askConciergeToCorrect: 'Pídele a Concierge AI que corrija un gasto...', }, reportActionContextMenu: { copyMessage: 'Copiar mensaje', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b05862069339..fdde8e475216 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -875,6 +875,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Réduire', expand: 'Développer', + askConciergeToCreate: 'Demander à Concierge AI de créer une dépense...', + askConciergeToUpdate: 'Demander à Concierge AI de mettre à jour une dépense...', + askConciergeToCorrect: 'Demander à Concierge AI de corriger une dépense...', }, reportActionContextMenu: { copyMessage: 'Copier le message', diff --git a/src/languages/it.ts b/src/languages/it.ts index 7c0ebe4fb586..229fb6f16bcf 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -872,6 +872,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Comprimi', expand: 'Espandi', + askConciergeToCreate: 'Chiedi a Concierge AI di creare una spesa...', + askConciergeToUpdate: 'Chiedi a Concierge AI di aggiornare una spesa...', + askConciergeToCorrect: 'Chiedi a Concierge AI di correggere una spesa...', }, reportActionContextMenu: { copyMessage: 'Copia messaggio', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 61bf8fd2357f..81e345f43e32 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -871,6 +871,9 @@ const translations: TranslationDeepObject = { emoji: '絵文字', collapse: '折りたたむ', expand: '展開', + askConciergeToCreate: 'Concierge AI に経費を作成するよう依頼…', + askConciergeToUpdate: 'Concierge AI に経費の更新を依頼する…', + askConciergeToCorrect: 'Concierge AI に経費の修正を依頼する…', }, reportActionContextMenu: { copyMessage: 'メッセージをコピー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 7fd58d4d3dae..eca9337f15b4 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -872,6 +872,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Samenvouwen', expand: 'Uitvouwen', + askConciergeToCreate: 'Vraag Concierge AI om een uitgave aan te maken...', + askConciergeToUpdate: 'Vraag Concierge AI om een uitgave bij te werken...', + askConciergeToCorrect: 'Vraag Concierge AI om een uitgave te corrigeren...', }, reportActionContextMenu: { copyMessage: 'Bericht kopiëren', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 2dc6491fd4bf..2a403dfbdb7d 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -871,6 +871,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Zwiń', expand: 'Rozwiń', + askConciergeToCreate: 'Poproś Concierge AI o utworzenie wydatku...', + askConciergeToUpdate: 'Poproś Concierge AI o zaktualizowanie wydatku...', + askConciergeToCorrect: 'Poproś Concierge AI o skorygowanie wydatku...', }, reportActionContextMenu: { copyMessage: 'Kopiuj wiadomość', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 7177c70be644..1374f9dfb14c 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -871,6 +871,9 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Recolher', expand: 'Expandir', + askConciergeToCreate: 'Peça à Concierge AI para criar uma despesa...', + askConciergeToUpdate: 'Peça à Concierge AI para atualizar uma despesa...', + askConciergeToCorrect: 'Peça à Concierge AI para corrigir uma despesa...', }, reportActionContextMenu: { copyMessage: 'Copiar mensagem', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index c25a61cad7f5..750ba1cd9446 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -865,6 +865,9 @@ const translations: TranslationDeepObject = { emoji: '表情符号', collapse: '折叠', expand: '展开', + askConciergeToCreate: '让 Concierge AI 创建一笔报销…', + askConciergeToUpdate: '让 Concierge AI 更新一笔报销…', + askConciergeToCorrect: '请让 Concierge AI 更正一笔报销…', }, reportActionContextMenu: { copyMessage: '复制消息', diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index 1223ac0fd27c..5f2873e40a8c 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -13,6 +13,7 @@ import DualDropZone from '@components/DropZone/DualDropZone'; import EmojiPickerButton from '@components/EmojiPicker/EmojiPickerButton'; import ExceededCommentLength from '@components/ExceededCommentLength'; import ImportedStateIndicator from '@components/ImportedStateIndicator'; +import type {LocalizedTranslate} from '@components/LocaleContextProvider'; import type {Mention} from '@components/MentionSuggestions'; import OfflineIndicator from '@components/OfflineIndicator'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -52,6 +53,7 @@ import { isConciergeChatReport, isGroupChat, isInvoiceReport, + isMoneyRequestReport, isReportApproved, isReportTransactionThread, isSettled, @@ -121,6 +123,13 @@ const shouldFocusInputOnScreenFocus = canFocusInputOnScreenFocus(); const willBlurTextInputOnTapOutside = willBlurTextInputOnTapOutsideFunc(); +/** + * Returns an array of AI-aware placeholders for expense threads + */ +function getAIPlaceholders(translate: LocalizedTranslate): string[] { + return [translate('reportActionCompose.askConciergeToCreate'), translate('reportActionCompose.askConciergeToUpdate'), translate('reportActionCompose.askConciergeToCorrect')]; +} + // eslint-disable-next-line import/no-mutable-exports let onSubmitAction = noop; @@ -176,6 +185,9 @@ function ReportActionCompose({ return !draftComment || !!draftComment.match(CONST.REGEX.EMPTY_COMMENT); }); + // Select a random AI placeholder index on mount (0, 1, or 2) + const [randomPlaceholderIndex] = useState(() => Math.floor(Math.random() * 3)); + /** * Updates the visibility state of the menu */ @@ -247,13 +259,24 @@ function ReportActionCompose({ return !isRoomOrGroupChat && (canModifyReceipt || hasMoneyRequestOptions) && !isInvoiceReport(report); }, [shouldAddOrReplaceReceipt, report, reportParticipantIDs, policy, isReportArchived, isRestrictedToPreferredPolicy]); + // Check if this is an expense-related report (IOU, expense report, or transaction thread) + const isExpenseRelatedReport = useMemo(() => isTransactionThreadView || isMoneyRequestReport(report), [isTransactionThreadView, report]); + // Placeholder to display in the chat input. const inputPlaceholder = useMemo(() => { if (includesConcierge && userBlockedFromConcierge) { return translate('reportActionCompose.blockedFromConcierge'); } + + // Show AI-aware placeholder for expense-related reports where user can write + // to encourage using Concierge AI for expense management + if (isExpenseRelatedReport && canUserPerformWriteAction) { + const placeholders = getAIPlaceholders(translate); + return placeholders.at(randomPlaceholderIndex) ?? placeholders.at(0) ?? ''; + } + return translate('reportActionCompose.writeSomething'); - }, [includesConcierge, translate, userBlockedFromConcierge]); + }, [includesConcierge, translate, userBlockedFromConcierge, isExpenseRelatedReport, canUserPerformWriteAction, randomPlaceholderIndex]); const {displayLabel: agentZeroDisplayLabel, kickoffWaitingIndicator} = useAgentZeroStatusIndicator(reportID, isConciergeChat); From 94dbedc7a488380b5d98ce03ac1b703481f5af5f Mon Sep 17 00:00:00 2001 From: Faizan Shoukat Abbasi Date: Tue, 6 Jan 2026 23:54:53 +0500 Subject: [PATCH 2/5] Added new message in the list --- src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 3 ++- src/languages/pt-BR.ts | 5 +++-- src/languages/zh-hans.ts | 3 ++- .../report/ReportActionCompose/ReportActionCompose.tsx | 10 +++++++--- 11 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 6975c3dbeb6e..9777ab3870e4 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -875,6 +875,7 @@ const translations: TranslationDeepObject = { askConciergeToCreate: 'Bitten Sie Concierge AI, eine Ausgabe zu erstellen ...', askConciergeToUpdate: 'Bitte Concierge AI bitten, eine Ausgabe zu aktualisieren...', askConciergeToCorrect: 'Bitten Sie Concierge AI, eine Ausgabe zu korrigieren...', + addColleagueWithMention: 'Füge eine:n Kolleg:in mit einer „@“-Erwähnung hinzu …', }, reportActionContextMenu: { copyMessage: 'Nachricht kopieren', diff --git a/src/languages/en.ts b/src/languages/en.ts index 561878a5bca5..cc7e602315e4 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -854,6 +854,7 @@ const translations = { askConciergeToCreate: 'Ask Concierge AI to create an expense...', askConciergeToUpdate: 'Ask Concierge AI to update an expense...', askConciergeToCorrect: 'Ask Concierge AI to correct an expense...', + addColleagueWithMention: 'Add a colleague with an "@" mention...', fileUploadFailed: 'Upload failed. File is not supported.', localTime: ({user, time}: LocalTimeParams) => `It's ${time} for ${user}`, edited: '(edited)', diff --git a/src/languages/es.ts b/src/languages/es.ts index bef0e741c59a..99b27cedf9f8 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -568,6 +568,7 @@ const translations: TranslationDeepObject = { askConciergeToCreate: 'Pídele a Concierge AI que cree un gasto...', askConciergeToUpdate: 'Pídele a Concierge AI que actualice un gasto...', askConciergeToCorrect: 'Pídele a Concierge AI que corrija un gasto...', + addColleagueWithMention: 'Añade a un colega con una mención "@"...', }, reportActionContextMenu: { copyMessage: 'Copiar mensaje', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index fdde8e475216..b19158fca6ef 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -878,6 +878,7 @@ const translations: TranslationDeepObject = { askConciergeToCreate: 'Demander à Concierge AI de créer une dépense...', askConciergeToUpdate: 'Demander à Concierge AI de mettre à jour une dépense...', askConciergeToCorrect: 'Demander à Concierge AI de corriger une dépense...', + addColleagueWithMention: 'Ajoutez un collègue avec une mention « @ »...', }, reportActionContextMenu: { copyMessage: 'Copier le message', diff --git a/src/languages/it.ts b/src/languages/it.ts index 229fb6f16bcf..a19edc1d1bd0 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -875,6 +875,7 @@ const translations: TranslationDeepObject = { askConciergeToCreate: 'Chiedi a Concierge AI di creare una spesa...', askConciergeToUpdate: 'Chiedi a Concierge AI di aggiornare una spesa...', askConciergeToCorrect: 'Chiedi a Concierge AI di correggere una spesa...', + addColleagueWithMention: 'Aggiungi un collega con una menzione "@"...', }, reportActionContextMenu: { copyMessage: 'Copia messaggio', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 81e345f43e32..3d68541fb1a8 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -874,6 +874,7 @@ const translations: TranslationDeepObject = { askConciergeToCreate: 'Concierge AI に経費を作成するよう依頼…', askConciergeToUpdate: 'Concierge AI に経費の更新を依頼する…', askConciergeToCorrect: 'Concierge AI に経費の修正を依頼する…', + addColleagueWithMention: '「@」メンションで同僚を追加…', }, reportActionContextMenu: { copyMessage: 'メッセージをコピー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index eca9337f15b4..d85ce4ca599b 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -875,6 +875,7 @@ const translations: TranslationDeepObject = { askConciergeToCreate: 'Vraag Concierge AI om een uitgave aan te maken...', askConciergeToUpdate: 'Vraag Concierge AI om een uitgave bij te werken...', askConciergeToCorrect: 'Vraag Concierge AI om een uitgave te corrigeren...', + addColleagueWithMention: 'Voeg een collega toe met een “@”-vermelding...', }, reportActionContextMenu: { copyMessage: 'Bericht kopiëren', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 2a403dfbdb7d..474d50ecad70 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -871,9 +871,10 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Zwiń', expand: 'Rozwiń', - askConciergeToCreate: 'Poproś Concierge AI o utworzenie wydatku...', + askConciergeToCreate: 'Poproś Concierge AI o utworzenie wydatku…', askConciergeToUpdate: 'Poproś Concierge AI o zaktualizowanie wydatku...', askConciergeToCorrect: 'Poproś Concierge AI o skorygowanie wydatku...', + addColleagueWithMention: 'Dodaj współpracownika, wspominając go za pomocą „@”…', }, reportActionContextMenu: { copyMessage: 'Kopiuj wiadomość', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 1374f9dfb14c..243688bf5281 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -871,9 +871,10 @@ const translations: TranslationDeepObject = { emoji: 'Emoji', collapse: 'Recolher', expand: 'Expandir', - askConciergeToCreate: 'Peça à Concierge AI para criar uma despesa...', - askConciergeToUpdate: 'Peça à Concierge AI para atualizar uma despesa...', + askConciergeToCreate: 'Peça para o Concierge AI criar uma despesa...', + askConciergeToUpdate: 'Peça ao Concierge AI para atualizar uma despesa...', askConciergeToCorrect: 'Peça à Concierge AI para corrigir uma despesa...', + addColleagueWithMention: 'Adicione um colega com uma menção "@"...', }, reportActionContextMenu: { copyMessage: 'Copiar mensagem', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 750ba1cd9446..5673e92f58c3 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -867,7 +867,8 @@ const translations: TranslationDeepObject = { expand: '展开', askConciergeToCreate: '让 Concierge AI 创建一笔报销…', askConciergeToUpdate: '让 Concierge AI 更新一笔报销…', - askConciergeToCorrect: '请让 Concierge AI 更正一笔报销…', + askConciergeToCorrect: '让 Concierge AI 更正一笔报销…', + addColleagueWithMention: '使用“@”提及来添加同事…', }, reportActionContextMenu: { copyMessage: '复制消息', diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index 5f2873e40a8c..6cfeca91b9b9 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -127,7 +127,12 @@ const willBlurTextInputOnTapOutside = willBlurTextInputOnTapOutsideFunc(); * Returns an array of AI-aware placeholders for expense threads */ function getAIPlaceholders(translate: LocalizedTranslate): string[] { - return [translate('reportActionCompose.askConciergeToCreate'), translate('reportActionCompose.askConciergeToUpdate'), translate('reportActionCompose.askConciergeToCorrect')]; + return [ + translate('reportActionCompose.askConciergeToCreate'), + translate('reportActionCompose.askConciergeToUpdate'), + translate('reportActionCompose.askConciergeToCorrect'), + translate('reportActionCompose.addColleagueWithMention'), + ]; } // eslint-disable-next-line import/no-mutable-exports @@ -185,8 +190,7 @@ function ReportActionCompose({ return !draftComment || !!draftComment.match(CONST.REGEX.EMPTY_COMMENT); }); - // Select a random AI placeholder index on mount (0, 1, or 2) - const [randomPlaceholderIndex] = useState(() => Math.floor(Math.random() * 3)); + const [randomPlaceholderIndex] = useState(() => Math.floor(Math.random() * 4)); /** * Updates the visibility state of the menu From e9402f5d380776ccdfeecb9b82cc991d8f0dcd14 Mon Sep 17 00:00:00 2001 From: Faizan Shoukat Abbasi Date: Thu, 8 Jan 2026 22:03:41 +0500 Subject: [PATCH 3/5] Created a reusable constant for the placeholders --- .../ReportActionCompose.tsx | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index 6393cd07256d..fea26bf1ced1 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -124,16 +124,14 @@ const shouldFocusInputOnScreenFocus = canFocusInputOnScreenFocus(); const willBlurTextInputOnTapOutside = willBlurTextInputOnTapOutsideFunc(); /** - * Returns an array of AI-aware placeholders for expense threads + * List of AI-aware placeholder translation keys for expense threads */ -function getAIPlaceholders(translate: LocalizedTranslate): string[] { - return [ - translate('reportActionCompose.askConciergeToCreate'), - translate('reportActionCompose.askConciergeToUpdate'), - translate('reportActionCompose.askConciergeToCorrect'), - translate('reportActionCompose.addColleagueWithMention'), - ]; -} +const AI_PLACEHOLDER_KEYS = [ + 'reportActionCompose.askConciergeToCreate', + 'reportActionCompose.askConciergeToUpdate', + 'reportActionCompose.askConciergeToCorrect', + 'reportActionCompose.addColleagueWithMention', +] as const; // eslint-disable-next-line import/no-mutable-exports let onSubmitAction = noop; @@ -190,7 +188,7 @@ function ReportActionCompose({ return !draftComment || !!draftComment.match(CONST.REGEX.EMPTY_COMMENT); }); - const [randomPlaceholderIndex] = useState(() => Math.floor(Math.random() * 4)); + const [randomPlaceholderIndex] = useState(() => Math.floor(Math.random() * AI_PLACEHOLDER_KEYS.length)); /** * Updates the visibility state of the menu @@ -275,8 +273,7 @@ function ReportActionCompose({ // Show AI-aware placeholder for expense-related reports where user can write // to encourage using Concierge AI for expense management if (isExpenseRelatedReport && canUserPerformWriteAction) { - const placeholders = getAIPlaceholders(translate); - return placeholders.at(randomPlaceholderIndex) ?? placeholders.at(0) ?? ''; + return translate(AI_PLACEHOLDER_KEYS[randomPlaceholderIndex]); } return translate('reportActionCompose.writeSomething'); From 8f01bc2ed6b0077cd412a2826138332854f92be4 Mon Sep 17 00:00:00 2001 From: Faizan Shoukat Abbasi Date: Thu, 8 Jan 2026 22:12:29 +0500 Subject: [PATCH 4/5] Fixed EsLint issues --- .../home/report/ReportActionCompose/ReportActionCompose.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index fea26bf1ced1..d72d3dee3dd4 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -13,7 +13,6 @@ import DualDropZone from '@components/DropZone/DualDropZone'; import EmojiPickerButton from '@components/EmojiPicker/EmojiPickerButton'; import ExceededCommentLength from '@components/ExceededCommentLength'; import ImportedStateIndicator from '@components/ImportedStateIndicator'; -import type {LocalizedTranslate} from '@components/LocaleContextProvider'; import type {Mention} from '@components/MentionSuggestions'; import OfflineIndicator from '@components/OfflineIndicator'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; From 3303de16df6bcac0d2e0e935b4b5212725023a19 Mon Sep 17 00:00:00 2001 From: Faizan Shoukat Abbasi Date: Sat, 10 Jan 2026 04:58:12 +0500 Subject: [PATCH 5/5] Show Concierge AI prompts in expense comment placeholders to improve feature discoverability --- .../ReportActionCompose/ReportActionCompose.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index d72d3dee3dd4..d0521b82f2c4 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -13,6 +13,7 @@ import DualDropZone from '@components/DropZone/DualDropZone'; import EmojiPickerButton from '@components/EmojiPicker/EmojiPickerButton'; import ExceededCommentLength from '@components/ExceededCommentLength'; import ImportedStateIndicator from '@components/ImportedStateIndicator'; +import type {LocalizedTranslate} from '@components/LocaleContextProvider'; import type {Mention} from '@components/MentionSuggestions'; import OfflineIndicator from '@components/OfflineIndicator'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -132,6 +133,14 @@ const AI_PLACEHOLDER_KEYS = [ 'reportActionCompose.addColleagueWithMention', ] as const; +/** + * Returns a random AI-aware placeholder for expense threads + */ +function getRandomPlaceholder(translate: LocalizedTranslate): string { + const randomIndex = Math.floor(Math.random() * AI_PLACEHOLDER_KEYS.length); + return translate(AI_PLACEHOLDER_KEYS[randomIndex]); +} + // eslint-disable-next-line import/no-mutable-exports let onSubmitAction = noop; @@ -187,8 +196,6 @@ function ReportActionCompose({ return !draftComment || !!draftComment.match(CONST.REGEX.EMPTY_COMMENT); }); - const [randomPlaceholderIndex] = useState(() => Math.floor(Math.random() * AI_PLACEHOLDER_KEYS.length)); - /** * Updates the visibility state of the menu */ @@ -272,11 +279,11 @@ function ReportActionCompose({ // Show AI-aware placeholder for expense-related reports where user can write // to encourage using Concierge AI for expense management if (isExpenseRelatedReport && canUserPerformWriteAction) { - return translate(AI_PLACEHOLDER_KEYS[randomPlaceholderIndex]); + return getRandomPlaceholder(translate); } return translate('reportActionCompose.writeSomething'); - }, [includesConcierge, translate, userBlockedFromConcierge, isExpenseRelatedReport, canUserPerformWriteAction, randomPlaceholderIndex]); + }, [includesConcierge, translate, userBlockedFromConcierge, isExpenseRelatedReport, canUserPerformWriteAction]); const {displayLabel: agentZeroDisplayLabel, kickoffWaitingIndicator} = useAgentZeroStatusIndicator(reportID, isConciergeChat);