import { DatabaseContext } from '@components/contexts/database'; import { RelayContext } from '@components/contexts/relay'; import { Content } from '@components/note/content'; import useLocalStorage from '@rehooks/local-storage'; import { memo, useCallback, useContext, useEffect, useState } from 'react'; export const RootNote = memo(function RootNote({ id }: { id: string }) { const { db }: any = useContext(DatabaseContext); const relayPool: any = useContext(RelayContext); const [relays]: any = useLocalStorage('relays'); const [event, setEvent] = useState(null); const insertDB = useCallback( async (event: any) => { // insert to local database await db.execute( 'INSERT OR IGNORE INTO cache_notes (id, pubkey, created_at, kind, content, tags) VALUES (?, ?, ?, ?, ?, ?);', [event.id, event.pubkey, event.created_at, event.kind, event.content, JSON.stringify(event.tags)] ); }, [db] ); const getData = useCallback(async () => { const result = await db.select(`SELECT * FROM cache_notes WHERE id = "${id}"`); return result[0]; }, []); const fetchEvent = useCallback(() => { relayPool.subscribe( [ { ids: [id], kinds: [1], }, ], relays, (event: any) => { // update state setEvent(event); // insert to database insertDB(event); }, undefined, (events, relayURL) => { console.log(events, relayURL); }, { unsubscribeOnEose: true, } ); }, [id, insertDB, relayPool, relays]); useEffect(() => { getData() .then((res) => { if (res) { setEvent(res); } else { fetchEvent(); } }) .catch(console.error); }, [fetchEvent, getData]); if (event) { return (