import { createSignal } from "solid-js"; import type { DirectoryEntry } from "../lib/types"; const [knownPeers, setKnownPeers] = createSignal([]); const [friends, setFriends] = createSignal([]); export function upsertPeerEntry(entry: DirectoryEntry) { setKnownPeers((prev) => { const existing = prev.findIndex((p) => p.peer_id === entry.peer_id); if (existing >= 0) { const updated = [...prev]; // preserve local friend status when updating from network updated[existing] = { ...entry, is_friend: prev[existing].is_friend }; return updated; } return [...prev, entry]; }); } export function updatePeerProfile( peerId: string, displayName: string, bio: string, ) { const now = Date.now(); setKnownPeers((prev) => prev.map((p) => p.peer_id === peerId ? { ...p, display_name: displayName, bio, last_seen: now } : p, ), ); setFriends((prev) => prev.map((p) => p.peer_id === peerId ? { ...p, display_name: displayName, bio, last_seen: now } : p, ), ); } export function markAsFriend(peerId: string) { setKnownPeers((prev) => prev.map((p) => (p.peer_id === peerId ? { ...p, is_friend: true } : p)), ); // add to friends list if not already there const peer = knownPeers().find((p) => p.peer_id === peerId); if (peer) { setFriends((prev) => { if (prev.some((f) => f.peer_id === peerId)) return prev; return [...prev, { ...peer, is_friend: true }]; }); } } export function unmarkAsFriend(peerId: string) { setKnownPeers((prev) => prev.map((p) => (p.peer_id === peerId ? { ...p, is_friend: false } : p)), ); setFriends((prev) => prev.filter((f) => f.peer_id !== peerId)); } // remove a peer entirely from local stores (used when they revoke their identity) export function removePeer(peerId: string) { setKnownPeers((prev) => prev.filter((p) => p.peer_id !== peerId)); setFriends((prev) => prev.filter((f) => f.peer_id !== peerId)); } // clear all directory data (used during local identity reset) export function clearDirectory() { setKnownPeers([]); setFriends([]); } export { knownPeers, friends, setKnownPeers, setFriends };