From f8b1248b8bb7df8b475f30d746414babe905b92c Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 14 Jul 2024 16:03:15 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix(frontend):=20#13089=20=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/index.d.ts | 2 +- packages/frontend/src/components/MkNote.vue | 16 +++++------ .../src/components/MkNoteDetailed.vue | 16 +++++------ packages/frontend/src/components/MkPoll.vue | 9 ++++--- packages/frontend/src/components/MkSignin.vue | 4 +-- packages/frontend/src/scripts/please-login.ts | 27 ++++++++++++++++++- packages/frontend/src/scripts/url.ts | 2 +- 7 files changed, 51 insertions(+), 25 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index 84a402b0de61..694ee53a1f0e 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -5004,7 +5004,7 @@ export interface Locale extends ILocale { * お問い合わせ */ "inquiry": string; - /** + /** * もう一度お試しください。 */ "tryAgain": string; diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index c518c7dd411d..10e86ddc338d 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -174,7 +174,7 @@ import MkPoll from '@/components/MkPoll.vue'; import MkUsersTooltip from '@/components/MkUsersTooltip.vue'; import MkUrlPreview from '@/components/MkUrlPreview.vue'; import MkInstanceTicker from '@/components/MkInstanceTicker.vue'; -import { pleaseLogin } from '@/scripts/please-login.js'; +import { pleaseLogin, type OpenOnRemoteOptions } from '@/scripts/please-login.js'; import { checkWordMute } from '@/scripts/check-word-mute.js'; import { userPage } from '@/filters/user.js'; import number from '@/filters/number.js'; @@ -279,10 +279,10 @@ const renoteCollapsed = ref( ), ); -const pleaseLoginContext = { +const pleaseLoginContext = computed(() => ({ type: 'lookup', - path: `https://${host}/notes/${appearNote.value.id}`, -} as const; + uri: `https://${host}/notes/${appearNote.value.id}`, +})); /* Overload FunctionにLintが対応していないのでコメントアウト function checkMute(noteToCheck: Misskey.entities.Note, mutedWords: Array | undefined | null, checkOnly: true): boolean; @@ -417,7 +417,7 @@ if (!props.mock) { } function renote(viaKeyboard = false) { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); showMovedDialog(); const { menu } = getRenoteMenu({ note: note.value, renoteButton, mock: props.mock }); @@ -427,7 +427,7 @@ function renote(viaKeyboard = false) { } function reply(): void { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); if (props.mock) { return; } @@ -440,7 +440,7 @@ function reply(): void { } function react(): void { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); showMovedDialog(); if (appearNote.value.reactionAcceptance === 'likeOnly') { sound.playMisskeySfx('reaction'); @@ -571,7 +571,7 @@ function showRenoteMenu(): void { } if (isMyRenote) { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); os.popupMenu([ getCopyNoteLinkMenu(note.value, i18n.ts.copyLinkRenote), { type: 'divider' }, diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index 737e9a853ab3..48b6d3aefa7e 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -209,7 +209,7 @@ import MkPoll from '@/components/MkPoll.vue'; import MkUsersTooltip from '@/components/MkUsersTooltip.vue'; import MkUrlPreview from '@/components/MkUrlPreview.vue'; import MkInstanceTicker from '@/components/MkInstanceTicker.vue'; -import { pleaseLogin } from '@/scripts/please-login.js'; +import { pleaseLogin, type OpenOnRemoteOptions } from '@/scripts/please-login.js'; import { checkWordMute } from '@/scripts/check-word-mute.js'; import { userPage } from '@/filters/user.js'; import { notePage } from '@/filters/note.js'; @@ -297,10 +297,10 @@ const conversation = ref([]); const replies = ref([]); const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || appearNote.value.userId === $i?.id); -const pleaseLoginContext = { +const pleaseLoginContext = computed(() => ({ type: 'lookup', - path: `https://${host}/notes/${appearNote.value.id}`, -} as const; + uri: `https://${host}/notes/${appearNote.value.id}`, +})); const keymap = { 'r': () => reply(), @@ -402,7 +402,7 @@ if (appearNote.value.reactionAcceptance === 'likeOnly') { } function renote() { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); showMovedDialog(); const { menu } = getRenoteMenu({ note: note.value, renoteButton }); @@ -410,7 +410,7 @@ function renote() { } function reply(): void { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); showMovedDialog(); os.post({ reply: appearNote.value, @@ -421,7 +421,7 @@ function reply(): void { } function react(): void { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); showMovedDialog(); if (appearNote.value.reactionAcceptance === 'likeOnly') { sound.playMisskeySfx('reaction'); @@ -505,7 +505,7 @@ async function clip(): Promise { function showRenoteMenu(): void { if (!isMyRenote) return; - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); os.popupMenu([{ text: i18n.ts.unrenote, icon: 'ti ti-trash', diff --git a/packages/frontend/src/components/MkPoll.vue b/packages/frontend/src/components/MkPoll.vue index 82e2a605f12d..80207932ea62 100644 --- a/packages/frontend/src/components/MkPoll.vue +++ b/packages/frontend/src/components/MkPoll.vue @@ -36,6 +36,7 @@ import { misskeyApi } from '@/scripts/misskey-api.js'; import { i18n } from '@/i18n.js'; import { host } from '@/config.js'; import { useInterval } from '@/scripts/use-interval.js'; +import type { OpenOnRemoteOptions } from '@/scripts/please-login.js'; const props = defineProps<{ noteId: string; @@ -61,10 +62,10 @@ const timer = computed(() => i18n.tsx._poll[ const showResult = ref(props.readOnly || isVoted.value); -const pleaseLoginContext = { +const pleaseLoginContext = computed(() => ({ type: 'lookup', - path: `https://${host}/notes/${props.note.id}`, -} as const; + uri: `https://${host}/notes/${props.noteId}`, +})); // 期限付きアンケート if (props.poll.expiresAt) { @@ -82,7 +83,7 @@ if (props.poll.expiresAt) { } const vote = async (id) => { - pleaseLogin(undefined, pleaseLoginContext); + pleaseLogin(undefined, pleaseLoginContext.value); if (props.readOnly || closed.value || isVoted.value) return; diff --git a/packages/frontend/src/components/MkSignin.vue b/packages/frontend/src/components/MkSignin.vue index 746ddd715471..857334d2c037 100644 --- a/packages/frontend/src/components/MkSignin.vue +++ b/packages/frontend/src/components/MkSignin.vue @@ -239,7 +239,7 @@ function openRemote(options: OpenOnRemoteOptions, targetHost?: string): void { let _path = options.path; if (options.type === 'lookup') { - // TODO: v2024.2.0以降が浸透してきたら正式なURLに変更する▼ + // TODO: v2024.7.0以降が浸透してきたら正式なURLに変更する▼ // _path = `/lookup?uri=${encodeURIComponent(_path)}`; _path = `/authorize-follow?acct=${encodeURIComponent(_path)}`; } @@ -252,7 +252,7 @@ function openRemote(options: OpenOnRemoteOptions, targetHost?: string): void { break; } case 'share': { - const params = query(options.params); + const params = query(options.params); if (targetHost) { window.open(`https://${targetHost}/share?${params}`, '_blank', 'noopener'); } else { diff --git a/packages/frontend/src/scripts/please-login.ts b/packages/frontend/src/scripts/please-login.ts index b04062a58a7a..3c80793cf744 100644 --- a/packages/frontend/src/scripts/please-login.ts +++ b/packages/frontend/src/scripts/please-login.ts @@ -9,13 +9,38 @@ import { i18n } from '@/i18n.js'; import { popup } from '@/os.js'; export type OpenOnRemoteOptions = { + /** + * 外部のMisskey Webで特定のパスを開く + */ type: 'web'; + + /** + * 内部パス(例: `/settings`) + */ path: string; } | { + /** + * 外部のMisskey Webで照会する + */ type: 'lookup'; - path: string; + + /** + * 照会したいエンティティのURI + * + * (例: `https://misskey.example.com/notes/abcdexxxxyz`) + */ + uri: string; } | { + /** + * 外部のMisskeyでノートする + */ type: 'share'; + + /** + * `/share` ページに渡すクエリストリング + * + * @see https://go.misskey-hub.net/spec/share/ + */ params: Record; }; diff --git a/packages/frontend/src/scripts/url.ts b/packages/frontend/src/scripts/url.ts index c477fb55063c..d65816e28e1f 100644 --- a/packages/frontend/src/scripts/url.ts +++ b/packages/frontend/src/scripts/url.ts @@ -23,6 +23,6 @@ export function appendQuery(url: string, query: string): string { } export function extractDomain(url: string) { - const match = url.match(/^(https)?:?\/{0,2}([^\/]+)/); + const match = url.match(/^(https?)?:?\/{0,2}([^\/]+)/); return match ? match[2] : null; } From 8c97eae54d2b4bb0a3a6521e2a3634d61aba43a6 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 14 Jul 2024 16:05:34 +0900 Subject: [PATCH 2/4] fix --- packages/frontend/src/components/MkNote.vue | 2 +- packages/frontend/src/components/MkNoteDetailed.vue | 2 +- packages/frontend/src/components/MkPoll.vue | 2 +- packages/frontend/src/components/MkSignin.vue | 6 ++++-- packages/frontend/src/scripts/please-login.ts | 4 ++-- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 10e86ddc338d..13273a53b4a1 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -281,7 +281,7 @@ const renoteCollapsed = ref( const pleaseLoginContext = computed(() => ({ type: 'lookup', - uri: `https://${host}/notes/${appearNote.value.id}`, + url: `https://${host}/notes/${appearNote.value.id}`, })); /* Overload FunctionにLintが対応していないのでコメントアウト diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index 48b6d3aefa7e..9a3e595789c7 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -299,7 +299,7 @@ const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.vi const pleaseLoginContext = computed(() => ({ type: 'lookup', - uri: `https://${host}/notes/${appearNote.value.id}`, + url: `https://${host}/notes/${appearNote.value.id}`, })); const keymap = { diff --git a/packages/frontend/src/components/MkPoll.vue b/packages/frontend/src/components/MkPoll.vue index 80207932ea62..72bd8f4f6c40 100644 --- a/packages/frontend/src/components/MkPoll.vue +++ b/packages/frontend/src/components/MkPoll.vue @@ -64,7 +64,7 @@ const showResult = ref(props.readOnly || isVoted.value); const pleaseLoginContext = computed(() => ({ type: 'lookup', - uri: `https://${host}/notes/${props.noteId}`, + url: `https://${host}/notes/${props.noteId}`, })); // 期限付きアンケート diff --git a/packages/frontend/src/components/MkSignin.vue b/packages/frontend/src/components/MkSignin.vue index 857334d2c037..a123bbddc629 100644 --- a/packages/frontend/src/components/MkSignin.vue +++ b/packages/frontend/src/components/MkSignin.vue @@ -236,12 +236,14 @@ function openRemote(options: OpenOnRemoteOptions, targetHost?: string): void { switch (options.type) { case 'web': case 'lookup': { - let _path = options.path; + let _path: string; if (options.type === 'lookup') { // TODO: v2024.7.0以降が浸透してきたら正式なURLに変更する▼ // _path = `/lookup?uri=${encodeURIComponent(_path)}`; - _path = `/authorize-follow?acct=${encodeURIComponent(_path)}`; + _path = `/authorize-follow?acct=${encodeURIComponent(options.url)}`; + } else { + _path = options.path; } if (targetHost) { diff --git a/packages/frontend/src/scripts/please-login.ts b/packages/frontend/src/scripts/please-login.ts index 3c80793cf744..18f05bc7f428 100644 --- a/packages/frontend/src/scripts/please-login.ts +++ b/packages/frontend/src/scripts/please-login.ts @@ -25,11 +25,11 @@ export type OpenOnRemoteOptions = { type: 'lookup'; /** - * 照会したいエンティティのURI + * 照会したいエンティティのURL * * (例: `https://misskey.example.com/notes/abcdexxxxyz`) */ - uri: string; + url: string; } | { /** * 外部のMisskeyでノートする From 1c7b9c7c1241231775a10ef6c7003b6c4bee933e Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 14 Jul 2024 16:09:57 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=E6=AD=A3=E8=A6=8F=E8=A1=A8=E7=8F=BE?= =?UTF-8?q?=E3=82=92=E5=BC=B7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/scripts/url.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/scripts/url.ts b/packages/frontend/src/scripts/url.ts index d65816e28e1f..07fb900995a8 100644 --- a/packages/frontend/src/scripts/url.ts +++ b/packages/frontend/src/scripts/url.ts @@ -23,6 +23,6 @@ export function appendQuery(url: string, query: string): string { } export function extractDomain(url: string) { - const match = url.match(/^(https?)?:?\/{0,2}([^\/]+)/); + const match = url.match(/^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?([^:\/\n]+)/im); return match ? match[2] : null; } From f653595fc3fd04933af1b6ccab657ea014c02208 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 14 Jul 2024 16:11:32 +0900 Subject: [PATCH 4/4] fix --- packages/frontend/src/scripts/url.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/scripts/url.ts b/packages/frontend/src/scripts/url.ts index 07fb900995a8..5a8265af9e10 100644 --- a/packages/frontend/src/scripts/url.ts +++ b/packages/frontend/src/scripts/url.ts @@ -24,5 +24,5 @@ export function appendQuery(url: string, query: string): string { export function extractDomain(url: string) { const match = url.match(/^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?([^:\/\n]+)/im); - return match ? match[2] : null; + return match ? match[1] : null; }