PoC: Support private hooks to explore Data Views actions #61412
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Actions and commands
In the context of Data Views, there has been a lot of recent work towards providing a set of actions operating on posts, templates, patterns (e.g. rename post, edit post, duplicate template), and ultimately other entities. These actions, however, aren't unique to Data Views, and indeed exist in several different contexts (e.g. Site Editor inner sidebar, new Admin "shell" sidebar, Pages index view, Post Editor), so the next step was to unify actions across packages (e.g. #60486, #60754).
The first unification effort led to an abstraction around a hook,
usePostActions
, but the consensus now is to remove it and expose the actions directly (#61040).Meanwhile, it has been noted that there is a strong parallel between these actions and the Command Palette's commands, which has its own API already. This isn't a 1:1 mapping, but we should determine what the overlap is.
Actions and side effects
There is a limit to how much we can unify, because the context in which actions are triggered will determine what secondary effects are desired. For example, trashing a post inside the post editor should result in the client navigating elsewhere (e.g. edit.php), but there should be no such effect when trashing from a Data View index.
The current solution for this is to let consumers of the
PostActions
component pass a callback asonActionPerformed
. It works but there's a risk that it's too flexible, so I kept wondering about what kind of generalisations we could make here before we opened this up as an API.Extensibility
As tracked in #61084, our system -- what ever it turns to be -- needs to become extensible soon. Somewhere in our GitHub conversations there was a suggestion to set up an imperative API like
registerAction
that third parties could leverage. I think that's fair, though we'll need to determine what kind of registry we want (scope and plurality).An imperative API that can be called in an initialisation step rather than as a call inside the render tree (e.g.
<Provider value=...>
oruseRegisterAction(...)
) is more convenient for developers, but introduces indirection. In this scenario, how do we implement those aforementioned contextual side effects (e.g. navigate to page)?The experiment
It was in this context that I had the terrible thought of leveraging wp.hooks to provide a private API (to dogfood in Gutenberg core packages). But, of course, hooks are keyed by strings, and so they are necessarily public -- i.e., a third party can call
applyFilters('privateFilter'
, even ifprivateFilter
is not meant to be used outside of core.This branch changes that assumption: hook names must be strings, except if they match a small set of hard-coded symbols. These symbols are only accessible via the lock/unlock API powered by the
private-apis
package. Thus, core packages can communicate amongst each other via hooks that no third party can use. For example:doAction
with a symbol corresponding to its name (e.g.postActions.renamePost
).pagePages.renamePost
).See for yourself: upon
pagePages.editPost
, the necessary navigation to said post is triggered by a subscriber of that action.Assessment
Having tried it, I think this is a poor idea. "Private hooks" as a concept is a cool way to see how far
private-apis
can take us, but they seem like the wrong tool for the current problem. Still, I wanted to share the work, hence this verbose commit.I think our next steps should be:
onActionPerformed
. I'm still convinced we haven't done enough work to generalise side effects. Consider it along with the commands API.registerAction
)