PromucFlow_constructor/app/client/src/components/ads/Icon.tsx
devrk96 539253f17e
Feature: Create new-app flow (#926)
* create new app flow

* uncontrolled component error fixed

* loader added when user is deleting or user role is updating

* home page loader and create-new-app loader added

* user role changing and use deleting state fixed

* PR feeback changes added

* orgname loader added

* warnings removed

* fixed create-new-app flow and delete app test cases

* beforeAll test case condition fixed

* Initial navigation condition fixed in createOrg test cases

* app card loading state fixed
2020-10-14 16:05:19 +05:30

223 lines
5.9 KiB
TypeScript

import React, { forwardRef, Ref } from "react";
import { ReactComponent as DeleteIcon } from "assets/icons/ads/delete.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 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 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 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 styled from "styled-components";
import { CommonComponentProps, Classes } from "./common";
import { noop } from "lodash";
import { theme } from "constants/DefaultTheme";
import Spinner from "./Spinner";
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 = [
"delete",
"user",
"general",
"billing",
"edit",
"error",
"success",
"search",
"close",
"share",
"rocket",
"workspace",
"plus",
"invite-user",
"view-all",
"downArrow",
"context-menu",
"duplicate",
"logout",
"manage",
] as const;
export type IconName = typeof IconCollection[number];
const IconWrapper = styled.span<IconProps>`
&:focus {
outline: none;
}
display: flex;
align-items: center;
svg {
width: ${props => sizeHandler(props.size)}px;
height: ${props => sizeHandler(props.size)}px;
path {
fill: ${props => props.theme.colors.icon.normal};
}
}
${props => (props.invisible ? `visibility: hidden;` : null)};
&:hover {
cursor: pointer;
path {
fill: ${props => props.theme.colors.icon.hover};
}
}
&:active {
cursor: pointer;
path {
fill: ${props => props.theme.colors.icon.active};
}
}
`;
export type IconProps = {
size?: IconSize;
name?: IconName;
invisible?: boolean;
className?: string;
onClick?: () => void;
};
const Icon = forwardRef(
(props: IconProps & CommonComponentProps, ref: Ref<HTMLSpanElement>) => {
let returnIcon;
switch (props.name) {
case "delete":
returnIcon = <DeleteIcon />;
break;
case "user":
returnIcon = <UserIcon />;
break;
case "general":
returnIcon = <GeneralIcon />;
break;
case "billing":
returnIcon = <BillingIcon />;
break;
case "edit":
returnIcon = <EditIcon />;
break;
case "error":
returnIcon = <ErrorIcon />;
break;
case "success":
returnIcon = <SuccessIcon />;
break;
case "search":
returnIcon = <SearchIcon />;
break;
case "close":
returnIcon = <CloseIcon />;
break;
case "downArrow":
returnIcon = <DownArrow />;
break;
case "share":
returnIcon = <ShareIcon />;
break;
case "rocket":
returnIcon = <RocketIcon />;
break;
case "workspace":
returnIcon = <WorkspaceIcon />;
break;
case "plus":
returnIcon = <CreateNewIcon />;
break;
case "invite-user":
returnIcon = <InviteUserIcon />;
break;
case "view-all":
returnIcon = <ViewAllIcon />;
break;
case "context-menu":
returnIcon = <ContextMenuIcon />;
break;
case "duplicate":
returnIcon = <DuplicateIcon />;
break;
case "logout":
returnIcon = <LogoutIcon />;
break;
case "manage":
returnIcon = <ManageIcon />;
break;
default:
returnIcon = null;
break;
}
return returnIcon && !props.isLoading ? (
<IconWrapper
className={Classes.ICON}
data-cy={props.cypressSelector}
ref={ref}
{...props}
onClick={props.onClick || noop}
>
{returnIcon}
</IconWrapper>
) : props.isLoading ? (
<Spinner size={props.size} />
) : null;
},
);
Icon.displayName = "Icon";
export default Icon;