Files
jwinters01andGitHub ad616de862 chore: fix Rules-of-React violations for React Compiler readiness (#624)
* chore: fix Rules-of-React violations for React Compiler readiness

Add eslint-plugin-react-hooks v7 (recommended-latest) and fix all
error-level Rules-of-React findings so the React Compiler can optimize
the component library.

The healthcheck reports 100% of components compilable; these fixes
clear the 34 ESLint errors across the src and v2 component trees:

- refs: stop accessing ref.current during render (incl. the react-form
  compat shim, whose public ref-forwarding API is preserved)
- set-state-in-effect: convert to derived state or restructure effects
- immutability: clone-before-mutate; stop mutating props/state
- rules-of-hooks: hoist conditional hook calls to top level

All 47 unit tests pass; behavior is preserved.

Signed-off-by: Jonathan Winters <[email protected]>

* chore: resolve react-hooks deps from public npm registry

The eslint-plugin-react-hooks@7 dependency subtree was locked to an
internal mirror, which the public CI runner can't reach (ETIMEDOUT).
Rewrite the 21 affected resolved URLs to registry.yarnpkg.com.

Signed-off-by: Jonathan Winters <[email protected]>

* useKeybinding -> registerKeybinding

Signed-off-by: Jonathan Winters <[email protected]>

* chore: fix Rules-of-React refs violations from registerKeybinding rename

The useKeybinding->registerKeybinding rename turned hook calls into plain
function calls in the render body; since registerKeybinding takes ref
targets, the new react-hooks/refs lint flagged them. Move the calls into
useEffect (registration is a side effect) in sliding-panel and the v2
autocomplete. In the v1 autocomplete, the flagged value is a forwarded
callback ref, not a render-time read, so suppress that one with a comment.

Also dedupe pnpm-lock.yaml.

Signed-off-by: Jonathan Winters <[email protected]>

---------

Signed-off-by: Jonathan Winters <[email protected]>
2026-06-30 11:51:17 +02:00

45 lines
1.2 KiB
TypeScript

import * as React from 'react';
import {useTheme} from '../../shared/context/theme';
export enum Theme {
Light = 'light',
Dark = 'dark',
}
/**
* Automatically appends `--dark` to all classes on the div when `theme` prop is set to `Theme.Dark`
*/
export const ThemeDiv = (
props: {
children?: React.ReactNode;
disabled?: boolean;
innerref?: React.LegacyRef<any>;
theme?: Theme;
className?: string;
} & React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
) => {
const contextTheme = useTheme();
const theme = props.theme || contextTheme;
const {innerref, children, ...rest} = props;
let clString = props.className;
if (theme === Theme.Dark && !props.disabled) {
const cl = (clString || '').split(' ') || [];
const darkCl = [];
for (const c of cl) {
if (!c.endsWith('--dark')) {
darkCl.push(c + '--dark');
}
}
clString = `${cl.join(' ')} ${darkCl.join(' ')}`;
}
return (
<div {...(rest as any)} className={clString} ref={innerref}>
{children}
</div>
);
};
export default ThemeDiv;