diff --git a/package.json b/package.json index 283629d5..822a5d81 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@vite-pwa/assets-generator": "^0.2.6", "@vite-pwa/sveltekit": "^0.6.6", "@welshman/app": "^0.2.5", - "@welshman/content": "^0.2.1", + "@welshman/content": "^0.2.2", "@welshman/dvm": "^0.2.0", "@welshman/editor": "^0.2.4", "@welshman/feeds": "^0.2.2", @@ -62,7 +62,7 @@ "@welshman/router": "^0.2.0", "@welshman/signer": "^0.2.3", "@welshman/store": "^0.2.0", - "@welshman/util": "^0.2.2", + "@welshman/util": "^0.2.3", "daisyui": "^4.12.10", "date-picker-svelte": "^2.13.0", "dotenv": "^16.4.5", diff --git a/src/app/commands.ts b/src/app/commands.ts index d4c8df27..33d20b93 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -380,10 +380,12 @@ export const publishReport = ({ export type ReactionParams = { event: TrustedEvent content: string + tags?: string[][] } -export const makeReaction = ({event, content}: ReactionParams) => { - const tags = tagEventForReaction(event) +export const makeReaction = ({content, event, tags: paramTags = []}: ReactionParams) => { + const tags = [...paramTags, ...tagEventForReaction(event)] + const groupTag = getTag("h", event.tags) if (groupTag) { diff --git a/src/app/components/CalendarEventActions.svelte b/src/app/components/CalendarEventActions.svelte index a411a517..7d71ccd0 100644 --- a/src/app/components/CalendarEventActions.svelte +++ b/src/app/components/CalendarEventActions.svelte @@ -1,5 +1,5 @@
- + {#if showActivity} diff --git a/src/app/components/ChannelMessage.svelte b/src/app/components/ChannelMessage.svelte index c2d43d31..9a976407 100644 --- a/src/app/components/ChannelMessage.svelte +++ b/src/app/components/ChannelMessage.svelte @@ -1,7 +1,7 @@
- +
{#if !isMobile}
- +
diff --git a/src/app/components/Content.svelte b/src/app/components/Content.svelte index 755c1a8d..bb411767 100644 --- a/src/app/components/Content.svelte +++ b/src/app/components/Content.svelte @@ -6,6 +6,7 @@ truncate, renderAsHtml, isText, + isEmoji, isTopic, isCode, isCashu, @@ -22,6 +23,7 @@ import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" import ContentToken from "@app/components/ContentToken.svelte" + import ContentEmoji from "@app/components/ContentEmoji.svelte" import ContentCode from "@app/components/ContentCode.svelte" import ContentLinkInline from "@app/components/ContentLinkInline.svelte" import ContentLinkBlock from "@app/components/ContentLinkBlock.svelte" @@ -133,6 +135,8 @@ {:else if isTopic(parsed)} + {:else if isEmoji(parsed)} + {:else if isCode(parsed)} + import type {ParsedEmojiValue} from "@welshman/content" + import {imgproxy} from "@app/state" + + export let value: ParsedEmojiValue + + const alt = `:${value.name}:` + + +{#if value.url} + +{:else} + {alt} +{/if} diff --git a/src/app/components/NoteItem.svelte b/src/app/components/NoteItem.svelte index e13654e2..50f2ca12 100644 --- a/src/app/components/NoteItem.svelte +++ b/src/app/components/NoteItem.svelte @@ -1,7 +1,6 @@ + +{#if event.content === "+" || event.content === ""} + +{:else if event.content === "-"} + +{:else} + {#each parse(event) as parsed} + {#if isEmoji(parsed)} + + {:else} + {@html renderAsHtml(parsed)} + {/if} + {/each} +{/if} diff --git a/src/app/components/ReactionSummary.svelte b/src/app/components/ReactionSummary.svelte index a1a60a98..b1381ba7 100644 --- a/src/app/components/ReactionSummary.svelte +++ b/src/app/components/ReactionSummary.svelte @@ -2,20 +2,29 @@ import {onMount} from "svelte" import type {Snippet} from "svelte" import {groupBy, uniq, uniqBy, batch, displayList} from "@welshman/lib" - import {REACTION, getReplyFilters, getTag, REPORT, DELETE} from "@welshman/util" - import type {TrustedEvent} from "@welshman/util" + import { + REACTION, + getReplyFilters, + getEmojiTags, + getEmojiTag, + getTag, + REPORT, + DELETE, + } from "@welshman/util" + import type {TrustedEvent, EventContent} from "@welshman/util" import {deriveEvents} from "@welshman/store" import {load} from "@welshman/net" import {pubkey, repository, displayProfileByPubkey} from "@welshman/app" import {isMobile, preventDefault, stopPropagation} from "@lib/html" import Icon from "@lib/components/Icon.svelte" + import Reaction from "@app/components/Reaction.svelte" import EventReportDetails from "@app/components/EventReportDetails.svelte" - import {displayReaction} from "@app/state" import {pushModal} from "@app/modal" interface Props { - event: any - onReactionClick: any + event: TrustedEvent + deleteReaction: (event: TrustedEvent) => void + createReaction: (event: EventContent) => void url?: string reactionClass?: string noTooltip?: boolean @@ -24,7 +33,8 @@ const { event, - onReactionClick, + deleteReaction, + createReaction, url = "", reactionClass = "", noTooltip = false, @@ -39,14 +49,31 @@ filters: [{kinds: [REACTION], "#e": [event.id]}], }) + const onReactionClick = (events: TrustedEvent[]) => { + const reaction = events.find(e => e.pubkey === $pubkey) + + if (reaction) { + deleteReaction(reaction) + } else { + const [event] = events + + createReaction({ + content: event.content, + tags: getEmojiTags(event.content.replace(/:/g, ""), event.tags), + }) + } + } + const onReportClick = () => pushModal(EventReportDetails, {url, event}) const reportReasons = $derived(uniq($reports.map(e => getTag("e", e.tags)?.[2]))) + const getReactionKey = (e: TrustedEvent) => getEmojiTag(e.content, e.tags)?.join("") || e.content + const groupedReactions = $derived( groupBy( - e => e.content, - uniqBy(e => e.pubkey + e.content, $reactions), + getReactionKey, + uniqBy(e => `${e.pubkey}${getReactionKey(e)}`, $reactions), ), ) @@ -86,12 +113,12 @@ {$reports.length} {/if} - {#each groupedReactions.entries() as [content, events]} + {#each groupedReactions.entries() as [key, events]} {@const pubkeys = events.map(e => e.pubkey)} {@const isOwn = $pubkey && pubkeys.includes($pubkey)} {@const info = displayList(pubkeys.map(pubkey => displayProfileByPubkey(pubkey)))} - {@const tooltip = `${info} reacted ${displayReaction(content)}`} - {@const onClick = () => onReactionClick(content, events)} + {@const tooltip = `${info} reacted`} + {@const onClick = () => onReactionClick(events)}