| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 'use client' | 
					
						
							| 
									
										
										
										
											2023-06-06 14:58:56 +08:00
										 |  |  | import React, { useEffect, useState } from 'react' | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | import classNames from 'classnames' | 
					
						
							|  |  |  | import { Switch as OriginalSwitch } from '@headlessui/react' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type SwitchProps = { | 
					
						
							|  |  |  |   onChange: (value: boolean) => void | 
					
						
							| 
									
										
										
										
											2023-08-12 00:57:13 +08:00
										 |  |  |   size?: 'md' | 'lg' | 'l' | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   defaultValue?: boolean | 
					
						
							|  |  |  |   disabled?: boolean | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Switch = ({ onChange, size = 'lg', defaultValue = false, disabled = false }: SwitchProps) => { | 
					
						
							|  |  |  |   const [enabled, setEnabled] = useState(defaultValue) | 
					
						
							| 
									
										
										
										
											2023-06-06 14:58:56 +08:00
										 |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     setEnabled(defaultValue) | 
					
						
							|  |  |  |   }, [defaultValue]) | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   const wrapStyle = { | 
					
						
							|  |  |  |     lg: 'h-6 w-11', | 
					
						
							| 
									
										
										
										
											2023-08-12 00:57:13 +08:00
										 |  |  |     l: 'h-5 w-9', | 
					
						
							| 
									
										
										
										
											2023-06-06 14:58:56 +08:00
										 |  |  |     md: 'h-4 w-7', | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const circleStyle = { | 
					
						
							|  |  |  |     lg: 'h-5 w-5', | 
					
						
							| 
									
										
										
										
											2023-08-12 00:57:13 +08:00
										 |  |  |     l: 'h-4 w-4', | 
					
						
							| 
									
										
										
										
											2023-06-06 14:58:56 +08:00
										 |  |  |     md: 'h-3 w-3', | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const translateLeft = { | 
					
						
							|  |  |  |     lg: 'translate-x-5', | 
					
						
							| 
									
										
										
										
											2023-08-12 00:57:13 +08:00
										 |  |  |     l: 'translate-x-4', | 
					
						
							| 
									
										
										
										
											2023-06-06 14:58:56 +08:00
										 |  |  |     md: 'translate-x-3', | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   } | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <OriginalSwitch | 
					
						
							|  |  |  |       checked={enabled} | 
					
						
							|  |  |  |       onChange={(checked: boolean) => { | 
					
						
							| 
									
										
										
										
											2023-06-06 14:58:56 +08:00
										 |  |  |         if (disabled) | 
					
						
							|  |  |  |           return | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         setEnabled(checked) | 
					
						
							|  |  |  |         onChange(checked) | 
					
						
							|  |  |  |       }} | 
					
						
							|  |  |  |       className={classNames( | 
					
						
							|  |  |  |         wrapStyle[size], | 
					
						
							|  |  |  |         enabled ? 'bg-blue-600' : 'bg-gray-200', | 
					
						
							|  |  |  |         'relative inline-flex  flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out', | 
					
						
							|  |  |  |         disabled ? '!opacity-50 !cursor-not-allowed' : '', | 
					
						
							|  |  |  |       )} | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <span | 
					
						
							|  |  |  |         aria-hidden="true" | 
					
						
							|  |  |  |         className={classNames( | 
					
						
							|  |  |  |           circleStyle[size], | 
					
						
							|  |  |  |           enabled ? translateLeft[size] : 'translate-x-0', | 
					
						
							|  |  |  |           'pointer-events-none inline-block transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out', | 
					
						
							|  |  |  |         )} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </OriginalSwitch> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | export default React.memo(Switch) |