import type { FC, ReactNode } from 'react' import { useEffect, useState } from 'react' import cn from '@/utils/classnames' import Badge, { BadgeState } from '@/app/components/base/badge/index' import { useInstalledPluginList } from '@/service/use-plugins' type Option = { value: string text: ReactNode } type TabSliderProps = { className?: string value: string onChange: (v: string) => void options: Option[] } const TabSlider: FC = ({ className, value, onChange, options, }) => { const [activeIndex, setActiveIndex] = useState(options.findIndex(option => option.value === value)) const [sliderStyle, setSliderStyle] = useState({}) const { data: pluginList } = useInstalledPluginList() const updateSliderStyle = (index: number) => { const tabElement = document.getElementById(`tab-${index}`) if (tabElement) { const { offsetLeft, offsetWidth } = tabElement setSliderStyle({ transform: `translateX(${offsetLeft}px)`, width: `${offsetWidth}px`, }) } } useEffect(() => { const newIndex = options.findIndex(option => option.value === value) setActiveIndex(newIndex) updateSliderStyle(newIndex) }, [value, options, pluginList]) return (
{options.map((option, index) => (
{ if (index !== activeIndex) { onChange(option.value) updateSliderStyle(index) } }} > {option.text} {/* if no plugin installed, the badge won't show */} {option.value === 'plugins' && (pluginList?.plugins.length ?? 0) > 0 && {pluginList?.plugins.length} }
))}
) } export default TabSlider