-
Notifications
You must be signed in to change notification settings - Fork 4.3k
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
Site Editor: Make sidebar back button go *back* instead of *up* if possible #52456
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -36,6 +36,12 @@ export function getPathFromURL( urlParams ) { | |||||||||||||||||||
return path; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
function isSubset( subset, superset ) { | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just curious: this function, on the surface, appears to check equality. Is it possible to add a note to explain the relationship between Or just in this comment box for me 🤣 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If all of the key/value pairs of A are also present in B then A is a subset of B and B is a superset of A. https://en.wikipedia.org/wiki/Subset Maybe I should call it There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I was only thinking of the casual observer, especially since this file's code is, or at least has been, at best, difficult to grok at first glance. I'm fine with the function description personally. Thanks for the explainer! 🍺 |
||||||||||||||||||||
return Object.entries( subset ).every( ( [ key, value ] ) => { | ||||||||||||||||||||
return superset[ key ] === value; | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
export default function useSyncPathWithURL() { | ||||||||||||||||||||
const history = useHistory(); | ||||||||||||||||||||
const { params: urlParams } = useLocation(); | ||||||||||||||||||||
|
@@ -44,76 +50,77 @@ export default function useSyncPathWithURL() { | |||||||||||||||||||
params: navigatorParams, | ||||||||||||||||||||
goTo, | ||||||||||||||||||||
} = useNavigator(); | ||||||||||||||||||||
const currentUrlParams = useRef( urlParams ); | ||||||||||||||||||||
const currentPath = useRef( navigatorLocation.path ); | ||||||||||||||||||||
const isMounting = useRef( true ); | ||||||||||||||||||||
|
||||||||||||||||||||
useEffect( () => { | ||||||||||||||||||||
// The navigatorParams are only initially filled properly when the | ||||||||||||||||||||
// navigator screens mount. so we ignore the first synchronisation. | ||||||||||||||||||||
if ( isMounting.current ) { | ||||||||||||||||||||
isMounting.current = false; | ||||||||||||||||||||
return; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
function updateUrlParams( newUrlParams ) { | ||||||||||||||||||||
if ( | ||||||||||||||||||||
Object.entries( newUrlParams ).every( ( [ key, value ] ) => { | ||||||||||||||||||||
return currentUrlParams.current[ key ] === value; | ||||||||||||||||||||
} ) | ||||||||||||||||||||
) { | ||||||||||||||||||||
useEffect( | ||||||||||||||||||||
() => { | ||||||||||||||||||||
// The navigatorParams are only initially filled properly when the | ||||||||||||||||||||
// navigator screens mount. so we ignore the first synchronisation. | ||||||||||||||||||||
if ( isMounting.current ) { | ||||||||||||||||||||
isMounting.current = false; | ||||||||||||||||||||
return; | ||||||||||||||||||||
} | ||||||||||||||||||||
const updatedParams = { | ||||||||||||||||||||
...currentUrlParams.current, | ||||||||||||||||||||
...newUrlParams, | ||||||||||||||||||||
}; | ||||||||||||||||||||
currentUrlParams.current = updatedParams; | ||||||||||||||||||||
history.push( updatedParams ); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
if ( navigatorParams?.postType && navigatorParams?.postId ) { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: navigatorParams?.postType, | ||||||||||||||||||||
postId: navigatorParams?.postId, | ||||||||||||||||||||
path: undefined, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} else if ( | ||||||||||||||||||||
navigatorLocation.path.startsWith( '/page/' ) && | ||||||||||||||||||||
navigatorParams?.postId | ||||||||||||||||||||
) { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: 'page', | ||||||||||||||||||||
postId: navigatorParams?.postId, | ||||||||||||||||||||
path: undefined, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} else if ( navigatorLocation.path === '/patterns' ) { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: undefined, | ||||||||||||||||||||
postId: undefined, | ||||||||||||||||||||
canvas: undefined, | ||||||||||||||||||||
path: navigatorLocation.path, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} else { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: undefined, | ||||||||||||||||||||
postId: undefined, | ||||||||||||||||||||
categoryType: undefined, | ||||||||||||||||||||
categoryId: undefined, | ||||||||||||||||||||
path: | ||||||||||||||||||||
navigatorLocation.path === '/' | ||||||||||||||||||||
? undefined | ||||||||||||||||||||
: navigatorLocation.path, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} | ||||||||||||||||||||
}, [ navigatorLocation?.path, navigatorParams, history ] ); | ||||||||||||||||||||
function updateUrlParams( newUrlParams ) { | ||||||||||||||||||||
if ( isSubset( newUrlParams, urlParams ) ) { | ||||||||||||||||||||
return; | ||||||||||||||||||||
} | ||||||||||||||||||||
const updatedParams = { | ||||||||||||||||||||
...urlParams, | ||||||||||||||||||||
...newUrlParams, | ||||||||||||||||||||
}; | ||||||||||||||||||||
history.push( updatedParams ); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
useEffect( () => { | ||||||||||||||||||||
currentUrlParams.current = urlParams; | ||||||||||||||||||||
const path = getPathFromURL( urlParams ); | ||||||||||||||||||||
if ( currentPath.current !== path ) { | ||||||||||||||||||||
currentPath.current = path; | ||||||||||||||||||||
goTo( path ); | ||||||||||||||||||||
} | ||||||||||||||||||||
}, [ urlParams, goTo ] ); | ||||||||||||||||||||
if ( navigatorParams?.postType && navigatorParams?.postId ) { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: navigatorParams?.postType, | ||||||||||||||||||||
postId: navigatorParams?.postId, | ||||||||||||||||||||
path: undefined, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} else if ( | ||||||||||||||||||||
navigatorLocation.path.startsWith( '/page/' ) && | ||||||||||||||||||||
navigatorParams?.postId | ||||||||||||||||||||
) { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: 'page', | ||||||||||||||||||||
postId: navigatorParams?.postId, | ||||||||||||||||||||
path: undefined, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} else if ( navigatorLocation.path === '/patterns' ) { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: undefined, | ||||||||||||||||||||
postId: undefined, | ||||||||||||||||||||
canvas: undefined, | ||||||||||||||||||||
path: navigatorLocation.path, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} else { | ||||||||||||||||||||
updateUrlParams( { | ||||||||||||||||||||
postType: undefined, | ||||||||||||||||||||
postId: undefined, | ||||||||||||||||||||
categoryType: undefined, | ||||||||||||||||||||
categoryId: undefined, | ||||||||||||||||||||
path: | ||||||||||||||||||||
navigatorLocation.path === '/' | ||||||||||||||||||||
? undefined | ||||||||||||||||||||
: navigatorLocation.path, | ||||||||||||||||||||
} ); | ||||||||||||||||||||
} | ||||||||||||||||||||
}, | ||||||||||||||||||||
// Trigger only when navigator changes to prevent infinite loops. | ||||||||||||||||||||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||||||||||||||||||||
[ navigatorLocation?.path, navigatorParams ] | ||||||||||||||||||||
); | ||||||||||||||||||||
|
||||||||||||||||||||
useEffect( | ||||||||||||||||||||
() => { | ||||||||||||||||||||
const path = getPathFromURL( urlParams ); | ||||||||||||||||||||
if ( navigatorLocation.path !== path ) { | ||||||||||||||||||||
goTo( path ); | ||||||||||||||||||||
} | ||||||||||||||||||||
}, | ||||||||||||||||||||
// Trigger only when URL changes to prevent infinite loops. | ||||||||||||||||||||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||||||||||||||||||||
[ urlParams ] | ||||||||||||||||||||
); | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you clarify the changes in this hook. The hook is supposed to be independent of the navigation, just synchronizes changes, so I'm not sure how it's related to this PR There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yep so the key change, and all that this PR needs at minimum, is changing this: gutenberg/packages/edit-site/src/components/sync-state-with-url/use-sync-path-with-url.js Lines 113 to 117 in 181b49c
To this: gutenberg/packages/edit-site/src/components/sync-state-with-url/use-sync-path-with-url.js Lines 117 to 120 in e83e1af
The former is buggy. When something calls
(3) is extraneous. We don't need to call The simplest way to fix this would be to update |
||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Set GitHub to "hide whitespace" when reviewing this file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The link if anyone is interested: https://github.com/WordPress/gutenberg/pull/52456/files?w=1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TIL there's a GUI for it 🤣