Skip to content

Commit

Permalink
refactor(component): move type in a custom forwardRef function
Browse files Browse the repository at this point in the history
Refactor component types using a custom re-typed version of forwardRef in anticipation of React 18

DSW-349
  • Loading branch information
gcornut committed Jan 30, 2025
1 parent f96e860 commit 2b6f4d9
Show file tree
Hide file tree
Showing 92 changed files with 567 additions and 466 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { forwardRef } from 'react';
import React from 'react';

import classNames from 'classnames';

Expand All @@ -14,11 +14,10 @@ import {
Toolbar,
ButtonProps,
} from '@lumx/react';

import { mdiAlert, mdiAlertCircle, mdiCheckCircle, mdiInformation } from '@lumx/icons';
import { Comp } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { useId } from '@lumx/react/hooks/useId';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

export interface AlertDialogProps extends Omit<DialogProps, 'header' | 'footer'> {
/** Message variant. */
Expand Down Expand Up @@ -77,7 +76,7 @@ const DEFAULT_PROPS: Partial<DialogProps> = {
* It should not have a complex content.
* Children of this component should only be strings, paragraphs or links.
*/
export const AlertDialog: Comp<AlertDialogProps, HTMLDivElement> = forwardRef((props, ref) => {
export const AlertDialog = forwardRef<AlertDialogProps, HTMLDivElement>((props, ref) => {
const { id, title, className, cancelProps, confirmProps, kind, size, dialogProps, children, ...forwardedProps } =
props;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import React, { forwardRef, ReactNode, SyntheticEvent, useRef } from 'react';
import React, { ReactNode, SyntheticEvent, useRef } from 'react';

import classNames from 'classnames';

import { Dropdown, DropdownProps, IconButtonProps, Offset, Placement, TextField, TextFieldProps } from '@lumx/react';

import { Comp, GenericProps, HasTheme } from '@lumx/react/utils/type';
import { GenericProps, HasTheme } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { useFocus } from '@lumx/react/hooks/useFocus';
import { mergeRefs } from '@lumx/react/utils/mergeRefs';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

/**
* Defines the props of the component.
Expand Down Expand Up @@ -200,7 +201,7 @@ const DEFAULT_PROPS: Partial<AutocompleteProps> = {
* @param ref Component ref.
* @return React element.
*/
export const Autocomplete: Comp<AutocompleteProps, HTMLDivElement> = forwardRef((props, ref) => {
export const Autocomplete = forwardRef<AutocompleteProps, HTMLDivElement>((props, ref) => {
const defaultTheme = useTheme();
const {
anchorToInput,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import React, { ReactNode } from 'react';

import classNames from 'classnames';

import { mdiClose } from '@lumx/icons';
import { Autocomplete, AutocompleteProps, Chip, HorizontalAlignment, Icon, Size } from '@lumx/react';

import { Comp } from '@lumx/react/utils/type';
import { Autocomplete, AutocompleteProps, Chip, HorizontalAlignment, Icon, Size } from '@lumx/react';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';

import classNames from 'classnames';
import React, { forwardRef, ReactNode } from 'react';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';

/**
Expand Down Expand Up @@ -66,7 +67,7 @@ const DEFAULT_PROPS: Partial<AutocompleteMultipleProps> = {
* @param ref Component ref.
* @return React element.
*/
export const AutocompleteMultiple: Comp<AutocompleteMultipleProps, HTMLDivElement> = forwardRef((props, ref) => {
export const AutocompleteMultiple = forwardRef<AutocompleteMultipleProps, HTMLDivElement>((props, ref) => {
const defaultTheme = useTheme();
const {
anchorToInput,
Expand Down
7 changes: 4 additions & 3 deletions packages/lumx-react/src/components/avatar/Avatar.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import React, { forwardRef, KeyboardEventHandler, MouseEventHandler, ReactElement, ReactNode } from 'react';
import React, { KeyboardEventHandler, MouseEventHandler, ReactElement, ReactNode } from 'react';

import classNames from 'classnames';

import { AspectRatio, Size, Theme, Thumbnail, ThumbnailProps } from '@lumx/react';

import { Comp, GenericProps, HasTheme } from '@lumx/react/utils/type';
import { GenericProps, HasTheme } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

/**
* Avatar sizes.
Expand Down Expand Up @@ -66,7 +67,7 @@ const DEFAULT_PROPS: Partial<AvatarProps> = {
* @param ref Component ref.
* @return React element.
*/
export const Avatar: Comp<AvatarProps, HTMLDivElement> = forwardRef((props, ref) => {
export const Avatar = forwardRef<AvatarProps, HTMLDivElement>((props, ref) => {
const defaultTheme = useTheme() || Theme.light;
const {
actions,
Expand Down
11 changes: 7 additions & 4 deletions packages/lumx-react/src/components/badge/Badge.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import React, { ReactNode } from 'react';

import classNames from 'classnames';

import { ColorPalette } from '@lumx/react';
import { Comp, GenericProps } from '@lumx/react/utils/type';
import { GenericProps } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import classNames from 'classnames';
import React, { forwardRef, ReactNode } from 'react';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

/**
* Defines the props of the component.
Expand Down Expand Up @@ -38,7 +41,7 @@ const DEFAULT_PROPS: Partial<BadgeProps> = {
* @param ref Component ref.
* @return React element.
*/
export const Badge: Comp<BadgeProps, HTMLDivElement> = forwardRef((props, ref) => {
export const Badge = forwardRef<BadgeProps, HTMLDivElement>((props, ref) => {
const { children, className, color, ...forwardedProps } = props;
return (
<div
Expand Down
11 changes: 7 additions & 4 deletions packages/lumx-react/src/components/badge/BadgeWrapper.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import React, { ReactElement, ReactNode } from 'react';

import classNames from 'classnames';

import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { DEFAULT_PROPS } from '@lumx/react/components/select/WithSelectContext';
import { Comp, GenericProps } from '@lumx/react/utils/type';
import classNames from 'classnames';
import React, { forwardRef, ReactElement, ReactNode } from 'react';
import { GenericProps } from '@lumx/react/utils/type';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

export interface BadgeWrapperProps extends GenericProps {
/** Badge. */
Expand All @@ -21,7 +24,7 @@ const COMPONENT_NAME = 'BadgeWrapper';
*/
const CLASSNAME = getRootClassName(COMPONENT_NAME);

export const BadgeWrapper: Comp<BadgeWrapperProps, HTMLDivElement> = forwardRef((props, ref) => {
export const BadgeWrapper = forwardRef<BadgeWrapperProps, HTMLDivElement>((props, ref) => {
const { badge, children, className, ...forwardedProps } = props;

return (
Expand Down
8 changes: 5 additions & 3 deletions packages/lumx-react/src/components/button/Button.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import React, { forwardRef, ReactNode } from 'react';
import React, { ReactNode } from 'react';

import classNames from 'classnames';
import isEmpty from 'lodash/isEmpty';

import { Emphasis, Icon, Size, Theme, Text } from '@lumx/react';
import { Comp, isComponent } from '@lumx/react/utils/type';
import { isComponent } from '@lumx/react/utils/type';
import { getBasicClass, getRootClassName } from '@lumx/react/utils/className';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

import { BaseButtonProps, ButtonRoot } from './ButtonRoot';

/**
Expand Down Expand Up @@ -54,7 +56,7 @@ const DEFAULT_PROPS: Partial<ButtonProps> = {
* @param ref Component ref.
* @return React element.
*/
export const Button: Comp<ButtonProps, HTMLButtonElement | HTMLAnchorElement> = forwardRef((props, ref) => {
export const Button = forwardRef<ButtonProps, HTMLButtonElement | HTMLAnchorElement>((props, ref) => {
const defaultTheme = useTheme() || Theme.light;
const { children, className, emphasis, leftIcon, rightIcon, size, theme = defaultTheme, ...forwardedProps } = props;

Expand Down
7 changes: 4 additions & 3 deletions packages/lumx-react/src/components/button/ButtonGroup.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import React, { forwardRef } from 'react';
import React from 'react';

import classNames from 'classnames';

import { Comp, GenericProps } from '@lumx/react/utils/type';
import { GenericProps } from '@lumx/react/utils/type';
import { getRootClassName } from '@lumx/react/utils/className';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

/**
* Defines the props of the component
Expand Down Expand Up @@ -32,7 +33,7 @@ const DEFAULT_PROPS: Partial<ButtonGroupProps> = {};
* @param ref Component ref.
* @return React element.
*/
export const ButtonGroup: Comp<ButtonGroupProps, HTMLDivElement> = forwardRef((props, ref) => {
export const ButtonGroup = forwardRef<ButtonGroupProps, HTMLDivElement>((props, ref) => {
const { children, className, ...forwardedProps } = props;

return (
Expand Down
7 changes: 4 additions & 3 deletions packages/lumx-react/src/components/button/ButtonRoot.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import React, { AriaAttributes, ButtonHTMLAttributes, DetailedHTMLProps, forwardRef, RefObject } from 'react';
import React, { AriaAttributes, ButtonHTMLAttributes, DetailedHTMLProps, RefObject } from 'react';

import isEmpty from 'lodash/isEmpty';

import classNames from 'classnames';

import { ColorPalette, Emphasis, Size, Theme } from '@lumx/react';
import { CSS_PREFIX } from '@lumx/react/constants';
import { Comp, GenericProps, HasTheme } from '@lumx/react/utils/type';
import { GenericProps, HasTheme } from '@lumx/react/utils/type';
import { handleBasicClasses } from '@lumx/react/utils/className';
import { renderLink } from '@lumx/react/utils/renderLink';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

type HTMLButtonProps = DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;

Expand Down Expand Up @@ -94,7 +95,7 @@ const renderButtonWrapper: React.FC<ButtonRootProps> = (props) => {
* @param ref Component ref.
* @return React element.
*/
export const ButtonRoot: Comp<ButtonRootProps, HTMLButtonElement | HTMLAnchorElement> = forwardRef((props, ref) => {
export const ButtonRoot = forwardRef<ButtonRootProps, HTMLButtonElement | HTMLAnchorElement>((props, ref) => {
const {
'aria-label': ariaLabel,
children,
Expand Down
6 changes: 3 additions & 3 deletions packages/lumx-react/src/components/button/IconButton.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React, { forwardRef } from 'react';
import React from 'react';

import { Emphasis, Icon, Size, Theme, Tooltip, TooltipProps } from '@lumx/react';
import { BaseButtonProps, ButtonRoot } from '@lumx/react/components/button/ButtonRoot';
import { Comp } from '@lumx/react/utils/type';
import { getRootClassName } from '@lumx/react/utils/className';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

export interface IconButtonProps extends BaseButtonProps {
/**
Expand Down Expand Up @@ -56,7 +56,7 @@ const DEFAULT_PROPS: Partial<IconButtonProps> = {
* @param ref Component ref.
* @return React element.
*/
export const IconButton: Comp<IconButtonProps, HTMLButtonElement> = forwardRef((props, ref) => {
export const IconButton = forwardRef<IconButtonProps, HTMLButtonElement>((props, ref) => {
const defaultTheme = useTheme() || Theme.light;
const {
emphasis,
Expand Down
7 changes: 4 additions & 3 deletions packages/lumx-react/src/components/checkbox/Checkbox.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import React, { forwardRef, InputHTMLAttributes, ReactNode, SyntheticEvent } from 'react';
import React, { InputHTMLAttributes, ReactNode, SyntheticEvent } from 'react';

import classNames from 'classnames';

import { mdiCheck, mdiMinus } from '@lumx/icons';

import { Icon, InputHelper, InputLabel, Theme } from '@lumx/react';
import { Comp, GenericProps, HasTheme } from '@lumx/react/utils/type';
import { GenericProps, HasTheme } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { useId } from '@lumx/react/hooks/useId';
import { useMergeRefs } from '@lumx/react/utils/mergeRefs';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

/**
* Intermediate state of checkbox.
Expand Down Expand Up @@ -64,7 +65,7 @@ const DEFAULT_PROPS: Partial<CheckboxProps> = {};
* @param ref Component ref.
* @return React element.
*/
export const Checkbox: Comp<CheckboxProps, HTMLDivElement> = forwardRef((props, ref) => {
export const Checkbox = forwardRef<CheckboxProps, HTMLDivElement>((props, ref) => {
const defaultTheme = useTheme() || Theme.light;
const {
checked,
Expand Down
17 changes: 8 additions & 9 deletions packages/lumx-react/src/components/chip/Chip.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import React, { MouseEventHandler, ReactNode } from 'react';

import classNames from 'classnames';
import isFunction from 'lodash/isFunction';

import { ColorPalette, Size, Theme } from '@lumx/react';
import { useStopPropagation } from '@lumx/react/hooks/useStopPropagation';

import { Comp, GenericProps, HasTheme } from '@lumx/react/utils/type';
import { GenericProps, HasTheme } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { onEnterPressed } from '@lumx/react/utils/event';

import classNames from 'classnames';

import isFunction from 'lodash/isFunction';
import React, { forwardRef, MouseEventHandler, ReactNode } from 'react';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';
import { useTheme } from '@lumx/react/utils/theme/ThemeContext';

/**
Expand Down Expand Up @@ -66,7 +67,7 @@ const DEFAULT_PROPS: Partial<ChipProps> = {
* @param ref Component ref.
* @return React element.
*/
export const Chip: Comp<ChipProps, HTMLAnchorElement> = forwardRef((props, ref) => {
export const Chip = forwardRef<ChipProps, HTMLAnchorElement>((props, ref) => {
const defaultTheme = useTheme() || Theme.light;
const {
after,
Expand Down Expand Up @@ -144,9 +145,7 @@ export const Chip: Comp<ChipProps, HTMLAnchorElement> = forwardRef((props, ref)
{before}
</div>
)}

<div className={`${CLASSNAME}__label`}>{children}</div>

{after && (
// eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
<div
Expand Down
9 changes: 5 additions & 4 deletions packages/lumx-react/src/components/chip/ChipGroup.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { HorizontalAlignment } from '@lumx/react/components';
import React, { forwardRef, ReactNode } from 'react';
import React, { ReactNode } from 'react';

import classNames from 'classnames';

import { Comp, GenericProps } from '@lumx/react/utils/type';
import { HorizontalAlignment } from '@lumx/react/components';
import { GenericProps } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

import { useChipGroupNavigation } from '@lumx/react/hooks/useChipGroupNavigation';

Expand Down Expand Up @@ -43,7 +44,7 @@ const CLASSNAME = getRootClassName(COMPONENT_NAME);
* @param ref Component ref.
* @return React element.
*/
const InternalChipGroup: Comp<ChipGroupProps, HTMLDivElement> = forwardRef((props, ref) => {
const InternalChipGroup = forwardRef<ChipGroupProps, HTMLDivElement>((props, ref) => {
const { align, children, className, ...forwardedProps } = props;
const chipGroupClassName = handleBasicClasses({
prefix: CLASSNAME,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import React, { Children, forwardRef, ReactNode } from 'react';
import React, { Children, ReactNode } from 'react';

import classNames from 'classnames';

import { Avatar, Size, Theme, Tooltip } from '@lumx/react';
import { Comp, GenericProps, HasTheme, ValueOf } from '@lumx/react/utils/type';
import { GenericProps, HasTheme, ValueOf } from '@lumx/react/utils/type';
import { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

import { useTheme } from '@lumx/react/utils/theme/ThemeContext';
import { AvatarProps } from '../avatar/Avatar';
Expand Down Expand Up @@ -87,7 +88,7 @@ const DEFAULT_PROPS: Partial<CommentBlockProps> = {
* @param ref Component ref.
* @return React element.
*/
export const CommentBlock: Comp<CommentBlockProps, HTMLDivElement> = forwardRef((props, ref) => {
export const CommentBlock = forwardRef<CommentBlockProps, HTMLDivElement>((props, ref) => {
const defaultTheme = useTheme() || Theme.light;
const {
actions,
Expand Down Expand Up @@ -162,7 +163,6 @@ export const CommentBlock: Comp<CommentBlockProps, HTMLDivElement> = forwardRef(
{hasActions && <div className={`${CLASSNAME}__actions`}>{actions}</div>}
</div>
</div>

{hasChildren && isOpen && <div className={`${CLASSNAME}__children`}>{children}</div>}
</div>
);
Expand Down
8 changes: 5 additions & 3 deletions packages/lumx-react/src/components/date-picker/DatePicker.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import React, { forwardRef, useState } from 'react';
import { Comp } from '@lumx/react/utils/type';
import React, { useState } from 'react';

import { addMonthResetDay } from '@lumx/react/utils/date/addMonthResetDay';
import { isDateValid } from '@lumx/react/utils/date/isDateValid';
import { forwardRef } from '@lumx/react/utils/react/forwardRef';

import { CLASSNAME, COMPONENT_NAME } from './constants';
import { DatePickerControlled } from './DatePickerControlled';
import { DatePickerProps } from './types';
Expand All @@ -13,7 +15,7 @@ import { DatePickerProps } from './types';
* @param ref Component ref.
* @return React element.
*/
export const DatePicker: Comp<DatePickerProps, HTMLDivElement> = forwardRef((props, ref) => {
export const DatePicker = forwardRef<DatePickerProps, HTMLDivElement>((props, ref) => {
const { defaultMonth, locale, value, onChange, ...forwardedProps } = props;

let referenceDate = value || defaultMonth || new Date();
Expand Down
Loading

0 comments on commit 2b6f4d9

Please sign in to comment.