import { For, Show, createMemo, createSignal, type Component } from "solid-js"; import { members, removeMember } from "../../stores/members"; import { activeCommunityId } from "../../stores/communities"; import { identity } from "../../stores/identity"; import Avatar from "../common/Avatar"; import SidebarLayout from "../common/SidebarLayout"; import { openProfileCard } from "../../stores/ui"; import * as tauri from "../../lib/tauri"; const UserSidebar: Component = () => { const [contextMenu, setContextMenu] = createSignal<{ x: number; y: number; memberId: string; memberName: string; memberRoles: string[]; } | null>(null); const groupedMembers = createMemo(() => { const memberList = members(); const groups = new Map(); for (const member of memberList) { const role = member.roles[0] ?? "member"; if (!groups.has(role)) { groups.set(role, []); } groups.get(role)!.push(member); } return Array.from(groups.entries()); }); const currentUser = () => identity(); const currentCommunityId = () => activeCommunityId(); function handleContextMenu( e: MouseEvent, member: { peer_id: string; display_name: string; roles: string[] }, ) { e.preventDefault(); setContextMenu({ x: e.clientX, y: e.clientY, memberId: member.peer_id, memberName: member.display_name, memberRoles: member.roles, }); } function closeContextMenu() { setContextMenu(null); } async function handleKickMember() { const menu = contextMenu(); const communityId = currentCommunityId(); if (!menu || !communityId) return; const user = currentUser(); if (!user) return; const currentMember = members().find((m) => m.peer_id === user.peer_id); const isAdmin = currentMember?.roles.some( (r) => r === "admin" || r === "owner", ); if (!isAdmin) { console.error("not authorized to kick members"); closeContextMenu(); return; } if (menu.memberRoles.includes("owner")) { console.error("cannot kick the community owner"); closeContextMenu(); return; } try { await tauri.kickMember(communityId, menu.memberId); removeMember(menu.memberId); } catch (e) { console.error("failed to kick member:", e); } closeContextMenu(); } if (typeof window !== "undefined") { window.addEventListener("click", closeContextMenu); } const body = (
{([role, roleMembers]) => (
{role} - {roleMembers.length}
{(member) => ( )}
)}
no members to display
); return ( {body} {/* context menu */} {(menu) => { const user = currentUser(); const currentMember = user ? members().find((m) => m.peer_id === user.peer_id) : null; const isAdmin = currentMember?.roles.some( (r) => r === "admin" || r === "owner", ); const canKick = isAdmin && !menu().memberRoles.includes("owner") && menu().memberId !== user?.peer_id; return (
e.stopPropagation()} >
{menu().memberName}
no actions available
); }}
); }; export default UserSidebar;