mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-06 00:07:44 +01:00
3acb3ad2c2
**Upgrade to React v18 for Unleash v6. Here's why I think it's a good time to do it:** - Command Bar project: We've begun work on the command bar project, and there's a fantastic library we want to use. However, it requires React v18 support. - Straightforward Upgrade: I took a look at the upgrade guide https://react.dev/blog/2022/03/08/react-18-upgrade-guide and it seems fairly straightforward. In fact, I was able to get React v18 running with minimal changes in just 10 minutes! - Dropping IE Support: React v18 no longer supports Internet Explorer (IE), which is no longer supported by Microsoft as of June 15, 2022. Upgrading to v18 in v6 would be a good way to align with this change. TS updates: * FC children has to be explicit: https://stackoverflow.com/questions/71788254/react-18-typescript-children-fc * forcing version 18 types in resolutions: https://sentry.io/answers/type-is-not-assignable-to-type-reactnode/ Test updates: * fixing SWR issue that we have always had but it manifests more in new React (https://github.com/vercel/swr/issues/2373) --------- Co-authored-by: kwasniew <kwasniewski.mateusz@gmail.com>
73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
import type React from 'react';
|
|
import { useMediaQuery } from '@mui/material';
|
|
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
|
|
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
|
|
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
|
|
import type { ITooltipResolverProps } from '../TooltipResolver/TooltipResolver';
|
|
|
|
interface IResponsiveButtonProps {
|
|
Icon: React.ElementType;
|
|
endIcon?: React.ReactNode;
|
|
tooltipProps?: Omit<ITooltipResolverProps, 'children'>;
|
|
onClick: () => void;
|
|
disabled?: boolean;
|
|
permission: string | string[];
|
|
projectId?: string;
|
|
environmentId?: string;
|
|
maxWidth: string;
|
|
className?: string;
|
|
children?: React.ReactNode;
|
|
}
|
|
|
|
const ResponsiveButton: React.FC<IResponsiveButtonProps> = ({
|
|
Icon,
|
|
onClick,
|
|
maxWidth,
|
|
disabled = false,
|
|
children,
|
|
permission,
|
|
environmentId,
|
|
projectId,
|
|
endIcon,
|
|
...rest
|
|
}) => {
|
|
const smallScreen = useMediaQuery(`(max-width:${maxWidth})`);
|
|
|
|
return (
|
|
<ConditionallyRender
|
|
condition={smallScreen}
|
|
show={
|
|
<PermissionIconButton
|
|
disabled={disabled}
|
|
onClick={onClick}
|
|
permission={permission}
|
|
projectId={projectId}
|
|
environmentId={environmentId}
|
|
data-loading
|
|
{...rest}
|
|
>
|
|
<Icon />
|
|
</PermissionIconButton>
|
|
}
|
|
elseShow={
|
|
<PermissionButton
|
|
onClick={onClick}
|
|
permission={permission}
|
|
projectId={projectId}
|
|
color='primary'
|
|
variant='contained'
|
|
disabled={disabled}
|
|
environmentId={environmentId}
|
|
endIcon={endIcon}
|
|
data-loading
|
|
{...rest}
|
|
>
|
|
{children}
|
|
</PermissionButton>
|
|
}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default ResponsiveButton;
|