| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | 'use client'import React, { useEffect, useState } from 'react'import { Switch as OriginalSwitch } from '@headlessui/react'import classNames from '@/utils/classnames'type SwitchProps = {  onChange?: (value: boolean) => void  beforeChange?: () => void  size?: 'xs' | 'sm' | 'md' | 'lg' | 'l'  defaultValue?: boolean  disabled?: boolean  className?: string}const Switch = (  {    ref: propRef,    onChange,    beforeChange,    size = 'md',    defaultValue = false,    disabled = false,    className,  }: SwitchProps & {    ref: React.RefObject<HTMLButtonElement>;  },) => {  const [enabled, setEnabled] = useState(defaultValue)  useEffect(() => {    setEnabled(defaultValue)  }, [defaultValue])  const wrapStyle = {    lg: 'h-6 w-11',    l: 'h-5 w-9',    md: 'h-4 w-7',    sm: 'h-3 w-5',    xs: 'h-2.5 w-3.5',  }  const circleStyle = {    lg: 'h-5 w-5',    l: 'h-4 w-4',    md: 'h-3 w-3',    sm: 'h-2 w-2',    xs: 'h-1.5 w-1',  }  const translateLeft = {    lg: 'translate-x-5',    l: 'translate-x-4',    md: 'translate-x-3',    sm: 'translate-x-2',    xs: 'translate-x-1.5',  }  const handleBeforeChange = (checked: boolean) => {    if (beforeChange) {      const result: any = beforeChange()      if (result) {        setEnabled(checked)        onChange?.(checked)      }    }    else {      setEnabled(checked)      onChange?.(checked)    }  }  return (    <OriginalSwitch      ref={propRef}      checked={enabled}      onChange={(checked: boolean) => {        if (disabled)          return        handleBeforeChange(checked)      }}      className={classNames(        wrapStyle[size],        enabled ? 'bg-components-toggle-bg' : 'bg-components-toggle-bg-unchecked',        'relative inline-flex  flex-shrink-0 cursor-pointer rounded-[5px] border-2 border-transparent transition-colors duration-200 ease-in-out',        disabled ? '!opacity-50 !cursor-not-allowed' : '',        size === 'xs' && 'rounded-sm',        className,      )}    >      <span        aria-hidden="true"        className={classNames(          circleStyle[size],          enabled ? translateLeft[size] : 'translate-x-0',          size === 'xs' && 'rounded-[1px]',          'pointer-events-none inline-block transform rounded-[3px] bg-components-toggle-knob shadow ring-0 transition duration-200 ease-in-out',        )}      />    </OriginalSwitch>  )}Switch.displayName = 'Switch'export default React.memo(Switch)
 |