From ce7394ca5d819b4f2c28ee73e39bfe8ef7ce5207 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Fri, 15 Dec 2023 19:13:14 +0000 Subject: [PATCH 01/10] Refactor help tooltip --- .../ActiveUserChart/ActiveUserChart.tsx | 17 +- .../components/HelpTooltip/HelpTooltip.tsx | 190 ++++++------------ .../components/InfoTooltip/InfoTooltip.tsx | 22 +- .../src/components/Resources/AgentLatency.tsx | 42 ++-- .../Resources/AgentOutdatedTooltip.tsx | 37 ++-- site/src/components/Resources/AgentStatus.tsx | 151 ++++---------- .../src/components/Resources/AgentVersion.tsx | 34 +--- .../WorkspaceOutdatedTooltip.tsx | 42 ++-- site/src/pages/AuditPage/AuditHelpTooltip.tsx | 20 +- .../TemplateInsightsPage.tsx | 31 ++- .../pages/TemplatesPage/TemplatesPageView.tsx | 19 +- .../UsersPage/UsersTable/EditRolesButton.tsx | 15 +- .../UsersTable/TableColumnHelpTooltip.tsx | 26 ++- .../WorkspacesPage/WorkspaceHelpTooltip.tsx | 25 ++- 14 files changed, 274 insertions(+), 397 deletions(-) diff --git a/site/src/components/ActiveUserChart/ActiveUserChart.tsx b/site/src/components/ActiveUserChart/ActiveUserChart.tsx index 8541297819b99..3a4ca5d163c9c 100644 --- a/site/src/components/ActiveUserChart/ActiveUserChart.tsx +++ b/site/src/components/ActiveUserChart/ActiveUserChart.tsx @@ -17,6 +17,8 @@ import { HelpTooltip, HelpTooltipTitle, HelpTooltipText, + HelpTooltipContent, + HelpTooltipTrigger, } from "components/HelpTooltip/HelpTooltip"; import dayjs from "dayjs"; import { useTheme } from "@emotion/react"; @@ -139,12 +141,15 @@ export const ActiveUsersTitle: FC = () => { return (
Active Users - - How do we calculate active users? - - When a connection is initiated to a user's workspace they are - considered an active user. e.g. apps, web terminal, SSH - + + + + How do we calculate active users? + + When a connection is initiated to a user's workspace they are + considered an active user. e.g. apps, web terminal, SSH + +
); diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index e5d06d67b6490..05e7fcd87dee1 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -1,114 +1,78 @@ import Link from "@mui/material/Link"; -// This is used as base for the main HelpTooltip component -// eslint-disable-next-line no-restricted-imports -- Read above -import Popover, { type PopoverProps } from "@mui/material/Popover"; import HelpIcon from "@mui/icons-material/HelpOutline"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import { - createContext, - useContext, - useRef, - useState, type FC, type PropsWithChildren, type HTMLAttributes, type ReactNode, + forwardRef, + ComponentProps, } from "react"; import { Stack } from "components/Stack/Stack"; -import type { CSSObject } from "@emotion/css"; +import { type CSSObject } from "@emotion/css"; import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; -import { type ClassName, useClassName } from "hooks/useClassName"; +import { + Popover, + PopoverContent, + PopoverTrigger, + usePopover, +} from "components/Popover/Popover"; type Icon = typeof HelpIcon; type Size = "small" | "medium"; -export const HelpTooltipContext = createContext< - { open: boolean; onClose: () => void } | undefined ->(undefined); - -const useHelpTooltip = () => { - const helpTooltipContext = useContext(HelpTooltipContext); - - if (!helpTooltipContext) { - throw new Error( - "This hook should be used in side of the HelpTooltipContext.", - ); - } +export const HelpTooltipIcon = HelpIcon; - return helpTooltipContext; +export const HelpTooltip: FC> = (props) => { + return ; }; -interface HelpPopoverProps extends PopoverProps { - onOpen: () => void; - onClose: () => void; -} - -export const HelpPopover: FC = ({ - onOpen, - onClose, - children, - ...props -}) => { - const popover = useClassName(classNames.popover, []); - const paper = useClassName(classNames.paper, []); +export const HelpTooltipContent = ( + props: ComponentProps, +) => { + const theme = useTheme(); return ( - - {children} - + css={{ + "& .MuiPaper-root": { + fontSize: 14, + width: 304, + padding: 20, + color: theme.palette.text.secondary, + }, + }} + /> ); }; -export interface HelpTooltipProps { - // Useful to test on storybook - open?: boolean; +type HelpTooltipTriggerProps = Omit< + HTMLAttributes, + "size" +> & { size?: Size; - icon?: Icon; - buttonStyles?: Interpolation; - iconStyles?: Interpolation; - children?: ReactNode; -} +}; -export const HelpTooltip: FC = ({ - children, - open = false, - size = "medium", - icon: Icon = HelpIcon, - buttonStyles, - iconStyles, -}) => { +export const HelpTooltipTrigger = forwardRef< + HTMLButtonElement, + HelpTooltipTriggerProps +>((props, ref) => { const theme = useTheme(); - const anchorRef = useRef(null); - const [isOpen, setIsOpen] = useState(open); - const id = isOpen ? "help-popover" : undefined; - - const onClose = () => { - setIsOpen(false); - }; + const { + size = "medium", + children = , + ...buttonProps + } = props; return ( - <> + - setIsOpen(true)} - onClose={() => setIsOpen(false)} - > - - {children} - - - + ); -}; +}); export const HelpTooltipTitle: FC> = ({ children, @@ -213,7 +151,7 @@ export const HelpTooltipAction: FC = ({ onClick, ariaLabel, }) => { - const tooltip = useHelpTooltip(); + const popover = usePopover(); return (