diff --git a/.eslintrc.json b/.eslintrc.json index b9bf5f25..05e40400 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,6 +9,7 @@ "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react/recommended", + "plugin:react/jsx-runtime", "plugin:react-hooks/recommended" ], "parser": "@typescript-eslint/parser", diff --git a/packages/dev/src/App.test.tsx b/packages/dev/src/App.test.tsx index f07c5302..f6d59f5d 100755 --- a/packages/dev/src/App.test.tsx +++ b/packages/dev/src/App.test.tsx @@ -1,9 +1,9 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; import App from './AppContext'; it('renders without crashing', () => { const div = document.createElement('div'); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); + const root = createRoot(div); + root.render(); + root.unmount(); }); diff --git a/packages/dev/src/DefaultCatalog.tsx b/packages/dev/src/DefaultCatalog.tsx index 9af526b5..c4ce5cdf 100644 --- a/packages/dev/src/DefaultCatalog.tsx +++ b/packages/dev/src/DefaultCatalog.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { QuickStartCatalogPage, QuickStart } from '@patternfly/quickstarts'; export const DefaultCatalog = ({ hint }: { hint?: string }) => { diff --git a/packages/dev/src/FormInput.tsx b/packages/dev/src/FormInput.tsx index c2c4dcd5..f432dea8 100644 --- a/packages/dev/src/FormInput.tsx +++ b/packages/dev/src/FormInput.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Form, FormGroup, TextInput } from '@patternfly/react-core'; export const FormInput = ({ diff --git a/packages/dev/src/index.tsx b/packages/dev/src/index.tsx index 8b6c8468..19869ff5 100755 --- a/packages/dev/src/index.tsx +++ b/packages/dev/src/index.tsx @@ -1,4 +1,3 @@ -import * as React from 'react'; import { createRoot } from 'react-dom/client'; import { Route, BrowserRouter, Routes } from 'react-router-dom'; diff --git a/packages/dev/src/quickstarts-data/json/monitor-sampleapp-quickstart.tsx b/packages/dev/src/quickstarts-data/json/monitor-sampleapp-quickstart.tsx index bfc80646..521bb25f 100644 --- a/packages/dev/src/quickstarts-data/json/monitor-sampleapp-quickstart.tsx +++ b/packages/dev/src/quickstarts-data/json/monitor-sampleapp-quickstart.tsx @@ -1,4 +1,3 @@ -import * as React from 'react'; import { QuickStart } from '@patternfly/quickstarts'; import GithubIcon from '@patternfly/react-icons/dist/js/icons/github-icon'; diff --git a/packages/dev/tsconfig.json b/packages/dev/tsconfig.json index 3de8c720..0e44125d 100644 --- a/packages/dev/tsconfig.json +++ b/packages/dev/tsconfig.json @@ -13,7 +13,7 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react", + "jsx": "react-jsx", "strict": true, "strictPropertyInitialization": false, "strictNullChecks": false, diff --git a/packages/module/package.json b/packages/module/package.json index 15caf649..1c71969e 100644 --- a/packages/module/package.json +++ b/packages/module/package.json @@ -46,8 +46,8 @@ }, "peerDependencies": { "@patternfly/react-core": "^6.0.0", - "react": "^17 || ^18", - "react-dom": "^17 || ^18", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19", "marked": "^15.0.6" }, "dependencies": { @@ -88,7 +88,6 @@ "react-axe": "^3.5.4", "react-docgen-typescript-loader": "^3.7.2", "react-dom": "^18.2.0", - "react-monaco-editor": "0.51.0", "regenerator-runtime": "^0.13.7", "rimraf": "^3.0.2", "rollup": "^2.79.2", diff --git a/packages/module/patternfly-docs/pages/index.js b/packages/module/patternfly-docs/pages/index.js index e5985bbb..c401ff52 100644 --- a/packages/module/patternfly-docs/pages/index.js +++ b/packages/module/patternfly-docs/pages/index.js @@ -1,4 +1,3 @@ -import React from 'react'; import { Title, PageSection } from '@patternfly/react-core'; const centerStyle = { diff --git a/packages/module/src/ConsoleInternal/components/markdown-view.tsx b/packages/module/src/ConsoleInternal/components/markdown-view.tsx index f4fe5db8..c3fa0eb1 100644 --- a/packages/module/src/ConsoleInternal/components/markdown-view.tsx +++ b/packages/module/src/ConsoleInternal/components/markdown-view.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import { css } from '@patternfly/react-styles'; import { marked } from 'marked'; import { useForceRender } from '@console/shared'; @@ -121,7 +121,7 @@ type InnerSyncMarkdownProps = Pick = ({ +export const SyncMarkdownView: FC = ({ content, emptyMsg, extensions, @@ -130,10 +130,10 @@ export const SyncMarkdownView: React.FC = ({ inline, className, }) => { - const { getResource } = React.useContext(QuickStartContext); - const [markup, setMarkup] = React.useState(''); + const { getResource } = useContext(QuickStartContext); + const [markup, setMarkup] = useState(''); - React.useEffect(() => { + useEffect(() => { async function getMd() { const md = await markdownConvert( content || emptyMsg || getResource('Not available'), @@ -176,8 +176,8 @@ const RenderExtension: React.FC = ({ docContext, }) => { const forceRender = useForceRender(); - const markupRef = React.useRef(null); - const shouldRenderExtension = React.useCallback(() => { + const markupRef = useRef(null); + const shouldRenderExtension = useCallback(() => { if (markupRef.current === markup) { return true; } @@ -190,7 +190,7 @@ const RenderExtension: React.FC = ({ * which causes the component rendered by renderExtension to receive old copy of document * use forceRender to delay the rendering of extension by one render cycle */ - React.useEffect(() => { + useEffect(() => { if (renderExtension) { forceRender(); } @@ -201,13 +201,13 @@ const RenderExtension: React.FC = ({ ); }; -const InlineMarkdownView: React.FC = ({ +const InlineMarkdownView: FC = ({ markup, isEmpty, renderExtension, className, }) => { - const id = React.useMemo(() => uniqueId('markdown'), []); + const id = useMemo(() => uniqueId('markdown'), []); return (
@@ -218,18 +218,18 @@ const InlineMarkdownView: React.FC = ({ ); }; -const IFrameMarkdownView: React.FC = ({ +const IFrameMarkdownView: FC = ({ exactHeight, markup, isEmpty, renderExtension, className, }) => { - const [frame, setFrame] = React.useState(); - const [loaded, setLoaded] = React.useState(false); - const updateTimeoutHandle = React.useRef(); + const [frame, setFrame] = useState(); + const [loaded, setLoaded] = useState(false); + const updateTimeoutHandle = useRef(null); - const updateDimensions = React.useCallback(() => { + const updateDimensions = useCallback(() => { if (!frame?.contentWindow?.document.body.firstChild) { return; } @@ -248,14 +248,14 @@ const IFrameMarkdownView: React.FC = ({ }); }, [frame, exactHeight]); - React.useEffect( + useEffect( () => () => { clearTimeout(updateTimeoutHandle.current); }, [], ); - const onLoad = React.useCallback(() => { + const onLoad = useCallback(() => { updateDimensions(); setLoaded(true); }, [updateDimensions]); @@ -302,7 +302,9 @@ const IFrameMarkdownView: React.FC = ({ sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin" srcDoc={contents} style={{ border: '0px', display: 'block', width: '100%', height: '0' }} - ref={(r) => setFrame(r)} + ref={(r) => { + setFrame(r); + }} onLoad={() => onLoad()} className={className} /> diff --git a/packages/module/src/ConsoleInternal/components/utils/camel-case-wrap.tsx b/packages/module/src/ConsoleInternal/components/utils/camel-case-wrap.tsx index bc9fee4d..422004e5 100644 --- a/packages/module/src/ConsoleInternal/components/utils/camel-case-wrap.tsx +++ b/packages/module/src/ConsoleInternal/components/utils/camel-case-wrap.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { Fragment } from 'react'; const MEMO = {}; @@ -16,10 +16,10 @@ export const CamelCaseWrap: React.FC = ({ value, dataTest }) const rendered = ( {words.map((word, i) => ( - + {word} {i !== words.length - 1 && } - + ))} ); diff --git a/packages/module/src/ConsoleInternal/components/utils/status-box.tsx b/packages/module/src/ConsoleInternal/components/utils/status-box.tsx index 936044cb..a90c5eb1 100644 --- a/packages/module/src/ConsoleInternal/components/utils/status-box.tsx +++ b/packages/module/src/ConsoleInternal/components/utils/status-box.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useContext } from 'react'; import { css } from '@patternfly/react-styles'; import { QuickStartContext, QuickStartContextValues } from '../../../utils/quick-start-context'; @@ -6,7 +6,7 @@ export const Box: React.FC = ({ children, className }) => (
{children}
); -export const Loading: React.FC = ({ className }) => ( +export const Loading: FC = ({ className }) => (
@@ -15,7 +15,7 @@ export const Loading: React.FC = ({ className }) => ( ); Loading.displayName = 'Loading'; -export const LoadingBox: React.FC = ({ className, message }) => ( +export const LoadingBox: FC = ({ className, message }) => ( {message &&
{message}
} @@ -24,7 +24,7 @@ export const LoadingBox: React.FC = ({ className, message }) => LoadingBox.displayName = 'LoadingBox'; export const EmptyBox: React.FC = ({ label }) => { - const { getResource } = React.useContext(QuickStartContext); + const { getResource } = useContext(QuickStartContext); return (
diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx index 2440b57c..56533fc9 100644 --- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx +++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useCallback, useContext, useMemo, useState } from 'react'; import { Tooltip } from '@patternfly/react-core'; import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context'; import { useEventListener } from '../../hooks'; @@ -10,14 +10,10 @@ interface CopyClipboardProps { docContext: Document; } -export const CopyClipboard: React.FC = ({ - element, - rootSelector, - docContext, -}) => { - const { getResource } = React.useContext(QuickStartContext); - const [showSuccessContent, setShowSuccessContent] = React.useState(false); - const textToCopy = React.useMemo(() => { +export const CopyClipboard: FC = ({ element, rootSelector, docContext }) => { + const { getResource } = useContext(QuickStartContext); + const [showSuccessContent, setShowSuccessContent] = useState(false); + const textToCopy = useMemo(() => { const copyTextId = element.getAttribute(MARKDOWN_COPY_BUTTON_ID); return ( docContext.querySelector( @@ -29,7 +25,7 @@ export const CopyClipboard: React.FC = ({ useEventListener( element, 'click', - React.useCallback(() => { + useCallback(() => { navigator.clipboard .writeText(textToCopy.trim()) .then(() => { @@ -42,7 +38,7 @@ export const CopyClipboard: React.FC = ({ useEventListener( element, 'mouseleave', - React.useCallback(() => { + useCallback(() => { setShowSuccessContent(false); }, []), ); @@ -70,10 +66,7 @@ interface MarkdownCopyClipboardProps { rootSelector: string; } -const MarkdownCopyClipboard: React.FC = ({ - docContext, - rootSelector, -}) => { +const MarkdownCopyClipboard: FC = ({ docContext, rootSelector }) => { const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`); return elements.length > 0 ? ( <> diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/__tests__/MarkdownCopyClipboard.spec.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/__tests__/MarkdownCopyClipboard.spec.tsx index 74d5c7ea..f727f517 100644 --- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/__tests__/MarkdownCopyClipboard.spec.tsx +++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/__tests__/MarkdownCopyClipboard.spec.tsx @@ -1,4 +1,3 @@ -import * as React from 'react'; import { shallow } from 'enzyme'; import MarkdownCopyClipboard, { CopyClipboard } from '../MarkdownCopyClipboard'; import { htmlDocumentForCopyClipboard } from './test-data'; diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-extension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-extension.tsx index a3300f55..798e510e 100644 --- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-extension.tsx +++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-extension.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { useMemo } from 'react'; import { Accordion, AccordionItem, @@ -10,7 +10,7 @@ import { removeTemplateWhitespace } from './utils'; import { ACCORDION_MARKDOWN_BUTTON_ID, ACCORDION_MARKDOWN_CONTENT_ID } from './const'; const useAccordionShowdownExtension = () => - React.useMemo( + useMemo( () => ({ type: 'lang', regex: /\[(.+)]{{(accordion) ("(.*?)")}}/g, diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.tsx index 245d8524..c0d568fe 100644 --- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.tsx +++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useState } from 'react'; import { useEventListener } from '../../hooks'; import { ACCORDION_MARKDOWN_BUTTON_ID, ACCORDION_MARKDOWN_CONTENT_ID } from './const'; @@ -7,11 +7,11 @@ interface AccordionShowdownComponentProps { contentElement: HTMLElement; } -const AccordionShowdownHandler: React.FC = ({ +const AccordionShowdownHandler: FC = ({ buttonElement, contentElement, }) => { - const [expanded, setExpanded] = React.useState(false); + const [expanded, setExpanded] = useState(false); const handleClick = () => { const expandedModifier = 'pf-m-expanded'; @@ -33,7 +33,7 @@ interface accordionRenderExtensionProps { docContext: Document; } -const AccordionRenderExtension: React.FC = ({ docContext }) => { +const AccordionRenderExtension: FC = ({ docContext }) => { const buttonElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_BUTTON_ID}]`); const contentElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_CONTENT_ID}]`); diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/admonition-extension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/admonition-extension.tsx index 4f3a2da1..f628533e 100644 --- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/admonition-extension.tsx +++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/admonition-extension.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { useMemo } from 'react'; import { removeTemplateWhitespace } from './utils'; import { renderToStaticMarkup } from 'react-dom/server'; import { Alert } from '@patternfly/react-core'; @@ -24,7 +24,7 @@ const admonitionToAlertVariantMap = { const useAdmonitionShowdownExtension = () => // const { getResource } = React.useContext(QuickStartContext); - React.useMemo( + useMemo( () => ({ type: 'lang', regex: /\[(.+)]{{(admonition) ([\w-]+)}}/g, diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/code-extension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/code-extension.tsx index 265487c5..cc17fa27 100644 --- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/code-extension.tsx +++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/code-extension.tsx @@ -1,10 +1,10 @@ -import * as React from 'react'; +import { useMemo } from 'react'; import { removeTemplateWhitespace } from './utils'; import { renderToStaticMarkup } from 'react-dom/server'; import { CodeBlock } from '@patternfly/react-core'; const useCodeShowdownExtension = () => - React.useMemo( + useMemo( () => ({ type: 'output', regex: /
(.*?)\n?<\/code><\/pre>/g,
diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.tsx
index 4c4bef8a..067f3547 100644
--- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.tsx
+++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { useContext, useMemo } from 'react';
 import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context';
 import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';
 import { removeTemplateWhitespace } from './utils';
@@ -6,8 +6,8 @@ import { renderToStaticMarkup } from 'react-dom/server';
 import CopyIcon from '@patternfly/react-icons/dist/js/icons/copy-icon';
 
 const useInlineCopyClipboardShowdownExtension = () => {
-  const { getResource } = React.useContext(QuickStartContext);
-  return React.useMemo(
+  const { getResource } = useContext(QuickStartContext);
+  return useMemo(
     () => ({
       type: 'lang',
       regex: /`([^`](.*?)[^`])`{{copy}}/g,
diff --git a/packages/module/src/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.tsx
index 225af115..fbbfe3a0 100644
--- a/packages/module/src/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.tsx
+++ b/packages/module/src/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.tsx
@@ -1,13 +1,13 @@
 /* eslint-disable max-len */
-import * as React from 'react';
+import { useContext, useMemo } from 'react';
 import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context';
 import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';
 import { renderToStaticMarkup } from 'react-dom/server';
 import CopyIcon from '@patternfly/react-icons/dist/js/icons/copy-icon';
 
 const useMultilineCopyClipboardShowdownExtension = () => {
-  const { getResource } = React.useContext(QuickStartContext);
-  return React.useMemo(
+  const { getResource } = useContext(QuickStartContext);
+  return useMemo(
     () => ({
       type: 'lang',
       regex: /```[\n]\s*((((?!```).)*?\n)+)\s*```{{copy}}/g,
diff --git a/packages/module/src/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.tsx b/packages/module/src/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.tsx
index e998a8a3..f788f460 100644
--- a/packages/module/src/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.tsx
+++ b/packages/module/src/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.tsx
@@ -1,16 +1,16 @@
-import * as React from 'react';
+import { FC, useEffect, useState } from 'react';
 import { Spotlight } from '../spotlight';
 
 interface MarkdownHighlightExtensionProps {
   docContext: Document;
   rootSelector: string;
 }
-const MarkdownHighlightExtension: React.FC = ({
+const MarkdownHighlightExtension: FC = ({
   docContext,
   rootSelector,
 }) => {
-  const [selector, setSelector] = React.useState(null);
-  React.useEffect(() => {
+  const [selector, setSelector] = useState(null);
+  useEffect(() => {
     const elements = docContext.querySelectorAll(`${rootSelector} [data-highlight]`);
     let timeoutId: NodeJS.Timeout;
     function startHighlight(e) {
@@ -29,7 +29,7 @@ const MarkdownHighlightExtension: React.FC = ({
       elements && elements.forEach((elm) => elm.removeEventListener('click', startHighlight));
     };
   }, [docContext, rootSelector]);
-  React.useEffect(() => {
+  useEffect(() => {
     const elements = docContext.querySelectorAll(`${rootSelector} [class^=data-highlight__]`);
     let timeoutId: NodeJS.Timeout;
     function startHighlight(e) {
diff --git a/packages/module/src/ConsoleShared/src/components/modal/Modal.tsx b/packages/module/src/ConsoleShared/src/components/modal/Modal.tsx
index ffe3f77c..b1ae3fdc 100644
--- a/packages/module/src/ConsoleShared/src/components/modal/Modal.tsx
+++ b/packages/module/src/ConsoleShared/src/components/modal/Modal.tsx
@@ -1,13 +1,13 @@
-import * as React from 'react';
+import { FC, Ref } from 'react';
 import { Modal as PfModal, ModalProps as PfModalProps } from '@patternfly/react-core/deprecated';
 import { css } from '@patternfly/react-styles';
 
 type ModalProps = {
   isFullScreen?: boolean;
-  ref?: React.LegacyRef;
+  ref?: Ref;
 } & PfModalProps;
 
-const Modal: React.FC = ({ isFullScreen = false, className, ...props }) => (
+const Modal: FC = ({ isFullScreen = false, className, ...props }) => (
    Element);
 
 interface PortalProps {
-  children: React.ReactNode;
+  children: ReactNode;
   container?: GetContainer;
 }
 
@@ -13,13 +13,13 @@ const getContainer = (container: GetContainer): Element | null | undefined =>
   typeof container === 'function' ? container() : container;
 
 const Portal = ({ children, container }: PortalProps) => {
-  const [containerNode, setContainerNode] = React.useState();
+  const [containerNode, setContainerNode] = useState();
 
   useIsomorphicLayoutEffect(() => {
     setContainerNode(getContainer(container) || document.body);
   }, [container]);
 
-  return containerNode ? ReactDOM.createPortal(children, containerNode) : null;
+  return containerNode ? createPortal(children, containerNode) : null;
 };
 
 export default Portal;
diff --git a/packages/module/src/ConsoleShared/src/components/popper/SimplePopper.tsx b/packages/module/src/ConsoleShared/src/components/popper/SimplePopper.tsx
index caa27996..a43090d3 100644
--- a/packages/module/src/ConsoleShared/src/components/popper/SimplePopper.tsx
+++ b/packages/module/src/ConsoleShared/src/components/popper/SimplePopper.tsx
@@ -1,25 +1,25 @@
-import * as React from 'react';
+import { ReactNode, useCallback, useEffect, useRef, useState } from 'react';
 import Portal from './Portal';
 
 interface SimplePopperProps {
-  children: React.ReactNode;
+  children: ReactNode;
 }
 
 const SimplePopper = ({ children }: SimplePopperProps) => {
   const openProp = true;
-  const nodeRef = React.useRef();
-  const popperRef = React.useRef(null);
-  const [isOpen, setOpenState] = React.useState(openProp);
+  const nodeRef = useRef(null);
+  const popperRef = useRef(null);
+  const [isOpen, setOpenState] = useState(openProp);
 
-  const setOpen = React.useCallback((newOpen: boolean) => {
+  const setOpen = useCallback((newOpen: boolean) => {
     setOpenState(newOpen);
   }, []);
 
-  React.useEffect(() => {
+  useEffect(() => {
     setOpen(openProp);
   }, [openProp, setOpen]);
 
-  const onKeyDown = React.useCallback(
+  const onKeyDown = useCallback(
     (e: KeyboardEvent) => {
       if (e.keyCode === 27) {
         setOpen(false);
@@ -28,7 +28,7 @@ const SimplePopper = ({ children }: SimplePopperProps) => {
     [setOpen],
   );
 
-  const onClickOutside = React.useCallback(
+  const onClickOutside = useCallback(
     (e: MouseEvent) => {
       if (!nodeRef.current || (e.target instanceof Node && !nodeRef.current.contains(e.target))) {
         setOpen(false);
@@ -37,7 +37,7 @@ const SimplePopper = ({ children }: SimplePopperProps) => {
     [setOpen],
   );
 
-  const destroy = React.useCallback(() => {
+  const destroy = useCallback(() => {
     if (popperRef.current) {
       popperRef.current.destroy();
       document.removeEventListener('keydown', onKeyDown, true);
@@ -46,7 +46,7 @@ const SimplePopper = ({ children }: SimplePopperProps) => {
     }
   }, [onClickOutside, onKeyDown]);
 
-  const initialize = React.useCallback(() => {
+  const initialize = useCallback(() => {
     if (!nodeRef.current || !isOpen) {
       return;
     }
@@ -54,7 +54,7 @@ const SimplePopper = ({ children }: SimplePopperProps) => {
     destroy();
   }, [isOpen, destroy]);
 
-  const nodeRefCallback = React.useCallback(
+  const nodeRefCallback = useCallback(
     (node) => {
       nodeRef.current = node;
       initialize();
@@ -62,18 +62,18 @@ const SimplePopper = ({ children }: SimplePopperProps) => {
     [initialize],
   );
 
-  React.useEffect(() => {
+  useEffect(() => {
     initialize();
   }, [initialize]);
 
-  React.useEffect(
+  useEffect(
     () => () => {
       destroy();
     },
     [destroy],
   );
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (!isOpen) {
       destroy();
     }
diff --git a/packages/module/src/ConsoleShared/src/components/spotlight/InteractiveSpotlight.tsx b/packages/module/src/ConsoleShared/src/components/spotlight/InteractiveSpotlight.tsx
index 79cdd4a7..1a18aeb1 100644
--- a/packages/module/src/ConsoleShared/src/components/spotlight/InteractiveSpotlight.tsx
+++ b/packages/module/src/ConsoleShared/src/components/spotlight/InteractiveSpotlight.tsx
@@ -1,5 +1,5 @@
 import './spotlight.scss';
-import * as React from 'react';
+import { CSSProperties, FC, useEffect, useState } from 'react';
 import { Portal, SimplePopper } from '../popper';
 
 interface InteractiveSpotlightProps {
@@ -16,9 +16,9 @@ const isInViewport = (elementToCheck: Element) => {
   );
 };
 
-const InteractiveSpotlight: React.FC = ({ element }) => {
+const InteractiveSpotlight: FC = ({ element }) => {
   const { top, bottom, left, right, height, width } = element.getBoundingClientRect();
-  const style: React.CSSProperties = {
+  const style: CSSProperties = {
     height,
     width,
     top,
@@ -26,9 +26,9 @@ const InteractiveSpotlight: React.FC = ({ element })
     bottom,
     right,
   };
-  const [clicked, setClicked] = React.useState(false);
+  const [clicked, setClicked] = useState(false);
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (!clicked) {
       if (!isInViewport(element)) {
         element.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
diff --git a/packages/module/src/ConsoleShared/src/components/spotlight/Spotlight.tsx b/packages/module/src/ConsoleShared/src/components/spotlight/Spotlight.tsx
index 9e8b80f4..330193bd 100644
--- a/packages/module/src/ConsoleShared/src/components/spotlight/Spotlight.tsx
+++ b/packages/module/src/ConsoleShared/src/components/spotlight/Spotlight.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useMemo } from 'react';
 import InteractiveSpotlight from './InteractiveSpotlight';
 import StaticSpotlight from './StaticSpotlight';
 
@@ -7,9 +7,9 @@ interface SpotlightProps {
   interactive?: boolean;
 }
 
-const Spotlight: React.FC = ({ selector, interactive }) => {
+const Spotlight: FC = ({ selector, interactive }) => {
   // if target element is a hidden one return null
-  const element = React.useMemo(() => {
+  const element = useMemo(() => {
     const highlightElement = document.querySelector(selector);
     let hiddenElement = highlightElement;
     while (hiddenElement) {
diff --git a/packages/module/src/ConsoleShared/src/components/spotlight/StaticSpotlight.tsx b/packages/module/src/ConsoleShared/src/components/spotlight/StaticSpotlight.tsx
index 86ffdaec..7dd143b4 100644
--- a/packages/module/src/ConsoleShared/src/components/spotlight/StaticSpotlight.tsx
+++ b/packages/module/src/ConsoleShared/src/components/spotlight/StaticSpotlight.tsx
@@ -1,5 +1,5 @@
 import './spotlight.scss';
-import * as React from 'react';
+import { CSSProperties, FC } from 'react';
 import { useBoundingClientRect } from '../../hooks';
 import Portal from '../popper/Portal';
 
@@ -7,9 +7,9 @@ interface StaticSpotlightProps {
   element: Element;
 }
 
-const StaticSpotlight: React.FC = ({ element }) => {
+const StaticSpotlight: FC = ({ element }) => {
   const clientRect = useBoundingClientRect(element as HTMLElement);
-  const style: React.CSSProperties = clientRect
+  const style: CSSProperties = clientRect
     ? {
         top: clientRect.top,
         left: clientRect.left,
diff --git a/packages/module/src/ConsoleShared/src/components/status/GenericStatus.tsx b/packages/module/src/ConsoleShared/src/components/status/GenericStatus.tsx
index 76d6a66e..21815c0f 100644
--- a/packages/module/src/ConsoleShared/src/components/status/GenericStatus.tsx
+++ b/packages/module/src/ConsoleShared/src/components/status/GenericStatus.tsx
@@ -1,9 +1,9 @@
-import * as React from 'react';
+import { Children, ComponentType, FC, ReactNode } from 'react';
 import PopoverStatus from './PopoverStatus';
 import StatusIconAndText from './StatusIconAndText';
 import { StatusComponentProps } from './types';
 
-const GenericStatus: React.FC = (props) => {
+const GenericStatus: FC = (props) => {
   const { Icon, children, popoverTitle, title, noTooltip, iconOnly, ...restProps } = props;
   const renderIcon = iconOnly && !noTooltip ?  : ;
   const statusBody = (
@@ -15,7 +15,7 @@ const GenericStatus: React.FC = (props) => {
       icon={renderIcon}
     />
   );
-  return React.Children.toArray(children).length ? (
+  return Children.toArray(children).length ? (
     
       {children}
     
@@ -25,8 +25,8 @@ const GenericStatus: React.FC = (props) => {
 };
 
 type GenericStatusProps = StatusComponentProps & {
-  Icon: React.ComponentType<{ title?: string }>;
-  children?: React.ReactNode;
+  Icon: ComponentType<{ title?: string }>;
+  children?: ReactNode;
   popoverTitle?: string;
   noTooltip?: boolean;
 };
diff --git a/packages/module/src/ConsoleShared/src/components/status/NotStartedIcon.tsx b/packages/module/src/ConsoleShared/src/components/status/NotStartedIcon.tsx
index d20d1462..56249c2e 100644
--- a/packages/module/src/ConsoleShared/src/components/status/NotStartedIcon.tsx
+++ b/packages/module/src/ConsoleShared/src/components/status/NotStartedIcon.tsx
@@ -1,6 +1,5 @@
 // TODO: Pull from Patternfly when they add it
 // https://github.com/patternfly/patternfly-design/issues/921#issuecomment-726183814
-import * as React from 'react';
 
 export default (props) => (
    = ({
+const PopoverStatus: FC = ({
   hideHeader,
   children,
   isVisible = null,
@@ -26,8 +26,8 @@ const PopoverStatus: React.FC = ({
 );
 
 interface PopoverStatusProps {
-  children: React.ReactNode;
-  statusBody: React.ReactNode;
+  children: ReactNode;
+  statusBody: ReactNode;
   onHide?: (event: MouseEvent | KeyboardEvent) => void;
   onShow?: (event: MouseEvent | KeyboardEvent) => void;
   title?: string;
diff --git a/packages/module/src/ConsoleShared/src/components/status/Status.tsx b/packages/module/src/ConsoleShared/src/components/status/Status.tsx
index 5e9b08a2..7270999f 100644
--- a/packages/module/src/ConsoleShared/src/components/status/Status.tsx
+++ b/packages/module/src/ConsoleShared/src/components/status/Status.tsx
@@ -1,17 +1,11 @@
-import * as React from 'react';
+import { FC } from 'react';
 import SyncAltIcon from '@patternfly/react-icons/dist/js/icons/sync-alt-icon';
 import { DASH } from '../../constants';
 import { SuccessStatus } from './statuses';
 import StatusIconAndText from './StatusIconAndText';
 import { StatusComponentProps } from './types';
 
-export const Status: React.FC = ({
-  status,
-  title,
-  iconOnly,
-  noTooltip,
-  className,
-}) => {
+export const Status: FC = ({ status, title, iconOnly, noTooltip, className }) => {
   const statusProps = { title: title || status, iconOnly, noTooltip, className };
   switch (status) {
     case 'In Progress':
@@ -25,9 +19,7 @@ export const Status: React.FC = ({
   }
 };
 
-export const StatusIcon: React.FC = ({ status }) => (
-  
-);
+export const StatusIcon: FC = ({ status }) => ;
 
 interface StatusIconProps {
   status: string;
diff --git a/packages/module/src/ConsoleShared/src/components/status/StatusIconAndText.tsx b/packages/module/src/ConsoleShared/src/components/status/StatusIconAndText.tsx
index 9d80eda7..70df4701 100644
--- a/packages/module/src/ConsoleShared/src/components/status/StatusIconAndText.tsx
+++ b/packages/module/src/ConsoleShared/src/components/status/StatusIconAndText.tsx
@@ -1,15 +1,15 @@
-import * as React from 'react';
+import { cloneElement, FC, ReactElement } from 'react';
 import { css } from '@patternfly/react-styles';
 import { CamelCaseWrap } from '@console/internal/components/utils';
 import { DASH } from '../../constants';
 import { StatusComponentProps } from './types';
 
 type StatusIconAndTextProps = StatusComponentProps & {
-  icon?: React.ReactElement;
+  icon?: ReactElement;
   spin?: boolean;
 };
 
-const StatusIconAndText: React.FC = ({
+const StatusIconAndText: FC = ({
   icon,
   title,
   spin,
@@ -27,13 +27,13 @@ const StatusIconAndText: React.FC = ({
       title={iconOnly && !noTooltip ? title : undefined}
     >
       {icon &&
-        React.cloneElement(icon, {
+        cloneElement(icon, {
           className: css(
             spin && 'fa-spin',
-            icon.props.className,
+            (icon.props as any).className,
             !iconOnly && 'pfext-icon-and-text__icon pfext-icon-flex-child',
           ),
-        })}
+        } as any)}
       {!iconOnly && }
     
   );
diff --git a/packages/module/src/ConsoleShared/src/components/status/icons.tsx b/packages/module/src/ConsoleShared/src/components/status/icons.tsx
index 8b0450e8..237e2af0 100644
--- a/packages/module/src/ConsoleShared/src/components/status/icons.tsx
+++ b/packages/module/src/ConsoleShared/src/components/status/icons.tsx
@@ -1,26 +1,22 @@
-import * as React from 'react';
+import { FC } from 'react';
 import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
 import ExclamationCircleIcon from '@patternfly/react-icons/dist/js/icons/exclamation-circle-icon';
 import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
 import { Icon } from '@patternfly/react-core';
 
-export const GreenCheckCircleIcon: React.FC = ({ className, title, size }) => (
+export const GreenCheckCircleIcon: FC = ({ className, title, size }) => (
   
     
   
 );
 
-export const RedExclamationCircleIcon: React.FC = ({
-  className,
-  title,
-  size,
-}) => (
+export const RedExclamationCircleIcon: FC = ({ className, title, size }) => (
   
     
   
 );
 
-export const BlueInfoCircleIcon: React.FC = ({ className, title }) => (
+export const BlueInfoCircleIcon: FC = ({ className, title }) => (
   
     
   
diff --git a/packages/module/src/ConsoleShared/src/components/status/statuses.tsx b/packages/module/src/ConsoleShared/src/components/status/statuses.tsx
index 72b08761..c03cdf55 100644
--- a/packages/module/src/ConsoleShared/src/components/status/statuses.tsx
+++ b/packages/module/src/ConsoleShared/src/components/status/statuses.tsx
@@ -1,20 +1,19 @@
-import * as React from 'react';
-
+import { FC } from 'react';
 import GenericStatus from './GenericStatus';
 import { BlueInfoCircleIcon, GreenCheckCircleIcon, RedExclamationCircleIcon } from './icons';
 import { StatusComponentProps } from './types';
 
-export const ErrorStatus: React.FC = (props) => (
+export const ErrorStatus: FC = (props) => (
   
 );
 ErrorStatus.displayName = 'ErrorStatus';
 
-export const InfoStatus: React.FC = (props) => (
+export const InfoStatus: FC = (props) => (
   
 );
 InfoStatus.displayName = 'InfoStatus';
 
-export const SuccessStatus: React.FC = (props) => (
+export const SuccessStatus: FC = (props) => (
   
 );
 SuccessStatus.displayName = 'SuccessStatus';
diff --git a/packages/module/src/ConsoleShared/src/components/utils/FallbackImg.tsx b/packages/module/src/ConsoleShared/src/components/utils/FallbackImg.tsx
index ca0d1adb..525cfb37 100644
--- a/packages/module/src/ConsoleShared/src/components/utils/FallbackImg.tsx
+++ b/packages/module/src/ConsoleShared/src/components/utils/FallbackImg.tsx
@@ -1,14 +1,14 @@
-import * as React from 'react';
+import { FC, ReactNode, useState } from 'react';
 
 interface FallbackImgProps {
   src: string;
   alt?: string;
   className?: string;
-  fallback?: React.ReactNode;
+  fallback?: ReactNode;
 }
 
-const FallbackImg: React.FC = ({ src, alt, className, fallback }) => {
-  const [isSrcValid, setIsSrcValid] = React.useState(true);
+const FallbackImg: FC = ({ src, alt, className, fallback }) => {
+  const [isSrcValid, setIsSrcValid] = useState(true);
 
   if (src && isSrcValid) {
     return {alt} setIsSrcValid(false)} />;
diff --git a/packages/module/src/ConsoleShared/src/hooks/scroll.ts b/packages/module/src/ConsoleShared/src/hooks/scroll.ts
index 73bfd352..ad7ffe1d 100644
--- a/packages/module/src/ConsoleShared/src/hooks/scroll.ts
+++ b/packages/module/src/ConsoleShared/src/hooks/scroll.ts
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { useCallback, useRef, useState } from 'react';
 
 export enum ScrollDirection {
   scrollingUp = 'scrolling-up',
@@ -27,9 +27,9 @@ export const getScrollDirection = (
 };
 
 export const useScrollDirection = (): [ScrollDirection, (event) => void] => {
-  const scrollPosition = React.useRef(null);
-  const [scrollDirection, setScrollDirection] = React.useState(null);
-  const handleScroll = React.useCallback(
+  const scrollPosition = useRef(null);
+  const [scrollDirection, setScrollDirection] = useState(null);
+  const handleScroll = useCallback(
     (event) => {
       const { scrollHeight, scrollTop, clientHeight } = event.target;
       if (scrollPosition.current !== null) {
diff --git a/packages/module/src/ConsoleShared/src/hooks/useBoundingClientRect.ts b/packages/module/src/ConsoleShared/src/hooks/useBoundingClientRect.ts
index 36e56960..e32a00ea 100644
--- a/packages/module/src/ConsoleShared/src/hooks/useBoundingClientRect.ts
+++ b/packages/module/src/ConsoleShared/src/hooks/useBoundingClientRect.ts
@@ -1,14 +1,14 @@
-import * as React from 'react';
+import { useCallback, useState } from 'react';
 import { useResizeObserver } from './useResizeObserver';
 
 type BoundingClientRect = ClientRect | null;
 
 export const useBoundingClientRect = (targetElement: HTMLElement | null): BoundingClientRect => {
-  const [clientRect, setClientRect] = React.useState(() =>
+  const [clientRect, setClientRect] = useState(() =>
     targetElement ? targetElement.getBoundingClientRect() : null,
   );
 
-  const observerCallback = React.useCallback(() => {
+  const observerCallback = useCallback(() => {
     setClientRect(targetElement ? targetElement.getBoundingClientRect() : null);
   }, [targetElement]);
 
diff --git a/packages/module/src/ConsoleShared/src/hooks/useForceRender.ts b/packages/module/src/ConsoleShared/src/hooks/useForceRender.ts
index 7633a9e9..b292f3cb 100644
--- a/packages/module/src/ConsoleShared/src/hooks/useForceRender.ts
+++ b/packages/module/src/ConsoleShared/src/hooks/useForceRender.ts
@@ -1,6 +1,6 @@
-import * as React from 'react';
+import { useReducer } from 'react';
 
 /**
  * React hook that forces component render.
  */
-export const useForceRender = () => React.useReducer((s: boolean) => !s, false)[1] as VoidFunction;
+export const useForceRender = () => useReducer((s: boolean) => !s, false)[1] as VoidFunction;
diff --git a/packages/module/src/ConsoleShared/src/hooks/useResizeObserver.ts b/packages/module/src/ConsoleShared/src/hooks/useResizeObserver.ts
index 23dc4bd7..c208b426 100644
--- a/packages/module/src/ConsoleShared/src/hooks/useResizeObserver.ts
+++ b/packages/module/src/ConsoleShared/src/hooks/useResizeObserver.ts
@@ -1,15 +1,12 @@
-import * as React from 'react';
+import { useEffect, useMemo } from 'react';
 
 export const useResizeObserver = (
   callback: ResizeObserverCallback,
   targetElement?: HTMLElement | null,
   observerOptions: ResizeObserverOptions = undefined,
 ): void => {
-  const element = React.useMemo(
-    () => targetElement ?? document.querySelector('body'),
-    [targetElement],
-  );
-  React.useEffect(() => {
+  const element = useMemo(() => targetElement ?? document.querySelector('body'), [targetElement]);
+  useEffect(() => {
     const observer = new ResizeObserver(callback);
     observer.observe(element, observerOptions);
     return () => {
diff --git a/packages/module/src/ConsoleShared/src/hooks/useScrollShadows.ts b/packages/module/src/ConsoleShared/src/hooks/useScrollShadows.ts
index 1a0ec361..1c6dc29b 100644
--- a/packages/module/src/ConsoleShared/src/hooks/useScrollShadows.ts
+++ b/packages/module/src/ConsoleShared/src/hooks/useScrollShadows.ts
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { useCallback, useEffect, useState } from 'react';
 import { useResizeObserver } from './useResizeObserver';
 
 export enum Shadows {
@@ -9,8 +9,8 @@ export enum Shadows {
 }
 
 export const useScrollShadows = (node: HTMLElement): Shadows => {
-  const [shadows, setShadows] = React.useState(Shadows.none);
-  const computeShadows = React.useCallback(() => {
+  const [shadows, setShadows] = useState(Shadows.none);
+  const computeShadows = useCallback(() => {
     if (node) {
       const { scrollTop, clientHeight, scrollHeight } = node;
       const top = scrollTop !== 0;
@@ -28,7 +28,7 @@ export const useScrollShadows = (node: HTMLElement): Shadows => {
   }, [node]);
   // recompute when the scroll container changes in size
   useResizeObserver(computeShadows, node);
-  React.useEffect(() => {
+  useEffect(() => {
     if (node) {
       // compute initial shadows
       computeShadows();
diff --git a/packages/module/src/ConsoleShared/src/utils/useCombineRefs.ts b/packages/module/src/ConsoleShared/src/utils/useCombineRefs.ts
index 863cdee5..426a843e 100644
--- a/packages/module/src/ConsoleShared/src/utils/useCombineRefs.ts
+++ b/packages/module/src/ConsoleShared/src/utils/useCombineRefs.ts
@@ -1,14 +1,14 @@
-import * as React from 'react';
+import { MutableRefObject, Ref, useCallback } from 'react';
 
-export const useCombineRefs = (...refs: (React.Ref | undefined)[]) =>
-  React.useCallback(
+export const useCombineRefs = (...refs: (Ref | undefined)[]) =>
+  useCallback(
     (element: RefType | null): void =>
       refs.forEach((ref) => {
         if (ref) {
           if (typeof ref === 'function') {
             ref(element);
           } else {
-            (ref as React.MutableRefObject).current = element;
+            (ref as MutableRefObject).current = element;
           }
         }
       }),
diff --git a/packages/module/src/HelpTopicDrawer.tsx b/packages/module/src/HelpTopicDrawer.tsx
index 17990157..85d4f7ed 100644
--- a/packages/module/src/HelpTopicDrawer.tsx
+++ b/packages/module/src/HelpTopicDrawer.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useContext, useEffect } from 'react';
 import { Drawer, DrawerContent, DrawerContentBody } from '@patternfly/react-core';
 import HelpTopicPanelContent from './HelpTopicPanelContent';
 import {
@@ -33,7 +33,7 @@ export interface HelpTopicContainerProps extends React.HTMLProps
   children?: React.ReactNode;
 }
 
-export const HelpTopicContainer: React.FC = ({
+export const HelpTopicContainer: FC = ({
   helpTopics,
   children,
   resourceBundle,
@@ -54,13 +54,13 @@ export const HelpTopicContainer: React.FC = ({
     ...contextProps,
   });
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (loading !== valuesForHelpTopicContext.loading) {
       valuesForHelpTopicContext.setLoading(loading);
     }
   }, [loading, valuesForHelpTopicContext]);
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (
       helpTopics &&
       JSON.stringify(helpTopics) !== JSON.stringify(valuesForHelpTopicContext.helpTopics)
@@ -81,9 +81,9 @@ export interface HelpTopicDrawerProps extends React.HTMLProps {
   children?: React.ReactNode;
 }
 
-export const HelpTopicDrawer: React.FC = ({ children, ...props }) => {
+export const HelpTopicDrawer: FC = ({ children, ...props }) => {
   const { activeHelpTopic, filteredHelpTopics, setActiveHelpTopicByName } =
-    React.useContext(HelpTopicContext);
+    useContext(HelpTopicContext);
 
   const onClose = () => {
     setActiveHelpTopicByName('');
diff --git a/packages/module/src/HelpTopicPanelContent.tsx b/packages/module/src/HelpTopicPanelContent.tsx
index d75656f9..50e35c4d 100644
--- a/packages/module/src/HelpTopicPanelContent.tsx
+++ b/packages/module/src/HelpTopicPanelContent.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useContext, useState } from 'react';
 import {
   Button,
   Divider,
@@ -30,16 +30,16 @@ interface HelpTopicPanelContentProps {
   onClose: () => void;
 }
 
-const HelpTopicPanelContent: React.FC = ({
+const HelpTopicPanelContent: FC = ({
   activeHelpTopic = null,
   filteredHelpTopics = [],
   isResizable = true,
   onClose,
   ...props
 }) => {
-  const { setActiveHelpTopicByName } = React.useContext(HelpTopicContext);
+  const { setActiveHelpTopicByName } = useContext(HelpTopicContext);
 
-  const [isHelpTopicMenuOpen, setIsHelpTopicMenuOpen] = React.useState(false);
+  const [isHelpTopicMenuOpen, setIsHelpTopicMenuOpen] = useState(false);
 
   const toggleHelpTopicMenu = () => {
     setIsHelpTopicMenuOpen(!isHelpTopicMenuOpen);
diff --git a/packages/module/src/QuickStartCatalogPage.tsx b/packages/module/src/QuickStartCatalogPage.tsx
index 0d866e8b..8ee2c749 100644
--- a/packages/module/src/QuickStartCatalogPage.tsx
+++ b/packages/module/src/QuickStartCatalogPage.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useCallback, useContext, useEffect, useState } from 'react';
 import {
   Button,
   Content,
@@ -28,11 +28,11 @@ export interface QuickStartCatalogPageProps {
 }
 
 export const QuickStartCatalogEmptyState = ({ clearFilters }) => {
-  const { getResource } = React.useContext(QuickStartContext);
+  const { getResource } = useContext(QuickStartContext);
   return (
     {getResource('No results found')}}
     >
       
@@ -52,7 +52,7 @@ export const QuickStartCatalogEmptyState = ({ clearFilters }) => {
   );
 };
 
-export const QuickStartCatalogPage: React.FC = ({
+export const QuickStartCatalogPage: FC = ({
   quickStarts,
   showFilter,
   sortFnc = (q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName),
@@ -60,7 +60,7 @@ export const QuickStartCatalogPage: React.FC = ({
   hint,
   showTitle = true,
 }) => {
-  const sortFncCallback = React.useCallback(sortFnc, [sortFnc]);
+  const sortFncCallback = useCallback(sortFnc, [sortFnc]);
   const {
     allQuickStarts = [],
     setAllQuickStarts,
@@ -69,9 +69,9 @@ export const QuickStartCatalogPage: React.FC = ({
     filter,
     setFilter,
     loading,
-  } = React.useContext(QuickStartContext);
+  } = useContext(QuickStartContext);
 
-  React.useEffect(() => {
+  useEffect(() => {
     // passed through prop, not context
     if (quickStarts && JSON.stringify(quickStarts) !== JSON.stringify(allQuickStarts)) {
       setAllQuickStarts(quickStarts);
@@ -87,8 +87,8 @@ export const QuickStartCatalogPage: React.FC = ({
       ).sort(sortFncCallback)
     : allQuickStarts;
 
-  const [filteredQuickStarts, setFilteredQuickStarts] = React.useState(initialFilteredQuickStarts);
-  React.useEffect(() => {
+  const [filteredQuickStarts, setFilteredQuickStarts] = useState(initialFilteredQuickStarts);
+  useEffect(() => {
     const filteredQs = showFilter
       ? filterQuickStarts(
           allQuickStarts,
diff --git a/packages/module/src/QuickStartCloseModal.tsx b/packages/module/src/QuickStartCloseModal.tsx
index 73499649..c0536097 100644
--- a/packages/module/src/QuickStartCloseModal.tsx
+++ b/packages/module/src/QuickStartCloseModal.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useContext } from 'react';
 import { Button, Flex, FlexItem } from '@patternfly/react-core';
 import { ModalVariant } from '@patternfly/react-core/deprecated';
 import { Modal } from '@console/shared';
@@ -10,12 +10,8 @@ interface QuickStartCloseModalProps {
   onCancel: () => void;
 }
 
-const QuickStartCloseModal: React.FC = ({
-  isOpen,
-  onConfirm,
-  onCancel,
-}) => {
-  const { getResource } = React.useContext(QuickStartContext);
+const QuickStartCloseModal: FC = ({ isOpen, onConfirm, onCancel }) => {
+  const { getResource } = useContext(QuickStartContext);
   return (
      = ({
+export const QuickStartContainer: FC = ({
   quickStarts,
   children,
   activeQuickStartID,
@@ -105,7 +105,7 @@ export const QuickStartContainer: React.FC = ({
     ...contextProps,
   });
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (
       quickStarts &&
       JSON.stringify(quickStarts) !== JSON.stringify(valuesForQuickstartContext.allQuickStarts)
@@ -114,7 +114,7 @@ export const QuickStartContainer: React.FC = ({
     }
   }, [quickStarts, valuesForQuickstartContext]);
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (loading !== valuesForQuickstartContext.loading) {
       valuesForQuickstartContext.setLoading(loading);
     }
diff --git a/packages/module/src/QuickStartController.tsx b/packages/module/src/QuickStartController.tsx
index 48c44c04..3bea2d9d 100644
--- a/packages/module/src/QuickStartController.tsx
+++ b/packages/module/src/QuickStartController.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useCallback, useContext, useEffect } from 'react';
 import QuickStartContent from './controller/QuickStartContent';
 import QuickStartFooter from './controller/QuickStartFooter';
 import {
@@ -19,7 +19,7 @@ interface QuickStartControllerProps {
   contentRef?: React.Ref;
 }
 
-export const QuickStartController: React.FC = ({
+export const QuickStartController: FC = ({
   quickStart,
   nextQuickStarts,
   contentRef,
@@ -40,8 +40,8 @@ export const QuickStartController: React.FC = ({
     setQuickStartTaskStatus,
     nextStep,
     previousStep,
-  } = React.useContext(QuickStartContext);
-  React.useEffect(() => {
+  } = useContext(QuickStartContext);
+  useEffect(() => {
     // If activeQuickStartID was changed through prop from QuickStartContainer, need to init the state if it does not exist yet
     if (activeQuickStartID && !allQuickStartStates[activeQuickStartID]) {
       setAllQuickStartStates({
@@ -57,17 +57,17 @@ export const QuickStartController: React.FC = ({
     (task, index) => activeQuickStartState[`taskStatus${index}`],
   ) as QuickStartTaskStatus[];
 
-  const handleQuickStartChange = React.useCallback(
+  const handleQuickStartChange = useCallback(
     (quickStartId: string) => setActiveQuickStart(quickStartId),
     [setActiveQuickStart],
   );
 
-  const handleTaskStatusChange = React.useCallback(
+  const handleTaskStatusChange = useCallback(
     (newTaskStatus: QuickStartTaskStatus) => setQuickStartTaskStatus(newTaskStatus),
     [setQuickStartTaskStatus],
   );
 
-  const getQuickStartActiveTask = React.useCallback(() => {
+  const getQuickStartActiveTask = useCallback(() => {
     let activeTaskNumber = 0;
     while (
       activeTaskNumber !== totalTasks &&
@@ -78,12 +78,12 @@ export const QuickStartController: React.FC = ({
     return activeTaskNumber;
   }, [totalTasks, activeQuickStartState]);
 
-  const handleQuickStartContinue = React.useCallback(() => {
+  const handleQuickStartContinue = useCallback(() => {
     const activeTaskNumber = getQuickStartActiveTask();
     setQuickStartTaskNumber(name, activeTaskNumber);
   }, [getQuickStartActiveTask, setQuickStartTaskNumber, name]);
 
-  const handleNext = React.useCallback(() => {
+  const handleNext = useCallback(() => {
     if (status === QuickStartStatus.COMPLETE && taskNumber === totalTasks) {
       return handleQuickStartChange('');
     }
@@ -95,9 +95,9 @@ export const QuickStartController: React.FC = ({
     return nextStep(totalTasks);
   }, [handleQuickStartChange, nextStep, status, taskNumber, totalTasks, handleQuickStartContinue]);
 
-  const handleBack = React.useCallback(() => previousStep(), [previousStep]);
+  const handleBack = useCallback(() => previousStep(), [previousStep]);
 
-  const handleTaskSelect = React.useCallback(
+  const handleTaskSelect = useCallback(
     (selectedTaskNumber: number) => {
       setQuickStartTaskNumber(name, selectedTaskNumber);
     },
diff --git a/packages/module/src/QuickStartDrawer.tsx b/packages/module/src/QuickStartDrawer.tsx
index 47f2bca7..6f8bf38d 100644
--- a/packages/module/src/QuickStartDrawer.tsx
+++ b/packages/module/src/QuickStartDrawer.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useContext, useEffect, useState } from 'react';
 import { Drawer, DrawerContent, DrawerContentBody } from '@patternfly/react-core';
 import QuickStartCloseModal from './QuickStartCloseModal';
 import QuickStartDrawerContent from './QuickStartDrawerContent';
@@ -19,7 +19,7 @@ export interface QuickStartDrawerProps extends React.HTMLProps {
   onCloseNotInProgress?: any;
 }
 
-export const QuickStartDrawer: React.FC = ({
+export const QuickStartDrawer: FC = ({
   quickStarts = [],
   children,
   appendTo,
@@ -34,9 +34,9 @@ export const QuickStartDrawer: React.FC = ({
     allQuickStarts = [],
     allQuickStartStates,
     setAllQuickStartStates,
-  } = React.useContext(QuickStartContext);
+  } = useContext(QuickStartContext);
   const combinedQuickStarts = allQuickStarts.concat(quickStarts);
-  React.useEffect(() => {
+  useEffect(() => {
     const params = new URLSearchParams(window.location.search);
     // if there is a quick start param, but the quick start is not active, set it
     // this can happen if a new browser session is opened or an incognito window for example
@@ -50,7 +50,7 @@ export const QuickStartDrawer: React.FC = ({
     }
   }, [activeQuickStartID, combinedQuickStarts, setActiveQuickStart]);
 
-  React.useEffect(() => {
+  useEffect(() => {
     // If activeQuickStartID was changed through prop from QuickStartContainer, need to init the state if it does not exist yet
     if (activeQuickStartID && !allQuickStartStates[activeQuickStartID]) {
       setAllQuickStartStates({
@@ -60,7 +60,7 @@ export const QuickStartDrawer: React.FC = ({
     }
   }, [activeQuickStartID, allQuickStartStates, setAllQuickStartStates]);
 
-  const [modalOpen, setModalOpen] = React.useState(false);
+  const [modalOpen, setModalOpen] = useState(false);
   const onClose = () => setActiveQuickStart('');
   const handleClose = (activeQuickStartStatus: string | number) => {
     if (activeQuickStartStatus === QuickStartStatus.IN_PROGRESS) {
diff --git a/packages/module/src/QuickStartDrawerContent.tsx b/packages/module/src/QuickStartDrawerContent.tsx
index 7791f7ee..d10f26e2 100644
--- a/packages/module/src/QuickStartDrawerContent.tsx
+++ b/packages/module/src/QuickStartDrawerContent.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useContext } from 'react';
 import QuickStartPanelContent from './QuickStartPanelContent';
 import { QuickStartContext, QuickStartContextValues } from './utils/quick-start-context';
 import { QuickStart } from './utils/quick-start-types';
@@ -12,7 +12,7 @@ export interface QuickStartDrawerContentProps extends React.HTMLProps void;
 }
 
-export const QuickStartDrawerContent: React.FC = ({
+export const QuickStartDrawerContent: FC = ({
   quickStarts = [],
   appendTo,
   fullWidth,
@@ -23,7 +23,7 @@ export const QuickStartDrawerContent: React.FC = (
     activeQuickStartID,
     allQuickStarts = [],
     activeQuickStartState,
-  } = React.useContext(QuickStartContext);
+  } = useContext(QuickStartContext);
   const combinedQuickStarts = allQuickStarts.concat(quickStarts);
 
   const handleClose = () => {
diff --git a/packages/module/src/QuickStartMarkdownView.tsx b/packages/module/src/QuickStartMarkdownView.tsx
index 4a20a823..89e6d12d 100644
--- a/packages/module/src/QuickStartMarkdownView.tsx
+++ b/packages/module/src/QuickStartMarkdownView.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { FC, useContext } from 'react';
 import { SyncMarkdownView } from '@console/internal/components/markdown-view';
 import {
   AccordionRenderExtension,
@@ -21,12 +21,12 @@ interface QuickStartMarkdownViewProps {
   className?: string;
 }
 
-const QuickStartMarkdownView: React.FC = ({
+const QuickStartMarkdownView: FC = ({
   content,
   exactHeight,
   className,
 }) => {
-  const { markdown } = React.useContext(QuickStartContext);
+  const { markdown } = useContext(QuickStartContext);
   const inlineCopyClipboardShowdownExtension = useInlineCopyClipboardShowdownExtension();
   const multilineCopyClipboardShowdownExtension = useMultilineCopyClipboardShowdownExtension();
   const admonitionShowdownExtension = useAdmonitionShowdownExtension();
diff --git a/packages/module/src/QuickStartPanelContent.tsx b/packages/module/src/QuickStartPanelContent.tsx
index fe0b600d..154ed335 100644
--- a/packages/module/src/QuickStartPanelContent.tsx
+++ b/packages/module/src/QuickStartPanelContent.tsx
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import { CSSProperties, FC, useContext, useEffect, useRef, useState } from 'react';
 import {
   DrawerActions,
   DrawerCloseButton,
@@ -35,14 +35,14 @@ const getElement = (appendTo: HTMLElement | (() => HTMLElement)) => {
 };
 
 const useScrollTopOnTaskNumberChange = (node: HTMLElement, taskNumber: number): void => {
-  React.useEffect(() => {
+  useEffect(() => {
     if (node) {
       node.scrollTo({ top: 0, behavior: 'smooth' });
     }
   }, [taskNumber, node]);
 };
 
-const QuickStartPanelContent: React.FC = ({
+const QuickStartPanelContent: FC = ({
   quickStarts = [],
   handleClose,
   activeQuickStartID,
@@ -52,10 +52,10 @@ const QuickStartPanelContent: React.FC = ({
   footerClass,
   ...props
 }) => {
-  const titleRef = React.useRef(null);
+  const titleRef = useRef(null);
   const { getResource, activeQuickStartState, focusOnQuickStart } =
-    React.useContext(QuickStartContext);
-  const [contentRef, setContentRef] = React.useState();
+    useContext(QuickStartContext);
+  const [contentRef, setContentRef] = useState();
   const quickStart = quickStarts.find((qs) => qs.metadata.name === activeQuickStartID);
   const taskNumber = activeQuickStartState?.taskNumber;
   useScrollTopOnTaskNumberChange(contentRef, taskNumber as number);
@@ -74,7 +74,7 @@ const QuickStartPanelContent: React.FC = ({
     return Number.parseInt(taskNumber as string) + 1;
   };
 
-  React.useEffect(() => {
+  useEffect(() => {
     if (focusOnQuickStart && quickStart) {
       titleRef.current.focus();
     }
@@ -86,7 +86,7 @@ const QuickStartPanelContent: React.FC = ({
       data-testid={`qs-drawer-${camelize(quickStart.spec.displayName)}`}
       data-qs={`qs-step-${getStep()}`}
       data-test="quickstart drawer"
-      style={{ '--pf-v6-c-drawer__panel--PaddingBlockStart': '0' } as React.CSSProperties}
+      style={{ '--pf-v6-c-drawer__panel--PaddingBlockStart': '0' } as CSSProperties}
       {...props}
     >
       
diff --git a/packages/module/src/catalog/Catalog/QuickStartCatalogHeader.tsx b/packages/module/src/catalog/Catalog/QuickStartCatalogHeader.tsx index 8d0008e0..437a1f2a 100644 --- a/packages/module/src/catalog/Catalog/QuickStartCatalogHeader.tsx +++ b/packages/module/src/catalog/Catalog/QuickStartCatalogHeader.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FunctionComponent } from 'react'; import { Title } from '@patternfly/react-core'; export interface QuickStartCatalogHeaderProps { @@ -6,7 +6,7 @@ export interface QuickStartCatalogHeaderProps { hint?: string; } -export const QuickStartCatalogHeader: React.FC = ({ +export const QuickStartCatalogHeader: FunctionComponent = ({ title, hint, }) => ( diff --git a/packages/module/src/catalog/Catalog/QuickStartCatalogSection.tsx b/packages/module/src/catalog/Catalog/QuickStartCatalogSection.tsx index e61debb8..7276b97b 100644 --- a/packages/module/src/catalog/Catalog/QuickStartCatalogSection.tsx +++ b/packages/module/src/catalog/Catalog/QuickStartCatalogSection.tsx @@ -1,9 +1,9 @@ -import * as React from 'react'; +import { FC } from 'react'; export interface QuickStartCatalogSectionProps { children: React.ReactNode; } -export const QuickStartCatalogSection: React.FC = ({ children }) => ( +export const QuickStartCatalogSection: FC = ({ children }) => (
{children}
); diff --git a/packages/module/src/catalog/Catalog/QuickStartCatalogToolbar.tsx b/packages/module/src/catalog/Catalog/QuickStartCatalogToolbar.tsx index b784e7d0..2c432fc6 100644 --- a/packages/module/src/catalog/Catalog/QuickStartCatalogToolbar.tsx +++ b/packages/module/src/catalog/Catalog/QuickStartCatalogToolbar.tsx @@ -1,10 +1,10 @@ -import * as React from 'react'; +import { FC } from 'react'; import { Toolbar } from '@patternfly/react-core'; export interface QuickStartCatalogToolbarProps { children: React.ReactNode; } -export const QuickStartCatalogToolbar: React.FC = ({ children }) => ( +export const QuickStartCatalogToolbar: FC = ({ children }) => ( {children} ); diff --git a/packages/module/src/catalog/QuickStartCatalog.tsx b/packages/module/src/catalog/QuickStartCatalog.tsx index 4d96af20..1437b68d 100644 --- a/packages/module/src/catalog/QuickStartCatalog.tsx +++ b/packages/module/src/catalog/QuickStartCatalog.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FunctionComponent, useContext } from 'react'; import { Gallery } from '@patternfly/react-core'; import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context'; import { QuickStart } from '../utils/quick-start-types'; @@ -9,9 +9,9 @@ interface QuickStartCatalogProps { quickStarts: QuickStart[]; } -const QuickStartCatalog: React.FC = ({ quickStarts }) => { +const QuickStartCatalog: FunctionComponent = ({ quickStarts }) => { const { activeQuickStartID, allQuickStartStates } = - React.useContext(QuickStartContext); + useContext(QuickStartContext); return (
diff --git a/packages/module/src/catalog/QuickStartTile.tsx b/packages/module/src/catalog/QuickStartTile.tsx index 8604dd1f..a4daae8a 100644 --- a/packages/module/src/catalog/QuickStartTile.tsx +++ b/packages/module/src/catalog/QuickStartTile.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useContext, useMemo } from 'react'; import RocketIcon from '@patternfly/react-icons/dist/js/icons/rocket-icon'; import { FallbackImg } from '@console/shared'; import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context'; @@ -50,7 +50,7 @@ export interface QuickStartTileProps { action?: QuickstartAction; } -const QuickStartTile: React.FC = ({ +const QuickStartTile: FC = ({ quickStart, status, isActive, @@ -63,7 +63,7 @@ const QuickStartTile: React.FC = ({ } = quickStart; const { setActiveQuickStart, footer, getResource } = - React.useContext(QuickStartContext); + useContext(QuickStartContext); const statusColorMap = { [QuickStartStatus.COMPLETE]: 'green', @@ -102,7 +102,7 @@ const QuickStartTile: React.FC = ({ onClick(); }; - const footerComponent = React.useMemo(() => { + const footerComponent = useMemo(() => { if (footer && footer.show === false) { return null; } diff --git a/packages/module/src/catalog/QuickStartTileDescription.tsx b/packages/module/src/catalog/QuickStartTileDescription.tsx index 067b6010..9246dda5 100644 --- a/packages/module/src/catalog/QuickStartTileDescription.tsx +++ b/packages/module/src/catalog/QuickStartTileDescription.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useContext, useRef } from 'react'; import { Button, Flex, Popover } from '@patternfly/react-core'; import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon'; import QuickStartMarkdownView from '../QuickStartMarkdownView'; @@ -8,13 +8,13 @@ interface QuickStartTileDescriptionProps { description: string; prerequisites?: string[]; } -const QuickStartTileDescription: React.FC = ({ +const QuickStartTileDescription: FC = ({ description, prerequisites, }) => { - const { getResource } = React.useContext(QuickStartContext); + const { getResource } = useContext(QuickStartContext); const prereqs = prerequisites?.filter((p) => p); - const buttonRef = React.useRef(null); + const buttonRef = useRef(null); return ( <> diff --git a/packages/module/src/catalog/QuickStartTileFooter.tsx b/packages/module/src/catalog/QuickStartTileFooter.tsx index dd537a1b..c07c5203 100644 --- a/packages/module/src/catalog/QuickStartTileFooter.tsx +++ b/packages/module/src/catalog/QuickStartTileFooter.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC, useCallback, useContext } from 'react'; import { Button, Flex, FlexItem } from '@patternfly/react-core'; import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context'; import { QuickStartStatus } from '../utils/quick-start-types'; @@ -12,21 +12,21 @@ interface QuickStartTileFooterProps { ) => void; } -const QuickStartTileFooter: React.FC = ({ +const QuickStartTileFooter: FC = ({ quickStartId, status, totalTasks, onClickContinue, }) => { - const { getResource } = React.useContext(QuickStartContext); + const { getResource } = useContext(QuickStartContext); const { activeQuickStartID, startQuickStart, restartQuickStart } = - React.useContext(QuickStartContext); + useContext(QuickStartContext); - const start = React.useCallback(() => { + const start = useCallback(() => { startQuickStart(quickStartId, totalTasks); }, [quickStartId, startQuickStart, totalTasks]); - const restart = React.useCallback(() => { + const restart = useCallback(() => { restartQuickStart(quickStartId, totalTasks); }, [quickStartId, restartQuickStart, totalTasks]); diff --git a/packages/module/src/catalog/QuickStartTileFooterExternal.tsx b/packages/module/src/catalog/QuickStartTileFooterExternal.tsx index f899b299..96836823 100644 --- a/packages/module/src/catalog/QuickStartTileFooterExternal.tsx +++ b/packages/module/src/catalog/QuickStartTileFooterExternal.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC } from 'react'; import { Button, Flex, FlexItem } from '@patternfly/react-core'; import ExternalLinkAltIcon from '@patternfly/react-icons/dist/js/icons/external-link-alt-icon'; import { QuickStartExternal } from '../utils/quick-start-types'; @@ -8,10 +8,7 @@ interface QuickStartTileFooterProps { quickStartId?: string; } -const QuickStartTileFooterExternal: React.FC = ({ - link, - quickStartId, -}) => { +const QuickStartTileFooterExternal: FC = ({ link, quickStartId }) => { const { href, text } = link; return ( diff --git a/packages/module/src/catalog/QuickStartTileHeader.tsx b/packages/module/src/catalog/QuickStartTileHeader.tsx index 1f18ab65..5a3093cc 100644 --- a/packages/module/src/catalog/QuickStartTileHeader.tsx +++ b/packages/module/src/catalog/QuickStartTileHeader.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { FC } from 'react'; import { Button, Flex } from '@patternfly/react-core'; interface QuickStartTileHeaderProps { @@ -7,11 +7,7 @@ interface QuickStartTileHeaderProps { onSelect: (e: React.FormEvent | React.MouseEvent) => void; } -const QuickStartTileHeader: React.FC = ({ - name, - quickStartId, - onSelect, -}) => ( +const QuickStartTileHeader: FC = ({ name, quickStartId, onSelect }) => (