import React, { useRef, useState, useEffect, useCallback } from "react"; import GenericButton from "@/components/buttons/GenericButton"; import { DataTable } from "primereact/datatable"; import { Column } from "primereact/column"; import { useImageProxy } from "@/hooks/useImageProxy"; import { useSession } from 'next-auth/react'; import { ProgressSpinner } from "primereact/progressspinner"; import { useNDKContext, defaultRelayUrls } from "@/context/NDKContext"; import useWindowWidth from "@/hooks/useWindowWidth"; import Image from "next/image"; import BitcoinConnectButton from "@/components/bitcoinConnect/BitcoinConnect"; import { Panel } from "primereact/panel"; import { nip19 } from "nostr-tools"; import { InputText } from "primereact/inputtext"; import { Tooltip } from "primereact/tooltip"; import { useToast } from "@/hooks/useToast"; const UserSettings = () => { const [user, setUser] = useState(null); const [collapsed, setCollapsed] = useState(true); const { ndk, userRelays, setUserRelays, reInitializeNDK } = useNDKContext(); const { data: session } = useSession(); const { returnImageProxy } = useImageProxy(); const windowWidth = useWindowWidth(); const [newRelayUrl, setNewRelayUrl] = useState(""); const { showToast } = useToast(); const [relayStatuses, setRelayStatuses] = useState({}); const [updateTrigger, setUpdateTrigger] = useState(0); useEffect(() => { if (session?.user) { setUser(session.user); } }, [session]); useEffect(() => { if (ndk) { updateRelayStatuses(); } }, [ndk]); const updateRelayStatuses = useCallback(() => { // export enum NDKRelayStatus { // DISCONNECTING, // 0 // DISCONNECTED, // 1 // RECONNECTING, // 2 // FLAPPING, // 3 // CONNECTING, // 4 // // connected states // CONNECTED, // 5 // AUTH_REQUESTED, // 6 // AUTHENTICATING, // 7 // AUTHENTICATED, // 8 // } if (ndk) { console.log("Updating relay statuses"); const statuses = {}; ndk.pool.relays.forEach((relay, url) => { statuses[url] = relay.connectivity.status === 5; }); setRelayStatuses(statuses); } }, [ndk]); // Effect for periodic polling useEffect(() => { const intervalId = setInterval(() => { setUpdateTrigger(prev => prev + 1); }, 3000); // Poll every 3 seconds return () => clearInterval(intervalId); // Cleanup on unmount }, []); // Effect to update on every render and when updateTrigger changes useEffect(() => { updateRelayStatuses(); }, [updateRelayStatuses, updateTrigger]); const relayStatusBody = (url) => { const isConnected = relayStatuses[url]; return ( ); }; const addRelay = () => { if (newRelayUrl && !userRelays.includes(newRelayUrl)) { setUserRelays([...userRelays, newRelayUrl]); setNewRelayUrl(""); reInitializeNDK(); setCollapsed(true); showToast("success", "Relay added", "Relay successfully added to your list of relays."); } }; const removeRelay = (url) => { if (!defaultRelayUrls.includes(url)) { setUserRelays(userRelays.filter(relay => relay !== url)); reInitializeNDK(); setCollapsed(true); showToast("success", "Relay removed", "Relay successfully removed from your list of relays."); } }; const relayActionsBody = (rowData) => { return (
{!defaultRelayUrls.includes(rowData) ? ( removeRelay(rowData)} /> ) : ( <> removeRelay(rowData)} tooltip="Cannot remove default relays at this time (soon ™)" tooltipOptions={{ position: 'top' }} style={{ pointerEvents: 'none', cursor: 'not-allowed' }} /> )}
); }; const PanelHeader = (options) => { return (

Relays

); }; return ( user && (
{ windowWidth < 768 && (

Settings

) }
user's avatar

{user.username || user?.email || "Anon"}

{nip19.npubEncode(user.pubkey)}

Connect Your Lightning Wallet

{!session || !session?.user || !ndk ? ( ) : ( <> setCollapsed(e.value)} >
setNewRelayUrl(e.target.value)} />
setUpdateTrigger(prev => prev + 1)} // Trigger update when table value changes > url} header="Relay URL"> )}
) ); }; export default UserSettings;