diff --git a/locales/en-US.yml b/locales/en-US.yml
index 724e75cd0..2c8734f87 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -847,6 +847,7 @@ typeToConfirm: "Please enter {x} to confirm"
deleteAccount: "Delete account"
numberOfPageCache: "Number of cached pages"
numberOfPageCacheDescription: "Increasing this number will improve convenience for users but cause more server load as well as more memory to be used."
+document: "Document"
file: "File"
unclip: "Unclip"
confirmToUnclipAlreadyClippedNote: "This note is already part of the \"{name}\" clip. Do you want to remove it from this clip instead?"
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 6b4a99c4a..95d2868ed 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -854,6 +854,7 @@ typeToConfirm: "この操作を行うには {x} と入力してください"
deleteAccount: "アカウント削除"
numberOfPageCache: "ページキャッシュ数"
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
+document: "ドキュメント"
_emailUnavailable:
used: "既に使用されています"
diff --git a/packages/client/src/components/launch-pad.vue b/packages/client/src/components/launch-pad.vue
index 3c1d3f3c1..d875edb53 100644
--- a/packages/client/src/components/launch-pad.vue
+++ b/packages/client/src/components/launch-pad.vue
@@ -16,13 +16,13 @@
-
+
{{ i18n.ts.help }}
-
+
- {{ i18n.t('aboutX', { x: instanceName }) }}
+ {{ i18n.ts.instanceInfo }}
@@ -40,6 +40,7 @@ import { instanceName } from '@/config';
import { defaultStore } from '@/store';
import { i18n } from '@/i18n';
import { deviceKind } from '@/scripts/device-kind';
+import * as os from '@/os';
const props = withDefaults(defineProps<{
src?: HTMLElement;
@@ -72,6 +73,28 @@ const items = Object.keys(menuDef).filter(k => !menu.includes(k)).map(k => menuD
function close() {
modal.close();
}
+
+function help(ev: MouseEvent) {
+ os.popupMenu([{
+ type: 'link',
+ to: '/mfm-cheat-sheet',
+ text: i18n.ts._mfm.cheatSheet,
+ icon: 'fas fa-code',
+ }, {
+ type: 'link',
+ to: '/scratchpad',
+ text: i18n.ts.scratchpad,
+ icon: 'fas fa-terminal',
+ }, null, {
+ text: i18n.ts.document,
+ icon: 'fas fa-question-circle',
+ action: () => {
+ window.open('https://misskey-hub.net/help.html', '_blank');
+ },
+ }], ev.currentTarget ?? ev.target);
+
+ close();
+}
diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue
index fcb82ee34..7a86b638f 100644
--- a/packages/client/src/pages/about.vue
+++ b/packages/client/src/pages/about.vue
@@ -73,7 +73,7 @@
-
+
@@ -81,6 +81,8 @@
-
-
diff --git a/packages/client/src/pages/federation.vue b/packages/client/src/pages/federation.vue
deleted file mode 100644
index 28acf44f7..000000000
--- a/packages/client/src/pages/federation.vue
+++ /dev/null
@@ -1,122 +0,0 @@
-
-
-
-
-
-
-
-
- {{ i18n.ts.host }}
-
-
-
- {{ i18n.ts.state }}
- {{ i18n.ts.all }}
- {{ i18n.ts.federating }}
- {{ i18n.ts.subscribing }}
- {{ i18n.ts.publishing }}
- {{ i18n.ts.suspended }}
- {{ i18n.ts.blocked }}
- {{ i18n.ts.notResponding }}
-
-
- {{ i18n.ts.sort }}
- {{ i18n.ts.pubSub }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.pubSub }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.notes }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.notes }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.users }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.users }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.following }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.following }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.followers }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.followers }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.registeredAt }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.registeredAt }} ({{ i18n.ts.ascendingOrder }})
- {{ i18n.ts.lastCommunication }} ({{ i18n.ts.descendingOrder }})
- {{ i18n.ts.lastCommunication }} ({{ i18n.ts.ascendingOrder }})
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/client/src/pages/mentions.vue b/packages/client/src/pages/mentions.vue
deleted file mode 100644
index 36720a011..000000000
--- a/packages/client/src/pages/mentions.vue
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/client/src/pages/messages.vue b/packages/client/src/pages/messages.vue
deleted file mode 100644
index 6ac07b165..000000000
--- a/packages/client/src/pages/messages.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/client/src/pages/notifications.vue b/packages/client/src/pages/notifications.vue
index c91d3bd4f..0c610fb42 100644
--- a/packages/client/src/pages/notifications.vue
+++ b/packages/client/src/pages/notifications.vue
@@ -2,8 +2,14 @@
-
-
+
+
+
+
+
+
+
+
@@ -13,14 +19,51 @@
import { computed } from 'vue';
import { notificationTypes } from 'foundkey-js';
import XNotifications from '@/components/notifications.vue';
+import XNotes from '@/components/notes.vue';
import * as os from '@/os';
import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata';
-let tab = $ref('all');
-let includeTypes = $ref
(null);
+const headerTabs = $computed(() => [{
+ key: 'all',
+ title: i18n.ts.all,
+}, {
+ key: 'unread',
+ title: i18n.ts.unread,
+}, {
+ key: 'mentions',
+ title: i18n.ts.mentions,
+ icon: 'fas fa-at',
+}, {
+ key: 'directNotes',
+ title: i18n.ts.directNotes,
+ icon: 'fas fa-envelope',
+}]);
-function setFilter(ev) {
+const props = withDefaults(defineProps<{
+ initialTab?: string;
+}>(), {
+ initialTab: 'all',
+});
+
+let tab = $ref(headerTabs.some(({ key }) => key === props.initialTab) ? props.initialTab : 'all');
+let includeTypes = $ref(null);
+let unreadOnly = $computed(() => tab === 'unread');
+
+const mentionsPagination = {
+ endpoint: 'notes/mentions' as const,
+ limit: 10,
+};
+
+const directNotesPagination = {
+ endpoint: 'notes/mentions' as const,
+ limit: 10,
+ params: {
+ visibility: 'specified',
+ },
+};
+
+function setFilter(ev: Event): void {
const typeItems = notificationTypes.map(t => ({
text: i18n.t(`_notification._types.${t}`),
active: includeTypes && includeTypes.includes(t),
@@ -38,34 +81,21 @@ function setFilter(ev) {
os.popupMenu(items, ev.currentTarget ?? ev.target);
}
-const headerActions = $computed(() => [{
+const headerActions = $computed(() => tab === 'all' ? [{
text: i18n.ts.filter,
icon: 'fas fa-filter',
highlighted: includeTypes != null,
handler: setFilter,
-}, {
+},{
text: i18n.ts.markAllAsRead,
icon: 'fas fa-check',
handler: () => {
os.apiWithDialog('notifications/mark-all-as-read');
},
-}]);
-
-const headerTabs = $computed(() => [{
- key: 'all',
- title: i18n.ts.all,
-}, {
- key: 'unread',
- title: i18n.ts.unread,
-}]);
+}] : []);
definePageMetadata(computed(() => ({
title: i18n.ts.notifications,
icon: 'fas fa-bell',
})));
-
-
diff --git a/packages/client/src/pages/user/index.activity.vue b/packages/client/src/pages/user/index.activity.vue
index 90f1632ea..86f872e30 100644
--- a/packages/client/src/pages/user/index.activity.vue
+++ b/packages/client/src/pages/user/index.activity.vue
@@ -1,6 +1,6 @@
- {{ $ts.activity }}
+ {{ $ts.activity }}
diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts
index 9a9f14876..a97282dbe 100644
--- a/packages/client/src/router.ts
+++ b/packages/client/src/router.ts
@@ -70,12 +70,6 @@ export const routes = [{
}, {
path: '/explore',
component: page(() => import('./pages/explore.vue')),
-}, {
- path: '/federation',
- component: page(() => import('./pages/federation.vue')),
-}, {
- path: '/emojis',
- component: page(() => import('./pages/emojis.vue')),
}, {
path: '/search',
component: page(() => import('./pages/search.vue')),
@@ -167,17 +161,12 @@ export const routes = [{
}, {
path: '/my/notifications',
component: page(() => import('./pages/notifications.vue')),
+ hash: 'initialTab',
loginRequired: true,
}, {
path: '/my/favorites',
component: page(() => import('./pages/favorites.vue')),
loginRequired: true,
-}, {
- path: '/my/messages',
- component: page(() => import('./pages/messages.vue')),
-}, {
- path: '/my/mentions',
- component: page(() => import('./pages/mentions.vue')),
}, {
name: 'messaging',
path: '/my/messaging',