From c3a657e8db742168dc9121c13174f50c7b8104be Mon Sep 17 00:00:00 2001 From: Shusui MOYATANI Date: Tue, 9 May 2023 19:57:15 +0900 Subject: [PATCH] feat: support nevent1 style mention --- .../textNote/TextNoteContentDisplay.tsx | 11 +++++++ src/components/textNote/TextNoteDisplay.tsx | 30 +++++++++++++++---- .../textNote/TextNoteDisplayById.tsx | 19 ++++++++---- src/nostr/useBatchedEvents.ts | 4 +-- 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/components/textNote/TextNoteContentDisplay.tsx b/src/components/textNote/TextNoteContentDisplay.tsx index 2d07c81..c35da9e 100644 --- a/src/components/textNote/TextNoteContentDisplay.tsx +++ b/src/components/textNote/TextNoteContentDisplay.tsx @@ -61,6 +61,17 @@ const TextNoteContentDisplay = (props: TextNoteContentDisplayProps) => { ); } + if (item.data.type === 'nevent' && props.embedding) { + return ( +
+ +
+ ); + } if (item.data.type === 'npub') { return ; } diff --git a/src/components/textNote/TextNoteDisplay.tsx b/src/components/textNote/TextNoteDisplay.tsx index d69439e..915a034 100644 --- a/src/components/textNote/TextNoteDisplay.tsx +++ b/src/components/textNote/TextNoteDisplay.tsx @@ -47,6 +47,8 @@ const TextNoteDisplay: Component = (props) => { const { showProfile } = useModalState(); const timelineContext = useTimelineContext(); + const [reacted, setReacted] = createSignal(false); + const [reposted, setReposted] = createSignal(false); const [showReplyForm, setShowReplyForm] = createSignal(false); const closeReplyForm = () => setShowReplyForm(false); const [showOverflow, setShowOverflow] = createSignal(false); @@ -61,11 +63,21 @@ const TextNoteDisplay: Component = (props) => { pubkey: props.event.pubkey, })); - const { reactions, isReactedBy, invalidateReactions } = useReactions(() => ({ + const { + reactions, + isReactedBy, + invalidateReactions, + query: reactionsQuery, + } = useReactions(() => ({ eventId: props.event.id, })); - const { reposts, isRepostedBy, invalidateReposts } = useReposts(() => ({ + const { + reposts, + isRepostedBy, + invalidateReposts, + query: repostsQuery, + } = useReposts(() => ({ eventId: props.event.id, })); @@ -81,7 +93,9 @@ const TextNoteDisplay: Component = (props) => { console.error('failed to publish reaction: ', err); }, onSettled: () => { - invalidateReactions().catch((err) => console.error('failed to refetch reactions', err)); + invalidateReactions() + .then(() => reactionsQuery.refetch()) + .catch((err) => console.error('failed to refetch reactions', err)); }, }); @@ -95,7 +109,9 @@ const TextNoteDisplay: Component = (props) => { console.error('failed to publish repost: ', err); }, onSettled: () => { - invalidateReposts().catch((err) => console.error('failed to refetch reposts', err)); + invalidateReposts() + .then(() => repostsQuery.refetch()) + .catch((err) => console.error('failed to refetch reposts', err)); }, }); @@ -156,11 +172,11 @@ const TextNoteDisplay: Component = (props) => { const isReactedByMe = createMemo(() => { const p = pubkey(); - return p != null && isReactedBy(p); + return (p != null && isReactedBy(p)) || reacted(); }); const isRepostedByMe = createMemo(() => { const p = pubkey(); - return p != null && isRepostedBy(p); + return (p != null && isRepostedBy(p)) || reposted(); }); const showReplyEvent = (): string | undefined => { @@ -192,6 +208,7 @@ const TextNoteDisplay: Component = (props) => { eventId: eventIdNonNull, notifyPubkey: props.event.pubkey, }); + setReposted(true); }); }; @@ -211,6 +228,7 @@ const TextNoteDisplay: Component = (props) => { eventId: eventIdNonNull, notifyPubkey: props.event.pubkey, }); + setReacted(true); }); }; diff --git a/src/components/textNote/TextNoteDisplayById.tsx b/src/components/textNote/TextNoteDisplayById.tsx index 5e90950..8f0b816 100644 --- a/src/components/textNote/TextNoteDisplayById.tsx +++ b/src/components/textNote/TextNoteDisplayById.tsx @@ -1,4 +1,6 @@ -import { Switch, Match, type Component } from 'solid-js'; +import { Switch, Match, type Component, Show } from 'solid-js'; + +import { Kind } from 'nostr-tools'; import EventLink from '@/components/EventLink'; // eslint-disable-next-line import/no-cycle @@ -13,22 +15,29 @@ type TextNoteDisplayByIdProps = Omit & { const TextNoteDisplayById: Component = (props) => { const { shouldMuteEvent } = useConfig(); - const { event, query: eventQuery } = useEvent(() => + const { event: fetchedEvent, query: eventQuery } = useEvent(() => ensureNonNull([props.eventId] as const)(([eventIdNonNull]) => ({ eventId: eventIdNonNull, })), ); const hidden = (): boolean => { - const ev = event(); + const ev = fetchedEvent(); return ev != null && shouldMuteEvent(ev); }; return ( {null} - - {(ev) => } + + {(event) => ( + 未対応のイベント種別({event.kind})} + > + + + )} {(id) => ( diff --git a/src/nostr/useBatchedEvents.ts b/src/nostr/useBatchedEvents.ts index d2b3d47..dc1847e 100644 --- a/src/nostr/useBatchedEvents.ts +++ b/src/nostr/useBatchedEvents.ts @@ -298,7 +298,7 @@ export const useProfile = (propsProvider: () => UseProfileProps | null): UseProf try { queryClient.setQueryData(queryKey, latestEvent()); } catch (err) { - console.error('updating profile error', err); + console.error('updating profile error: ', err); } }); return latestEvent(); @@ -472,7 +472,7 @@ export const useFollowings = (propsProvider: () => UseFollowingsProps | null): U try { queryClient.setQueryData(queryKey, latestEvent()); } catch (err) { - console.error('updating followings error', err); + console.error('updating followings error: ', err); } }); return latestEvent();