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

Switch back to getAuthors #26554

Merged
merged 11 commits into from
Nov 19, 2020
1 change: 1 addition & 0 deletions docs/designers-developers/developers/data/data-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ Returns all available authors.
_Parameters_

- _state_ `Object`: Data state.
- _query_ `(Object|undefined)`: Optional object of query parameters to include with request.

_Returns_

Expand Down
1 change: 1 addition & 0 deletions packages/core-data/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ Returns all available authors.
_Parameters_

- _state_ `Object`: Data state.
- _query_ `(Object|undefined)`: Optional object of query parameters to include with request.

_Returns_

Expand Down
26 changes: 21 additions & 5 deletions packages/core-data/src/resolvers.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,28 @@ import { ifNotResolved, getNormalizedCommaSeparable } from './utils';

/**
* Requests authors from the REST API.
*
* @param {Object|undefined} query Optional object of query parameters to
* include with request.
*/
export function* getAuthors() {
const users = yield apiFetch( {
path: '/wp/v2/users/?who=authors&per_page=-1',
} );
yield receiveUserQuery( 'authors', users );
export function* getAuthors( query ) {
const path = addQueryArgs(
'/wp/v2/users/?who=authors&per_page=100',
query
);
const users = yield apiFetch( { path } );
yield receiveUserQuery( path, users );
}

/**
* Temporary approach to resolving editor access to author queries.
*
* @param {number} id The author id.
*/
export function* __unstableGetAuthor( id ) {
const path = `/wp/v2/users?who=authors&include=${ id }`;
const users = yield apiFetch( { path } );
yield receiveUserQuery( 'author', users );
Copy link
Contributor

Choose a reason for hiding this comment

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

should the first argument here be "authors" to match the same entity as "getAuthors"?

Copy link
Member Author

Choose a reason for hiding this comment

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

Maybe? I think that results in the fetched author overwriting the authors? I can test.

Copy link
Member Author

Choose a reason for hiding this comment

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

Tested changing this and confirmed using the same key results in the query interfering with the getAuthors query, causing errors or unexpected results as the results from the two queries overwrite each other.

Copy link
Contributor

Choose a reason for hiding this comment

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

Mmm, so if I'm reading this right getAuthor(1) and getAuthor(2) are using the same query key which means if I trigger both concurrently, they'll mess with each other's result.

Copy link
Member Author

Choose a reason for hiding this comment

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

@youknowriad - Oh, good point. I didn't think about concurrent requests. Should we build a dynamic key here that includes the requested id? Do we have an existing component that uses this approach/a helper to create the query key?

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, I did add dynamic query keys for both getAuthor and getAuthors, I think it will solve both issues so I reverted the change you did with useMemo

}

/**
Expand Down
25 changes: 20 additions & 5 deletions packages/core-data/src/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { set, map, find, get, filter, compact, defaultTo } from 'lodash';
*/
import { createRegistrySelector } from '@wordpress/data';
import deprecated from '@wordpress/deprecated';
import { addQueryArgs } from '@wordpress/url';

/**
* Internal dependencies
Expand Down Expand Up @@ -48,18 +49,32 @@ export const isRequestingEmbedPreview = createRegistrySelector(
}
);

/**
* Returns all available authors.
*
* @param {Object} state Data state.
* @param {Object|undefined} query Optional object of query parameters to
* include with request.
* @return {Array} Authors list.
*/
export function getAuthors( state, query ) {
const path = addQueryArgs(
'/wp/v2/users/?who=authors&per_page=100',
query
);
return getUserQueryResults( state, path );
}

/**
* Returns all available authors.
*
* @param {Object} state Data state.
* @param {number} id The author id.
*
* @return {Array} Authors list.
*/
export function getAuthors( state ) {
deprecated( "select( 'core' ).getAuthors()", {
alternative: "select( 'core' ).getUsers({ who: 'authors' })",
} );
return getUserQueryResults( state, 'authors' );
export function __unstableGetAuthor( state, id ) {
return get( state, [ 'users', 'byId', id ], null );
}

/**
Expand Down
4 changes: 2 additions & 2 deletions packages/editor/src/components/post-author/check.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export function PostAuthorCheck( {
authors,
children,
} ) {
if ( ! hasAssignAuthorAction || ! authors || authors.length < 2 ) {
if ( ! hasAssignAuthorAction || ! authors || 1 >= authors.length ) {
return null;
}

Expand All @@ -40,7 +40,7 @@ export default compose( [
false
),
postType: select( 'core/editor' ).getCurrentPostType(),
authors: select( 'core' ).getUsers( { who: 'authors' } ),
authors: select( 'core' ).getAuthors(),
};
} ),
withInstanceId,
Expand Down
14 changes: 8 additions & 6 deletions packages/editor/src/components/post-author/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,20 @@ function PostAuthor() {

const { authorId, isLoading, authors, postAuthor } = useSelect(
( select ) => {
const { getUser, getUsers, isResolving } = select( 'core' );
const { __unstableGetAuthor, getAuthors, isResolving } = select(
'core'
);
const { getEditedPostAttribute } = select( 'core/editor' );
const author = getUser( getEditedPostAttribute( 'author' ) );
const author = __unstableGetAuthor(
getEditedPostAttribute( 'author' )
);
const query =
! fieldValue || '' === fieldValue ? {} : { search: fieldValue };
return {
authorId: getEditedPostAttribute( 'author' ),
postAuthor: author,
authors: getUsers( { who: 'authors', ...query } ),
isLoading: isResolving( 'core', 'getUsers', [
{ search: fieldValue, who: 'authors' },
] ),
authors: getAuthors( query ),
isLoading: isResolving( 'core', 'getAuthors', [ query ] ),
};
},
[ fieldValue ]
Expand Down