-
+
{{ $t('_share.addServer') }}
@@ -82,6 +107,7 @@ import ArrowRightIco from 'bi/chevron-right.svg';
import PlusIco from 'bi/plus-lg.svg';
import DeleteIco from 'bi/trash.svg';
import QuestionIco from 'bi/question-lg.svg';
+import HelpIco from 'bi/question-circle.svg';
import ForkedIco from '@/assets/svg/repo-forked.svg';
import { isLocalPath, resolveObjPath } from '@/assets/js/misc';
import { parseURL, joinURL } from 'ufo';
@@ -91,6 +117,7 @@ import type { InstanceInfo, InstanceItem } from '@/types/instances-info';
import type { FunctionalComponent } from 'vue';
const { t } = useI18n();
+const localePath = useGLocalePath();
const props = defineProps<{
path: string;
@@ -98,6 +125,7 @@ const props = defineProps<{
heading?: string;
icon?: FunctionalComponent | string;
};
+ manualInstance?: string;
}>();
type ExtendedInstanceItem = InstanceItem & {
@@ -106,6 +134,7 @@ type ExtendedInstanceItem = InstanceItem & {
const loading = ref(true);
const iFetching = ref(false);
+const manualInstanceData = ref
();
const featuredInstances = ref([]);
const userDefinedInstances = ref([]);
const displayInstances = computed(() => [
@@ -203,6 +232,43 @@ onMounted(async () => {
const lsJ = JSON.parse(ls) as ExtendedInstanceItem[];
userDefinedInstances.value = [...lsJ];
}
+
+ if (props.manualInstance) {
+ const realHost = parseURL(props.manualInstance.startsWith('https://') ? props.manualInstance : 'https://' + props.manualInstance);
+ if (!realHost.host) {
+ alert(t('_servers._system.fetchError'));
+ return;
+ }
+
+ const miApi = new misskeyApi.APIClient({
+ origin: `https://${realHost.host}`,
+ });
+
+ try {
+ const res = await miApi.request('meta', { detail: true });
+
+ manualInstanceData.value = {
+ background: !(!res.backgroundImageUrl),
+ banner: !(!res.bannerUrl),
+ description: res.description,
+ icon: !(!res.iconUrl),
+ isAlive: true,
+ langs: res.langs,
+ meta: res,
+ name: res.name ?? '',
+ nodeinfo: null,
+ npd15: 0,
+ stats: {},
+ url: realHost.host ?? '',
+ value: 0,
+
+ isUserDefined: true,
+ };
+ } catch (err) {
+ console.error(err);
+ }
+
+ }
}
loading.value = false;
diff --git a/content/ja/docs/2.for-users/3.features/share-form.md b/content/ja/docs/2.for-users/3.features/share-form.md
index 6e156907..9270e0c6 100644
--- a/content/ja/docs/2.for-users/3.features/share-form.md
+++ b/content/ja/docs/2.for-users/3.features/share-form.md
@@ -51,3 +51,42 @@ URLにクエリパラメータとして共有内容をはじめとするいく
| 名前 | 説明 |
| ---- | ---- |
| `fileIds` | 添付するファイルのID(カンマ区切り) |
+
+## Misskey Hubの共有フォーム中継サービスについて
+
+
+
+新Misskey Hubでは、Misskeyのシェアボタンの設置にかかる煩雑な手間を減らすために、共有フォームの中継サービスを提供しています。
+こちらのサービスは、無料でどなたでもお使いいただけます。
+
+今までの共有フォームのリンクの各サーバーのドメイン部分を `misskey-hub.net` に変更するだけで、様々なMisskeyサーバーへの共有リンクへと進化させることができます!
+
+:::tip
+
+[共有ボタンジェネレーター](/tools/share-link-generator/) も併せてお使いください。
+
+:::
+
+:::warning
+
+共有フォーム中継サービス(以下、「本サービス」という)はWebサイト管理者の便宜のためにMisskey Development Division(以下、「当方」という)が無償・無保証で提供する機能です。本サービスを利用したこと、または何らかの原因によりこれをご利用できなかったことにより生じたいかなる損害について、当方は一切の責任を負いません。
+
+:::
+
+### 基本のパラメータ
+
+基本的に上記で紹介されているパラメーターをそのままお使いいただけますが、ユーザーIDやファイルIDなど、 **各サーバーに依存するパラメーターは使用できません。** それらが指定されていた場合、Misskey Hub上で削除されます。
+
+### 独自機能
+
+#### おすすめサーバー機能
+
+URLパラメータ `manualInstance` にMisskeyサーバーのドメインを入力することで、「シェア元Webサイトからのおすすめ」として、別枠でそのサーバーへのリンクを設置することができます。ご自身のサーバーに誘導する際などにお使いいただけます。
+
+:::warning
+
+「おすすめサーバー機能」はWebサイト管理者の便宜のために設置してある機能であり、当方が「シェア元Webサイトからのおすすめ」欄にあるサーバーをおすすめしているものではございません。
+
+「シェア元Webサイトからのおすすめ」から遷移したサーバーを利用・登録したことに起因するいかなる損害・不利益について、当方では責任を負いかねます。
+
+:::
\ No newline at end of file
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index d3ab12eb..a85dbd8e 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -268,6 +268,7 @@ _share:
addServer: "サーバーを追加"
domain: "サーバーのドメイン"
compatibleWith: "Misskeyと、一部のMisskeyフォークに対応しています。"
+ recommendedByWebsite: "シェア元Webサイトからのおすすめ"
_noteVisibility:
public: "パブリック"
@@ -284,6 +285,8 @@ _shareLinkGenerator:
url: "URL"
urlCaption: "任意。本文の後ろに挿入されます。"
settings: "詳細設定"
+ manualInstance: "おすすめサーバー ドメイン"
+ manualInstanceDescription: "ここに指定したサーバー(ひとつ)をシェアボタン中継ページのトップに表示できます。ご自身のサーバーに誘導する際などにお使いいただけます。"
visibility: "公開範囲"
recipents: "ダイレクトを受け取る人のacct(改行区切り)"
resultLink: "リンク生成結果"
diff --git a/pages/share.vue b/pages/share.vue
index 0aa1d994..7200a343 100644
--- a/pages/share.vue
+++ b/pages/share.vue
@@ -1,6 +1,14 @@
+
@@ -18,6 +26,25 @@ useHead({
});
const { meta, query } = useRoute();
+
+const manualInstance = (Array.isArray(query.manualInstance) ? query.manualInstance[0] : query.manualInstance) ?? undefined;
+
+const filteredQuery = computed(() => ({
+ ...query,
+ replyId: undefined,
+ renoteId: undefined,
+ visibleUserIds: undefined,
+ fileIds: undefined,
+ manualInstance: undefined,
+}));
+
+const isCanvasLoaded = ref(false);
+const showAnimBg = ref(false);
+
+if (process.client && window.innerWidth >= 768) {
+ showAnimBg.value = true;
+}
+
const { t } = useI18n();
meta.title = t('_share.title');
diff --git a/pages/tools/share-link-generator.vue b/pages/tools/share-link-generator.vue
index ffd70961..575cfa43 100644
--- a/pages/tools/share-link-generator.vue
+++ b/pages/tools/share-link-generator.vue
@@ -44,6 +44,11 @@
{{ $t('_shareLinkGenerator.settings') }}
+
+
+
+
{{ $t('_shareLinkGenerator.manualInstanceDescription') }}
+