diff --git a/src/components/admin/UserManagementPanel.jsx b/src/components/admin/UserManagementPanel.jsx index fe951d5..f671937 100644 --- a/src/components/admin/UserManagementPanel.jsx +++ b/src/components/admin/UserManagementPanel.jsx @@ -1,9 +1,7 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; import { Panel } from '../UI/Panel'; import { Badge } from '../UI/Badge'; import { Input } from '../UI/Input'; -import { Select } from '../UI/Select'; - import { supabase } from '../../supabaseClient'; @@ -25,17 +23,56 @@ const ROLE_TONES = { driver: 'accent', }; -const useIsMobile = () => { - const [mobile, setMobile] = useState(false); +/* ── Custom dropdown (matches app design system) ── */ +function RoleDropdown({ value, onChange, onClose }) { + const [open, setOpen] = useState(false); + const ref = useRef(null); + useEffect(() => { - const mq = window.matchMedia('(max-width: 640px)'); - setMobile(mq.matches); - const handler = (e) => setMobile(e.matches); - mq.addEventListener('change', handler); - return () => mq.removeEventListener('change', handler); - }, []); - return mobile; -}; + if (!open) return; + const onDown = (e) => { if (ref.current && !ref.current.contains(e.target)) { setOpen(false); onClose?.(); } }; + const onKey = (e) => { if (e.key === 'Escape') { setOpen(false); onClose?.(); } }; + document.addEventListener('pointerdown', onDown); + document.addEventListener('keydown', onKey); + return () => { document.removeEventListener('pointerdown', onDown); document.removeEventListener('keydown', onKey); }; + }, [open, onClose]); + + const pick = (role) => { onChange(role); setOpen(false); }; + + return ( +