-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathSwitch.tsx
More file actions
130 lines (118 loc) · 2.87 KB
/
Switch.tsx
File metadata and controls
130 lines (118 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import * as React from 'react';
import {
NativeModules,
Platform,
StyleProp,
Switch as NativeSwitch,
ViewStyle,
} from 'react-native';
import { getSwitchColor } from './utils';
import { useInternalTheme } from '../../core/theming';
import type { ThemeProp } from '../../types';
const version = NativeModules.PlatformConstants
? NativeModules.PlatformConstants.reactNativeVersion
: undefined;
export type Props = React.ComponentPropsWithRef<typeof NativeSwitch> & {
/**
* Disable toggling the switch.
*/
disabled?: boolean;
/**
* Value of the switch, true means 'on', false means 'off'.
*/
value?: boolean;
/**
* Custom color for switch.
*/
color?: string;
/**
* Callback called with the new value when it changes.
*/
onValueChange?: Function;
style?: StyleProp<ViewStyle>;
/**
* @optional
*/
theme?: ThemeProp;
};
/**
* Switch is a visual toggle between two mutually exclusive states — on and off.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Switch } from 'react-native-paper';
*
* const MyComponent = () => {
* const [isSwitchOn, setIsSwitchOn] = React.useState(false);
*
* const onToggleSwitch = () => setIsSwitchOn(!isSwitchOn);
*
* return <Switch value={isSwitchOn} onValueChange={onToggleSwitch} />;
* };
*
* export default MyComponent;
* ```
*/
const Switch = ({
value,
disabled,
onValueChange,
color,
theme: themeOverrides,
...rest
}: Props) => {
const theme = useInternalTheme(themeOverrides);
// Internal state is needed to fix #4789 where Switch is inside a Portal
const [internalValue, setInternalValue] = React.useState<boolean>(() =>
typeof value === 'boolean' ? value : false
);
React.useEffect(() => {
if (typeof value === 'boolean' && value !== internalValue) {
setInternalValue(value);
}
}, [value, internalValue]);
const { checkedColor, onTintColor, thumbTintColor } = getSwitchColor({
theme,
disabled,
value: internalValue,
color,
});
const handleValueChange = React.useCallback(
(newValue: boolean) => {
setInternalValue(newValue);
onValueChange?.(newValue);
},
[onValueChange]
);
const props =
version && version.major === 0 && version.minor <= 56
? {
onTintColor,
thumbTintColor,
}
: Platform.OS === 'web'
? {
activeTrackColor: onTintColor,
thumbColor: thumbTintColor,
activeThumbColor: checkedColor,
}
: {
thumbColor: thumbTintColor,
trackColor: {
true: onTintColor,
false: onTintColor,
},
};
return (
<NativeSwitch
value={internalValue}
disabled={disabled}
onValueChange={disabled ? undefined : handleValueChange}
{...props}
{...rest}
/>
);
};
Switch.displayName = 'Switch';
export default Switch;