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

useEntityRecord (experimental) #38522

Merged
merged 31 commits into from Feb 14, 2022
Merged

useEntityRecord (experimental) #38522

merged 31 commits into from Feb 14, 2022

Conversation

adamziel
Copy link
Contributor

@adamziel adamziel commented Feb 4, 2022

Description

This PR is a minimal subset of #38135 focused solely on the useEntityRecord hook.

The goal of these new APIs is to lower the barrier of entry for new contributors and make the life of existing contributors easier.

Example usage:

Before

const { page, hasResolved } = useSelect(
  ( select ) => {
	  const selectorArgs = [ 'postType', 'page', pageId ];
	  return {
		  page: select( coreDataStore ).getEntityRecord(
			  ...selectorArgs
		  ),
		  hasResolved: select( coreDataStore ).hasFinishedResolution(
			  'getEntityRecord',
			  selectorArgs
		  ),
	  };
  },
  [ pageId ]
);

After:

const { record, hasResolved } = __experimentalUseEntityRecord( 'postType', 'page', pageId );

See also how the combination of all proposed hooks makes the navigation block ~200 lines leaner.

Out of scope for this PR

runIf option

runIf was originally proposed in #38135 to address the following use case from the navigation block:

const rawNavigationMenu = ref
	? getEntityRecord( ...navigationMenuSingleArgs )
	: null;

Thinking more about that, maybe if would be better to have getEntityRecord() in a separate, nested component. Either way, this can be a separate discussion in a follow-up PR.

An optional id argument that can be provided by an EntityProvider

@talldan proposed to make useEntityRecord more consistent with useEntityProp and have an optional id that would be backfilled by EntityProvider:

