|
import { FC, useContext, useState } from 'react'; |
|
|
|
import { useTranslation } from 'next-i18next'; |
|
|
|
import { DEFAULT_TEMPERATURE } from '@/utils/app/const'; |
|
|
|
import HomeContext from '@/pages/api/home/home.context'; |
|
|
|
interface Props { |
|
label: string; |
|
onChangeTemperature: (temperature: number) => void; |
|
} |
|
|
|
export const TemperatureSlider: FC<Props> = ({ |
|
label, |
|
onChangeTemperature, |
|
}) => { |
|
const { |
|
state: { conversations }, |
|
} = useContext(HomeContext); |
|
const lastConversation = conversations[conversations.length - 1]; |
|
const [temperature, setTemperature] = useState( |
|
lastConversation?.temperature ?? DEFAULT_TEMPERATURE, |
|
); |
|
const { t } = useTranslation('chat'); |
|
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { |
|
const newValue = parseFloat(event.target.value); |
|
setTemperature(newValue); |
|
onChangeTemperature(newValue); |
|
}; |
|
|
|
return ( |
|
<div className="flex flex-col"> |
|
<label className="mb-2 text-left text-neutral-700 dark:text-neutral-400"> |
|
{label} |
|
</label> |
|
<span className="text-[12px] text-black/50 dark:text-white/50 text-sm"> |
|
{t( |
|
'Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.', |
|
)} |
|
</span> |
|
<span className="mt-2 mb-1 text-center text-neutral-900 dark:text-neutral-100"> |
|
{temperature.toFixed(1)} |
|
</span> |
|
<input |
|
className="cursor-pointer" |
|
type="range" |
|
min={0} |
|
max={1} |
|
step={0.1} |
|
value={temperature} |
|
onChange={handleChange} |
|
/> |
|
<ul className="w mt-2 pb-8 flex justify-between px-[24px] text-neutral-900 dark:text-neutral-100"> |
|
<li className="flex justify-center"> |
|
<span className="absolute">{t('Precise')}</span> |
|
</li> |
|
<li className="flex justify-center"> |
|
<span className="absolute">{t('Neutral')}</span> |
|
</li> |
|
<li className="flex justify-center"> |
|
<span className="absolute">{t('Creative')}</span> |
|
</li> |
|
</ul> |
|
</div> |
|
); |
|
}; |
|
|