* feat: setup settings page boilerplate * feat: split view into halves * feat: add preview for Customization Options section * feat: add OptionStore logic and LD icon * feat: add courseStatusChips functionality * feat: migrate experimental settings to proper settings * feat: center Preview children and add className override * feat: add GitHub stats * feat: open GitHub user profile onclick * feat: get user GitHub stats * feat: refactor into useGitHubStats hook * feat: toggle GitHub stats when the user presses the 'S' key * chore: update title * fix: remove extra file * feat: refactor and add DialogProvider * fix: import * test: this commit has issues * fix: no schedule bug * fix: longhorn developers icon not rendering in prod builds * feat(pr-review): fix UI and comment out experimental code * chore: run lint and prettier * feat: add responsive design * feat: use @octokit/rest and fix GitHub stats
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { Switch } from '@headlessui/react';
|
|
import React, { useEffect, useState } from 'react';
|
|
|
|
type ToggleSwitchProps = {
|
|
isChecked?: boolean;
|
|
onChange?: (checked: boolean) => void;
|
|
};
|
|
|
|
/**
|
|
* A custom switch button component.
|
|
*
|
|
* @component
|
|
* @param {Object} props - The component props.
|
|
* @param {boolean} [props.isChecked=true] - The initial checked state of the switch button.
|
|
* @param {Function} props.onChange - The callback function to be called when the switch button is toggled.
|
|
* @returns {JSX.Element} The rendered SwitchButton component.
|
|
*/
|
|
const SwitchButton = ({ isChecked = true, onChange }: ToggleSwitchProps): JSX.Element => {
|
|
const [enabled, setEnabled] = useState(isChecked);
|
|
|
|
useEffect(() => {
|
|
setEnabled(isChecked);
|
|
}, [isChecked]);
|
|
|
|
const handleChange = (checked: boolean) => {
|
|
setEnabled(checked);
|
|
if (onChange) {
|
|
onChange(checked);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Switch
|
|
checked={enabled}
|
|
onChange={handleChange}
|
|
className={`${enabled ? 'bg-[#579D42]' : 'bg-gray-400'}
|
|
relative inline-flex items-center h-8 w-13 rounded-full transition-colors ease-in-out duration-200 min-w-[52px]`}
|
|
>
|
|
<span
|
|
className={`${enabled ? 'translate-x-6' : 'translate-x-1'}
|
|
inline-block w-6 h-6 transform bg-white rounded-full transition-transform ease-in-out duration-200`}
|
|
/>
|
|
</Switch>
|
|
);
|
|
};
|
|
|
|
export default SwitchButton;
|