@@ -105,9 +108,14 @@ const $i = signinRequired();
const reportError = computed(defaultStore.makeGetterSetter('reportError'));
const enableCondensedLine = computed(defaultStore.makeGetterSetter('enableCondensedLine'));
+const skipNoteRender = computed(defaultStore.makeGetterSetter('skipNoteRender'));
const devMode = computed(defaultStore.makeGetterSetter('devMode'));
const defaultWithReplies = computed(defaultStore.makeGetterSetter('defaultWithReplies'));
+watch(skipNoteRender, async () => {
+ await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
+});
+
async function deleteAccount() {
{
const { canceled } = await os.confirm({
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index cb52938980..4f641e7513 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -468,6 +468,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: 'app' as 'app' | 'appWithShift' | 'native',
},
+ skipNoteRender: {
+ where: 'device',
+ default: false,
+ },
sound_masterVolume: {
where: 'device',
--
cgit v1.2.3-freya
From 8b7290d6b0aca61d8c57f294a40fd5bd3b19c235 Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Mon, 14 Oct 2024 11:23:26 +0900
Subject: enhance(backend):
個人宛のお知らせはわかったを押すとアーカイブするように (#14762)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* enhance(backend): 個人宛のお知らせはわかったを押すとアーカイブするように
* Update Changelog
* enhance(frontend): アーカイブ済みのものを読み込めるように
* Update Changelog
* fix changelog
* :art:
---
CHANGELOG.md | 2 ++
packages/backend/src/core/AnnouncementService.ts | 7 +++++++
packages/frontend/src/pages/admin-user.vue | 10 ++++++++++
3 files changed, 19 insertions(+)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 22b5506f28..9e42d0448e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,10 +9,12 @@
### Client
- Enhance: l10nの更新
+- Enhance: アーカイブした個人宛のお知らせを表示・編集できるように
- Fix: メールアドレス不要でCaptchaが有効な場合にアカウント登録完了後自動でのログインに失敗する問題を修正
### Server
- Feat: モデレータ権限を持つユーザが全員7日間活動しなかった場合は自動的に招待制へと移行するように ( #13437 )
+- Enhance: 個人宛のお知らせは「わかった」を押すと自動的にアーカイブされるように
- Fix: `admin/emoji/update`エンドポイントのidのみ指定した時不正なエラーが発生するバグを修正
- Fix: RBT有効時、リノートのリアクションが反映されない問題を修正
diff --git a/packages/backend/src/core/AnnouncementService.ts b/packages/backend/src/core/AnnouncementService.ts
index 40a9db01c0..d4fcf19439 100644
--- a/packages/backend/src/core/AnnouncementService.ts
+++ b/packages/backend/src/core/AnnouncementService.ts
@@ -209,6 +209,13 @@ export class AnnouncementService {
return;
}
+ const announcement = await this.announcementsRepository.findOneBy({ id: announcementId });
+ if (announcement != null && announcement.userId === user.id) {
+ await this.announcementsRepository.update(announcementId, {
+ isActive: false,
+ });
+ }
+
if ((await this.getUnreadAnnouncements(user)).length === 0) {
this.globalEventService.publishMainStream(user.id, 'readAllAnnouncements');
}
diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue
index d33b116059..948e7a3cce 100644
--- a/packages/frontend/src/pages/admin-user.vue
+++ b/packages/frontend/src/pages/admin-user.vue
@@ -153,6 +153,12 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
{{ $i.unreadNotificationsCount > 99 ? '99+' : $i.unreadNotificationsCount }}
@@ -97,6 +97,7 @@ import { v4 as uuid } from 'uuid';
import XCommon from './_common_/common.vue';
import { deckStore, columnTypes, addColumn as addColumnToStore, loadDeck, getProfiles, deleteProfile as deleteProfile_ } from './deck/deck-store.js';
import type { ColumnType } from './deck/deck-store.js';
+import type { MenuItem } from '@/types/menu.js';
import XSidebar from '@/ui/_common_/navbar.vue';
import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
import MkButton from '@/components/MkButton.vue';
@@ -118,7 +119,6 @@ import XMentionsColumn from '@/ui/deck/mentions-column.vue';
import XDirectColumn from '@/ui/deck/direct-column.vue';
import XRoleTimelineColumn from '@/ui/deck/role-timeline-column.vue';
import { mainRouter } from '@/router/main.js';
-import type { MenuItem } from '@/types/menu.js';
const XStatusBars = defineAsyncComponent(() => import('@/ui/_common_/statusbars.vue'));
const XAnnouncements = defineAsyncComponent(() => import('@/ui/_common_/announcements.vue'));
@@ -479,7 +479,6 @@ body {
left: 0;
color: var(--MI_THEME-indicator);
font-size: 16px;
- animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 9fc8bd102d..d739c2e1cd 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -25,11 +25,11 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
{{ $i.unreadNotificationsCount > 99 ? '99+' : $i.unreadNotificationsCount }}
@@ -96,9 +96,11 @@ SPDX-License-Identifier: AGPL-3.0-only
@@ -121,6 +110,7 @@ onMounted(() => {
top: var(--MI-stickyTop, 0px);
-webkit-backdrop-filter: var(--MI-blur, blur(8px));
backdrop-filter: var(--MI-blur, blur(20px));
+ background-color: color(from v-bind("parentBg ?? 'var(--bg)'") srgb r g b / 0.85);
}
.title {
diff --git a/packages/frontend/src/components/MkFolder.vue b/packages/frontend/src/components/MkFolder.vue
index 5f9500d923..7bdc06a8b4 100644
--- a/packages/frontend/src/components/MkFolder.vue
+++ b/packages/frontend/src/components/MkFolder.vue
@@ -56,8 +56,9 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/router/definition.ts b/packages/frontend/src/router/definition.ts
index 75f994b865..b5fd6b6ec3 100644
--- a/packages/frontend/src/router/definition.ts
+++ b/packages/frontend/src/router/definition.ts
@@ -217,7 +217,7 @@ const routes: RouteDef[] = [{
component: page(() => import('@/pages/theme-editor.vue')),
loginRequired: true,
}, {
- path: '/roles/:role',
+ path: '/roles/:roleId',
component: page(() => import('@/pages/role.vue')),
}, {
path: '/user-tags/:tag',
--
cgit v1.2.3-freya
From 1d106b3ae81b8fa28bf644622e617262a2889040 Mon Sep 17 00:00:00 2001
From: tetsuya-ki <64536338+tetsuya-ki@users.noreply.github.com>
Date: Sun, 20 Oct 2024 16:17:16 +0900
Subject: Enhance: ドライブでソートができるように (#14801)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Enhance: ドライブでソートができるように
* Update CHANGELOG.md
---
CHANGELOG.md | 1 +
packages/frontend/src/components/MkDrive.vue | 25 ++++++++++++++++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c3a5e41787..3a23938c38 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@
### Client
- Enhance: Bull DashboardでRelationship Queueの状態も確認できるように
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/751)
+- Enhance: ドライブでソートができるように
### Server
-
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index 23883a44e9..05f3354813 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -30,6 +30,16 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ folder.name }}
+
+
+ {{ i18n.ts.registeredDate }} ({{ i18n.ts.descendingOrder }})
+ {{ i18n.ts.registeredDate }} ({{ i18n.ts.ascendingOrder }})
+ {{ i18n.ts.size }} ({{ i18n.ts.descendingOrder }})
+ {{ i18n.ts.size }} ({{ i18n.ts.ascendingOrder }})
+ {{ i18n.ts.name }} ({{ i18n.ts.descendingOrder }})
+ {{ i18n.ts.name }} ({{ i18n.ts.ascendingOrder }})
+
+
entries.some((entry) => entry.isIntersecting) && !fetching.value && moreFiles.value && fetchMoreFiles(),
);
+const sortModeSelect = ref('+createdAt');
+
watch(folder, () => emit('cd', folder.value));
+watch(sortModeSelect, () => {
+ fetch();
+});
function onStreamDriveFileCreated(file: Misskey.entities.DriveFile) {
addFile(file, true);
@@ -558,6 +574,7 @@ async function fetch() {
folderId: folder.value ? folder.value.id : null,
type: props.type,
limit: filesMax + 1,
+ sort: sortModeSelect.value,
}).then(fetchedFiles => {
if (fetchedFiles.length === filesMax + 1) {
moreFiles.value = true;
@@ -607,6 +624,7 @@ function fetchMoreFiles() {
type: props.type,
untilId: files.value.at(-1)?.id,
limit: max + 1,
+ sort: sortModeSelect.value,
}).then(files => {
if (files.length === max + 1) {
moreFiles.value = true;
@@ -760,11 +778,16 @@ onBeforeUnmount(() => {
}
}
-.navMenu {
+.navSort {
+ display: inline-block;
margin-left: auto;
padding: 0 12px;
}
+.navMenu {
+ padding: 0 12px;
+}
+
.main {
flex: 1;
overflow: auto;
--
cgit v1.2.3-freya
From 041c9caf317f35211bd43dc39664ed033a34c1f2 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Sun, 20 Oct 2024 16:38:27 +0900
Subject: :art:
---
packages/frontend/src/components/MkDrive.vue | 55 +++++++++++++++++++---------
1 file changed, 38 insertions(+), 17 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index 05f3354813..910b73c798 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -30,16 +30,6 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ folder.name }}
-
-
- {{ i18n.ts.registeredDate }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.registeredDate }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.size }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.size }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.name }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.name }} ({{ i18n.ts.ascendingOrder }})
-
-
{ sortModeSelect.value = '+createdAt'; },
+ active: sortModeSelect.value === '+createdAt',
+ }, {
+ text: `${i18n.ts.registeredDate} (${i18n.ts.ascendingOrder})`,
+ icon: 'ti ti-sort-ascending-letters',
+ action: () => { sortModeSelect.value = '-createdAt'; },
+ active: sortModeSelect.value === '-createdAt',
+ }, {
+ text: `${i18n.ts.size} (${i18n.ts.descendingOrder})`,
+ icon: 'ti ti-sort-descending-letters',
+ action: () => { sortModeSelect.value = '+size'; },
+ active: sortModeSelect.value === '+size',
+ }, {
+ text: `${i18n.ts.size} (${i18n.ts.ascendingOrder})`,
+ icon: 'ti ti-sort-ascending-letters',
+ action: () => { sortModeSelect.value = '-size'; },
+ active: sortModeSelect.value === '-size',
+ }, {
+ text: `${i18n.ts.name} (${i18n.ts.descendingOrder})`,
+ icon: 'ti ti-sort-descending-letters',
+ action: () => { sortModeSelect.value = '+name'; },
+ active: sortModeSelect.value === '+name',
+ }, {
+ text: `${i18n.ts.name} (${i18n.ts.ascendingOrder})`,
+ icon: 'ti ti-sort-ascending-letters',
+ action: () => { sortModeSelect.value = '-name'; },
+ active: sortModeSelect.value === '-name',
+ }],
+ });
+
if (folder.value) {
menu.push({
text: i18n.ts.renameFolder,
@@ -778,13 +804,8 @@ onBeforeUnmount(() => {
}
}
-.navSort {
- display: inline-block;
- margin-left: auto;
- padding: 0 12px;
-}
-
.navMenu {
+ margin-left: auto;
padding: 0 12px;
}
--
cgit v1.2.3-freya
From d6caa4d9c4453cf38129197dd4a237711f0085ec Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sun, 20 Oct 2024 17:29:41 +0900
Subject: fix(frontend):
通知の範囲指定が必要ない通知設定でも範囲指定がでている問題を修正 (#14798)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(frontend): 通知の範囲指定が必要ない通知設定でも範囲指定がでている問題を修正
* Update Changelog
---------
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
---
CHANGELOG.md | 1 +
locales/index.d.ts | 6 +--
locales/ja-JP.yml | 6 +--
.../settings/notifications.notification-config.vue | 50 ++++++++++++++++------
.../frontend/src/pages/settings/notifications.vue | 15 +++++--
5 files changed, 55 insertions(+), 23 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3a23938c38..04ae102227 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
- Enhance: Bull DashboardでRelationship Queueの状態も確認できるように
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/751)
- Enhance: ドライブでソートができるように
+- Fix: 通知の範囲指定の設定項目が必要ない通知設定でも範囲指定の設定がでている問題を修正
### Server
-
diff --git a/locales/index.d.ts b/locales/index.d.ts
index b5af5909a3..fb010d9353 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -9271,7 +9271,7 @@ export interface Locale extends ILocale {
*/
"youGotQuote": ParameterizedString<"name">;
/**
- * {name}がRenoteしました
+ * {name}がリノートしました
*/
"youRenoted": ParameterizedString<"name">;
/**
@@ -9376,7 +9376,7 @@ export interface Locale extends ILocale {
*/
"reply": string;
/**
- * Renote
+ * リノート
*/
"renote": string;
/**
@@ -9434,7 +9434,7 @@ export interface Locale extends ILocale {
*/
"reply": string;
/**
- * Renote
+ * リノート
*/
"renote": string;
};
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index c448d4d50a..c241a9e560 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -2448,7 +2448,7 @@ _notification:
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用"
- youRenoted: "{name}がRenoteしました"
+ youRenoted: "{name}がリノートしました"
youWereFollowed: "フォローされました"
youReceivedFollowRequest: "フォローリクエストが来ました"
yourFollowRequestAccepted: "フォローリクエストが承認されました"
@@ -2476,7 +2476,7 @@ _notification:
follow: "フォロー"
mention: "メンション"
reply: "リプライ"
- renote: "Renote"
+ renote: "リノート"
quote: "引用"
reaction: "リアクション"
pollEnded: "アンケートが終了"
@@ -2492,7 +2492,7 @@ _notification:
_actions:
followBack: "フォローバック"
reply: "返信"
- renote: "Renote"
+ renote: "リノート"
_deck:
alwaysShowMainColumn: "常にメインカラムを表示"
diff --git a/packages/frontend/src/pages/settings/notifications.notification-config.vue b/packages/frontend/src/pages/settings/notifications.notification-config.vue
index a36f036303..0ea415f673 100644
--- a/packages/frontend/src/pages/settings/notifications.notification-config.vue
+++ b/packages/frontend/src/pages/settings/notifications.notification-config.vue
@@ -6,13 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts.all }}
- {{ i18n.ts.following }}
- {{ i18n.ts.followers }}
- {{ i18n.ts.mutualFollow }}
- {{ i18n.ts.followingOrFollower }}
- {{ i18n.ts.userList }}
- {{ i18n.ts.none }}
+ {{ notificationConfigTypesI18nMap[type] }}
@@ -21,31 +15,61 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts.save }}
+ {{ i18n.ts.save }}
+
+
diff --git a/packages/frontend/src/pages/settings/notifications.vue b/packages/frontend/src/pages/settings/notifications.vue
index 53b3bd4936..8ffe0d6a7a 100644
--- a/packages/frontend/src/pages/settings/notifications.vue
+++ b/packages/frontend/src/pages/settings/notifications.vue
@@ -22,7 +22,12 @@ SPDX-License-Identifier: AGPL-3.0-only
}}
-
updateReceiveConfig(type, res)"/>
+ updateReceiveConfig(type, res)"
+ />
@@ -58,7 +63,7 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
diff --git a/packages/frontend/src/components/MkModalWindow.vue b/packages/frontend/src/components/MkModalWindow.vue
index fe9e1ce088..f06cfffee4 100644
--- a/packages/frontend/src/components/MkModalWindow.vue
+++ b/packages/frontend/src/components/MkModalWindow.vue
@@ -26,11 +26,11 @@ import { onMounted, onUnmounted, shallowRef, ref } from 'vue';
import MkModal from './MkModal.vue';
const props = withDefaults(defineProps<{
- withOkButton: boolean;
- withCloseButton: boolean;
- okButtonDisabled: boolean;
- width: number;
- height: number;
+ withOkButton?: boolean;
+ withCloseButton?: boolean;
+ okButtonDisabled?: boolean;
+ width?: number;
+ height?: number;
}>(), {
withOkButton: false,
withCloseButton: true,
diff --git a/packages/frontend/src/components/MkSignupDialog.vue b/packages/frontend/src/components/MkSignupDialog.vue
index f240e6dc46..4f75a36fbe 100644
--- a/packages/frontend/src/components/MkSignupDialog.vue
+++ b/packages/frontend/src/components/MkSignupDialog.vue
@@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
ref="dialog"
:width="500"
:height="600"
- @close="dialog?.close()"
+ @close="onClose"
@closed="$emit('closed')"
>
{{ i18n.ts.signup }}
@@ -22,7 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:leaveToClass="$style.transition_x_leaveTo"
>
-
+
@@ -48,6 +48,7 @@ const props = withDefaults(defineProps<{
const emit = defineEmits<{
(ev: 'done', res: Misskey.entities.SignupResponse): void;
+ (ev: 'cancelled'): void;
(ev: 'closed'): void;
}>();
@@ -55,6 +56,11 @@ const dialog = shallowRef>();
const isAcceptedServerRule = ref(false);
+function onClose() {
+ emit('cancelled');
+ dialog.value?.close();
+}
+
function onSignup(res: Misskey.entities.SignupResponse) {
emit('done', res);
dialog.value?.close();
diff --git a/packages/frontend/src/pages/miauth.vue b/packages/frontend/src/pages/miauth.vue
index ffaf739ed0..283f66ac45 100644
--- a/packages/frontend/src/pages/miauth.vue
+++ b/packages/frontend/src/pages/miauth.vue
@@ -4,95 +4,79 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
-
-
-
-
-
-
-
-
-
{{ i18n.ts._auth.denied }}
-
-
-
{{ i18n.ts._auth.callback }}
-
{{ i18n.ts._auth.pleaseGoBack }}
-
-
-
-
{{ i18n.tsx._auth.permission({ name }) }}
-
{{ i18n.ts._auth.permissionAsk }}
-
- {{ i18n.ts._permissions[p] }}
-
-
-
{{ i18n.tsx._auth.shareAccess({ name }) }}
-
{{ i18n.ts._auth.shareAccessAsk }}
-
- {{ i18n.ts.cancel }}
- {{ i18n.ts.accept }}
-
-
+
+
+
+
+
+
+
+
{{ i18n.ts._auth.byClickingYouWillBeRedirectedToThisUrl }}
+
{{ callback }}
+
+
+
-
-
{{ i18n.ts._auth.pleaseLogin }}
-
-
-
-
+
+
diff --git a/packages/frontend/src/pages/oauth.vue b/packages/frontend/src/pages/oauth.vue
index 733e34eb2c..8719a769e5 100644
--- a/packages/frontend/src/pages/oauth.vue
+++ b/packages/frontend/src/pages/oauth.vue
@@ -4,40 +4,28 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
-
-
-
-
-
-
{{ i18n.tsx._auth.permission({ name }) }}
-
{{ i18n.ts._auth.permissionAsk }}
-
- {{ i18n.ts._permissions[p] }}
-
-
-
{{ i18n.tsx._auth.shareAccess({ name }) }}
-
{{ i18n.ts._auth.shareAccessAsk }}
-
+
+
+
+
+
-
-
{{ i18n.ts._auth.pleaseLogin }}
-
-
-
-
+
+
diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue
index 1bbedb817e..16f0716a12 100644
--- a/packages/frontend/src/pages/settings/accounts.vue
+++ b/packages/frontend/src/pages/settings/accounts.vue
@@ -19,13 +19,13 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/components/MkAuthConfirm.vue b/packages/frontend/src/components/MkAuthConfirm.vue
index f5f6d7f6cc..f78d2d38f0 100644
--- a/packages/frontend/src/components/MkAuthConfirm.vue
+++ b/packages/frontend/src/components/MkAuthConfirm.vue
@@ -21,7 +21,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.pleaseSelectAccount }}
-
+
{{ i18n.ts.selectAccount }}
@@ -63,7 +63,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
{{ i18n.ts._auth.scopeUser }} {{ i18n.ts.switchAccount }}
diff --git a/packages/frontend/src/components/MkSignin.password.vue b/packages/frontend/src/components/MkSignin.password.vue
index 5608122a39..cd003a39df 100644
--- a/packages/frontend/src/components/MkSignin.password.vue
+++ b/packages/frontend/src/components/MkSignin.password.vue
@@ -24,11 +24,11 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
-
-
+
+
+
+
+
{{ i18n.ts.continue }}
diff --git a/packages/frontend/src/components/global/MkAd.vue b/packages/frontend/src/components/global/MkAd.vue
index 0d68d02e35..08a78c8d81 100644
--- a/packages/frontend/src/components/global/MkAd.vue
+++ b/packages/frontend/src/components/global/MkAd.vue
@@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
-
+
-.root {
-
-}
-
.main {
text-align: center;
--
cgit v1.2.3-freya
From 74847bce303449124282a748fc50b1c6588288fc Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Mon, 28 Oct 2024 20:42:14 +0900
Subject: enhance: アイコンデコレーション管理画面の改善
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 1 +
locales/index.d.ts | 4 +
locales/ja-JP.yml | 1 +
.../endpoints/admin/avatar-decorations/create.ts | 57 +++++-
.../api/endpoints/admin/avatar-decorations/list.ts | 3 -
.../src/pages/avatar-decoration-edit-dialog.vue | 220 +++++++++++++++++++++
packages/frontend/src/pages/avatar-decorations.vue | 172 ++++++----------
.../settings/avatar-decoration.decoration.vue | 7 +-
.../pages/settings/avatar-decoration.dialog.vue | 4 +-
packages/misskey-js/etc/misskey-js.api.md | 4 +
packages/misskey-js/src/autogen/endpoint.ts | 3 +-
packages/misskey-js/src/autogen/entities.ts | 1 +
packages/misskey-js/src/autogen/types.ts | 19 +-
13 files changed, 374 insertions(+), 122 deletions(-)
create mode 100644 packages/frontend/src/pages/avatar-decoration-edit-dialog.vue
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cbd48b8b6c..52077f813f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@
- Enhance: Bull DashboardでRelationship Queueの状態も確認できるように
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/751)
- Enhance: ドライブでソートができるように
+- Enhance: アイコンデコレーション管理画面の改善
- Enhance: 「単なるラッキー」の取得条件を変更
- Enhance: 投稿フォームでEscキーを押したときIME入力中ならフォームを閉じないように( #10866 )
- Enhance: MiAuth, OAuthの認可画面の改善
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 9058c70496..440f24ac84 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -5214,6 +5214,10 @@ export interface Locale extends ILocale {
* アカウントを選択してください
*/
"pleaseSelectAccount": string;
+ /**
+ * 利用可能なロール
+ */
+ "availableRoles": string;
"_accountSettings": {
/**
* コンテンツの表示にログインを必須にする
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 1d426f1705..5d8e1a5e72 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1299,6 +1299,7 @@ yourNameContainsProhibitedWordsDescription: "名前に禁止されている文
thisContentsAreMarkedAsSigninRequiredByAuthor: "投稿者により、表示にはログインが必要と設定されています"
lockdown: "ロックダウン"
pleaseSelectAccount: "アカウントを選択してください"
+availableRoles: "利用可能なロール"
_accountSettings:
requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
diff --git a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts
index fd21309818..87d80cbe80 100644
--- a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts
@@ -6,6 +6,7 @@
import { Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { AvatarDecorationService } from '@/core/AvatarDecorationService.js';
+import { IdService } from '@/core/IdService.js';
export const meta = {
tags: ['admin'],
@@ -13,6 +14,49 @@ export const meta = {
requireCredential: true,
requireRolePolicy: 'canManageAvatarDecorations',
kind: 'write:admin:avatar-decorations',
+
+ res: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ updatedAt: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ description: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ url: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ roleIdsThatCanBeUsedThisDecoration: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ },
+ },
} as const;
export const paramDef = {
@@ -32,14 +76,25 @@ export const paramDef = {
export default class extends Endpoint
{ // eslint-disable-line import/no-default-export
constructor(
private avatarDecorationService: AvatarDecorationService,
+ private idService: IdService,
) {
super(meta, paramDef, async (ps, me) => {
- await this.avatarDecorationService.create({
+ const created = await this.avatarDecorationService.create({
name: ps.name,
description: ps.description,
url: ps.url,
roleIdsThatCanBeUsedThisDecoration: ps.roleIdsThatCanBeUsedThisDecoration,
}, me);
+
+ return {
+ id: created.id,
+ createdAt: this.idService.parse(created.id).date.toISOString(),
+ updatedAt: null,
+ name: created.name,
+ description: created.description,
+ url: created.url,
+ roleIdsThatCanBeUsedThisDecoration: created.roleIdsThatCanBeUsedThisDecoration,
+ };
});
}
}
diff --git a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/list.ts b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/list.ts
index aee90023e1..d785f085ac 100644
--- a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/list.ts
@@ -4,10 +4,7 @@
*/
import { Inject, Injectable } from '@nestjs/common';
-import type { AnnouncementsRepository, AnnouncementReadsRepository } from '@/models/_.js';
-import type { MiAnnouncement } from '@/models/Announcement.js';
import { Endpoint } from '@/server/api/endpoint-base.js';
-import { QueryService } from '@/core/QueryService.js';
import { DI } from '@/di-symbols.js';
import { IdService } from '@/core/IdService.js';
import { AvatarDecorationService } from '@/core/AvatarDecorationService.js';
diff --git a/packages/frontend/src/pages/avatar-decoration-edit-dialog.vue b/packages/frontend/src/pages/avatar-decoration-edit-dialog.vue
new file mode 100644
index 0000000000..a834f1c5fd
--- /dev/null
+++ b/packages/frontend/src/pages/avatar-decoration-edit-dialog.vue
@@ -0,0 +1,220 @@
+
+
+
+
+ {{ avatarDecoration.name }}
+ New decoration
+
+
+
+
+
+
+ {{ i18n.ts.name }}
+
+
+ {{ i18n.ts.imageUrl }}
+
+
+ {{ i18n.ts.description }}
+
+
+ {{ i18n.ts.availableRoles }}
+ {{ rolesThatCanBeUsedThisDecoration.length === 0 ? i18n.ts.all : rolesThatCanBeUsedThisDecoration.length }}
+
+
+
{{ i18n.ts.add }}
+
+
+
+
+
+
+
+
+
{{ i18n.ts.delete }}
+
+
+
+ {{ props.avatarDecoration ? i18n.ts.update : i18n.ts.create }}
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/avatar-decorations.vue b/packages/frontend/src/pages/avatar-decorations.vue
index b97e7c0eea..a5cafb1678 100644
--- a/packages/frontend/src/pages/avatar-decorations.vue
+++ b/packages/frontend/src/pages/avatar-decorations.vue
@@ -5,92 +5,38 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
- {{ avatarDecoration.name }}
- {{ avatarDecoration.description }}
-
-
-
-
-
-
- {{ i18n.ts.name }}
-
-
- {{ i18n.ts.description }}
-
-
- {{ i18n.ts.imageUrl }}
-
-
- {{ i18n.ts.save }}
- {{ i18n.ts.delete }}
-
-
-
+
+
+
{{ avatarDecoration.name }}
+
-
+
diff --git a/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue b/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue
index f72a0b9383..3c9914b4e2 100644
--- a/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue
+++ b/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue
@@ -10,12 +10,12 @@ SPDX-License-Identifier: AGPL-3.0-only
>
{{ decoration.name }}
-
+
diff --git a/packages/frontend/src/pages/settings/avatar-decoration.dialog.vue b/packages/frontend/src/pages/settings/avatar-decoration.dialog.vue
index 853e536ea3..aa899ac649 100644
--- a/packages/frontend/src/pages/settings/avatar-decoration.dialog.vue
+++ b/packages/frontend/src/pages/settings/avatar-decoration.dialog.vue
@@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.update }}
{{ i18n.ts.detach }}
- {{ i18n.ts.attach }}
+ {{ i18n.ts.attach }}
@@ -61,6 +61,7 @@ const props = defineProps<{
id: string;
url: string;
name: string;
+ roleIdsThatCanBeUsedThisDecoration: string[];
};
}>();
@@ -83,6 +84,7 @@ const emit = defineEmits<{
const dialog = shallowRef
>();
const exceeded = computed(() => ($i.policies.avatarDecorationLimit - $i.avatarDecorations.length) <= 0);
+const locked = computed(() => props.decoration.roleIdsThatCanBeUsedThisDecoration.length > 0 && !$i.roles.some(r => props.decoration.roleIdsThatCanBeUsedThisDecoration.includes(r.id)));
const angle = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].angle : null) ?? 0);
const flipH = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].flipH : null) ?? false);
const offsetX = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].offsetX : null) ?? 0);
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index 61de8b8c7e..061b533b72 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -121,6 +121,9 @@ type AdminAnnouncementsUpdateRequest = operations['admin___announcements___updat
// @public (undocumented)
type AdminAvatarDecorationsCreateRequest = operations['admin___avatar-decorations___create']['requestBody']['content']['application/json'];
+// @public (undocumented)
+type AdminAvatarDecorationsCreateResponse = operations['admin___avatar-decorations___create']['responses']['200']['content']['application/json'];
+
// @public (undocumented)
type AdminAvatarDecorationsDeleteRequest = operations['admin___avatar-decorations___delete']['requestBody']['content']['application/json'];
@@ -1253,6 +1256,7 @@ declare namespace entities {
AdminAnnouncementsListResponse,
AdminAnnouncementsUpdateRequest,
AdminAvatarDecorationsCreateRequest,
+ AdminAvatarDecorationsCreateResponse,
AdminAvatarDecorationsDeleteRequest,
AdminAvatarDecorationsListRequest,
AdminAvatarDecorationsListResponse,
diff --git a/packages/misskey-js/src/autogen/endpoint.ts b/packages/misskey-js/src/autogen/endpoint.ts
index d0367d8496..5e6bc0a99c 100644
--- a/packages/misskey-js/src/autogen/endpoint.ts
+++ b/packages/misskey-js/src/autogen/endpoint.ts
@@ -31,6 +31,7 @@ import type {
AdminAnnouncementsListResponse,
AdminAnnouncementsUpdateRequest,
AdminAvatarDecorationsCreateRequest,
+ AdminAvatarDecorationsCreateResponse,
AdminAvatarDecorationsDeleteRequest,
AdminAvatarDecorationsListRequest,
AdminAvatarDecorationsListResponse,
@@ -597,7 +598,7 @@ export type Endpoints = {
'admin/announcements/delete': { req: AdminAnnouncementsDeleteRequest; res: EmptyResponse };
'admin/announcements/list': { req: AdminAnnouncementsListRequest; res: AdminAnnouncementsListResponse };
'admin/announcements/update': { req: AdminAnnouncementsUpdateRequest; res: EmptyResponse };
- 'admin/avatar-decorations/create': { req: AdminAvatarDecorationsCreateRequest; res: EmptyResponse };
+ 'admin/avatar-decorations/create': { req: AdminAvatarDecorationsCreateRequest; res: AdminAvatarDecorationsCreateResponse };
'admin/avatar-decorations/delete': { req: AdminAvatarDecorationsDeleteRequest; res: EmptyResponse };
'admin/avatar-decorations/list': { req: AdminAvatarDecorationsListRequest; res: AdminAvatarDecorationsListResponse };
'admin/avatar-decorations/update': { req: AdminAvatarDecorationsUpdateRequest; res: EmptyResponse };
diff --git a/packages/misskey-js/src/autogen/entities.ts b/packages/misskey-js/src/autogen/entities.ts
index ced87c4c7e..f3ddf64481 100644
--- a/packages/misskey-js/src/autogen/entities.ts
+++ b/packages/misskey-js/src/autogen/entities.ts
@@ -34,6 +34,7 @@ export type AdminAnnouncementsListRequest = operations['admin___announcements___
export type AdminAnnouncementsListResponse = operations['admin___announcements___list']['responses']['200']['content']['application/json'];
export type AdminAnnouncementsUpdateRequest = operations['admin___announcements___update']['requestBody']['content']['application/json'];
export type AdminAvatarDecorationsCreateRequest = operations['admin___avatar-decorations___create']['requestBody']['content']['application/json'];
+export type AdminAvatarDecorationsCreateResponse = operations['admin___avatar-decorations___create']['responses']['200']['content']['application/json'];
export type AdminAvatarDecorationsDeleteRequest = operations['admin___avatar-decorations___delete']['requestBody']['content']['application/json'];
export type AdminAvatarDecorationsListRequest = operations['admin___avatar-decorations___list']['requestBody']['content']['application/json'];
export type AdminAvatarDecorationsListResponse = operations['admin___avatar-decorations___list']['responses']['200']['content']['application/json'];
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index 560960f018..a5333d4f93 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -6324,9 +6324,22 @@ export type operations = {
};
};
responses: {
- /** @description OK (without any results) */
- 204: {
- content: never;
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': {
+ /** Format: id */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string | null;
+ name: string;
+ description: string;
+ url: string;
+ roleIdsThatCanBeUsedThisDecoration: string[];
+ };
+ };
};
/** @description Client error */
400: {
--
cgit v1.2.3-freya
From 0472d43ee97f1ac0fd13969b2111d67b322a947f Mon Sep 17 00:00:00 2001
From: Pinapelz
Date: Mon, 28 Oct 2024 05:04:46 -0700
Subject: fix: encode RSS uris with escape sequences before fetching (#14826)
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
---
CHANGELOG.md | 1 +
packages/frontend/src/ui/_common_/statusbar-rss.vue | 2 +-
packages/frontend/src/widgets/WidgetRss.vue | 2 +-
packages/frontend/src/widgets/WidgetRssTicker.vue | 2 +-
4 files changed, 4 insertions(+), 3 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 52077f813f..0b2cb43e25 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,7 @@
- Fix: Turnstileが失敗・期限切れした際にも成功扱いとなってしまう問題を修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/768)
- Fix: デッキのタイムラインカラムで「センシティブなファイルを含むノートを表示」設定が使用できなかった問題を修正
+- Fix: Encode RSS urls with escape sequences before fetching allowing query parameters to be used
- Fix: リンク切れを修正
### Server
diff --git a/packages/frontend/src/ui/_common_/statusbar-rss.vue b/packages/frontend/src/ui/_common_/statusbar-rss.vue
index 550fc39b00..da8fa8bb21 100644
--- a/packages/frontend/src/ui/_common_/statusbar-rss.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-rss.vue
@@ -48,7 +48,7 @@ const fetching = ref(true);
const key = ref(0);
const tick = () => {
- window.fetch(`/api/fetch-rss?url=${props.url}`, {}).then(res => {
+ window.fetch(`/api/fetch-rss?url=${encodeURIComponent(props.url)}`, {}).then(res => {
res.json().then((feed: Misskey.entities.FetchRssResponse) => {
if (props.shuffle) {
shuffle(feed.items);
diff --git a/packages/frontend/src/widgets/WidgetRss.vue b/packages/frontend/src/widgets/WidgetRss.vue
index 3e43687709..92dc6d148e 100644
--- a/packages/frontend/src/widgets/WidgetRss.vue
+++ b/packages/frontend/src/widgets/WidgetRss.vue
@@ -70,7 +70,7 @@ const items = computed(() => rawItems.value.slice(0, widgetProps.maxEntries));
const fetching = ref(true);
const fetchEndpoint = computed(() => {
const url = new URL('/api/fetch-rss', base);
- url.searchParams.set('url', widgetProps.url);
+ url.searchParams.set('url', encodeURIComponent(widgetProps.url));
return url;
});
const intervalClear = ref<(() => void) | undefined>();
diff --git a/packages/frontend/src/widgets/WidgetRssTicker.vue b/packages/frontend/src/widgets/WidgetRssTicker.vue
index 4f594b720f..6957878572 100644
--- a/packages/frontend/src/widgets/WidgetRssTicker.vue
+++ b/packages/frontend/src/widgets/WidgetRssTicker.vue
@@ -99,7 +99,7 @@ const items = computed(() => {
const fetching = ref(true);
const fetchEndpoint = computed(() => {
const url = new URL('/api/fetch-rss', base);
- url.searchParams.set('url', widgetProps.url);
+ url.searchParams.set('url', encodeURIComponent(widgetProps.url));
return url;
});
const intervalClear = ref<(() => void) | undefined>();
--
cgit v1.2.3-freya
From 7fc8a2a7b04d8550abdf55259bde4c857bd462a1 Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Wed, 30 Oct 2024 09:57:54 +0900
Subject: fix(frontend):
一部のノート表示で設定にかかわらずセンシティブなファイルを含むノートが最小化される問題を修正
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fix https://github.com/misskey-dev/misskey/pull/14772#discussion_r1821707117
---
packages/frontend/src/components/MkNote.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index be1339ecc4..3de69d6d09 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -227,7 +227,7 @@ const emit = defineEmits<{
}>();
const inTimeline = inject('inTimeline', false);
-const tl_withSensitive = inject[>('tl_withSensitive', ref(false));
+const tl_withSensitive = inject][>('tl_withSensitive', ref(true));
const inChannel = inject('inChannel', null);
const currentClip = inject][ | null>('currentClip', null);
--
cgit v1.2.3-freya
From 17d9aca5a7ec6149a8dbf0c1607c81ab188e7015 Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Thu, 31 Oct 2024 13:46:42 +0900
Subject: refactor(frontend): asとanyをすぐなおせる範囲で除去 (#14848)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* refactor(frontend): できるだけanyを除去
* refactor
* lint
* fix
* remove unused
* Update packages/frontend/src/components/MkReactionsViewer.details.vue
* Update packages/frontend/src/components/MkUsersTooltip.vue
---------
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
---
.../frontend/src/components/MkAntennaEditor.vue | 2 +-
.../frontend/src/components/MkChannelPreview.vue | 3 +-
packages/frontend/src/components/MkDialog.vue | 4 +--
packages/frontend/src/components/MkDrive.vue | 8 +++---
.../src/components/MkEmojiPicker.section.vue | 2 +-
packages/frontend/src/components/MkEmojiPicker.vue | 4 +--
.../src/components/MkExtensionInstaller.vue | 2 +-
packages/frontend/src/components/MkInput.vue | 8 +++---
.../src/components/MkNotificationSelectWindow.vue | 2 +-
.../frontend/src/components/MkObjectView.value.vue | 10 +++----
packages/frontend/src/components/MkPageWindow.vue | 2 +-
packages/frontend/src/components/MkPopupMenu.vue | 2 +-
packages/frontend/src/components/MkPostForm.vue | 20 +++----------
.../frontend/src/components/MkPostFormAttaches.vue | 8 +++---
.../frontend/src/components/MkPostFormDialog.vue | 16 ++---------
packages/frontend/src/components/MkRadio.vue | 8 +++---
.../src/components/MkReactionsViewer.details.vue | 3 +-
packages/frontend/src/components/MkSuperMenu.vue | 33 ++++++++++++++++++++--
packages/frontend/src/components/MkUrlPreview.vue | 10 ++++---
.../components/MkUserAnnouncementEditDialog.vue | 8 ++++--
.../frontend/src/components/MkUsersTooltip.vue | 4 +--
packages/frontend/src/components/MkWindow.vue | 11 ++++++--
packages/frontend/src/components/form/suspense.vue | 6 ++--
packages/frontend/src/components/global/MkMfm.ts | 4 +--
packages/frontend/src/nirax.ts | 12 ++++----
packages/frontend/src/os.ts | 23 +++++++--------
packages/frontend/src/pages/admin/users.vue | 6 ++--
.../frontend/src/pages/custom-emojis-manager.vue | 26 ++++++++---------
packages/frontend/src/pages/emoji-edit-dialog.vue | 19 +++++++------
packages/frontend/src/pages/follow-requests.vue | 4 +--
packages/frontend/src/pages/lookup.vue | 2 +-
packages/frontend/src/pages/my-clips/index.vue | 6 ++--
packages/frontend/src/pages/my-lists/list.vue | 4 +--
.../pages/page-editor/els/page-editor.el.image.vue | 5 ++--
.../pages/page-editor/els/page-editor.el.note.vue | 13 ++++++---
.../page-editor/els/page-editor.el.section.vue | 12 ++++----
.../pages/page-editor/els/page-editor.el.text.vue | 5 ++--
packages/frontend/src/pages/registry.keys.vue | 2 +-
.../frontend/src/pages/reversi/game.setting.vue | 6 ++--
packages/frontend/src/pages/scratchpad.vue | 6 +++-
.../frontend/src/pages/settings/2fa.qrdialog.vue | 7 +++--
packages/frontend/src/pages/settings/accounts.vue | 2 +-
packages/frontend/src/pages/settings/apps.vue | 3 +-
.../pages/settings/avatar-decoration.dialog.vue | 8 +++---
packages/frontend/src/pages/user/home.vue | 2 +-
packages/frontend/src/router/definition.ts | 2 +-
packages/frontend/src/router/main.ts | 8 +++---
packages/frontend/src/scripts/check-word-mute.ts | 3 +-
packages/frontend/src/scripts/form.ts | 16 +++++------
packages/frontend/src/scripts/misskey-api.ts | 6 ++--
packages/frontend/src/scripts/select-file.ts | 6 ++--
packages/frontend/src/scripts/shuffle.ts | 5 ++--
packages/frontend/src/scripts/upload.ts | 8 +++---
packages/frontend/src/store.ts | 9 +++---
packages/frontend/src/types/post-form.ts | 22 +++++++++++++++
packages/frontend/src/widgets/WidgetPhotos.vue | 4 +--
56 files changed, 250 insertions(+), 192 deletions(-)
create mode 100644 packages/frontend/src/types/post-form.ts
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/components/MkAntennaEditor.vue b/packages/frontend/src/components/MkAntennaEditor.vue
index 2386ba6fa7..e622d57f1e 100644
--- a/packages/frontend/src/components/MkAntennaEditor.vue
+++ b/packages/frontend/src/components/MkAntennaEditor.vue
@@ -160,7 +160,7 @@ async function deleteAntenna() {
function addUser() {
os.selectUser({ includeSelf: true }).then(user => {
users.value = users.value.trim();
- users.value += '\n@' + Misskey.acct.toString(user as any);
+ users.value += '\n@' + Misskey.acct.toString(user);
users.value = users.value.trim();
});
}
diff --git a/packages/frontend/src/components/MkChannelPreview.vue b/packages/frontend/src/components/MkChannelPreview.vue
index 99580df5e2..c470042b79 100644
--- a/packages/frontend/src/components/MkChannelPreview.vue
+++ b/packages/frontend/src/components/MkChannelPreview.vue
@@ -47,11 +47,12 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue
index 219950f135..8187d991e7 100644
--- a/packages/frontend/src/components/MkEmojiPicker.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.vue
@@ -409,7 +409,7 @@ function computeButtonTitle(ev: MouseEvent): void {
elm.title = getEmojiName(emoji);
}
-function chosen(emoji: any, ev?: MouseEvent) {
+function chosen(emoji: string | Misskey.entities.EmojiSimple | UnicodeEmojiDef, ev?: MouseEvent) {
const el = ev && (ev.currentTarget ?? ev.target) as HTMLElement | null | undefined;
if (el) {
const rect = el.getBoundingClientRect();
@@ -426,7 +426,7 @@ function chosen(emoji: any, ev?: MouseEvent) {
// 最近使った絵文字更新
if (!pinned.value?.includes(key)) {
let recents = defaultStore.state.recentlyUsedEmojis;
- recents = recents.filter((emoji: any) => emoji !== key);
+ recents = recents.filter((emoji) => emoji !== key);
recents.unshift(key);
defaultStore.set('recentlyUsedEmojis', recents.splice(0, 32));
}
diff --git a/packages/frontend/src/components/MkExtensionInstaller.vue b/packages/frontend/src/components/MkExtensionInstaller.vue
index b41604b2c3..d59b20435e 100644
--- a/packages/frontend/src/components/MkExtensionInstaller.vue
+++ b/packages/frontend/src/components/MkExtensionInstaller.vue
@@ -73,7 +73,7 @@ export type Extension = {
author: string;
description?: string;
permissions?: string[];
- config?: Record];
+ config?: Record;
};
} | {
type: 'theme';
diff --git a/packages/frontend/src/components/MkInput.vue b/packages/frontend/src/components/MkInput.vue
index e01ff86c5a..08817fd6a8 100644
--- a/packages/frontend/src/components/MkInput.vue
+++ b/packages/frontend/src/components/MkInput.vue
@@ -44,7 +44,7 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/components/MkPageWindow.vue b/packages/frontend/src/components/MkPageWindow.vue
index 4777da2848..02c84df447 100644
--- a/packages/frontend/src/components/MkPageWindow.vue
+++ b/packages/frontend/src/components/MkPageWindow.vue
@@ -58,7 +58,7 @@ const windowRouter = routerFactory(props.initialPath);
const contents = shallowRef(null);
const pageMetadata = ref(null);
const windowEl = shallowRef>();
-const history = ref<{ path: string; key: any; }[]>([{
+const history = ref<{ path: string; key: string; }[]>([{
path: windowRouter.getCurrentPath(),
key: windowRouter.getCurrentKey(),
}]);
diff --git a/packages/frontend/src/components/MkPopupMenu.vue b/packages/frontend/src/components/MkPopupMenu.vue
index 26c251a8d2..df664e49f7 100644
--- a/packages/frontend/src/components/MkPopupMenu.vue
+++ b/packages/frontend/src/components/MkPopupMenu.vue
@@ -19,7 +19,7 @@ defineProps<{
items: MenuItem[];
align?: 'center' | string;
width?: number;
- src?: any;
+ src?: HTMLElement | null;
returnFocusTo?: HTMLElement | null;
}>();
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index b6b80082d3..f2fe048449 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -129,25 +129,13 @@ import { miLocalStorage } from '@/local-storage.js';
import { claimAchievement } from '@/scripts/achievements.js';
import { emojiPicker } from '@/scripts/emoji-picker.js';
import { mfmFunctionPicker } from '@/scripts/mfm-function-picker.js';
+import type { PostFormProps } from '@/types/post-form.js';
const $i = signinRequired();
const modal = inject('modal');
-const props = withDefaults(defineProps<{
- reply?: Misskey.entities.Note;
- renote?: Misskey.entities.Note;
- channel?: Misskey.entities.Channel; // TODO
- mention?: Misskey.entities.User;
- specified?: Misskey.entities.UserDetailed;
- initialText?: string;
- initialCw?: string;
- initialVisibility?: (typeof Misskey.noteVisibilities)[number];
- initialFiles?: Misskey.entities.DriveFile[];
- initialLocalOnly?: boolean;
- initialVisibleUsers?: Misskey.entities.UserDetailed[];
- initialNote?: Misskey.entities.Note;
- instant?: boolean;
+const props = withDefaults(defineProps {
- if (typeof key !== 'string') return;
+ }, (key, value) => {
+ if (typeof key !== 'string' || typeof value !== 'string') return;
if (key === 'text') { text.value = value; }
if (key === 'cw') { useCw.value = value !== null; cw.value = value; }
});
diff --git a/packages/frontend/src/components/MkPostFormAttaches.vue b/packages/frontend/src/components/MkPostFormAttaches.vue
index ee7038df64..56e026aa3c 100644
--- a/packages/frontend/src/components/MkPostFormAttaches.vue
+++ b/packages/frontend/src/components/MkPostFormAttaches.vue
@@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
emit('update:modelValue', v)">
-
+
import('vuedraggable').then(x => x.default));
const props = defineProps<{
- modelValue: any[];
+ modelValue: Misskey.entities.DriveFile[];
detachMediaFn?: (id: string) => void;
}>();
const mock = inject
('mock', false);
const emit = defineEmits<{
- (ev: 'update:modelValue', value: any[]): void;
+ (ev: 'update:modelValue', value: Misskey.entities.DriveFile[]): void;
(ev: 'detach', id: string): void;
(ev: 'changeSensitive', file: Misskey.entities.DriveFile, isSensitive: boolean): void;
(ev: 'changeName', file: Misskey.entities.DriveFile, newName: string): void;
@@ -113,7 +113,7 @@ async function rename(file) {
});
}
-async function describe(file) {
+async function describe(file: Misskey.entities.DriveFile) {
if (mock) return;
const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkFileCaptionEditWindow.vue')), {
diff --git a/packages/frontend/src/components/MkPostFormDialog.vue b/packages/frontend/src/components/MkPostFormDialog.vue
index d6bca29050..32d8df1504 100644
--- a/packages/frontend/src/components/MkPostFormDialog.vue
+++ b/packages/frontend/src/components/MkPostFormDialog.vue
@@ -11,23 +11,11 @@ SPDX-License-Identifier: AGPL-3.0-only
+
diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue
index c287effadc..f0da8fd3f2 100644
--- a/packages/frontend/src/components/MkUrlPreview.vue
+++ b/packages/frontend/src/components/MkUrlPreview.vue
@@ -180,7 +180,7 @@ window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${versatileLa
sensitive.value = info.sensitive ?? false;
});
-function adjustTweetHeight(message: any) {
+function adjustTweetHeight(message: MessageEvent) {
if (message.origin !== 'https://platform.twitter.com') return;
const embed = message.data?.['twttr.embed'];
if (embed?.method !== 'twttr.private.resize') return;
@@ -193,14 +193,16 @@ function openPlayer(): void {
const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkYouTubePlayer.vue')), {
url: requestUrl.href,
}, {
- // TODO
+ closed: () => {
+ dispose();
+ },
});
}
-(window as any).addEventListener('message', adjustTweetHeight);
+window.addEventListener('message', adjustTweetHeight);
onUnmounted(() => {
- (window as any).removeEventListener('message', adjustTweetHeight);
+ window.removeEventListener('message', adjustTweetHeight);
});
diff --git a/packages/frontend/src/components/MkUserAnnouncementEditDialog.vue b/packages/frontend/src/components/MkUserAnnouncementEditDialog.vue
index 7a2b5f5ddc..7f0266d1d3 100644
--- a/packages/frontend/src/components/MkUserAnnouncementEditDialog.vue
+++ b/packages/frontend/src/components/MkUserAnnouncementEditDialog.vue
@@ -62,9 +62,11 @@ import MkTextarea from '@/components/MkTextarea.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkRadios from '@/components/MkRadios.vue';
+type AdminAnnouncementType = Misskey.entities.AdminAnnouncementsCreateRequest & { id: string; }
+
const props = defineProps<{
user: Misskey.entities.User,
- announcement?: Misskey.entities.Announcement,
+ announcement?: Required,
}>();
const dialog = ref | null>(null);
@@ -75,7 +77,7 @@ const display = ref(props.announcement ? props.announcement.display : 'dialog');
const needConfirmationToRead = ref(props.announcement ? props.announcement.needConfirmationToRead : false);
const emit = defineEmits<{
- (ev: 'done', v: { deleted?: boolean; updated?: any; created?: any }): void,
+ (ev: 'done', v: { deleted?: boolean; updated?: AdminAnnouncementType; created?: AdminAnnouncementType; }): void,
(ev: 'closed'): void
}>();
@@ -88,7 +90,7 @@ async function done() {
display: display.value,
needConfirmationToRead: needConfirmationToRead.value,
userId: props.user.id,
- };
+ } satisfies Misskey.entities.AdminAnnouncementsCreateRequest;
if (props.announcement) {
await os.apiWithDialog('admin/announcements/update', {
diff --git a/packages/frontend/src/components/MkUsersTooltip.vue b/packages/frontend/src/components/MkUsersTooltip.vue
index 054a503257..0cb7f22e93 100644
--- a/packages/frontend/src/components/MkUsersTooltip.vue
+++ b/packages/frontend/src/components/MkUsersTooltip.vue
@@ -16,12 +16,12 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/pages/follow-requests.vue b/packages/frontend/src/pages/follow-requests.vue
index 8991af8086..a840d0d0b3 100644
--- a/packages/frontend/src/pages/follow-requests.vue
+++ b/packages/frontend/src/pages/follow-requests.vue
@@ -55,13 +55,13 @@ const pagination = {
function accept(user) {
misskeyApi('following/requests/accept', { userId: user.id }).then(() => {
- paginationComponent.value.reload();
+ paginationComponent.value?.reload();
});
}
function reject(user) {
misskeyApi('following/requests/reject', { userId: user.id }).then(() => {
- paginationComponent.value.reload();
+ paginationComponent.value?.reload();
});
}
diff --git a/packages/frontend/src/pages/lookup.vue b/packages/frontend/src/pages/lookup.vue
index 3233953942..6f10c69640 100644
--- a/packages/frontend/src/pages/lookup.vue
+++ b/packages/frontend/src/pages/lookup.vue
@@ -40,7 +40,7 @@ function fetch() {
return;
}
- let promise: Promise;
+ let promise: Promise;
if (uri.startsWith('https://')) {
promise = misskeyApi('ap/show', {
diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue
index ece998a7a5..acf37a9a2f 100644
--- a/packages/frontend/src/pages/my-clips/index.vue
+++ b/packages/frontend/src/pages/my-clips/index.vue
@@ -77,15 +77,15 @@ async function create() {
clipsCache.delete();
- pagingComponent.value.reload();
+ pagingComponent.value?.reload();
}
function onClipCreated() {
- pagingComponent.value.reload();
+ pagingComponent.value?.reload();
}
function onClipDeleted() {
- pagingComponent.value.reload();
+ pagingComponent.value?.reload();
}
const headerActions = computed(() => []);
diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue
index 804a5ae8f8..69e404bd85 100644
--- a/packages/frontend/src/pages/my-lists/list.vue
+++ b/packages/frontend/src/pages/my-lists/list.vue
@@ -110,7 +110,7 @@ function addUser() {
listId: list.value.id,
userId: user.id,
}).then(() => {
- paginationEl.value.reload();
+ paginationEl.value?.reload();
});
});
}
@@ -126,7 +126,7 @@ async function removeUser(item, ev) {
listId: list.value.id,
userId: item.userId,
}).then(() => {
- paginationEl.value.removeItem(item.id);
+ paginationEl.value?.removeItem(item.id);
});
},
}], ev.currentTarget ?? ev.target);
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
index 1cfe7a6d2d..247b8f61a1 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
@@ -30,11 +30,12 @@ import { misskeyApi } from '@/scripts/misskey-api.js';
import { i18n } from '@/i18n.js';
const props = defineProps<{
- modelValue: any
+ modelValue: Misskey.entities.PageBlock & { type: 'image' };
}>();
const emit = defineEmits<{
- (ev: 'update:modelValue', value: any): void;
+ (ev: 'update:modelValue', value: Misskey.entities.PageBlock & { type: 'image' }): void;
+ (ev: 'remove'): void;
}>();
const file = ref(null);
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.note.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.note.vue
index 0a28386986..52b4f2aaa3 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.note.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.note.vue
@@ -34,19 +34,24 @@ import { misskeyApi } from '@/scripts/misskey-api.js';
import { i18n } from '@/i18n.js';
const props = defineProps<{
- modelValue: any
+ modelValue: Misskey.entities.PageBlock & { type: 'note' };
}>();
const emit = defineEmits<{
- (ev: 'update:modelValue', value: any): void;
+ (ev: 'update:modelValue', value: Misskey.entities.PageBlock & { type: 'note' }): void;
}>();
-const id = ref(props.modelValue.note);
+const id = ref(props.modelValue.note);
const note = ref(null);
watch(id, async () => {
if (id.value && (id.value.startsWith('http://') || id.value.startsWith('https://'))) {
- id.value = (id.value.endsWith('/') ? id.value.slice(0, -1) : id.value).split('/').pop();
+ id.value = (id.value.endsWith('/') ? id.value.slice(0, -1) : id.value).split('/').pop() ?? null;
+ }
+
+ if (!id.value) {
+ note.value = null;
+ return;
}
emit('update:modelValue', {
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
index 0f8dc33143..eea52255c7 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
@@ -23,6 +23,7 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue
index 16f0716a12..97e960675f 100644
--- a/packages/frontend/src/pages/settings/accounts.vue
+++ b/packages/frontend/src/pages/settings/accounts.vue
@@ -90,7 +90,7 @@ function createAccount() {
});
}
-async function switchAccount(account: any) {
+async function switchAccount(account: Misskey.entities.UserDetailed) {
const fetchedAccounts = await getAccounts();
const token = fetchedAccounts.find(x => x.id === account.id)!.token;
switchAccountWithToken(token);
diff --git a/packages/frontend/src/pages/settings/apps.vue b/packages/frontend/src/pages/settings/apps.vue
index 68e36ef1bb..6515503505 100644
--- a/packages/frontend/src/pages/settings/apps.vue
+++ b/packages/frontend/src/pages/settings/apps.vue
@@ -55,6 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 00b5740639..2794db2821 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -257,7 +257,7 @@ function parallaxLoop() {
}
function parallax() {
- const banner = bannerEl.value as any;
+ const banner = bannerEl.value;
if (banner == null) return;
const top = getScrollPosition(rootEl.value);
diff --git a/packages/frontend/src/router/definition.ts b/packages/frontend/src/router/definition.ts
index b5fd6b6ec3..e98e0b59b1 100644
--- a/packages/frontend/src/router/definition.ts
+++ b/packages/frontend/src/router/definition.ts
@@ -10,7 +10,7 @@ import { $i, iAmModerator } from '@/account.js';
import MkLoading from '@/pages/_loading_.vue';
import MkError from '@/pages/_error_.vue';
-export const page = (loader: AsyncComponentLoader) => defineAsyncComponent({
+export const page = (loader: AsyncComponentLoader) => defineAsyncComponent({
loader: loader,
loadingComponent: MkLoading,
errorComponent: MkError,
diff --git a/packages/frontend/src/router/main.ts b/packages/frontend/src/router/main.ts
index 6ee967e6f4..3c25e80d12 100644
--- a/packages/frontend/src/router/main.ts
+++ b/packages/frontend/src/router/main.ts
@@ -4,7 +4,7 @@
*/
import { EventEmitter } from 'eventemitter3';
-import { IRouter, Resolved, RouteDef, RouterEvent } from '@/nirax.js';
+import { IRouter, Resolved, RouteDef, RouterEvent, RouterFlag } from '@/nirax.js';
import type { App, ShallowRef } from 'vue';
@@ -79,7 +79,7 @@ class MainRouterProxy implements IRouter {
return this.supplier().currentRoute;
}
- get navHook(): ((path: string, flag?: any) => boolean) | null {
+ get navHook(): ((path: string, flag?: RouterFlag) => boolean) | null {
return this.supplier().navHook;
}
@@ -91,11 +91,11 @@ class MainRouterProxy implements IRouter {
return this.supplier().getCurrentKey();
}
- getCurrentPath(): any {
+ getCurrentPath(): string {
return this.supplier().getCurrentPath();
}
- push(path: string, flag?: any): void {
+ push(path: string, flag?: RouterFlag): void {
this.supplier().push(path, flag);
}
diff --git a/packages/frontend/src/scripts/check-word-mute.ts b/packages/frontend/src/scripts/check-word-mute.ts
index 67e896b4b9..0a37a08bf0 100644
--- a/packages/frontend/src/scripts/check-word-mute.ts
+++ b/packages/frontend/src/scripts/check-word-mute.ts
@@ -2,8 +2,9 @@
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
+import * as Misskey from 'misskey-js';
-export function checkWordMute(note: Record, me: Record | null | undefined, mutedWords: Array): boolean {
+export function checkWordMute(note: Misskey.entities.Note, me: Misskey.entities.UserLite | null | undefined, mutedWords: Array): boolean {
// 自分自身
if (me && (note.userId === me.id)) return false;
diff --git a/packages/frontend/src/scripts/form.ts b/packages/frontend/src/scripts/form.ts
index 242a504c3b..1032e97ac9 100644
--- a/packages/frontend/src/scripts/form.ts
+++ b/packages/frontend/src/scripts/form.ts
@@ -15,7 +15,7 @@ type Hidden = boolean | ((v: any) => boolean);
export type FormItem = {
label?: string;
type: 'string';
- default: string | null;
+ default?: string | null;
description?: string;
required?: boolean;
hidden?: Hidden;
@@ -24,7 +24,7 @@ export type FormItem = {
} | {
label?: string;
type: 'number';
- default: number | null;
+ default?: number | null;
description?: string;
required?: boolean;
hidden?: Hidden;
@@ -32,20 +32,20 @@ export type FormItem = {
} | {
label?: string;
type: 'boolean';
- default: boolean | null;
+ default?: boolean | null;
description?: string;
hidden?: Hidden;
} | {
label?: string;
type: 'enum';
- default: string | null;
+ default?: string | null;
required?: boolean;
hidden?: Hidden;
enum: EnumItem[];
} | {
label?: string;
type: 'radio';
- default: unknown | null;
+ default?: unknown | null;
required?: boolean;
hidden?: Hidden;
options: {
@@ -55,7 +55,7 @@ export type FormItem = {
} | {
label?: string;
type: 'range';
- default: number | null;
+ default?: number | null;
description?: string;
required?: boolean;
step?: number;
@@ -66,12 +66,12 @@ export type FormItem = {
} | {
label?: string;
type: 'object';
- default: Record | null;
+ default?: Record | null;
hidden: Hidden;
} | {
label?: string;
type: 'array';
- default: unknown[] | null;
+ default?: unknown[] | null;
hidden: Hidden;
} | {
type: 'button';
diff --git a/packages/frontend/src/scripts/misskey-api.ts b/packages/frontend/src/scripts/misskey-api.ts
index 1b1159fd01..e7a92e2d5c 100644
--- a/packages/frontend/src/scripts/misskey-api.ts
+++ b/packages/frontend/src/scripts/misskey-api.ts
@@ -17,7 +17,7 @@ export function misskeyApi<
_ResT = ResT extends void ? Misskey.api.SwitchCaseResponseType : ResT,
>(
endpoint: E,
- data: P = {} as any,
+ data: P & { i?: string | null; } = {} as any,
token?: string | null | undefined,
signal?: AbortSignal,
): Promise<_ResT> {
@@ -30,8 +30,8 @@ export function misskeyApi<
const promise = new Promise<_ResT>((resolve, reject) => {
// Append a credential
- if ($i) (data as any).i = $i.token;
- if (token !== undefined) (data as any).i = token;
+ if ($i) data.i = $i.token;
+ if (token !== undefined) data.i = token;
// Send request
window.fetch(`${apiUrl}/${endpoint}`, {
diff --git a/packages/frontend/src/scripts/select-file.ts b/packages/frontend/src/scripts/select-file.ts
index 9aa38178b2..b037aa8acc 100644
--- a/packages/frontend/src/scripts/select-file.ts
+++ b/packages/frontend/src/scripts/select-file.ts
@@ -80,7 +80,7 @@ export function chooseFileFromUrl(): Promise {
});
}
-function select(src: any, label: string | null, multiple: boolean): Promise {
+function select(src: HTMLElement | EventTarget | null, label: string | null, multiple: boolean): Promise {
return new Promise((res, rej) => {
const keepOriginal = ref(defaultStore.state.keepOriginalUploading);
@@ -107,10 +107,10 @@ function select(src: any, label: string | null, multiple: boolean): Promise {
+export function selectFile(src: HTMLElement | EventTarget | null, label: string | null = null): Promise {
return select(src, label, false).then(files => files[0]);
}
-export function selectFiles(src: any, label: string | null = null): Promise {
+export function selectFiles(src: HTMLElement | EventTarget | null, label: string | null = null): Promise {
return select(src, label, true);
}
diff --git a/packages/frontend/src/scripts/shuffle.ts b/packages/frontend/src/scripts/shuffle.ts
index fed16bc71c..1f6ef1928c 100644
--- a/packages/frontend/src/scripts/shuffle.ts
+++ b/packages/frontend/src/scripts/shuffle.ts
@@ -6,8 +6,9 @@
/**
* 配列をシャッフル (破壊的)
*/
-export function shuffle(array: T): T {
- let currentIndex = array.length, randomIndex;
+export function shuffle(array: T): T {
+ let currentIndex = array.length;
+ let randomIndex: number;
// While there remain elements to shuffle.
while (currentIndex !== 0) {
diff --git a/packages/frontend/src/scripts/upload.ts b/packages/frontend/src/scripts/upload.ts
index 22dce609c6..713573a377 100644
--- a/packages/frontend/src/scripts/upload.ts
+++ b/packages/frontend/src/scripts/upload.ts
@@ -32,13 +32,13 @@ const mimeTypeMap = {
export function uploadFile(
file: File,
- folder?: any,
+ folder?: string | Misskey.entities.DriveFolder,
name?: string,
keepOriginal: boolean = defaultStore.state.keepOriginalUploading,
): Promise {
if ($i == null) throw new Error('Not logged in');
- if (folder && typeof folder === 'object') folder = folder.id;
+ const _folder = typeof folder === 'string' ? folder : folder?.id;
if (file.size > instance.maxFileSize) {
alert({
@@ -89,11 +89,11 @@ export function uploadFile(
}
const formData = new FormData();
- formData.append('i', $i.token);
+ formData.append('i', $i!.token);
formData.append('force', 'true');
formData.append('file', resizedImage ?? file);
formData.append('name', ctx.name);
- if (folder) formData.append('folderId', folder);
+ if (_folder) formData.append('folderId', _folder);
const xhr = new XMLHttpRequest();
xhr.open('POST', apiUrl + '/drive/files/create', true);
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index aab67e0b5c..911a463636 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -11,6 +11,7 @@ import darkTheme from '@@/themes/d-green-lime.json5';
import { miLocalStorage } from './local-storage.js';
import type { SoundType } from '@/scripts/sound.js';
import { Storage } from '@/pizzax.js';
+import type { Ast } from '@syuilo/aiscript';
interface PostFormAction {
title: string,
@@ -516,7 +517,7 @@ export type Plugin = {
token: string;
src: string | null;
version: string;
- ast: any[];
+ ast: Ast.Node[];
author?: string;
description?: string;
permissions?: string[];
@@ -554,13 +555,13 @@ export class ColdDeviceStorage {
}
public static getAll(): Partial {
- return (Object.keys(this.default) as (keyof typeof this.default)[]).reduce((acc, key) => {
+ return (Object.keys(this.default) as (keyof typeof this.default)[]).reduce>((acc, key) => {
const value = localStorage.getItem(PREFIX + key);
if (value != null) {
acc[key] = JSON.parse(value);
}
return acc;
- }, {} as any);
+ }, {});
}
public static set(key: T, value: typeof ColdDeviceStorage.default[T]): void {
@@ -605,7 +606,7 @@ export class ColdDeviceStorage {
get: () => {
return valueRef.value;
},
- set: (value: unknown) => {
+ set: (value: typeof ColdDeviceStorage.default[K]) => {
const val = value;
ColdDeviceStorage.set(key, val);
},
diff --git a/packages/frontend/src/types/post-form.ts b/packages/frontend/src/types/post-form.ts
new file mode 100644
index 0000000000..5bb04a95a0
--- /dev/null
+++ b/packages/frontend/src/types/post-form.ts
@@ -0,0 +1,22 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import * as Misskey from 'misskey-js';
+
+export interface PostFormProps {
+ reply?: Misskey.entities.Note;
+ renote?: Misskey.entities.Note;
+ channel?: Misskey.entities.Channel; // TODO
+ mention?: Misskey.entities.User;
+ specified?: Misskey.entities.UserDetailed;
+ initialText?: string;
+ initialCw?: string;
+ initialVisibility?: (typeof Misskey.noteVisibilities)[number];
+ initialFiles?: Misskey.entities.DriveFile[];
+ initialLocalOnly?: boolean;
+ initialVisibleUsers?: Misskey.entities.UserDetailed[];
+ initialNote?: Misskey.entities.Note;
+ instant?: boolean;
+};
diff --git a/packages/frontend/src/widgets/WidgetPhotos.vue b/packages/frontend/src/widgets/WidgetPhotos.vue
index 34be8c5e57..40e2d8fbc7 100644
--- a/packages/frontend/src/widgets/WidgetPhotos.vue
+++ b/packages/frontend/src/widgets/WidgetPhotos.vue
@@ -68,10 +68,10 @@ const onDriveFileCreated = (file) => {
}
};
-const thumbnail = (image: any): string => {
+const thumbnail = (image: Misskey.entities.DriveFile): string => {
return defaultStore.state.disableShowingAnimatedImages
? getStaticImageUrl(image.url)
- : image.thumbnailUrl;
+ : image.thumbnailUrl ?? image.url;
};
misskeyApi('drive/stream', {
--
cgit v1.2.3-freya
From ceb60d61b05e32fa340269122378ea93efb20517 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Thu, 31 Oct 2024 13:47:30 +0900
Subject: refactor
---
packages/frontend/src/pages/emoji-edit-dialog.vue | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue
index 2caba03675..db3f436873 100644
--- a/packages/frontend/src/pages/emoji-edit-dialog.vue
+++ b/packages/frontend/src/pages/emoji-edit-dialog.vue
@@ -10,7 +10,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:initialHeight="500"
:canResize="true"
@close="windowEl.close()"
- @closed="$emit('closed')"
+ @closed="emit('closed')"
>
:{{ emoji.name }}:
New emoji
@@ -98,6 +98,11 @@ const props = defineProps<{
emoji?: Misskey.entities.EmojiDetailed,
}>();
+const emit = defineEmits<{
+ (ev: 'done', v: { deleted?: boolean; updated?: Misskey.entities.AdminEmojiUpdateRequest; created?: Misskey.entities.AdminEmojiUpdateRequest }): void,
+ (ev: 'closed'): void
+}>();
+
const windowEl = ref | null>(null);
const name = ref(props.emoji ? props.emoji.name : '');
const category = ref(props.emoji?.category ? props.emoji.category : '');
@@ -115,11 +120,6 @@ watch(roleIdsThatCanBeUsedThisEmojiAsReaction, async () => {
const imgUrl = computed(() => file.value ? file.value.url : props.emoji ? `/emoji/${props.emoji.name}.webp` : null);
-const emit = defineEmits<{
- (ev: 'done', v: { deleted?: boolean; updated?: Misskey.entities.AdminEmojiUpdateRequest; created?: Misskey.entities.AdminEmojiUpdateRequest }): void,
- (ev: 'closed'): void
-}>();
-
async function changeImage(ev: Event) {
file.value = await selectFile(ev.currentTarget ?? ev.target, null);
const candidate = file.value.name.replace(/\.(.+)$/, '');
--
cgit v1.2.3-freya
From 724dea8136164dcfcd7238888ef93ccab8270fb9 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Thu, 31 Oct 2024 13:47:47 +0900
Subject: lint
---
packages/frontend/src/pages/emoji-edit-dialog.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue
index db3f436873..3765319b25 100644
--- a/packages/frontend/src/pages/emoji-edit-dialog.vue
+++ b/packages/frontend/src/pages/emoji-edit-dialog.vue
@@ -9,7 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:initialWidth="400"
:initialHeight="500"
:canResize="true"
- @close="windowEl.close()"
+ @close="windowEl?.close()"
@closed="emit('closed')"
>
:{{ emoji.name }}:
--
cgit v1.2.3-freya
From 224bbd486f8745cd471b77f38570b65be3b87cfc Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Thu, 31 Oct 2024 13:50:50 +0900
Subject: refactor
---
packages/frontend/src/components/MkCropperDialog.vue | 2 +-
.../frontend/src/components/MkCustomEmojiDetailedDialog.vue | 2 +-
packages/frontend/src/components/MkEmbedCodeGenDialog.vue | 2 +-
packages/frontend/src/components/MkFormDialog.vue | 2 +-
packages/frontend/src/components/MkPageWindow.vue | 8 ++++----
packages/frontend/src/components/MkSignupDialog.vue | 2 +-
packages/frontend/src/components/MkTokenGenerateWindow.vue | 2 +-
.../frontend/src/components/MkUserAnnouncementEditDialog.vue | 12 ++++++------
packages/frontend/src/components/MkUserSelectDialog.vue | 2 +-
packages/frontend/src/components/MkWidgets.vue | 2 +-
packages/frontend/src/components/MkWindow.vue | 2 +-
.../src/pages/page-editor/els/page-editor.el.image.vue | 2 +-
.../src/pages/page-editor/els/page-editor.el.note.vue | 2 +-
.../src/pages/page-editor/els/page-editor.el.section.vue | 4 ++--
.../src/pages/page-editor/els/page-editor.el.text.vue | 4 ++--
.../frontend/src/pages/page-editor/page-editor.blocks.vue | 2 +-
16 files changed, 26 insertions(+), 26 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/components/MkCropperDialog.vue b/packages/frontend/src/components/MkCropperDialog.vue
index c2a1aaf29a..0186cfc2c0 100644
--- a/packages/frontend/src/components/MkCropperDialog.vue
+++ b/packages/frontend/src/components/MkCropperDialog.vue
@@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:withOkButton="true"
@close="cancel()"
@ok="ok()"
- @closed="$emit('closed')"
+ @closed="emit('closed')"
>
{{ i18n.ts.cropImage }}
diff --git a/packages/frontend/src/components/MkCustomEmojiDetailedDialog.vue b/packages/frontend/src/components/MkCustomEmojiDetailedDialog.vue
index 949adc6a8e..ecbee864dc 100644
--- a/packages/frontend/src/components/MkCustomEmojiDetailedDialog.vue
+++ b/packages/frontend/src/components/MkCustomEmojiDetailedDialog.vue
@@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
-
+
:{{ emoji.name }}:
diff --git a/packages/frontend/src/components/MkEmbedCodeGenDialog.vue b/packages/frontend/src/components/MkEmbedCodeGenDialog.vue
index c2bb516c7c..6e9eb75920 100644
--- a/packages/frontend/src/components/MkEmbedCodeGenDialog.vue
+++ b/packages/frontend/src/components/MkEmbedCodeGenDialog.vue
@@ -11,7 +11,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:scroll="false"
:withOkButton="false"
@close="cancel()"
- @closed="$emit('closed')"
+ @closed="emit('closed')"
>
{{ i18n.ts._embedCodeGen.title }}
diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue
index 124f114111..a639eae208 100644
--- a/packages/frontend/src/components/MkFormDialog.vue
+++ b/packages/frontend/src/components/MkFormDialog.vue
@@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
@click="cancel()"
@ok="ok()"
@close="cancel()"
- @closed="$emit('closed')"
+ @closed="emit('closed')"
>
{{ title }}
diff --git a/packages/frontend/src/components/MkPageWindow.vue b/packages/frontend/src/components/MkPageWindow.vue
index 02c84df447..9547423227 100644
--- a/packages/frontend/src/components/MkPageWindow.vue
+++ b/packages/frontend/src/components/MkPageWindow.vue
@@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:buttonsLeft="buttonsLeft"
:buttonsRight="buttonsRight"
:contextmenu="contextmenu"
- @closed="$emit('closed')"
+ @closed="emit('closed')"
>
@@ -30,17 +30,17 @@ SPDX-License-Identifier: AGPL-3.0-only
--
cgit v1.2.3-freya
From 3a421837bfc8ea816c3109394a916cb0cac0e8d8 Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sat, 9 Nov 2024 10:57:04 +0900
Subject: refactor(frontend): 動画UIのフルスクリーン周りの調整 (#14877)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* refactor(frontend): フルスクリーン周りの調整
(cherry picked from commit 783032caec5853d78d5af3391e29cf364f2282e8)
* refactor(frontend): deviceKindの循環参照を除去
(cherry picked from commit 1ca471f57e968a1a6e2259bde4a7c6da1fe0c54e)
* fix
---------
Co-authored-by: taiyme <53635909+taiyme@users.noreply.github.com>
---
packages/frontend/src/boot/common.ts | 6 ++-
packages/frontend/src/components/MkMediaVideo.vue | 43 ++++++++++-----------
packages/frontend/src/scripts/device-kind.ts | 24 ++++++------
packages/frontend/src/scripts/fullscreen.ts | 46 +++++++++++++++++++++++
packages/frontend/src/store.ts | 9 +++--
5 files changed, 88 insertions(+), 40 deletions(-)
create mode 100644 packages/frontend/src/scripts/fullscreen.ts
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/boot/common.ts b/packages/frontend/src/boot/common.ts
index 90ae49ee59..bfe5c4f5f7 100644
--- a/packages/frontend/src/boot/common.ts
+++ b/packages/frontend/src/boot/common.ts
@@ -15,7 +15,7 @@ import { updateI18n, i18n } from '@/i18n.js';
import { $i, refreshAccount, login } from '@/account.js';
import { defaultStore, ColdDeviceStorage } from '@/store.js';
import { fetchInstance, instance } from '@/instance.js';
-import { deviceKind } from '@/scripts/device-kind.js';
+import { deviceKind, updateDeviceKind } from '@/scripts/device-kind.js';
import { reloadChannel } from '@/scripts/unison-reload.js';
import { getUrlWithoutLoginId } from '@/scripts/login-id.js';
import { getAccountFromId } from '@/scripts/get-account-from-id.js';
@@ -185,6 +185,10 @@ export async function common(createVue: () => App) {
}
});
+ watch(defaultStore.reactiveState.overridedDeviceKind, (kind) => {
+ updateDeviceKind(kind);
+ }, { immediate: true });
+
watch(defaultStore.reactiveState.useBlurEffectForModal, v => {
document.documentElement.style.setProperty('--MI-modalBgFilter', v ? 'blur(4px)' : 'none');
}, { immediate: true });
diff --git a/packages/frontend/src/components/MkMediaVideo.vue b/packages/frontend/src/components/MkMediaVideo.vue
index d3a12ca734..65e4a1eb12 100644
--- a/packages/frontend/src/components/MkMediaVideo.vue
+++ b/packages/frontend/src/components/MkMediaVideo.vue
@@ -118,7 +118,7 @@ import { hms } from '@/filters/hms.js';
import { defaultStore } from '@/store.js';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
-import { isFullscreenNotSupported } from '@/scripts/device-kind.js';
+import { exitFullscreen, requestFullscreen } from '@/scripts/fullscreen.js';
import hasAudio from '@/scripts/media-has-audio.js';
import MkMediaRange from '@/components/MkMediaRange.vue';
import { $i, iAmModerator } from '@/account.js';
@@ -334,26 +334,21 @@ function togglePlayPause() {
}
function toggleFullscreen() {
- if (isFullscreenNotSupported && videoEl.value) {
- if (isFullscreen.value) {
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- //@ts-ignore
- videoEl.value.webkitExitFullscreen();
- isFullscreen.value = false;
- } else {
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- //@ts-ignore
- videoEl.value.webkitEnterFullscreen();
- isFullscreen.value = true;
- }
- } else if (playerEl.value) {
- if (isFullscreen.value) {
- document.exitFullscreen();
- isFullscreen.value = false;
- } else {
- playerEl.value.requestFullscreen({ navigationUI: 'hide' });
- isFullscreen.value = true;
- }
+ if (playerEl.value == null || videoEl.value == null) return;
+ if (isFullscreen.value) {
+ exitFullscreen({
+ videoEl: videoEl.value,
+ });
+ isFullscreen.value = false;
+ } else {
+ requestFullscreen({
+ videoEl: videoEl.value,
+ playerEl: playerEl.value,
+ options: {
+ navigationUI: 'hide',
+ },
+ });
+ isFullscreen.value = true;
}
}
@@ -454,8 +449,10 @@ watch(loop, (to) => {
});
watch(hide, (to) => {
- if (to && isFullscreen.value) {
- document.exitFullscreen();
+ if (videoEl.value && to && isFullscreen.value) {
+ exitFullscreen({
+ videoEl: videoEl.value,
+ });
isFullscreen.value = false;
}
});
diff --git a/packages/frontend/src/scripts/device-kind.ts b/packages/frontend/src/scripts/device-kind.ts
index 7c33f8ccee..7aadb617ca 100644
--- a/packages/frontend/src/scripts/device-kind.ts
+++ b/packages/frontend/src/scripts/device-kind.ts
@@ -3,22 +3,22 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { defaultStore } from '@/store.js';
-
-await defaultStore.ready;
+export type DeviceKind = 'smartphone' | 'tablet' | 'desktop';
const ua = navigator.userAgent.toLowerCase();
const isTablet = /ipad/.test(ua) || (/mobile|iphone|android/.test(ua) && window.innerWidth > 700);
const isSmartphone = !isTablet && /mobile|iphone|android/.test(ua);
-const isIPhone = /iphone|ipod/gi.test(ua) && navigator.maxTouchPoints > 1;
-// navigator.platform may be deprecated but this check is still required
-const isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
-const isIos = /ipad|iphone|ipod/gi.test(ua) && navigator.maxTouchPoints > 1;
+export const DEFAULT_DEVICE_KIND: DeviceKind = (
+ isSmartphone
+ ? 'smartphone'
+ : isTablet
+ ? 'tablet'
+ : 'desktop'
+);
-export const isFullscreenNotSupported = isIPhone || isIos;
+export let deviceKind: DeviceKind = DEFAULT_DEVICE_KIND;
-export const deviceKind: 'smartphone' | 'tablet' | 'desktop' = defaultStore.state.overridedDeviceKind ? defaultStore.state.overridedDeviceKind
- : isSmartphone ? 'smartphone'
- : isTablet ? 'tablet'
- : 'desktop';
+export function updateDeviceKind(kind: DeviceKind | null) {
+ deviceKind = kind ?? DEFAULT_DEVICE_KIND;
+}
diff --git a/packages/frontend/src/scripts/fullscreen.ts b/packages/frontend/src/scripts/fullscreen.ts
new file mode 100644
index 0000000000..7a0a018ef3
--- /dev/null
+++ b/packages/frontend/src/scripts/fullscreen.ts
@@ -0,0 +1,46 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+type PartiallyPartial = Omit & Partial>;
+
+type VideoEl = PartiallyPartial & {
+ webkitEnterFullscreen?(): void;
+ webkitExitFullscreen?(): void;
+};
+
+type PlayerEl = PartiallyPartial;
+
+type RequestFullscreenProps = {
+ readonly videoEl: VideoEl;
+ readonly playerEl: PlayerEl;
+ readonly options?: FullscreenOptions | null;
+};
+
+type ExitFullscreenProps = {
+ readonly videoEl: VideoEl;
+};
+
+export const requestFullscreen = ({ videoEl, playerEl, options }: RequestFullscreenProps) => {
+ if (playerEl.requestFullscreen != null) {
+ playerEl.requestFullscreen(options ?? undefined);
+ return;
+ }
+ if (videoEl.webkitEnterFullscreen != null) {
+ videoEl.webkitEnterFullscreen();
+ return;
+ }
+};
+
+export const exitFullscreen = ({ videoEl }: ExitFullscreenProps) => {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (document.exitFullscreen != null) {
+ document.exitFullscreen();
+ return;
+ }
+ if (videoEl.webkitExitFullscreen != null) {
+ videoEl.webkitExitFullscreen();
+ return;
+ }
+};
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index 911a463636..1d981e897b 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -8,8 +8,9 @@ import * as Misskey from 'misskey-js';
import { hemisphere } from '@@/js/intl-const.js';
import lightTheme from '@@/themes/l-light.json5';
import darkTheme from '@@/themes/d-green-lime.json5';
-import { miLocalStorage } from './local-storage.js';
import type { SoundType } from '@/scripts/sound.js';
+import { DEFAULT_DEVICE_KIND, type DeviceKind } from '@/scripts/device-kind.js';
+import { miLocalStorage } from '@/local-storage.js';
import { Storage } from '@/pizzax.js';
import type { Ast } from '@syuilo/aiscript';
@@ -207,7 +208,7 @@ export const defaultStore = markRaw(new Storage('base', {
overridedDeviceKind: {
where: 'device',
- default: null as null | 'smartphone' | 'tablet' | 'desktop',
+ default: null as DeviceKind | null,
},
serverDisconnectedBehavior: {
where: 'device',
@@ -263,11 +264,11 @@ export const defaultStore = markRaw(new Storage('base', {
},
useBlurEffectForModal: {
where: 'device',
- default: !/mobile|iphone|android/.test(navigator.userAgent.toLowerCase()), // 循環参照するのでdevice-kind.tsは参照できない
+ default: DEFAULT_DEVICE_KIND === 'desktop',
},
useBlurEffect: {
where: 'device',
- default: !/mobile|iphone|android/.test(navigator.userAgent.toLowerCase()), // 循環参照するのでdevice-kind.tsは参照できない
+ default: DEFAULT_DEVICE_KIND === 'desktop',
},
showFixedPostForm: {
where: 'device',
--
cgit v1.2.3-freya
From 31e5f0bd09175baba8b1cc9e617c83934b423596 Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sun, 10 Nov 2024 15:08:58 +0900
Subject: fix(frontend):
メールアドレス登録有効化時の「完了」ダイアログボックスの表示条件を修正
(#14928)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(frontend): メールアドレス登録有効化時の「完了」ダイアログボックスの表示条件を修正
* Update MkSignupDialog.form.vue
* fix condition
---
packages/frontend/src/components/MkSignupDialog.form.vue | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/components/MkSignupDialog.form.vue b/packages/frontend/src/components/MkSignupDialog.form.vue
index 3d1c44fc90..e1f4e26d62 100644
--- a/packages/frontend/src/components/MkSignupDialog.form.vue
+++ b/packages/frontend/src/components/MkSignupDialog.form.vue
@@ -277,7 +277,7 @@ async function onSubmit(): Promise {
return null;
});
- if (res) {
+ if (res && res.ok) {
if (res.status === 204 || instance.emailRequiredForSignup) {
os.alert({
type: 'success',
@@ -295,6 +295,8 @@ async function onSubmit(): Promise {
await login(resJson.token);
}
}
+ } else {
+ onSignupApiError();
}
submitting.value = false;
--
cgit v1.2.3-freya
From 458c72c15372a6ae94416656b155f7c727ab4597 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Mon, 11 Nov 2024 16:35:13 +0900
Subject: Update about-misskey.vue
---
packages/frontend/src/pages/about-misskey.vue | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue
index fbbfb6ea61..f2becfd8f5 100644
--- a/packages/frontend/src/pages/about-misskey.vue
+++ b/packages/frontend/src/pages/about-misskey.vue
@@ -272,6 +272,9 @@ const patronsWithIcon = [{
}, {
name: 'Yatoigawa',
icon: 'https://assets.misskey-hub.net/patrons/505e3568885a4a488431a8f22b4553d0.jpg',
+}, {
+ name: '秋瀬カヲル',
+ icon: 'https://assets.misskey-hub.net/patrons/0f22aeb866484f4fa51db6721e3f9847.jpg',
}];
const patrons = [
@@ -380,6 +383,7 @@ const patrons = [
'ケモナーのケシン',
'こまつぶり',
'まゆつな空高',
+ 'asata',
];
const thereIsTreasure = ref($i && !claimedAchievements.includes('foundTreasure'));
--
cgit v1.2.3-freya
From a11b77a4158e07c18bcc57f77660cb08c0d950ea Mon Sep 17 00:00:00 2001
From: "饺子w (Yumechi)" <35571479+eternal-flame-AD@users.noreply.github.com>
Date: Mon, 11 Nov 2024 18:51:18 -0600
Subject: fix(backend): Webhook Test一致性 (#14863)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(backend): Webhook Test一致性
Signed-off-by: eternal-flame-AD
* UserWebhookPayload<'followed'> 修正
Signed-off-by: eternal-flame-AD
---------
Signed-off-by: eternal-flame-AD
---
CHANGELOG.md | 1 +
packages/backend/src/core/QueueService.ts | 9 ++++---
packages/backend/src/core/UserWebhookService.ts | 14 +++++++++-
packages/backend/src/core/WebhookTestService.ts | 31 +++++++++++++---------
packages/backend/test/unit/WebhookTestService.ts | 16 +++++------
.../frontend/src/pages/settings/webhook.edit.vue | 2 +-
.../frontend/src/pages/settings/webhook.new.vue | 2 +-
7 files changed, 48 insertions(+), 27 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e5bbda36fa..c92b8c06a1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -45,6 +45,7 @@
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/712)
- Fix: FTT無効時にユーザーリストタイムラインが使用できない問題を修正
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/709)
+- Fix: User Webhookテスト機能のMock Payloadを修正
### Misskey.js
- Fix: Stream初期化時、別途WebSocketを指定する場合の型定義を修正
diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts
index 37028026cc..50f08da241 100644
--- a/packages/backend/src/core/QueueService.ts
+++ b/packages/backend/src/core/QueueService.ts
@@ -7,7 +7,7 @@ import { randomUUID } from 'node:crypto';
import { Inject, Injectable } from '@nestjs/common';
import type { IActivity } from '@/core/activitypub/type.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
-import type { MiWebhook, webhookEventTypes } from '@/models/Webhook.js';
+import type { MiWebhook, WebhookEventTypes, webhookEventTypes } from '@/models/Webhook.js';
import type { MiSystemWebhook, SystemWebhookEventType } from '@/models/SystemWebhook.js';
import type { Config } from '@/config.js';
import { DI } from '@/di-symbols.js';
@@ -35,6 +35,7 @@ import type {
} from './QueueModule.js';
import type httpSignature from '@peertube/http-signature';
import type * as Bull from 'bullmq';
+import { type UserWebhookPayload } from './UserWebhookService.js';
@Injectable()
export class QueueService {
@@ -468,10 +469,10 @@ export class QueueService {
* @see UserWebhookDeliverProcessorService
*/
@bindThis
- public userWebhookDeliver(
+ public userWebhookDeliver(
webhook: MiWebhook,
- type: typeof webhookEventTypes[number],
- content: unknown,
+ type: T,
+ content: UserWebhookPayload,
opts?: { attempts?: number },
) {
const data: UserWebhookDeliverJobData = {
diff --git a/packages/backend/src/core/UserWebhookService.ts b/packages/backend/src/core/UserWebhookService.ts
index 8a40a53688..7117a3d7fa 100644
--- a/packages/backend/src/core/UserWebhookService.ts
+++ b/packages/backend/src/core/UserWebhookService.ts
@@ -6,11 +6,23 @@
import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis';
import { type WebhooksRepository } from '@/models/_.js';
-import { MiWebhook } from '@/models/Webhook.js';
+import { MiWebhook, WebhookEventTypes } from '@/models/Webhook.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { GlobalEvents } from '@/core/GlobalEventService.js';
import type { OnApplicationShutdown } from '@nestjs/common';
+import type { Packed } from '@/misc/json-schema.js';
+
+export type UserWebhookPayload =
+ T extends 'note' | 'reply' | 'renote' |'mention' ? {
+ note: Packed<'Note'>,
+ } :
+ T extends 'follow' | 'unfollow' ? {
+ user: Packed<'UserDetailedNotMe'>,
+ } :
+ T extends 'followed' ? {
+ user: Packed<'UserLite'>,
+ } : never;
@Injectable()
export class UserWebhookService implements OnApplicationShutdown {
diff --git a/packages/backend/src/core/WebhookTestService.ts b/packages/backend/src/core/WebhookTestService.ts
index c826a28963..b1ea7974fb 100644
--- a/packages/backend/src/core/WebhookTestService.ts
+++ b/packages/backend/src/core/WebhookTestService.ts
@@ -10,7 +10,7 @@ import { MiSystemWebhook, type SystemWebhookEventType } from '@/models/SystemWeb
import { SystemWebhookService } from '@/core/SystemWebhookService.js';
import { Packed } from '@/misc/json-schema.js';
import { type WebhookEventTypes } from '@/models/Webhook.js';
-import { UserWebhookService } from '@/core/UserWebhookService.js';
+import { type UserWebhookPayload, UserWebhookService } from '@/core/UserWebhookService.js';
import { QueueService } from '@/core/QueueService.js';
import { ModeratorInactivityRemainingTime } from '@/queue/processors/CheckModeratorsActivityProcessorService.js';
@@ -306,10 +306,10 @@ export class WebhookTestService {
* - 送信対象イベント(on)に関する設定
*/
@bindThis
- public async testUserWebhook(
+ public async testUserWebhook(
params: {
webhookId: MiWebhook['id'],
- type: WebhookEventTypes,
+ type: T,
override?: Partial>,
},
sender: MiUser | null,
@@ -321,7 +321,7 @@ export class WebhookTestService {
}
const webhook = webhooks[0];
- const send = (contents: unknown) => {
+ const send = (type: U, contents: UserWebhookPayload) => {
const merged = {
...webhook,
...params.override,
@@ -329,7 +329,7 @@ export class WebhookTestService {
// テスト目的なのでUserWebhookServiceの機能を経由せず直接キューに追加する(チェック処理などをスキップする意図).
// また、Jobの試行回数も1回だけ.
- this.queueService.userWebhookDeliver(merged, params.type, contents, { attempts: 1 });
+ this.queueService.userWebhookDeliver(merged, type, contents, { attempts: 1 });
};
const dummyNote1 = generateDummyNote({
@@ -361,33 +361,40 @@ export class WebhookTestService {
switch (params.type) {
case 'note': {
- send(toPackedNote(dummyNote1));
+ send('note', { note: toPackedNote(dummyNote1) });
break;
}
case 'reply': {
- send(toPackedNote(dummyReply1));
+ send('reply', { note: toPackedNote(dummyReply1) });
break;
}
case 'renote': {
- send(toPackedNote(dummyRenote1));
+ send('renote', { note: toPackedNote(dummyRenote1) });
break;
}
case 'mention': {
- send(toPackedNote(dummyMention1));
+ send('mention', { note: toPackedNote(dummyMention1) });
break;
}
case 'follow': {
- send(toPackedUserDetailedNotMe(dummyUser1));
+ send('follow', { user: toPackedUserDetailedNotMe(dummyUser1) });
break;
}
case 'followed': {
- send(toPackedUserLite(dummyUser2));
+ send('followed', { user: toPackedUserLite(dummyUser2) });
break;
}
case 'unfollow': {
- send(toPackedUserDetailedNotMe(dummyUser3));
+ send('unfollow', { user: toPackedUserDetailedNotMe(dummyUser3) });
break;
}
+ // まだ実装されていない (#9485)
+ case 'reaction': return;
+ default: {
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const _exhaustiveAssertion: never = params.type;
+ return;
+ }
}
}
diff --git a/packages/backend/test/unit/WebhookTestService.ts b/packages/backend/test/unit/WebhookTestService.ts
index 5e63b86f8f..be84ae9b84 100644
--- a/packages/backend/test/unit/WebhookTestService.ts
+++ b/packages/backend/test/unit/WebhookTestService.ts
@@ -7,7 +7,7 @@
import { Test, TestingModule } from '@nestjs/testing';
import { beforeAll, describe, jest } from '@jest/globals';
import { WebhookTestService } from '@/core/WebhookTestService.js';
-import { UserWebhookService } from '@/core/UserWebhookService.js';
+import { UserWebhookPayload, UserWebhookService } from '@/core/UserWebhookService.js';
import { SystemWebhookService } from '@/core/SystemWebhookService.js';
import { GlobalModule } from '@/GlobalModule.js';
import { MiSystemWebhook, MiUser, MiWebhook, UserProfilesRepository, UsersRepository } from '@/models/_.js';
@@ -122,7 +122,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('note');
- expect((calls[2] as any).id).toBe('dummy-note-1');
+ expect((calls[2] as UserWebhookPayload<'note'>).note.id).toBe('dummy-note-1');
});
test('reply', async () => {
@@ -131,7 +131,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('reply');
- expect((calls[2] as any).id).toBe('dummy-reply-1');
+ expect((calls[2] as UserWebhookPayload<'reply'>).note.id).toBe('dummy-reply-1');
});
test('renote', async () => {
@@ -140,7 +140,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('renote');
- expect((calls[2] as any).id).toBe('dummy-renote-1');
+ expect((calls[2] as UserWebhookPayload<'renote'>).note.id).toBe('dummy-renote-1');
});
test('mention', async () => {
@@ -149,7 +149,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('mention');
- expect((calls[2] as any).id).toBe('dummy-mention-1');
+ expect((calls[2] as UserWebhookPayload<'mention'>).note.id).toBe('dummy-mention-1');
});
test('follow', async () => {
@@ -158,7 +158,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('follow');
- expect((calls[2] as any).id).toBe('dummy-user-1');
+ expect((calls[2] as UserWebhookPayload<'follow'>).user.id).toBe('dummy-user-1');
});
test('followed', async () => {
@@ -167,7 +167,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('followed');
- expect((calls[2] as any).id).toBe('dummy-user-2');
+ expect((calls[2] as UserWebhookPayload<'followed'>).user.id).toBe('dummy-user-2');
});
test('unfollow', async () => {
@@ -176,7 +176,7 @@ describe('WebhookTestService', () => {
const calls = queueService.userWebhookDeliver.mock.calls[0];
expect((calls[0] as any).id).toBe('dummy-webhook');
expect(calls[1]).toBe('unfollow');
- expect((calls[2] as any).id).toBe('dummy-user-3');
+ expect((calls[2] as UserWebhookPayload<'unfollow'>).user.id).toBe('dummy-user-3');
});
describe('NoSuchWebhookError', () => {
diff --git a/packages/frontend/src/pages/settings/webhook.edit.vue b/packages/frontend/src/pages/settings/webhook.edit.vue
index 40d23e36c5..22b008fb61 100644
--- a/packages/frontend/src/pages/settings/webhook.edit.vue
+++ b/packages/frontend/src/pages/settings/webhook.edit.vue
@@ -44,7 +44,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts._webhookSettings._events.reaction }}
+ {{ i18n.ts._webhookSettings._events.reaction }}
diff --git a/packages/frontend/src/pages/settings/webhook.new.vue b/packages/frontend/src/pages/settings/webhook.new.vue
index d62357caaf..727c4df2d6 100644
--- a/packages/frontend/src/pages/settings/webhook.new.vue
+++ b/packages/frontend/src/pages/settings/webhook.new.vue
@@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._webhookSettings._events.note }}
{{ i18n.ts._webhookSettings._events.reply }}
{{ i18n.ts._webhookSettings._events.renote }}
- {{ i18n.ts._webhookSettings._events.reaction }}
+ {{ i18n.ts._webhookSettings._events.reaction }}
{{ i18n.ts._webhookSettings._events.mention }}
--
cgit v1.2.3-freya
From 2305788ed9cdc0c61dfeef9249f93f760a9d5f77 Mon Sep 17 00:00:00 2001
From: shimmar <78616491+shimmar@users.noreply.github.com>
Date: Wed, 13 Nov 2024 11:19:54 +0900
Subject: Enhance(frontend): ノート詳細画面にロールのバッジを表示 (#14946)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* enhance(frontend): ノートの詳細画面にロールのバッジを表示(#14058)
* Update CHANGELOG.md
---
CHANGELOG.md | 1 +
.../frontend/src/components/MkNoteDetailed.vue | 27 +++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c92b8c06a1..7c07d86580 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@
- Enhance: Self-XSS防止用の警告を追加
- Enhance: カタルーニャ語 (ca-ES) に対応
- Enhance: 個別お知らせページではMetaタグを出力するように
+- Enhance: ノート詳細画面にロールのバッジを表示
- Fix: 通知の範囲指定の設定項目が必要ない通知設定でも範囲指定の設定がでている問題を修正
- Fix: Turnstileが失敗・期限切れした際にも成功扱いとなってしまう問題を修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/768)
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index e0473dce5e..4a350388c2 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -62,7 +62,14 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
+
+
+
+
+
+
+
@@ -679,12 +686,30 @@ function loadConversation() {
float: right;
}
+.noteHeaderUsernameAndBadgeRoles {
+ display: flex;
+}
+
.noteHeaderUsername {
margin-bottom: 2px;
+ margin-right: 0.5em;
line-height: 1.3;
word-wrap: anywhere;
}
+.noteHeaderBadgeRoles {
+ margin: 0 .5em 0 0;
+}
+
+.noteHeaderBadgeRole {
+ height: 1.3em;
+ vertical-align: -20%;
+
+ & + .noteHeaderBadgeRole {
+ margin-left: 0.2em;
+ }
+}
+
.noteContent {
container-type: inline-size;
overflow-wrap: break-word;
--
cgit v1.2.3-freya
From a16d7e1e75c60fa59cd7fc5da72a227d454cdda0 Mon Sep 17 00:00:00 2001
From: dakkar
Date: Thu, 14 Nov 2024 12:12:25 +0000
Subject: fix SCSS warning
---
packages/frontend/src/style.scss | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss
index bc20985a72..377325d0d4 100644
--- a/packages/frontend/src/style.scss
+++ b/packages/frontend/src/style.scss
@@ -33,12 +33,12 @@
--MI-minBottomSpacingMobile: calc(72px + max(12px, env(safe-area-inset-bottom, 0px)));
--MI-minBottomSpacing: var(--MI-minBottomSpacingMobile);
+ --MI-avatar: 48px;
+ --MI-thread-width: 2px;
+
@media (max-width: 500px) {
--MI-margin: var(--MI-marginHalf);
}
-
- --MI-avatar: 48px;
- --MI-thread-width: 2px;
}
html.radius-misskey {
--
cgit v1.2.3-freya
From 7f8c8f62b1fab2b7f7ededeb7cb2dbc387895d17 Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Fri, 15 Nov 2024 09:33:09 +0900
Subject: fix(frontend): スマホで表示した時にipv6だとはみ出てしまうのを修正
(#14960)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(frontend): スマホで表示した時にipv6だとはみ出てしまうのを修正 (MisskeyIO#815)
(cherry picked from commit aec01dd4adda8e975da523c5bea329120e689569)
* Update Changelog
---------
Co-authored-by: sleep-moe
---
CHANGELOG.md | 2 ++
packages/frontend/src/pages/admin-user.vue | 1 +
2 files changed, 3 insertions(+)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e07cdc00d7..f51fcb9d0a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -32,6 +32,8 @@
= Fix: ノート投稿ボタンにホバー時のスタイルが適用されていないのを修正
(Cherry-picked from https://github.com/taiyme/misskey/pull/305)
- Fix: メールアドレス登録有効化時の「完了」ダイアログボックスの表示条件を修正
+- Fix: 画面幅が狭い環境でデザインが崩れる問題を修正
+ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/815)
### Server
- Enhance: DockerのNode.jsを22.11.0に更新
diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue
index 948e7a3cce..30d7e38638 100644
--- a/packages/frontend/src/pages/admin-user.vue
+++ b/packages/frontend/src/pages/admin-user.vue
@@ -627,6 +627,7 @@ definePageMetadata(() => ({
--
cgit v1.2.3-freya
From c271534abafe3a05783eab49ba21707ae2dcd531 Mon Sep 17 00:00:00 2001
From: FineArchs <133759614+FineArchs@users.noreply.github.com>
Date: Tue, 19 Nov 2024 10:34:33 +0900
Subject: リノートメニューに「リノートの詳細」を追加 (#14985)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* add renote-detail menu
* changelog
* Apply suggestions from code review
Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
* Update CHANGELOG.md
---------
Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
---
CHANGELOG.md | 1 +
locales/index.d.ts | 4 ++++
locales/ja-JP.yml | 1 +
packages/frontend/src/components/MkNote.vue | 10 ++++++++++
4 files changed, 16 insertions(+)
(limited to 'packages/frontend/src')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fe132a2098..058e41c486 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,7 @@
- Enhance: 過去に送信したフォローリクエストを確認できるように
(Based on https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/663)
- Enhance: サイドバーを簡単に展開・折りたたみできるように ( #14981 )
+- Enhance: リノートメニューに「リノートの詳細」を追加
- Fix: 通知の範囲指定の設定項目が必要ない通知設定でも範囲指定の設定がでている問題を修正
- Fix: Turnstileが失敗・期限切れした際にも成功扱いとなってしまう問題を修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/768)
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 24613419ce..0ae188f1f7 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -2362,6 +2362,10 @@ export interface Locale extends ILocale {
* 詳細
*/
"details": string;
+ /**
+ * リノートの詳細
+ */
+ "renoteDetails": string;
/**
* 絵文字を選択
*/
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 9f32969a79..1b59708d85 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -586,6 +586,7 @@ masterVolume: "マスター音量"
notUseSound: "サウンドを出力しない"
useSoundOnlyWhenActive: "Misskeyがアクティブな時のみサウンドを出力する"
details: "詳細"
+renoteDetails: "リノートの詳細"
chooseEmoji: "絵文字を選択"
unableToProcess: "操作を完了できません"
recentUsed: "最近使用"
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index cf0d0787b1..1a8814b7cb 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -187,6 +187,7 @@ import MkUrlPreview from '@/components/MkUrlPreview.vue';
import MkInstanceTicker from '@/components/MkInstanceTicker.vue';
import { pleaseLogin, type OpenOnRemoteOptions } from '@/scripts/please-login.js';
import { checkWordMute } from '@/scripts/check-word-mute.js';
+import { notePage } from '@/filters/note.js';
import { userPage } from '@/filters/user.js';
import number from '@/filters/number.js';
import * as os from '@/os.js';
@@ -566,15 +567,24 @@ function showRenoteMenu(): void {
};
}
+ const renoteDetailsMenu: MenuItem = {
+ type: 'link',
+ text: i18n.ts.renoteDetails,
+ icon: 'ti ti-info-circle',
+ to: notePage(note.value),
+ };
+
if (isMyRenote) {
pleaseLogin({ openOnRemote: pleaseLoginContext.value });
os.popupMenu([
+ renoteDetailsMenu,
getCopyNoteLinkMenu(note.value, i18n.ts.copyLinkRenote),
{ type: 'divider' },
getUnrenote(),
], renoteTime.value);
} else {
os.popupMenu([
+ renoteDetailsMenu,
getCopyNoteLinkMenu(note.value, i18n.ts.copyLinkRenote),
{ type: 'divider' },
getAbuseNoteMenu(note.value, i18n.ts.reportAbuseRenote),
--
cgit v1.2.3-freya
From 4603ab67bb96da39f6c4186ab655e8011fdcb740 Mon Sep 17 00:00:00 2001
From: 鴇峰 朔華 <160555157+sakuhanight@users.noreply.github.com>
Date: Wed, 20 Nov 2024 20:08:26 +0900
Subject: feat: 絵文字のポップアップメニューに編集を追加 (#15004)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Mod: 絵文字のポップアップメニューに編集を追加
* fix: code styleの修正
* fix: code styleの修正
* fix
---
.../src/components/global/MkCustomEmoji.vue | 29 +++++++++++++++++++---
packages/frontend/src/pages/emojis.emoji.vue | 28 +++++++++++++++++++--
2 files changed, 52 insertions(+), 5 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/components/global/MkCustomEmoji.vue b/packages/frontend/src/components/global/MkCustomEmoji.vue
index 66f82a7898..ec1d859080 100644
--- a/packages/frontend/src/components/global/MkCustomEmoji.vue
+++ b/packages/frontend/src/components/global/MkCustomEmoji.vue
@@ -25,17 +25,18 @@ SPDX-License-Identifier: AGPL-3.0-only