From c294b1ac974cd541516e48499d6979f20ad5f5d4 Mon Sep 17 00:00:00 2001 From: Nya Candy Date: Mon, 15 May 2023 20:42:47 +0800 Subject: [PATCH] feat: add support for some fediverse platforms (#529) --- public/assets/social/mastodon.svg | 10 +++ public/assets/social/misskey.png | Bin 0 -> 9348 bytes public/assets/social/pleroma.svg | 71 ++++++++++++++++++ .../settings/social-platforms/page.tsx | 3 +- src/components/site/Platform.tsx | 43 +++++++++-- 5 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 public/assets/social/mastodon.svg create mode 100644 public/assets/social/misskey.png create mode 100644 public/assets/social/pleroma.svg diff --git a/public/assets/social/mastodon.svg b/public/assets/social/mastodon.svg new file mode 100644 index 00000000..0f8baebf --- /dev/null +++ b/public/assets/social/mastodon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/assets/social/misskey.png b/public/assets/social/misskey.png new file mode 100644 index 0000000000000000000000000000000000000000..b4eb18a5cb8de878156706c02754bcdcf2b02a72 GIT binary patch literal 9348 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 + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/app/dashboard/[subdomain]/settings/social-platforms/page.tsx b/src/app/dashboard/[subdomain]/settings/social-platforms/page.tsx index efde5cd4..6649b62f 100644 --- a/src/app/dashboard/[subdomain]/settings/social-platforms/page.tsx +++ b/src/app/dashboard/[subdomain]/settings/social-platforms/page.tsx @@ -8,7 +8,7 @@ import toast from "react-hot-toast" import { ReactSortable } from "react-sortablejs" import { SettingsLayout } from "~/components/dashboard/SettingsLayout" -import { Platform } from "~/components/site/Platform" +import { Platform, PlatformsSyncMap } from "~/components/site/Platform" import { Button } from "~/components/ui/Button" import { Input } from "~/components/ui/Input" import { UniLink } from "~/components/ui/UniLink" @@ -58,6 +58,7 @@ const SortableNavigationItem: React.FC<{ id={`${item.id}-identity`} type="text" value={item.identity} + placeholder={PlatformsSyncMap[item.platform]?.identityFormatTemplate} onChange={(e: ChangeEvent) => updateItem(item.id, { identity: e.target.value }) } diff --git a/src/components/site/Platform.tsx b/src/components/site/Platform.tsx index a7d79c77..1f66b05e 100644 --- a/src/components/site/Platform.tsx +++ b/src/components/site/Platform.tsx @@ -3,11 +3,12 @@ import { Tooltip } from "~/components/ui/Tooltip" import { UniLink } from "~/components/ui/UniLink" import { cn } from "~/lib/utils" -const syncMap: { +export const PlatformsSyncMap: { [key: string]: { name: string icon: string url?: string + identityFormatTemplate?: string } } = { telegram: { @@ -109,6 +110,24 @@ const syncMap: { icon: "/assets/social/whatsapp.svg", url: "https://wa.me/{username}", }, + mastodon: { + name: "Mastodon", + icon: "/assets/social/mastodon.svg", + url: "https://{instance}/@{username}", + identityFormatTemplate: "username@instance.ltd", + }, + misskey: { + name: "Misskey", + icon: "/assets/social/misskey.png", + url: "https://{instance}/@{username}", + identityFormatTemplate: "username@instance.ltd", + }, + pleroma: { + name: "Pleroma", + icon: "/assets/social/pleroma.svg", + url: "https://{instance}/users/{username}", + identityFormatTemplate: "username@instance.ltd", + }, } export const Platform: React.FC<{ @@ -117,6 +136,20 @@ export const Platform: React.FC<{ className?: string }> = ({ platform, username, className }) => { platform = platform.toLowerCase() + let link = PlatformsSyncMap[platform]?.url + + switch (platform) { + case "mastodon": + case "misskey": + case "pleroma": + const [uname, instance] = username?.split("@") + link = link?.replace("{instance}", instance).replace("{username}", uname) + break + default: + link = link?.replace("{username}", username) + break + } + return ( - {syncMap[platform]?.icon ? ( + {PlatformsSyncMap[platform]?.icon ? ( {platform} ) : (