diff --git a/locales/index.d.ts b/locales/index.d.ts index c1aa163f9822..80551c091094 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -2956,6 +2956,10 @@ export interface Locale extends ILocale { * 添付画像のサムネイルをオリジナル画質にする */ "loadRawImages": string; + /** + * 猫化(nyaize)を強制的に無効にする + */ + "denyaize": string; /** * アニメーション画像を再生しない */ @@ -4908,6 +4912,10 @@ export interface Locale extends ILocale { * リトライ */ "gameRetry": string; + /** + * QRコード + */ + "qrcode": string; "_bubbleGame": { /** * 遊び方 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 5c188610a1ae..3c2e1d8c16a9 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1224,6 +1224,7 @@ enableHorizontalSwipe: "スワイプしてタブを切り替える" loading: "読み込み中" surrender: "やめる" gameRetry: "リトライ" +qrcode: "QRコード" _bubbleGame: howToPlay: "遊び方" diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 682def8e8d7e..2954aef14fd6 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -17,6 +17,7 @@ "lint": "pnpm typecheck && pnpm eslint" }, "dependencies": { + "@chenfengyuan/vue-qrcode": "^2.0.0", "@discordapp/twemoji": "15.0.2", "@github/webauthn-json": "2.1.1", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", diff --git a/packages/frontend/src/components/MkInviteCode.vue b/packages/frontend/src/components/MkInviteCode.vue index 1c6f412dc156..88eba6e665eb 100644 --- a/packages/frontend/src/components/MkInviteCode.vue +++ b/packages/frontend/src/components/MkInviteCode.vue @@ -51,8 +51,13 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.copy }} + {{ i18n.ts.copyLink }} {{ i18n.ts.delete }}
+
+
{{ i18n.ts.qrcode }}
+ +
@@ -65,6 +70,7 @@ import MkButton from '@/components/MkButton.vue'; import copyToClipboard from '@/scripts/copy-to-clipboard.js'; import { i18n } from '@/i18n.js'; import * as os from '@/os.js'; +import VueQrcode from "@chenfengyuan/vue-qrcode"; const props = defineProps<{ invite: Misskey.entities.InviteCode; @@ -79,6 +85,8 @@ const isExpired = computed(() => { return props.invite.expiresAt && new Date(props.invite.expiresAt) < new Date(); }); +const inviteUrl = `${(new URL(window.location.href)).origin}/?invite=${props.invite.code}`; + function deleteCode() { os.apiWithDialog('invite/delete', { inviteId: props.invite.id, @@ -90,6 +98,12 @@ function copyInviteCode() { copyToClipboard(props.invite.code); os.success(); } + +function copyInviteCodeAsLink() { + copyToClipboard(inviteUrl); + os.success(); +} +