Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correct the AccountOverview.OverviewsResponse TS interface account type to show it is nullable #7921

Merged

Conversation

Jinksi
Copy link
Member

@Jinksi Jinksi commented Dec 15, 2023

Fixes #7920

Note

This is a small, dev-facing change. I hope this requires minimal effort to review!

Changes proposed in this Pull Request

This PR fixes a mismatch between the OverviewsResponse TS interface and data returned from getAllDepositsOverviews() while the fetch request is in progress:

// Return an empty skeleton if data has not been loaded yet.
if ( ! DepositsOverview.data ) {
return {
account: null,
currencies: [],
};
}

OverviewsResponse has been corrected to define the overviews.account type as Account | null:

export interface OverviewsResponse {
	overviews: {
		account: Account | null;
		currencies: Overview[];
	};
	isLoading: boolean;
}

Testing instructions

  • Run npx tsc --noEmit and ensure no TS errors are returned.
  • Ensure relevant GH checks tests pass.

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@Jinksi Jinksi marked this pull request as ready for review December 15, 2023 00:55
@Jinksi Jinksi requested a review from a team December 15, 2023 00:55
@botwoo
Copy link
Collaborator

botwoo commented Dec 15, 2023

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 7921 or branch name fix/7920-correct-account-overview-account-type-nullable in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: eaa6dce
  • Build time: 2023-12-18 00:51:52 UTC

Note: the build is updated when a new commit is pushed to this PR.

Copy link
Contributor

github-actions bot commented Dec 15, 2023

Size Change: +14 B (0%)

Total Size: 1.26 MB

Filename Size Change
release/woocommerce-payments/dist/index.js 287 kB +14 B (0%)
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.06 kB
release/woocommerce-payments/assets/css/success.css 158 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 1.8 kB
release/woocommerce-payments/dist/blocks-checkout.css 1.8 kB
release/woocommerce-payments/dist/blocks-checkout.js 85.5 kB
release/woocommerce-payments/dist/checkout-rtl.css 318 B
release/woocommerce-payments/dist/checkout.css 319 B
release/woocommerce-payments/dist/checkout.js 37.1 kB
release/woocommerce-payments/dist/index-rtl.css 36.8 kB
release/woocommerce-payments/dist/index.css 36.8 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.05 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.4 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 60.5 kB
release/woocommerce-payments/dist/multi-currency.css 3.4 kB
release/woocommerce-payments/dist/multi-currency.js 55.7 kB
release/woocommerce-payments/dist/order-rtl.css 676 B
release/woocommerce-payments/dist/order.css 679 B
release/woocommerce-payments/dist/order.js 41.7 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 1.31 kB
release/woocommerce-payments/dist/payment-gateways.css 1.31 kB
release/woocommerce-payments/dist/payment-gateways.js 39.3 kB
release/woocommerce-payments/dist/payment-request-rtl.css 153 B
release/woocommerce-payments/dist/payment-request.css 153 B
release/woocommerce-payments/dist/payment-request.js 13.6 kB
release/woocommerce-payments/dist/product-details.js 919 B
release/woocommerce-payments/dist/settings-rtl.css 10.4 kB
release/woocommerce-payments/dist/settings.css 10.4 kB
release/woocommerce-payments/dist/settings.js 233 kB
release/woocommerce-payments/dist/subscription-edit-page.js 669 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 20.4 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 710 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 19.5 kB
release/woocommerce-payments/dist/tos-rtl.css 230 B
release/woocommerce-payments/dist/tos.css 231 B
release/woocommerce-payments/dist/tos.js 22 kB
release/woocommerce-payments/dist/woopay-express-button-rtl.css 153 B
release/woocommerce-payments/dist/woopay-express-button.css 153 B
release/woocommerce-payments/dist/woopay-express-button.js 52.6 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.18 kB
release/woocommerce-payments/dist/woopay.css 4.19 kB
release/woocommerce-payments/dist/woopay.js 71.8 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 622 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 812 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.43 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.01 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 522 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 581 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/babel.config.js 160 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.css 2.32 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.js 13.8 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.rtl.css 2.32 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.03 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 291 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 403 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.6 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 299 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 742 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 572 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 411 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.8 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.83 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.6 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 502 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 355 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 429 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 781 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.27 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 392 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.05 kB

compressed-size-action

Copy link
Contributor

@shendy-a8c shendy-a8c left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because #7920 stemmed from #7883 (comment), I checked to make sure if I removed this line, TS will correctly give a warning that account might be null here. It does, so that's good!

I hope this requires minimal effort to review!

Not too minimal because out of curiosity, I searched all selectors.ts and selectors.js to make sure there isn't other similar case.

Found 1 possible undefined return value in client/data/capital/selectors.ts but it's not a problem there. When I tried to remove this check, TS will throw an error correctly, so I started to think maybe if client/data/deposits/selectors.js is converted to TS, the possible null account will be caught.

Not suggesting to do that though.

This PR looks good as is!

@@ -115,7 +115,7 @@ const AccountBalances: React.FC = () => {
currencyCode: overview.currency,
availableFunds: overview.available?.amount ?? 0,
pendingFunds: overview.pending?.amount ?? 0,
delayDays: account.deposits_schedule.delay_days,
delayDays: account?.deposits_schedule.delay_days,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tl;dr; this comment is just an FYI. Not suggesting any change.

Tempted to suggest a default value so in accordance of the loading state.

Suggested change
delayDays: account?.deposits_schedule.delay_days,
delayDays: account?.deposits_schedule.delay_days ?? 0,

However, in case of account is null (which by itself is impossible to pass the if ( isLoading ) check) account?.deposits_schedule.delay_days being undefined looks more correct:
Screenshot 2023-12-18 at 02 19 23

than if we set delayDays to be 0:
Screenshot 2023-12-18 at 02 19 37

Also I wondered why TS does not complain that delayDays can be undefined although delayDays' type is defined as a number. Maybe because here we don't strictly define the type of depositCurrencyTabs to be BalanceTabProps[].

Copy link
Member Author

@Jinksi Jinksi Dec 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another thing we could do to tidy this up – we can define and return 2 distinct types: one while loading and one loaded. E.g.

export interface OverviewsLoading {
  account: null;
  isLoading: true;
}

export interface Overviews {
  account: Account;
  isLoading: false;
}

export type OverviewsResponse = OverviewsLoading | Overviews;

export function isOverviewsLoading(response: OverviewsResponse): response is OverviewsLoading {
  return response.isLoading;
}

Then for the isLoading check, we can use the type assertion function isOverviewsLoading. If that returns false, all following logic will be confident that account: Account, no need for ?? to account for possible account: null.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've used your solution in eaa6dce as a good solution for now 👍

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can define and return 2 distinct types: one while loading and one loaded

Ow wow, that's actually neat.

@Jinksi
Copy link
Member Author

Jinksi commented Dec 18, 2023

if client/data/deposits/selectors.js is converted to TS, the possible null account will be caught.

💯 if the `/client/data dir was migrated to TS, this issue would have been made apparent before commit.

Alternatively, we can migrate existing data fetching and caching logic to react-query (demo in #7502). We'd still have to define the API request return types and tie these to useQuery hooks, but there'd be less boilerplate code to migrate to TS.

@Jinksi Jinksi added this pull request to the merge queue Dec 18, 2023
Merged via the queue into develop with commit 63e3d2d Dec 18, 2023
24 of 28 checks passed
@Jinksi Jinksi deleted the fix/7920-correct-account-overview-account-type-nullable branch December 18, 2023 01:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

The AccountOverview.OverviewsResponse TypeScript interface incorrectly shows account as a non-nullable type
3 participants