import React, { forwardRef, Ref } from "react"; // import { ReactComponent as DeleteIcon } from "assets/icons/ads/delete.svg"; import { ReactComponent as BookLineIcon } from "assets/icons/ads/book-open-line.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 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 SearchIcon from "remixicon-react/SearchLineIcon"; 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 ShareIcon2 } from "assets/icons/ads/share-2.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 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 LinkIcon } from "assets/icons/ads/link.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 Pin } from "assets/icons/comments/pin.svg"; import { ReactComponent as TrashOutline } from "assets/icons/form/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 DownArrow2 } from "assets/icons/comments/down-arrow.svg"; import { ReactComponent as Chat } from "assets/icons/comments/chat.svg"; import { ReactComponent as Unpin } from "assets/icons/comments/unpinIcon.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 { ReactComponent as ArrowForwardIcon } from "assets/icons/control/arrow_forward.svg"; import { ReactComponent as DoubleArrowRightIcon } from "assets/icons/ads/double-arrow-right.svg"; import { ReactComponent as CapSolidIcon } from "assets/icons/control/cap_solid.svg"; import { ReactComponent as CapDotIcon } from "assets/icons/control/cap_dot.svg"; import { ReactComponent as LineDottedIcon } from "assets/icons/control/line_dotted.svg"; import { ReactComponent as LineDashedIcon } from "assets/icons/control/line_dashed.svg"; import { ReactComponent as TableIcon } from "assets/icons/ads/tables.svg"; import { ReactComponent as ColumnIcon } from "assets/icons/ads/column.svg"; import { ReactComponent as GearIcon } from "assets/icons/ads/gear.svg"; import { ReactComponent as UserV2Icon } from "assets/icons/ads/user-v2.svg"; import { ReactComponent as SupportIcon } from "assets/icons/ads/support.svg"; import { ReactComponent as Snippet } from "assets/icons/ads/snippet.svg"; import { ReactComponent as WorkspaceIcon } from "assets/icons/ads/organizationIcon.svg"; import { ReactComponent as SettingIcon } from "assets/icons/control/settings.svg"; import { ReactComponent as DropdownIcon } from "assets/icons/ads/dropdown.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"; // remix icons import AddMoreIcon from "remixicon-react/AddCircleLineIcon"; import AddMoreFillIcon from "remixicon-react/AddCircleFillIcon"; import ArrowLeftRightIcon from "remixicon-react/ArrowLeftRightLineIcon"; import ArrowDownLineIcon from "remixicon-react/ArrowDownLineIcon"; import BookIcon from "remixicon-react/BookOpenLineIcon"; import ChevronRight from "remixicon-react/ArrowRightSFillIcon"; import CloseLineIcon from "remixicon-react/CloseLineIcon"; import CloseCircleIcon from "remixicon-react/CloseCircleFillIcon"; import CommentContextMenu from "remixicon-react/More2FillIcon"; import ContextMenuIcon from "remixicon-react/MoreFillIcon"; import CreateNewIcon from "remixicon-react/AddLineIcon"; import Database2Line from "remixicon-react/Database2LineIcon"; import DatasourceIcon from "remixicon-react/CloudFillIcon"; import DeleteBin7 from "remixicon-react/DeleteBin7LineIcon"; import DiscordIcon from "remixicon-react/DiscordLineIcon"; import DownArrow from "remixicon-react/ArrowDownSFillIcon"; import Download from "remixicon-react/DownloadCloud2LineIcon"; import DuplicateIcon from "remixicon-react/FileCopyLineIcon"; import EditIcon from "remixicon-react/PencilFillIcon"; import EditLineIcon from "remixicon-react/EditLineIcon"; import Emoji from "remixicon-react/EmotionLineIcon"; import ExpandMore from "remixicon-react/ArrowDownSLineIcon"; import ExpandLess from "remixicon-react/ArrowUpSLineIcon"; import EyeOn from "remixicon-react/EyeLineIcon"; import EyeOff from "remixicon-react/EyeOffLineIcon"; import FileTransfer from "remixicon-react/FileTransferLineIcon"; import Filter from "remixicon-react/Filter2FillIcon"; import GitMerge from "remixicon-react/GitMergeLineIcon"; import GitCommit from "remixicon-react/GitCommitLineIcon"; import GitPullRequst from "remixicon-react/GitPullRequestLineIcon"; import GuideIcon from "remixicon-react/GuideFillIcon"; import HelpIcon from "remixicon-react/QuestionMarkIcon"; import LightbulbFlashLine from "remixicon-react/LightbulbFlashLineIcon"; import InfoIcon from "remixicon-react/InformationLineIcon"; import KeyIcon from "remixicon-react/Key2LineIcon"; import LeftArrowIcon2 from "remixicon-react/ArrowLeftSLineIcon"; import Link2 from "remixicon-react/LinkIcon"; import LeftArrowIcon from "remixicon-react/ArrowLeftLineIcon"; import NewsPaperLine from "remixicon-react/NewspaperLineIcon"; import OvalCheck from "remixicon-react/CheckboxCircleLineIcon"; import OvalCheckFill from "remixicon-react/CheckboxCircleFillIcon"; import Pin3 from "remixicon-react/Pushpin2FillIcon"; import QueryIcon from "remixicon-react/CodeSSlashLineIcon"; import RightArrowIcon from "remixicon-react/ArrowRightLineIcon"; import RightArrowIcon2 from "remixicon-react/ArrowRightSLineIcon"; import RocketIcon from "remixicon-react/RocketLineIcon"; import ShareBoxFillIcon from "remixicon-react/ShareBoxFillIcon"; import ShareForwardIcon from "remixicon-react/ShareForwardFillIcon"; import Trash from "remixicon-react/DeleteBinLineIcon"; import UpArrow from "remixicon-react/ArrowUpSFillIcon"; import WarningIcon from "remixicon-react/ErrorWarningFillIcon"; import EditUnderlineIcon from "remixicon-react/EditLineIcon"; import LogoutIcon from "remixicon-react/LogoutBoxRLineIcon"; import ShareLineIcon from "remixicon-react/ShareLineIcon"; import DownArrowIcon from "remixicon-react/ArrowDownSLineIcon"; import LoaderLineIcon from "remixicon-react/LoaderLineIcon"; import WidgetIcon from "remixicon-react/FunctionLineIcon"; import RefreshLineIcon from "remixicon-react/RefreshLineIcon"; import GitBranchLineIcon from "remixicon-react/GitBranchLineIcon"; import EditBoxLineIcon from "remixicon-react/EditBoxLineIcon"; import StarLineIcon from "remixicon-react/StarLineIcon"; import StarFillIcon from "remixicon-react/StarFillIcon"; import Settings2LineIcon from "remixicon-react/Settings2LineIcon"; export enum IconSize { XXS = "extraExtraSmall", XS = "extraSmall", SMALL = "small", MEDIUM = "medium", LARGE = "large", XL = "extraLarge", XXL = "extraExtraLarge", XXXL = "extraExtraExtraLarge", XXXXL = "extraExtraExtraExtraLarge", } 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; case IconSize.XXXXL: iconSize = theme.iconSizes.XXXXL; break; default: iconSize = theme.iconSizes.SMALL; break; } return iconSize; }; export const IconCollection = [ "HEADING_ONE", "HEADING_THREE", "HEADING_TWO", "PARAGRAPH", "PARAGRAPH_TWO", "add-more", "add-more-fill", "arrow-forward", "arrow-left", "double-arrow-right", "swap-horizontal", "billing", "book", "book-line", "bug", "cancel", "cap-dot", "cap-solid", "card-context-menu", "chat", "checkbox-circle-line", "chevron-left", "chevron-right", "close", "close-circle", "close-modal", "close-x", "column", "comment-context-menu", "context-menu", "cross", "danger", "database-2-line", "datasource", "delete", "delete-blank", "desktop", "discord", "down-arrow-2", "downArrow", "download", "duplicate", "edit", "edit-line", "edit-box-line", "emoji", "error", "expand-less", "expand-more", "eye-on", "eye-off", "file-transfer", "filter", "fluid", "fork", "gear", "general", "git-branch", "git-commit", "git-pull-request", "guide", "help", "info", "invite-user", "left-arrow", "left-arrow-2", "lightning", "line-dashed", "line-dotted", "lightbulb-flash-line", "link", "link-2", "logout", "manage", "mobile", "news-paper", "no-response", "open", "oval-check", "oval-check-fill", "pin", "pin-3", "play", "plus", "query", "reaction", "reaction-2", "read-pin", "right-arrow", "right-arrow-2", "rocket", "search", "send-button", "settings-2-line", "share", "share-2", "share-box", "share-line", "shine", "star-line", "star-fill", "success", "support", "tables", "tablet", "trash", "trash-outline", "trending-flat", "unpin", "unread-pin", "upArrow", "upload", "user", "user-2", "view-all", "view-less", "wand", "warning", "warning-triangle", "workspace", "git-branch", "snippet", "edit-underline", "down-arrow", "loader", "setting", "widget", "dropdown", "refresh", "key", ] 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 ? ` fill: ${props.fillColor || ""}; circle { fill: ${props.fillColor || ""}; } path { fill: ${props.fillColor || ""}; } ` : ""}; ${(props) => (props.invisible ? `visibility: hidden;` : null)}; &:hover { cursor: ${(props) => (props.clickable ? "pointer" : "default")}; ${(props) => !props.keepColors ? ` fill: ${props.hoverFillColor || ""}; path { fill: ${props.hoverFillColor || ""}; } ` : ""} } } `; export type IconProps = { size?: IconSize; name?: IconName; invisible?: boolean; className?: string; onClick?: (e: React.MouseEvent) => void; fillColor?: string; hoverFillColor?: string; keepColors?: boolean; loaderWithIconWrapper?: boolean; clickable?: boolean; }; const Icon = forwardRef( (props: IconProps & CommonComponentProps, ref: Ref) => { let returnIcon; switch (props.name) { case "HEADING_ONE": case "HEADING_TWO": case "HEADING_THREE": case "PARAGRAPH": case "PARAGRAPH_TWO": const ControlIcon = ControlIcons[props.name]; returnIcon = ; break; case "add-more": returnIcon = ; break; case "add-more-fill": returnIcon = ; break; case "arrow-forward": returnIcon = ; break; case "double-arrow-right": returnIcon = ; break; case "arrow-left": returnIcon = ; break; case "swap-horizontal": returnIcon = ; break; case "billing": returnIcon = ; break; case "book": returnIcon = ; break; case "book-line": returnIcon = ; break; case "bug": returnIcon = ; break; case "cancel": returnIcon = ; break; case "cap-dot": returnIcon = ; break; case "cap-solid": returnIcon = ; break; case "card-context-menu": returnIcon = ; break; case "chat": returnIcon = ; break; case "chevron-left": returnIcon = ; break; case "chevron-right": returnIcon = ; break; case "close": returnIcon = ; break; case "close-circle": returnIcon = ; break; case "close-modal": case "close-x": returnIcon = ; break; case "column": returnIcon = ; break; case "comment-context-menu": returnIcon = ; break; case "context-menu": returnIcon = ; break; case "cross": returnIcon = ; break; case "danger": returnIcon = ; break; case "database-2-line": returnIcon = ; break; case "datasource": returnIcon = ; break; case "delete": returnIcon = ; break; case "delete-blank": returnIcon = ; break; case "desktop": returnIcon = ; break; case "discord": returnIcon = ; break; case "down-arrow-2": returnIcon = ; break; case "downArrow": returnIcon = ; break; case "download": returnIcon = ; break; case "duplicate": returnIcon = ; break; case "edit": returnIcon = ; break; case "edit-line": returnIcon = ; break; case "edit-box-line": returnIcon = ; break; case "emoji": returnIcon = ; break; case "error": returnIcon = ; break; case "expand-less": returnIcon = ; break; case "expand-more": returnIcon = ; break; case "eye-on": returnIcon = ; break; case "eye-off": returnIcon = ; break; case "file-transfer": returnIcon = ; break; case "filter": returnIcon = ; break; case "fluid": returnIcon = ; break; case "fork": returnIcon = ; break; case "gear": returnIcon = ; break; case "general": returnIcon = ; break; case "git-branch": returnIcon = ; break; case "git-commit": returnIcon = ; break; case "git-pull-request": returnIcon = ; break; case "guide": returnIcon = ; break; case "help": returnIcon = ; break; case "info": returnIcon = ; break; case "invite-user": returnIcon = ; break; case "key": returnIcon = ; break; case "left-arrow-2": returnIcon = ; break; case "lightning": returnIcon = ; break; case "lightbulb-flash-line": returnIcon = ; break; case "line-dashed": returnIcon = ; break; case "line-dotted": returnIcon = ; break; case "link": returnIcon = ; break; case "link-2": returnIcon = ; break; case "logout": returnIcon = ; break; case "manage": returnIcon = ; break; case "mobile": returnIcon = ; break; case "news-paper": returnIcon = ; break; case "no-response": returnIcon = ; break; case "open": returnIcon = ; break; case "oval-check": returnIcon = ; break; case "oval-check-fill": returnIcon = ; break; case "pin": returnIcon = ; break; case "pin-3": returnIcon = ; break; case "play": returnIcon = ; break; case "plus": returnIcon = ; break; case "query": returnIcon = ; break; case "reaction": returnIcon = ; break; case "reaction-2": returnIcon = ; break; case "read-pin": returnIcon = ; break; case "right-arrow": returnIcon = ; break; case "right-arrow-2": returnIcon = ; break; case "rocket": returnIcon = ; break; case "search": returnIcon = ; break; case "send-button": returnIcon = ; break; case "settings-2-line": returnIcon = ; break; case "share": returnIcon = ; break; case "share-2": returnIcon = ; break; case "share-box": returnIcon = ; break; case "share-line": returnIcon = ; break; case "shine": returnIcon = ; break; case "star-line": returnIcon = ; break; case "star-fill": returnIcon = ; break; case "success": returnIcon = ; break; case "support": returnIcon = ; break; case "tables": returnIcon = ; break; case "tablet": returnIcon = ; break; case "trash": returnIcon = ; break; case "trash-outline": returnIcon = ; break; case "trending-flat": returnIcon = ; break; case "unpin": returnIcon = ; break; case "unread-pin": returnIcon = ; break; case "upArrow": returnIcon = ; break; case "upload": returnIcon = ; break; case "user": returnIcon = ; break; case "user-2": returnIcon = ; break; case "view-all": returnIcon = ; break; case "view-less": returnIcon = ; break; case "wand": returnIcon = ; break; case "warning": returnIcon = ; break; case "warning-triangle": returnIcon = ; break; case "setting": returnIcon = ; break; case "workspace": returnIcon = ; break; case "snippet": returnIcon = ; break; case "edit-underline": returnIcon = ; break; case "down-arrow": returnIcon = ; break; case "loader": returnIcon = ; break; case "widget": returnIcon = ; break; case "dropdown": returnIcon = ; break; case "refresh": returnIcon = ; break; default: returnIcon = null; break; } const clickable = props.clickable === undefined ? true : props.clickable; let loader = ; if (props.loaderWithIconWrapper) { loader = ( ); } return returnIcon && !props.isLoading ? ( {returnIcon} ) : props.isLoading ? ( loader ) : null; }, ); Icon.displayName = "Icon"; export default Icon;