Merge branch 'develop' into vue3
This commit is contained in:
commit
f661cb765a
|
@ -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`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -65,7 +65,13 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする
|
||||||
|
this.$watch('image', () => {
|
||||||
this.hide = this.image.isSensitive && !this.$store.state.device.alwaysShowNsfw;
|
this.hide = this.image.isSensitive && !this.$store.state.device.alwaysShowNsfw;
|
||||||
|
}, {
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onClick() {
|
onClick() {
|
||||||
|
|
|
@ -59,7 +59,7 @@ export default defineComponent({
|
||||||
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ export default defineComponent({
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
@ -85,8 +85,7 @@ export default defineComponent({
|
||||||
|
|
||||||
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') {
|
||||||
os.stream.send('readNotification', {
|
os.stream.send('readNotification', {
|
||||||
id: notification.id
|
id: notification.id
|
||||||
|
|
|
@ -156,8 +156,7 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -326,8 +326,7 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
|
|
||||||
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,6 +58,7 @@ 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 * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { notificationTypes } from '../../../types';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
metaInfo() {
|
metaInfo() {
|
||||||
|
@ -114,14 +115,15 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
|
|
||||||
async configure() {
|
async configure() {
|
||||||
|
const includingTypes = notificationTypes.filter(x => !this.$store.state.i.mutingNotificationTypes.includes(x));
|
||||||
os.modal(await import('@/components/notification-setting-window.vue'), {
|
os.modal(await import('@/components/notification-setting-window.vue'), {
|
||||||
includingTypes: this.$store.state.i.includingNotificationTypes,
|
includingTypes,
|
||||||
showGlobalToggle: false,
|
showGlobalToggle: false,
|
||||||
}).$on('ok', async ({ includingTypes: value }: any) => {
|
}).$on('ok', async ({ includingTypes: value }: any) => {
|
||||||
await os.api('i/update', {
|
await os.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 => {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
|
|
|
@ -16,6 +16,6 @@ export function genId(date?: Date): string {
|
||||||
case 'meidg': return genMeidg(date);
|
case 'meidg': return genMeidg(date);
|
||||||
case 'ulid': return ulid(date.getTime());
|
case 'ulid': return ulid(date.getTime());
|
||||||
case 'objectid': return genObjectId(date);
|
case 'objectid': return genObjectId(date);
|
||||||
default: throw new Error('unknown id generation method');
|
default: throw new Error('unrecognized id generation method');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ? {
|
||||||
|
|
|
@ -66,6 +66,6 @@ async function performOneActivity(actor: IRemoteUser, activity: IObject): Promis
|
||||||
} else if (isFlag(activity)) {
|
} else if (isFlag(activity)) {
|
||||||
await flag(actor, activity);
|
await flag(actor, activity);
|
||||||
} else {
|
} else {
|
||||||
apLogger.warn(`unknown activity type: ${(activity as any).type}`);
|
apLogger.warn(`unrecognized activity type: ${(activity as any).type}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ export default class Resolver {
|
||||||
if (isCollectionOrOrderedCollection(collection)) {
|
if (isCollectionOrOrderedCollection(collection)) {
|
||||||
return collection;
|
return collection;
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`unknown collection type: ${collection.type}`);
|
throw new Error(`unrecognized collection type: ${collection.type}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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…
Reference in New Issue