enhance(frontend): 古いアンテナ・通知が削除されていくことを明記

This commit is contained in:
kakkokari-gtyih 2025-02-05 14:16:55 +09:00
parent 2f4e2a7cca
commit da502b6bb1
6 changed files with 48 additions and 1 deletions

12
locales/index.d.ts vendored
View File

@ -5254,6 +5254,14 @@ export interface Locale extends ILocale {
* *
*/ */
"federationDisabled": string; "federationDisabled": string;
/**
* {here}
*/
"oldNotificationsWillBeDeleted": ParameterizedString<"here">;
/**
*
*/
"oldNotificationsWillBeDeletedPlaceholderHere": string;
"_accountSettings": { "_accountSettings": {
/** /**
* *
@ -5766,6 +5774,10 @@ export interface Locale extends ILocale {
* 稿 * 稿
*/ */
"global": string; "global": string;
/**
* 稿
*/
"antenna": string;
}; };
"_serverRules": { "_serverRules": {
/** /**

View File

@ -1309,6 +1309,8 @@ availableRoles: "利用可能なロール"
acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします。" acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします。"
federationSpecified: "このサーバーはホワイトリスト連合で運用されています。管理者が指定したサーバー以外とやり取りすることはできません。" federationSpecified: "このサーバーはホワイトリスト連合で運用されています。管理者が指定したサーバー以外とやり取りすることはできません。"
federationDisabled: "このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。" federationDisabled: "このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。"
oldNotificationsWillBeDeleted: "古い通知は自動的に削除されます。{here}から手動でリセットすることもできます。"
oldNotificationsWillBeDeletedPlaceholderHere: "こちら"
_accountSettings: _accountSettings:
requireSigninToViewContents: "コンテンツの表示にログインを必須にする" requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
@ -1456,6 +1458,7 @@ _timelineDescription:
local: "ローカルタイムラインでは、このサーバーにいるユーザー全員の投稿を見られます。" local: "ローカルタイムラインでは、このサーバーにいるユーザー全員の投稿を見られます。"
social: "ソーシャルタイムラインには、ホームタイムラインとローカルタイムラインの投稿が両方表示されます。" social: "ソーシャルタイムラインには、ホームタイムラインとローカルタイムラインの投稿が両方表示されます。"
global: "グローバルタイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。" global: "グローバルタイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。"
antenna: "アンテナに保存されている投稿は古いものから削除されていきます。必要に応じてクリップなどに移動させてください。"
_serverRules: _serverRules:
description: "新規登録前に表示する、サーバーの簡潔なルールを設定します。内容は利用規約の要約とすることを推奨します。" description: "新規登録前に表示する、サーバーの簡潔なルールを設定します。内容は利用規約の要約とすることを推奨します。"

View File

@ -38,7 +38,7 @@ import MkPullToRefresh from '@/components/MkPullToRefresh.vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
const props = defineProps<{ const props = defineProps<{
excludeTypes?: typeof notificationTypes[number][]; excludeTypes?: typeof notificationTypes[number][] | null;
}>(); }>();
const pagingComponent = shallowRef<InstanceType<typeof MkPagination>>(); const pagingComponent = shallowRef<InstanceType<typeof MkPagination>>();

View File

@ -8,6 +8,9 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> <template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
<MkSpacer :contentMax="800"> <MkSpacer :contentMax="800">
<div ref="rootEl"> <div ref="rootEl">
<MkInfo v-if="!defaultStore.reactiveState.timelineTutorials.value.antenna" style="margin-bottom: var(--MI-margin);" closable @close="closeTutorial()">
{{ i18n.ts._timelineDescription.antenna }}
</MkInfo>
<div v-if="queue > 0" :class="$style.new"><button class="_buttonPrimary" :class="$style.newButton" @click="top()">{{ i18n.ts.newNoteRecived }}</button></div> <div v-if="queue > 0" :class="$style.new"><button class="_buttonPrimary" :class="$style.newButton" @click="top()">{{ i18n.ts.newNoteRecived }}</button></div>
<div :class="$style.tl"> <div :class="$style.tl">
<MkTimeline <MkTimeline
@ -27,11 +30,13 @@ SPDX-License-Identifier: AGPL-3.0-only
import { computed, watch, ref, shallowRef } from 'vue'; import { computed, watch, ref, shallowRef } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import MkTimeline from '@/components/MkTimeline.vue'; import MkTimeline from '@/components/MkTimeline.vue';
import MkInfo from '@/components/MkInfo.vue';
import { scroll } from '@@/js/scroll.js'; import { scroll } from '@@/js/scroll.js';
import * as os from '@/os.js'; import * as os from '@/os.js';
import { misskeyApi } from '@/scripts/misskey-api.js'; import { misskeyApi } from '@/scripts/misskey-api.js';
import { definePageMetadata } from '@/scripts/page-metadata.js'; import { definePageMetadata } from '@/scripts/page-metadata.js';
import { i18n } from '@/i18n.js'; import { i18n } from '@/i18n.js';
import { defaultStore } from '@/store.js';
import { useRouter } from '@/router/supplier.js'; import { useRouter } from '@/router/supplier.js';
const router = useRouter(); const router = useRouter();
@ -45,6 +50,13 @@ const queue = ref(0);
const rootEl = shallowRef<HTMLElement>(); const rootEl = shallowRef<HTMLElement>();
const tlEl = shallowRef<InstanceType<typeof MkTimeline>>(); const tlEl = shallowRef<InstanceType<typeof MkTimeline>>();
function closeTutorial() {
defaultStore.set('timelineTutorials', {
...defaultStore.state.timelineTutorials,
antenna: false,
});
}
function queueUpdated(q) { function queueUpdated(q) {
queue.value = q; queue.value = q;
} }

View File

@ -9,6 +9,14 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSpacer :contentMax="800"> <MkSpacer :contentMax="800">
<MkHorizontalSwipe v-model:tab="tab" :tabs="headerTabs"> <MkHorizontalSwipe v-model:tab="tab" :tabs="headerTabs">
<div v-if="tab === 'all'" key="all"> <div v-if="tab === 'all'" key="all">
<MkInfo v-if="!defaultStore.reactiveState.notificationTutorial.value" style="margin-bottom: var(--MI-margin);" closable @close="closeTutorial()">
<I18n :src="i18n.ts.oldNotificationsWillBeDeleted" tag="span">
<template #here>
<MkA class="_link" to="/settings/notifications">{{ i18n.ts.oldNotificationsWillBeDeletedPlaceholderHere }}</MkA>
</template>
</I18n>
</MkInfo>
<XNotifications :class="$style.notifications" :excludeTypes="excludeTypes"/> <XNotifications :class="$style.notifications" :excludeTypes="excludeTypes"/>
</div> </div>
<div v-else-if="tab === 'mentions'" key="mention"> <div v-else-if="tab === 'mentions'" key="mention">
@ -25,17 +33,24 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
import XNotifications from '@/components/MkNotifications.vue'; import XNotifications from '@/components/MkNotifications.vue';
import MkInfo from '@/components/MkInfo.vue';
import MkNotes from '@/components/MkNotes.vue'; import MkNotes from '@/components/MkNotes.vue';
import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue'; import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue';
import * as os from '@/os.js'; import * as os from '@/os.js';
import { i18n } from '@/i18n.js'; import { i18n } from '@/i18n.js';
import { defaultStore } from '@/store.js';
import { definePageMetadata } from '@/scripts/page-metadata.js'; import { definePageMetadata } from '@/scripts/page-metadata.js';
import { notificationTypes } from '@@/js/const.js'; import { notificationTypes } from '@@/js/const.js';
import I18n from '@/components/global/I18n.vue';
const tab = ref('all'); const tab = ref('all');
const includeTypes = ref<string[] | null>(null); const includeTypes = ref<string[] | null>(null);
const excludeTypes = computed(() => includeTypes.value ? notificationTypes.filter(t => !includeTypes.value.includes(t)) : null); const excludeTypes = computed(() => includeTypes.value ? notificationTypes.filter(t => !includeTypes.value.includes(t)) : null);
function closeTutorial() {
defaultStore.set('notificationTutorial', false);
}
const mentionsPagination = { const mentionsPagination = {
endpoint: 'notes/mentions' as const, endpoint: 'notes/mentions' as const,
limit: 10, limit: 10,

View File

@ -78,12 +78,17 @@ export const defaultStore = markRaw(new Storage('base', {
local: false, local: false,
social: false, social: false,
global: false, global: false,
antenna: false,
}, },
}, },
abusesTutorial: { abusesTutorial: {
where: 'account', where: 'account',
default: false, default: false,
}, },
notificationTutorial: {
where: 'account',
default: false,
},
keepCw: { keepCw: {
where: 'account', where: 'account',
default: true, default: true,