From f8de44fe9fd2c6a67e04e272b19368b1e361b6fe Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Fri, 16 Jun 2023 10:01:20 +0700 Subject: [PATCH] add trending notes --- src/app/channel/components/messages/item.tsx | 6 +- src/app/chat/components/messages/item.tsx | 6 +- src/app/chat/pages/index.page.tsx | 3 +- src/app/space/components/blocks/feed.tsx | 6 +- src/app/space/components/blocks/following.tsx | 6 +- src/app/space/components/blocks/thread.tsx | 16 +-- src/app/space/components/notes/wrapper.tsx | 34 ------- src/app/space/components/user/default.tsx | 97 ------------------- src/app/space/components/user/quote.tsx | 41 -------- src/app/space/components/user/reply.tsx | 41 -------- src/app/trending/components/profile.tsx | 2 - src/app/trending/components/trendingNotes.tsx | 40 ++++++++ .../trending/components/trendingProfiles.tsx | 2 +- src/app/trending/pages/index.page.tsx | 2 + .../components => shared}/notes/base.tsx | 33 ++++--- .../components => shared}/notes/kind1.tsx | 8 +- .../components => shared}/notes/kind1063.tsx | 3 +- .../notes/mentions/note.tsx | 19 ++-- .../notes/mentions/user.tsx | 0 .../components => shared}/notes/metadata.tsx | 8 +- .../notes/metadata/reply.tsx | 0 .../notes/metadata/repost.tsx | 0 .../notes/metadata/zap.tsx | 0 .../components => shared}/notes/parent.tsx | 12 +-- .../notes/preview/image.tsx | 0 .../notes/preview/link.tsx | 2 +- .../notes/preview/video.tsx | 0 .../notes/quoteRepost.tsx | 9 +- .../notes/replies/form.tsx | 0 .../notes/replies/item.tsx | 8 +- .../notes/replies/list.tsx | 2 +- .../components => shared}/notes/rootNote.tsx | 17 ++-- .../components => shared}/notes/skeleton.tsx | 0 .../user/repost.tsx => shared/user.tsx} | 25 +++-- src/stores/constants.tsx | 2 +- src/utils/parser.tsx | 2 +- src/utils/transform.tsx | 5 +- src/utils/types.ts | 6 ++ 38 files changed, 155 insertions(+), 308 deletions(-) delete mode 100644 src/app/space/components/notes/wrapper.tsx delete mode 100644 src/app/space/components/user/default.tsx delete mode 100644 src/app/space/components/user/quote.tsx delete mode 100644 src/app/space/components/user/reply.tsx create mode 100644 src/app/trending/components/trendingNotes.tsx rename src/{app/space/components => shared}/notes/base.tsx (53%) rename src/{app/space/components => shared}/notes/kind1.tsx (78%) rename src/{app/space/components => shared}/notes/kind1063.tsx (75%) rename src/{app/space/components => shared}/notes/mentions/note.tsx (68%) rename src/{app/space/components => shared}/notes/mentions/user.tsx (100%) rename src/{app/space/components => shared}/notes/metadata.tsx (90%) rename src/{app/space/components => shared}/notes/metadata/reply.tsx (100%) rename src/{app/space/components => shared}/notes/metadata/repost.tsx (100%) rename src/{app/space/components => shared}/notes/metadata/zap.tsx (100%) rename src/{app/space/components => shared}/notes/parent.tsx (77%) rename src/{app/space/components => shared}/notes/preview/image.tsx (100%) rename src/{app/space/components => shared}/notes/preview/link.tsx (96%) rename src/{app/space/components => shared}/notes/preview/video.tsx (100%) rename src/{app/space/components => shared}/notes/quoteRepost.tsx (67%) rename src/{app/space/components => shared}/notes/replies/form.tsx (100%) rename src/{app/space/components => shared}/notes/replies/item.tsx (63%) rename src/{app/space/components => shared}/notes/replies/list.tsx (95%) rename src/{app/space/components => shared}/notes/rootNote.tsx (82%) rename src/{app/space/components => shared}/notes/skeleton.tsx (100%) rename src/{app/space/components/user/repost.tsx => shared/user.tsx} (84%) create mode 100644 src/utils/types.ts diff --git a/src/app/channel/components/messages/item.tsx b/src/app/channel/components/messages/item.tsx index 3d8482e3..96bbc6a0 100644 --- a/src/app/channel/components/messages/item.tsx +++ b/src/app/channel/components/messages/item.tsx @@ -3,9 +3,9 @@ import { MessageMuteButton } from "@app/channel/components/messages/muteButton"; import { MessageReplyButton } from "@app/channel/components/messages/replyButton"; import { ChannelMessageUser } from "@app/channel/components/messages/user"; import { ChannelMessageUserMute } from "@app/channel/components/messages/userMute"; -import { MentionNote } from "@app/space/components/notes/mentions/note"; -import { ImagePreview } from "@app/space/components/notes/preview/image"; -import { VideoPreview } from "@app/space/components/notes/preview/video"; +import { MentionNote } from "@shared/notes/mentions/note"; +import { ImagePreview } from "@shared/notes/preview/image"; +import { VideoPreview } from "@shared/notes/preview/video"; import { parser } from "@utils/parser"; import { useMemo, useState } from "react"; diff --git a/src/app/chat/components/messages/item.tsx b/src/app/chat/components/messages/item.tsx index 7f6be2cb..2dfc26c4 100644 --- a/src/app/chat/components/messages/item.tsx +++ b/src/app/chat/components/messages/item.tsx @@ -1,8 +1,8 @@ import { ChatMessageUser } from "@app/chat/components/messages/user"; import { useDecryptMessage } from "@app/chat/hooks/useDecryptMessage"; -import { MentionNote } from "@app/space/components/notes/mentions/note"; -import { ImagePreview } from "@app/space/components/notes/preview/image"; -import { VideoPreview } from "@app/space/components/notes/preview/video"; +import { MentionNote } from "@shared/notes/mentions/note"; +import { ImagePreview } from "@shared/notes/preview/image"; +import { VideoPreview } from "@shared/notes/preview/video"; import { parser } from "@utils/parser"; import { memo } from "react"; diff --git a/src/app/chat/pages/index.page.tsx b/src/app/chat/pages/index.page.tsx index 103adf37..5e442b1c 100644 --- a/src/app/chat/pages/index.page.tsx +++ b/src/app/chat/pages/index.page.tsx @@ -6,6 +6,7 @@ import { useActiveAccount } from "@stores/accounts"; import { useChatMessages } from "@stores/chats"; import { dateToUnix } from "@utils/date"; import { usePageContext } from "@utils/hooks/usePageContext"; +import { LumeEvent } from "@utils/types"; import { useContext, useEffect } from "react"; import useSWRSubscription from "swr/subscription"; @@ -31,7 +32,7 @@ export function Page() { since: dateToUnix(), }); - sub.addListener("event", (event: any) => { + sub.addListener("event", (event: LumeEvent) => { add(account.pubkey, event); }); diff --git a/src/app/space/components/blocks/feed.tsx b/src/app/space/components/blocks/feed.tsx index be10c6f5..31cb9d5e 100644 --- a/src/app/space/components/blocks/feed.tsx +++ b/src/app/space/components/blocks/feed.tsx @@ -1,8 +1,8 @@ -import { NoteBase } from "@app/space/components/notes/base"; -import { NoteQuoteRepost } from "@app/space/components/notes/quoteRepost"; -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; import { getNotesByAuthor } from "@libs/storage"; import { CancelIcon } from "@shared/icons"; +import { NoteBase } from "@shared/notes/base"; +import { NoteQuoteRepost } from "@shared/notes/quoteRepost"; +import { NoteSkeleton } from "@shared/notes/skeleton"; import { useActiveAccount } from "@stores/accounts"; import { useVirtualizer } from "@tanstack/react-virtual"; import { useEffect, useMemo, useRef } from "react"; diff --git a/src/app/space/components/blocks/following.tsx b/src/app/space/components/blocks/following.tsx index a6281120..a713a5d4 100644 --- a/src/app/space/components/blocks/following.tsx +++ b/src/app/space/components/blocks/following.tsx @@ -1,8 +1,8 @@ -import { NoteBase } from "@app/space/components/notes/base"; -import { NoteQuoteRepost } from "@app/space/components/notes/quoteRepost"; -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; import { createNote, getNotes } from "@libs/storage"; import { NDKEvent } from "@nostr-dev-kit/ndk"; +import { NoteBase } from "@shared/notes/base"; +import { NoteQuoteRepost } from "@shared/notes/quoteRepost"; +import { NoteSkeleton } from "@shared/notes/skeleton"; import { RelayContext } from "@shared/relayProvider"; import { useActiveAccount } from "@stores/accounts"; import { useVirtualizer } from "@tanstack/react-virtual"; diff --git a/src/app/space/components/blocks/thread.tsx b/src/app/space/components/blocks/thread.tsx index 244ca191..ad748294 100644 --- a/src/app/space/components/blocks/thread.tsx +++ b/src/app/space/components/blocks/thread.tsx @@ -1,12 +1,12 @@ -import { Kind1 } from "@app/space/components/notes/kind1"; -import { Kind1063 } from "@app/space/components/notes/kind1063"; -import { NoteMetadata } from "@app/space/components/notes/metadata"; -import { NoteReplyForm } from "@app/space/components/notes/replies/form"; -import { RepliesList } from "@app/space/components/notes/replies/list"; -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; -import { NoteDefaultUser } from "@app/space/components/user/default"; import { getNoteByID } from "@libs/storage"; import { ArrowLeftIcon } from "@shared/icons"; +import { Kind1 } from "@shared/notes/kind1"; +import { Kind1063 } from "@shared/notes/kind1063"; +import { NoteMetadata } from "@shared/notes/metadata"; +import { NoteReplyForm } from "@shared/notes/replies/form"; +import { RepliesList } from "@shared/notes/replies/list"; +import { NoteSkeleton } from "@shared/notes/skeleton"; +import { User } from "@shared/user"; import { useActiveAccount } from "@stores/accounts"; import { parser } from "@utils/parser"; import useSWR from "swr"; @@ -48,7 +48,7 @@ export function ThreadBlock({ params }: { params: any }) { ) : (
- +
{data.kind === 1 && } {data.kind === 1063 && } diff --git a/src/app/space/components/notes/wrapper.tsx b/src/app/space/components/notes/wrapper.tsx deleted file mode 100644 index f74db4ff..00000000 --- a/src/app/space/components/notes/wrapper.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { useActiveAccount } from "@stores/accounts"; - -export function NoteWrapper({ - children, - thread, - block, - className, -}: { - children: React.ReactNode; - thread: string; - block: number; - className: string; -}) { - const addTempBlock = useActiveAccount((state: any) => state.addTempBlock); - - const openThread = (event: any, thread: string) => { - const selection = window.getSelection(); - if (selection.toString().length === 0) { - addTempBlock(block, 2, "Thread", thread); - } else { - event.stopPropagation(); - } - }; - - return ( -
openThread(e, thread)} - onKeyDown={(e) => openThread(e, thread)} - className={className} - > - {children} -
- ); -} diff --git a/src/app/space/components/user/default.tsx b/src/app/space/components/user/default.tsx deleted file mode 100644 index f192e5ee..00000000 --- a/src/app/space/components/user/default.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { Popover, Transition } from "@headlessui/react"; -import { Image } from "@shared/image"; -import { DEFAULT_AVATAR } from "@stores/constants"; -import { useProfile } from "@utils/hooks/useProfile"; -import { shortenKey } from "@utils/shortenKey"; -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; -import { Fragment } from "react"; - -dayjs.extend(relativeTime); - -export function NoteDefaultUser({ - pubkey, - time, -}: { - pubkey: string; - time: number; -}) { - const { user } = useProfile(pubkey); - - return ( - - - {pubkey} - -
-
- {user?.nip05 || user?.name || shortenKey(pubkey)} -
- · - - {dayjs().to(dayjs.unix(time), true)} - -
- - -
e.stopPropagation()} - onKeyDown={(e) => e.stopPropagation()} - className="w-full max-w-xs overflow-hidden rounded-lg border border-zinc-700 bg-zinc-900 shadow-input ring-1 ring-black ring-opacity-5" - > -
- {pubkey} -
-
-
- {user?.displayName || user?.name || ( -
- )} -
- - {user?.nip05 || shortenKey(pubkey)} - -
-
-

- {user?.about} -

-
-
-
- -
-
-
-
- ); -} diff --git a/src/app/space/components/user/quote.tsx b/src/app/space/components/user/quote.tsx deleted file mode 100644 index f6c88ec5..00000000 --- a/src/app/space/components/user/quote.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Image } from "@shared/image"; -import { DEFAULT_AVATAR } from "@stores/constants"; -import { useProfile } from "@utils/hooks/useProfile"; -import { shortenKey } from "@utils/shortenKey"; -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; - -dayjs.extend(relativeTime); - -export function NoteQuoteUser({ - pubkey, - time, -}: { - pubkey: string; - time: number; -}) { - const { user } = useProfile(pubkey); - - return ( -
-
- {pubkey} -
-
-
- - {user?.nip05 || user?.name || shortenKey(pubkey)} - - · - - {dayjs().to(dayjs.unix(time), true)} - -
-
-
- ); -} diff --git a/src/app/space/components/user/reply.tsx b/src/app/space/components/user/reply.tsx deleted file mode 100644 index e81ea0ac..00000000 --- a/src/app/space/components/user/reply.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Image } from "@shared/image"; -import { DEFAULT_AVATAR } from "@stores/constants"; -import { useProfile } from "@utils/hooks/useProfile"; -import { shortenKey } from "@utils/shortenKey"; -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; - -dayjs.extend(relativeTime); - -export function NoteReplyUser({ - pubkey, - time, -}: { - pubkey: string; - time: number; -}) { - const { user } = useProfile(pubkey); - - return ( -
-
- {pubkey} -
-
-
- - {user?.nip05 || user?.name || shortenKey(pubkey)} - - · - - {dayjs().to(dayjs.unix(time), true)} - -
-
-
- ); -} diff --git a/src/app/trending/components/profile.tsx b/src/app/trending/components/profile.tsx index b9ddb4ba..70e98f56 100644 --- a/src/app/trending/components/profile.tsx +++ b/src/app/trending/components/profile.tsx @@ -22,8 +22,6 @@ export function Profile({ data }: { data: any }) {
); - console.log(userStats); - return (
diff --git a/src/app/trending/components/trendingNotes.tsx b/src/app/trending/components/trendingNotes.tsx new file mode 100644 index 00000000..7ccc8c57 --- /dev/null +++ b/src/app/trending/components/trendingNotes.tsx @@ -0,0 +1,40 @@ +import { Profile } from "@app/trending/components/profile"; +import { NoteBase } from "@shared/notes/base"; +import { NoteSkeleton } from "@shared/notes/skeleton"; +import useSWR from "swr"; + +const fetcher = (url: string) => fetch(url).then((r) => r.json()); + +export function TrendingNotes() { + const { data, error } = useSWR( + "https://api.nostr.band/v0/trending/notes", + fetcher, + ); + + return ( +
+
+

Trending Profiles

+
+
+ {error &&

Failed to load...

} + {!data ? ( +
+
+ +
+
+ ) : ( +
+ {data.notes.map((item) => ( + + ))} +
+ )} +
+
+ ); +} diff --git a/src/app/trending/components/trendingProfiles.tsx b/src/app/trending/components/trendingProfiles.tsx index 333d4ba4..4303139b 100644 --- a/src/app/trending/components/trendingProfiles.tsx +++ b/src/app/trending/components/trendingProfiles.tsx @@ -1,5 +1,5 @@ -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; import { Profile } from "@app/trending/components/profile"; +import { NoteSkeleton } from "@shared/notes/skeleton"; import useSWR from "swr"; const fetcher = (url: string) => fetch(url).then((r) => r.json()); diff --git a/src/app/trending/pages/index.page.tsx b/src/app/trending/pages/index.page.tsx index 3d4ed841..872bd7e5 100644 --- a/src/app/trending/pages/index.page.tsx +++ b/src/app/trending/pages/index.page.tsx @@ -1,9 +1,11 @@ +import { TrendingNotes } from "@app/trending/components/trendingNotes"; import { TrendingProfiles } from "@app/trending/components/trendingProfiles"; export function Page() { return (
+
); } diff --git a/src/app/space/components/notes/base.tsx b/src/shared/notes/base.tsx similarity index 53% rename from src/app/space/components/notes/base.tsx rename to src/shared/notes/base.tsx index 6fbf55b2..2f72c74a 100644 --- a/src/app/space/components/notes/base.tsx +++ b/src/shared/notes/base.tsx @@ -1,13 +1,18 @@ -import { Kind1 } from "@app/space/components/notes/kind1"; -import { Kind1063 } from "@app/space/components/notes/kind1063"; -import { NoteMetadata } from "@app/space/components/notes/metadata"; -import { NoteParent } from "@app/space/components/notes/parent"; -import { NoteDefaultUser } from "@app/space/components/user/default"; +import { Kind1 } from "@shared/notes/kind1"; +import { Kind1063 } from "@shared/notes/kind1063"; +import { NoteMetadata } from "@shared/notes/metadata"; +import { NoteParent } from "@shared/notes/parent"; +import { User } from "@shared/user"; import { parser } from "@utils/parser"; import { isTagsIncludeID } from "@utils/transform"; +import { LumeEvent } from "@utils/types"; import { useMemo } from "react"; -export function NoteBase({ block, event }: { block: number; event: any }) { +export function NoteBase({ + event, + block, + metadata, +}: { event: LumeEvent; block?: number; metadata?: boolean }) { const content = useMemo(() => parser(event), [event]); const checkParentID = isTagsIncludeID(event.parent_id, event.tags); @@ -21,15 +26,19 @@ export function NoteBase({ block, event }: { block: number; event: any }) { <> )}
- +
{event.kind === 1 && } {event.kind === 1063 && } - + {metadata ? ( + + ) : ( +
+ )}
diff --git a/src/app/space/components/notes/kind1.tsx b/src/shared/notes/kind1.tsx similarity index 78% rename from src/app/space/components/notes/kind1.tsx rename to src/shared/notes/kind1.tsx index f6fd1b4d..e24e46c1 100644 --- a/src/app/space/components/notes/kind1.tsx +++ b/src/shared/notes/kind1.tsx @@ -1,7 +1,7 @@ import { LinkPreview } from "./preview/link"; -import { MentionNote } from "@app/space/components/notes/mentions/note"; -import { ImagePreview } from "@app/space/components/notes/preview/image"; -import { VideoPreview } from "@app/space/components/notes/preview/video"; +import { MentionNote } from "@shared/notes/mentions/note"; +import { ImagePreview } from "@shared/notes/preview/image"; +import { VideoPreview } from "@shared/notes/preview/video"; import { truncateContent } from "@utils/transform"; export function Kind1({ @@ -10,7 +10,7 @@ export function Kind1({ }: { content: any; truncate?: boolean }) { return ( <> -
+
{truncate ? truncateContent(content.parsed, 120) : content.parsed}
{Array.isArray(content.images) && content.images.length ? ( diff --git a/src/app/space/components/notes/kind1063.tsx b/src/shared/notes/kind1063.tsx similarity index 75% rename from src/app/space/components/notes/kind1063.tsx rename to src/shared/notes/kind1063.tsx index 12782b73..f30a3b0d 100644 --- a/src/app/space/components/notes/kind1063.tsx +++ b/src/shared/notes/kind1063.tsx @@ -1,10 +1,11 @@ +import { NDKTag } from "@nostr-dev-kit/ndk"; import { Image } from "@shared/image"; function isImage(url: string) { return /\.(jpg|jpeg|gif|png|webp|avif)$/.test(url); } -export function Kind1063({ metadata }: { metadata: string[] }) { +export function Kind1063({ metadata }: { metadata: NDKTag[] }) { const url = metadata[0][1]; return ( diff --git a/src/app/space/components/notes/mentions/note.tsx b/src/shared/notes/mentions/note.tsx similarity index 68% rename from src/app/space/components/notes/mentions/note.tsx rename to src/shared/notes/mentions/note.tsx index f6619fd1..ef5eac2e 100644 --- a/src/app/space/components/notes/mentions/note.tsx +++ b/src/shared/notes/mentions/note.tsx @@ -1,8 +1,7 @@ -import { Kind1 } from "@app/space/components/notes/kind1"; -import { Kind1063 } from "@app/space/components/notes/kind1063"; -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; -import { NoteWrapper } from "@app/space/components/notes/wrapper"; -import { NoteQuoteUser } from "@app/space/components/user/quote"; +import { Kind1 } from "@shared/notes/kind1"; +import { Kind1063 } from "@shared/notes/kind1063"; +import { NoteSkeleton } from "@shared/notes/skeleton"; +import { User } from "@shared/user"; import { useEvent } from "@utils/hooks/useEvent"; import { parser } from "@utils/parser"; import { memo } from "react"; @@ -14,14 +13,10 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { const kind1063 = data?.kind === 1063 ? data.tags : null; return ( - +
{data ? ( <> - +
{kind1 && } {kind1063 && } @@ -45,6 +40,6 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { ) : ( )} - +
); }); diff --git a/src/app/space/components/notes/mentions/user.tsx b/src/shared/notes/mentions/user.tsx similarity index 100% rename from src/app/space/components/notes/mentions/user.tsx rename to src/shared/notes/mentions/user.tsx diff --git a/src/app/space/components/notes/metadata.tsx b/src/shared/notes/metadata.tsx similarity index 90% rename from src/app/space/components/notes/metadata.tsx rename to src/shared/notes/metadata.tsx index 67718b86..92e638b1 100644 --- a/src/app/space/components/notes/metadata.tsx +++ b/src/shared/notes/metadata.tsx @@ -1,9 +1,9 @@ -import { NoteReply } from "@app/space/components/notes/metadata/reply"; -import { NoteRepost } from "@app/space/components/notes/metadata/repost"; -import { NoteZap } from "@app/space/components/notes/metadata/zap"; import { createReplyNote } from "@libs/storage"; import { NDKEvent, NDKFilter } from "@nostr-dev-kit/ndk"; import { LoaderIcon, ReplyIcon, RepostIcon, ZapIcon } from "@shared/icons"; +import { NoteReply } from "@shared/notes/metadata/reply"; +import { NoteRepost } from "@shared/notes/metadata/repost"; +import { NoteZap } from "@shared/notes/metadata/zap"; import { RelayContext } from "@shared/relayProvider"; import { decode } from "light-bolt11-decoder"; import { useContext } from "react"; @@ -70,7 +70,7 @@ export function NoteMetadata({ const { data, isLoading } = useSWR(["note-metadata", ndk, id], fetcher); return ( -
+
{!data || isLoading ? ( <>
diff --git a/src/app/space/components/notes/metadata/reply.tsx b/src/shared/notes/metadata/reply.tsx similarity index 100% rename from src/app/space/components/notes/metadata/reply.tsx rename to src/shared/notes/metadata/reply.tsx diff --git a/src/app/space/components/notes/metadata/repost.tsx b/src/shared/notes/metadata/repost.tsx similarity index 100% rename from src/app/space/components/notes/metadata/repost.tsx rename to src/shared/notes/metadata/repost.tsx diff --git a/src/app/space/components/notes/metadata/zap.tsx b/src/shared/notes/metadata/zap.tsx similarity index 100% rename from src/app/space/components/notes/metadata/zap.tsx rename to src/shared/notes/metadata/zap.tsx diff --git a/src/app/space/components/notes/parent.tsx b/src/shared/notes/parent.tsx similarity index 77% rename from src/app/space/components/notes/parent.tsx rename to src/shared/notes/parent.tsx index cc3479e9..00f9cb2d 100644 --- a/src/app/space/components/notes/parent.tsx +++ b/src/shared/notes/parent.tsx @@ -1,8 +1,8 @@ -import { Kind1 } from "@app/space/components/notes/kind1"; -import { Kind1063 } from "@app/space/components/notes/kind1063"; -import { NoteMetadata } from "@app/space/components/notes/metadata"; -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; -import { NoteDefaultUser } from "@app/space/components/user/default"; +import { Kind1 } from "@shared/notes/kind1"; +import { Kind1063 } from "@shared/notes/kind1063"; +import { NoteMetadata } from "@shared/notes/metadata"; +import { NoteSkeleton } from "@shared/notes/skeleton"; +import { User } from "@shared/user"; import { useEvent } from "@utils/hooks/useEvent"; import { parser } from "@utils/parser"; import { memo } from "react"; @@ -18,7 +18,7 @@ export const NoteParent = memo(function NoteParent({ id }: { id: string }) {
{data ? ( <> - +
{kind1 && } {kind1063 && } diff --git a/src/app/space/components/notes/preview/image.tsx b/src/shared/notes/preview/image.tsx similarity index 100% rename from src/app/space/components/notes/preview/image.tsx rename to src/shared/notes/preview/image.tsx diff --git a/src/app/space/components/notes/preview/link.tsx b/src/shared/notes/preview/link.tsx similarity index 96% rename from src/app/space/components/notes/preview/link.tsx rename to src/shared/notes/preview/link.tsx index 533e9b0a..84493c65 100644 --- a/src/app/space/components/notes/preview/link.tsx +++ b/src/shared/notes/preview/link.tsx @@ -28,7 +28,7 @@ export function LinkPreview({ urls }: { urls: string[] }) { {urls[0]} )}
diff --git a/src/app/space/components/notes/preview/video.tsx b/src/shared/notes/preview/video.tsx similarity index 100% rename from src/app/space/components/notes/preview/video.tsx rename to src/shared/notes/preview/video.tsx diff --git a/src/app/space/components/notes/quoteRepost.tsx b/src/shared/notes/quoteRepost.tsx similarity index 67% rename from src/app/space/components/notes/quoteRepost.tsx rename to src/shared/notes/quoteRepost.tsx index a948d92b..63fca065 100644 --- a/src/app/space/components/notes/quoteRepost.tsx +++ b/src/shared/notes/quoteRepost.tsx @@ -1,11 +1,12 @@ -import { RootNote } from "@app/space/components/notes/rootNote"; -import { NoteRepostUser } from "@app/space/components/user/repost"; +import { RootNote } from "@shared/notes/rootNote"; +import { User } from "@shared/user"; import { getQuoteID } from "@utils/transform"; +import { LumeEvent } from "@utils/types"; export function NoteQuoteRepost({ block, event, -}: { block: number; event: any }) { +}: { block: number; event: LumeEvent }) { const rootID = getQuoteID(event.tags); return ( @@ -13,7 +14,7 @@ export function NoteQuoteRepost({
- +
diff --git a/src/app/space/components/notes/replies/form.tsx b/src/shared/notes/replies/form.tsx similarity index 100% rename from src/app/space/components/notes/replies/form.tsx rename to src/shared/notes/replies/form.tsx diff --git a/src/app/space/components/notes/replies/item.tsx b/src/shared/notes/replies/item.tsx similarity index 63% rename from src/app/space/components/notes/replies/item.tsx rename to src/shared/notes/replies/item.tsx index 65ee7f66..6e4d0108 100644 --- a/src/app/space/components/notes/replies/item.tsx +++ b/src/shared/notes/replies/item.tsx @@ -1,6 +1,6 @@ -import { Kind1 } from "@app/space/components/notes/kind1"; -import { NoteMetadata } from "@app/space/components/notes/metadata"; -import { NoteReplyUser } from "@app/space/components/user/reply"; +import { Kind1 } from "@shared/notes/kind1"; +import { NoteMetadata } from "@shared/notes/metadata"; +import { User } from "@shared/user"; import { parser } from "@utils/parser"; export function Reply({ data }: { data: any }) { @@ -9,7 +9,7 @@ export function Reply({ data }: { data: any }) { return (
- +
diff --git a/src/app/space/components/notes/replies/list.tsx b/src/shared/notes/replies/list.tsx similarity index 95% rename from src/app/space/components/notes/replies/list.tsx rename to src/shared/notes/replies/list.tsx index 1df39bbf..34b777d5 100644 --- a/src/app/space/components/notes/replies/list.tsx +++ b/src/shared/notes/replies/list.tsx @@ -1,5 +1,5 @@ -import { Reply } from "@app/space/components/notes/replies/item"; import { NDKEvent, NDKFilter } from "@nostr-dev-kit/ndk"; +import { Reply } from "@shared/notes/replies/item"; import { RelayContext } from "@shared/relayProvider"; import { useContext } from "react"; import useSWR from "swr"; diff --git a/src/app/space/components/notes/rootNote.tsx b/src/shared/notes/rootNote.tsx similarity index 82% rename from src/app/space/components/notes/rootNote.tsx rename to src/shared/notes/rootNote.tsx index c6dadc9f..7da67da6 100644 --- a/src/app/space/components/notes/rootNote.tsx +++ b/src/shared/notes/rootNote.tsx @@ -1,10 +1,10 @@ -import { Kind1 } from "@app/space/components/notes/kind1"; -import { Kind1063 } from "@app/space/components/notes/kind1063"; -import { NoteMetadata } from "@app/space/components/notes/metadata"; -import { NoteSkeleton } from "@app/space/components/notes/skeleton"; -import { NoteDefaultUser } from "@app/space/components/user/default"; import { NDKEvent } from "@nostr-dev-kit/ndk"; +import { Kind1 } from "@shared/notes/kind1"; +import { Kind1063 } from "@shared/notes/kind1063"; +import { NoteMetadata } from "@shared/notes/metadata"; +import { NoteSkeleton } from "@shared/notes/skeleton"; import { RelayContext } from "@shared/relayProvider"; +import { User } from "@shared/user"; import { parser } from "@utils/parser"; import { memo, useContext } from "react"; import useSWRSubscription from "swr/subscription"; @@ -51,10 +51,7 @@ export const RootNote = memo(function RootNote({ return (
- +
{data ? ( <> - +
{kind1 && } {kind1063 && } diff --git a/src/app/space/components/notes/skeleton.tsx b/src/shared/notes/skeleton.tsx similarity index 100% rename from src/app/space/components/notes/skeleton.tsx rename to src/shared/notes/skeleton.tsx diff --git a/src/app/space/components/user/repost.tsx b/src/shared/user.tsx similarity index 84% rename from src/app/space/components/user/repost.tsx rename to src/shared/user.tsx index 33e1ced0..a2b06a42 100644 --- a/src/app/space/components/user/repost.tsx +++ b/src/shared/user.tsx @@ -9,29 +9,38 @@ import { Fragment } from "react"; dayjs.extend(relativeTime); -export function NoteRepostUser({ +export function User({ pubkey, time, -}: { pubkey: string; time: number }) { + size, + repost, +}: { pubkey: string; time: number; size?: string; repost?: boolean }) { const { user } = useProfile(pubkey); + const avatarWidth = size === "small" ? "w-6" : "w-11"; + const avatarHeight = size === "small" ? "h-6" : "h-11"; + return ( - + {pubkey}
{user?.nip05 || user?.name || shortenKey(pubkey)}
- - {" "} - reposted - + {repost && ( + + {" "} + reposted + + )} · {dayjs().to(dayjs.unix(time), true)} diff --git a/src/stores/constants.tsx b/src/stores/constants.tsx index 087df62b..dfbda84c 100644 --- a/src/stores/constants.tsx +++ b/src/stores/constants.tsx @@ -11,6 +11,6 @@ export const FULL_RELAYS = [ "wss://welcome.nostr.wine", "wss://relay.nostr.band", "wss://relay.damus.io", - "wss://relayable.org", + "wss://relay.nostrich.land", "wss://nostr.mutinywallet.com", ]; diff --git a/src/utils/parser.tsx b/src/utils/parser.tsx index 17792070..effeefb9 100644 --- a/src/utils/parser.tsx +++ b/src/utils/parser.tsx @@ -1,4 +1,4 @@ -import { MentionUser } from "@app/space/components/notes/mentions/user"; +import { MentionUser } from "@shared/notes/mentions/user"; import destr from "destr"; import getUrls from "get-urls"; import { parseReferences } from "nostr-tools"; diff --git a/src/utils/transform.tsx b/src/utils/transform.tsx index 8d413694..ac8fed55 100644 --- a/src/utils/transform.tsx +++ b/src/utils/transform.tsx @@ -1,3 +1,4 @@ +import { NDKTag } from "@nostr-dev-kit/ndk"; import destr from "destr"; import { nip19 } from "nostr-tools"; @@ -66,7 +67,7 @@ export function getParentID(arr: string[], fallback: string) { } // check id present in event tags -export function isTagsIncludeID(id: string, arr: string[]) { +export function isTagsIncludeID(id: string, arr: NDKTag[]) { const tags = destr(arr); if (tags.length > 0) { @@ -79,7 +80,7 @@ export function isTagsIncludeID(id: string, arr: string[]) { } // get parent id from event tags -export function getQuoteID(arr: string[]) { +export function getQuoteID(arr: NDKTag[]) { const tags = destr(arr); let quoteID = null; diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 00000000..315cfc38 --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,6 @@ +import { NDKEvent } from "@nostr-dev-kit/ndk"; + +export interface LumeEvent extends NDKEvent { + event_id: string; + parent_id: string; +}