|
1 | 1 | import './ToggleSwitch.scss'; |
2 | | -import { useState } from 'react'; |
| 2 | +import { useEffect, useState } from 'react'; |
3 | 3 | import { motion } from 'framer-motion'; |
4 | 4 |
|
5 | | -import { SPRING_VARIANTS } from '../../../utilities/constants'; |
6 | | -import { RootService } from '../../../services/http.service'; |
7 | | -import { setConfig } from '../../../store/rootSlice'; |
8 | | -import { useDispatch, useSelector } from 'react-redux'; |
9 | | -import { selectAppConfig } from '../../../store/rootSelectors'; |
| 5 | +import { BOUNCY_SPRING_VARIANTS_1 } from '../../../utilities/constants'; |
10 | 6 |
|
11 | | -const ToggleSwitch = props => { |
12 | | - const dispatch = useDispatch(); |
13 | | - const [isSwitchOn, setIsSwitchOn] = useState(props.selValue === props.values[1]); |
14 | | - const appConfig = useSelector(selectAppConfig); |
15 | | - |
16 | | - const changeValueHandler = async() => { |
17 | | - setIsSwitchOn((prevValue) => !prevValue); |
18 | | - const currValue = isSwitchOn ? 0 : 1; |
19 | | - const updatedConfig = { |
20 | | - ...appConfig, |
21 | | - uiConfig: { |
22 | | - ...appConfig.uiConfig, |
23 | | - unit: props.values[currValue] |
24 | | - } |
25 | | - }; |
26 | | - await RootService.updateConfig(updatedConfig); |
27 | | - dispatch(setConfig(updatedConfig)); |
| 7 | +const ToggleSwitch = ({ |
| 8 | + values, |
| 9 | + selIndex, |
| 10 | + onChange, |
| 11 | + className = '', |
| 12 | + disabled = false, |
| 13 | +}: { |
| 14 | + values: (string | React.ReactNode)[]; |
| 15 | + selIndex: number; |
| 16 | + onChange: (index: number) => void; |
| 17 | + className?: string; |
| 18 | + disabled?: boolean; |
| 19 | +}) => { |
| 20 | + const [isSwitchOn, setIsSwitchOn] = useState(selIndex === 1); |
| 21 | + |
| 22 | + useEffect(() => { |
| 23 | + setIsSwitchOn(selIndex === 1); |
| 24 | + }, [selIndex]); |
| 25 | + |
| 26 | + const changeValueHandler = () => { |
| 27 | + if (disabled) return; |
| 28 | + const nextIndex = isSwitchOn ? 0 : 1; |
| 29 | + setIsSwitchOn(!isSwitchOn); |
| 30 | + onChange(nextIndex); |
28 | 31 | }; |
29 | 32 |
|
30 | 33 | return ( |
31 | 34 | <div |
32 | | - className={'fs-7 toggle ' + (props.className ? props.className : '')} |
| 35 | + className={'fs-7 toggle ' + (className ? className : '') + (disabled ? ' toggle-disabled' : '')} |
33 | 36 | data-isswitchon={isSwitchOn} |
34 | 37 | onClick={changeValueHandler} |
35 | 38 | data-testid="toggle-switch" |
| 39 | + aria-disabled={disabled} |
36 | 40 | > |
37 | 41 | <div className="toggle-bg-text px-2 d-flex flex-fill align-items-center justify-content-between"> |
38 | | - <span className="text-center me-2">{props.values[0]}</span> |
39 | | - <span className="text-center ms-2">{props.values[1]}</span> |
| 42 | + <span>{values[0]}</span> |
| 43 | + <span className="me-1">{values[1]}</span> |
40 | 44 | </div> |
41 | 45 | <motion.div |
42 | 46 | layout |
43 | | - transition={SPRING_VARIANTS} |
| 47 | + transition={BOUNCY_SPRING_VARIANTS_1} |
44 | 48 | className={ |
45 | | - 'toggle-switch justify-content-center d-flex align-items-center ' + |
| 49 | + 'toggle-switch d-flex align-items-center justify-content-center ' + |
46 | 50 | (isSwitchOn ? 'toggle-right' : 'toggle-left') |
47 | 51 | } |
48 | 52 | > |
49 | | - <span>{props.selValue}</span> |
| 53 | + <span>{isSwitchOn ? values[1] : values[0]}</span> |
50 | 54 | </motion.div> |
51 | 55 | </div> |
52 | 56 | ); |
|
0 commit comments