From 78725c1d147f359e9dcab841ee7c9e9255ad5b2e Mon Sep 17 00:00:00 2001 From: codytseng Date: Sat, 19 Jul 2025 17:24:51 +0800 Subject: [PATCH] refactor --- src/components/AccountManager/index.tsx | 4 +- src/components/BookmarkList/index.tsx | 4 +- src/components/ClientSelect/index.tsx | 6 +- src/components/Content/index.tsx | 12 +- .../CommunityDefinitionPreview.tsx | 4 +- .../ContentPreview/GroupMetadataPreview.tsx | 4 +- .../ContentPreview/LiveEventPreview.tsx | 4 +- .../ContentPreview/LongFormArticlePreview.tsx | 4 +- .../ContentPreview/NormalContentPreview.tsx | 4 +- src/components/ImageCarousel/index.tsx | 2 +- src/components/Note/CommunityDefinition.tsx | 4 +- src/components/Note/GroupMetadata.tsx | 4 +- src/components/Note/Highlight.tsx | 4 +- src/components/Note/LiveEvent.tsx | 4 +- src/components/Note/LongFormArticle.tsx | 4 +- src/components/Note/index.tsx | 8 +- src/components/NoteOptions/index.tsx | 12 +- src/components/NoteStats/RepostButton.tsx | 4 +- .../NotificationItem/ZapNotification.tsx | 4 +- src/components/PictureContent/index.tsx | 7 +- src/components/PictureNoteCard/index.tsx | 4 +- src/components/PostEditor/Mentions.tsx | 53 +- src/components/ReplyNoteList/index.tsx | 48 +- src/hooks/useFetchFollowings.tsx | 4 +- src/lib/common.ts | 11 - src/lib/draft-event.ts | 178 ++++- src/lib/event-metadata.ts | 264 ++++++++ src/lib/event.ts | 610 ++---------------- src/lib/lightning.ts | 2 +- src/lib/link.ts | 13 +- src/lib/tag.ts | 59 +- src/lib/utils.ts | 8 + src/pages/secondary/NotePage/index.tsx | 8 +- .../BlossomServerListSetting.tsx | 4 +- .../secondary/ProfileEditorPage/index.tsx | 2 +- .../WalletPage/LightningAddressInput.tsx | 2 +- src/providers/FavoriteRelaysProvider.tsx | 5 +- src/providers/FeedProvider.tsx | 4 +- src/providers/FollowListProvider.tsx | 4 +- src/providers/MuteListProvider.tsx | 6 +- src/providers/NostrProvider/index.tsx | 20 +- src/providers/ReplyProvider.tsx | 15 +- src/services/client.service.ts | 18 +- src/services/lightning.service.ts | 11 +- src/services/note-stats.service.ts | 8 +- 45 files changed, 698 insertions(+), 766 deletions(-) delete mode 100644 src/lib/common.ts create mode 100644 src/lib/event-metadata.ts diff --git a/src/components/AccountManager/index.tsx b/src/components/AccountManager/index.tsx index 2cfca6fe..8a953d19 100644 --- a/src/components/AccountManager/index.tsx +++ b/src/components/AccountManager/index.tsx @@ -1,14 +1,14 @@ import { Button } from '@/components/ui/button' import { Separator } from '@/components/ui/separator' -import { isDevEnv } from '@/lib/common' +import { isDevEnv } from '@/lib/utils' import { useNostr } from '@/providers/NostrProvider' import { useTheme } from '@/providers/ThemeProvider' import { NstartModal } from 'nstart-modal' import { useState } from 'react' import { useTranslation } from 'react-i18next' import AccountList from '../AccountList' -import NostrConnectLogin from './NostrConnectionLogin' import GenerateNewAccount from './GenerateNewAccount' +import NostrConnectLogin from './NostrConnectionLogin' import NpubLogin from './NpubLogin' import PrivateKeyLogin from './PrivateKeyLogin' diff --git a/src/components/BookmarkList/index.tsx b/src/components/BookmarkList/index.tsx index 1a24d4a1..1b5ed169 100644 --- a/src/components/BookmarkList/index.tsx +++ b/src/components/BookmarkList/index.tsx @@ -1,5 +1,5 @@ import { useFetchEvent } from '@/hooks' -import { generateEventIdFromETag } from '@/lib/tag' +import { generateBech32IdFromETag } from '@/lib/tag' import { useNostr } from '@/providers/NostrProvider' import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -15,7 +15,7 @@ export default function BookmarkList() { return ( bookmarkListEvent.tags - .map((tag) => (tag[0] === 'e' ? generateEventIdFromETag(tag) : undefined)) + .map((tag) => (tag[0] === 'e' ? generateBech32IdFromETag(tag) : undefined)) .filter(Boolean) as `nevent1${string}`[] ).reverse() }, [bookmarkListEvent]) diff --git a/src/components/ClientSelect/index.tsx b/src/components/ClientSelect/index.tsx index 612b57a8..2efe9394 100644 --- a/src/components/ClientSelect/index.tsx +++ b/src/components/ClientSelect/index.tsx @@ -3,7 +3,7 @@ import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog' import { Drawer, DrawerContent, DrawerOverlay, DrawerTrigger } from '@/components/ui/drawer' import { Separator } from '@/components/ui/separator' import { ExtendedKind } from '@/constants' -import { getReplaceableEventIdentifier, getSharableEventId } from '@/lib/event' +import { getReplaceableEventIdentifier, getNoteBech32Id } from '@/lib/event' import { toChachiChat } from '@/lib/link' import { useScreenSize } from '@/providers/ScreenSizeProvider' import clientService from '@/services/client.service' @@ -139,7 +139,7 @@ export default function ClientSelect({ setOpen(false)} - href={client.getUrl(originalNoteId ?? getSharableEventId(event!))} + href={client.getUrl(originalNoteId ?? getNoteBech32Id(event!))} name={client.name} /> ) @@ -150,7 +150,7 @@ export default function ClientSelect({ variant="ghost" className="w-full py-6 font-semibold" onClick={() => { - navigator.clipboard.writeText(originalNoteId ?? getSharableEventId(event!)) + navigator.clipboard.writeText(originalNoteId ?? getNoteBech32Id(event!)) setOpen(false) }} > diff --git a/src/components/Content/index.tsx b/src/components/Content/index.tsx index 3fd6cedb..8d0bbd2b 100644 --- a/src/components/Content/index.tsx +++ b/src/components/Content/index.tsx @@ -11,8 +11,8 @@ import { EmbeddedWebsocketUrlParser, parseContent } from '@/lib/content-parser' -import { extractEmojiInfosFromTags } from '@/lib/event' -import { extractImageInfoFromTag } from '@/lib/tag' +import { getImageInfosFromEvent } from '@/lib/event' +import { getEmojiInfosFromEmojiTags, getImageInfoFromImetaTag } from '@/lib/tag' import { cn } from '@/lib/utils' import mediaUpload from '@/services/media-upload.service' import { TImageInfo } from '@/types' @@ -45,9 +45,7 @@ const Content = memo(({ event, className }: { event: Event; className?: string } EmbeddedEmojiParser ]) - const imageInfos = event.tags - .map((tag) => extractImageInfoFromTag(tag, event.pubkey)) - .filter(Boolean) as TImageInfo[] + const imageInfos = getImageInfosFromEvent(event) const allImages = nodes .map((node) => { if (node.type === 'image') { @@ -57,7 +55,7 @@ const Content = memo(({ event, className }: { event: Event; className?: string } } const tag = mediaUpload.getImetaTagByUrl(node.data) return tag - ? extractImageInfoFromTag(tag, event.pubkey) + ? getImageInfoFromImetaTag(tag, event.pubkey) : { url: node.data, pubkey: event.pubkey } } if (node.type === 'images') { @@ -73,7 +71,7 @@ const Content = memo(({ event, className }: { event: Event; className?: string } .flat() as TImageInfo[] let imageIndex = 0 - const emojiInfos = extractEmojiInfosFromTags(event.tags) + const emojiInfos = getEmojiInfosFromEmojiTags(event.tags) const lastNormalUrlNode = nodes.findLast((node) => node.type === 'url') const lastNormalUrl = diff --git a/src/components/ContentPreview/CommunityDefinitionPreview.tsx b/src/components/ContentPreview/CommunityDefinitionPreview.tsx index 8f3a16b1..0f58db70 100644 --- a/src/components/ContentPreview/CommunityDefinitionPreview.tsx +++ b/src/components/ContentPreview/CommunityDefinitionPreview.tsx @@ -1,4 +1,4 @@ -import { getCommunityDefinition } from '@/lib/event' +import { getCommunityDefinitionFromEvent } from '@/lib/event-metadata' import { cn } from '@/lib/utils' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -14,7 +14,7 @@ export default function CommunityDefinitionPreview({ onClick?: React.MouseEventHandler | undefined }) { const { t } = useTranslation() - const metadata = useMemo(() => getCommunityDefinition(event), [event]) + const metadata = useMemo(() => getCommunityDefinitionFromEvent(event), [event]) return (
diff --git a/src/components/ContentPreview/GroupMetadataPreview.tsx b/src/components/ContentPreview/GroupMetadataPreview.tsx index 101dfc4b..842bb1db 100644 --- a/src/components/ContentPreview/GroupMetadataPreview.tsx +++ b/src/components/ContentPreview/GroupMetadataPreview.tsx @@ -1,4 +1,4 @@ -import { getGroupMetadata } from '@/lib/event' +import { getGroupMetadataFromEvent } from '@/lib/event-metadata' import { cn } from '@/lib/utils' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -14,7 +14,7 @@ export default function GroupMetadataPreview({ onClick?: React.MouseEventHandler | undefined }) { const { t } = useTranslation() - const metadata = useMemo(() => getGroupMetadata(event), [event]) + const metadata = useMemo(() => getGroupMetadataFromEvent(event), [event]) return (
diff --git a/src/components/ContentPreview/LiveEventPreview.tsx b/src/components/ContentPreview/LiveEventPreview.tsx index 887b1a49..1239379f 100644 --- a/src/components/ContentPreview/LiveEventPreview.tsx +++ b/src/components/ContentPreview/LiveEventPreview.tsx @@ -1,4 +1,4 @@ -import { getLiveEventMetadata } from '@/lib/event' +import { getLiveEventMetadataFromEvent } from '@/lib/event-metadata' import { cn } from '@/lib/utils' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -14,7 +14,7 @@ export default function LiveEventPreview({ onClick?: React.MouseEventHandler | undefined }) { const { t } = useTranslation() - const metadata = useMemo(() => getLiveEventMetadata(event), [event]) + const metadata = useMemo(() => getLiveEventMetadataFromEvent(event), [event]) return (
diff --git a/src/components/ContentPreview/LongFormArticlePreview.tsx b/src/components/ContentPreview/LongFormArticlePreview.tsx index 0b1ae711..73d92b6a 100644 --- a/src/components/ContentPreview/LongFormArticlePreview.tsx +++ b/src/components/ContentPreview/LongFormArticlePreview.tsx @@ -1,4 +1,4 @@ -import { getLongFormArticleMetadata } from '@/lib/event' +import { getLongFormArticleMetadataFromEvent } from '@/lib/event-metadata' import { cn } from '@/lib/utils' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -14,7 +14,7 @@ export default function LongFormArticlePreview({ onClick?: React.MouseEventHandler | undefined }) { const { t } = useTranslation() - const metadata = useMemo(() => getLongFormArticleMetadata(event), [event]) + const metadata = useMemo(() => getLongFormArticleMetadataFromEvent(event), [event]) return (
diff --git a/src/components/ContentPreview/NormalContentPreview.tsx b/src/components/ContentPreview/NormalContentPreview.tsx index 02c72cf1..a4569cfd 100644 --- a/src/components/ContentPreview/NormalContentPreview.tsx +++ b/src/components/ContentPreview/NormalContentPreview.tsx @@ -7,7 +7,7 @@ import { EmbeddedVideoParser, parseContent } from '@/lib/content-parser' -import { extractEmojiInfosFromTags } from '@/lib/event' +import { getEmojiInfosFromEmojiTags } from '@/lib/tag' import { cn } from '@/lib/utils' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -36,7 +36,7 @@ export default function NormalContentPreview({ ]) }, [event, translatedEvent]) - const emojiInfos = extractEmojiInfosFromTags(event?.tags) + const emojiInfos = getEmojiInfosFromEmojiTags(event?.tags) return (
diff --git a/src/components/ImageCarousel/index.tsx b/src/components/ImageCarousel/index.tsx index b0331fcb..bb85e061 100644 --- a/src/components/ImageCarousel/index.tsx +++ b/src/components/ImageCarousel/index.tsx @@ -1,5 +1,5 @@ import { Carousel, CarouselApi, CarouselContent, CarouselItem } from '@/components/ui/carousel' -import { isTouchDevice } from '@/lib/common' +import { isTouchDevice } from '@/lib/utils' import { TImageInfo } from '@/types' import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react' import { useEffect, useState } from 'react' diff --git a/src/components/Note/CommunityDefinition.tsx b/src/components/Note/CommunityDefinition.tsx index d327d00c..b82781d7 100644 --- a/src/components/Note/CommunityDefinition.tsx +++ b/src/components/Note/CommunityDefinition.tsx @@ -1,4 +1,4 @@ -import { getCommunityDefinition } from '@/lib/event' +import { getCommunityDefinitionFromEvent } from '@/lib/event-metadata' import { Event } from 'nostr-tools' import { useMemo } from 'react' import ClientSelect from '../ClientSelect' @@ -11,7 +11,7 @@ export default function CommunityDefinition({ event: Event className?: string }) { - const metadata = useMemo(() => getCommunityDefinition(event), [event]) + const metadata = useMemo(() => getCommunityDefinitionFromEvent(event), [event]) const communityNameComponent = (
{metadata.name}
diff --git a/src/components/Note/GroupMetadata.tsx b/src/components/Note/GroupMetadata.tsx index f79d0bf6..32af37c0 100644 --- a/src/components/Note/GroupMetadata.tsx +++ b/src/components/Note/GroupMetadata.tsx @@ -1,4 +1,4 @@ -import { getGroupMetadata } from '@/lib/event' +import { getGroupMetadataFromEvent } from '@/lib/event-metadata' import { Event } from 'nostr-tools' import { useMemo } from 'react' import ClientSelect from '../ClientSelect' @@ -13,7 +13,7 @@ export default function GroupMetadata({ originalNoteId?: string className?: string }) { - const metadata = useMemo(() => getGroupMetadata(event), [event]) + const metadata = useMemo(() => getGroupMetadataFromEvent(event), [event]) const groupNameComponent = (
{metadata.name}
diff --git a/src/components/Note/Highlight.tsx b/src/components/Note/Highlight.tsx index 42427d24..7bc5eded 100644 --- a/src/components/Note/Highlight.tsx +++ b/src/components/Note/Highlight.tsx @@ -2,7 +2,7 @@ import { useFetchEvent, useTranslatedEvent } from '@/hooks' import { createFakeEvent } from '@/lib/event' import { toNjump, toNote } from '@/lib/link' import { isValidPubkey } from '@/lib/pubkey' -import { generateEventIdFromATag } from '@/lib/tag' +import { generateBech32IdFromATag } from '@/lib/tag' import { cn } from '@/lib/utils' import { useSecondaryPage } from '@/PageManager' import { Event } from 'nostr-tools' @@ -70,7 +70,7 @@ function HighlightSource({ event }: { event: Event }) { return sourceTag[1] } if (sourceTag[0] === 'a') { - return generateEventIdFromATag(sourceTag) + return generateBech32IdFromATag(sourceTag) } }, [sourceTag]) const pubkey = useMemo(() => { diff --git a/src/components/Note/LiveEvent.tsx b/src/components/Note/LiveEvent.tsx index 18aea8f8..740c6c26 100644 --- a/src/components/Note/LiveEvent.tsx +++ b/src/components/Note/LiveEvent.tsx @@ -1,5 +1,5 @@ import { Badge } from '@/components/ui/badge' -import { getLiveEventMetadata } from '@/lib/event' +import { getLiveEventMetadataFromEvent } from '@/lib/event-metadata' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -8,7 +8,7 @@ import Image from '../Image' export default function LiveEvent({ event, className }: { event: Event; className?: string }) { const { isSmallScreen } = useScreenSize() - const metadata = useMemo(() => getLiveEventMetadata(event), [event]) + const metadata = useMemo(() => getLiveEventMetadataFromEvent(event), [event]) const liveStatusComponent = metadata.status && diff --git a/src/components/Note/LongFormArticle.tsx b/src/components/Note/LongFormArticle.tsx index aadcdd1c..25c50e96 100644 --- a/src/components/Note/LongFormArticle.tsx +++ b/src/components/Note/LongFormArticle.tsx @@ -1,5 +1,5 @@ import { Badge } from '@/components/ui/badge' -import { getLongFormArticleMetadata } from '@/lib/event' +import { getLongFormArticleMetadataFromEvent } from '@/lib/event-metadata' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { Event } from 'nostr-tools' import { useMemo } from 'react' @@ -14,7 +14,7 @@ export default function LongFormArticle({ className?: string }) { const { isSmallScreen } = useScreenSize() - const metadata = useMemo(() => getLongFormArticleMetadata(event), [event]) + const metadata = useMemo(() => getLongFormArticleMetadataFromEvent(event), [event]) const titleComponent =
{metadata.title}
diff --git a/src/components/Note/index.tsx b/src/components/Note/index.tsx index 33dca6d5..9eb210ca 100644 --- a/src/components/Note/index.tsx +++ b/src/components/Note/index.tsx @@ -1,8 +1,8 @@ import { useSecondaryPage } from '@/PageManager' import { ExtendedKind } from '@/constants' import { - extractImageInfosFromEventTags, - getParentEventId, + getImageInfosFromEvent, + getParentBech32Id, getUsingClient, isNsfwEvent, isPictureEvent @@ -47,11 +47,11 @@ export default function Note({ const { push } = useSecondaryPage() const { isSmallScreen } = useScreenSize() const parentEventId = useMemo( - () => (hideParentNotePreview ? undefined : getParentEventId(event)), + () => (hideParentNotePreview ? undefined : getParentBech32Id(event)), [event, hideParentNotePreview] ) const imageInfos = useMemo( - () => (isPictureEvent(event) ? extractImageInfosFromEventTags(event) : []), + () => (isPictureEvent(event) ? getImageInfosFromEvent(event) : []), [event] ) const usingClient = useMemo(() => getUsingClient(event), [event]) diff --git a/src/components/NoteOptions/index.tsx b/src/components/NoteOptions/index.tsx index b9bfec62..c4307230 100644 --- a/src/components/NoteOptions/index.tsx +++ b/src/components/NoteOptions/index.tsx @@ -7,7 +7,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' -import { getSharableEventId } from '@/lib/event' +import { getNoteBech32Id } from '@/lib/event' import { toNjump } from '@/lib/link' import { pubkeyToNpub } from '@/lib/pubkey' import { useMuteList } from '@/providers/MuteListProvider' @@ -56,7 +56,7 @@ export default function NoteOptions({ event, className }: { event: Event; classN