feat: 未読の通知のみ表示する機能
This commit is contained in:
		
							parent
							
								
									27c056cbbf
								
							
						
					
					
						commit
						ec05c07321
					
				
					 5 changed files with 39 additions and 6 deletions
				
			
		|  | @ -14,7 +14,9 @@ | |||
| - アカウント登録にメールアドレスの設定を必須にするオプション | ||||
| - クライアント: アニメーションを減らす設定をメニューのアニメーションにも適用するように | ||||
| - クライアント: MFM関数構文のサジェストを実装 | ||||
| - クライアント: 未読の通知のみ表示する機能 | ||||
| - ActivityPub: HTML -> MFMの変換を強化 | ||||
| - API: i/notifications に unreadOnly オプションを追加 | ||||
| - API: ap系のエンドポイントをログイン必須化+レートリミット追加 | ||||
| - Misskeyのコマンドラインオプションを廃止 | ||||
| 	- 代わりに環境変数で設定することができます | ||||
|  |  | |||
|  | @ -792,6 +792,7 @@ unresolved: "未解決" | |||
| itsOn: "オンになっています" | ||||
| itsOff: "オフになっています" | ||||
| emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする" | ||||
| unread: "未読" | ||||
| 
 | ||||
| _signup: | ||||
|   almostThere: "ほとんど完了です" | ||||
|  |  | |||
|  | @ -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': { | ||||
|  |  | |||
|  | @ -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'; }, | ||||
| 				},] | ||||
| 			})), | ||||
| 		}; | ||||
| 	}, | ||||
| 
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue