Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(frontend): follow-up of #13089 #14206

Merged
merged 4 commits into from
Jul 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion locales/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5004,7 +5004,7 @@ export interface Locale extends ILocale {
* お問い合わせ
*/
"inquiry": string;
/**
/**
* もう一度お試しください。
*/
"tryAgain": string;
Expand Down
16 changes: 8 additions & 8 deletions packages/frontend/src/components/MkNote.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -279,10 +279,10 @@ const renoteCollapsed = ref(
),
);

const pleaseLoginContext = {
const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({
type: 'lookup',
path: `https://${host}/notes/${appearNote.value.id}`,
} as const;
url: `https://${host}/notes/${appearNote.value.id}`,
}));

/* Overload FunctionにLintが対応していないのでコメントアウト
function checkMute(noteToCheck: Misskey.entities.Note, mutedWords: Array<string | string[]> | undefined | null, checkOnly: true): boolean;
Expand Down Expand Up @@ -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 });
Expand All @@ -427,7 +427,7 @@ function renote(viaKeyboard = false) {
}

function reply(): void {
pleaseLogin(undefined, pleaseLoginContext);
pleaseLogin(undefined, pleaseLoginContext.value);
if (props.mock) {
return;
}
Expand All @@ -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');
Expand Down Expand Up @@ -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' },
Expand Down
16 changes: 8 additions & 8 deletions packages/frontend/src/components/MkNoteDetailed.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -297,10 +297,10 @@ const conversation = ref<Misskey.entities.Note[]>([]);
const replies = ref<Misskey.entities.Note[]>([]);
const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || appearNote.value.userId === $i?.id);

const pleaseLoginContext = {
const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({
type: 'lookup',
path: `https://${host}/notes/${appearNote.value.id}`,
} as const;
url: `https://${host}/notes/${appearNote.value.id}`,
}));

const keymap = {
'r': () => reply(),
Expand Down Expand Up @@ -402,15 +402,15 @@ if (appearNote.value.reactionAcceptance === 'likeOnly') {
}

function renote() {
pleaseLogin(undefined, pleaseLoginContext);
pleaseLogin(undefined, pleaseLoginContext.value);
showMovedDialog();

const { menu } = getRenoteMenu({ note: note.value, renoteButton });
os.popupMenu(menu, renoteButton.value);
}

function reply(): void {
pleaseLogin(undefined, pleaseLoginContext);
pleaseLogin(undefined, pleaseLoginContext.value);
showMovedDialog();
os.post({
reply: appearNote.value,
Expand All @@ -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');
Expand Down Expand Up @@ -505,7 +505,7 @@ async function clip(): Promise<void> {

function showRenoteMenu(): void {
if (!isMyRenote) return;
pleaseLogin(undefined, pleaseLoginContext);
pleaseLogin(undefined, pleaseLoginContext.value);
os.popupMenu([{
text: i18n.ts.unrenote,
icon: 'ti ti-trash',
Expand Down
9 changes: 5 additions & 4 deletions packages/frontend/src/components/MkPoll.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -61,10 +62,10 @@ const timer = computed(() => i18n.tsx._poll[

const showResult = ref(props.readOnly || isVoted.value);

const pleaseLoginContext = {
const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({
type: 'lookup',
path: `https://${host}/notes/${props.note.id}`,
} as const;
url: `https://${host}/notes/${props.noteId}`,
}));

// 期限付きアンケート
if (props.poll.expiresAt) {
Expand All @@ -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;

Expand Down
10 changes: 6 additions & 4 deletions packages/frontend/src/components/MkSignin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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.2.0以降が浸透してきたら正式なURLに変更する▼
// 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) {
Expand All @@ -252,7 +254,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 {
Expand Down
27 changes: 26 additions & 1 deletion packages/frontend/src/scripts/please-login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
* 照会したいエンティティのURL
*
* (例: `https://misskey.example.com/notes/abcdexxxxyz`)
*/
url: string;
} | {
/**
* 外部のMisskeyでノートする
*/
type: 'share';

/**
* `/share` ページに渡すクエリストリング
*
* @see https://go.misskey-hub.net/spec/share/
*/
params: Record<string, string>;
};

Expand Down
4 changes: 2 additions & 2 deletions packages/frontend/src/scripts/url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ export function appendQuery(url: string, query: string): string {
}

export function extractDomain(url: string) {
const match = url.match(/^(https)?:?\/{0,2}([^\/]+)/);
return match ? match[2] : null;
const match = url.match(/^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?([^:\/\n]+)/im);
return match ? match[1] : null;
}
Loading