mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-04 15:34:13 +00:00 
			
		
		
		
	
							parent
							
								
									f104e9b6cc
								
							
						
					
					
						commit
						df71dbb024
					
				
					 9 changed files with 36 additions and 17 deletions
				
			
		
							
								
								
									
										20
									
								
								migration/1600353287890-mutingNotificationTypes.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								migration/1600353287890-mutingNotificationTypes.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					import {MigrationInterface, QueryRunner} from "typeorm";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class mutingNotificationTypes1600353287890 implements MigrationInterface {
 | 
				
			||||||
 | 
					    name = 'mutingNotificationTypes1600353287890'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async up(queryRunner: QueryRunner): Promise<void> {
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "includingNotificationTypes"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`DROP TYPE "public"."user_profile_includingnotificationtypes_enum"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`CREATE TYPE "user_profile_mutingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" ADD "mutingNotificationTypes" "user_profile_mutingnotificationtypes_enum" array NOT NULL DEFAULT '{}'`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async down(queryRunner: QueryRunner): Promise<void> {
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "mutingNotificationTypes"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`DROP TYPE "user_profile_mutingnotificationtypes_enum"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`CREATE TYPE "public"."user_profile_includingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" ADD "includingNotificationTypes" "user_profile_includingnotificationtypes_enum" array`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -328,8 +328,7 @@ export default Vue.extend({
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		async onNotification(notification) {
 | 
							async onNotification(notification) {
 | 
				
			||||||
			const t = this.$store.state.i.includingNotificationTypes;
 | 
								if (this.$store.state.i.mutingNotificationTypes.includes(notification.type)) {
 | 
				
			||||||
			if (!!t && !t.includes(notification.type)) {
 | 
					 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (document.visibilityState === 'visible') {
 | 
								if (document.visibilityState === 'visible') {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,7 @@ export default Vue.extend({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		allIncludeTypes() {
 | 
							allIncludeTypes() {
 | 
				
			||||||
			return this.includeTypes ?? this.$store.state.i.includingNotificationTypes;
 | 
								return this.includeTypes ?? notificationTypes.filter(x => !this.$store.state.i.mutingNotificationTypes.includes(x));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ export default Vue.extend({
 | 
				
			||||||
		includeTypes() {
 | 
							includeTypes() {
 | 
				
			||||||
			this.reload();
 | 
								this.reload();
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		'$store.state.i.includingNotificationTypes'() {
 | 
							'$store.state.i.mutingNotificationTypes'() {
 | 
				
			||||||
			if (this.includeTypes === null) {
 | 
								if (this.includeTypes === null) {
 | 
				
			||||||
				this.reload();
 | 
									this.reload();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -84,8 +84,7 @@ export default Vue.extend({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		onNotification(notification) {
 | 
							onNotification(notification) {
 | 
				
			||||||
			// 
 | 
								const isMuted = !this.allIncludeTypes.includes(notification.type);
 | 
				
			||||||
			const isMuted = !!this.allIncludeTypes && !this.allIncludeTypes.includes(notification.type);
 | 
					 | 
				
			||||||
			if (isMuted || document.visibilityState === 'visible') {
 | 
								if (isMuted || document.visibilityState === 'visible') {
 | 
				
			||||||
				this.$root.stream.send('readNotification', {
 | 
									this.$root.stream.send('readNotification', {
 | 
				
			||||||
					id: notification.id
 | 
										id: notification.id
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,8 +161,7 @@ export default Vue.extend({
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		async onNotification(notification) {
 | 
							async onNotification(notification) {
 | 
				
			||||||
			const t = this.$store.state.i.includingNotificationTypes;
 | 
								if (this.$store.state.i.mutingNotificationTypes.includes(notification.type)) {
 | 
				
			||||||
			if (!!t && !t.includes(notification.type)) {
 | 
					 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,7 @@ import XIntegration from './integration.vue';
 | 
				
			||||||
import XApi from './api.vue';
 | 
					import XApi from './api.vue';
 | 
				
			||||||
import MkButton from '../../components/ui/button.vue';
 | 
					import MkButton from '../../components/ui/button.vue';
 | 
				
			||||||
import MkSwitch from '../../components/ui/switch.vue';
 | 
					import MkSwitch from '../../components/ui/switch.vue';
 | 
				
			||||||
 | 
					import { notificationTypes } from '../../../types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	metaInfo() {
 | 
						metaInfo() {
 | 
				
			||||||
| 
						 | 
					@ -114,14 +115,15 @@ export default Vue.extend({
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		async configure() {
 | 
							async configure() {
 | 
				
			||||||
 | 
								const includingTypes = notificationTypes.filter(x => !this.$store.state.i.mutingNotificationTypes.includes(x));
 | 
				
			||||||
			this.$root.new(await import('../../components/notification-setting-window.vue').then(m => m.default), {
 | 
								this.$root.new(await import('../../components/notification-setting-window.vue').then(m => m.default), {
 | 
				
			||||||
				includingTypes: this.$store.state.i.includingNotificationTypes,
 | 
									includingTypes,
 | 
				
			||||||
				showGlobalToggle: false,
 | 
									showGlobalToggle: false,
 | 
				
			||||||
			}).$on('ok', async ({ includingTypes: value }: any) => {
 | 
								}).$on('ok', async ({ includingTypes: value }: any) => {
 | 
				
			||||||
				await this.$root.api('i/update', {
 | 
									await this.$root.api('i/update', {
 | 
				
			||||||
					includingNotificationTypes: value,
 | 
										mutingNotificationTypes: notificationTypes.filter(x => !value.includes(x)),
 | 
				
			||||||
				}).then(i => {
 | 
									}).then(i => {
 | 
				
			||||||
					this.$store.state.i.includingNotificationTypes = i.includingNotificationTypes;
 | 
										this.$store.state.i.mutingNotificationTypes = i.mutingNotificationTypes;
 | 
				
			||||||
				}).catch(err => {
 | 
									}).catch(err => {
 | 
				
			||||||
					this.$root.dialog({
 | 
										this.$root.dialog({
 | 
				
			||||||
						type: 'error',
 | 
											type: 'error',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -162,9 +162,9 @@ export class UserProfile {
 | 
				
			||||||
	@Column('enum', {
 | 
						@Column('enum', {
 | 
				
			||||||
		enum: notificationTypes,
 | 
							enum: notificationTypes,
 | 
				
			||||||
		array: true,
 | 
							array: true,
 | 
				
			||||||
		nullable: true,
 | 
							default: [],
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	public includingNotificationTypes: typeof notificationTypes[number][] | null;
 | 
						public mutingNotificationTypes: typeof notificationTypes[number][];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//#region Denormalized fields
 | 
						//#region Denormalized fields
 | 
				
			||||||
	@Index()
 | 
						@Index()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,7 +248,7 @@ export class UserRepository extends Repository<User> {
 | 
				
			||||||
				hasPendingReceivedFollowRequest: this.getHasPendingReceivedFollowRequest(user.id),
 | 
									hasPendingReceivedFollowRequest: this.getHasPendingReceivedFollowRequest(user.id),
 | 
				
			||||||
				integrations: profile!.integrations,
 | 
									integrations: profile!.integrations,
 | 
				
			||||||
				mutedWords: profile!.mutedWords,
 | 
									mutedWords: profile!.mutedWords,
 | 
				
			||||||
				includingNotificationTypes: profile?.includingNotificationTypes,
 | 
									mutingNotificationTypes: profile?.mutingNotificationTypes,
 | 
				
			||||||
			} : {}),
 | 
								} : {}),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			...(opts.includeSecrets ? {
 | 
								...(opts.includeSecrets ? {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -149,7 +149,7 @@ export const meta = {
 | 
				
			||||||
			validator: $.optional.arr($.arr($.str))
 | 
								validator: $.optional.arr($.arr($.str))
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		includingNotificationTypes: {
 | 
							mutingNotificationTypes: {
 | 
				
			||||||
			validator: $.optional.arr($.str.or(notificationTypes as unknown as string[]))
 | 
								validator: $.optional.arr($.str.or(notificationTypes as unknown as string[]))
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -206,7 +206,7 @@ export default define(meta, async (ps, user, token) => {
 | 
				
			||||||
		profileUpdates.mutedWords = ps.mutedWords;
 | 
							profileUpdates.mutedWords = ps.mutedWords;
 | 
				
			||||||
		profileUpdates.enableWordMute = ps.mutedWords.length > 0;
 | 
							profileUpdates.enableWordMute = ps.mutedWords.length > 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (ps.includingNotificationTypes !== undefined) profileUpdates.includingNotificationTypes = ps.includingNotificationTypes as typeof notificationTypes[number][];
 | 
						if (ps.mutingNotificationTypes !== undefined) profileUpdates.mutingNotificationTypes = ps.mutingNotificationTypes as typeof notificationTypes[number][];
 | 
				
			||||||
	if (typeof ps.isLocked === 'boolean') updates.isLocked = ps.isLocked;
 | 
						if (typeof ps.isLocked === 'boolean') updates.isLocked = ps.isLocked;
 | 
				
			||||||
	if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot;
 | 
						if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot;
 | 
				
			||||||
	if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot;
 | 
						if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ export async function createNotification(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const profile = await UserProfiles.findOne({ userId: notifieeId });
 | 
						const profile = await UserProfiles.findOne({ userId: notifieeId });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const isMuted = !(profile?.includingNotificationTypes == null || profile?.includingNotificationTypes.includes(type));
 | 
						const isMuted = profile?.mutingNotificationTypes.includes(type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create notification
 | 
						// Create notification
 | 
				
			||||||
	const notification = await Notifications.save({
 | 
						const notification = await Notifications.save({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue