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

[core] Suggestion to fix eslint error with CodeCopy.tsx with immutable object #44348

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

wilhelmlofsten
Copy link
Contributor

@wilhelmlofsten wilhelmlofsten commented Nov 8, 2024

Suggestion for fix #42564 with CodeCopy.tsx.

So suggestion with using React Callback with passing the argument instead of directly and due to rootNode.current = node still being immutable (eslint error), can disable it with react compiler - saw that it was done previously in the code. So open for suggestions for this solution/ feedback to change the code! 😃

@mui-bot
Copy link

mui-bot commented Nov 8, 2024

Netlify deploy preview

https://deploy-preview-44348--material-ui.netlify.app/

Bundle size report

No bundle size changes (Toolpad)
No bundle size changes

Generated by 🚫 dangerJS against ce3e799

@zannager zannager added the core Infrastructure work going on behind the scenes label Nov 8, 2024
@zannager zannager requested a review from Janpot November 8, 2024 11:12
@Janpot
Copy link
Member

Janpot commented Nov 8, 2024

I'm not sure what we gain from this refactor, the code still contains an ignore directive, which means the whole file still doesn't get transformed.

I believe the canonical solution to this problem would be to expose the setNode in a context instead of the ref. But I could be wrong, I have just as little mileage with React 19 as the next guy 🙂

@wilhelmlofsten
Copy link
Contributor Author

I'm not sure what we gain from this refactor, the code still contains an ignore directive, which means the whole file still doesn't get transformed.

I believe the canonical solution to this problem would be to expose the setNode in a context instead of the ref. But I could be wrong, I have just as little mileage with React 19 as the next guy 🙂

Yea noticed CI testlint failing now when i turned the eslintrc check back to false again with "// eslint-disable-next-line react-compiler/react-compiler" with now giving errors ..

I would argue that im still new to open source development and MUI project, so thankful for the fast feedback! Will look into exposing the setNode into the context instead with that seeming to be a more thoughtful approach! 😄

@Janpot
Copy link
Member

Janpot commented Nov 8, 2024

yes, but even that, isn't this just a false positive in the eslint plugin? I assume it's only complaining because it can't infer that in fact rootNode is a mutable ref.

@wilhelmlofsten
Copy link
Contributor Author

yes, but even that, isn't this just a false positive in the eslint plugin? I assume it's only complaining because it can't infer that in fact rootNode is a mutable ref.

Yeah, that makes sense - it does seem like a false positive, especially since setting eslint.rc to false resolves it. And yes, rootNode is indeed mutable. Should we consider adjusting the ESLint configuration if the inline comment isn’t working as intended, or how should we proceed forward?

@wilhelmlofsten wilhelmlofsten force-pushed the fixEslLintIssueCodeCopy branch from 02869ca to b254db9 Compare November 11, 2024 08:49
@wilhelmlofsten
Copy link
Contributor Author

wilhelmlofsten commented Nov 11, 2024

Suggested push from feedback from @Janpot with:

  • changed setRootNode to setNode (my previous pr commit)
  • exposed the setNode inside the CodeBlockContext and passing arguments to setNode directly
  • added useMemo to prevent rerendering inside the codeCopy provider with contextValue

This removed the eslint error and tested it with compiling and used codeCopy and seems to work 😃

So open for feedback/suggestions/ Reviews!

@wilhelmlofsten
Copy link
Contributor Author

Hello! Is there an update or possibility to get a review @Janpot @aarongarciah :)

@github-actions github-actions bot added the PR: out-of-date The pull request has merge conflicts and can't be merged label Dec 9, 2024
…Callback with passing the argument instead of directly and due to rootNode.current = node still being immutable (eslint error), can disable it with react compiler - saw that it was done previously in the code.
@wilhelmlofsten wilhelmlofsten force-pushed the fixEslLintIssueCodeCopy branch from b254db9 to ce3e799 Compare December 11, 2024 09:42
@github-actions github-actions bot removed the PR: out-of-date The pull request has merge conflicts and can't be merged label Dec 11, 2024
@@ -157,10 +161,12 @@ interface CodeCopyProviderProps {
* Any code block inside the tree can set the rootNode when mouse enter to leverage keyboard copy.
*/
export function CodeCopyProvider({ children }: CodeCopyProviderProps) {
const rootNode = React.useRef<HTMLDivElement>(null);
const [rootNode, setNode] = React.useState<HTMLDivElement | null>(null);
Copy link
Member

Choose a reason for hiding this comment

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

I believe this will result in extra renders each time setNode is called. Renders that wouldn't happen with the useRef implementation. I think a more correct implementation keeps the ref and instead only passes a setNode callback in the context.

const rootNode = React.useRef<HTMLDivElement>(null);
const setNode = React.useCallback((node) => {
  if (typeof node === 'function') {
    rootNode.current = node(rootNode.current)
  } else {
    rootNode.current = node
  }
}, []);

// ...

<CodeBlockContext.Provider value={setNode}>

That being said, I'm still not convinced we should do this refactor at all. Maybe we should work on the motivation first?

@aarongarciah aarongarciah changed the title [Core] Suggestion to fix eslint error with CodeCopy.tsx with immutable object [core] Suggestion to fix eslint error with CodeCopy.tsx with immutable object Dec 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Infrastructure work going on behind the scenes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[core] Fix eslint-plugin-react-compiler issues
4 participants