import React, { useState } from 'react'; import { network } from '../p2p/index.js'; export default function FriendsView({ dms }) { const [activeTab, setActiveTab] = useState('pending'); const [searchUsername, setSearchUsername] = useState(''); const[searchStatus, setSearchStatus] = useState(''); // 'searching', 'queued', 'found', 'error' const pendingIncoming = Object.entries(dms).filter(([_, data]) => data.status === 'pending_incoming'); const pendingOutgoing = Object.entries(dms).filter(([_, data]) => data.status === 'pending_outgoing'); const handleAddFriend = async (e) => { e.preventDefault(); const target = searchUsername.trim().toLowerCase(); if (!target) return; if (target === network.username) { setSearchStatus('error'); return; } setSearchStatus('searching'); const result = await network.searchUser(target); if (result) { await network.sendDMRequest(result.pubKey, result.profile); setSearchStatus('found'); setSearchUsername(''); } else { await network.queueFriendRequest(target); setSearchStatus('queued'); setSearchUsername(''); } }; return (
Contacts
{activeTab === 'pending' && (

Pending Requests — {pendingIncoming.length + pendingOutgoing.length}

{pendingIncoming.map(([pubKey, data]) => (
{data.profile?.avatar ? : data.profile?.displayName?.substring(0, 2).toUpperCase()}
{data.profile?.displayName} @{data.profile?.username} • Incoming Contact Request
))} {pendingOutgoing.map(([pubKey, data]) => (
{data.profile?.avatar ? : data.profile?.displayName?.substring(0, 2).toUpperCase()}
{data.profile?.displayName} @{data.profile?.username} • Outgoing Contact Request
))} {pendingIncoming.length === 0 && pendingOutgoing.length === 0 && (
No pending requests.
)}
)} {activeTab === 'add' && (

ADD CONTACT

You can add a contact with their username. It's case sensitive!

setSearchUsername(e.target.value)} placeholder="You can add a contact with their username." className="w-full bg-panel text-text rounded-lg p-4 pr-40 outline-none focus:ring-1 focus:ring-accent border border-surface" />
{searchStatus === 'searching' &&

Searching network...

} {searchStatus === 'found' &&

Success! Your contact request was sent.

} {searchStatus === 'queued' &&

User is currently offline. We queued your request and will send it automatically when they come online!

} {searchStatus === 'error' &&

You cannot send a contact request to yourself.

}
)}
); }