export function useEntityProp( kind, type, prop, _id ) {
const providerId = useEntityId( kind, type );
const id = _id ?? providerId;

This looks great! My one concern is "What about passing an empty id to reason about a new entity record?" I propose to hold on for now and discuss what an empty id argument should do later on once we're on the mutation hooks.

Test plan

  1. Confirm if the tests are green
  2. Confirm if the code makes sense

cc @kevin940726 @talldan @gziolo @draganescu @ellatrix @noisysocks @jsnajdr @getdave @Mamaduka @spencerfinnell

@adamziel adamziel requested a review from nerrad as a code owner Feb 4, 2022
@adamziel adamziel changed the base branch from trunk to propose/use-resolve-select Feb 4, 2022
@github-actions
Copy link

@github-actions github-actions bot commented Feb 4, 2022

Size Change: +895 B (0%)

Total Size: 1.15 MB

Filename Size Change
build/block-library/index.min.js 168 kB +315 B (0%)
build/core-data/index.min.js 14 kB +580 B (+4%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.13 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.25 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 142 kB
build/block-editor/style-rtl.css 14.8 kB
build/block-editor/style.css 14.8 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.61 kB
build/block-library/blocks/gallery/style.css 1.61 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 810 B
build/block-library/blocks/image/editor.css 809 B
build/block-library/blocks/image/style-rtl.css 500 B
build/block-library/blocks/image/style.css 503 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 1.98 kB
build/block-library/blocks/navigation/editor.css 1.99 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 402 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 201 B
build/block-library/blocks/quote/style.css 201 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 214 B
build/block-library/blocks/tag-cloud/style.css 215 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 921 B
build/block-library/common.css 919 B
build/block-library/editor-rtl.css 10.1 kB
build/block-library/editor.css 10.1 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.3 kB
build/block-library/style.css 11.3 kB
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 676 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.4 kB
build/components/index.min.js 215 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/compose/index.min.js 11.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.47 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30 kB
build/edit-post/style-rtl.css 7.17 kB
build/edit-post/style.css 7.16 kB
build/edit-site/index.min.js 41.9 kB
build/edit-site/style-rtl.css 7.22 kB
build/edit-site/style.css 7.21 kB
build/edit-widgets/index.min.js 16.7 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.17 kB
build/editor/index.min.js 38.5 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 3.32 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.98 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.25 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.92 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@adamziel adamziel self-assigned this Feb 4, 2022
@adamziel adamziel changed the title useEntityRecord useEntityRecord (experimental) Feb 4, 2022
@adamziel adamziel force-pushed the propose/use-resolve-select branch from 447b5f2 to 5ae67d7 Compare Feb 7, 2022
@adamziel adamziel force-pushed the propose/use-entity-record branch from 906b53c to d6b4daf Compare Feb 7, 2022
Copy link
Member

@kevin940726 kevin940726 left a comment

Thank you! Left some comments.

Awesome job as always! 💯💯💯
I'll take a look at other PRs this week 👀 .

packages/core-data/src/hooks/constants.js Outdated Show resolved Hide resolved
packages/core-data/src/hooks/use-entity-record.js Outdated Show resolved Hide resolved
packages/core-data/src/hooks/use-entity-record.js Outdated Show resolved Hide resolved
packages/core-data/src/hooks/use-entity-record.js Outdated Show resolved Hide resolved
packages/core-data/src/hooks/use-entity-record.js Outdated Show resolved Hide resolved
packages/core-data/src/hooks/test/use-entity-record.js Outdated Show resolved Hide resolved
packages/core-data/package.json Outdated Show resolved Hide resolved
@gziolo
Copy link
Member

@gziolo gziolo commented Feb 9, 2022

This is close. I would be happy to see it landed once we finalize all the little things. Thank you for breaking the previous work into smaller pieces that should speed up the process once we land this PR ❤️

@gziolo gziolo requested a review from jsnajdr Feb 9, 2022
packages/core-data/src/hooks/constants.ts Show resolved Hide resolved
packages/core-data/src/hooks/test/use-entity-record.js Outdated Show resolved Hide resolved

interface EntityRecordResolution {
/** The requested entity record */
record: Object;
Copy link
Member

@kevin940726 kevin940726 Feb 9, 2022

Choose a reason for hiding this comment

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

Object is not a type that we'd like to use in this context, it behaves similarly to any that it just silent the errors without any actual gains.

Ideally, we should already have all the types of core entities available somewhere so that we can do this automatically. Given that it'd be a huge amount of work, we could instead try to use generics here to let the users specify the correct types.

const { record } = useEntityRecord<PageRecord>( 'postType', 'page', id );
// record: PageRecord

It's a bit more complicated to get right though, I'm willing to help if you encounter any problems!

Copy link
Member

@kevin940726 kevin940726 Feb 9, 2022

Choose a reason for hiding this comment

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

Also, if the data is still resolving, I think the type of this value will be null?

Copy link
Contributor Author

@adamziel adamziel Feb 9, 2022

Choose a reason for hiding this comment

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

Object is not a type that we'd like to use in this context, it behaves similarly to any that it just silent the errors without any actual gains.

The gains are that we're able to use TypeScript :-) I went for the minimal typing on purpose for the reasons you have mentioned – there aren't many types defined in core-data. Thinking about it more, it shouldn't be a big problem for the JavaScript consumers of the code, and if it is then any may be moved to the consumer code. So yes, generics sound like a good approach 👍

Copy link
Contributor Author

@adamziel adamziel Feb 9, 2022

Choose a reason for hiding this comment

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

isResolving: boolean;

/** Is the record resolved by now? */
hasResolved: boolean;
Copy link
Member

@kevin940726 kevin940726 Feb 9, 2022

Choose a reason for hiding this comment

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

I guess we don't need this either, as this is essentially the same as !isResolving.

Copy link
Contributor Author

@adamziel adamziel Feb 9, 2022

Choose a reason for hiding this comment

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

Not exactly, isResolving and hasResolved may both be true when the record is being re-requested. It is how the meta selectors in @wordpress/data work so I'd rather not change that logic here. I thought it's confusing and now your comment reassured me, so I'll add that to the docstring.

Copy link
Member

@kevin940726 kevin940726 Feb 9, 2022

Choose a reason for hiding this comment

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

isResolving and hasResolved may both be true when the record is being re-requested.

Huh, interesting! Then what's the difference between hasResolved and !!data?

Copy link
Member

@kevin940726 kevin940726 Feb 11, 2022

Choose a reason for hiding this comment

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

Just checked the implementation in:

export function hasFinishedResolution( state, selectorName, args = [] ) {
return getIsResolving( state, selectorName, args ) === false;
}
/**
* Returns true if resolution has been triggered but has not yet completed for
* a given selector name, and arguments set.
*
* @param {State} state Data state.
* @param {string} selectorName Selector name.
* @param {unknown[]} [args] Arguments passed to selector.
*
* @return {boolean} Whether resolution is in progress.
*/
export function isResolving( state, selectorName, args = [] ) {
return getIsResolving( state, selectorName, args ) === true;
}

isResolving and hasResolved may both be true

I think this is not possible? Or maybe I'm missing something elsewhere 🤔 . I guess something like isSuccess and isError might be more useful than hasResolved. It's also arguably more approachable given that the name directly inherits the status.

Copy link
Contributor Author

@adamziel adamziel Feb 11, 2022

Choose a reason for hiding this comment

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

When I said it's confusing, I didn't realize I am the one who's confused :D I think you're right – hasResolved and isResolving can't both be true. I'm not sure how I concluded they can – thanks for staying alert!

Let's figure out what do to do next. We have three boolean flags: hasStarted, hasFinished, and isResolving. The following combinations are possible:

  • false, false, false – the resolution hasn't started yet, the initial state
  • true, false, true – the resolution is in progress
  • true, true, false – the resolution has finished

so that's three values to represent. I think we need at least hasStarted and isResolving then, but hasFinished and isResolving works just as well.

what's the difference between hasResolved and !!data?

The resolved data can be any value at all, including null, undefined, false, and so on. We can have hasResolved === trueand!! data === false`.

@adamziel
Copy link
Contributor Author

@adamziel adamziel commented Feb 9, 2022

This one is ready for another review 🎉

@adamziel adamziel force-pushed the propose/use-entity-record branch from 5bbab93 to 7d259e2 Compare Feb 11, 2022
Copy link
Contributor

@getdave getdave left a comment

All the concerns here appear to have been addressed but we don't have a

I'm going to approve on that basis along with the fact that this is an experimental hook which gives us some flexibility to merge and iterate.

Thanks for all the work you've put in here @adamziel.

@adamziel adamziel merged commit 8effa05 into trunk Feb 14, 2022
23 checks passed
@adamziel adamziel deleted the propose/use-entity-record branch Feb 14, 2022
@github-actions github-actions bot added this to the Gutenberg 12.7 milestone Feb 14, 2022
@Mamaduka
Copy link
Member

@Mamaduka Mamaduka commented Feb 14, 2022

Great work, @adamziel 🥇

Based on the latest commits, it looks like this PR also contains the newly proposed useSelectQuery as a private API. Maybe we should've used low-level useSelect and updated to useSelectQuery after #38134 gets merged?

I don't think this is a blocker, but maybe something we can address as a follow-up.

@adamziel
Copy link
Contributor Author

@adamziel adamziel commented Feb 14, 2022

@Mamaduka good point! I think the discussion in #38134 needs some more time so I brought this in as a private API to unblock this PR. I considered using just useSelect, but useEntityRecords would have to duplicate a lot of that logic so I left it in for now. I'm open to removing it, but let's take that to #38782 as that's where it really shines.

@gziolo
Copy link
Member

@gziolo gziolo commented Feb 14, 2022

Awesome work, @adamziel. Keep up PRs coming with the rest of functionality to fully cover CRUD operations for WordPress REST API endpoints 👏

I think that useSelectQuery fits great in the current place as an internal utility because it’s shaped on the specific use case tightly coupled to entities and how they are handled through network requests. Let’s see how it evolves when fetching records and handling mutations grow before we decide to move it to the data package. I’m personally curious to see whether @wordpress/data needs this type of API, but we need to refactor first all places that can use the most high-level API exposed in @wordpress/core-data with this in other similar PRs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment