Gemini-OS / ParametersPanel.tsx
khulnasoft's picture
Create ParametersPanel.tsx
dfeda2e verified
/**
* @license
* SPDX-License-Identifier: Apache-2.0
*/
/* tslint:disable */
import React, {useEffect, useState} from 'react';
interface ParametersPanelProps {
currentLength: number;
onUpdateHistoryLength: (newLength: number) => void; // Renamed for clarity
onClosePanel: () => void;
isStatefulnessEnabled: boolean;
onSetStatefulness: (enabled: boolean) => void; // Changed to accept a boolean
}
export const ParametersPanel: React.FC<ParametersPanelProps> = ({
currentLength,
onUpdateHistoryLength,
onClosePanel,
isStatefulnessEnabled,
onSetStatefulness,
}) => {
// Local state for pending changes
const [localHistoryLengthInput, setLocalHistoryLengthInput] =
useState<string>(currentLength.toString());
const [localStatefulnessChecked, setLocalStatefulnessChecked] =
useState<boolean>(isStatefulnessEnabled);
// Update local state if props change (e.g., panel re-opened)
useEffect(() => {
setLocalHistoryLengthInput(currentLength.toString());
}, [currentLength]);
useEffect(() => {
setLocalStatefulnessChecked(isStatefulnessEnabled);
}, [isStatefulnessEnabled]);
const handleHistoryLengthInputChange = (
event: React.ChangeEvent<HTMLInputElement>,
) => {
setLocalHistoryLengthInput(event.target.value);
};
const handleStatefulnessCheckboxChange = (
event: React.ChangeEvent<HTMLInputElement>,
) => {
setLocalStatefulnessChecked(event.target.checked);
};
const handleApplyParameters = () => {
// Apply history length
const newLength = parseInt(localHistoryLengthInput, 10);
if (!isNaN(newLength) && newLength >= 0 && newLength <= 10) {
onUpdateHistoryLength(newLength);
} else {
alert('Please enter a number between 0 and 10 for history length.');
setLocalHistoryLengthInput(currentLength.toString()); // Revert local input to original prop on error
return; // Do not proceed to close if there's an error
}
// Apply statefulness if it has changed
if (localStatefulnessChecked !== isStatefulnessEnabled) {
onSetStatefulness(localStatefulnessChecked);
}
onClosePanel(); // Close the panel after applying settings
};
const handleClose = () => {
// Reset local state to reflect original props before closing, ensuring no pending changes carry over visually if panel is quickly reopened
setLocalHistoryLengthInput(currentLength.toString());
setLocalStatefulnessChecked(isStatefulnessEnabled);
onClosePanel();
};
return (
<div className="p-6 bg-gray-50 h-full flex flex-col items-start pt-8">
{/* Interaction History Row */}
<div className="w-full max-w-md mb-6">
<div className="llm-row items-center">
<label
htmlFor="maxHistoryLengthInput"
className="llm-label whitespace-nowrap mr-3 flex-shrink-0"
style={{minWidth: '150px'}}>
Max History Length:
</label>
<input
type="number"
id="maxHistoryLengthInput"
value={localHistoryLengthInput}
onChange={handleHistoryLengthInputChange}
min="0"
max="10"
className="llm-input flex-grow"
aria-describedby="historyLengthHelpText"
/>
</div>
</div>
{/* Statefulness Row */}
<div className="w-full max-w-md mb-4">
<div className="llm-row items-center">
<label
htmlFor="statefulnessCheckbox"
className="llm-label whitespace-nowrap mr-3 flex-shrink-0"
style={{minWidth: '150px'}}>
Enable Statefulness:
</label>
<input
type="checkbox"
id="statefulnessCheckbox"
checked={localStatefulnessChecked}
onChange={handleStatefulnessCheckboxChange}
className="h-5 w-5 text-blue-600 border-gray-300 rounded focus:ring-blue-500 cursor-pointer"
aria-describedby="statefulnessHelpText"
/>
</div>
</div>
{/* Action Buttons */}
<div className="mt-6 w-full max-w-md flex justify-start gap-3">
{' '}
{/* Changed pt-2 to mt-6, justify-end to justify-start */}
<button
onClick={handleApplyParameters}
className="llm-button"
aria-label="Apply all parameter settings and close">
Apply Parameters
</button>
<button
onClick={handleClose}
className="llm-button bg-gray-500 hover:bg-gray-600 active:bg-gray-700"
aria-label="Close parameters panel without applying current changes">
Close Parameters
</button>
</div>
</div>
);
};