import { useEffect, useState } from 'react' import { Slider, Input, Tooltip } from '@janhq/joi' import { useClickOutside } from '@janhq/joi' import { InfoIcon } from 'lucide-react' type Props = { name?: string title: string disabled: boolean description: string min: number max: number step: number value: number onValueChanged: (e: string | number | boolean) => void } const SliderRightPanel = ({ title, disabled, min, max, step, description, value, onValueChanged, }: Props) => { const [showTooltip, setShowTooltip] = useState({ max: false, min: false }) const [val, setVal] = useState(value.toString()) useClickOutside(() => setShowTooltip({ max: false, min: false }), null, []) useEffect(() => { setVal(value.toString()) }, [value]) return (

{title}

} content={description} />
{ onValueChanged?.(Number(e[0])) setVal(e[0].toString()) }} min={min} max={max} step={step} disabled={disabled} />

{min}

{max}

{ if (Number(e.target.value) > Number(max)) { onValueChanged?.(Number(max)) setVal(max.toString()) setShowTooltip({ max: true, min: false }) } else if ( Number(e.target.value) < Number(min) || !e.target.value.length ) { onValueChanged?.(Number(min)) setVal(min.toString()) setShowTooltip({ max: false, min: true }) } else { setVal(Number(e.target.value).toString()) // There is a case .5 but not 0.5 } }} onChange={(e) => { // TODO: How to support negative number input? // Passthru since it validates again onBlur if (/^\d*\.?\d*$/.test(e.target.value)) { setVal(e.target.value) } // Should not accept invalid value or NaN // E.g. anything changes that trigger onValueChanged // Which is incorrect if ( Number(e.target.value) > Number(max) || Number(e.target.value) < Number(min) || Number.isNaN(Number(e.target.value)) ) { return } onValueChanged?.(Number(e.target.value)) }} /> } content={ <> {showTooltip.max && ( Automatically set to the maximum allowed tokens )} {showTooltip.min && ( Automatically set to the minimum allowed tokens )} } />
) } export default SliderRightPanel