import { useEffect, useState } from 'react'; import { useAuthStore, type PublicProfile } from '../stores/auth.ts'; import { useServerStore } from '../stores/server.ts'; import { useMemberStore } from '../stores/member.ts'; import { usePermissions } from '../lib/usePermissions.ts'; import { MemberRoleAssign } from './MemberRoleAssign.tsx'; interface UserProfileModalProps { userId: string; onClose: () => void; } export function UserProfileModal({ userId, onClose }: UserProfileModalProps) { const getPublicProfile = useAuthStore((s) => s.getPublicProfile); const blockUser = useAuthStore((s) => s.blockUser); const currentUser = useAuthStore((s) => s.user); const activeServerId = useServerStore((s) => s.activeServerId); const [profile, setProfile] = useState(null); const [error, setError] = useState(null); const isSelf = currentUser?.id === userId; const { isOwner, canManageServer, canChangeNickname, canManageNicknames } = usePermissions(activeServerId); const canEditNickname = isOwner || canManageServer || (isSelf ? canChangeNickname : canManageNicknames); const membersByServer = useMemberStore((s) => s.membersByServer); const serverMembers = activeServerId ? membersByServer[activeServerId] || [] : []; const memberData = serverMembers.find((m) => m.id === userId); const currentNickname = memberData?.nickname || ''; const setMemberNickname = useMemberStore((s) => s.setMemberNickname); const [nickname, setNickname] = useState(currentNickname); const [isEditingNickname, setIsEditingNickname] = useState(false); const [savingNickname, setSavingNickname] = useState(false); useEffect(() => { setNickname(currentNickname); }, [currentNickname]); const handleSaveNickname = async () => { if (!activeServerId) return; setSavingNickname(true); setError(null); try { await setMemberNickname(activeServerId, userId, nickname.trim()); setIsEditingNickname(false); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to save nickname'); } finally { setSavingNickname(false); } }; useEffect(() => { getPublicProfile(userId).then(setProfile).catch(setError); }, [userId, getPublicProfile]); const statusColor = { online: 'bg-gb-green', idle: 'bg-gb-orange', dnd: 'bg-gb-red', offline: 'bg-gb-fg-t', }[profile?.status || 'offline']; return (
e.stopPropagation()}> {error &&
ERR: {error}
} {!profile && !error &&
[loading...]
} {profile && ( <>
{currentNickname || profile.display_name || profile.username}
@{profile.username}
{profile.pronouns &&
{profile.pronouns}
} {activeServerId && (
NICKNAME: {isEditingNickname ? (
setNickname(e.target.value)} placeholder="no nickname" className="bg-gb-bg-t text-gb-fg px-1 py-0.5 text-[10px] outline-none border border-gb-orange max-w-[120px]" />
) : (
{currentNickname || '[NONE]'} {canEditNickname && ( )}
)}
)}
{profile.tagline &&
"{profile.tagline}"
} {profile.bio &&
{profile.bio}
} {profile.social_links && profile.social_links.length > 0 && (
{profile.social_links.map((link, idx) => ( {link.platform} ))}
)} {profile.badges && profile.badges.length > 0 && (
{profile.badges.map((badge) => ( {badge.icon && {badge.icon}} {badge.name} ))}
)} {activeServerId && (
{'>'} ROLES:
)}
)}
); }