|
@@ -3,13 +3,10 @@
|
|
|
// of the Apache-2.0 license. See the LICENSE file for details.
|
|
|
|
|
|
import React, { useCallback } from 'react';
|
|
|
-import SUICheckbox from 'semantic-ui-react/dist/commonjs/modules/Checkbox';
|
|
|
import styled from 'styled-components';
|
|
|
|
|
|
interface Props {
|
|
|
- asSwitch?: boolean;
|
|
|
className?: string;
|
|
|
- defaultValue?: boolean;
|
|
|
isDisabled?: boolean;
|
|
|
label: React.ReactNode;
|
|
|
onChange?: (isChecked: boolean) => void;
|
|
@@ -17,49 +14,78 @@ interface Props {
|
|
|
value?: boolean;
|
|
|
}
|
|
|
|
|
|
-function Toggle ({ asSwitch = true, className = '', defaultValue, isDisabled, label, onChange, preventDefault, value }: Props): React.ReactElement<Props> {
|
|
|
- const _onChange = useCallback(
|
|
|
- (event: React.FormEvent<HTMLInputElement>, { checked }: any): void => {
|
|
|
- if (preventDefault) {
|
|
|
- event.preventDefault();
|
|
|
- event.stopPropagation();
|
|
|
- }
|
|
|
+function Toggle ({ className = '', isDisabled, label, onChange, preventDefault, value }: Props): React.ReactElement<Props> {
|
|
|
+ const _onClick = useCallback(
|
|
|
+ (event: React.MouseEvent<HTMLDivElement, MouseEvent>): void => {
|
|
|
+ if (!isDisabled) {
|
|
|
+ if (preventDefault) {
|
|
|
+ event.preventDefault();
|
|
|
+ event.stopPropagation();
|
|
|
+ }
|
|
|
|
|
|
- onChange && onChange(checked);
|
|
|
+ onChange && onChange(!value);
|
|
|
+ }
|
|
|
},
|
|
|
- [onChange, preventDefault]
|
|
|
+ [isDisabled, onChange, preventDefault, value]
|
|
|
);
|
|
|
|
|
|
return (
|
|
|
- <div className={`ui--Toggle ${asSwitch ? 'isToggle' : 'isCheckbox'} ${className}`}>
|
|
|
- <label>{label}</label>
|
|
|
- <SUICheckbox
|
|
|
- checked={value}
|
|
|
- defaultChecked={defaultValue}
|
|
|
- disabled={isDisabled}
|
|
|
- onChange={_onChange}
|
|
|
- toggle={asSwitch}
|
|
|
- />
|
|
|
+ <div
|
|
|
+ className={`ui--Toggle${value ? ' isChecked' : ''}${isDisabled ? ' isDisabled' : ''} ${className}`}
|
|
|
+ onClick={_onClick}
|
|
|
+ >
|
|
|
+ {label && <label>{label}</label>}
|
|
|
+ <div className='ui--Toggle-Slider' />
|
|
|
</div>
|
|
|
);
|
|
|
}
|
|
|
|
|
|
export default React.memo(styled(Toggle)`
|
|
|
> label {
|
|
|
+ color: rgba(78, 78, 78, 0.75);
|
|
|
display: inline-block;
|
|
|
margin: 0 0.5rem;
|
|
|
}
|
|
|
|
|
|
> label,
|
|
|
- > .ui.checkbox {
|
|
|
+ > div {
|
|
|
vertical-align: middle;
|
|
|
}
|
|
|
|
|
|
- .ui.checkbox + label {
|
|
|
- color: rgba(78, 78, 78, 0.75);
|
|
|
+ .ui--Toggle-Slider {
|
|
|
+ border-radius: 1.5rem;
|
|
|
+ display: inline-block;
|
|
|
+ position: relative;
|
|
|
+ cursor: pointer;
|
|
|
+ background-color: #eee;
|
|
|
+ width: 3rem;
|
|
|
+ height: 1.5rem;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ border: 0.125rem solid #eee;
|
|
|
+ border-radius: 50%;
|
|
|
+ position: absolute;
|
|
|
+ content: "";
|
|
|
+ height: 1.5rem;
|
|
|
+ width: 1.5rem;
|
|
|
+ left: 0;
|
|
|
+ top: 0rem;
|
|
|
+ background-color: white;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &.not(.isDisabled) .ui--Toggle-Slider {
|
|
|
+ cursor: pointer;
|
|
|
}
|
|
|
|
|
|
- &.isCheckbox label {
|
|
|
- opacity: 1 !important;
|
|
|
+ &.isChecked {
|
|
|
+ .ui--Toggle-Slider {
|
|
|
+ background: #2196F3;
|
|
|
+
|
|
|
+ &:before {
|
|
|
+ border-color: #2196F3;
|
|
|
+ transform: translateX(1.5rem);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
`);
|