react/packages/react-devtools-shared/src/devtools/views/Toggle.js

62 lines
1.2 KiB
JavaScript
Raw Normal View History

2019-02-17 00:29:26 +08:00
// @flow
import React, { useCallback } from 'react';
2019-04-23 23:41:52 +08:00
import Tooltip from '@reach/tooltip';
2019-02-17 00:29:26 +08:00
import styles from './Toggle.css';
2019-04-23 23:41:52 +08:00
import tooltipStyles from './Tooltip.css';
2019-02-17 00:29:26 +08:00
type Props = {
children: React$Node,
className?: string,
isChecked: boolean,
isDisabled?: boolean,
onChange: (isChecked: boolean) => void,
2019-04-08 06:34:35 +08:00
title?: string,
2019-02-17 00:29:26 +08:00
};
export default function Toggle({
children,
className = '',
isDisabled = false,
isChecked,
onChange,
2019-04-08 01:44:11 +08:00
title,
2019-02-17 00:29:26 +08:00
}: Props) {
let defaultClassName;
if (isDisabled) {
defaultClassName = styles.ToggleDisabled;
} else if (isChecked) {
defaultClassName = styles.ToggleOn;
} else {
defaultClassName = styles.ToggleOff;
}
const handleClick = useCallback(() => onChange(!isChecked), [
isChecked,
onChange,
]);
2019-02-17 00:29:26 +08:00
2019-04-21 05:20:48 +08:00
let toggle = (
<button
className={`${defaultClassName} ${className}`}
disabled={isDisabled}
onClick={handleClick}
>
<span className={styles.ToggleContent} tabIndex={-1}>
{children}
</span>
</button>
2019-02-17 00:29:26 +08:00
);
2019-04-21 05:20:48 +08:00
if (title) {
toggle = (
<Tooltip className={tooltipStyles.Tooltip} label={title}>
{toggle}
</Tooltip>
);
}
return toggle;
2019-02-17 00:29:26 +08:00
}