From e0afd4c3a3f028a0bba0beb9b9aab60f43bf6fca Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Mon, 28 Oct 2024 04:03:25 +0530 Subject: [PATCH 1/9] fix: Wrong validation message when sending invoice. Signed-off-by: krishna2323 --- package-lock.json | 8 ++++---- package.json | 2 +- src/CONST.ts | 1 + .../BusinessInfo/substeps/WebsiteBusiness.tsx | 3 ++- .../utils/getInitialSubstepForBusinessInfo.ts | 3 ++- src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx | 2 +- .../invoices/WorkspaceInvoicingDetailsWebsite.tsx | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01f553a6a74c8..a7ee61d597736 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "date-fns-tz": "^3.2.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.94", + "expensify-common": "2.0.103", "expo": "51.0.31", "expo-av": "14.0.7", "expo-image": "1.12.15", @@ -24073,9 +24073,9 @@ } }, "node_modules/expensify-common": { - "version": "2.0.94", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.94.tgz", - "integrity": "sha512-Cco5X6u4IL5aQlFqa2IgGgR+vAffYLxpPN2d7bzfptW/pRLY2L2JRJohgvXEswlCcTKFVt4nIJ4bx9YIOvzxBA==", + "version": "2.0.103", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.103.tgz", + "integrity": "sha512-Q42bUK6TeB87qN4MEBDlhNH1qQqUXY+tJKCZTt01Zv+lcn7KemudOCt7GNoEwfR7LLWsWuec7Vb5x45rQJNC2A==", "dependencies": { "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", diff --git a/package.json b/package.json index 9f401ff9742a1..23a38866b1254 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "date-fns-tz": "^3.2.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.94", + "expensify-common": "2.0.103", "expo": "51.0.31", "expo-av": "14.0.7", "expo-image": "1.12.15", diff --git a/src/CONST.ts b/src/CONST.ts index 17cc92998fc16..9baddfa8a5f3f 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -357,6 +357,7 @@ const CONST = { OLD_DOT_ANDROID: 'https://play.google.com/store/apps/details?id=org.me.mobiexpensifyg&hl=en_US&pli=1', OLD_DOT_IOS: 'https://apps.apple.com/us/app/expensify-expense-tracker/id471713959', }, + URL_DEFAULT_SCHEME: 'http', DATE: { SQL_DATE_TIME: 'YYYY-MM-DD HH:mm:ss', FNS_FORMAT_STRING: 'yyyy-MM-dd', diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx index 3d8fcd944f4fd..05f115b557056 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx @@ -1,3 +1,4 @@ +import {Str} from 'expensify-common'; import React, {useCallback, useMemo} from 'react'; import {useOnyx} from 'react-native-onyx'; import FormProvider from '@components/Form/FormProvider'; @@ -33,7 +34,7 @@ function WebsiteBusiness({onNext, isEditing}: SubStepProps) { (values: FormOnyxValues): FormInputErrors => { const errors = ValidationUtils.getFieldRequiredErrors(values, STEP_FIELDS); - if (values.website && !ValidationUtils.isValidWebsite(values.website)) { + if (values.website && !ValidationUtils.isValidWebsite(Str.sanitizeURL(values.website))) { errors.website = translate('bankAccount.error.website'); } diff --git a/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts b/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts index 099eacaa690f7..48ff20b1259ac 100644 --- a/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts +++ b/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts @@ -1,3 +1,4 @@ +import {Str} from 'expensify-common'; import * as ValidationUtils from '@libs/ValidationUtils'; import INPUT_IDS from '@src/types/form/ReimbursementAccountForm'; import type {CompanyStepProps} from '@src/types/form/ReimbursementAccountForm'; @@ -16,7 +17,7 @@ function getInitialSubstepForBusinessInfo(data: CompanyStepProps): number { return 1; } - if (!ValidationUtils.isValidWebsite(data[businessInfoStepKeys.COMPANY_WEBSITE])) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(data[businessInfoStepKeys.COMPANY_WEBSITE]))) { return 2; } diff --git a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx index d53940a4cfcb3..cbfc7ce6ddcbe 100644 --- a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx +++ b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx @@ -49,7 +49,7 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_NAME, INPUT_IDS.COMPANY_WEBSITE]); if (values.companyWebsite) { - if (!ValidationUtils.isValidWebsite(values.companyWebsite)) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.URL_DEFAULT_SCHEME))) { errors.companyWebsite = translate('bankAccount.error.website'); } else { const domain = Url.extractUrlDomain(values.companyWebsite); diff --git a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx index 0427aef81db31..5a04f161cfa11 100644 --- a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx +++ b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx @@ -43,7 +43,7 @@ function WorkspaceInvoicingDetailsWebsite({route}: WorkspaceInvoicingDetailsWebs const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_WEBSITE]); if (values.companyWebsite) { - if (!ValidationUtils.isValidWebsite(values.companyWebsite)) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite))) { errors.companyWebsite = translate('bankAccount.error.website'); } else { const domain = Url.extractUrlDomain(values.companyWebsite); From b80d2352a8518c77ebcac91486c8b7145626af45 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Mon, 28 Oct 2024 04:05:12 +0530 Subject: [PATCH 2/9] use default scheme. Signed-off-by: krishna2323 --- .../BusinessInfo/substeps/WebsiteBusiness.tsx | 2 +- .../utils/getInitialSubstepForBusinessInfo.ts | 3 ++- .../workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx index 05f115b557056..f3bf8d46d0cc8 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx @@ -34,7 +34,7 @@ function WebsiteBusiness({onNext, isEditing}: SubStepProps) { (values: FormOnyxValues): FormInputErrors => { const errors = ValidationUtils.getFieldRequiredErrors(values, STEP_FIELDS); - if (values.website && !ValidationUtils.isValidWebsite(Str.sanitizeURL(values.website))) { + if (values.website && !ValidationUtils.isValidWebsite(Str.sanitizeURL(values.website, CONST.URL_DEFAULT_SCHEME))) { errors.website = translate('bankAccount.error.website'); } diff --git a/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts b/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts index 48ff20b1259ac..7dee8081da6af 100644 --- a/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts +++ b/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts @@ -1,5 +1,6 @@ import {Str} from 'expensify-common'; import * as ValidationUtils from '@libs/ValidationUtils'; +import CONST from '@src/CONST'; import INPUT_IDS from '@src/types/form/ReimbursementAccountForm'; import type {CompanyStepProps} from '@src/types/form/ReimbursementAccountForm'; @@ -17,7 +18,7 @@ function getInitialSubstepForBusinessInfo(data: CompanyStepProps): number { return 1; } - if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(data[businessInfoStepKeys.COMPANY_WEBSITE]))) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(data[businessInfoStepKeys.COMPANY_WEBSITE], CONST.URL_DEFAULT_SCHEME))) { return 2; } diff --git a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx index 5a04f161cfa11..3450c0e58e660 100644 --- a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx +++ b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx @@ -43,7 +43,7 @@ function WorkspaceInvoicingDetailsWebsite({route}: WorkspaceInvoicingDetailsWebs const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_WEBSITE]); if (values.companyWebsite) { - if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite))) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.URL_DEFAULT_SCHEME))) { errors.companyWebsite = translate('bankAccount.error.website'); } else { const domain = Url.extractUrlDomain(values.companyWebsite); From a9a8310e87ac123e3e57dad2819e899dec4424c5 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Mon, 28 Oct 2024 04:29:45 +0530 Subject: [PATCH 3/9] fix conflicts. Signed-off-by: krishna2323 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7ee61d597736..01f553a6a74c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "date-fns-tz": "^3.2.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.103", + "expensify-common": "2.0.94", "expo": "51.0.31", "expo-av": "14.0.7", "expo-image": "1.12.15", @@ -24073,9 +24073,9 @@ } }, "node_modules/expensify-common": { - "version": "2.0.103", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.103.tgz", - "integrity": "sha512-Q42bUK6TeB87qN4MEBDlhNH1qQqUXY+tJKCZTt01Zv+lcn7KemudOCt7GNoEwfR7LLWsWuec7Vb5x45rQJNC2A==", + "version": "2.0.94", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.94.tgz", + "integrity": "sha512-Cco5X6u4IL5aQlFqa2IgGgR+vAffYLxpPN2d7bzfptW/pRLY2L2JRJohgvXEswlCcTKFVt4nIJ4bx9YIOvzxBA==", "dependencies": { "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", diff --git a/package.json b/package.json index 23a38866b1254..9f401ff9742a1 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "date-fns-tz": "^3.2.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.103", + "expensify-common": "2.0.94", "expo": "51.0.31", "expo-av": "14.0.7", "expo-image": "1.12.15", From 0bc874781fe10d25e4a304745465647586d68eeb Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Mon, 28 Oct 2024 04:33:54 +0530 Subject: [PATCH 4/9] bump expensify-common version. Signed-off-by: krishna2323 --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7202ef76ab665..3df99f766ba4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "date-fns-tz": "^3.2.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.100", + "expensify-common": "2.0.103", "expo": "51.0.31", "expo-av": "14.0.7", "expo-image": "1.12.15", @@ -24050,9 +24050,10 @@ } }, "node_modules/expensify-common": { - "version": "2.0.100", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.100.tgz", - "integrity": "sha512-mektI+OuTywYU47Valjsn2+kLQ1/Wc9sWCY1/a0Vo8IHTXroQWvbKs5IXlkiqODi4SRonVZwOL3ha/oJD7o7nQ==", + "version": "2.0.103", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.103.tgz", + "integrity": "sha512-Q42bUK6TeB87qN4MEBDlhNH1qQqUXY+tJKCZTt01Zv+lcn7KemudOCt7GNoEwfR7LLWsWuec7Vb5x45rQJNC2A==", + "license": "MIT", "dependencies": { "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", diff --git a/package.json b/package.json index f0425a7479673..01b80f6ea38f8 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "date-fns-tz": "^3.2.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.100", + "expensify-common": "2.0.103", "expo": "51.0.31", "expo-av": "14.0.7", "expo-image": "1.12.15", From eba8073871b0e2d8a4282769023182be40ca6745 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Wed, 30 Oct 2024 23:18:59 +0530 Subject: [PATCH 5/9] minor update. Signed-off-by: krishna2323 --- src/CONST.ts | 2 +- .../BusinessInfo/substeps/WebsiteBusiness.tsx | 2 +- .../utils/getInitialSubstepForBusinessInfo.ts | 2 +- src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx | 2 +- .../workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 211e4743d4aba..6551b004b35da 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -353,7 +353,7 @@ const CONST = { OLD_DOT_ANDROID: 'https://play.google.com/store/apps/details?id=org.me.mobiexpensifyg&hl=en_US&pli=1', OLD_DOT_IOS: 'https://apps.apple.com/us/app/expensify-expense-tracker/id471713959', }, - URL_DEFAULT_SCHEME: 'http', + COMPANY_WEBSITE_DEFAULT_SCHEME: 'http', DATE: { SQL_DATE_TIME: 'YYYY-MM-DD HH:mm:ss', FNS_FORMAT_STRING: 'yyyy-MM-dd', diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx index f3bf8d46d0cc8..0c1141126f8bc 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx @@ -34,7 +34,7 @@ function WebsiteBusiness({onNext, isEditing}: SubStepProps) { (values: FormOnyxValues): FormInputErrors => { const errors = ValidationUtils.getFieldRequiredErrors(values, STEP_FIELDS); - if (values.website && !ValidationUtils.isValidWebsite(Str.sanitizeURL(values.website, CONST.URL_DEFAULT_SCHEME))) { + if (values.website && !ValidationUtils.isValidWebsite(Str.sanitizeURL(values.website, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME))) { errors.website = translate('bankAccount.error.website'); } diff --git a/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts b/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts index 7dee8081da6af..7173455afd05d 100644 --- a/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts +++ b/src/pages/ReimbursementAccount/utils/getInitialSubstepForBusinessInfo.ts @@ -18,7 +18,7 @@ function getInitialSubstepForBusinessInfo(data: CompanyStepProps): number { return 1; } - if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(data[businessInfoStepKeys.COMPANY_WEBSITE], CONST.URL_DEFAULT_SCHEME))) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(data[businessInfoStepKeys.COMPANY_WEBSITE], CONST.COMPANY_WEBSITE_DEFAULT_SCHEME))) { return 2; } diff --git a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx index cbfc7ce6ddcbe..11fd50b67d88a 100644 --- a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx +++ b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx @@ -49,7 +49,7 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_NAME, INPUT_IDS.COMPANY_WEBSITE]); if (values.companyWebsite) { - if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.URL_DEFAULT_SCHEME))) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME))) { errors.companyWebsite = translate('bankAccount.error.website'); } else { const domain = Url.extractUrlDomain(values.companyWebsite); diff --git a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx index 3450c0e58e660..f5d0cd1b68190 100644 --- a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx +++ b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx @@ -43,7 +43,7 @@ function WorkspaceInvoicingDetailsWebsite({route}: WorkspaceInvoicingDetailsWebs const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_WEBSITE]); if (values.companyWebsite) { - if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.URL_DEFAULT_SCHEME))) { + if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME))) { errors.companyWebsite = translate('bankAccount.error.website'); } else { const domain = Url.extractUrlDomain(values.companyWebsite); From 077960e756fd06b158c21646cdcc6d71bfba807a Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Thu, 31 Oct 2024 02:59:45 +0530 Subject: [PATCH 6/9] sanitize URL before sending it to backend. Signed-off-by: krishna2323 --- src/libs/actions/IOU.ts | 4 ++-- src/libs/actions/Policy/Policy.ts | 4 ++-- src/pages/ReimbursementAccount/BusinessInfo/BusinessInfo.tsx | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 7ce9b9dfb2722..b77aaa3d0db36 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1988,7 +1988,7 @@ function getSendInvoiceInformation( policyCategories, optimisticRecentlyUsedCurrencies, companyName, - companyWebsite, + Str.sanitizeURL(companyWebsite ?? '', CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), ); return { @@ -3741,7 +3741,7 @@ function sendInvoice( transactionID, transactionThreadReportID, companyName, - companyWebsite, + companyWebsite: Str.sanitizeURL(companyWebsite ?? '', CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), ...(invoiceChatReport?.reportID ? {receiverInvoiceRoomID: invoiceChatReport.reportID} : {receiverEmail: receiver.login ?? ''}), }; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index b419431bbbb3a..4b7d1ccef2382 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -4464,7 +4464,7 @@ function updateInvoiceCompanyWebsite(policyID: string, companyWebsite: string) { key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { invoice: { - companyWebsite, + companyWebsite: Str.sanitizeURL(companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), pendingFields: { companyWebsite: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, @@ -4505,7 +4505,7 @@ function updateInvoiceCompanyWebsite(policyID: string, companyWebsite: string) { const parameters: UpdateInvoiceCompanyWebsiteParams = { authToken, policyID, - companyWebsite, + companyWebsite: Str.sanitizeURL(companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), }; API.write(WRITE_COMMANDS.UPDATE_INVOICE_COMPANY_WEBSITE, parameters, {optimisticData, successData, failureData}); diff --git a/src/pages/ReimbursementAccount/BusinessInfo/BusinessInfo.tsx b/src/pages/ReimbursementAccount/BusinessInfo/BusinessInfo.tsx index 0a94e22cde1f1..7f45de42122bb 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/BusinessInfo.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/BusinessInfo.tsx @@ -1,3 +1,4 @@ +import {Str} from 'expensify-common'; import lodashPick from 'lodash/pick'; import React, {useCallback, useMemo} from 'react'; import {useOnyx} from 'react-native-onyx'; @@ -60,6 +61,7 @@ function BusinessInfo({onBackButtonPress}: BusinessInfoProps) { const submit = useCallback( (isConfirmPage: boolean) => { + const companyWebsite = Str.sanitizeURL(values.website, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); BankAccounts.updateCompanyInformationForBankAccount( Number(reimbursementAccount?.achData?.bankAccountID ?? '-1'), { @@ -67,7 +69,7 @@ function BusinessInfo({onBackButtonPress}: BusinessInfoProps) { ...getBankAccountFields(['routingNumber', 'accountNumber', 'bankName', 'plaidAccountID', 'plaidAccessToken', 'isSavings']), companyTaxID: values.companyTaxID?.replace(CONST.REGEX.NON_NUMERIC, ''), companyPhone: parsePhoneNumber(values.companyPhone ?? '', {regionCode: CONST.COUNTRY.US}).number?.significant, - website: ValidationUtils.isValidWebsite(values.website) ? values.website : undefined, + website: ValidationUtils.isValidWebsite(companyWebsite) ? companyWebsite : undefined, }, policyID, isConfirmPage, From 0b28590f39771c5d8b812190f1b69905fe79ad78 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Sat, 2 Nov 2024 03:42:02 +0530 Subject: [PATCH 7/9] sanitize website in the components. Signed-off-by: krishna2323 --- src/libs/BankAccountUtils.ts | 2 +- src/libs/actions/IOU.ts | 4 ++-- src/libs/actions/Policy/Policy.ts | 4 ++-- .../BusinessInfo/substeps/WebsiteBusiness.tsx | 3 ++- src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx | 7 ++++--- .../invoices/WorkspaceInvoicingDetailsWebsite.tsx | 3 ++- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/libs/BankAccountUtils.ts b/src/libs/BankAccountUtils.ts index c781ccab3f336..89bcf96c642f2 100644 --- a/src/libs/BankAccountUtils.ts +++ b/src/libs/BankAccountUtils.ts @@ -3,7 +3,7 @@ import type {OnyxEntry} from 'react-native-onyx'; import type * as OnyxTypes from '@src/types/onyx'; function getDefaultCompanyWebsite(session: OnyxEntry, user: OnyxEntry): string { - return user?.isFromPublicDomain ? 'https://' : `https://www.${Str.extractEmailDomain(session?.email ?? '')}`; + return user?.isFromPublicDomain ? '' : `https://www.${Str.extractEmailDomain(session?.email ?? '')}`; } function getLastFourDigits(bankAccountNumber: string): string { diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index dbf8a38e8235c..6893a66f20504 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1988,7 +1988,7 @@ function getSendInvoiceInformation( policyCategories, optimisticRecentlyUsedCurrencies, companyName, - Str.sanitizeURL(companyWebsite ?? '', CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), + companyWebsite, ); return { @@ -3742,7 +3742,7 @@ function sendInvoice( transactionID, transactionThreadReportID, companyName, - companyWebsite: Str.sanitizeURL(companyWebsite ?? '', CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), + companyWebsite, ...(invoiceChatReport?.reportID ? {receiverInvoiceRoomID: invoiceChatReport.reportID} : {receiverEmail: receiver.login ?? ''}), }; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 4b7d1ccef2382..b419431bbbb3a 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -4464,7 +4464,7 @@ function updateInvoiceCompanyWebsite(policyID: string, companyWebsite: string) { key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { invoice: { - companyWebsite: Str.sanitizeURL(companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), + companyWebsite, pendingFields: { companyWebsite: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, @@ -4505,7 +4505,7 @@ function updateInvoiceCompanyWebsite(policyID: string, companyWebsite: string) { const parameters: UpdateInvoiceCompanyWebsiteParams = { authToken, policyID, - companyWebsite: Str.sanitizeURL(companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME), + companyWebsite, }; API.write(WRITE_COMMANDS.UPDATE_INVOICE_COMPANY_WEBSITE, parameters, {optimisticData, successData, failureData}); diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx index 0c1141126f8bc..5ef5e7c75c8d1 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx @@ -45,7 +45,8 @@ function WebsiteBusiness({onNext, isEditing}: SubStepProps) { const handleSubmit = useReimbursementAccountStepFormSubmit({ fieldIds: STEP_FIELDS, onNext: (values) => { - BankAccounts.addBusinessWebsiteForDraft((values as {website: string})?.website); + const website = Str.sanitizeURL((values as {website: string})?.website, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); + BankAccounts.addBusinessWebsiteForDraft(website); onNext(); }, shouldSaveDraft: true, diff --git a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx index 11fd50b67d88a..60b84a9f7fa99 100644 --- a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx +++ b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx @@ -47,9 +47,9 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC const validate = useCallback( (values: FormOnyxValues): FormInputErrors => { const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_NAME, INPUT_IDS.COMPANY_WEBSITE]); - + const companyWebsite = Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); if (values.companyWebsite) { - if (!ValidationUtils.isValidWebsite(Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME))) { + if (!ValidationUtils.isValidWebsite(companyWebsite)) { errors.companyWebsite = translate('bankAccount.error.website'); } else { const domain = Url.extractUrlDomain(values.companyWebsite); @@ -68,8 +68,9 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC ); const submit = (values: FormOnyxValues) => { + const companyWebsite = Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); playSound(SOUNDS.DONE); - IOU.sendInvoice(currentUserPersonalDetails.accountID, transaction, report, undefined, policy, policyTags, policyCategories, values.companyName, values.companyWebsite); + IOU.sendInvoice(currentUserPersonalDetails.accountID, transaction, report, undefined, policy, policyTags, policyCategories, values.companyName, companyWebsite); }; return ( diff --git a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx index 7c9ed9b2eb8b7..2f57df75e67a2 100644 --- a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx +++ b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx @@ -34,7 +34,8 @@ function WorkspaceInvoicingDetailsWebsite({route}: WorkspaceInvoicingDetailsWebs // eslint-disable-next-line @typescript-eslint/no-unused-vars const submit = (values: FormOnyxValues) => { - Policy.updateInvoiceCompanyWebsite(policyID, values[INPUT_IDS.COMPANY_WEBSITE]); + const companyWebsite = Str.sanitizeURL(values[INPUT_IDS.COMPANY_WEBSITE], CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); + Policy.updateInvoiceCompanyWebsite(policyID, companyWebsite); Navigation.goBack(); }; From 9eeff4aa55eb5753a3deb4fe08bdd8038aa62d9e Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Sat, 2 Nov 2024 03:43:26 +0530 Subject: [PATCH 8/9] minor update. Signed-off-by: krishna2323 --- src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx index 60b84a9f7fa99..aeb064de11fa4 100644 --- a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx +++ b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx @@ -47,8 +47,8 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC const validate = useCallback( (values: FormOnyxValues): FormInputErrors => { const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMPANY_NAME, INPUT_IDS.COMPANY_WEBSITE]); - const companyWebsite = Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); if (values.companyWebsite) { + const companyWebsite = Str.sanitizeURL(values.companyWebsite, CONST.COMPANY_WEBSITE_DEFAULT_SCHEME); if (!ValidationUtils.isValidWebsite(companyWebsite)) { errors.companyWebsite = translate('bankAccount.error.website'); } else { From e877d6048af3c12fc59dc6973a9edfedda19152e Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Mon, 4 Nov 2024 10:26:04 +0530 Subject: [PATCH 9/9] use getDefaultCompanyWebsite in IOURequestStepCompanyInfo & WorkspaceInvoicingDetailsWebsite. Signed-off-by: krishna2323 --- src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx | 7 ++++++- .../invoices/WorkspaceInvoicingDetailsWebsite.tsx | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx index aeb064de11fa4..1c2f14dbbb2b8 100644 --- a/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx +++ b/src/pages/iou/request/step/IOURequestStepCompanyInfo.tsx @@ -1,5 +1,5 @@ import {Str} from 'expensify-common'; -import React, {useCallback} from 'react'; +import React, {useCallback, useMemo} from 'react'; import {useOnyx} from 'react-native-onyx'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; @@ -11,6 +11,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' import useLocalize from '@hooks/useLocalize'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; +import {getDefaultCompanyWebsite} from '@libs/BankAccountUtils'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import playSound, {SOUNDS} from '@libs/Sound'; import * as Url from '@libs/Url'; @@ -37,6 +38,9 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC const {translate} = useLocalize(); const {inputCallbackRef} = useAutoFocusInput(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const [session] = useOnyx(ONYXKEYS.SESSION); + const [user] = useOnyx(ONYXKEYS.USER); + const defaultWebsiteExample = useMemo(() => getDefaultCompanyWebsite(session, user), [session, user]); const policy = usePolicy(IOU.getIOURequestPolicyID(transaction, report)); const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${IOU.getIOURequestPolicyID(transaction, report)}`); @@ -108,6 +112,7 @@ function IOURequestStepCompanyInfo({route, report, transaction}: IOURequestStepC accessibilityLabel={translate('iou.yourCompanyWebsite')} role={CONST.ROLE.PRESENTATION} hint={translate('iou.yourCompanyWebsiteNote')} + defaultValue={defaultWebsiteExample} /> diff --git a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx index 2f57df75e67a2..e9c5d8e351875 100644 --- a/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx +++ b/src/pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite.tsx @@ -1,6 +1,6 @@ import type {StackScreenProps} from '@react-navigation/stack'; import {Str} from 'expensify-common'; -import React from 'react'; +import React, {useMemo} from 'react'; import {useOnyx} from 'react-native-onyx'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; @@ -11,6 +11,7 @@ import TextInput from '@components/TextInput'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; +import {getDefaultCompanyWebsite} from '@libs/BankAccountUtils'; import * as Url from '@libs/Url'; import * as ValidationUtils from '@libs/ValidationUtils'; import Navigation from '@navigation/Navigation'; @@ -31,6 +32,9 @@ function WorkspaceInvoicingDetailsWebsite({route}: WorkspaceInvoicingDetailsWebs const {inputCallbackRef} = useAutoFocusInput(); const styles = useThemeStyles(); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`); + const [session] = useOnyx(ONYXKEYS.SESSION); + const [user] = useOnyx(ONYXKEYS.USER); + const defaultWebsiteExample = useMemo(() => getDefaultCompanyWebsite(session, user), [session, user]); // eslint-disable-next-line @typescript-eslint/no-unused-vars const submit = (values: FormOnyxValues) => { @@ -87,7 +91,7 @@ function WorkspaceInvoicingDetailsWebsite({route}: WorkspaceInvoicingDetailsWebs label={translate('workspace.invoices.companyWebsite')} accessibilityLabel={translate('workspace.invoices.companyWebsite')} role={CONST.ROLE.PRESENTATION} - defaultValue={policy?.invoice?.companyWebsite} + defaultValue={policy?.invoice?.companyWebsite ?? defaultWebsiteExample} ref={inputCallbackRef} inputMode={CONST.INPUT_MODE.URL} />