import Enclave from "@/app/app"; import { ChannelPageProps } from "@/components/page/PageView"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { ClientMeta, StoredMessage } from "@/lib/types"; import { base58 } from "@scure/base"; import { useEffect, useRef, useState } from "react"; import * as ed from "@noble/ed25519"; export default function TextChannel({ appRef, }: { appRef: React.RefObject | null>; }) { const [currentMessage, setCurrentMessage] = useState(""); const channel = appRef.current?.page?.channel; const intersectionRef = useRef(null); const chunkRef = useRef(0); useEffect(() => { if (!intersectionRef.current) return; const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { console.log("Element is in view!"); if (!channel) return; appRef.current?.server?.websocket?.send({ method: "GetMessages", channel_id: channel.id, chunk: chunkRef.current, }); appRef.current?.forceRender(); chunkRef.current += 1; } }, { threshold: 0.5, }, ); observer.observe(intersectionRef.current); return () => observer.disconnect(); }, []); if (!channel) return null; const messages = appRef.current?.server?.messages[channel.id]; const sendMessage = () => { appRef.current?.sendMessage(currentMessage, channel.id); setCurrentMessage(""); }; return (

{channel.name}

{messages && Object.entries(messages) .sort((a, b) => b[1].timestamp - a[1].timestamp) .map(([_, message]) => ( ))}
setCurrentMessage(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); sendMessage(); } }} /> {currentMessage.trim() && }
); } export function TextMessage({ appRef, message, }: { appRef: React.RefObject | null>; message: StoredMessage; }) { const time = new Date(message.timestamp).toLocaleTimeString([], { hour: "numeric", minute: "2-digit", }); const [author, setAuthor] = useState(null); useEffect(() => { const currentAccount = appRef.current?.getAccount(); if (currentAccount) { const pubKey = base58.encode( ed.getPublicKey(base58.decode(currentAccount.privateKey)), ); if (pubKey === message.author) { setAuthor(currentAccount.meta); } } }, []); return (
{author?.displayName.slice(0, 1).toUpperCase() || message.author.slice(0, 2).toUpperCase()}
{author?.displayName || message.author.slice(0, 8)} {time}

{message.content}

); }