import React, { forwardRef, Ref } from "react"; import { ReactComponent as DeleteIcon } from "assets/icons/ads/delete.svg"; import { ReactComponent as BookIcon } from "assets/icons/ads/book.svg"; import { ReactComponent as BugIcon } from "assets/icons/ads/bug.svg"; import { ReactComponent as CancelIcon } from "assets/icons/ads/cancel.svg"; import { ReactComponent as ExpandMore } from "assets/icons/ads/expand-more.svg"; import { ReactComponent as CrossIcon } from "assets/icons/ads/cross.svg"; import { ReactComponent as OpenIcon } from "assets/icons/ads/open.svg"; import { ReactComponent as UserIcon } from "assets/icons/ads/user.svg"; import { ReactComponent as GeneralIcon } from "assets/icons/ads/general.svg"; import { ReactComponent as BillingIcon } from "assets/icons/ads/billing.svg"; import { ReactComponent as EditIcon } from "assets/icons/ads/edit.svg"; import { ReactComponent as ErrorIcon } from "assets/icons/ads/error.svg"; import { ReactComponent as ShineIcon } from "assets/icons/ads/shine.svg"; import { ReactComponent as SuccessIcon } from "assets/icons/ads/success.svg"; import { ReactComponent as SearchIcon } from "assets/icons/ads/search.svg"; import { ReactComponent as CloseIcon } from "assets/icons/ads/close.svg"; import { ReactComponent as WarningIcon } from "assets/icons/ads/warning.svg"; import { ReactComponent as WarningTriangleIcon } from "assets/icons/ads/warning-triangle.svg"; import { ReactComponent as DownArrow } from "assets/icons/ads/down_arrow.svg"; import { ReactComponent as ShareIcon } from "assets/icons/ads/share.svg"; import { ReactComponent as RocketIcon } from "assets/icons/ads/launch.svg"; import { ReactComponent as WorkspaceIcon } from "assets/icons/ads/workspace.svg"; import { ReactComponent as CreateNewIcon } from "assets/icons/ads/create-new.svg"; import { ReactComponent as InviteUserIcon } from "assets/icons/ads/invite-users.svg"; import { ReactComponent as ViewAllIcon } from "assets/icons/ads/view-all.svg"; import { ReactComponent as ViewLessIcon } from "assets/icons/ads/view-less.svg"; import { ReactComponent as ContextMenuIcon } from "assets/icons/ads/context-menu.svg"; import { ReactComponent as DuplicateIcon } from "assets/icons/ads/duplicate.svg"; import { ReactComponent as LogoutIcon } from "assets/icons/ads/logout.svg"; import { ReactComponent as ManageIcon } from "assets/icons/ads/manage.svg"; import { ReactComponent as ArrowLeft } from "assets/icons/ads/arrow-left.svg"; import { ReactComponent as Fork } from "assets/icons/ads/fork.svg"; import { ReactComponent as ChevronLeft } from "assets/icons/ads/chevron_left.svg"; import { ReactComponent as ChevronRight } from "assets/icons/ads/chevron_right.svg"; import { ReactComponent as LinkIcon } from "assets/icons/ads/link.svg"; import { ReactComponent as HelpIcon } from "assets/icons/help/help.svg"; import { ReactComponent as CloseModalIcon } from "assets/icons/ads/close-modal.svg"; import { ReactComponent as NoResponseIcon } from "assets/icons/ads/no-response.svg"; import { ReactComponent as LightningIcon } from "assets/icons/ads/lightning.svg"; import { ReactComponent as AddMoreIcon } from "assets/icons/ads/add-more.svg"; import { ReactComponent as RightArrowIcon } from "assets/icons/ads/right-arrow.svg"; import { ReactComponent as TrendingFlat } from "assets/icons/ads/trending-flat.svg"; import { ReactComponent as DatasourceIcon } from "assets/icons/ads/datasource.svg"; import { ReactComponent as PlayIcon } from "assets/icons/ads/play.svg"; import { ReactComponent as DesktopIcon } from "assets/icons/ads/desktop.svg"; import { ReactComponent as WandIcon } from "assets/icons/ads/wand.svg"; import { ReactComponent as MobileIcon } from "assets/icons/ads/mobile.svg"; import { ReactComponent as TabletIcon } from "assets/icons/ads/tablet.svg"; import { ReactComponent as FluidIcon } from "assets/icons/ads/fluid.svg"; import { ReactComponent as CardContextMenu } from "assets/icons/ads/card-context-menu.svg"; import { ReactComponent as SendButton } from "assets/icons/comments/send-button.svg"; import { ReactComponent as Emoji } from "assets/icons/comments/emoji.svg"; import { ReactComponent as Pin } from "assets/icons/comments/pin.svg"; import { ReactComponent as OvalCheck } from "assets/icons/comments/check-oval.svg"; import { ReactComponent as ContextMenu } from "assets/icons/ads/context-menu.svg"; import { ReactComponent as Trash } from "assets/icons/comments/trash.svg"; import { ReactComponent as ReadPin } from "assets/icons/comments/read-pin.svg"; import { ReactComponent as UnreadPin } from "assets/icons/comments/unread-pin.svg"; import { ReactComponent as Link2 } from "assets/icons/comments/link.svg"; import { ReactComponent as CommentContextMenu } from "assets/icons/comments/context-menu.svg"; import { ReactComponent as DownArrow2 } from "assets/icons/comments/down-arrow.svg"; import { ReactComponent as Filter } from "assets/icons/comments/filter.svg"; import { ReactComponent as Chat } from "assets/icons/comments/chat.svg"; import { ReactComponent as Pin3 } from "assets/icons/comments/pin_3.svg"; import { ReactComponent as Unpin } from "assets/icons/comments/unpin.svg"; import { ReactComponent as Reaction } from "assets/icons/comments/reaction.svg"; import { ReactComponent as Reaction2 } from "assets/icons/comments/reaction-2.svg"; import { ReactComponent as Upload } from "assets/icons/ads/upload.svg"; import { ReactComponent as Download } from "assets/icons/ads/download.svg"; import styled from "styled-components"; import { CommonComponentProps, Classes } from "./common"; import { noop } from "lodash"; import { theme } from "constants/DefaultTheme"; import Spinner from "./Spinner"; import { ControlIcons } from "icons/ControlIcons"; export enum IconSize { XXS = "extraExtraSmall", XS = "extraSmall", SMALL = "small", MEDIUM = "medium", LARGE = "large", XL = "extraLarge", XXL = "extraExtraLarge", XXXL = "extraExtraExtraLarge", } export const sizeHandler = (size?: IconSize) => { let iconSize = 0; switch (size) { case IconSize.XXS: iconSize = theme.iconSizes.XXS; break; case IconSize.XS: iconSize = theme.iconSizes.XS; break; case IconSize.SMALL: iconSize = theme.iconSizes.SMALL; break; case IconSize.MEDIUM: iconSize = theme.iconSizes.MEDIUM; break; case IconSize.LARGE: iconSize = theme.iconSizes.LARGE; break; case IconSize.XL: iconSize = theme.iconSizes.XL; break; case IconSize.XXL: iconSize = theme.iconSizes.XXL; break; case IconSize.XXXL: iconSize = theme.iconSizes.XXXL; break; default: iconSize = theme.iconSizes.SMALL; break; } return iconSize; }; export const IconCollection = [ "upload", "download", "book", "bug", "cancel", "cross", "delete", "expand-more", "open", "user", "general", "billing", "edit", "error", "shine", "danger", "success", "search", "close", "share", "rocket", "workspace", "plus", "invite-user", "view-all", "view-less", "warning", "warning-triangle", "downArrow", "context-menu", "duplicate", "logout", "manage", "arrow-left", "fork", "chevron-left", "chevron-right", "link", "help", "close-modal", "no-response", "lightning", "add-more", "right-arrow", "trending-flat", "datasource", "play", "desktop", "wand", "mobile", "tablet", "fluid", "card-context-menu", "send-button", "emoji", "pin", "oval-check", "HEADING_ONE", "HEADING_TWO", "HEADING_THREE", "PARAGRAPH", "PARAGRAPH_TWO", "context-menu", "trash", "link-2", "close-x", "comment-context-menu", "down-arrow-2", "read-pin", "unread-pin", "filter", "chat", "pin-3", "unpin", "reaction", "reaction-2", ] as const; export type IconName = typeof IconCollection[number]; export const IconWrapper = styled.span` &:focus { outline: none; } display: flex; align-items: center; svg { width: ${(props) => sizeHandler(props.size)}px; height: ${(props) => sizeHandler(props.size)}px; ${(props) => !props.keepColors ? ` path { fill: ${props.fillColor || props.theme.colors.icon.normal}; } circle { fill: ${props.fillColor || props.theme.colors.icon.normal}; } ` : ""} ${(props) => (props.invisible ? `visibility: hidden;` : null)}; &:hover { cursor: pointer; ${(props) => !props.keepColors ? ` path { fill: ${props.hoverFillColor || props.theme.colors.icon.hover}; } ` : ""} } &:hover { cursor: pointer; ${(props) => !props.keepColors ? ` path { fill: ${props.hoverFillColor || props.theme.colors.icon.hover}; } ` : ""} } `; export type IconProps = { size?: IconSize; name?: IconName; invisible?: boolean; className?: string; onClick?: (e: React.MouseEvent) => void; fillColor?: string; hoverFillColor?: string; keepColors?: boolean; }; const Icon = forwardRef( (props: IconProps & CommonComponentProps, ref: Ref) => { let returnIcon; switch (props.name) { case "book": returnIcon = ; break; case "bug": returnIcon = ; break; case "cancel": returnIcon = ; break; case "cross": returnIcon = ; break; case "delete": returnIcon = ; break; case "expand-more": returnIcon = ; break; case "open": returnIcon = ; break; case "user": returnIcon = ; break; case "general": returnIcon = ; break; case "billing": returnIcon = ; break; case "edit": returnIcon = ; break; case "error": returnIcon = ; break; case "danger": returnIcon = ; break; case "shine": returnIcon = ; break; case "success": returnIcon = ; break; case "search": returnIcon = ; break; case "close": returnIcon = ; break; case "downArrow": returnIcon = ; break; case "share": returnIcon = ; break; case "rocket": returnIcon = ; break; case "wand": returnIcon = ; break; case "workspace": returnIcon = ; break; case "plus": returnIcon = ; break; case "invite-user": returnIcon = ; break; case "view-all": returnIcon = ; break; case "view-less": returnIcon = ; break; case "context-menu": returnIcon = ; break; case "duplicate": returnIcon = ; break; case "logout": returnIcon = ; break; case "manage": returnIcon = ; break; case "warning": returnIcon = ; break; case "warning-triangle": returnIcon = ; break; case "arrow-left": returnIcon = ; break; case "fork": returnIcon = ; break; case "chevron-left": returnIcon = ; break; case "chevron-right": returnIcon = ; break; case "link": returnIcon = ; break; case "help": returnIcon = ; break; case "close-modal": case "close-x": returnIcon = ; break; case "no-response": returnIcon = ; break; case "lightning": returnIcon = ; break; case "add-more": returnIcon = ; break; case "right-arrow": returnIcon = ; break; case "trending-flat": returnIcon = ; break; case "datasource": returnIcon = ; break; case "play": returnIcon = ; break; case "desktop": returnIcon = ; break; case "mobile": returnIcon = ; break; case "tablet": returnIcon = ; break; case "fluid": returnIcon = ; break; case "card-context-menu": returnIcon = ; break; case "send-button": returnIcon = ; break; case "emoji": returnIcon = ; break; case "pin": returnIcon = ; break; case "oval-check": returnIcon = ; break; case "HEADING_ONE": case "HEADING_TWO": case "HEADING_THREE": case "PARAGRAPH": case "PARAGRAPH_TWO": const ControlIcon = ControlIcons[props.name]; returnIcon = ; break; case "context-menu": returnIcon = ; break; case "read-pin": returnIcon = ; break; case "unread-pin": returnIcon = ; break; case "link-2": returnIcon = ; break; case "trash": returnIcon = ; break; case "comment-context-menu": returnIcon = ; break; case "down-arrow-2": returnIcon = ; break; case "filter": returnIcon = ; break; case "chat": returnIcon = ; break; case "pin-3": returnIcon = ; break; case "unpin": returnIcon = ; break; case "reaction": returnIcon = ; break; case "reaction-2": returnIcon = ; break; case "upload": returnIcon = ; break; case "download": returnIcon = ; break; default: returnIcon = null; break; } return returnIcon && !props.isLoading ? ( {returnIcon} ) : props.isLoading ? ( ) : null; }, ); Icon.displayName = "Icon"; export default Icon;