diff --git a/src/components/EmojiDisplay.tsx b/src/components/EmojiDisplay.tsx new file mode 100644 index 0000000..cde7db7 --- /dev/null +++ b/src/components/EmojiDisplay.tsx @@ -0,0 +1,29 @@ +import { Component, Match, Switch } from 'solid-js'; + +import HeartSolid from 'heroicons/24/solid/heart.svg'; + +import { ReactionTypes } from '@/nostr/event/Reaction'; + +export type EmojiDisplayProps = { + reactionTypes: ReactionTypes; +}; + +const isPlus = (r: ReactionTypes) => r.type === 'LikeDislike' && r.content === '+'; + +const EmojiDisplay: Component = (props) => ( + {props.reactionTypes.content}}> + + + + + + + {({ content }) => {content}} + + + {({ shortcode, url }) => {`:${shortcode}}:`}} + + +); + +export default EmojiDisplay; diff --git a/src/components/event/Reaction.tsx b/src/components/event/Reaction.tsx index bd47a83..3704336 100644 --- a/src/components/event/Reaction.tsx +++ b/src/components/event/Reaction.tsx @@ -1,27 +1,27 @@ -import { Switch, Match, type Component, Show } from 'solid-js'; +import { type Component, Show } from 'solid-js'; -import HeartSolid from 'heroicons/24/solid/heart.svg'; import { type Event as NostrEvent } from 'nostr-tools'; +import EmojiDisplay from '@/components/EmojiDisplay'; import TextNoteDisplay from '@/components/event/textNote/TextNoteDisplay'; import UserDisplayName from '@/components/UserDisplayName'; import useConfig from '@/core/useConfig'; import useModalState from '@/hooks/useModalState'; import { useTranslation } from '@/i18n/useTranslation'; -import { genericEvent } from '@/nostr/event'; +import { reaction } from '@/nostr/event'; import useEvent from '@/nostr/useEvent'; import useProfile from '@/nostr/useProfile'; import ensureNonNull from '@/utils/ensureNonNull'; -type ReactionProps = { +type ReactionDisplayProps = { event: NostrEvent; }; -const Reaction: Component = (props) => { +const ReactionDisplay: Component = (props) => { const i18n = useTranslation(); const { shouldMuteEvent } = useConfig(); const { showProfile } = useModalState(); - const event = () => genericEvent(props.event); + const event = () => reaction(props.event); const eventId = () => event().lastTaggedEventId(); const { profile } = useProfile(() => ({ @@ -41,13 +41,7 @@ const Reaction: Component = (props) => {
- {props.event.content}}> - - - - - - +
@@ -84,4 +78,4 @@ const Reaction: Component = (props) => { ); }; -export default Reaction; +export default ReactionDisplay; diff --git a/src/components/event/textNote/TextNoteDisplay.tsx b/src/components/event/textNote/TextNoteDisplay.tsx index 2565445..af84cbb 100644 --- a/src/components/event/textNote/TextNoteDisplay.tsx +++ b/src/components/event/textNote/TextNoteDisplay.tsx @@ -19,6 +19,7 @@ import HeartSolid from 'heroicons/24/solid/heart.svg'; import { nip19, type Event as NostrEvent } from 'nostr-tools'; import ContextMenu, { MenuItem } from '@/components/ContextMenu'; +import EmojiDisplay from '@/components/EmojiDisplay'; import EmojiPicker from '@/components/EmojiPicker'; // eslint-disable-next-line import/no-cycle import EventDisplayById from '@/components/event/EventDisplayById'; @@ -33,7 +34,8 @@ import { useTimelineContext } from '@/components/timeline/TimelineContext'; import useConfig from '@/core/useConfig'; import useModalState from '@/hooks/useModalState'; import { useTranslation } from '@/i18n/useTranslation'; -import { textNote } from '@/nostr/event'; +import { textNote, reaction } from '@/nostr/event'; +import { ReactionTypes } from '@/nostr/event/Reaction'; import useCommands from '@/nostr/useCommands'; import usePubkey from '@/nostr/usePubkey'; import useReactions from '@/nostr/useReactions'; @@ -48,8 +50,8 @@ export type TextNoteDisplayProps = { }; type EmojiReactionsProps = { - reactionsGroupedByContent: Map; - onReaction: (emoji: string) => void; + reactionsGrouped: Map; + onReaction: (reaction: ReactionTypes) => void; }; const { noteEncode } = nip19; @@ -60,10 +62,11 @@ const EmojiReactions: Component = (props) => { return (
- - {([content, events]) => { + + {([, events]) => { const isReactedByMeWithThisContent = events.findIndex((ev) => ev.pubkey === pubkey()) >= 0; + const reactionTypes = reaction(events[0]).toReactionTypes(); return (