From 73df5533bb79478a52a42c513d6a0ac190f97041 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Mon, 24 Jun 2024 01:47:32 +0530 Subject: [PATCH 1/5] use account.ditto.external if present --- src/features/account/components/header.tsx | 19 ++++++++++++------- src/schemas/account.ts | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/features/account/components/header.tsx b/src/features/account/components/header.tsx index be74a5b65..061dc8031 100644 --- a/src/features/account/components/header.tsx +++ b/src/features/account/components/header.tsx @@ -311,14 +311,19 @@ const Header: React.FC = ({ account }) => { }); } - if (features.federating && !account.local) { - const domain = account.fqn.split('@')[1]; + const ditto = account.ditto.external ? new URL(account.ditto.external).host : undefined; + if (features.federating && (!account.local || ditto)) { + const domain = ditto || account.fqn.split('@')[1]; + const url = account.ditto.external || account.url; - menu.push({ - text: intl.formatMessage(messages.profileExternal, { domain }), - action: () => onProfileExternal(account.url), - icon: require('@tabler/icons/outline/external-link.svg'), - }); + if (domain && url) { + menu.push({ + text: intl.formatMessage(messages.profileExternal, { domain }), + action: () => onProfileExternal(url), + icon: require('@tabler/icons/outline/external-link.svg'), + href: url, + }); + } } menu.push({ diff --git a/src/schemas/account.ts b/src/schemas/account.ts index 966e03ef0..d53d2da7f 100644 --- a/src/schemas/account.ts +++ b/src/schemas/account.ts @@ -43,6 +43,7 @@ const baseAccountSchema = z.object({ ditto: coerceObject({ accepts_zaps: z.boolean().catch(false), is_registered: z.boolean().catch(false), + external: z.string().optional().catch(undefined), }), emojis: filteredArray(customEmojiSchema), fields: filteredArray(fieldSchema), From de866d25e59d3180891d8b7df2f8f42d4b53845b Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Mon, 24 Jun 2024 02:00:40 +0530 Subject: [PATCH 2/5] use external viewer link for statuses as well --- src/components/status-action-bar.tsx | 6 ++++-- src/normalizers/status.ts | 1 + src/schemas/status.ts | 7 ++++++- 3 files changed, 11 insertions(+), 3 deletions(-) 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 }; From 0770220fbb96e35ed4df4266d4e2507c662c5624 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Mon, 24 Jun 2024 02:39:45 +0530 Subject: [PATCH 3/5] rename ditto.external property to ditto.external_url --- src/components/status-action-bar.tsx | 4 ++-- src/features/account/components/header.tsx | 4 ++-- src/schemas/account.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/status-action-bar.tsx b/src/components/status-action-bar.tsx index 4e670f82a..f193bd951 100644 --- a/src/components/status-action-bar.tsx +++ b/src/components/status-action-bar.tsx @@ -464,9 +464,9 @@ const StatusActionBar: React.FC = ({ } if (features.federating && !account.local) { - const ditto: string | undefined = status.ditto?.get('external'); + const ditto: string | undefined = status.ditto?.get('external_url'); const { hostname: domain } = new URL(ditto || status.uri); - + menu.push({ text: intl.formatMessage(messages.external, { domain }), icon: require('@tabler/icons/outline/external-link.svg'), diff --git a/src/features/account/components/header.tsx b/src/features/account/components/header.tsx index 061dc8031..ced1d7a28 100644 --- a/src/features/account/components/header.tsx +++ b/src/features/account/components/header.tsx @@ -311,10 +311,10 @@ const Header: React.FC = ({ account }) => { }); } - const ditto = account.ditto.external ? new URL(account.ditto.external).host : undefined; + const ditto = account.ditto.external_url ? new URL(account.ditto.external_url).host : undefined; if (features.federating && (!account.local || ditto)) { const domain = ditto || account.fqn.split('@')[1]; - const url = account.ditto.external || account.url; + const url = account.ditto.external_url || account.url; if (domain && url) { menu.push({ diff --git a/src/schemas/account.ts b/src/schemas/account.ts index d53d2da7f..15ebc821e 100644 --- a/src/schemas/account.ts +++ b/src/schemas/account.ts @@ -43,7 +43,7 @@ const baseAccountSchema = z.object({ ditto: coerceObject({ accepts_zaps: z.boolean().catch(false), is_registered: z.boolean().catch(false), - external: z.string().optional().catch(undefined), + external_url: z.string().optional().catch(undefined), }), emojis: filteredArray(customEmojiSchema), fields: filteredArray(fieldSchema), From 4dfe7063c3c8f594f66efb9bef5fd33fe00a59c1 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Mon, 24 Jun 2024 02:48:46 +0530 Subject: [PATCH 4/5] fix external key in statusDittoSchema --- src/schemas/status.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schemas/status.ts b/src/schemas/status.ts index 653a7d440..7d41837f5 100644 --- a/src/schemas/status.ts +++ b/src/schemas/status.ts @@ -25,7 +25,7 @@ const statusPleromaSchema = z.object({ }); const statusDittoSchema = z.object({ - external: z.string().optional().catch(undefined), + external_url: z.string().optional().catch(undefined), }); const baseStatusSchema = z.object({ From bb0e5568beb33f4a177d49f486967156495ae600 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Mon, 24 Jun 2024 02:53:49 +0530 Subject: [PATCH 5/5] rename `ditto` to the more clear `externalNostrUrl` --- src/components/status-action-bar.tsx | 6 +++--- src/features/account/components/header.tsx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/status-action-bar.tsx b/src/components/status-action-bar.tsx index f193bd951..4f2f0856f 100644 --- a/src/components/status-action-bar.tsx +++ b/src/components/status-action-bar.tsx @@ -464,13 +464,13 @@ const StatusActionBar: React.FC = ({ } if (features.federating && !account.local) { - const ditto: string | undefined = status.ditto?.get('external_url'); - const { hostname: domain } = new URL(ditto || status.uri); + const externalNostrUrl: string | undefined = status.ditto?.get('external_url'); + const { hostname: domain } = new URL(externalNostrUrl || status.uri); menu.push({ text: intl.formatMessage(messages.external, { domain }), icon: require('@tabler/icons/outline/external-link.svg'), - href: ditto || status.uri, + href: externalNostrUrl || status.uri, target: '_blank', }); } diff --git a/src/features/account/components/header.tsx b/src/features/account/components/header.tsx index ced1d7a28..786ce40c9 100644 --- a/src/features/account/components/header.tsx +++ b/src/features/account/components/header.tsx @@ -311,9 +311,9 @@ const Header: React.FC = ({ account }) => { }); } - const ditto = account.ditto.external_url ? new URL(account.ditto.external_url).host : undefined; - if (features.federating && (!account.local || ditto)) { - const domain = ditto || account.fqn.split('@')[1]; + const externalNostrUrl = account.ditto.external_url ? new URL(account.ditto.external_url).host : undefined; + if (features.federating && (!account.local || externalNostrUrl)) { + const domain = externalNostrUrl || account.fqn.split('@')[1]; const url = account.ditto.external_url || account.url; if (domain && url) {