mirror of
https://github.com/hanzoai/cd-ui.git
synced 2026-10-30 20:42:45 +00:00
* 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]>
33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import * as React from 'react';
|
|
import {ThemeDiv} from '../theme-div/theme-div';
|
|
import './loading-bar.scss';
|
|
import './spinner.scss';
|
|
import { PropsWithChildren } from 'react';
|
|
|
|
export const Spinner = () => (
|
|
<ThemeDiv className='spinner'>
|
|
<i className='fa-circle-notch fa fa-spin' />
|
|
</ThemeDiv>
|
|
);
|
|
|
|
export const LoadingBar = (props: {loadms?: string | number}) => {
|
|
const [loading, setLoading] = React.useState(true);
|
|
|
|
const loadms = props.loadms || 400;
|
|
|
|
React.useEffect(() => {
|
|
const frame = requestAnimationFrame(() => setLoading(false));
|
|
return () => cancelAnimationFrame(frame);
|
|
}, []);
|
|
return (
|
|
<ThemeDiv className={`loading-bar ${!loading ? 'loading-bar--loaded' : ''}`} style={{transition: `opacity 200ms ease ${loadms}ms`}} onClick={() => setLoading(false)}>
|
|
<div className={`loading-bar__fill ${!loading ? 'loading-bar__fill--loaded' : ''}`} style={{transition: `transform ${loadms}ms ease`}} />
|
|
</ThemeDiv>
|
|
);
|
|
};
|
|
|
|
type WaitForProps = { loading: boolean; loader?: React.ReactNode; loadms?: string | number }
|
|
export const WaitFor: React.FC<PropsWithChildren<WaitForProps>> = (props) => (
|
|
<React.Fragment>{props.loading ? props.loader || <LoadingBar loadms={props.loadms} /> : props.children}</React.Fragment>
|
|
);
|