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

Breadcrumbs refactor, testing using jest & storybook #413

Open
wants to merge 28 commits into
base: main
Choose a base branch
from

Conversation

mrabbitt
Copy link
Contributor

@mrabbitt mrabbitt commented Sep 17, 2024

Included in this PR

  • Refactored BreadcrumbsNav into two components for better separation of concerns and testability:
    • Stateful BreadcrumbTrail: Stateful container component that gets the URL path from and fetches student and para names via router calls. Passes data as props to BreadcrumbTrail.
    • BreadcrumbTrail: Stateless component which handles all layout/rendering using given props.
  • Added basic "stories" files for BreadcrumbTrail which allows previewing and testing its appearance in various states using Storybook.
  • Added support to compass project for testing using jest
    • Since ava is already used a test runner for the backend tests, separate scripts were added to package.json:
      • test:backend runs existing tests for backend code with ava
      • test:frontend runs new frontend tests using jest
      • test runs both backend and frontend tests
  • Added jest tests for Breadcrumbs:
    • BreadcrumbTrail.test.tsx tests BreadcrumbTrail component using snapshot testing
    • BreadcrumbTrailUtils.test.ts contains jest unit tests for a function used by BreadcrumbDesign to transform its input into breadcrumb segments.

Not Included in this PR

What input is especially requested from reviewers:

  1. Which test runner(s) do we want to use for compass? ➡️ Update: Based on feedback, we're going with option 1 (as implemented in this PR branch
    • My thoughts: ava is a decent simple option for testing pure JavaScript/TypeScript code that has worked fine for backend tests. However, it's not as widely used and documented as jest, and I ran into significant problems trying to test components / JSX with it and was ultimately unsuccessful (will link to another draft PR with these attempts). By comparison, the process getting jest to integrate with NextJS and test components was well documented and worked without issue.
    • Options:
      • Option 1: Use ava for backend and jest for frontend (what's currently implemented in this PR)
      • Option 2: Use ava for all tests
        • This requires us to either drop the idea of unit testing or snapshot testing JSX code, or resolve the issues I ran into (link to ava draft PR)
        • (Note that the tests in transformBreadcrumbs.test.ts will work with ava without further research because they're testing pure TypeScript code without JSX.)
      • Option 3: Use jest for all tests
        • This would require converting the existing backend tests to use jest instead of ava. (I haven't done any research into this, but am happy to try this if there's interest in this approach).~~
  2. Do the the types of tests evaluated here make sense to write and maintain?
  3. Suggestions on Breadcrumbs component/function naming ("BreadcrumbTrail", "StatefulBreadcrumbTrail" etc.)
    • I'd like to rename the component files to match the component names once we're happy with the names, but haven't done that yet.
    • **Update: ** Names have been updated based on feedback as described in this comment.

Thank you for reading all this and for your input! 😃

(Reverted changes to package.json for storybook)

# Conflicts:
#	package-lock.json
#	package.json
#	src/components/design_system/breadcrumbs/Breadcrumbs.tsx
@@ -0,0 +1,227 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`BreadcrumbsDesign renders empty for / 1`] = `
Copy link
Contributor

@katconnors katconnors Sep 17, 2024

Choose a reason for hiding this comment

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

what is the "renders empty for / 1`" referring to?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This file is generated by Jest. Jest will generate these .snap files for test files with tests that use .toMatchSnapshot() if they don't already exist. If the component code is changed so that it no longer matches the snapshot, the test will fail. To update the snapshot files to match the current version of the component (assuming changes to component are intended), you run jest with the -u or --updateSnapshot option. The way our project is set up in this PR branch, you can update all snapshot files with:

npm run test:frontend -- --updateSnapshot

BreadcrumbsDesign renders empty for / is the name of the corresponding test in Breadcrumbs.test.tsx I'm not sure what the "1" refers to. As long as it makes sense to Jest, I guess that's what matters. 😄

See Jest docs for more on Snapshot testing: https://jestjs.io/docs/snapshot-testing

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@katconnors once Jest support is merged, would it make sense to document some of this in the README file or compass project wiki? Where do you think would be the best place?

Copy link
Contributor

Choose a reason for hiding this comment

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

I just found this comment by doing a search for "readme"... I would definitely advocate for updating the README. My personal best guess would be to go into the h3 "Running Tests", put all the existing content into an h4 for "Backend Tests", add information for "Frontend Tests" as another h4 below it, and then lastly one more h4 for "All Tests". It might be good to also add a link to https://jestjs.io/docs/snapshot-testing, which is where I just went to try to remember how snapshot testing works.

Also, the number seems to refer to the number of the test. Just playing around with it now, I created another test "renders empty for /students/student-id" with different props, and the resulting test generated an additional snapshot, so now there's a

exports[BreadcrumbsDesign renders empty for /students/student-id 2] = `

snapshot in addition to the first one on my local branch version of the snapshot file.

Copy link
Contributor

@katconnors katconnors left a comment

Choose a reason for hiding this comment

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

High level looks good to me, with the caveat that I haven't used jest myself.
Some other comments:
-I really appreciate how thorough the documentation is (both the overview and the file specific comments).
-functionality is good-the tests passed for me (front and backend)
-I would break into multiple PR's in the future (thousands of line changes is a very meaty PR!)

For your questions, I think it would be cool if we integrated some jest into the testing. Leaning towards not completely abolishing ava, but jest is really relevant for the industry and it's a good skill to have.

I don't have strong opinions on the naming, so others can chime in.

Comment on lines 11 to 26
/*
Attention: We've detected that you're using actions.argTypesRegex together with the visual test addon:

/Users/mike/Documents/coding/compass/.storybook/preview.tsx
9 | const preview: Preview = {
10 | parameters: {
> 11 | actions: { argTypesRegex: "^on[A-Z].*" },
| ^^^^^^^^^^^^^
12 | controls: {
13 | matchers: {
14 | color: /(background|color)$/i,

We recommend removing the argTypesRegex and assigning explicit action with the fn function from @storybook/test instead:
https://storybook.js.org/docs/essentials/actions#via-storybooktest-fn-spy-function
*/
// actions: { argTypesRegex: "^on[A-Z].*" },
Copy link
Contributor Author

Choose a reason for hiding this comment

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

TODO: Take this out of this PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@nickvisut is going to take a look at this in a new issue.

jest.setup.ts Outdated
Comment on lines 4 to 5
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
jest.mock("next/router", () => require("next-router-mock"));
Copy link
Contributor Author

Choose a reason for hiding this comment

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

TODO: Take this out; no longer mocking the router!

package.json Outdated
"lint-staged": "^13.1.0",
"next-router-mock": "^0.9.13",
Copy link
Contributor Author

Choose a reason for hiding this comment

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

TODO: Remove this

@thomhickey
Copy link
Contributor

@mrabbitt

  1. Awesome stuff here. Storybook is blowing my mind, what a huge time saver. Can't count on a million fingers how many times I've drilled into a UI just to see my latest changes of some internal component. HMR alleviates some of this, but storybook is a whole new level.
  2. Let's go with Jest everywhere as far as I'm concerned. I'd be happy to help rewrite the ava tests into Jest. It's a shame to have two test runners. If not, then Jest front-end, Ava back-end is fine with me. The way you've integrated them both into package.json is great.
  3. For names I suggest BreadcrumbTrail (parent) and Breadcrumb (child) for the two components - note singular not plural.
  4. Love the snapshot testing.
  5. I'm getting a lot of 'unsafe call of an any typed value' in the jest tests, are you? They run and pass, but typescript is barking.
  6. Multiple PRs would have been nice, agree with @katconnors. Maybe a Jest PR, Storybook PR, and then the final Breadcrumb PR.

Still looking at and running the code, but those are some first thoughts.

Lastly, and I know a redesign wasn't part of this, but to springboard some discussions - we really need more ui/ux design on the breadcrumb trail to know exactly where the app should go. When I've drilled into a goal:

image
  1. I really expect 'Jane Student' to be clickable.
  2. I don't really understand the difference between what would happen clicking on 'Jane Student' vs. clicking on 'GOALS'.
  3. 'Students' makes sense.
  4. Don't ever click on 'GOALS' .. wow, app went into total crash mode, nothing works, getting weird hydration errors. Even hand-entering /students in the address bar no longer works. Love next.js!!!
  5. uuids in the breadcrumb are not helpful.

@mrabbitt
Copy link
Contributor Author

mrabbitt commented Sep 23, 2024

Lastly, and I know a redesign wasn't part of this, but to springboard some discussions - we really need more ui/ux design on the breadcrumb trail to know exactly where the app should go. When I've drilled into a goal:
image

1. I really expect 'Jane Student' to be clickable.

2. I don't really understand the difference between what would happen clicking on 'Jane Student' vs. clicking on 'GOALS'.

3. 'Students' makes sense.

4. Don't ever click on 'GOALS' .. wow, app went into total crash mode, nothing works, getting weird hydration errors. Even hand-entering /students in the address bar no longer works. Love next.js!!!

5. uuids in the breadcrumb are not helpful.

@thomhickey I had filed #396 to address most of these issues. My plan was to first add the ability to test the logic within the breadcrumbs component without changing its functional behavior in this PR, and then fix the functional behavior in another PR and close out #396.

@mrabbitt
Copy link
Contributor Author

5. I'm getting a lot of 'unsafe call of an any typed value' in the jest tests, are you? They run and pass, but typescript is barking.

@thomhickey Hmm...I'm not seeing that. Where do you see that message?

@KCCPMG
Copy link
Contributor

KCCPMG commented Sep 24, 2024

@mrabbitt

  1. Awesome stuff here. Storybook is blowing my mind, what a huge time saver. Can't count on a million fingers how many times I've drilled into a UI just to see my latest changes of some internal component. HMR alleviates some of this, but storybook is a whole new level.
  2. Let's go with Jest everywhere as far as I'm concerned. I'd be happy to help rewrite the ava tests into Jest. It's a shame to have two test runners. If not, then Jest front-end, Ava back-end is fine with me. The way you've integrated them both into package.json is great.
  3. For names I suggest BreadcrumbTrail (parent) and Breadcrumb (child) for the two components - note singular not plural.
  4. Love the snapshot testing.
  5. I'm getting a lot of 'unsafe call of an any typed value' in the jest tests, are you? They run and pass, but typescript is barking.
  6. Multiple PRs would have been nice, agree with @katconnors. Maybe a Jest PR, Storybook PR, and then the final Breadcrumb PR.

Still looking at and running the code, but those are some first thoughts.

Lastly, and I know a redesign wasn't part of this, but to springboard some discussions - we really need more ui/ux design on the breadcrumb trail to know exactly where the app should go. When I've drilled into a goal:

image 1. I really expect 'Jane Student' to be clickable. 2. I don't really understand the difference between what would happen clicking on 'Jane Student' vs. clicking on 'GOALS'. 3. 'Students' makes sense. 4. Don't ever click on 'GOALS' .. wow, app went into total crash mode, nothing works, getting weird hydration errors. Even hand-entering /students in the address bar no longer works. Love next.js!!! 5. uuids in the breadcrumb are not helpful.

I have no familiarity with storybook, but when I run it, all the stories are broken. I'm guessing that's not what's supposed to happen...is there anything I should be doing or checking?

EDIT: Nvm, for some reason the "transformBreadcrumbs" file was named "transformBreadCrumbs" and that caused storybook to break. Not sure how that happened.

@mrabbitt
Copy link
Contributor Author

For names I suggest BreadcrumbTrail (parent) and Breadcrumb (child) for the two components - note singular not plural.

@thomhickey I think that would make sense if the parent displayed the trail of breadcrumbs and the child displayed a single "crumb," but that's not what's happening. The parent is a stateful component which gets path information from the next router and name data from the backend, and passes it to the child component as props. The stateless child component displays the entire breadcrumb trail based on the props. I like the idea of using "BreadcrumbTrail" rather than "Breadcrumbs" plural though.

When @nickvisut and I discussed the PR over a huddle last week, he suggested that:

  • The inner, stateless component should be called something minimal like "Breadcrumbs" (I think "BreadcrumbTrail" could work too), and should stay in the design_system directory.
  • The outer, stateful component's name should reflect that it's a stateful wrapper that doesn't directly handle display, such as "BreadcrumbsContainer" or "StatefulBreadcrumbs" or something similar. Because of its role, it should not be under the design_system directory.

(@nickvisut , please correct me if I'm misrepresenting your suggestions.)

What I'm planning to do now:

  1. Follow @nickvisut 's suggestions for structure.
  2. Use "BreadcrumbTrail" as the stateless inner component and "StatefulBreadcrumbTrail" as the stateful wrapper.
  3. Rename the transformBreadcrumbs.ts file to BreadcrumbTrailUtils.ts (following Thom's suggestion here)

I'll work on this now. Thanks for the feedback, @thomhickey and @nickvisut !

@mrabbitt
Copy link
Contributor Author

EDIT: Nvm, for some reason the "transformBreadcrumbs" file was named "transformBreadCrumbs" and that caused storybook to break. Not sure how that happened.

@KCCPMG, sorry about that. This might have happened because I accidentally named that file with a capital "C"in an earlier commit, and then renamed it with a lower case "c" to match the other files in a later commit. When this PR is eventually squashed and merged, that renaming should be removed from git history, so hopefully no one else will run into this. 🤞 Glad it's working for you now.

@KCCPMG
Copy link
Contributor

KCCPMG commented Sep 24, 2024

EDIT: Nvm, for some reason the "transformBreadcrumbs" file was named "transformBreadCrumbs" and that caused storybook to break. Not sure how that happened.

@KCCPMG, sorry about that. This might have happened because I accidentally named that file with a capital "C"in an earlier commit, and then renamed it with a lower case "c" to match the other files in a later commit. When this PR is eventually squashed and merged, that renaming should be removed from git history, so hopefully no one else will run into this. 🤞 Glad it's working for you now.

No worries, I felt embarrassed by what a relatively minor issue it was, and I'm surprised it ended up out of sync somehow when it wasn't caught when I started up the the dev server. At any rate, I would have deleted, but I'm leaving it up in case anyone else runs into the same problem and can be spared my embarrassment.

package-lock.json taken from main branch, then ran `npm install`.

# Conflicts:
#	package-lock.json
@mrabbitt mrabbitt marked this pull request as ready for review September 25, 2024 00:11
@thomhickey
Copy link
Contributor

For names I suggest BreadcrumbTrail (parent) and Breadcrumb (child) for the two components - note singular not plural.

@thomhickey I think that would make sense if the parent displayed the trail of breadcrumbs and the child displayed a single "crumb," but that's not what's happening. The parent is a stateful component which gets path information from the next router and name data from the backend, and passes it to the child component as props. The stateless child component displays the entire breadcrumb trail based on the props. I like the idea of using "BreadcrumbTrail" rather than "Breadcrumbs" plural though.

When @nickvisut and I discussed the PR over a huddle last week, he suggested that:

  • The inner, stateless component should be called something minimal like "Breadcrumbs" (I think "BreadcrumbTrail" could work too), and should stay in the design_system directory.
  • The outer, stateful component's name should reflect that it's a stateful wrapper that doesn't directly handle display, such as "BreadcrumbsContainer" or "StatefulBreadcrumbs" or something similar. Because of its role, it should not be under the design_system directory.

(@nickvisut , please correct me if I'm misrepresenting your suggestions.)

What I'm planning to do now:

  1. Follow @nickvisut 's suggestions for structure.
  2. Use "BreadcrumbTrail" as the stateless inner component and "StatefulBreadcrumbTrail" as the stateful wrapper.
  3. Rename the transformBreadcrumbs.ts file to BreadcrumbTrailUtils.ts (following Thom's suggestion here)

I'll work on this now. Thanks for the feedback, @thomhickey and @nickvisut !

Thanks @mrabbitt ... yeah, I suppose I need to be brought up to speed on this whole 'design' and 'design_system' paradigm that's in the codebase. Still scratching my head about why the word 'design' is coming up anywhere in the actual implementations of these components. I understand terms like 'layout' or 'container' in page and component filenames, but 'design' is a head-scratcher for me.

@thomhickey
Copy link
Contributor

  1. I'm getting a lot of 'unsafe call of an any typed value' in the jest tests, are you? They run and pass, but typescript is barking.

@thomhickey Hmm...I'm not seeing that. Where do you see that message?

it went away. that's the second or third time my cursor/vscode has barked about typescript errors that ended up going away. not happy! ... sorry for the confusion @mrabbitt

@KCCPMG
Copy link
Contributor

KCCPMG commented Sep 25, 2024

I'm getting weird 'cannot find module' errors, even after re-running npm install and even removing my node_modules first and then doing it again. Has anyone else had any issues with this? The first one I had was with esbuild-runner, which I decided to install just to make things work. I got past the postinstall point where it was usually failing, but my backend tests are all exiting and telling me that it cannot find 'nextjs-middleware-wrappers'. This has been the case when I run both 'npm run test:backend', but also if I just do 'npx ava' (though that also gives me grief about finding jest files).

@mrabbitt
Copy link
Contributor Author

mrabbitt commented Sep 26, 2024

but also if I just do 'npx ava' (though that also gives me grief about finding jest files).

@KCCPMG , I know this isn't the main problem, but I just pushed a small config change that makes npx ava run only the backend tests so it won't complain about jest files anymore. 🙂

@mrabbitt
Copy link
Contributor Author

I'm getting weird 'cannot find module' errors, even after re-running npm install and even removing my node_modules first and then doing it again. Has anyone else had any issues with this? The first one I had was with esbuild-runner, which I decided to install just to make things work. I got past the postinstall point where it was usually failing, but my backend tests are all exiting and telling me that it cannot find 'nextjs-middleware-wrappers'. This has been the case when I run both 'npm run test:backend', but also if I just do 'npx ava' (though that also gives me grief about finding jest files).

@KCCPMG Weird. I haven't seen this. I tried wiping node_modules and re-running npm install and npn run all:check, and everything looked good.

Are there files installed for you under node_modules/nextjs-middleware-wrappers/ ? I see:

$ ls node_modules/nextjs-middleware-wrappers
README.md          dist/              release.config.js  tsconfig.json
ava.config.js      package.json       tests/             wrappers.ts

One other idea that might be worth trying is doing a fresh git checkout of compass in another location and seeing if the problem happens there too.

@KCCPMG
Copy link
Contributor

KCCPMG commented Sep 28, 2024

I'm getting weird 'cannot find module' errors, even after re-running npm install and even removing my node_modules first and then doing it again. Has anyone else had any issues with this? The first one I had was with esbuild-runner, which I decided to install just to make things work. I got past the postinstall point where it was usually failing, but my backend tests are all exiting and telling me that it cannot find 'nextjs-middleware-wrappers'. This has been the case when I run both 'npm run test:backend', but also if I just do 'npx ava' (though that also gives me grief about finding jest files).

@KCCPMG Weird. I haven't seen this. I tried wiping node_modules and re-running npm install and npn run all:check, and everything looked good.

Are there files installed for you under node_modules/nextjs-middleware-wrappers/ ? I see:

$ ls node_modules/nextjs-middleware-wrappers
README.md          dist/              release.config.js  tsconfig.json
ava.config.js      package.json       tests/             wrappers.ts

One other idea that might be worth trying is doing a fresh git checkout of compass in another location and seeing if the problem happens there too.

I just tried the updated branch, then checked out main, all the same thing. I also tried looking for node_modules/nextjs-middleware-wrappers, and the directory isn't there. It looks like it's not supposed to be in package.json, but I do see it in the package-lock.json several times as a peer dependency. The other weird thing is that running tests (or doing a type check) says that now there's no declaration file for the 'pg' library. I'm not sure what's going on, it seems like I might have something pretty deeply screwed up.

UPDATE:

I tried running this on my other machine and it seems to work fine. More tellingly, running npm install doesn't change my package-lock.json to be out of sync with the git repository, which was happening with both my main branch as well as this one. Seems like the issue is isolated to my MacBook, hopefully the exorcist I called can tell me more.

Copy link
Contributor

@KCCPMG KCCPMG left a comment

Choose a reason for hiding this comment

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

I'll approve this because it seems to work, and because the jest testing and storybook stuff look terrific. As far as I'm concerned, this can be merged, but below are my quibbles, which you can feel free to disregard or respond to:

  1. I mentioned this before, but it seems to me that useBreadcrumbContext should not be called what it is. There's no call to useContext, nor is there a BreadcrumbContextProvider or something similar, it's effectively just a formatted data object to be passed down. Along similar lines, I don't think that the useBreadcrumbContext needs its own file, but that's an even more nitpicky convention thing, about which I'm probably wrong.

  2. I don't think I quite understand why the parent component is referred to as Stateful, there's no actual state and it looks like it's just hooking into useRouter and then passing re-formatted data down.

  3. Honestly I get a little bit confused jumping back and forth through the key 4 files involved here, but that's much more on me. I can see how you're splitting up the path and making the "descriptor" part of the benchmark linkable, but not the value that corresponds to a specific identifier. I suppose that makes sense, but it does mean that in students/student_id/goals/goal_id, you wouldn't be able to return to the student, but you would have a link to a goals page that isn't there (I believe @thomhickey mentioned that particular one as well).

Like I said, this works, and hopefully there's some meaningful feedback on the design side of things in terms of if there's something different that they'd like to see. I probably would have used an object that looks at the descriptor which then determined how the descriptor and identifier would be rendered, but that's off the top of my head and there might be very good reasons for not doing that. Sorry for taking so long to get back to you on the review, good job with this, this was clearly a ton of work, and I think that the other infrastructure aspects of this PR will pay big dividends long-term.

@@ -0,0 +1,227 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`BreadcrumbsDesign renders empty for / 1`] = `
Copy link
Contributor

Choose a reason for hiding this comment

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

I just found this comment by doing a search for "readme"... I would definitely advocate for updating the README. My personal best guess would be to go into the h3 "Running Tests", put all the existing content into an h4 for "Backend Tests", add information for "Frontend Tests" as another h4 below it, and then lastly one more h4 for "All Tests". It might be good to also add a link to https://jestjs.io/docs/snapshot-testing, which is where I just went to try to remember how snapshot testing works.

Also, the number seems to refer to the number of the test. Just playing around with it now, I created another test "renders empty for /students/student-id" with different props, and the resulting test generated an additional snapshot, so now there's a

exports[BreadcrumbsDesign renders empty for /students/student-id 2] = `

snapshot in addition to the first one on my local branch version of the snapshot file.


export type Student = SelectableForTable<"student">;
export type Para = SelectableForTable<"user">;
export interface BreadcrumbContext {
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm late to the naming things party, but I would caution against using the word context in both this interface and the function. There's no provider for this context as a parent component that deeply nested child components are using, so to my mind this doesn't behave the way that I would expect of something with this name.

Copy link
Contributor

Choose a reason for hiding this comment

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

following up on this, I agree that we don't want to overload the concept of React "context". perhaps "data" or something similar could work, @mrabbitt?

@katconnors katconnors self-requested a review October 16, 2024 18:41
Copy link
Contributor

@katconnors katconnors left a comment

Choose a reason for hiding this comment

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

No change to-dos from my end, for your commits since my last comment ( Sep 24th onward).


export type Student = SelectableForTable<"student">;
export type Para = SelectableForTable<"user">;
export interface BreadcrumbContext {
Copy link
Contributor

Choose a reason for hiding this comment

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

following up on this, I agree that we don't want to overload the concept of React "context". perhaps "data" or something similar could work, @mrabbitt?

person: Student | Para | undefined;
}

export const useBreadcrumbContext = (
Copy link
Contributor

Choose a reason for hiding this comment

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

Is this a custom hook?

Copy link
Contributor

Choose a reason for hiding this comment

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

(if not, can we replace the use with another word?)

@nickvisut
Copy link
Contributor

nickvisut commented Oct 19, 2024

Revisiting this and it's good stuff, @mrabbitt. Looks like there are a handful of unresolved convos (and I just added a couple of my own). They could either be moved out w/"Reference in new issue" to address later or resolved in this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants