openreplay/frontend/app/components/ui/ToggleButton/ToggleButton.tsx
Andrey Babushkin fd5c0c9747
Add lokalisation (#3092)
* applied eslint

* add locales and lint the project

* removed error boundary

* updated locales

* fix min files

* fix locales
2025-03-06 17:43:15 +01:00

95 lines
2 KiB
TypeScript

import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
function CheckedIcon() {
return <>🌜</>;
}
function UncheckedIcon() {
return <>🌞</>;
}
function ToggleButton(props) {
const [toggle, setToggle] = useState(false);
const { defaultChecked, onChange, disabled, className } = props;
useEffect(() => {
if (defaultChecked) {
setToggle(defaultChecked);
}
}, [defaultChecked]);
const triggerToggle = () => {
if (disabled) {
return;
}
setToggle(!toggle);
if (typeof onChange === 'function') {
onChange(!toggle);
}
};
const getIcon = (type) => {
const { icons } = props;
if (!icons) {
return null;
}
return icons[type] === undefined
? ToggleButton.defaultProps.icons[type]
: icons[type];
};
const toggleClasses = classNames(
'wrg-toggle',
{
'wrg-toggle--checked': toggle,
'wrg-toggle--disabled': disabled,
},
className,
);
return (
<div onClick={triggerToggle} className={toggleClasses}>
<div className="wrg-toggle-container">
<div className="wrg-toggle-check">
<span>{getIcon('checked')}</span>
</div>
<div className="wrg-toggle-uncheck">
<span>{getIcon('unchecked')}</span>
</div>
</div>
<div className="wrg-toggle-circle" />
<input
type="checkbox"
aria-label="Toggle Button"
className="wrg-toggle-input"
/>
</div>
);
}
ToggleButton.defaultProps = {
icons: {
checked: <CheckedIcon />,
unchecked: <UncheckedIcon />,
},
};
ToggleButton.propTypes = {
disabled: PropTypes.bool,
defaultChecked: PropTypes.bool,
className: PropTypes.string,
onChange: PropTypes.func,
icons: PropTypes.oneOfType([
PropTypes.bool,
PropTypes.shape({
checked: PropTypes.node,
unchecked: PropTypes.node,
}),
]),
};
export default ToggleButton;