From c12f7dd59380412c06add097c0679d12aa64e7af Mon Sep 17 00:00:00 2001 From: seanderoo Date: Wed, 8 Jul 2026 11:46:37 +0200 Subject: [PATCH] refactor AccountMenu to use Dropdown component for improved structure and maintainability --- frontend/src/components/AccountMenu.tsx | 154 ++++++++++++++---------- 1 file changed, 92 insertions(+), 62 deletions(-) diff --git a/frontend/src/components/AccountMenu.tsx b/frontend/src/components/AccountMenu.tsx index 9fdb3bc..da26ce1 100644 --- a/frontend/src/components/AccountMenu.tsx +++ b/frontend/src/components/AccountMenu.tsx @@ -1,24 +1,19 @@ -import { useEffect, useRef, useState } from "react"; -import { Info, KeyRound, LogOut, Menu, MessageSquare, Moon, Sun, Trash2, UserPlus, X } from "lucide-react"; +import { useEffect, useRef, useState, type ReactNode } from "react"; +import { CircleUser, Info, KeyRound, LogOut, Menu, MessageSquare, Moon, Sun, Trash2, UserPlus, X } from "lucide-react"; -export default function AccountMenu({ - dark, - onToggleDark, - onInvite, - onChangePassword, - onFeedback, - onAbout, - onLogout, - onDeleteAccount +const itemClass = + "flex w-full items-center gap-2 px-4 py-2.5 text-left text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-800"; + +function Dropdown({ + label, + icon, + openIcon, + children }: { - dark: boolean; - onToggleDark: () => void; - onInvite: () => void; - onChangePassword: () => void; - onFeedback: () => void; - onAbout: () => void; - onLogout: () => void; - onDeleteAccount: () => void; + label: string; + icon: ReactNode; + openIcon?: ReactNode; + children: (close: () => void) => ReactNode; }) { const [open, setOpen] = useState(false); const menuRef = useRef(null); @@ -41,62 +36,97 @@ export default function AccountMenu({ }; }, [open]); - const select = (action: () => void) => () => { - setOpen(false); - action(); - }; - - const itemClass = - "flex w-full items-center gap-2 px-4 py-2.5 text-left text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-800"; - return (
{open && (
- - - - - - -
- + {children(() => setOpen(false))}
)}
); } + +export default function AccountMenu({ + dark, + onToggleDark, + onInvite, + onChangePassword, + onFeedback, + onAbout, + onLogout, + onDeleteAccount +}: { + dark: boolean; + onToggleDark: () => void; + onInvite: () => void; + onChangePassword: () => void; + onFeedback: () => void; + onAbout: () => void; + onLogout: () => void; + onDeleteAccount: () => void; +}) { + const select = (close: () => void, action: () => void) => () => { + close(); + action(); + }; + + return ( +
+ }> + {(close) => ( + <> + +
+ + + )} + + } openIcon={}> + {(close) => ( + <> + + + + + + + )} + +
+ ); +}