feat: 未読の通知のみ表示する機能

This commit is contained in:
syuilo 2021-10-09 12:44:19 +09:00
parent 27c056cbbf
commit ec05c07321
5 changed files with 39 additions and 6 deletions

View file

@ -14,7 +14,9 @@
- アカウント登録にメールアドレスの設定を必須にするオプション
- クライアント: アニメーションを減らす設定をメニューのアニメーションにも適用するように
- クライアント: MFM関数構文のサジェストを実装
- クライアント: 未読の通知のみ表示する機能
- ActivityPub: HTML -> MFMの変換を強化
- API: i/notifications に unreadOnly オプションを追加
- API: ap系のエンドポイントをログイン必須化+レートリミット追加
- Misskeyのコマンドラインオプションを廃止
- 代わりに環境変数で設定することができます

View file

@ -792,6 +792,7 @@ unresolved: "未解決"
itsOn: "オンになっています"
itsOff: "オフになっています"
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
unread: "未読"
_signup:
almostThere: "ほとんど完了です"

View file

@ -48,6 +48,11 @@ export default defineComponent({
required: false,
default: null,
},
unreadOnly: {
type: Boolean,
required: false,
default: false,
},
},
data() {
@ -58,6 +63,7 @@ export default defineComponent({
limit: 10,
params: () => ({
includeTypes: this.allIncludeTypes || undefined,
unreadOnly: this.unreadOnly,
})
},
};
@ -76,6 +82,11 @@ export default defineComponent({
},
deep: true
},
unreadOnly: {
handler() {
this.reload();
},
},
// TODO: vue/vuex $i
// mutingNotificationTypes
'$i.mutingNotificationTypes': {

View file

@ -2,13 +2,13 @@
<div>
<MkHeader :info="header"/>
<div class="clupoqwt" v-size="{ min: [800] }">
<XNotifications class="notifications" @before="before" @after="after" page/>
<XNotifications class="notifications" @before="before" @after="after" :unread-only="tab === 'unread'"/>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { computed, defineComponent } from 'vue';
import Progress from '@client/scripts/loading';
import XNotifications from '@client/components/notifications.vue';
import * as os from '@client/os';
@ -26,7 +26,8 @@ export default defineComponent({
icon: 'fas fa-bell',
bg: 'var(--bg)',
},
header: {
tab: 'all',
header: computed(() => ({
title: this.$ts.notifications,
icon: 'fas fa-bell',
bg: 'var(--bg)',
@ -35,9 +36,18 @@ export default defineComponent({
icon: 'fas fa-check',
handler: () => {
os.apiWithDialog('notifications/mark-all-as-read');
}
}]
},
}],
tabs: [{
active: this.tab === 'all',
title: this.$ts.all,
onClick: () => { this.tab = 'all'; },
}, {
active: this.tab === 'unread',
title: this.$ts.unread,
onClick: () => { this.tab = 'unread'; },
},]
})),
};
},

View file

@ -33,6 +33,11 @@ export const meta = {
default: false
},
unreadOnly: {
validator: $.optional.bool,
default: false
},
markAsRead: {
validator: $.optional.bool,
default: true
@ -105,6 +110,10 @@ export default define(meta, async (ps, user) => {
query.andWhere(`notification.type NOT IN (:...excludeTypes)`, { excludeTypes: ps.excludeTypes });
}
if (ps.unreadOnly) {
query.andWhere(`notification.isRead = false`);
}
const notifications = await query.take(ps.limit!).getMany();
// Mark all as read