import { useEffect, useState } from 'react'; import { useRoleStore, type Role } from '../stores/role.ts'; import type { User } from '../stores/auth.ts'; import { usePermissions } from '../lib/usePermissions.ts'; interface MemberRoleAssignProps { serverId: string; member: User; allMembers?: User[]; } export function MemberRoleAssign({ serverId, member }: MemberRoleAssignProps) { const roles = useRoleStore((s) => s.roles); const fetchRoles = useRoleStore((s) => s.fetchRoles); const setMemberRoles = useRoleStore((s) => s.setMemberRoles); const getMemberRoles = useRoleStore((s) => s.getMemberRoles); const { isOwner, canManageRoles } = usePermissions(serverId); const canEdit = isOwner || canManageRoles; const [open, setOpen] = useState(false); const [memberRoles, setMemberRolesState] = useState([]); const [selectedIds, setSelectedIds] = useState>(new Set()); const [saving, setSaving] = useState(false); useEffect(() => { if (serverId) fetchRoles(serverId); }, [serverId, fetchRoles]); useEffect(() => { if (!open || !serverId) return; (async () => { const mRoles = await getMemberRoles(serverId, member.id); setMemberRolesState(mRoles); setSelectedIds(new Set(mRoles.map((r) => r.id))); })(); }, [open, serverId, member.id, getMemberRoles]); const assignableRoles = roles.filter((r) => !r.is_default); const handleToggle = (roleId: string) => { setSelectedIds((prev) => { const next = new Set(prev); if (next.has(roleId)) { next.delete(roleId); } else { next.add(roleId); } return next; }); }; const handleSave = async () => { if (!serverId) return; setSaving(true); try { await setMemberRoles(serverId, member.id, Array.from(selectedIds)); setMemberRolesState(roles.filter((r) => selectedIds.has(r.id))); setOpen(false); } catch { // error in store } finally { setSaving(false); } }; return ( <> {/* Inline role badges + trigger */}
{memberRoles.map((r) => ( {r.name} ))} {canEdit && ( )}
{/* Modal */} {open && (

{'>'} ASSIGN ROLES

member: {member.display_name || member.username}

{assignableRoles.length === 0 ? (

[no roles available]

) : (
{assignableRoles.map((role) => ( ))}
)}
)} ); }