main
js 67 lines 1.37 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @flow
8 */
9
10 import * as React from 'react';
11 import {useCallback} from 'react';
12
13 import styles from './Toggle.css';
14 import Tooltip from './Components/reach-ui/tooltip';
15
16 type Props = {
17 children: React$Node,
18 className?: string,
19 isChecked: boolean,
20 isDisabled?: boolean,
21 onChange: (isChecked: boolean) => void,
22 testName?: ?string,
23 title?: string,
24 ...
25 };
26
27 export default function Toggle({
28 children,
29 className = '',
30 isDisabled = false,
31 isChecked,
32 onChange,
33 testName,
34 title,
35 }: Props): React.Node {
36 let defaultClassName;
37 if (isDisabled) {
38 defaultClassName = styles.ToggleDisabled;
39 } else if (isChecked) {
40 defaultClassName = styles.ToggleOn;
41 } else {
42 defaultClassName = styles.ToggleOff;
43 }
44
45 const handleClick = useCallback(
46 () => onChange(!isChecked),
47 [isChecked, onChange],
48 );
49
50 let toggle = (
51 <button
52 className={`${defaultClassName} ${className}`}
53 data-testname={testName}
54 disabled={isDisabled}
55 onClick={handleClick}>
56 <span className={styles.ToggleContent} tabIndex={-1}>
57 {children}
58 </span>
59 </button>
60 );
61
62 if (title) {
63 toggle = <Tooltip label={title}>{toggle}</Tooltip>;
64 }
65
66 return toggle;
67 }