From 9c564aa5e1c26d5fc1e1dc8000abe2f230847447 Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Tue, 18 Nov 2025 22:18:14 +0530 Subject: [PATCH 1/8] Add 'Don't show this again' checkbox for empty reports dialog --- src/ONYXKEYS.ts | 4 ++ ...onditionalCreateEmptyReportConfirmation.ts | 19 +++++-- .../useCreateEmptyReportConfirmation.tsx | 33 +++++++++--- src/hooks/useSearchTypeMenuSections.ts | 37 +++++++++---- src/languages/en.ts | 1 + .../API/parameters/CreateAppReportParams.ts | 1 + src/libs/actions/Report.ts | 15 +++++- src/pages/NewReportWorkspaceSelectionPage.tsx | 28 +++++----- src/pages/Search/EmptySearchView.tsx | 40 +++++++++----- .../Search/SearchTransactionsChangeReport.tsx | 4 +- .../AttachmentPickerWithMenuItems.tsx | 15 ++++-- .../FloatingActionButtonAndPopover.tsx | 54 +++++++++++-------- .../iou/request/step/IOURequestEditReport.tsx | 4 +- .../iou/request/step/IOURequestStepReport.tsx | 4 +- 14 files changed, 177 insertions(+), 82 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index fb7c1526f162..7e6681937df2 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -187,6 +187,9 @@ const ONYXKEYS = { */ NVP_DISMISSED_ASAP_SUBMIT_EXPLANATION: 'nvp_dismissedASAPSubmitExplanation', + /** Whether the user dismissed the empty report confirmation dialog */ + NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED: 'nvp_emptyReportsConfirmationDismissed', + /** This NVP contains the training modals the user denied showing again */ NVP_HAS_SEEN_TRACK_TRAINING: 'nvp_hasSeenTrackTraining', @@ -1157,6 +1160,7 @@ type OnyxValuesMapping = { [ONYXKEYS.NVP_TRY_FOCUS_MODE]: boolean; [ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION]: boolean; [ONYXKEYS.NVP_DISMISSED_ASAP_SUBMIT_EXPLANATION]: boolean; + [ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED]: boolean; [ONYXKEYS.NVP_LAST_PAYMENT_METHOD]: OnyxTypes.LastPaymentMethod; [ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT]: string; [ONYXKEYS.LAST_EXPORT_METHOD]: OnyxTypes.LastExportMethod; diff --git a/src/hooks/useConditionalCreateEmptyReportConfirmation.ts b/src/hooks/useConditionalCreateEmptyReportConfirmation.ts index 0a564ad65884..0f32d450e973 100644 --- a/src/hooks/useConditionalCreateEmptyReportConfirmation.ts +++ b/src/hooks/useConditionalCreateEmptyReportConfirmation.ts @@ -13,7 +13,7 @@ type UseConditionalCreateEmptyReportConfirmationParams = { /** The display name of the policy/workspace */ policyName?: string; /** Callback executed after the user confirms report creation */ - onCreateReport: () => void; + onCreateReport: (shouldDismissEmptyReportsConfirmation?: boolean) => void; /** Optional callback executed when the confirmation modal is cancelled */ onCancel?: () => void; /** Whether the confirmation modal should be bypassed even if an empty report exists */ @@ -46,24 +46,33 @@ export default function useConditionalCreateEmptyReportConfirmation({ canBeMissing: true, selector: reportSummariesOnyxSelector, }); + const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); const hasEmptyReport = useMemo(() => hasEmptyReportsForPolicy(reportSummaries, policyID, accountID), [accountID, policyID, reportSummaries]); + const shouldSkipConfirmation = useMemo(() => shouldBypassConfirmation || hasDismissedEmptyReportsConfirmation === true, [hasDismissedEmptyReportsConfirmation, shouldBypassConfirmation]); + + const handleReportCreationConfirmed = useCallback( + (shouldDismissEmptyReportsConfirmation?: boolean) => { + onCreateReport(shouldDismissEmptyReportsConfirmation); + }, + [onCreateReport], + ); const {openCreateReportConfirmation, CreateReportConfirmationModal} = useCreateEmptyReportConfirmation({ policyID, policyName, - onConfirm: onCreateReport, + onConfirm: handleReportCreationConfirmed, onCancel, }); const handleCreateReport = useCallback(() => { - if (hasEmptyReport && !shouldBypassConfirmation) { + if (hasEmptyReport && !shouldSkipConfirmation) { openCreateReportConfirmation(); return; } - onCreateReport(); - }, [hasEmptyReport, onCreateReport, openCreateReportConfirmation, shouldBypassConfirmation]); + onCreateReport(false); + }, [hasEmptyReport, onCreateReport, openCreateReportConfirmation, shouldSkipConfirmation]); return { handleCreateReport, diff --git a/src/hooks/useCreateEmptyReportConfirmation.tsx b/src/hooks/useCreateEmptyReportConfirmation.tsx index ce13cab9ea00..a0cfb8319cf4 100644 --- a/src/hooks/useCreateEmptyReportConfirmation.tsx +++ b/src/hooks/useCreateEmptyReportConfirmation.tsx @@ -1,8 +1,11 @@ import type {ReactNode} from 'react'; import React, {useCallback, useMemo, useState} from 'react'; +import {View} from 'react-native'; +import CheckboxWithLabel from '@components/CheckboxWithLabel'; import ConfirmModal from '@components/ConfirmModal'; import Text from '@components/Text'; import TextLink from '@components/TextLink'; +import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {buildCannedSearchQuery} from '@libs/SearchQueryUtils'; import CONST from '@src/CONST'; @@ -15,7 +18,7 @@ type UseCreateEmptyReportConfirmationParams = { /** The display name of the policy/workspace */ policyName?: string; /** Callback function to execute when user confirms report creation */ - onConfirm: () => void; + onConfirm: (shouldDismissEmptyReportsConfirmation: boolean) => void; /** Optional callback function to execute when user cancels the confirmation */ onCancel?: () => void; }; @@ -49,22 +52,27 @@ type UseCreateEmptyReportConfirmationResult = { */ export default function useCreateEmptyReportConfirmation({policyName, onConfirm, onCancel}: UseCreateEmptyReportConfirmationParams): UseCreateEmptyReportConfirmationResult { const {translate} = useLocalize(); + const styles = useThemeStyles(); const workspaceDisplayName = useMemo(() => (policyName?.trim().length ? policyName : translate('report.newReport.genericWorkspaceName')), [policyName, translate]); const [isVisible, setIsVisible] = useState(false); const [modalWorkspaceName, setModalWorkspaceName] = useState(workspaceDisplayName); + const [shouldDismissEmptyReportsConfirmation, setShouldDismissEmptyReportsConfirmation] = useState(false); const handleConfirm = useCallback(() => { - onConfirm(); + onConfirm(shouldDismissEmptyReportsConfirmation); + setShouldDismissEmptyReportsConfirmation(false); setIsVisible(false); - }, [onConfirm]); + }, [onConfirm, shouldDismissEmptyReportsConfirmation]); const handleCancel = useCallback(() => { onCancel?.(); + setShouldDismissEmptyReportsConfirmation(false); setIsVisible(false); }, [onCancel]); const handleReportsLinkPress = useCallback(() => { onCancel?.(); + setShouldDismissEmptyReportsConfirmation(false); setIsVisible(false); Navigation.navigate(ROUTES.SEARCH_ROOT.getRoute({query: buildCannedSearchQuery({type: CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT})})); }, [onCancel]); @@ -73,17 +81,26 @@ export default function useCreateEmptyReportConfirmation({policyName, onConfirm, // The caller is responsible for determining if empty report confirmation // should be shown. We simply open the modal when called. setModalWorkspaceName(workspaceDisplayName); + setShouldDismissEmptyReportsConfirmation(false); setIsVisible(true); }, [workspaceDisplayName]); const prompt = useMemo( () => ( - - {translate('report.newReport.emptyReportConfirmationPrompt', {workspaceName: modalWorkspaceName})}{' '} - {translate('report.newReport.emptyReportConfirmationPromptLink')}. - + + + {translate('report.newReport.emptyReportConfirmationPrompt', {workspaceName: modalWorkspaceName})}{' '} + {translate('report.newReport.emptyReportConfirmationPromptLink')}. + + setShouldDismissEmptyReportsConfirmation(Boolean(value))} + /> + ), - [handleReportsLinkPress, modalWorkspaceName, translate], + [handleReportsLinkPress, modalWorkspaceName, shouldDismissEmptyReportsConfirmation, styles.gap4, translate], ); const CreateReportConfirmationModal = useMemo( diff --git a/src/hooks/useSearchTypeMenuSections.ts b/src/hooks/useSearchTypeMenuSections.ts index 847c3e99a53b..b76d1ec8da61 100644 --- a/src/hooks/useSearchTypeMenuSections.ts +++ b/src/hooks/useSearchTypeMenuSections.ts @@ -54,15 +54,23 @@ const useSearchTypeMenuSections = () => { const [savedSearches] = useOnyx(ONYXKEYS.SAVED_SEARCHES, {canBeMissing: true}); const [reports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: true}); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true}); + const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); const hasViolations = hasViolationsReportUtils(undefined, transactionViolations); - const [pendingReportCreation, setPendingReportCreation] = useState<{policyID: string; policyName?: string; onConfirm: () => void} | null>(null); - - const handlePendingConfirm = useCallback(() => { - pendingReportCreation?.onConfirm(); - setPendingReportCreation(null); - }, [pendingReportCreation, setPendingReportCreation]); + const [pendingReportCreation, setPendingReportCreation] = useState<{ + policyID: string; + policyName?: string; + onConfirm: (shouldDismissEmptyReportsConfirmation: boolean) => void; + } | null>(null); + + const handlePendingConfirm = useCallback( + (shouldDismissEmptyReportsConfirmation: boolean) => { + pendingReportCreation?.onConfirm(shouldDismissEmptyReportsConfirmation); + setPendingReportCreation(null); + }, + [pendingReportCreation, setPendingReportCreation], + ); const handlePendingCancel = useCallback(() => { setPendingReportCreation(null); @@ -87,12 +95,19 @@ const useSearchTypeMenuSections = () => { return; } - const executeCreate = () => { - const {reportID: createdReportID} = createNewReport(personalDetailsForCreation, isASAPSubmitBetaEnabled, hasViolations, policyID); + const executeCreate = (shouldDismissEmptyReportsConfirmation: boolean) => { + const {reportID: createdReportID} = createNewReport( + personalDetailsForCreation, + isASAPSubmitBetaEnabled, + hasViolations, + policyID, + false, + shouldDismissEmptyReportsConfirmation, + ); onSuccess(createdReportID); }; - if (hasEmptyReportsForPolicy(reports, policyID, accountID)) { + if (hasEmptyReportsForPolicy(reports, policyID, accountID) && hasDismissedEmptyReportsConfirmation !== true) { setPendingReportCreation({ policyID, policyName, @@ -101,9 +116,9 @@ const useSearchTypeMenuSections = () => { return; } - executeCreate(); + executeCreate(false); }, - [currentUserLoginAndAccountID?.accountID, hasViolations, isASAPSubmitBetaEnabled, reports, setPendingReportCreation], + [currentUserLoginAndAccountID?.accountID, hasDismissedEmptyReportsConfirmation, hasViolations, isASAPSubmitBetaEnabled, reports, setPendingReportCreation], ); useEffect(() => { diff --git a/src/languages/en.ts b/src/languages/en.ts index 86ffa35a4329..7aa6eefd6741 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6636,6 +6636,7 @@ const translations = { emptyReportConfirmationPrompt: ({workspaceName}: {workspaceName: string}) => `Are you sure you want to create another report in ${workspaceName}? You can access your empty reports in`, emptyReportConfirmationPromptLink: 'Reports', + emptyReportConfirmationDontShowAgain: "Don't show this again", genericWorkspaceName: 'this workspace', }, genericCreateReportFailureMessage: 'Unexpected error creating this chat. Please try again later.', diff --git a/src/libs/API/parameters/CreateAppReportParams.ts b/src/libs/API/parameters/CreateAppReportParams.ts index 6ac0152ad7a6..444aff653fcf 100644 --- a/src/libs/API/parameters/CreateAppReportParams.ts +++ b/src/libs/API/parameters/CreateAppReportParams.ts @@ -5,5 +5,6 @@ type CreateAppReportParams = { reportID: string; reportActionID: string; reportPreviewReportActionID: string; + shouldDismissEmptyReportsConfirmation?: boolean; }; export default CreateAppReportParams; diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index fc8992eb88c3..4cd70d216740 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -3049,6 +3049,7 @@ function createNewReport( isASAPSubmitBetaEnabled: boolean, policyID?: string, shouldNotifyNewAction = false, + shouldDismissEmptyReportsConfirmation?: boolean, ) { // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850 // eslint-disable-next-line @typescript-eslint/no-deprecated @@ -3067,9 +3068,21 @@ function createNewReport( isASAPSubmitBetaEnabled, ); + if (shouldDismissEmptyReportsConfirmation) { + Onyx.merge(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, true); + } + API.write( WRITE_COMMANDS.CREATE_APP_REPORT, - {reportName: optimisticReportName, type: CONST.REPORT.TYPE.EXPENSE, policyID, reportID: optimisticReportID, reportActionID, reportPreviewReportActionID}, + { + reportName: optimisticReportName, + type: CONST.REPORT.TYPE.EXPENSE, + policyID, + reportID: optimisticReportID, + reportActionID, + reportPreviewReportActionID, + ...(shouldDismissEmptyReportsConfirmation ? {shouldDismissEmptyReportsConfirmation} : {}), + }, {optimisticData, successData, failureData}, ); if (shouldNotifyNewAction) { diff --git a/src/pages/NewReportWorkspaceSelectionPage.tsx b/src/pages/NewReportWorkspaceSelectionPage.tsx index e20c7d5e2415..743166aa8fe0 100644 --- a/src/pages/NewReportWorkspaceSelectionPage.tsx +++ b/src/pages/NewReportWorkspaceSelectionPage.tsx @@ -63,6 +63,7 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); const hasViolations = hasViolationsReportUtils(undefined, transactionViolations); const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true}); + const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); const [policies, fetchStatus] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true}); const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true}); @@ -109,8 +110,8 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag ); const createReport = useCallback( - (policyID: string) => { - const optimisticReport = createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, policyID); + (policyID: string, shouldDismissEmptyReportsConfirmation?: boolean) => { + const optimisticReport = createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, policyID, false, shouldDismissEmptyReportsConfirmation); const selectedTransactionsKeys = Object.keys(selectedTransactions); if (isMovingExpenses && (!!selectedTransactionsKeys.length || !!selectedTransactionIDs.length)) { @@ -160,14 +161,17 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag ], ); - const handleConfirmCreateReport = useCallback(() => { - if (!pendingPolicySelection?.policy.policyID) { - return; - } + const handleConfirmCreateReport = useCallback( + (shouldDismissEmptyReportsConfirmation: boolean) => { + if (!pendingPolicySelection?.policy.policyID) { + return; + } - createReport(pendingPolicySelection.policy.policyID); - setPendingPolicySelection(null); - }, [createReport, pendingPolicySelection?.policy.policyID]); + createReport(pendingPolicySelection.policy.policyID, shouldDismissEmptyReportsConfirmation); + setPendingPolicySelection(null); + }, + [createReport, pendingPolicySelection?.policy.policyID], + ); const handleCancelCreateReport = useCallback(() => { setPendingPolicySelection(null); @@ -195,7 +199,7 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag if (!shouldShowEmptyReportConfirmation) { // No empty report confirmation needed - create report directly and clear pending selection // policyID is guaranteed to be defined by the check above - createReport(policyID); + createReport(policyID, false); setPendingPolicySelection(null); return; } @@ -218,10 +222,10 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag // Capture the decision about whether to show empty report confirmation setPendingPolicySelection({ policy, - shouldShowEmptyReportConfirmation: !!policiesWithEmptyReports?.[policy.policyID], + shouldShowEmptyReportConfirmation: !!policiesWithEmptyReports?.[policy.policyID] && hasDismissedEmptyReportsConfirmation !== true, }); }, - [policiesWithEmptyReports], + [hasDismissedEmptyReportsConfirmation, policiesWithEmptyReports], ); const hasPerDiemTransactions = useMemo(() => { diff --git a/src/pages/Search/EmptySearchView.tsx b/src/pages/Search/EmptySearchView.tsx index 36f2311e2f98..1fc50ee332d5 100644 --- a/src/pages/Search/EmptySearchView.tsx +++ b/src/pages/Search/EmptySearchView.tsx @@ -195,18 +195,32 @@ function EmptySearchViewContent({ canBeMissing: true, selector: reportSummariesOnyxSelector, }); - const hasEmptyReport = useMemo(() => hasEmptyReportsForPolicy(reportSummaries, defaultChatEnabledPolicyID, accountID), [accountID, defaultChatEnabledPolicyID, reportSummaries]); + const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); + const shouldShowEmptyReportConfirmation = useMemo( + () => hasEmptyReportsForPolicy(reportSummaries, defaultChatEnabledPolicyID, accountID) && hasDismissedEmptyReportsConfirmation !== true, + [accountID, defaultChatEnabledPolicyID, hasDismissedEmptyReportsConfirmation, reportSummaries], + ); - const handleCreateWorkspaceReport = useCallback(() => { - if (!defaultChatEnabledPolicyID) { - return; - } + const handleCreateWorkspaceReport = useCallback( + (shouldDismissEmptyReportsConfirmation?: boolean) => { + if (!defaultChatEnabledPolicyID) { + return; + } - const {reportID: createdReportID} = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, defaultChatEnabledPolicyID); - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: createdReportID, backTo: Navigation.getActiveRoute()})); - }); - }, [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicyID, isASAPSubmitBetaEnabled]); + const {reportID: createdReportID} = createNewReport( + currentUserPersonalDetails, + hasViolations, + isASAPSubmitBetaEnabled, + defaultChatEnabledPolicyID, + false, + shouldDismissEmptyReportsConfirmation, + ); + Navigation.setNavigationActionToMicrotaskQueue(() => { + Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: createdReportID, backTo: Navigation.getActiveRoute()})); + }); + }, + [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicyID, isASAPSubmitBetaEnabled], + ); const {openCreateReportConfirmation: openCreateReportFromSearch, CreateReportConfirmationModal} = useCreateEmptyReportConfirmation({ policyID: defaultChatEnabledPolicyID, @@ -215,12 +229,12 @@ function EmptySearchViewContent({ }); const handleCreateReportClick = useCallback(() => { - if (hasEmptyReport) { + if (shouldShowEmptyReportConfirmation) { openCreateReportFromSearch(); } else { - handleCreateWorkspaceReport(); + handleCreateWorkspaceReport(false); } - }, [hasEmptyReport, handleCreateWorkspaceReport, openCreateReportFromSearch]); + }, [handleCreateWorkspaceReport, openCreateReportFromSearch, shouldShowEmptyReportConfirmation]); const typeMenuItems = useMemo(() => { return typeMenuSections.map((section) => section.menuItems).flat(); diff --git a/src/pages/Search/SearchTransactionsChangeReport.tsx b/src/pages/Search/SearchTransactionsChangeReport.tsx index 6e48fa2879bd..370161f960d4 100644 --- a/src/pages/Search/SearchTransactionsChangeReport.tsx +++ b/src/pages/Search/SearchTransactionsChangeReport.tsx @@ -71,8 +71,8 @@ function SearchTransactionsChangeReport() { return report?.ownerAccountID; }, [selectedTransactions, selectedTransactionsKeys]); - const createReportForPolicy = () => { - const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpensesID); + const createReportForPolicy = (shouldDismissEmptyReportsConfirmation?: boolean) => { + const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpensesID, false, shouldDismissEmptyReportsConfirmation); const reportNextStep = allReportNextSteps?.[`${ONYXKEYS.COLLECTION.NEXT_STEP}${optimisticReport.reportID}`]; setNavigationActionToMicrotaskQueue(() => { changeTransactionsReport( diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index 5627058eff50..719ad5a2dda6 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -153,11 +153,15 @@ function AttachmentPickerWithMenuItems({ const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); const hasViolations = hasViolationsReportUtils(undefined, transactionViolations); const [accountID] = useOnyx(ONYXKEYS.SESSION, {selector: accountIDSelector, canBeMissing: true}); + const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); const [reportSummaries = getEmptyArray[number]>()] = useOnyx(ONYXKEYS.COLLECTION.REPORT, { canBeMissing: true, selector: reportSummariesOnyxSelector, }); - const hasEmptyReport = useMemo(() => hasEmptyReportsForPolicy(reportSummaries, report?.policyID, accountID), [accountID, report?.policyID, reportSummaries]); + const shouldShowEmptyReportConfirmation = useMemo( + () => hasEmptyReportsForPolicy(reportSummaries, report?.policyID, accountID) && hasDismissedEmptyReportsConfirmation !== true, + [accountID, hasDismissedEmptyReportsConfirmation, report?.policyID, reportSummaries], + ); const selectOption = useCallback( (onSelected: () => void, shouldRestrictAction: boolean) => { @@ -174,19 +178,20 @@ function AttachmentPickerWithMenuItems({ const {openCreateReportConfirmation, CreateReportConfirmationModal} = useCreateEmptyReportConfirmation({ policyID: report?.policyID, policyName: policy?.name ?? '', - onConfirm: () => selectOption(() => createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, report?.policyID, true), true), + onConfirm: (shouldDismissEmptyReportsConfirmation) => + selectOption(() => createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, report?.policyID, true, shouldDismissEmptyReportsConfirmation), true), }); const openCreateReportConfirmationRef = useRef(openCreateReportConfirmation); openCreateReportConfirmationRef.current = openCreateReportConfirmation; const handleCreateReport = useCallback(() => { - if (hasEmptyReport) { + if (shouldShowEmptyReportConfirmation) { openCreateReportConfirmationRef.current(); } else { - createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, report?.policyID, true); + createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, report?.policyID, true, false); } - }, [currentUserPersonalDetails, hasEmptyReport, isASAPSubmitBetaEnabled, hasViolations, report?.policyID]); + }, [currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, report?.policyID, shouldShowEmptyReportConfirmation]); const teacherUnitePolicyID = isProduction ? CONST.TEACHERS_UNITE.PROD_POLICY_ID : CONST.TEACHERS_UNITE.TEST_POLICY_ID; const isTeachersUniteReport = report?.policyID === teacherUnitePolicyID; diff --git a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx index c1daafa1cb3b..4b1ebf7534dc 100644 --- a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx +++ b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx @@ -196,30 +196,42 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref const defaultChatEnabledPolicyID = defaultChatEnabledPolicy?.id; - const hasEmptyReportForDefaultChatEnabledPolicy = useMemo( - () => hasEmptyReportsForPolicy(reportSummaries, defaultChatEnabledPolicyID, session?.accountID), - [defaultChatEnabledPolicyID, reportSummaries, session?.accountID], + const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); + + const shouldShowEmptyReportConfirmationForDefaultChatEnabledPolicy = useMemo( + () => hasEmptyReportsForPolicy(reportSummaries, defaultChatEnabledPolicyID, session?.accountID) && hasDismissedEmptyReportsConfirmation !== true, + [defaultChatEnabledPolicyID, hasDismissedEmptyReportsConfirmation, reportSummaries, session?.accountID], ); - const handleCreateWorkspaceReport = useCallback(() => { - if (!defaultChatEnabledPolicyID) { - return; - } + const handleCreateWorkspaceReport = useCallback( + (shouldDismissEmptyReportsConfirmation?: boolean) => { + if (!defaultChatEnabledPolicyID) { + return; + } - if (isReportInSearch) { - clearLastSearchParams(); - } + if (isReportInSearch) { + clearLastSearchParams(); + } - const {reportID: createdReportID} = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, defaultChatEnabledPolicyID); - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate( - isSearchTopmostFullScreenRoute() - ? ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: createdReportID, backTo: Navigation.getActiveRoute()}) - : ROUTES.REPORT_WITH_ID.getRoute(createdReportID, undefined, undefined, Navigation.getActiveRoute()), - {forceReplace: isReportInSearch}, + const {reportID: createdReportID} = createNewReport( + currentUserPersonalDetails, + hasViolations, + isASAPSubmitBetaEnabled, + defaultChatEnabledPolicyID, + false, + shouldDismissEmptyReportsConfirmation, ); - }); - }, [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicyID, isASAPSubmitBetaEnabled, isReportInSearch]); + Navigation.setNavigationActionToMicrotaskQueue(() => { + Navigation.navigate( + isSearchTopmostFullScreenRoute() + ? ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: createdReportID, backTo: Navigation.getActiveRoute()}) + : ROUTES.REPORT_WITH_ID.getRoute(createdReportID, undefined, undefined, Navigation.getActiveRoute()), + {forceReplace: isReportInSearch}, + ); + }); + }, + [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicyID, isASAPSubmitBetaEnabled, isReportInSearch], + ); const {openCreateReportConfirmation: openFabCreateReportConfirmation, CreateReportConfirmationModal: FabCreateReportConfirmationModal} = useCreateEmptyReportConfirmation({ policyID: defaultChatEnabledPolicyID, @@ -556,10 +568,10 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref if (!shouldRestrictUserBillableActions(workspaceIDForReportCreation)) { // Check if empty report confirmation should be shown - if (hasEmptyReportForDefaultChatEnabledPolicy) { + if (shouldShowEmptyReportConfirmationForDefaultChatEnabledPolicy) { openFabCreateReportConfirmation(); } else { - handleCreateWorkspaceReport(); + handleCreateWorkspaceReport(false); } return; } diff --git a/src/pages/iou/request/step/IOURequestEditReport.tsx b/src/pages/iou/request/step/IOURequestEditReport.tsx index 3ef9e681e4e4..403e8da23945 100644 --- a/src/pages/iou/request/step/IOURequestEditReport.tsx +++ b/src/pages/iou/request/step/IOURequestEditReport.tsx @@ -97,12 +97,12 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { Navigation.dismissModal(); }; - const createReportForPolicy = () => { + const createReportForPolicy = (shouldDismissEmptyReportsConfirmation?: boolean) => { if (!policyForMovingExpensesID) { return; } - const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpensesID); + const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpensesID, false, shouldDismissEmptyReportsConfirmation); selectReport({value: optimisticReport.reportID}, optimisticReport); }; diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index 6ba6bd5ff2af..6d0846d66581 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -174,12 +174,12 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { // eslint-disable-next-line rulesdir/no-negated-variables const shouldShowNotFoundPage = useShowNotFoundPageInIOUStep(action, iouType, reportActionID, reportOrDraftReport, transaction); - const createReportForPolicy = () => { + const createReportForPolicy = (shouldDismissEmptyReportsConfirmation?: boolean) => { if (!policyForMovingExpensesID) { return; } - const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpensesID); + const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpensesID, false, shouldDismissEmptyReportsConfirmation); handleRegularReportSelection({value: optimisticReport.reportID}, optimisticReport); }; From 31aeae9a08bd49a4920285c6b0a7afa6b276b29b Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Tue, 18 Nov 2025 23:40:26 +0530 Subject: [PATCH 2/8] Lint fixes --- src/hooks/useCreateEmptyReportConfirmation.tsx | 2 +- src/languages/es.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hooks/useCreateEmptyReportConfirmation.tsx b/src/hooks/useCreateEmptyReportConfirmation.tsx index a0cfb8319cf4..e864009f62ed 100644 --- a/src/hooks/useCreateEmptyReportConfirmation.tsx +++ b/src/hooks/useCreateEmptyReportConfirmation.tsx @@ -96,7 +96,7 @@ export default function useCreateEmptyReportConfirmation({policyName, onConfirm, accessibilityLabel={translate('report.newReport.emptyReportConfirmationDontShowAgain')} label={translate('report.newReport.emptyReportConfirmationDontShowAgain')} isChecked={shouldDismissEmptyReportsConfirmation} - onInputChange={(value) => setShouldDismissEmptyReportsConfirmation(Boolean(value))} + onInputChange={(value) => setShouldDismissEmptyReportsConfirmation(!!value)} /> ), diff --git a/src/languages/es.ts b/src/languages/es.ts index b96ee87a3fce..6e2b18ddd3a7 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6291,6 +6291,7 @@ ${amount} para ${merchant} - ${date}`, emptyReportConfirmationPrompt: ({workspaceName}: {workspaceName: string}) => `¿Estás seguro de que quieres crear otro informe en ${workspaceName}? Puedes acceder a tus informes vacíos en`, emptyReportConfirmationPromptLink: 'Informes', + emptyReportConfirmationDontShowAgain: 'No volver a mostrar', genericWorkspaceName: 'este espacio de trabajo', }, genericCreateReportFailureMessage: 'Error inesperado al crear el chat. Por favor, inténtalo más tarde.', From 73f8b4fe6d38d5616f5ffa5cf7954126010f45e2 Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:30:55 +0530 Subject: [PATCH 3/8] Copy updates --- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 7aa6eefd6741..ca423c45a427 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6636,7 +6636,7 @@ const translations = { emptyReportConfirmationPrompt: ({workspaceName}: {workspaceName: string}) => `Are you sure you want to create another report in ${workspaceName}? You can access your empty reports in`, emptyReportConfirmationPromptLink: 'Reports', - emptyReportConfirmationDontShowAgain: "Don't show this again", + emptyReportConfirmationDontShowAgain: "Don't show me this again", genericWorkspaceName: 'this workspace', }, genericCreateReportFailureMessage: 'Unexpected error creating this chat. Please try again later.', diff --git a/src/languages/es.ts b/src/languages/es.ts index 6e2b18ddd3a7..083313b1ea8d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6291,7 +6291,7 @@ ${amount} para ${merchant} - ${date}`, emptyReportConfirmationPrompt: ({workspaceName}: {workspaceName: string}) => `¿Estás seguro de que quieres crear otro informe en ${workspaceName}? Puedes acceder a tus informes vacíos en`, emptyReportConfirmationPromptLink: 'Informes', - emptyReportConfirmationDontShowAgain: 'No volver a mostrar', + emptyReportConfirmationDontShowAgain: 'No me muestres esto otra vez', genericWorkspaceName: 'este espacio de trabajo', }, genericCreateReportFailureMessage: 'Error inesperado al crear el chat. Por favor, inténtalo más tarde.', From e43d59abdc2da57927fb972d8bbddde803f259f7 Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Tue, 25 Nov 2025 03:34:00 +0530 Subject: [PATCH 4/8] Lint fix --- src/hooks/useCreateEmptyReportConfirmation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useCreateEmptyReportConfirmation.tsx b/src/hooks/useCreateEmptyReportConfirmation.tsx index e864009f62ed..8e1e71cd9f53 100644 --- a/src/hooks/useCreateEmptyReportConfirmation.tsx +++ b/src/hooks/useCreateEmptyReportConfirmation.tsx @@ -5,7 +5,7 @@ import CheckboxWithLabel from '@components/CheckboxWithLabel'; import ConfirmModal from '@components/ConfirmModal'; import Text from '@components/Text'; import TextLink from '@components/TextLink'; -import useThemeStyles from '@hooks/useThemeStyles'; +import useThemeStyles from './useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {buildCannedSearchQuery} from '@libs/SearchQueryUtils'; import CONST from '@src/CONST'; From 064ec7b0a20284221d3ac4ff5a6ba482085b375b Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:56:10 +0530 Subject: [PATCH 5/8] Lint fix --- src/hooks/useCreateEmptyReportConfirmation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useCreateEmptyReportConfirmation.tsx b/src/hooks/useCreateEmptyReportConfirmation.tsx index 8e1e71cd9f53..49ca7123fe6e 100644 --- a/src/hooks/useCreateEmptyReportConfirmation.tsx +++ b/src/hooks/useCreateEmptyReportConfirmation.tsx @@ -5,11 +5,11 @@ import CheckboxWithLabel from '@components/CheckboxWithLabel'; import ConfirmModal from '@components/ConfirmModal'; import Text from '@components/Text'; import TextLink from '@components/TextLink'; -import useThemeStyles from './useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {buildCannedSearchQuery} from '@libs/SearchQueryUtils'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import useThemeStyles from './useThemeStyles'; import useLocalize from './useLocalize'; type UseCreateEmptyReportConfirmationParams = { From 1a833b7c64561bf99eb172387c8e8769f6220b3a Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Wed, 26 Nov 2025 10:17:27 +0530 Subject: [PATCH 6/8] Prettier fix --- src/hooks/useCreateEmptyReportConfirmation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useCreateEmptyReportConfirmation.tsx b/src/hooks/useCreateEmptyReportConfirmation.tsx index 49ca7123fe6e..ec278d87d435 100644 --- a/src/hooks/useCreateEmptyReportConfirmation.tsx +++ b/src/hooks/useCreateEmptyReportConfirmation.tsx @@ -9,8 +9,8 @@ import Navigation from '@libs/Navigation/Navigation'; import {buildCannedSearchQuery} from '@libs/SearchQueryUtils'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -import useThemeStyles from './useThemeStyles'; import useLocalize from './useLocalize'; +import useThemeStyles from './useThemeStyles'; type UseCreateEmptyReportConfirmationParams = { /** The policy ID for which the report is being created */ From 933fe46e1ab74b228e5fecdface00fc8a0d7dd03 Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:46:22 +0530 Subject: [PATCH 7/8] Lint fixes --- src/hooks/useSearchTypeMenuSections.ts | 5 +++-- src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hooks/useSearchTypeMenuSections.ts b/src/hooks/useSearchTypeMenuSections.ts index 46cf98532584..a533efea4a06 100644 --- a/src/hooks/useSearchTypeMenuSections.ts +++ b/src/hooks/useSearchTypeMenuSections.ts @@ -52,8 +52,9 @@ const useSearchTypeMenuSections = () => { const [savedSearches] = useOnyx(ONYXKEYS.SAVED_SEARCHES, {canBeMissing: true}); const [allTransactionDrafts] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, {canBeMissing: true}); const shouldRedirectToExpensifyClassic = useMemo(() => areAllGroupPoliciesExpenseChatDisabled(allPolicies ?? {}), [allPolicies]); - const [pendingReportCreation, setPendingReportCreation] = useState<{policyID: string; policyName?: string; onConfirm: () => void} | null>(null); - const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true}); + const [pendingReportCreation, setPendingReportCreation] = useState<{policyID: string; policyName?: string; onConfirm: (shouldDismissEmptyReportsConfirmation: boolean) => void} | null>( + null, + ); const handlePendingConfirm = useCallback( (shouldDismissEmptyReportsConfirmation: boolean) => { diff --git a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx index 1ff51c5282bf..9b767d343cca 100644 --- a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx +++ b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx @@ -54,7 +54,7 @@ import {getQuickActionIcon, getQuickActionTitle, isQuickActionAllowed} from '@li import { generateReportID, getDisplayNameForParticipant, - getIcons, + getIcons, // eslint-disable-next-line @typescript-eslint/no-deprecated getReportName, getWorkspaceChats, hasEmptyReportsForPolicy, @@ -283,6 +283,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref }, [isValidReport, quickActionAvatars, personalDetails, quickAction?.action]); const quickActionSubtitle = useMemo(() => { + // eslint-disable-next-line @typescript-eslint/no-deprecated return !hideQABSubtitle ? (getReportName(quickActionReport, quickActionPolicy, undefined, personalDetails) ?? translate('quickAction.updateDestination')) : ''; // eslint-disable-next-line react-compiler/react-compiler // eslint-disable-next-line react-hooks/exhaustive-deps @@ -479,6 +480,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref ...baseQuickAction, icon: Expensicons.ReceiptScan, text: translate('quickAction.scanReceipt'), + // eslint-disable-next-line @typescript-eslint/no-deprecated description: getReportName(policyChatForActivePolicy), shouldCallAfterModalHide: shouldUseNarrowLayout, onSelected, From 715beca1af848687e6298d49ab48439b95b2ff8c Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Fri, 5 Dec 2025 01:20:43 +0530 Subject: [PATCH 8/8] Add translations --- src/languages/de.ts | 3 ++- src/languages/fr.ts | 3 ++- src/languages/it.ts | 3 ++- src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + 8 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index bc1a19e72f0e..1b5b526f13be 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2558,7 +2558,7 @@ ${ integrationName && CONST.connectionsVideoPaths[integrationName] ? dedent(`[Zur Buchhaltung](${workspaceAccountingLink}). -![Mit ${integrationName} verbinden](${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[integrationName]})`) + ![Mit ${integrationName} verbinden](${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[integrationName]})`) : `[Zur Buchhaltung](${workspaceAccountingLink}).` }`), }, @@ -6664,6 +6664,7 @@ ${ `Möchtest du wirklich einen weiteren Bericht in ${workspaceName} erstellen? Du kannst auf deine leeren Berichte zugreifen unter`, emptyReportConfirmationPromptLink: 'Berichte', genericWorkspaceName: 'diesem Arbeitsbereich', + emptyReportConfirmationDontShowAgain: 'Nicht mehr anzeigen', }, genericCreateReportFailureMessage: 'Unerwarteter Fehler beim Erstellen dieses Chats. Bitte versuchen Sie es später erneut.', genericAddCommentFailureMessage: 'Unerwarteter Fehler beim Posten des Kommentars. Bitte versuchen Sie es später noch einmal.', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 892253861600..9b159f73e462 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2558,7 +2558,7 @@ ${ integrationName && CONST.connectionsVideoPaths[integrationName] ? dedent(`[Accéder à la comptabilité](${workspaceAccountingLink}). - ![Se connecter à ${integrationName}](${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[integrationName]})`) +![Se connecter à ${integrationName}](${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[integrationName]})`) : `[Accéder à la comptabilité](${workspaceAccountingLink}).` }`), }, @@ -6672,6 +6672,7 @@ ${ `Êtes-vous sûr de vouloir créer un autre rapport dans ${workspaceName} ? Vous pouvez accéder à vos rapports vides dans`, emptyReportConfirmationPromptLink: 'Rapports', genericWorkspaceName: 'cet espace de travail', + emptyReportConfirmationDontShowAgain: 'Ne plus afficher ce message', }, genericCreateReportFailureMessage: 'Erreur inattendue lors de la création de ce chat. Veuillez réessayer plus tard.', genericAddCommentFailureMessage: 'Erreur inattendue lors de la publication du commentaire. Veuillez réessayer plus tard.', diff --git a/src/languages/it.ts b/src/languages/it.ts index 5c7601166a27..ef1b5fd25031 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2546,7 +2546,7 @@ ${ integrationName && CONST.connectionsVideoPaths[integrationName] ? dedent(`[Portami alla contabilità](${workspaceAccountingLink}). - ![Connetti a ${integrationName}](${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[integrationName]})`) +![Connetti a ${integrationName}](${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[integrationName]})`) : `[Portami alla contabilità](${workspaceAccountingLink}).` }`), }, @@ -6653,6 +6653,7 @@ ${ `Sei sicuro di voler creare un altro rapporto in ${workspaceName}? Puoi accedere ai tuoi rapporti vuoti in`, emptyReportConfirmationPromptLink: 'Rapporti', genericWorkspaceName: 'questo spazio di lavoro', + emptyReportConfirmationDontShowAgain: 'Non mostrarmelo di nuovo', }, genericCreateReportFailureMessage: 'Errore imprevisto durante la creazione di questa chat. Si prega di riprovare più tardi.', genericAddCommentFailureMessage: 'Errore imprevisto durante la pubblicazione del commento. Per favore riprova più tardi.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 2b22bc05f810..0c69702161d6 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -6586,6 +6586,7 @@ ${ emptyReportConfirmationPrompt: ({workspaceName}: {workspaceName: string}) => `${workspaceName} で別のレポートを作成しますか? 空のレポートには次からアクセスできます`, emptyReportConfirmationPromptLink: 'レポート', genericWorkspaceName: 'このワークスペース', + emptyReportConfirmationDontShowAgain: '今後表示しない', }, genericCreateReportFailureMessage: 'このチャットの作成中に予期しないエラーが発生しました。後でもう一度お試しください。', genericAddCommentFailureMessage: 'コメントの投稿中に予期しないエラーが発生しました。後でもう一度お試しください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 57ec44efb676..d55ef6efd71f 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6634,6 +6634,7 @@ ${ `Weet je zeker dat je nog een rapport wilt maken in ${workspaceName}? Je kunt je lege rapporten vinden onder`, emptyReportConfirmationPromptLink: 'Rapporten', genericWorkspaceName: 'deze werkruimte', + emptyReportConfirmationDontShowAgain: 'Niet meer weergeven', }, genericCreateReportFailureMessage: 'Onverwachte fout bij het maken van deze chat. Probeer het later opnieuw.', genericAddCommentFailureMessage: 'Onverwachte fout bij het plaatsen van de opmerking. Probeer het later opnieuw.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index c918fef6a818..6dbe0981d18d 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -6621,6 +6621,7 @@ ${ `Czy na pewno chcesz utworzyć kolejny raport w ${workspaceName}? Do pustych raportów możesz przejść w`, emptyReportConfirmationPromptLink: 'Raporty', genericWorkspaceName: 'tej przestrzeni roboczej', + emptyReportConfirmationDontShowAgain: 'Nie pokazuj tego ponownie', }, genericCreateReportFailureMessage: 'Nieoczekiwany błąd podczas tworzenia tego czatu. Proszę spróbować ponownie później.', genericAddCommentFailureMessage: 'Nieoczekiwany błąd podczas publikowania komentarza. Spróbuj ponownie później.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 3ef34b54a2bb..2364c07f9061 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6633,6 +6633,7 @@ ${ `Tem certeza de que deseja criar outro relatório em ${workspaceName}? Você pode acessar seus relatórios vazios em`, emptyReportConfirmationPromptLink: 'Relatórios', genericWorkspaceName: 'este espaço de trabalho', + emptyReportConfirmationDontShowAgain: 'Não mostrar isso novamente', }, genericCreateReportFailureMessage: 'Erro inesperado ao criar este chat. Por favor, tente novamente mais tarde.', genericAddCommentFailureMessage: 'Erro inesperado ao postar o comentário. Por favor, tente novamente mais tarde.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index f742e01f3543..b4d158edad3c 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6496,6 +6496,7 @@ ${ emptyReportConfirmationPrompt: ({workspaceName}: {workspaceName: string}) => `确定要在 ${workspaceName} 中再创建一个报告吗?你可以在以下位置访问你的空报告`, emptyReportConfirmationPromptLink: '报告', genericWorkspaceName: '此工作区', + emptyReportConfirmationDontShowAgain: '不再显示此内容', }, genericCreateReportFailureMessage: '创建此聊天时出现意外错误。请稍后再试。', genericAddCommentFailureMessage: '发表评论时出现意外错误。请稍后再试。',