Skip to content

Commit e27c14c

Browse files
committed
feat: fixed only one dropdown is open at a time in the sidebar
1 parent 8642f83 commit e27c14c

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

pages/tools/components/SearchBar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ const SearchBar = ({ transform }: { transform: Transform }) => {
1717
<div className='relative'>
1818
<input
1919
type='text'
20-
className='w-full px-4 py-2 border dark:border-slate-900 rounded-md shadow-sm focus:outline-none focus:ring focus:border-blue-300 bg-slate-800 text-white dark:bg-slate-900 hover:scale-[0.94] transition-all duration-200'
20+
className='w-full px-4 py-2 border rounded-md shadow-sm focus:outline-none focus:ring bg-slate-800 text-white dark:border-slate-900 focus:border-blue-300 dark:bg-slate-900 transition-all duration-200'
2121
placeholder='Search'
2222
name='query'
2323
value={query}
2424
onChange={changeHandler}
2525
style={{
26-
transition: 'all 0.2s ease-in-out !important',
26+
transition: 'all 0.2s ease-in-out',
2727
}}
2828
/>
2929
</div>

pages/tools/components/Sidebar.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { Dispatch, SetStateAction, useRef } from 'react';
1+
import React, { Dispatch, SetStateAction, useRef, useState } from 'react';
22
import LanguageIcon from '~/public/icons/language.svg';
33
import ToolingIcon from '~/public/icons/tooling.svg';
44
import EnvironmentIcon from '~/public/icons/environment.svg';
@@ -36,6 +36,7 @@ export default function Sidebar({
3636
setIsSidebarOpen,
3737
}: SidebarProps) {
3838
const filterFormRef = useRef<HTMLFormElement>(null);
39+
const [activeDropdown, setActiveDropdown] = useState<string | null>(null);
3940

4041
const filters = [
4142
{ label: 'Language', accessorKey: 'languages' },
@@ -96,8 +97,11 @@ export default function Sidebar({
9697
return (
9798
<DropdownMenu
9899
key={accessorKey}
100+
id={accessorKey}
99101
label={label}
100102
icon={<IconComponent />}
103+
activeDropdown={activeDropdown}
104+
setActiveDropdown={setActiveDropdown}
101105
>
102106
{filterCriteria[accessorKey as FilterCriteriaFields]
103107
?.map(String)

pages/tools/components/ui/DropdownMenu.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,39 @@ import React, {
44
type ReactElement,
55
type ReactNode,
66
useEffect,
7-
useState,
87
} from 'react';
98

109
interface DropdownMenuProps {
1110
children: ReactNode;
1211
label: string;
1312
icon: ReactElement;
13+
id: string;
14+
activeDropdown: string | null;
15+
setActiveDropdown: (id: string | null) => void;
1416
}
1517

1618
export default function DropdownMenu({
1719
children,
1820
label,
1921
icon,
22+
id,
23+
activeDropdown,
24+
setActiveDropdown,
2025
}: DropdownMenuProps) {
21-
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
26+
const isDropdownOpen = activeDropdown === id;
2227
const router = useRouter();
2328

2429
useEffect(() => {
25-
setIsDropdownOpen(false);
26-
}, [router]);
30+
setActiveDropdown(null);
31+
}, [router, setActiveDropdown]);
32+
33+
const toggleDropdown = () => {
34+
if (isDropdownOpen) {
35+
setActiveDropdown(null);
36+
} else {
37+
setActiveDropdown(id);
38+
}
39+
};
2740

2841
return (
2942
<div
@@ -34,9 +47,7 @@ export default function DropdownMenu({
3447
>
3548
<div
3649
className='w-full flex justify-between items-center align-middle cursor-pointer group'
37-
onClick={() => {
38-
setIsDropdownOpen((prev) => !prev);
39-
}}
50+
onClick={toggleDropdown}
4051
>
4152
{React.cloneElement(icon, {
4253
className: 'mr-2 ml-2 group-hover:scale-60 transition-all duration-200',

0 commit comments

Comments
 (0)