diff --git a/src/components/status-action-bar.tsx b/src/components/status-action-bar.tsx index edfa10396..4e670f82a 100644 --- a/src/components/status-action-bar.tsx +++ b/src/components/status-action-bar.tsx @@ -464,11 +464,13 @@ const StatusActionBar: React.FC = ({ } if (features.federating && !account.local) { - const { hostname: domain } = new URL(status.uri); + const ditto: string | undefined = status.ditto?.get('external'); + const { hostname: domain } = new URL(ditto || status.uri); + menu.push({ text: intl.formatMessage(messages.external, { domain }), icon: require('@tabler/icons/outline/external-link.svg'), - href: status.uri, + href: ditto || status.uri, target: '_blank', }); } diff --git a/src/normalizers/status.ts b/src/normalizers/status.ts index 1797feb2e..093069f4c 100644 --- a/src/normalizers/status.ts +++ b/src/normalizers/status.ts @@ -67,6 +67,7 @@ export const StatusRecord = ImmutableRecord({ muted: false, pinned: false, pleroma: ImmutableMap(), + ditto: ImmutableMap(), poll: null as EmbeddedEntity, quote: null as EmbeddedEntity, quotes_count: 0, diff --git a/src/schemas/status.ts b/src/schemas/status.ts index 865b3a02e..653a7d440 100644 --- a/src/schemas/status.ts +++ b/src/schemas/status.ts @@ -24,6 +24,10 @@ const statusPleromaSchema = z.object({ quote_visible: z.boolean().catch(true), }); +const statusDittoSchema = z.object({ + external: z.string().optional().catch(undefined), +}); + const baseStatusSchema = z.object({ account: accountSchema, application: z.object({ @@ -51,6 +55,7 @@ const baseStatusSchema = z.object({ muted: z.coerce.boolean(), pinned: z.coerce.boolean(), pleroma: statusPleromaSchema.optional().catch(undefined), + ditto: statusDittoSchema.optional().catch(undefined), reactions: filteredArray(emojiReactionSchema), poll: pollSchema.nullable().catch(null), quote: z.literal(null).catch(null), @@ -152,4 +157,4 @@ const statusSchema = baseStatusSchema.extend({ type Status = Resolve>; -export { statusSchema, type Status }; \ No newline at end of file +export { statusSchema, type Status };