diff --git a/src/components/note/connector.tsx b/src/components/note/connector.tsx index 23a37e30..dcea4506 100644 --- a/src/components/note/connector.tsx +++ b/src/components/note/connector.tsx @@ -6,14 +6,20 @@ import { dateToUnix, hoursAgo } from '@utils/getDate'; import { ReloadIcon } from '@radix-ui/react-icons'; import { useLocalStorage } from '@rehooks/local-storage'; -import { memo, useCallback, useContext, useRef } from 'react'; +import { memo, useCallback, useContext, useEffect } from 'react'; -export const NoteConnector = memo(function NoteConnector({ setReload }: { setReload: any }) { +export const NoteConnector = memo(function NoteConnector({ + setParentReload, + setHasNewNote, + currentDate, +}: { + setParentReload: any; + setHasNewNote: any; + currentDate: any; +}) { const { db }: any = useContext(DatabaseContext); const relayPool: any = useContext(RelayContext); - const now = useRef(new Date()); - const [follows]: any = useLocalStorage('follows'); const [relays]: any = useLocalStorage('relays'); @@ -29,34 +35,46 @@ export const NoteConnector = memo(function NoteConnector({ setReload }: { setRel [db] ); - relayPool.subscribe( - [ - { - kinds: [1], - authors: follows, - since: dateToUnix(hoursAgo(12, now.current)), + const fetchEvent = useCallback(() => { + relayPool.subscribe( + [ + { + kinds: [1], + authors: follows, + since: dateToUnix(hoursAgo(12, currentDate)), + }, + ], + relays, + (event: any) => { + // insert event to local database + insertDB(event).catch(console.error); + // show trigger update newer event + if (event.created_at > dateToUnix(currentDate)) { + setHasNewNote(true); + } }, - ], - relays, - (event: any) => { - insertDB(event).catch(console.error); - }, - undefined, - (events: any, relayURL: any) => { - console.log(events, relayURL); - } - ); + undefined, + (events: any, relayURL: any) => { + console.log(events, relayURL); + } + ); + }, [relayPool, follows, currentDate, relays, insertDB, setHasNewNote]); + + useEffect(() => { + fetchEvent(); + }, [fetchEvent]); return ( -
+

# following

-
+ {/* #TODO: get user network status */} diff --git a/src/pages/feed/following.tsx b/src/pages/feed/following.tsx index 790ecdf3..388e9d91 100644 --- a/src/pages/feed/following.tsx +++ b/src/pages/feed/following.tsx @@ -8,22 +8,34 @@ import { Placeholder } from '@components/note/placeholder'; import { Repost } from '@components/note/repost'; import { Single } from '@components/note/single'; +import { dateToUnix } from '@utils/getDate'; + +import { writeStorage } from '@rehooks/local-storage'; import { useCallback, useState } from 'react'; import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, useContext, useEffect, useRef } from 'react'; import { Virtuoso } from 'react-virtuoso'; export default function Page() { const { db }: any = useContext(DatabaseContext); - const [data, setData] = useState([]); - const [reload, setReload] = useState(false); + const [data, setData] = useState([]); + const [parentReload, setParentReload] = useState(false); + const [hasNewNote, setHasNewNote] = useState(false); + + const now = useRef(new Date()); const limit = useRef(30); const offset = useRef(0); const loadMore = useCallback(async () => { offset.current += limit.current; // next query - const result = await db.select(`SELECT * FROM cache_notes ORDER BY created_at DESC LIMIT ${limit.current} OFFSET ${offset.current}`); + const result = await db.select( + `SELECT * FROM + cache_notes + WHERE created_at <= ${dateToUnix(now.current)} + ORDER BY created_at DESC + LIMIT ${limit.current} OFFSET ${offset.current}` + ); setData((data) => [...data, ...result]); }, [db]); @@ -43,12 +55,17 @@ export default function Page() { useEffect(() => { const getData = async () => { - const result = await db.select(`SELECT * FROM cache_notes ORDER BY created_at DESC LIMIT ${limit.current}`); - setData(result); + const result = await db.select( + `SELECT * FROM cache_notes WHERE created_at <= ${dateToUnix(now.current)} ORDER BY created_at DESC LIMIT ${limit.current}` + ); + if (result) { + setData(result); + writeStorage('settings', new Date()); + } }; getData().catch(console.error); - }, [db, reload]); + }, [db, parentReload]); const computeItemKey = useCallback( (index: string | number) => { @@ -58,8 +75,13 @@ export default function Page() { ); return ( -
- +
+ + {hasNewNote && ( +
+ +
+ )}