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

Navigation Component: Remove setActiveLevel child function arg #24704

Merged
merged 3 commits into from
Aug 25, 2020

Conversation

psealock
Copy link
Contributor

Fixes #24671

Description

Remove setActiveLevel from Navigation child function arguments. setActiveLevel exposes the internal mechanism for keeping track of waterfall state, or in other words where the user is as they navigate the tree. The consuming app doesn't need to use it and exposing it only causes confusion.

Its functionality is useful for the "Back" button but allowing the consuming app to compose the contents as they choose requires its use. This PR seeks a middle ground by passing down a component called NavigationBack as a child function argument.

Its use now encapsulates setActiveLevel while allowing maximum composition.

How has this been tested?

  1. Run npm run storybook:dev to see the Navigation component function.
  2. See the "back" button work as expected.

Screenshots

Screen Shot 2020-08-21 at 12 20 36 PM

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@psealock psealock added the [Feature] Navigation Component A navigational waterfall component for hierarchy of items. label Aug 21, 2020
@psealock psealock changed the title remove setActiveLevel from public api Navigation Component: Remove setActiveLevel child function args Aug 21, 2020
@psealock psealock changed the title Navigation Component: Remove setActiveLevel child function args Navigation Component: Remove setActiveLevel child function arg Aug 21, 2020
@github-actions
Copy link

github-actions bot commented Aug 21, 2020

Size Change: 0 B

Total Size: 1.16 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.67 kB 0 B
build/api-fetch/index.js 3.44 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 7.97 kB 0 B
build/block-directory/style-rtl.css 953 B 0 B
build/block-directory/style.css 952 B 0 B
build/block-editor/index.js 126 kB 0 B
build/block-editor/style-rtl.css 10.7 kB 0 B
build/block-editor/style.css 10.7 kB 0 B
build/block-library/editor-rtl.css 8.5 kB 0 B
build/block-library/editor.css 8.5 kB 0 B
build/block-library/index.js 133 kB 0 B
build/block-library/style-rtl.css 7.42 kB 0 B
build/block-library/style.css 7.43 kB 0 B
build/block-library/theme-rtl.css 729 B 0 B
build/block-library/theme.css 730 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 47.7 kB 0 B
build/components/index.js 200 kB 0 B
build/components/style-rtl.css 15.7 kB 0 B
build/components/style.css 15.7 kB 0 B
build/compose/index.js 9.67 kB 0 B
build/core-data/index.js 12.3 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.55 kB 0 B
build/date/index.js 5.38 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 4.47 kB 0 B
build/edit-navigation/index.js 11.6 kB 0 B
build/edit-navigation/style-rtl.css 1.16 kB 0 B
build/edit-navigation/style.css 1.16 kB 0 B
build/edit-post/index.js 304 kB 0 B
build/edit-post/style-rtl.css 5.61 kB 0 B
build/edit-post/style.css 5.61 kB 0 B
build/edit-site/index.js 17 kB 0 B
build/edit-site/style-rtl.css 3.06 kB 0 B
build/edit-site/style.css 3.06 kB 0 B
build/edit-widgets/index.js 11.7 kB 0 B
build/edit-widgets/style-rtl.css 2.45 kB 0 B
build/edit-widgets/style.css 2.45 kB 0 B
build/editor/editor-styles-rtl.css 537 B 0 B
build/editor/editor-styles.css 539 B 0 B
build/editor/index.js 45.3 kB 0 B
build/editor/style-rtl.css 3.8 kB 0 B
build/editor/style.css 3.79 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.71 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.52 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.32 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.41 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 13.9 kB 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

Copy link
Contributor

@joshuatf joshuatf left a comment

Choose a reason for hiding this comment

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

Nice work on this, Paul; I like the idea of simplifying some of the exposed logic in this component.

I left some comments for discussion as I am a little concerned about limiting the ability to externally control the state of this component.

@@ -91,7 +103,6 @@ function Example() {
onClick={ ( selected ) =>
setActive( selected.id )
}
setActiveLevel={ setActiveLevel }
Copy link
Contributor

@joshuatf joshuatf Aug 21, 2020

Choose a reason for hiding this comment

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

One concern I have with removing this is that we limit much of the control over the state of this menu externally.

For example, imagine a WooCommerce helper page that says "Navigate to the Settings section in the menu." We can allow the click handler of the Settings link to navigate the side menu. Tutorial based components may also want to make use of this function.

I think this could also be done through props if you prefer (if ( activeLevelId !== prevActiveLevelid ) { setActiveLevel( activeLevelId ) }), but I'd like to not restrict control here too much.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Just so I understand what you're suggesting: the feature you'd like to keep is the ability to externally control the navigation component without actually navigating.

I can see why that might be useful in some circumstances. What if we exposed an optional top level prop called activeLevel? That would accomplish the same result without having to expose a function. That brings its own challenges we'd need to document, but I think it would be more straightforward than using setActiveLevel function.

What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

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

Sure! That sounds like a good strategy to me. Do you want to do it here or should we tackle in a follow-up?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Lets follow up, issue here: #24775

@@ -39,13 +41,24 @@ const Navigation = ( { activeItemId, children, data, rootTitle } ) => {
}
}, [] );

const NavigationBack = ( { children: backButtonChildren } ) => {
return (
Copy link
Contributor

Choose a reason for hiding this comment

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

If we do keep this component instead of passing setActiveLevel maybe we should also include the logic for parentLevel here instead of in the story:

if ( ! parentLevel ) {
  return null;
}

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thats a good addition (a897c42). And the implementation can also do logic like this, so I'll leave the check in the story.

{ parentLevel ? (
	<NavigationBackButton>
		<Icon icon={ arrowLeft } />
		{ parentLevel.title }
	</NavigationBackButton>
) : (
	<Button>Do something else</Button>
) }

@@ -39,13 +41,24 @@ const Navigation = ( { activeItemId, children, data, rootTitle } ) => {
}
}, [] );

const NavigationBack = ( { children: backButtonChildren } ) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Semantic nitpick:

Suggested change
const NavigationBack = ( { children: backButtonChildren } ) => {
const NavigationBackButton = ( { children: backButtonChildren } ) => {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Nice, fixed in 279bd0c

@psealock psealock force-pushed the fix/navigation-component-setActiveLevel branch from a897c42 to b4a02f6 Compare August 25, 2020 04:05
Copy link
Contributor

@joshuatf joshuatf left a comment

Choose a reason for hiding this comment

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

Thanks for those additions! This is testing well for me and LGTM 👍

@psealock psealock merged commit 8ef9c18 into feature/navigation Aug 25, 2020
@psealock psealock deleted the fix/navigation-component-setActiveLevel branch August 25, 2020 18:19
psealock added a commit to psealock/gutenberg that referenced this pull request Aug 26, 2020
…ress#24704)

* remove setActiveLevel from public api

* change to NavigationBackButton

* return null for backButton if no parentLevel
psealock added a commit that referenced this pull request Aug 26, 2020
* Navigation Component: Remove setActiveLevel child function arg (#24704)

* remove setActiveLevel from public api

* change to NavigationBackButton

* return null for backButton if no parentLevel

* Navigation Component: Expose __experimentalNavigation component (#24706)

* Expose __experimentalNavigation component

* fix typo

* expose menut and menu-item as well

* Loop over navigation levels and wrap with animate

* Use map and set to organize items and levels

* Simplify level and item logic

* Remove unnecessary key prop

* Fix parent level assignment

* Add back in key prop to force animation

* Use useMemo to map item data

Co-authored-by: Paul Sealock <[email protected]>
psealock added a commit that referenced this pull request Aug 31, 2020
* Navigation Component: Remove setActiveLevel child function arg (#24704)

* remove setActiveLevel from public api

* change to NavigationBackButton

* return null for backButton if no parentLevel

* Navigation Component: Expose __experimentalNavigation component (#24706)

* Expose __experimentalNavigation component

* fix typo

* expose menut and menu-item as well

* Loop over navigation levels and wrap with animate

* Use map and set to organize items and levels

* Simplify level and item logic

* Remove unnecessary key prop

* Fix parent level assignment

* Add back in key prop to force animation

* Use useMemo to map item data

Co-authored-by: Paul Sealock <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Navigation Component A navigational waterfall component for hierarchy of items.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants