From 55768db83e33b4473bc9b69652b1c1e55b027de6 Mon Sep 17 00:00:00 2001 From: Shusui MOYATANI Date: Sun, 14 May 2023 20:36:54 +0900 Subject: [PATCH] refactor --- src/components/EventLink.tsx | 29 +++++-- src/components/NotePostForm.tsx | 10 +-- src/components/event/EventDisplay.tsx | 42 +++++++++ .../EventDisplayById.tsx} | 30 +++---- src/components/event/Reaction.tsx | 85 ++++++++++++++++++ .../Repost.tsx} | 20 ++--- src/components/{ => event}/TextNote.tsx | 7 +- .../textNote/ContentWarningDisplay.tsx | 0 .../textNote/GeneralUserMentionDisplay.tsx | 0 .../{ => event}/textNote/ImageDisplay.tsx | 0 .../textNote/MentionedEventDisplay.tsx | 6 +- .../textNote/MentionedUserDisplay.tsx | 2 +- .../{ => event}/textNote/PlainTextDisplay.tsx | 0 .../textNote/TextNoteContentDisplay.tsx | 20 ++--- .../{ => event}/textNote/TextNoteDisplay.tsx | 12 +-- src/components/modal/ProfileEdit.tsx | 22 +++-- src/components/notification/Reaction.tsx | 86 ------------------- src/components/timeline/Notification.tsx | 8 +- src/components/timeline/Timeline.tsx | 24 +++--- src/nostr/useBatchedEvents.ts | 46 +++++----- src/nostr/useEvent.ts | 4 +- 21 files changed, 256 insertions(+), 197 deletions(-) create mode 100644 src/components/event/EventDisplay.tsx rename src/components/{textNote/TextNoteDisplayById.tsx => event/EventDisplayById.tsx} (53%) create mode 100644 src/components/event/Reaction.tsx rename src/components/{DeprecatedRepost.tsx => event/Repost.tsx} (71%) rename src/components/{ => event}/TextNote.tsx (79%) rename src/components/{ => event}/textNote/ContentWarningDisplay.tsx (100%) rename src/components/{ => event}/textNote/GeneralUserMentionDisplay.tsx (100%) rename src/components/{ => event}/textNote/ImageDisplay.tsx (100%) rename src/components/{ => event}/textNote/MentionedEventDisplay.tsx (87%) rename src/components/{ => event}/textNote/MentionedUserDisplay.tsx (85%) rename src/components/{ => event}/textNote/PlainTextDisplay.tsx (100%) rename src/components/{ => event}/textNote/TextNoteContentDisplay.tsx (85%) rename src/components/{ => event}/textNote/TextNoteDisplay.tsx (97%) delete mode 100644 src/components/notification/Reaction.tsx diff --git a/src/components/EventLink.tsx b/src/components/EventLink.tsx index a43c102..a7872cf 100644 --- a/src/components/EventLink.tsx +++ b/src/components/EventLink.tsx @@ -1,14 +1,15 @@ -import { Component } from 'solid-js'; +import { Show, type Component } from 'solid-js'; -import { nip19 } from 'nostr-tools'; +import { Kind, nip19 } from 'nostr-tools'; -const { noteEncode } = nip19; +const { noteEncode, neventEncode } = nip19; type EventLinkProps = { eventId: string; + kind?: Kind; }; -const tryEncode = (eventId: string) => { +const tryEncodeNote = (eventId: string) => { try { return noteEncode(eventId); } catch (err) { @@ -17,8 +18,26 @@ const tryEncode = (eventId: string) => { } }; +const tryEncodeNevent = (eventId: string) => { + try { + return neventEncode({ id: eventId }); + } catch (err) { + console.error('failed to encode event id into Bech32 entity (NIP-19) but ignore', eventId, err); + return eventId; + } +}; + const EventLink: Component = (props) => { - return ; + return ( + + ); }; export default EventLink; diff --git a/src/components/NotePostForm.tsx b/src/components/NotePostForm.tsx index fa5ca04..d67f713 100644 --- a/src/components/NotePostForm.tsx +++ b/src/components/NotePostForm.tsx @@ -151,8 +151,10 @@ const NotePostForm: Component = (props) => { }, }); - const mentionedPubkeys: Accessor = createMemo( - () => replyTo()?.mentionedPubkeysWithoutAuthor() ?? [], + const mentionedPubkeys = createMemo(() => replyTo()?.mentionedPubkeysWithoutAuthor() ?? []); + + const mentionedPubkeysWithoutMe = createMemo(() => + mentionedPubkeys().filter((pubkey) => pubkey !== getPubkey()), ); const notifyPubkeys = (pubkey: string, pubkeyReferences: string[]): string[] => { @@ -160,10 +162,8 @@ const NotePostForm: Component = (props) => { return uniq([ // 返信先を先頭に props.replyTo.pubkey, - // 自分も通知欄に表示するために表示(他アプリとの互換性) - pubkey, // その他の返信先 - ...mentionedPubkeys(), + ...mentionedPubkeysWithoutMe(), // 本文中の公開鍵(npub) ...pubkeyReferences, ]); diff --git a/src/components/event/EventDisplay.tsx b/src/components/event/EventDisplay.tsx new file mode 100644 index 0000000..c18380a --- /dev/null +++ b/src/components/event/EventDisplay.tsx @@ -0,0 +1,42 @@ +import { Switch, Match, Component } from 'solid-js'; + +import { Kind, type Event as NostrEvent } from 'nostr-tools'; + +// eslint-disable-next-line import/no-cycle +import Repost from '@/components/event/Repost'; +// eslint-disable-next-line import/no-cycle +import TextNote from '@/components/event/TextNote'; +import EventLink from '@/components/EventLink'; + +export type EventDisplayProps = { + event: NostrEvent; + embedding?: boolean; + actions?: boolean; + kinds?: Kind[]; +}; + +const EventDisplay: Component = (props) => { + const isAllowedKind = () => + props.kinds == null || props.kinds.length === 0 || props.kinds.includes(props.event.kind); + + return ( + + 未対応のイベント種別({props.event.kind}) + + + } + > + {null} + + + + + + + + ); +}; + +export default EventDisplay; diff --git a/src/components/textNote/TextNoteDisplayById.tsx b/src/components/event/EventDisplayById.tsx similarity index 53% rename from src/components/textNote/TextNoteDisplayById.tsx rename to src/components/event/EventDisplayById.tsx index 8f0b816..ff20690 100644 --- a/src/components/textNote/TextNoteDisplayById.tsx +++ b/src/components/event/EventDisplayById.tsx @@ -1,22 +1,23 @@ -import { Switch, Match, type Component, Show } from 'solid-js'; +import { Switch, Match, type Component, splitProps } from 'solid-js'; -import { Kind } from 'nostr-tools'; - -import EventLink from '@/components/EventLink'; // eslint-disable-next-line import/no-cycle -import TextNoteDisplay, { type TextNoteDisplayProps } from '@/components/textNote/TextNoteDisplay'; +import EventDisplay from '@/components/event/EventDisplay'; +import { type EventDisplayProps } from '@/components/event/EventDisplay'; +import EventLink from '@/components/EventLink'; import useConfig from '@/core/useConfig'; import useEvent from '@/nostr/useEvent'; import ensureNonNull from '@/utils/ensureNonNull'; -type TextNoteDisplayByIdProps = Omit & { +type EventDisplayByIdProps = Omit & { eventId: string | undefined; }; -const TextNoteDisplayById: Component = (props) => { +const EventDisplayById: Component = (props) => { + const [localProps, restProps] = splitProps(props, ['eventId']); const { shouldMuteEvent } = useConfig(); + const { event: fetchedEvent, query: eventQuery } = useEvent(() => - ensureNonNull([props.eventId] as const)(([eventIdNonNull]) => ({ + ensureNonNull([localProps.eventId] as const)(([eventIdNonNull]) => ({ eventId: eventIdNonNull, })), ); @@ -30,16 +31,9 @@ const TextNoteDisplayById: Component = (props) => { {null} - {(event) => ( - 未対応のイベント種別({event.kind})} - > - - - )} + {(event) => } - + {(id) => (
{'読み込み中 '} @@ -51,4 +45,4 @@ const TextNoteDisplayById: Component = (props) => { ); }; -export default TextNoteDisplayById; +export default EventDisplayById; diff --git a/src/components/event/Reaction.tsx b/src/components/event/Reaction.tsx new file mode 100644 index 0000000..421cc29 --- /dev/null +++ b/src/components/event/Reaction.tsx @@ -0,0 +1,85 @@ +import { Switch, Match, type Component, Show } from 'solid-js'; + +import HeartSolid from 'heroicons/24/solid/heart.svg'; +import { type Event as NostrEvent } from 'nostr-tools'; + +import TextNoteDisplay from '@/components/event/textNote/TextNoteDisplay'; +import UserDisplayName from '@/components/UserDisplayName'; +import useConfig from '@/core/useConfig'; +import useModalState from '@/hooks/useModalState'; +import eventWrapper from '@/nostr/event'; +import useEvent from '@/nostr/useEvent'; +import useProfile from '@/nostr/useProfile'; +import ensureNonNull from '@/utils/ensureNonNull'; + +type ReactionProps = { + event: NostrEvent; +}; + +const Reaction: Component = (props) => { + const { shouldMuteEvent } = useConfig(); + const { showProfile } = useModalState(); + const event = () => eventWrapper(props.event); + const eventId = () => event().lastTaggedEventId(); + + const { profile } = useProfile(() => ({ + pubkey: props.event.pubkey, + })); + + const { event: reactedEvent, query: reactedEventQuery } = useEvent(() => + ensureNonNull([eventId()] as const)(([eventIdNonNull]) => ({ + eventId: eventIdNonNull, + })), + ); + + const isRemoved = () => reactedEventQuery.isSuccess && reactedEvent() == null; + + return ( + // if the reacted event is not found, it should be a removed event + +
+
+ + + + + + + +
+
+
+ + icon + +
+
+ + {' がリアクション'} +
+
+
+
+ 読み込み中 {eventId()}
} + keyed + > + {(ev) => } +
+
+ + ); +}; + +export default Reaction; diff --git a/src/components/DeprecatedRepost.tsx b/src/components/event/Repost.tsx similarity index 71% rename from src/components/DeprecatedRepost.tsx rename to src/components/event/Repost.tsx index 171a038..e32ba06 100644 --- a/src/components/DeprecatedRepost.tsx +++ b/src/components/event/Repost.tsx @@ -1,28 +1,28 @@ -// NIP-18 (DEPRECATED) +// NIP-18 import { type Component, createMemo } from 'solid-js'; import ArrowPathRoundedSquare from 'heroicons/24/outline/arrow-path-rounded-square.svg'; import { Event as NostrEvent } from 'nostr-tools'; -import ColumnItem from '@/components/ColumnItem'; -import TextNoteDisplayById from '@/components/textNote/TextNoteDisplayById'; +// eslint-disable-next-line import/no-cycle +import EventDisplayById from '@/components/event/EventDisplayById'; import UserDisplayName from '@/components/UserDisplayName'; import useFormatDate from '@/hooks/useFormatDate'; import useModalState from '@/hooks/useModalState'; import eventWrapper from '@/nostr/event'; -export type DeprecatedRepostProps = { +export type RepostProps = { event: NostrEvent; }; -const DeprecatedRepost: Component = (props) => { +const Repost: Component = (props) => { const { showProfile } = useModalState(); const formatDate = useFormatDate(); - const repostedId = () => props.event.tags.find(([tagName]) => tagName === 'e')?.[1]; const event = createMemo(() => eventWrapper(props.event)); + const eventId = () => event().lastTaggedEventId(); return ( - +
- +
- +
); }; -export default DeprecatedRepost; +export default Repost; diff --git a/src/components/TextNote.tsx b/src/components/event/TextNote.tsx similarity index 79% rename from src/components/TextNote.tsx rename to src/components/event/TextNote.tsx index 88f54df..282942a 100644 --- a/src/components/TextNote.tsx +++ b/src/components/event/TextNote.tsx @@ -1,7 +1,8 @@ import { Show, type Component } from 'solid-js'; import ColumnItem from '@/components/ColumnItem'; -import TextNoteDisplay, { TextNoteDisplayProps } from '@/components/textNote/TextNoteDisplay'; +// eslint-disable-next-line import/no-cycle +import TextNoteDisplay, { TextNoteDisplayProps } from '@/components/event/textNote/TextNoteDisplay'; import useConfig from '@/core/useConfig'; export type TextNoteProps = TextNoteDisplayProps; @@ -11,9 +12,7 @@ const TextNote: Component = (props) => { return ( - - - + ); }; diff --git a/src/components/textNote/ContentWarningDisplay.tsx b/src/components/event/textNote/ContentWarningDisplay.tsx similarity index 100% rename from src/components/textNote/ContentWarningDisplay.tsx rename to src/components/event/textNote/ContentWarningDisplay.tsx diff --git a/src/components/textNote/GeneralUserMentionDisplay.tsx b/src/components/event/textNote/GeneralUserMentionDisplay.tsx similarity index 100% rename from src/components/textNote/GeneralUserMentionDisplay.tsx rename to src/components/event/textNote/GeneralUserMentionDisplay.tsx diff --git a/src/components/textNote/ImageDisplay.tsx b/src/components/event/textNote/ImageDisplay.tsx similarity index 100% rename from src/components/textNote/ImageDisplay.tsx rename to src/components/event/textNote/ImageDisplay.tsx diff --git a/src/components/textNote/MentionedEventDisplay.tsx b/src/components/event/textNote/MentionedEventDisplay.tsx similarity index 87% rename from src/components/textNote/MentionedEventDisplay.tsx rename to src/components/event/textNote/MentionedEventDisplay.tsx index 0a8bc26..813ea67 100644 --- a/src/components/textNote/MentionedEventDisplay.tsx +++ b/src/components/event/textNote/MentionedEventDisplay.tsx @@ -1,8 +1,8 @@ import { Show } from 'solid-js'; -import EventLink from '@/components/EventLink'; // eslint-disable-next-line import/no-cycle -import TextNoteDisplayById from '@/components/textNote/TextNoteDisplayById'; +import EventDisplayById from '@/components/event/EventDisplayById'; +import EventLink from '@/components/EventLink'; import { type MentionedEvent } from '@/nostr/parseTextNote'; export type MentionedEventDisplayProps = { @@ -16,7 +16,7 @@ const MentionedEventDisplay = (props: MentionedEventDisplayProps) => { fallback={} >
- { if (item.data.type === 'note' && props.embedding) { return (
- +
); } if (item.data.type === 'nevent' && props.embedding) { return (
- +
); } diff --git a/src/components/textNote/TextNoteDisplay.tsx b/src/components/event/textNote/TextNoteDisplay.tsx similarity index 97% rename from src/components/textNote/TextNoteDisplay.tsx rename to src/components/event/textNote/TextNoteDisplay.tsx index 06ccf5f..8089e51 100644 --- a/src/components/textNote/TextNoteDisplay.tsx +++ b/src/components/event/textNote/TextNoteDisplay.tsx @@ -11,12 +11,12 @@ import { nip19, type Event as NostrEvent } from 'nostr-tools'; import ContextMenu, { MenuItem } from '@/components/ContextMenu'; import EmojiPicker from '@/components/EmojiPicker'; -import NotePostForm from '@/components/NotePostForm'; -import ContentWarningDisplay from '@/components/textNote/ContentWarningDisplay'; -import GeneralUserMentionDisplay from '@/components/textNote/GeneralUserMentionDisplay'; // eslint-disable-next-line import/no-cycle -import TextNoteContentDisplay from '@/components/textNote/TextNoteContentDisplay'; -import TextNoteDisplayById from '@/components/textNote/TextNoteDisplayById'; +import EventDisplayById from '@/components/event/EventDisplayById'; +import ContentWarningDisplay from '@/components/event/textNote/ContentWarningDisplay'; +import GeneralUserMentionDisplay from '@/components/event/textNote/GeneralUserMentionDisplay'; +import TextNoteContentDisplay from '@/components/event/textNote/TextNoteContentDisplay'; +import NotePostForm from '@/components/NotePostForm'; import { useTimelineContext } from '@/components/timeline/TimelineContext'; import useConfig from '@/core/useConfig'; import useFormatDate from '@/hooks/useFormatDate'; @@ -355,7 +355,7 @@ const TextNoteDisplay: Component = (props) => { {(id) => (
- +
)}
diff --git a/src/components/modal/ProfileEdit.tsx b/src/components/modal/ProfileEdit.tsx index 9c55ca2..cc09be7 100644 --- a/src/components/modal/ProfileEdit.tsx +++ b/src/components/modal/ProfileEdit.tsx @@ -30,12 +30,6 @@ const isInternetIdentifier = (s: string) => InternetIdentifierRegex.test(s); const ProfileEdit: Component = (props) => { const pubkey = usePubkey(); const { config } = useConfig(); - const { profile, invalidateProfile, query } = useProfile(() => - ensureNonNull([pubkey()] as const)(([pubkeyNonNull]) => ({ - pubkey: pubkeyNonNull, - })), - ); - const { updateProfile } = useCommands(); const [picture, setPicture] = createSignal(''); const [banner, setBanner] = createSignal(''); @@ -46,6 +40,13 @@ const ProfileEdit: Component = (props) => { const [nip05, setNIP05] = createSignal(''); const [lightningAddress, setLightningAddress] = createSignal(''); + const { profile, invalidateProfile, query } = useProfile(() => + ensureNonNull([pubkey()] as const)(([pubkeyNonNull]) => ({ + pubkey: pubkeyNonNull, + })), + ); + const { updateProfile } = useCommands(); + const mutation = createMutation({ mutationKey: ['updateProfile'], mutationFn: (...params: Parameters) => @@ -71,7 +72,9 @@ const ProfileEdit: Component = (props) => { }, }); - const disabled = () => query.isLoading || query.isError || mutation.isLoading; + const loading = () => query.isLoading || mutation.isLoading; + const disabled = () => loading(); + const otherProperties = () => omit(profile(), [ 'picture', @@ -141,7 +144,7 @@ const ProfileEdit: Component = (props) => { return ( } onClose={props.onClose}>
- 0} fallback={
} keyed> + 0} fallback={
} keyed>
header
@@ -152,6 +155,9 @@ const ProfileEdit: Component = (props) => {
+ +
読み込み中...
+
diff --git a/src/components/notification/Reaction.tsx b/src/components/notification/Reaction.tsx deleted file mode 100644 index d7a2685..0000000 --- a/src/components/notification/Reaction.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { Switch, Match, type Component, Show } from 'solid-js'; - -import HeartSolid from 'heroicons/24/solid/heart.svg'; -import { type Event as NostrEvent } from 'nostr-tools'; - -import ColumnItem from '@/components/ColumnItem'; -import TextNoteDisplay from '@/components/textNote/TextNoteDisplay'; -import UserDisplayName from '@/components/UserDisplayName'; -import useModalState from '@/hooks/useModalState'; -import eventWrapper from '@/nostr/event'; -import useEvent from '@/nostr/useEvent'; -import useProfile from '@/nostr/useProfile'; -import ensureNonNull from '@/utils/ensureNonNull'; - -type ReactionProps = { - event: NostrEvent; -}; - -const Reaction: Component = (props) => { - const { showProfile } = useModalState(); - const event = () => eventWrapper(props.event); - const eventId = () => event().lastTaggedEventId(); - - const { profile } = useProfile(() => ({ - pubkey: props.event.pubkey, - })); - - const { event: reactedEvent, query: reactedEventQuery } = useEvent(() => - ensureNonNull([eventId()] as const)(([eventIdNonNull]) => ({ - eventId: eventIdNonNull, - })), - ); - - const isRemoved = () => reactedEventQuery.isSuccess && reactedEvent() == null; - - return ( - // if the reacted event is not found, it should be a removed event - - -
-
- - - - - - - -
-
-
- - icon - -
-
- - {' がリアクション'} -
-
-
-
- 読み込み中 {eventId()}
} - keyed - > - {(ev) => } -
-
- - - ); -}; - -export default Reaction; diff --git a/src/components/timeline/Notification.tsx b/src/components/timeline/Notification.tsx index 7fe0c88..fceb5e9 100644 --- a/src/components/timeline/Notification.tsx +++ b/src/components/timeline/Notification.tsx @@ -2,9 +2,9 @@ import { For, Switch, Match, type Component } from 'solid-js'; import { Kind, type Event as NostrEvent } from 'nostr-tools'; -import DeprecatedRepost from '@/components/DeprecatedRepost'; -import Reaction from '@/components/notification/Reaction'; -import TextNote from '@/components/TextNote'; +import Reaction from '@/components/event/Reaction'; +import Repost from '@/components/event/Repost'; +import TextNote from '@/components/event/TextNote'; export type NotificationProps = { events: NostrEvent[]; @@ -23,7 +23,7 @@ const Notification: Component = (props) => { {/* TODO ちゃんとnotification用のコンポーネント使う */} - + )} diff --git a/src/components/timeline/Timeline.tsx b/src/components/timeline/Timeline.tsx index 65f42f5..a8486ac 100644 --- a/src/components/timeline/Timeline.tsx +++ b/src/components/timeline/Timeline.tsx @@ -1,26 +1,26 @@ -import { For, Switch, Match, type Component } from 'solid-js'; +import { For, type Component, Show } from 'solid-js'; -import { Kind, type Event as NostrEvent } from 'nostr-tools'; +import { type Event as NostrEvent } from 'nostr-tools'; -import DeprecatedRepost from '@/components/DeprecatedRepost'; -import TextNote from '@/components/TextNote'; +import ColumnItem from '@/components/ColumnItem'; +import EventDisplay from '@/components/event/EventDisplay'; +import useConfig from '@/core/useConfig'; export type TimelineProps = { events: NostrEvent[]; }; const Timeline: Component = (props) => { + const { shouldMuteEvent } = useConfig(); + return ( {(event) => ( - 未対応のイベント種別({event.kind})
}> - - - - - - - + + + + + )} ); diff --git a/src/nostr/useBatchedEvents.ts b/src/nostr/useBatchedEvents.ts index 5f6301c..b5f1ee5 100644 --- a/src/nostr/useBatchedEvents.ts +++ b/src/nostr/useBatchedEvents.ts @@ -12,7 +12,7 @@ import timeout from '@/utils/timeout'; type TaskArg = | { type: 'Profile'; pubkey: string } - | { type: 'TextNote'; eventId: string } + | { type: 'Event'; eventId: string } | { type: 'Reactions'; mentionedEventId: string } | { type: 'ZapReceipts'; mentionedEventId: string } | { type: 'Reposts'; mentionedEventId: string } @@ -56,12 +56,12 @@ type UseProfile = { query: CreateQueryResult; }; -// Textnote -export type UseTextNoteProps = { +// Event +export type UseEventProps = { eventId: string; }; -export type UseTextNote = { +export type UseEvent = { event: () => NostrEvent | null; query: CreateQueryResult; }; @@ -128,19 +128,19 @@ const { exec } = useBatch(() => ({ batchSize: 150, executor: (tasks) => { const profileTasks = new Map[]>(); - const textNoteTasks = new Map[]>(); + const eventTasks = new Map[]>(); const reactionsTasks = new Map[]>(); const repostsTasks = new Map[]>(); const zapReceiptsTasks = new Map[]>(); const followingsTasks = new Map[]>(); tasks.forEach((task) => { - if (task.args.type === 'Profile') { + if (task.args.type === 'Event') { + const current = eventTasks.get(task.args.eventId) ?? []; + eventTasks.set(task.args.eventId, [...current, task]); + } else if (task.args.type === 'Profile') { const current = profileTasks.get(task.args.pubkey) ?? []; profileTasks.set(task.args.pubkey, [...current, task]); - } else if (task.args.type === 'TextNote') { - const current = textNoteTasks.get(task.args.eventId) ?? []; - textNoteTasks.set(task.args.eventId, [...current, task]); } else if (task.args.type === 'Reactions') { const current = reactionsTasks.get(task.args.mentionedEventId) ?? []; reactionsTasks.set(task.args.mentionedEventId, [...current, task]); @@ -156,8 +156,8 @@ const { exec } = useBatch(() => ({ } }); + const eventIds = [...eventTasks.keys()]; const profilePubkeys = [...profileTasks.keys()]; - const textNoteIds = [...textNoteTasks.keys()]; const reactionsIds = [...reactionsTasks.keys()]; const repostsIds = [...repostsTasks.keys()]; const zapReceiptsIds = [...zapReceiptsTasks.keys()]; @@ -165,12 +165,12 @@ const { exec } = useBatch(() => ({ const filters: Filter[] = []; + if (eventIds.length > 0) { + filters.push({ ids: eventIds }); + } if (profilePubkeys.length > 0) { filters.push({ kinds: [Kind.Metadata], authors: profilePubkeys }); } - if (textNoteIds.length > 0) { - filters.push({ kinds: [Kind.Text], ids: textNoteIds }); - } if (reactionsIds.length > 0) { filters.push({ kinds: [Kind.Reaction], '#e': reactionsIds }); } @@ -229,10 +229,7 @@ const { exec } = useBatch(() => ({ if (shouldMuteEvent(event)) return; - if (event.kind === Kind.Text) { - const registeredTasks = textNoteTasks.get(event.id) ?? []; - resolveTasks(registeredTasks, event); - } else if (event.kind === Kind.Reaction) { + if (event.kind === Kind.Reaction) { // Use the last event id const id = eventWrapper(event).lastTaggedEventId(); if (id != null) { @@ -255,6 +252,13 @@ const { exec } = useBatch(() => ({ } else if (event.kind === Kind.Contacts) { const registeredTasks = followingsTasks.get(event.pubkey) ?? []; resolveTasks(registeredTasks, event); + } else { + const registeredTasks = eventTasks.get(event.id) ?? []; + if (registeredTasks.length > 0) { + resolveTasks(registeredTasks, event); + } else { + console.warn('unknown event received'); + } } }); @@ -328,21 +332,21 @@ export const useProfile = (propsProvider: () => UseProfileProps | null): UseProf return { profile, invalidateProfile, query }; }; -export const useTextNote = (propsProvider: () => UseTextNoteProps | null): UseTextNote => { +export const useEvent = (propsProvider: () => UseEventProps | null): UseEvent => { const props = createMemo(propsProvider); const query = createQuery( - () => ['useTextNote', props()] as const, + () => ['useEvent', props()] as const, ({ queryKey, signal }) => { const [, currentProps] = queryKey; if (currentProps == null) return null; const { eventId } = currentProps; - const promise = exec({ type: 'TextNote', eventId }, signal).then((batchedEvents) => { + const promise = exec({ type: 'Event', eventId }, signal).then((batchedEvents) => { const event = batchedEvents().events[0]; if (event == null) throw new Error(`event not found: ${eventId}`); return event; }); - return timeout(15000, `useTextNote: ${eventId}`)(promise); + return timeout(15000, `useEvent: ${eventId}`)(promise); }, { // Text notes never change, so they can be stored for a long time. diff --git a/src/nostr/useEvent.ts b/src/nostr/useEvent.ts index c1f48a4..8899afd 100644 --- a/src/nostr/useEvent.ts +++ b/src/nostr/useEvent.ts @@ -1,3 +1,3 @@ -import { useTextNote } from '@/nostr/useBatchedEvents'; +import { useEvent } from '@/nostr/useBatchedEvents'; -export default useTextNote; +export default useEvent;