From f77aa7b4112982a2580feef9fd38e8e13e3945f2 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 13 Nov 2023 16:11:40 -0600 Subject: [PATCH] Fix parsing custom emoji reactions Fixes https://gitlab.com/soapbox-pub/soapbox/-/issues/1602 --- src/normalizers/status.ts | 9 ++++++--- src/schemas/emoji-reaction.ts | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/normalizers/status.ts b/src/normalizers/status.ts index e621f210b..9ae7933bc 100644 --- a/src/normalizers/status.ts +++ b/src/normalizers/status.ts @@ -14,6 +14,7 @@ import { normalizeAttachment } from 'soapbox/normalizers/attachment'; import { normalizeEmoji } from 'soapbox/normalizers/emoji'; import { normalizeMention } from 'soapbox/normalizers/mention'; import { accountSchema, cardSchema, emojiReactionSchema, groupSchema, pollSchema, tombstoneSchema } from 'soapbox/schemas'; +import { filteredArray } from 'soapbox/schemas/utils'; import { maybeFromJS } from 'soapbox/utils/normalizers'; import type { Account, Attachment, Card, Emoji, Group, Mention, Poll, EmbeddedEntity, EmojiReaction } from 'soapbox/types/entities'; @@ -219,11 +220,13 @@ const normalizeEvent = (status: ImmutableMap) => { } }; -// Normalize emojis +/** Normalize emojis. */ const normalizeEmojis = (status: ImmutableMap) => { - const reactions = status.getIn(['pleroma', 'emoji_reactions'], status.get('reactions')) as ImmutableList>; + const data = ImmutableList>(status.getIn(['pleroma', 'emoji_reactions']) || status.get('reactions')); + const reactions = filteredArray(emojiReactionSchema).parse(data.toJS()); + if (reactions) { - status.set('reactions', ImmutableList(reactions.map(((reaction: ImmutableMap) => emojiReactionSchema.parse(reaction.toJS()))))); + status.set('reactions', ImmutableList(reactions)); } }; diff --git a/src/schemas/emoji-reaction.ts b/src/schemas/emoji-reaction.ts index 56998c625..5f31658b1 100644 --- a/src/schemas/emoji-reaction.ts +++ b/src/schemas/emoji-reaction.ts @@ -2,15 +2,22 @@ import { z } from 'zod'; import { emojiSchema } from './utils'; -/** Pleroma emoji reaction. */ -const emojiReactionSchema = z.object({ - name: emojiSchema, +const baseEmojiReactionSchema = z.object({ count: z.number().nullable().catch(null), me: z.boolean().catch(false), - /** Akkoma custom emoji reaction. */ - url: z.string().url().optional().catch(undefined), + name: emojiSchema, + url: z.literal(undefined).catch(undefined), }); +const customEmojiReactionSchema = baseEmojiReactionSchema.extend({ + name: z.string(), + /** Akkoma custom emoji reaction. */ + url: z.string().url(), +}); + +/** Pleroma emoji reaction. */ +const emojiReactionSchema = baseEmojiReactionSchema.or(customEmojiReactionSchema); + type EmojiReaction = z.infer; export { emojiReactionSchema, type EmojiReaction }; \ No newline at end of file