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)}