ui: settings v2 click anywhere to exit models bottom bar (#1997)

This commit is contained in:
Lily Delalande
2025-04-01 21:10:10 -04:00
committed by GitHub
parent a2169932dc
commit d61aa77b52
@@ -1,6 +1,6 @@
import { ChevronDown, ChevronUp } from '../../../icons'; import { ChevronDown, ChevronUp } from '../../../icons';
import { Sliders } from 'lucide-react'; import { Sliders } from 'lucide-react';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState, useRef } from 'react';
import { useConfig } from '../../../ConfigContext'; import { useConfig } from '../../../ConfigContext';
import { getCurrentModelAndProviderForDisplay } from '../index'; import { getCurrentModelAndProviderForDisplay } from '../index';
import { AddModelModal } from '../subcomponents/AddModelModal'; import { AddModelModal } from '../subcomponents/AddModelModal';
@@ -16,6 +16,7 @@ export default function ModelsBottomBar({ dropdownRef, setView }: ModelsBottomBa
const [provider, setProvider] = useState<string | null>(null); const [provider, setProvider] = useState<string | null>(null);
const [model, setModel] = useState<string>(''); const [model, setModel] = useState<string>('');
const [isAddModelModalOpen, setIsAddModelModalOpen] = useState(false); const [isAddModelModalOpen, setIsAddModelModalOpen] = useState(false);
const menuRef = useRef<HTMLDivElement>(null);
useEffect(() => { useEffect(() => {
(async () => { (async () => {
@@ -28,8 +29,28 @@ export default function ModelsBottomBar({ dropdownRef, setView }: ModelsBottomBa
})(); })();
}, [read, getProviders]); }, [read, getProviders]);
// Add click outside handler
useEffect(() => {
function handleClickOutside(event: MouseEvent) {
if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
setIsModelMenuOpen(false);
}
}
// Add the event listener when the menu is open
if (isModelMenuOpen) {
document.addEventListener('mousedown', handleClickOutside);
}
// Clean up the event listener
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, [isModelMenuOpen]);
return ( return (
<div className="relative flex items-center ml-auto mr-4" ref={dropdownRef}> <div className="relative flex items-center ml-auto mr-4" ref={dropdownRef}>
<div ref={menuRef} className="relative">
<div <div
className="flex items-center cursor-pointer" className="flex items-center cursor-pointer"
onClick={() => setIsModelMenuOpen(!isModelMenuOpen)} onClick={() => setIsModelMenuOpen(!isModelMenuOpen)}
@@ -64,6 +85,8 @@ export default function ModelsBottomBar({ dropdownRef, setView }: ModelsBottomBa
</div> </div>
</div> </div>
)} )}
</div>
{isAddModelModalOpen ? ( {isAddModelModalOpen ? (
<AddModelModal setView={setView} onClose={() => setIsAddModelModalOpen(false)} /> <AddModelModal setView={setView} onClose={() => setIsAddModelModalOpen(false)} />
) : null} ) : null}