Utility functions related to React.
npm i @cubux/react-utilsWrap a component to emit deprecation warning.
function deprecated<T extends React.ComponentType<any>>(
Origin: T,
options?: Options,
): React.ComponentType<React.ComponentProps<T>>The options object can have the following properties:
| property | type | default | description |
|---|---|---|---|
comment |
string |
— | Extra comment to emit in console warning. Can also be obtained later with getDevInfo(). |
tag |
string |
— | A tag property to bypass to setDevInfo(). Can be obtained later with getDevInfo(). |
withRef |
boolean |
false |
Whether to use React.forwardRef(), so ref React attribute can be used to refer to underlying element of the Origin component. |
A getDevInfo() can be used in development env to get details about deprecation.
This can be used on "dev only" internal pages.
Notice: Component's (static) properties like propTypes, defaultProps,
etc. are not touched because it was not necessary yet.
Does nothing in production env and returns origin component as is.
See also: DevInfo, getDevInfo().
import { deprecated, getDevInfo } from '@cubux/react-utils';
function OldComponentOrigin() {
return <div>...</div>;
}
const OldComponent = deprecated(OldComponentOrigin, {
comment: 'Use `NewComponent` instead.',
});
if (process.env.NODE_ENV === 'development') {
console.log(getDevInfo(OldComponent));
}interface DevInfo {
type: string;
tag?: string;
Orig?: React.ComponentType<any>;
comment?: string;
}See also: getDevInfo(), setDevInfo().
Get DevInfo for the given generated component.
function getDevInfo<T extends DevInfo = DevInfo>(
subject: ComponentType<any>,
): T | undefinedDoes nothing in production env and always returns undefined.
An example can be found in deprecated().
See also: setDevInfo().
Set given DevInfo for the given component.
function setDevInfo<T extends DevInfo>(
subject: ComponentType<any>,
info: T,
): voidDoes nothing in production env.
See also: getDevInfo().
Check whether the given element is an element of the given component.
function isElementOf<T extends React.ElementType>(
element: any,
component: T,
): element is React.ReactElement<React.ComponentPropsWithoutRef<T>, T>NOTICE: The react-is peer dependency must be installed to use this
function.
Enhanced version of isElement() from react-is package to use as Type Guard
function.
import { FC, PropsWithChildren } from 'react';
interface FooProps {
x: number;
y?: string;
}
const Foo: FC<FooProps> = () => <div />;
const element = <Foo x={42} y="foo bar">baz</Foo>;
if (isElementOf(element, Foo)) {
const { props } = element;
// `props` type is `PropsWithChildren<FooProps>`
console.log(props);
// { x: 42, y: "foo bar", children: "baz" }
}
console.log(isElementOf(element, 'div'));
// => `false`
console.log(isElementOf(<div/>, Foo));
// => `false`
console.log(isElementOf(<div/>, 'a'));
// => `false`
console.log(isElementOf(<div/>, 'div'));
// => `true`A React.FunctionComponent component receiving properties for <svg/> element.
type SvgFC = React.FC<React.SVGProps<SVGSVGElement>>A component of this signature can be given for example with svgo package,
which is used internally in CRA react-scripts for SVG files imports like
following:
// You are using CRA `react-scripts`, so
import { ReactComponent } from './file.svg';Or writing such component manually:
const MySvg: SvgFC = (props) => (
<svg
{...props}
width={16}
height={16}
viewBox="0 0 16 16"
fill="currentColor"
>
<path d="M2,5 h12 v6 z" />
</svg>
);Creates new SvgFC component by reusing origin SvgFC applying a CSS
transform.
type CssTransform = string;
type CalcTransform = (prev: CssTransform | undefined) => CssTransform;
function svgTransform(
Orig: SvgFC,
transform: CssTransform | CalcTransform,
): SvgFCA getDevInfo() can be used in development env to get details about underlying
transform. This can be used on "dev only" internal pages.
const MySvg: SvgFC = (props) => (
<svg
{...props}
width={16}
height={16}
viewBox="0 0 16 16"
fill="currentColor"
>
<path d="M2,5 h12 v6 z" />
</svg>
);
const MySvg1 = svgTransform(MySvg, 'scaleX(0.75), rotate(45deg)');See also: getDevInfo().
Creates new SvgFC applying horizontal flip to origin SvgFC with CSS
transform.
function svgFlipH(Orig: SvgFC): SvgFCUses svgTransform() internally with 'scaleX(-1)' transform value.
See also: transform(), svgFlipV(), svgRot180().
Creates new SvgFC applying vertical flip to origin SvgFC with CSS
transform.
function svgFlipV(Orig: SvgFC): SvgFCUses svgTransform() internally with 'scaleY(-1)' transform value.
See also: transform(), svgFlipH(), svgRot180().
Creates new SvgFC applying rotation 180 deg to origin SvgFC with CSS
transform.
function svgRot180(Orig: SvgFC): SvgFCUses svgTransform() internally with 'rotate(180deg)' transform value.
See also: transform(), svgFlipH(), svgFlipV().
Creates new SvgFC applying rotation 90 deg anti-clockwise to origin SvgFC
with CSS transform.
function svgRot90L(Orig: SvgFC): SvgFCUses svgTransform() internally with 'rotate(-90deg)' transform value.
See also: transform(), svgRot180().
Creates new SvgFC applying rotation 90 deg clockwise to origin SvgFC with
CSS transform.
function svgRot90R(Orig: SvgFC): SvgFCUses svgTransform() internally with 'rotate(90deg)' transform value.
See also: transform(), svgRot180().