import { createGroup } from '@chat-app/shared/chat'; import { extractErrorCode } from '@chat-app/shared/i18n'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { useFriendshipsContext } from '../context/FriendshipsContext'; import { supabase } from '../lib/supabase'; import { AlertIcon, CheckCircleIcon, SpinnerIcon, UsersIcon } from './icons'; import { Modal } from './Modal'; interface Props { open: boolean; onClose: () => void; } export function CreateGroupDialog({ open, onClose }: Props) { const { t } = useTranslation(['app', 'errors']); const navigate = useNavigate(); const { friendships } = useFriendshipsContext(); const acceptedFriends = useMemo( () => friendships.filter((f) => f.status === 'accepted').map((f) => f.peer), [friendships], ); const [name, setName] = useState(''); const [selected, setSelected] = useState>(new Set()); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); function toggle(userId: string) { setSelected((prev) => { const next = new Set(prev); if (next.has(userId)) next.delete(userId); else next.add(userId); return next; }); } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (busy || name.trim().length === 0) return; setBusy(true); setError(null); try { const id = await createGroup({ client: supabase, name, memberUserIds: Array.from(selected), }); onClose(); setName(''); setSelected(new Set()); navigate('/chats/' + id); } catch (err: unknown) { const code = extractErrorCode(err); setError( code ? t('errors:' + code, { defaultValue: t('errors:generic') }) : err instanceof Error ? err.message : t('errors:generic'), ); } finally { setBusy(false); } } return (
setName(e.target.value)} placeholder={t('app:group.create_name_placeholder')} className="w-full rounded-lg border border-white/10 bg-ink-800 px-3 py-2.5 text-sm text-white placeholder-neutral-500 transition focus:border-brand-400 focus:outline-none focus:ring-2 focus:ring-brand-500/40" />
{acceptedFriends.length === 0 ? (
{t('app:group.create_members_empty')}
) : (
    {acceptedFriends.map((f) => { const active = selected.has(f.userId); const letter = (f.displayName ?? f.username ?? '?').trim().charAt(0).toUpperCase() || '?'; return (
  • ); })}
)}
{error && (

{error}

)}
); }