From aa0f874eedc651713e294586277f14c71de80f39 Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Fri, 17 Mar 2023 08:54:36 +0700 Subject: [PATCH] added root note component --- src/components/contexts/relay.tsx | 3 +- src/components/note/connector.tsx | 7 ++--- src/components/note/content/index.tsx | 6 ++-- src/components/note/index.tsx | 28 ++++++++++++++++++ src/components/note/placeholder.tsx | 2 +- src/components/note/root.tsx | 42 +++++++++++++++++++++++++++ src/components/note/single.tsx | 11 ------- src/pages/newsfeed/following.tsx | 13 +++++---- 8 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 src/components/note/index.tsx create mode 100644 src/components/note/root.tsx delete mode 100644 src/components/note/single.tsx diff --git a/src/components/contexts/relay.tsx b/src/components/contexts/relay.tsx index 58903210..962fceb2 100644 --- a/src/components/contexts/relay.tsx +++ b/src/components/contexts/relay.tsx @@ -4,7 +4,6 @@ import { createContext, useMemo } from 'react'; export const RelayContext = createContext({}); export default function RelayProvider({ relays, children }: { relays: any; children: React.ReactNode }) { - const value = useMemo(() => new RelayPool(relays, { useEventCache: true }), [relays]); - + const value = useMemo(() => new RelayPool(relays, { useEventCache: true, logSubscriptions: false }), [relays]); return {children}; } diff --git a/src/components/note/connector.tsx b/src/components/note/connector.tsx index 7c464fab..39d979d5 100644 --- a/src/components/note/connector.tsx +++ b/src/components/note/connector.tsx @@ -5,7 +5,6 @@ import { atomHasNewerNote } from '@stores/note'; import { dateToUnix, hoursAgo } from '@utils/getDate'; -import { SliderIcon } from '@radix-ui/react-icons'; import { useLocalStorage } from '@rehooks/local-storage'; import { useSetAtom } from 'jotai'; import { memo, useCallback, useContext, useEffect, useRef } from 'react'; @@ -26,14 +25,14 @@ export const NoteConnector = memo(function NoteConnector() { await db.execute( `INSERT OR IGNORE INTO cache_notes - (id, pubkey, created_at, kind, tags, content) VALUES + (id, pubkey, created_at, kind, content, tags) VALUES ( "${event.id}", "${event.pubkey}", "${event.created_at}", "${event.kind}", - '${JSON.stringify(event.tags)}', - '${JSON.stringify(event.content)}' + "${event.content}", + '${JSON.stringify(event.tags)}' );` ); }, diff --git a/src/components/note/content/index.tsx b/src/components/note/content/index.tsx index 780e8cfb..98a8e690 100644 --- a/src/components/note/content/index.tsx +++ b/src/components/note/content/index.tsx @@ -15,7 +15,7 @@ const MarkdownPreview = dynamic(() => import('@uiw/react-markdown-preview'), { export const Content = memo(function Content({ data }: { data: any }) { const [preview, setPreview] = useState({}); - const content = useRef(JSON.parse(data.content)); + const content = useRef(data.content); const urls = useMemo( () => content.current.match( @@ -61,7 +61,7 @@ export const Content = memo(function Content({ data }: { data: any }) { }, [preview]); return ( -
+
@@ -70,7 +70,7 @@ export const Content = memo(function Content({ data }: { data: any }) { { + if (tags.length > 0) { + if (tags[0][0] === 'e') { + setRoot(tags[0][1]); + } + } + }, [tags]); + + return ( +
+ {root && ( + <> + + + )} + +
+ ); +}); diff --git a/src/components/note/placeholder.tsx b/src/components/note/placeholder.tsx index 67969508..d8dfdd75 100644 --- a/src/components/note/placeholder.tsx +++ b/src/components/note/placeholder.tsx @@ -2,7 +2,7 @@ import { memo } from 'react'; export const Placeholder = memo(function Placeholder() { return ( -
+
diff --git a/src/components/note/root.tsx b/src/components/note/root.tsx new file mode 100644 index 00000000..97893162 --- /dev/null +++ b/src/components/note/root.tsx @@ -0,0 +1,42 @@ +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 relayPool: any = useContext(RelayContext); + + const [relays]: any = useLocalStorage('relays'); + const [event, setEvent] = useState(null); + + const fetchEvent = useCallback(() => { + relayPool.subscribe( + [ + { + ids: [id], + kinds: [1], + }, + ], + relays, + (event: any) => { + setEvent(event); + } + ); + }, [id, relayPool, relays]); + + useEffect(() => { + fetchEvent(); + }, [fetchEvent]); + + if (event) { + return ( +
+
+ +
+ ); + } else { + return <>Loading...; + } +}); diff --git a/src/components/note/single.tsx b/src/components/note/single.tsx deleted file mode 100644 index 2443b7dd..00000000 --- a/src/components/note/single.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Content } from '@components/note/content'; - -import { memo } from 'react'; - -export const Single = memo(function Single({ event }: { event: any }) { - return ( -
- -
- ); -}); diff --git a/src/pages/newsfeed/following.tsx b/src/pages/newsfeed/following.tsx index 592497aa..b2f864fc 100644 --- a/src/pages/newsfeed/following.tsx +++ b/src/pages/newsfeed/following.tsx @@ -2,16 +2,16 @@ import BaseLayout from '@layouts/base'; import WithSidebarLayout from '@layouts/withSidebar'; import { DatabaseContext } from '@components/contexts/database'; +import { Note } from '@components/note'; import NoteForm from '@components/note/form'; import { Placeholder } from '@components/note/placeholder'; -import { Single } from '@components/note/single'; import { atomHasNewerNote } from '@stores/note'; import { dateToUnix } from '@utils/getDate'; import { useAtom } from 'jotai'; -import { useCallback, useState } from 'react'; +import { Key, useCallback, useState } from 'react'; import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, useContext, useEffect, useRef } from 'react'; import { Virtuoso } from 'react-virtuoso'; @@ -56,15 +56,15 @@ export default function Page() { }, [db, setHasNewerNote]); const ItemContent = useCallback( - (index: string | number) => { + (index: Key) => { const event = data[index]; - return ; + return ; }, [data] ); const computeItemKey = useCallback( - (index: string | number) => { + (index: Key) => { return data[index].id; }, [data] @@ -87,6 +87,7 @@ export default function Page() { if (reload === false) { getData().catch(console.error); } else { + // auto reload after 8s const timer = setTimeout(() => { getData().catch(console.error); }, 8000); @@ -101,7 +102,7 @@ export default function Page() {