diff --git a/src/app/channel/pages/index.page.tsx b/src/app/channel/pages/index.page.tsx index 4fddca1c..d4a2a867 100644 --- a/src/app/channel/pages/index.page.tsx +++ b/src/app/channel/pages/index.page.tsx @@ -3,7 +3,6 @@ import { ChannelBlackList } from '@lume/shared/channels/channelBlackList'; import { ChannelProfile } from '@lume/shared/channels/channelProfile'; import { UpdateChannelModal } from '@lume/shared/channels/updateChannelModal'; import { FormChannel } from '@lume/shared/form/channel'; -import NewsfeedLayout from '@lume/shared/layouts/newsfeed'; import { RelayContext } from '@lume/shared/relaysProvider'; import { channelMessagesAtom, channelReplyAtom } from '@lume/stores/channel'; import { FULL_RELAYS } from '@lume/stores/constants'; @@ -80,26 +79,24 @@ export function Page() { }); return ( - -
-
-
- -
-
- - {activeAccount.pubkey === channelPubkey && } -
+
+
+
+
-
- Loading...

}> - -
-
- -
+
+ + {activeAccount.pubkey === channelPubkey && }
- +
+ Loading...

}> + +
+
+ +
+
+
); } diff --git a/src/app/chat/pages/index.page.tsx b/src/app/chat/pages/index.page.tsx index 857ff11f..0521263a 100644 --- a/src/app/chat/pages/index.page.tsx +++ b/src/app/chat/pages/index.page.tsx @@ -1,7 +1,6 @@ import { AccountContext } from '@lume/shared/accountProvider'; import { MessageListItem } from '@lume/shared/chats/messageListItem'; import FormChat from '@lume/shared/form/chat'; -import NewsfeedLayout from '@lume/shared/layouts/newsfeed'; import { RelayContext } from '@lume/shared/relaysProvider'; import { FULL_RELAYS } from '@lume/stores/constants'; import { usePageContext } from '@lume/utils/hooks/usePageContext'; @@ -46,41 +45,39 @@ export function Page() { ); return ( - -
-
- {error &&
failed to load
} - {!data ? ( -
-
-
-
-
-
- -
+
+
+ {error &&
failed to load
} + {!data ? ( +
+
+
+
+
+
+
-
-
-
+
+
+
- ) : ( - sortMessages(data).map((message) => ( - - )) - )} -
-
- -
+
+ ) : ( + sortMessages(data).map((message) => ( + + )) + )}
- +
+ +
+
); } diff --git a/src/app/index/pages/index.page.tsx b/src/app/index/pages/index.page.tsx index 4ad95b5f..f2a021e9 100644 --- a/src/app/index/pages/index.page.tsx +++ b/src/app/index/pages/index.page.tsx @@ -1,153 +1,25 @@ import LumeIcon from '@lume/shared/icons/lume'; -import { RelayContext } from '@lume/shared/relaysProvider'; -import { READONLY_RELAYS } from '@lume/stores/constants'; -import { dateToUnix, hoursAgo } from '@lume/utils/getDate'; -import { - addToBlacklist, - countTotalNotes, - createChat, - createNote, - getActiveAccount, - getLastLogin, - updateLastLogin, -} from '@lume/utils/storage'; -import { getParentID } from '@lume/utils/transform'; +import { getActiveAccount } from '@lume/utils/storage'; -import { useContext, useEffect, useRef } from 'react'; +import useSWR from 'swr'; import { navigate } from 'vite-plugin-ssr/client/router'; +const fetcher = () => getActiveAccount(); + export function Page() { - const pool: any = useContext(RelayContext); - const now = useRef(new Date()); + const { data, isLoading } = useSWR('account', fetcher, { + revalidateIfStale: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + }); - useEffect(() => { - let unsubscribe: () => void; - let timeout: any; + if (!isLoading && !data) { + navigate('/auth', { overwriteLastHistoryEntry: true }); + } - const fetchInitalData = async (account: { pubkey: string; id: number }, tags: string) => { - const lastLogin = await getLastLogin(); - const notes = await countTotalNotes(); - - const follows = JSON.parse(tags); - const query = []; - - let since: number; - - if (notes.total === 0) { - since = dateToUnix(hoursAgo(24, now.current)); - } else { - if (parseInt(lastLogin) > 0) { - since = parseInt(lastLogin); - } else { - since = dateToUnix(hoursAgo(24, now.current)); - } - } - - // kind 1 (notes) query - query.push({ - kinds: [1, 6], - authors: follows, - since: since, - until: dateToUnix(now.current), - }); - - // kind 4 (chats) query - query.push({ - kinds: [4], - '#p': [account.pubkey], - since: 0, - until: dateToUnix(now.current), - }); - - // kind 43, 43 (mute user, hide message) query - query.push({ - authors: [account.pubkey], - kinds: [43, 44], - since: 0, - until: dateToUnix(now.current), - }); - - // subscribe relays - unsubscribe = pool.subscribe( - query, - READONLY_RELAYS, - (event: { kind: number; tags: string[]; id: string; pubkey: string; content: string; created_at: number }) => { - switch (event.kind) { - // short text note - case 1: - const parentID = getParentID(event.tags, event.id); - // insert event to local database - createNote( - event.id, - account.id, - event.pubkey, - event.kind, - event.tags, - event.content, - event.created_at, - parentID - ); - break; - // chat - case 4: - if (event.pubkey !== account.pubkey) { - createChat(account.id, event.pubkey, event.created_at); - } - break; - // repost - case 6: - createNote( - event.id, - account.id, - event.pubkey, - event.kind, - event.tags, - event.content, - event.created_at, - event.id - ); - break; - // hide message (channel only) - case 43: - if (event.tags[0][0] === 'e') { - addToBlacklist(account.id, event.tags[0][1], 43, 1); - } - // mute user (channel only) - case 44: - if (event.tags[0][0] === 'p') { - addToBlacklist(account.id, event.tags[0][1], 44, 1); - } - default: - break; - } - }, - undefined, - () => { - updateLastLogin(dateToUnix(now.current)); - timeout = setTimeout(() => { - navigate('/app/newsfeed/following', { overwriteLastHistoryEntry: true }); - }, 5000); - } - ); - }; - - getActiveAccount() - .then((res: any) => { - if (res) { - fetchInitalData(res, res.follows); - } else { - navigate('/auth', { overwriteLastHistoryEntry: true }); - } - }) - .catch(console.error); - - return () => { - if (unsubscribe) { - unsubscribe(); - } - clearTimeout(timeout); - }; - }, [pool]); + if (!isLoading && data) { + navigate('/app/inital-data', { overwriteLastHistoryEntry: true }); + } return (
diff --git a/src/app/inital-data/pages/index.page.tsx b/src/app/inital-data/pages/index.page.tsx new file mode 100644 index 00000000..96a64e49 --- /dev/null +++ b/src/app/inital-data/pages/index.page.tsx @@ -0,0 +1,182 @@ +import LumeIcon from '@lume/shared/icons/lume'; +import { FULL_RELAYS } from '@lume/stores/constants'; +import { dateToUnix, hoursAgo } from '@lume/utils/getDate'; +import { + addToBlacklist, + countTotalNotes, + createChat, + createNote, + getActiveAccount, + getLastLogin, + updateLastLogin, +} from '@lume/utils/storage'; +import { getParentID, nip02ToArray } from '@lume/utils/transform'; + +import { RelayPool } from 'nostr-relaypool'; +import { useEffect, useRef } from 'react'; +import { navigate } from 'vite-plugin-ssr/client/router'; + +export function Page() { + const now = useRef(new Date()); + + useEffect(() => { + let unsubscribe: () => void; + let timeout: any; + + const fetchInitalData = async () => { + const account = await getActiveAccount(); + const lastLogin = await getLastLogin(); + const notes = await countTotalNotes(); + + const pool = new RelayPool(FULL_RELAYS); + const follows = nip02ToArray(JSON.parse(account.follows)); + const query = []; + + let since: number; + + if (notes === 0) { + since = dateToUnix(hoursAgo(24, now.current)); + } else { + if (parseInt(lastLogin) > 0) { + since = parseInt(lastLogin); + } else { + since = dateToUnix(hoursAgo(24, now.current)); + } + } + + // kind 1 (notes) query + query.push({ + kinds: [1, 6], + authors: follows, + since: since, + until: dateToUnix(now.current), + }); + + // kind 4 (chats) query + query.push({ + kinds: [4], + '#p': [account.pubkey], + since: 0, + until: dateToUnix(now.current), + }); + + // kind 43, 43 (mute user, hide message) query + query.push({ + authors: [account.pubkey], + kinds: [43, 44], + since: 0, + until: dateToUnix(now.current), + }); + + // subscribe relays + unsubscribe = pool.subscribe( + query, + FULL_RELAYS, + (event: any) => { + switch (event.kind) { + // short text note + case 1: + const parentID = getParentID(event.tags, event.id); + // insert event to local database + createNote( + event.id, + account.id, + event.pubkey, + event.kind, + event.tags, + event.content, + event.created_at, + parentID + ); + break; + // chat + case 4: + if (event.pubkey !== account.pubkey) { + createChat(account.id, event.pubkey, event.created_at); + } + break; + // repost + case 6: + createNote( + event.id, + account.id, + event.pubkey, + event.kind, + event.tags, + event.content, + event.created_at, + event.id + ); + break; + // hide message (channel only) + case 43: + if (event.tags[0][0] === 'e') { + addToBlacklist(account.id, event.tags[0][1], 43, 1); + } + // mute user (channel only) + case 44: + if (event.tags[0][0] === 'p') { + addToBlacklist(account.id, event.tags[0][1], 44, 1); + } + default: + break; + } + }, + undefined, + () => { + updateLastLogin(dateToUnix(now.current)); + timeout = setTimeout(() => { + navigate('/app/newsfeed/following', { overwriteLastHistoryEntry: true }); + }, 5000); + } + ); + }; + + fetchInitalData().catch(console.error); + + return () => { + if (unsubscribe) { + unsubscribe(); + } + clearTimeout(timeout); + }; + }, []); + + return ( +
+
+ {/* dragging area */} +
+ {/* end dragging area */} +
+
+ +
+

+ Here's an interesting fact: +

+

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

+
+
+
+ + + + +
+
+
+
+ ); +} diff --git a/src/shared/chats/chatList.tsx b/src/shared/chats/chatList.tsx index a3c52c56..d8a809f7 100644 --- a/src/shared/chats/chatList.tsx +++ b/src/shared/chats/chatList.tsx @@ -1,19 +1,9 @@ import { AccountContext } from '@lume/shared/accountProvider'; -import { ChatListItem } from '@lume/shared/chats/chatListItem'; import { ChatModal } from '@lume/shared/chats/chatModal'; import { DEFAULT_AVATAR } from '@lume/stores/constants'; import { useContext } from 'react'; -let list: any = []; - -if (typeof window !== 'undefined') { - const { getChats, getActiveAccount } = await import('@lume/utils/storage'); - const activeAccount = await getActiveAccount(); - - list = await getChats(activeAccount.id); -} - export default function ChatList() { const activeAccount: any = useContext(AccountContext); const profile = typeof window !== 'undefined' ? JSON.parse(activeAccount.metadata) : null; @@ -37,9 +27,6 @@ export default function ChatList() {
- {list.map((item: { id: string; pubkey: string }) => ( - - ))}
); diff --git a/src/shared/navigation.tsx b/src/shared/navigation.tsx index 60824bb9..78a9f0c2 100644 --- a/src/shared/navigation.tsx +++ b/src/shared/navigation.tsx @@ -1,6 +1,5 @@ import ActiveLink from '@lume/shared/activeLink'; import ChannelList from '@lume/shared/channels/channelList'; -import ChatList from '@lume/shared/chats/chatList'; import { Disclosure } from '@headlessui/react'; import { Bonfire, NavArrowUp, PeopleTag } from 'iconoir-react'; @@ -80,9 +79,7 @@ export default function Navigation() {

Chats

- - - +
)} diff --git a/src/utils/storage.tsx b/src/utils/storage.tsx index bbeb06f8..b243c0b4 100644 --- a/src/utils/storage.tsx +++ b/src/utils/storage.tsx @@ -77,7 +77,7 @@ export async function countTotalChannels() { export async function countTotalNotes() { const db = await connect(); const result = await db.select('SELECT COUNT(*) AS "total" FROM notes;'); - return result[0]; + return result[0].total; } // get all notes