PromucFlow_constructor/app/client/src/components/ads/Toggle.tsx

152 lines
3.4 KiB
TypeScript
Raw Normal View History

import { CommonComponentProps, Classes } from "./common";
import React, { useState, useEffect } from "react";
import styled from "styled-components";
import Spinner from "./Spinner";
type ToggleProps = CommonComponentProps & {
onToggle: (value: boolean) => void;
value: boolean;
};
const StyledToggle = styled.label<{
isLoading?: boolean;
disabled?: boolean;
value: boolean;
}>`
position: relative;
display: block;
input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
2020-12-24 04:32:25 +00:00
background-color: ${(props) =>
props.isLoading
? props.theme.colors.toggle.disable.off
: props.theme.colors.toggle.bg};
transition: 0.4s;
width: 46px;
height: 23px;
border-radius: 92px;
}
2020-12-24 04:32:25 +00:00
${(props) =>
props.isLoading
? `.toggle-spinner {
position: absolute;
top: 3px;
left: 17px;
}
.slider:before {
display: none;
}`
: `.slider:before {
position: absolute;
content: "";
height: 19px;
width: 19px;
top: 2px;
left: 2px;
background-color: ${
props.disabled && !props.value
? props.theme.colors.toggle.disabledSlider.off
: props.theme.colors.toggle.disabledSlider.on
};
box-shadow: ${
props.value
? "1px 0px 3px rgba(0, 0, 0, 0.16)"
: "-1px 0px 3px rgba(0, 0, 0, 0.16)"
};
opacity: ${props.value ? 1 : 0.9};
transition: .4s;
border-radius: 50%;
}`}
&& input:hover + .slider:before {
opacity: 1;
}
input:focus + .slider:before {
2020-12-24 04:32:25 +00:00
${(props) => (props.value ? "opacity: 0.6" : "opacity: 0.7")};
}
input:disabled + .slider:before {
2020-12-24 04:32:25 +00:00
${(props) => (props.value ? "opacity: 0.24" : "opacity: 1")};
}
input:checked + .slider:before {
transform: translateX(23px);
}
input:checked + .slider {
2020-12-24 04:32:25 +00:00
background-color: ${(props) => props.theme.colors.info.main};
}
input:hover + .slider,
input:focus + .slider {
2020-12-24 04:32:25 +00:00
background-color: ${(props) =>
props.value
? props.theme.colors.toggle.hover.on
: props.theme.colors.toggle.hover.off};
}
input:disabled + .slider {
cursor: not-allowed;
2020-12-24 04:32:25 +00:00
background-color: ${(props) =>
props.value && !props.isLoading
? props.theme.colors.toggle.disable.on
: props.theme.colors.toggle.disable.off};
}
.${Classes.SPINNER} {
circle {
2020-12-24 04:32:25 +00:00
stroke: ${(props) => props.theme.colors.toggle.spinner};
}
}
`;
export default function Toggle(props: ToggleProps) {
const [value, setValue] = useState(false);
useEffect(() => {
setValue(props.value);
}, [props.value]);
const onChangeHandler = (value: boolean) => {
setValue(value);
props.onToggle && props.onToggle(value);
};
return (
<StyledToggle
data-cy={props.cypressSelector}
isLoading={props.isLoading}
disabled={props.disabled}
value={value}
Homepage redesign with themes (#482) * Updating homepage body color * WIP: Fixing scrolls and adding anchors * Removing divider from bottom of the page. * Adding hover background color to app card * Changing edit and launch icons. * Fixing app name paddding in card. * Fixing workspaces overflow * Adding right padding to applications view * Adding share icon to share btn * Fixing Application card styles. * Fixing text decoration in button. * Adding new workspace button * Fixing new workspace and new app styles. * Adding icon sizes. * Fixing Org Name and Org settings menu. * Application menu working * Fixing overlay visibility on app card * Fixing settings page content width. * Fixing workspace icon * Changing app card colors. * Removing debugger * Adding app icon. * Fixing the spaces in application card * Adding storybook-static folder to gitignore. * Adding other storybook files. * Adding menu items for app * Removing cypress selector from text. * Menu width issue fixed * Default app icon color added * Removing hardcoded colors * Removing hardcoded colors. * Light Mode on! * Showing correct icon and color in menu * Update color working properly. * Updating appIcon * Editable text working. * Adding validator * Adding edit permissions to menu * Removing box shadow on app card. * Fixing context menu fill color * Fixing Menu hover issues. * Fixing menu open close hover issues. * Fixing settings pages * Changed Workspace to org. * Fix: State management in EditableText Component (#540) * Error state height is fixed as per design * savingState prop condition fixed * Fixing createnew. * Fixing saving state for application card. * Fixed application card editable text error. * Fixing issue caused during merge. * Fixing tests in create org. * Removing commented code. * Removing unwanted vars. * Fixing delete duplicate tests. * Latest color palette. * Fixing form and table widget. * Removing switcher from header * Removing unused files * Fixing app card context dropdown * Show overlay fix * Adding localStorage support to theme. * Making dark mode the default. Co-authored-by: Rohit Kumawat <rohit.kumawat@primathon.in>
2020-09-16 11:50:47 +00:00
className={props.className}
>
<input
type="checkbox"
checked={value}
disabled={props.disabled || props.isLoading}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
onChangeHandler(e.target.checked)
}
/>
<span className="slider"></span>
{props.isLoading ? (
<div className="toggle-spinner">
<Spinner />
</div>
) : null}
</StyledToggle>
);
}