import { prefetchEvents } from "@libs/ndk"; import { countTotalNotes, createChannelMessage, createChat, createNote, getChannels, } from "@libs/storage"; import { NDKFilter } from "@nostr-dev-kit/ndk"; import { LumeIcon } from "@shared/icons"; import { RelayContext } from "@shared/relayProvider"; import { useActiveAccount } from "@stores/accounts"; import { dateToUnix, getHourAgo } from "@utils/date"; import { useContext, useEffect, useRef } from "react"; import { navigate } from "vite-plugin-ssr/client/router"; let totalNotes: number; if (typeof window !== "undefined") { totalNotes = await countTotalNotes(); } export function Page() { const ndk = useContext(RelayContext); const now = useRef(new Date()); const [account, lastLogin] = useActiveAccount((state: any) => [ state.account, state.lastLogin, ]); async function fetchNotes() { try { const follows = JSON.parse(account.follows); let queryNoteSince: number; if (totalNotes === 0) { queryNoteSince = dateToUnix(getHourAgo(48, now.current)); } else { if (lastLogin > 0) { queryNoteSince = lastLogin; } else { queryNoteSince = dateToUnix(getHourAgo(48, now.current)); } } const filter: NDKFilter = { kinds: [1, 6], authors: follows, since: queryNoteSince, }; const events = await prefetchEvents(ndk, filter); events.forEach((event) => { createNote( event.id, event.pubkey, event.kind, event.tags, event.content, event.created_at, ); }); return true; } catch (e) { console.log("error: ", e); } } async function fetchChats() { try { const sendFilter: NDKFilter = { kinds: [4], authors: [account.pubkey], since: lastLogin, }; const receiveFilter: NDKFilter = { kinds: [4], "#p": [account.pubkey], since: lastLogin, }; const sendMessages = await prefetchEvents(ndk, sendFilter); const receiveMessages = await prefetchEvents(ndk, receiveFilter); const events = [...sendMessages, ...receiveMessages]; events.forEach((event) => { const receiverPubkey = event.tags.find((t) => t[0] === "p")[1] || account.pubkey; createChat( event.id, receiverPubkey, event.pubkey, event.content, event.tags, event.created_at, ); }); return true; } catch (e) { console.log("error: ", e); } } async function fetchChannelMessages() { try { const ids = []; const channels: any = await getChannels(10, 0); channels.forEach((channel) => { ids.push(channel.event_id); }); const since = lastLogin === 0 ? dateToUnix(getHourAgo(48, now.current)) : lastLogin; const filter: NDKFilter = { "#e": ids, kinds: [42], since: since, }; const events = await prefetchEvents(ndk, filter); events.forEach((event) => { const channel_id = event.tags[0][1]; if (channel_id) { createChannelMessage( channel_id, event.id, event.pubkey, event.kind, event.content, event.tags, event.created_at, ); } }); return true; } catch (e) { console.log("error: ", e); } } useEffect(() => { async function prefetch() { const notes = await fetchNotes(); if (notes) { const chats = await fetchChats(); const channels = await fetchChannelMessages(); if (chats && channels) { navigate("/app/space", { overwriteLastHistoryEntry: true }); } } } prefetch(); }, []); return (

Here's an interesting fact:

Bitcoin and Nostr can be used by anyone, and no one can stop you!

Loading
); }