diff --git a/package-lock.json b/package-lock.json index 51d0b57ea76ea..1eb83304e820f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -224,7 +224,7 @@ "electron-builder": "25.0.0", "eslint": "^8.57.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-expensify": "2.0.75", + "eslint-config-expensify": "2.0.76", "eslint-config-prettier": "^9.1.0", "eslint-plugin-deprecation": "^3.0.0", "eslint-plugin-jest": "^28.6.0", @@ -20330,9 +20330,9 @@ } }, "node_modules/eslint-config-expensify": { - "version": "2.0.75", - "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.75.tgz", - "integrity": "sha512-eSzQpxmVMGGXZSoB7aPZoWh75NC3oStyQnd+1JBFUQMDrdCyWjkMl8UJjzBqp/dOHazmVgLQUS1vDfk5cGXe6Q==", + "version": "2.0.76", + "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.76.tgz", + "integrity": "sha512-i6IRvGCUL+o+nYIoOLK7+mk0T+TqVHfAJLubwvckejnmfGaZqYiJIR5BeNyLFWrlXUcjhO9if+6Mu/YOIz6ieA==", "dev": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ed44811a2b274..e8e48a5ee169d 100644 --- a/package.json +++ b/package.json @@ -289,7 +289,7 @@ "electron-builder": "25.0.0", "eslint": "^8.57.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-expensify": "2.0.75", + "eslint-config-expensify": "2.0.76", "eslint-config-prettier": "^9.1.0", "eslint-plugin-deprecation": "^3.0.0", "eslint-plugin-jest": "^28.6.0", diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 9972c03d7b686..c7941941b0378 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -481,7 +481,12 @@ const ROUTES = { }, MONEY_REQUEST_CREATE: { route: ':action/:iouType/start/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string) => `${action as string}/${iouType as string}/start/${transactionID}/${reportID}` as const, + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined) => { + if (!reportID) { + Log.warn('Invalid reportID is used to build the MONEY_REQUEST_CREATE route'); + } + return `${action as string}/${iouType as string}/start/${transactionID}/${reportID}` as const; + }, }, MONEY_REQUEST_STEP_SEND_FROM: { route: 'create/:iouType/from/:transactionID/:reportID', @@ -718,16 +723,30 @@ const ROUTES = { }, MONEY_REQUEST_CREATE_TAB_DISTANCE: { route: ':action/:iouType/start/:transactionID/:reportID/distance', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string) => `create/${iouType as string}/start/${transactionID}/${reportID}/distance` as const, + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined) => { + if (!reportID) { + Log.warn('Invalid reportID is used to build the MONEY_REQUEST_CREATE_TAB_DISTANCE route'); + } + return `create/${iouType as string}/start/${transactionID}/${reportID}/distance` as const; + }, }, MONEY_REQUEST_CREATE_TAB_MANUAL: { route: ':action/:iouType/start/:transactionID/:reportID/manual', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string) => - `${action as string}/${iouType as string}/start/${transactionID}/${reportID}/manual` as const, + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined) => { + if (!reportID) { + Log.warn('Invalid reportID is used to build the MONEY_REQUEST_CREATE_TAB_MANUAL route'); + } + return `${action as string}/${iouType as string}/start/${transactionID}/${reportID}/manual` as const; + }, }, MONEY_REQUEST_CREATE_TAB_SCAN: { route: ':action/:iouType/start/:transactionID/:reportID/scan', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string) => `create/${iouType as string}/start/${transactionID}/${reportID}/scan` as const, + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined) => { + if (!reportID) { + Log.warn('Invalid reportID is used to build the MONEY_REQUEST_CREATE_TAB_SCAN route'); + } + return `create/${iouType as string}/start/${transactionID}/${reportID}/scan` as const; + }, }, MONEY_REQUEST_CREATE_TAB_PER_DIEM: { route: ':action/:iouType/start/:transactionID/:reportID/per-diem', @@ -833,7 +852,12 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export', - getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-online/export` as const, backTo, false), + getRoute: (policyID: string | undefined, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-online/export` as const, backTo, false); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/company-card-expense-account', @@ -841,15 +865,30 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/company-card-expense-account/account-select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/export/company-card-expense-account/account-select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT route'); + } + return `settings/workspaces/${policyID}/accounting/quickbooks-online/export/company-card-expense-account/account-select` as const; + }, }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/company-card-expense-account/default-vendor-select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/export/company-card-expense-account/default-vendor-select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_SELECT route'); + } + return `settings/workspaces/${policyID}/accounting/quickbooks-online/export/company-card-expense-account/default-vendor-select` as const; + }, }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/company-card-expense-account/card-select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/export/company-card-expense-account/card-select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_SELECT route'); + } + return `settings/workspaces/${policyID}/accounting/quickbooks-online/export/company-card-expense-account/card-select` as const; + }, }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_INVOICE_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/invoice-account-select', @@ -1895,36 +1934,75 @@ const ROUTES = { }, POLICY_ACCOUNTING_NETSUITE_REIMBURSEMENT_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/reimbursement-account/select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/reimbursement-account/select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_REIMBURSEMENT_ACCOUNT_SELECT route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/reimbursement-account/select` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_COLLECTION_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/collection-account/select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/collection-account/select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_COLLECTION_ACCOUNT_SELECT route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/collection-account/select` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_EXPENSE_REPORT_APPROVAL_LEVEL_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/expense-report-approval-level/select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/expense-report-approval-level/select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_EXPENSE_REPORT_APPROVAL_LEVEL_SELECT route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/expense-report-approval-level/select` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_VENDOR_BILL_APPROVAL_LEVEL_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/vendor-bill-approval-level/select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/vendor-bill-approval-level/select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_VENDOR_BILL_APPROVAL_LEVEL_SELECT route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/vendor-bill-approval-level/select` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_JOURNAL_ENTRY_APPROVAL_LEVEL_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/journal-entry-approval-level/select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/journal-entry-approval-level/select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_JOURNAL_ENTRY_APPROVAL_LEVEL_SELECT route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/journal-entry-approval-level/select` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_APPROVAL_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/approval-account/select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/approval-account/select` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_APPROVAL_ACCOUNT_SELECT route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/approval-account/select` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_CUSTOM_FORM_ID: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/custom-form-id/:expenseType', - getRoute: (policyID: string, expenseType: ValueOf) => - `settings/workspaces/${policyID}/connections/netsuite/advanced/custom-form-id/${expenseType as string}` as const, + getRoute: (policyID: string | undefined, expenseType: ValueOf) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_CUSTOM_FORM_ID route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/custom-form-id/${expenseType as string}` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_AUTO_SYNC: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/autosync', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/autosync` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_AUTO_SYNC route'); + } + return `settings/workspaces/${policyID}/connections/netsuite/advanced/autosync` as const; + }, }, POLICY_ACCOUNTING_NETSUITE_ACCOUNTING_METHOD: { route: 'settings/workspaces/:policyID/connections/netsuite/advanced/autosync/accounting-method', @@ -1960,7 +2038,12 @@ const ROUTES = { }, POLICY_ACCOUNTING_SAGE_INTACCT_USER_DIMENSIONS: { route: 'settings/workspaces/:policyID/accounting/sage-intacct/import/user-dimensions', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/sage-intacct/import/user-dimensions` as const, + getRoute: (policyID: string | undefined) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_SAGE_INTACCT_USER_DIMENSIONS route'); + } + return `settings/workspaces/${policyID}/accounting/sage-intacct/import/user-dimensions` as const; + }, }, POLICY_ACCOUNTING_SAGE_INTACCT_ADD_USER_DIMENSION: { route: 'settings/workspaces/:policyID/accounting/sage-intacct/import/add-user-dimension', diff --git a/src/components/BrokenConnectionDescription.tsx b/src/components/BrokenConnectionDescription.tsx index 078cbed256317..34b37cef43f96 100644 --- a/src/components/BrokenConnectionDescription.tsx +++ b/src/components/BrokenConnectionDescription.tsx @@ -26,7 +26,7 @@ type BrokenConnectionDescriptionProps = { function BrokenConnectionDescription({transactionID, policy, report}: BrokenConnectionDescriptionProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); - const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID ?? CONST.DEFAULT_NUMBER_ID}`); + const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`); const brokenConnection530Error = transactionViolations?.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530); const brokenConnectionError = transactionViolations?.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION); diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 32389fca5c77f..7f1862c2d6367 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -104,10 +104,8 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout(); const route = useRoute(); - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID || CONST.DEFAULT_NUMBER_ID}`); - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const [nextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${moneyRequestReport?.reportID || CONST.DEFAULT_NUMBER_ID}`); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID}`); + const [nextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${moneyRequestReport?.reportID}`); const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`); const [session] = useOnyx(ONYXKEYS.SESSION); const requestParentReportAction = useMemo(() => { diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 611b18486055b..fd99f31179486 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -107,16 +107,16 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals const {translate, toLocaleDigit} = useLocalize(); const parentReportID = report?.parentReportID; const policyID = report?.policyID; - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID ?? CONST.DEFAULT_NUMBER_ID}`); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReport?.parentReportID ?? CONST.DEFAULT_NUMBER_ID}`, { + const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReport?.parentReportID}`, { selector: (chatReportValue) => chatReportValue && {reportID: chatReportValue.reportID, errorFields: chatReportValue.errorFields}, }); - const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID ?? CONST.DEFAULT_NUMBER_ID}`); - const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID ?? CONST.DEFAULT_NUMBER_ID}`); - const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${updatedTransaction?.reportID ?? CONST.DEFAULT_NUMBER_ID}`); + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`); + const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`); + const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${updatedTransaction?.reportID}`); const targetPolicyID = updatedTransaction?.reportID ? transactionReport?.policyID : policyID; - const [policyTagList] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${targetPolicyID ?? CONST.DEFAULT_NUMBER_ID}`); - const [parentReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID ?? CONST.DEFAULT_NUMBER_ID}`, { + const [policyTagList] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${targetPolicyID}`); + const [parentReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, { canEvict: false, }); @@ -131,9 +131,9 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals return originalMessage?.IOUTransactionID; }, [parentReportAction]); - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID ?? CONST.DEFAULT_NUMBER_ID}`); - const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${linkedTransactionID ?? CONST.DEFAULT_NUMBER_ID}`); - const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${linkedTransactionID ?? CONST.DEFAULT_NUMBER_ID}`); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`); + const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${linkedTransactionID}`); + const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${linkedTransactionID}`); const { created: transactionDate, diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 3a2220515a9c6..49da1a0c2a287 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -150,7 +150,7 @@ function ReportPreview({ const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET); const [invoiceReceiverPolicy] = useOnyx( - `${ONYXKEYS.COLLECTION.POLICY}${chatReport?.invoiceReceiver && 'policyID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.policyID : CONST.DEFAULT_NUMBER_ID}`, + `${ONYXKEYS.COLLECTION.POLICY}${chatReport?.invoiceReceiver && 'policyID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.policyID : undefined}`, ); const [invoiceReceiverPersonalDetail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, { selector: (personalDetails) => diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index a8e23888db0d4..bc99e6826bf56 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -1756,7 +1756,7 @@ function shouldOptionShowTooltip(option: OptionData): boolean { */ function formatSectionsFromSearchTerm( searchTerm: string, - selectedOptions: OptionData[], + selectedOptions: Option[], filteredRecentReports: OptionData[], filteredPersonalDetails: OptionData[], personalDetails: OnyxEntry = {}, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 5e50f69e28faf..ffb2a0a580d15 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5760,11 +5760,11 @@ function buildOptimisticChatReport( visibility?: ValueOf, writeCapability?: ValueOf, notificationPreference: NotificationPreference = CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, - parentReportActionID = '', - parentReportID = '', + parentReportActionID?: string, + parentReportID?: string, description = '', avatarUrl = '', - optimisticReportID = '', + optimisticReportID?: string, ): OptimisticChatReport { const isWorkspaceChatType = chatType && isWorkspaceChat(chatType); const participants = participantList.reduce((reportParticipants: Participants, accountID: number) => { @@ -5794,7 +5794,7 @@ function buildOptimisticChatReport( parentReportID, participants, policyID, - reportID: optimisticReportID || generateReportID(), + reportID: optimisticReportID ?? generateReportID(), reportName, stateNum: 0, statusNum: 0, @@ -7642,7 +7642,11 @@ function canCreateRequest(report: OnyxEntry, policy: OnyxEntry, return requestOptions.includes(iouType); } -function getWorkspaceChats(policyID: string, accountIDs: number[], reports: OnyxCollection = allReports): Array> { +function getWorkspaceChats(policyID: string | undefined, accountIDs: number[], reports: OnyxCollection = allReports): Array> { + if (!policyID) { + return []; + } + return Object.values(reports ?? {}).filter( (report) => isPolicyExpenseChat(report) && report?.policyID === policyID && report?.ownerAccountID && accountIDs.includes(report?.ownerAccountID), ); diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 799d6846cf165..bf0c8d41a168d 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -690,7 +690,7 @@ function clearMoneyRequest(transactionID: string, skipConfirmation = false) { Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, null); } -function startMoneyRequest(iouType: ValueOf, reportID: string, requestType?: IOURequestType, skipConfirmation = false) { +function startMoneyRequest(iouType: ValueOf, reportID: string | undefined, requestType?: IOURequestType, skipConfirmation = false) { clearMoneyRequest(CONST.IOU.OPTIMISTIC_TRANSACTION_ID, skipConfirmation); switch (requestType) { case CONST.IOU.REQUEST_TYPE.MANUAL: diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 1d1090996e489..0acf20c47e60d 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -641,7 +641,10 @@ function clearPolicyErrorField(policyID: string | undefined, fieldName: string) Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {errorFields: {[fieldName]: null}}); } -function clearQBOErrorField(policyID: string, fieldName: string) { +function clearQBOErrorField(policyID: string | undefined, fieldName: string) { + if (!policyID) { + return; + } Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {connections: {quickbooksOnline: {config: {errorFields: {[fieldName]: null}}}}}); } @@ -653,7 +656,10 @@ function clearXeroErrorField(policyID: string, fieldName: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {connections: {xero: {config: {errorFields: {[fieldName]: null}}}}}); } -function clearNetSuiteErrorField(policyID: string, fieldName: string) { +function clearNetSuiteErrorField(policyID: string | undefined, fieldName: string) { + if (!policyID) { + return; + } Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {connections: {netsuite: {options: {config: {errorFields: {[fieldName]: null}}}}}}); } diff --git a/src/libs/actions/QuickActionNavigation.ts b/src/libs/actions/QuickActionNavigation.ts index b89d1a981417e..d35eb21b37a15 100644 --- a/src/libs/actions/QuickActionNavigation.ts +++ b/src/libs/actions/QuickActionNavigation.ts @@ -2,10 +2,11 @@ import {generateReportID} from '@libs/ReportUtils'; import CONST from '@src/CONST'; import type {QuickActionName} from '@src/types/onyx/QuickAction'; import type QuickAction from '@src/types/onyx/QuickAction'; -import * as IOU from './IOU'; -import * as Task from './Task'; +import {startMoneyRequest} from './IOU'; +import type {IOURequestType} from './IOU'; +import {startOutCreateTaskQuickAction} from './Task'; -function getQuickActionRequestType(action: QuickActionName | undefined): IOU.IOURequestType | undefined { +function getQuickActionRequestType(action: QuickActionName | undefined): IOURequestType | undefined { if (!action) { return; } @@ -22,7 +23,12 @@ function getQuickActionRequestType(action: QuickActionName | undefined): IOU.IOU return requestType; } -function navigateToQuickAction(isValidReport: boolean, quickActionReportID: string, quickAction: QuickAction, selectOption: (onSelected: () => void, shouldRestrictAction: boolean) => void) { +function navigateToQuickAction( + isValidReport: boolean, + quickActionReportID: string | undefined, + quickAction: QuickAction, + selectOption: (onSelected: () => void, shouldRestrictAction: boolean) => void, +) { const reportID = isValidReport ? quickActionReportID : generateReportID(); const requestType = getQuickActionRequestType(quickAction?.action); @@ -30,23 +36,23 @@ function navigateToQuickAction(isValidReport: boolean, quickActionReportID: stri case CONST.QUICK_ACTIONS.REQUEST_MANUAL: case CONST.QUICK_ACTIONS.REQUEST_SCAN: case CONST.QUICK_ACTIONS.REQUEST_DISTANCE: - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, reportID, requestType, true), true); + selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SUBMIT, reportID, requestType, true), true); return; case CONST.QUICK_ACTIONS.SPLIT_MANUAL: case CONST.QUICK_ACTIONS.SPLIT_SCAN: case CONST.QUICK_ACTIONS.SPLIT_DISTANCE: - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SPLIT, reportID, requestType, true), true); + selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SPLIT, reportID, requestType, true), true); return; case CONST.QUICK_ACTIONS.SEND_MONEY: - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.PAY, reportID, undefined, true), false); + selectOption(() => startMoneyRequest(CONST.IOU.TYPE.PAY, reportID, undefined, true), false); return; case CONST.QUICK_ACTIONS.ASSIGN_TASK: - selectOption(() => Task.startOutCreateTaskQuickAction(isValidReport ? reportID : '', quickAction.targetAccountID ?? CONST.DEFAULT_NUMBER_ID), false); + selectOption(() => startOutCreateTaskQuickAction(isValidReport ? reportID : undefined, quickAction.targetAccountID ?? CONST.DEFAULT_NUMBER_ID), false); break; case CONST.QUICK_ACTIONS.TRACK_MANUAL: case CONST.QUICK_ACTIONS.TRACK_SCAN: case CONST.QUICK_ACTIONS.TRACK_DISTANCE: - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, reportID, requestType, true), false); + selectOption(() => startMoneyRequest(CONST.IOU.TYPE.TRACK, reportID, requestType, true), false); break; default: } diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 2864b989ed3d4..8ac5b846df4a1 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -910,7 +910,7 @@ function clearOutTaskInfoAndNavigate(reportID?: string, chatReport?: OnyxEntry { if (userDimension.dimension === previousName) { return {dimension: name, mapping}; @@ -346,7 +350,11 @@ function editSageIntacctUserDimensions( ); } -function removeSageIntacctUserDimensions(policyID: string, dimensionName: string, existingUserDimensions: SageIntacctDimension[]) { +function removeSageIntacctUserDimensions(policyID: string | undefined, dimensionName: string, existingUserDimensions: SageIntacctDimension[]) { + if (!policyID) { + return; + } + const newDimensions = existingUserDimensions.filter((userDimension) => dimensionName !== userDimension.dimension); API.write( @@ -532,15 +540,24 @@ function updateSageIntacctDefaultVendor(policyID: string, settingName: keyof Sag } } -function clearSageIntacctErrorField(policyID: string, key: SageIntacctOfflineStateKeys | keyof SageIntacctConnectionsConfig) { +function clearSageIntacctErrorField(policyID: string | undefined, key: SageIntacctOfflineStateKeys | keyof SageIntacctConnectionsConfig) { + if (!policyID) { + return; + } Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {connections: {intacct: {config: {errorFields: {[key]: null}}}}}); } -function clearSageIntacctPendingField(policyID: string, key: SageIntacctOfflineStateKeys | keyof SageIntacctConnectionsConfig) { +function clearSageIntacctPendingField(policyID: string | undefined, key: SageIntacctOfflineStateKeys | keyof SageIntacctConnectionsConfig) { + if (!policyID) { + return; + } Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {connections: {intacct: {config: {pendingFields: {[key]: null}}}}}); } -function removeSageIntacctUserDimensionsByName(dimensions: SageIntacctDimension[], policyID: string, dimensionName: string) { +function removeSageIntacctUserDimensionsByName(dimensions: SageIntacctDimension[], policyID: string | undefined, dimensionName: string) { + if (!policyID) { + return; + } const Dimensions = dimensions.filter((dimension) => dimension.dimension !== dimensionName); Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {connections: {intacct: {config: {mappings: {dimensions: Dimensions}}}}}); } diff --git a/src/libs/actions/connections/index.ts b/src/libs/actions/connections/index.ts index 9087b9fb00c89..626a1abe548ed 100644 --- a/src/libs/actions/connections/index.ts +++ b/src/libs/actions/connections/index.ts @@ -268,11 +268,14 @@ function syncConnection(policyID: string, connectionName: PolicyConnectionName | } function updateManyPolicyConnectionConfigs>( - policyID: string, + policyID: string | undefined, connectionName: TConnectionName, configUpdate: TConfigUpdate, configCurrentData: TConfigUpdate, ) { + if (!policyID) { + return; + } const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, diff --git a/src/pages/NewChatPage.tsx b/src/pages/NewChatPage.tsx index e2df8ceda5c97..640d31e0f40d9 100755 --- a/src/pages/NewChatPage.tsx +++ b/src/pages/NewChatPage.tsx @@ -50,7 +50,7 @@ const excludedGroupEmails: string[] = CONST.EXPENSIFY_EMAILS.filter((value) => v function useOptions() { const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(''); - const [selectedOptions, setSelectedOptions] = useState>([]); + const [selectedOptions, setSelectedOptions] = useState>([]); const [betas] = useOnyx(ONYXKEYS.BETAS); const [newGroupDraft] = useOnyx(ONYXKEYS.NEW_GROUP_CHAT_DRAFT); const personalData = useCurrentUserPersonalDetails(); @@ -209,7 +209,7 @@ function NewChatPage() { if (isOptionInList) { newSelectedOptions = reject(selectedOptions, (selectedOption) => selectedOption.login === option.login); } else { - newSelectedOptions = [...selectedOptions, {...option, isSelected: true, selected: true, reportID: option.reportID ?? `${CONST.DEFAULT_NUMBER_ID}`}]; + newSelectedOptions = [...selectedOptions, {...option, isSelected: true, selected: true, reportID: option.reportID}]; } selectionListRef?.current?.clearInputAfterSelect?.(); @@ -292,7 +292,7 @@ function NewChatPage() { if (!personalData || !personalData.login || !personalData.accountID) { return; } - const selectedParticipants: SelectedParticipant[] = selectedOptions.map((option: OptionData) => ({ + const selectedParticipants: SelectedParticipant[] = selectedOptions.map((option: Option) => ({ login: option?.login, accountID: option.accountID ?? CONST.DEFAULT_NUMBER_ID, })); diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index e8ce294bb991d..e8a70c4d4e80a 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -166,12 +166,9 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const styles = useThemeStyles(); const backTo = route.params.backTo; - // The app would crash due to subscribing to the entire report collection if parentReportID is an empty string. So we should have a fallback ID here. - /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID || CONST.DEFAULT_NUMBER_ID}`); - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`); - const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID || CONST.DEFAULT_NUMBER_ID}`); - /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ + const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`); + const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`); const {reportActions} = usePaginatedReportActions(report.reportID); const {currentSearchHash} = useSearchContext(); diff --git a/src/pages/Travel/TripDetailsPage.tsx b/src/pages/Travel/TripDetailsPage.tsx index 2e9df5a6a5e68..70c00483e5316 100644 --- a/src/pages/Travel/TripDetailsPage.tsx +++ b/src/pages/Travel/TripDetailsPage.tsx @@ -16,9 +16,9 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import type {TravelNavigatorParamList} from '@libs/Navigation/types'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as TripReservationUtils from '@libs/TripReservationUtils'; -import * as Link from '@userActions/Link'; +import {getTripIDFromTransactionParentReportID} from '@libs/ReportUtils'; +import {getTripReservationIcon} from '@libs/TripReservationUtils'; +import {openTravelDotLink} from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; @@ -48,13 +48,13 @@ function TripDetailsPage({route}: TripDetailsPageProps) { const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${route.params.transactionID}`); - const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID ?? CONST.DEFAULT_NUMBER_ID}`); - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID ?? CONST.DEFAULT_NUMBER_ID}`); + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`); + const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`); - const tripID = ReportUtils.getTripIDFromTransactionParentReportID(parentReport?.reportID); + const tripID = getTripIDFromTransactionParentReportID(parentReport?.reportID); const reservationType = transaction?.receipt?.reservationList?.at(route.params.reservationIndex ?? 0)?.type; const reservation = transaction?.receipt?.reservationList?.at(route.params.reservationIndex ?? 0); - const reservationIcon = TripReservationUtils.getTripReservationIcon(reservation?.type); + const reservationIcon = getTripReservationIcon(reservation?.type); const [travelerPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (personalDetails) => pickTravelerPersonalDetails(personalDetails, reservation)}); return ( @@ -112,7 +112,7 @@ function TripDetailsPage({route}: TripDetailsPageProps) { shouldShowRightIcon onPress={() => { setIsModifyTripLoading(true); - Link.openTravelDotLink(activePolicyID, CONST.TRIP_ID_PATH(tripID))?.finally(() => { + openTravelDotLink(activePolicyID, CONST.TRIP_ID_PATH(tripID))?.finally(() => { setIsModifyTripLoading(false); }); }} @@ -128,7 +128,7 @@ function TripDetailsPage({route}: TripDetailsPageProps) { shouldShowRightIcon onPress={() => { setIsTripSupportLoading(true); - Link.openTravelDotLink(activePolicyID, CONST.TRIP_SUPPORT)?.finally(() => { + openTravelDotLink(activePolicyID, CONST.TRIP_SUPPORT)?.finally(() => { setIsTripSupportLoading(false); }); }} diff --git a/src/pages/home/report/ReportActionItemSingle.tsx b/src/pages/home/report/ReportActionItemSingle.tsx index 068a1f25187fe..7bf2873d44d35 100644 --- a/src/pages/home/report/ReportActionItemSingle.tsx +++ b/src/pages/home/report/ReportActionItemSingle.tsx @@ -104,9 +104,7 @@ function ReportActionItemSingle({ const ownerAccountID = iouReport?.ownerAccountID ?? action?.childOwnerAccountID; const isReportPreviewAction = action?.actionName === CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW; const actorAccountID = getReportActionActorAccountID(action, iouReport, report); - const [invoiceReceiverPolicy] = useOnyx( - `${ONYXKEYS.COLLECTION.POLICY}${report?.invoiceReceiver && 'policyID' in report.invoiceReceiver ? report.invoiceReceiver.policyID : CONST.DEFAULT_NUMBER_ID}`, - ); + const [invoiceReceiverPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.invoiceReceiver && 'policyID' in report.invoiceReceiver ? report.invoiceReceiver.policyID : undefined}`); let displayName = getDisplayNameForParticipant(actorAccountID); const {avatar, login, pendingFields, status, fallbackIcon} = personalDetails?.[actorAccountID ?? CONST.DEFAULT_NUMBER_ID] ?? {}; diff --git a/src/pages/home/report/ReportActionsView.tsx b/src/pages/home/report/ReportActionsView.tsx index ceb704b30e6aa..1a49079ba3d4e 100755 --- a/src/pages/home/report/ReportActionsView.tsx +++ b/src/pages/home/report/ReportActionsView.tsx @@ -95,10 +95,10 @@ function ReportActionsView({ const reactionListRef = useContext(ReactionListContext); const route = useRoute>(); const [session] = useOnyx(ONYXKEYS.SESSION); - const [transactionThreadReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID ?? CONST.DEFAULT_NUMBER_ID}`, { + const [transactionThreadReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`, { selector: (reportActions: OnyxEntry) => getSortedReportActionsForDisplay(reportActions, canUserPerformWriteAction(report), true), }); - const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID ?? CONST.DEFAULT_NUMBER_ID}`); + const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`); const [reportMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`); const prevTransactionThreadReport = usePrevious(transactionThreadReport); const reportActionID = route?.params?.reportActionID; diff --git a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx index 580f94e0f2f47..c8ab0da877ae7 100644 --- a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx +++ b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx @@ -7,7 +7,7 @@ import useLocalize from '@hooks/useLocalize'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import {updateLastAccessedWorkspace} from '@libs/actions/Policy/Policy'; -import * as Browser from '@libs/Browser'; +import {isMobile} from '@libs/Browser'; import TopBar from '@libs/Navigation/AppNavigator/createCustomBottomTabNavigator/TopBar'; import Navigation from '@libs/Navigation/Navigation'; import Performance from '@libs/Performance'; @@ -22,7 +22,7 @@ function BaseSidebarScreen() { const activeWorkspaceID = useActiveWorkspaceFromNavigationState(); const {translate} = useLocalize(); const {shouldUseNarrowLayout} = useResponsiveLayout(); - const [activeWorkspace, activeWorkspaceResult] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activeWorkspaceID ?? CONST.DEFAULT_NUMBER_ID}`); + const [activeWorkspace, activeWorkspaceResult] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activeWorkspaceID}`); const isLoading = isLoadingOnyxValue(activeWorkspaceResult); useEffect(() => { @@ -45,7 +45,7 @@ function BaseSidebarScreen() { diff --git a/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx index b77e1bd89f670..dfea9405001fd 100644 --- a/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx +++ b/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx @@ -183,7 +183,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu}: Fl if (isEmptyObject(activePolicy) || !activePolicy?.isPolicyExpenseChatEnabled) { return {} as OnyxTypes.Report; } - const policyChatsForActivePolicy = getWorkspaceChats(`${activePolicyID ?? CONST.DEFAULT_NUMBER_ID}`, [session?.accountID ?? CONST.DEFAULT_NUMBER_ID], allReports); + const policyChatsForActivePolicy = getWorkspaceChats(activePolicyID, session?.accountID ? [session.accountID] : [], allReports); return policyChatsForActivePolicy.length > 0 ? policyChatsForActivePolicy.at(0) : ({} as OnyxTypes.Report); }, [activePolicy, activePolicyID, session?.accountID, allReports]); const [quickActionPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${quickActionReport?.policyID}`); @@ -389,7 +389,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu}: Fl const onSelected = () => { interceptAnonymousUser(() => { hideProductTrainingTooltip(); - navigateToQuickAction(isValidReport, `${quickActionReport?.reportID ?? CONST.DEFAULT_NUMBER_ID}`, quickAction, selectOption); + navigateToQuickAction(isValidReport, quickActionReport?.reportID, quickAction, selectOption); }); }; return [ diff --git a/src/pages/iou/SplitBillDetailsPage.tsx b/src/pages/iou/SplitBillDetailsPage.tsx index 0797f5e925abc..604047dc5cb3c 100644 --- a/src/pages/iou/SplitBillDetailsPage.tsx +++ b/src/pages/iou/SplitBillDetailsPage.tsx @@ -43,8 +43,8 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag const IOUTransactionID = originalMessage?.IOUTransactionID; const participantAccountIDs = originalMessage?.participantAccountIDs ?? []; - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID}`); - const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID}`); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${IOUTransactionID}`); + const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${IOUTransactionID}`); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); const [session] = useOnyx(ONYXKEYS.SESSION); diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index e5572bd342948..188b8877128d3 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -49,8 +49,7 @@ function IOURequestStartPage({ const [selectedTab = CONST.TAB_REQUEST.SCAN, selectedTabResult] = useOnyx(`${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.IOU_REQUEST_TYPE}`); const [session] = useOnyx(ONYXKEYS.SESSION); const isLoadingSelectedTab = shouldUseTab ? isLoadingOnyxValue(selectedTabResult) : false; - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID || CONST.DEFAULT_NUMBER_ID}`); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID}`); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); const {canUsePerDiem} = usePermissions(); diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index 8d1ef11ef23fd..fd6d2ab4e5f4e 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -50,7 +50,7 @@ function IOURequestStepParticipants({ const {translate} = useLocalize(); const styles = useThemeStyles(); const isFocused = useIsFocused(); - const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID ?? CONST.DEFAULT_NUMBER_ID}`); + const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`); // We need to set selectedReportID if user has navigated back from confirmation page and navigates to confirmation page with already selected participant const selectedReportID = useRef(participants?.length === 1 ? participants.at(0)?.reportID ?? reportID : reportID); diff --git a/src/pages/workspace/AccessOrNotFoundWrapper.tsx b/src/pages/workspace/AccessOrNotFoundWrapper.tsx index db33902c2d88c..b973ad4b03b44 100644 --- a/src/pages/workspace/AccessOrNotFoundWrapper.tsx +++ b/src/pages/workspace/AccessOrNotFoundWrapper.tsx @@ -116,7 +116,7 @@ function AccessOrNotFoundWrapper({ ...props }: AccessOrNotFoundWrapperProps) { const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`); - const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID ?? CONST.DEFAULT_NUMBER_ID}`); + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`); const [isLoadingReportData] = useOnyx(ONYXKEYS.IS_LOADING_REPORT_DATA, {initialValue: true}); const {login = ''} = useCurrentUserPersonalDetails(); const isPolicyIDInRoute = !!policyID?.length; diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx index c64c53306a1f9..0948459d12388 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.tsx +++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx @@ -24,14 +24,14 @@ import usePrevious from '@hooks/usePrevious'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useSafeAreaInsets from '@hooks/useSafeAreaInsets'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as ErrorUtils from '@libs/ErrorUtils'; +import {addErrorMessage} from '@libs/ErrorUtils'; import localeCompare from '@libs/LocaleCompare'; import Navigation from '@libs/Navigation/Navigation'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as ValidationUtils from '@libs/ValidationUtils'; +import {getActivePolicies} from '@libs/PolicyUtils'; +import {buildOptimisticChatReport, getCommentLength, getParsedComment, isPolicyAdmin} from '@libs/ReportUtils'; +import {isExistingRoomName, isReservedRoomName, isValidRoomName} from '@libs/ValidationUtils'; import variables from '@styles/variables'; -import * as Report from '@userActions/Report'; +import {addPolicyReport, clearNewRoomFormError} from '@userActions/Report'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -64,7 +64,7 @@ function WorkspaceNewRoomPage() { const workspaceOptions = useMemo( () => - PolicyUtils.getActivePolicies(policies, session?.email) + getActivePolicies(policies, session?.email) ?.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL) .map((policy) => ({ label: policy.name, @@ -79,12 +79,12 @@ function WorkspaceNewRoomPage() { } return ''; }); - const isPolicyAdmin = useMemo(() => { + const isUserPolicyAdmin = useMemo(() => { if (!policyID) { return false; } - return ReportUtils.isPolicyAdmin(policyID, policies); + return isPolicyAdmin(policyID, policies); }, [policyID, policies]); const [newRoomReportID, setNewRoomReportID] = useState(); @@ -92,9 +92,9 @@ function WorkspaceNewRoomPage() { * @param values - form input values passed by the Form component */ const submit = (values: FormOnyxValues) => { - const participants = [session?.accountID ?? -1]; - const parsedDescription = ReportUtils.getParsedComment(values.reportDescription ?? '', {policyID}); - const policyReport = ReportUtils.buildOptimisticChatReport( + const participants = session?.accountID ? [session.accountID] : []; + const parsedDescription = getParsedComment(values.reportDescription ?? '', {policyID}); + const policyReport = buildOptimisticChatReport( participants, values.roomName, CONST.REPORT.CHAT_TYPE.POLICY_ROOM, @@ -105,16 +105,16 @@ function WorkspaceNewRoomPage() { visibility, writeCapability || CONST.REPORT.WRITE_CAPABILITIES.ALL, CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, - '', - '', + undefined, + undefined, parsedDescription, ); setNewRoomReportID(policyReport.reportID); - Report.addPolicyReport(policyReport); + addPolicyReport(policyReport); }; useEffect(() => { - Report.clearNewRoomFormError(); + clearNewRoomFormError(); }, []); useEffect(() => { @@ -140,12 +140,12 @@ function WorkspaceNewRoomPage() { }, [isLoading, errorFields]); useEffect(() => { - if (isPolicyAdmin) { + if (isUserPolicyAdmin) { return; } setWriteCapability(CONST.REPORT.WRITE_CAPABILITIES.ALL); - }, [isPolicyAdmin]); + }, [isUserPolicyAdmin]); /** * @param values - form input values passed by the Form component @@ -157,27 +157,23 @@ function WorkspaceNewRoomPage() { if (!values.roomName || values.roomName === CONST.POLICY.ROOM_PREFIX) { // We error if the user doesn't enter a room name or left blank - ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.pleaseEnterRoomName')); - } else if (values.roomName !== CONST.POLICY.ROOM_PREFIX && !ValidationUtils.isValidRoomName(values.roomName)) { + addErrorMessage(errors, 'roomName', translate('newRoomPage.pleaseEnterRoomName')); + } else if (values.roomName !== CONST.POLICY.ROOM_PREFIX && !isValidRoomName(values.roomName)) { // We error if the room name has invalid characters - ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameInvalidError')); - } else if (ValidationUtils.isReservedRoomName(values.roomName)) { + addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameInvalidError')); + } else if (isReservedRoomName(values.roomName)) { // Certain names are reserved for default rooms and should not be used for policy rooms. - ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameReservedError', {reservedName: values.roomName})); - } else if (ValidationUtils.isExistingRoomName(values.roomName, reports, values.policyID ?? '-1')) { + addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameReservedError', {reservedName: values.roomName})); + } else if (isExistingRoomName(values.roomName, reports, values.policyID)) { // Certain names are reserved for default rooms and should not be used for policy rooms. - ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomAlreadyExistsError')); + addErrorMessage(errors, 'roomName', translate('newRoomPage.roomAlreadyExistsError')); } else if (values.roomName.length > CONST.TITLE_CHARACTER_LIMIT) { - ErrorUtils.addErrorMessage(errors, 'roomName', translate('common.error.characterLimitExceedCounter', {length: values.roomName.length, limit: CONST.TITLE_CHARACTER_LIMIT})); + addErrorMessage(errors, 'roomName', translate('common.error.characterLimitExceedCounter', {length: values.roomName.length, limit: CONST.TITLE_CHARACTER_LIMIT})); } - const descriptionLength = ReportUtils.getCommentLength(values.reportDescription, {policyID}); + const descriptionLength = getCommentLength(values.reportDescription, {policyID}); if (descriptionLength > CONST.REPORT_DESCRIPTION.MAX_LENGTH) { - ErrorUtils.addErrorMessage( - errors, - 'reportDescription', - translate('common.error.characterLimitExceedCounter', {length: descriptionLength, limit: CONST.REPORT_DESCRIPTION.MAX_LENGTH}), - ); + addErrorMessage(errors, 'reportDescription', translate('common.error.characterLimitExceedCounter', {length: descriptionLength, limit: CONST.REPORT_DESCRIPTION.MAX_LENGTH})); } if (!values.policyID) { @@ -302,7 +298,7 @@ function WorkspaceNewRoomPage() { onValueChange={(value) => setPolicyID(value as typeof policyID)} /> - {isPolicyAdmin && ( + {isUserPolicyAdmin && ( userDimension.dimension === editedUserDimensionName); diff --git a/src/pages/workspace/accounting/netsuite/advanced/NetSuiteAdvancedPage.tsx b/src/pages/workspace/accounting/netsuite/advanced/NetSuiteAdvancedPage.tsx index d6a56ae823aa3..f5906ba257477 100644 --- a/src/pages/workspace/accounting/netsuite/advanced/NetSuiteAdvancedPage.tsx +++ b/src/pages/workspace/accounting/netsuite/advanced/NetSuiteAdvancedPage.tsx @@ -44,7 +44,7 @@ type MenuItemWithSubscribedSettings = Pick vendor.id === qboConfig?.nonReimbursableBillDefaultVendor); @@ -34,7 +34,7 @@ function QuickbooksCompanyCardExpenseAccountPage({policy}: WithPolicyConnections }, { title: qboConfig?.nonReimbursableExpensesAccount?.name ?? translate('workspace.qbo.notConfigured'), - description: ConnectionUtils.getQBONonReimbursableExportAccountType(qboConfig?.nonReimbursableExpensesExportDestination), + description: getQBONonReimbursableExportAccountType(qboConfig?.nonReimbursableExpensesExportDestination), onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT.getRoute(policyID)), subscribedSettings: [CONST.QUICKBOOKS_CONFIG.NON_REIMBURSABLE_EXPENSE_ACCOUNT], }, @@ -54,12 +54,12 @@ function QuickbooksCompanyCardExpenseAccountPage({policy}: WithPolicyConnections onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT.getRoute(policyID))} > {sections.map((section) => ( - + @@ -74,10 +74,10 @@ function QuickbooksCompanyCardExpenseAccountPage({policy}: WithPolicyConnections wrapperStyle={[styles.ph5, styles.mb3, styles.mt1]} isActive={!!qboConfig?.autoCreateVendor} shouldPlaceSubtitleBelowSwitch - pendingAction={PolicyUtils.settingsPendingAction([CONST.QUICKBOOKS_CONFIG.AUTO_CREATE_VENDOR], qboConfig?.pendingFields)} - errors={ErrorUtils.getLatestErrorField(qboConfig, CONST.QUICKBOOKS_CONFIG.AUTO_CREATE_VENDOR)} + pendingAction={settingsPendingAction([CONST.QUICKBOOKS_CONFIG.AUTO_CREATE_VENDOR], qboConfig?.pendingFields)} + errors={getLatestErrorField(qboConfig, CONST.QUICKBOOKS_CONFIG.AUTO_CREATE_VENDOR)} onToggle={(isOn) => - Connections.updateManyPolicyConnectionConfigs( + updateManyPolicyConnectionConfigs( policyID, CONST.POLICY.CONNECTIONS.NAME.QBO, { @@ -95,13 +95,13 @@ function QuickbooksCompanyCardExpenseAccountPage({policy}: WithPolicyConnections onCloseError={() => clearQBOErrorField(policyID, CONST.QUICKBOOKS_CONFIG.AUTO_CREATE_VENDOR)} /> {qboConfig?.autoCreateVendor && ( - + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT.getRoute(policyID))} brickRoadIndicator={ - PolicyUtils.areSettingsInErrorFields([CONST.QUICKBOOKS_CONFIG.NON_REIMBURSABLE_BILL_DEFAULT_VENDOR], qboConfig?.errorFields) + areSettingsInErrorFields([CONST.QUICKBOOKS_CONFIG.NON_REIMBURSABLE_BILL_DEFAULT_VENDOR], qboConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined }