Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
"test:debug": "TZ=utc NODE_OPTIONS='--inspect-brk --experimental-vm-modules' jest --runInBand",
"perf-test": "NODE_OPTIONS=--experimental-vm-modules npx reassure",
"typecheck": "NODE_OPTIONS=--max_old_space_size=8192 tsc",
"lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=214 --cache --cache-location=node_modules/.cache/eslint",
"lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=213 --cache --cache-location=node_modules/.cache/eslint",
"lint-changed": "NODE_OPTIONS=--max_old_space_size=8192 ./scripts/lintChanged.sh",
"lint-watch": "npx eslint-watch --watch --changed",
"shellcheck": "./scripts/shellCheck.sh",
Expand Down
13 changes: 4 additions & 9 deletions src/libs/actions/PersonalDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type {DateOfBirthForm} from '@src/types/form';
import type {PersonalDetails, PrivatePersonalDetails} from '@src/types/onyx';
import type {PersonalDetails} from '@src/types/onyx';
import type {SelectedTimezone, Timezone} from '@src/types/onyx/PersonalDetails';
import type {Address} from '@src/types/onyx/PrivatePersonalDetails';

let currentUserEmail = '';
let currentUserAccountID = -1;
Onyx.connect({

Check warning on line 38 in src/libs/actions/PersonalDetails.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.SESSION,
callback: (val) => {
currentUserEmail = val?.email ?? '';
Expand All @@ -42,12 +43,6 @@
},
});

let privatePersonalDetails: OnyxEntry<PrivatePersonalDetails>;
Onyx.connect({
key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS,
callback: (val) => (privatePersonalDetails = val),
});

function updatePronouns(pronouns: string) {
if (!currentUserAccountID) {
return;
Expand Down Expand Up @@ -222,7 +217,7 @@
});
}

function updateAddress(street: string, street2: string, city: string, state: string, zip: string, country: Country | '') {
function updateAddress(addresses: Address[], street: string, street2: string, city: string, state: string, zip: string, country: Country | '') {
const parameters: UpdateHomeAddressParams = {
homeAddressStreet: street,
addressStreet2: street2,
Expand All @@ -245,7 +240,7 @@
key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS,
value: {
addresses: [
...(privatePersonalDetails?.addresses ?? []),
...addresses,
{
street: PersonalDetailsUtils.getFormattedStreet(street, street2),
city,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ import type {FormOnyxValues} from '@src/components/Form/types';
import type {Country} from '@src/CONST';
import {updateAddress as updateAddressPersonalDetails} from '@src/libs/actions/PersonalDetails';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Address} from '@src/types/onyx/PrivatePersonalDetails';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';

/**
* Submit form to update user's first and last legal name
* @param values - form input values
*/
function updateAddress(values: FormOnyxValues<typeof ONYXKEYS.FORMS.HOME_ADDRESS_FORM>) {
function updateAddress(values: FormOnyxValues<typeof ONYXKEYS.FORMS.HOME_ADDRESS_FORM>, addresses: Address[]) {
updateAddressPersonalDetails(
addresses,
values.addressLine1?.trim() ?? '',
values.addressLine2?.trim() ?? '',
values.city.trim(),
Expand All @@ -40,7 +42,7 @@ function PersonalAddressPage() {
defaultCountry={defaultCountry as Country}
address={address}
isLoadingApp={isLoadingApp}
updateAddress={updateAddress}
updateAddress={(values) => updateAddress(values, privatePersonalDetails?.addresses ?? [])}
title={translate('privatePersonalDetails.address')}
/>
);
Expand Down
105 changes: 105 additions & 0 deletions tests/actions/PersonalDetailsTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import Navigation from '@libs/Navigation/Navigation';
import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils';
import * as UserUtils from '@libs/UserUtils';
import CONST from '@src/CONST';
import type {Country} from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {PersonalDetails} from '@src/types/onyx';
import type {Address} from '@src/types/onyx/PrivatePersonalDetails';
import * as PersonalDetailsActions from '../../src/libs/actions/PersonalDetails';
import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';

Expand Down Expand Up @@ -41,6 +43,109 @@ describe('actions/PersonalDetails', () => {
jest.restoreAllMocks();
});

describe('updateAddress', () => {
it('should call API.write with correct parameters and optimistic data for US addresses and navigate back', async () => {
const addresses: Address[] = [
{
street: 'Old Street',
city: 'Old City',
state: 'NY',
zip: '10001',
country: CONST.COUNTRY.US,
current: false,
},
];
const street = '123 Main St';
const street2 = 'Apt 4';
const city = 'San Francisco';
const state = 'CA';
const zip = '94105';
const country: Country | '' = CONST.COUNTRY.US;

const formattedStreet = '123 Main St Apt 4';
mockPersonalDetailsUtils.getFormattedStreet.mockReturnValue(formattedStreet);

PersonalDetailsActions.updateAddress(addresses, street, street2, city, state, zip, country);
await waitForBatchedUpdates();

expect(mockAPI.write).toHaveBeenCalledWith(
WRITE_COMMANDS.UPDATE_HOME_ADDRESS,
{
homeAddressStreet: street,
addressStreet2: street2,
homeAddressCity: city,
addressState: state,
addressZipCode: zip,
addressCountry: country,
},
{
optimisticData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS,
value: {
addresses: [
...addresses,
{
street: formattedStreet,
city,
state,
zip,
country,
current: true,
},
],
},
},
],
},
);

expect(mockPersonalDetailsUtils.getFormattedStreet).toHaveBeenCalledWith(street, street2);
expect(mockNavigation.goBack).toHaveBeenCalledTimes(1);
});

it('should include addressStateLong for non-US addresses', async () => {
const addresses: Address[] = [];
const street = '10 Downing St';
const street2 = '';
const city = 'London';
const state = 'Greater London';
const zip = 'SW1A 2AA';
const country: Country | '' = CONST.COUNTRY.GB;

const formattedStreet = '10 Downing St';
mockPersonalDetailsUtils.getFormattedStreet.mockReturnValue(formattedStreet);

PersonalDetailsActions.updateAddress(addresses, street, street2, city, state, zip, country);
await waitForBatchedUpdates();

expect(mockAPI.write).toHaveBeenCalledWith(
WRITE_COMMANDS.UPDATE_HOME_ADDRESS,
{
homeAddressStreet: street,
addressStreet2: street2,
homeAddressCity: city,
addressState: state,
addressZipCode: zip,
addressCountry: country,
addressStateLong: state,
},
expect.objectContaining({
optimisticData: [
expect.objectContaining({
onyxMethod: Onyx.METHOD.MERGE,
key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS,
}),
],
}),
);

expect(mockPersonalDetailsUtils.getFormattedStreet).toHaveBeenCalledWith(street, street2);
expect(mockNavigation.goBack).toHaveBeenCalledTimes(1);
});
});

describe('updateLegalName', () => {
const mockFormatPhoneNumber = jest.fn((phoneNumber: string) => phoneNumber);

Expand Down
Loading