mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
* add drop cap notification * add drop cap notification * add dismissible notification * fix(notification): correct remove icon positioning * track events * add modal * add back files * fix links and add missing analytics * fix rounded borders and hide sub info for subscribers * a/b test * fix comparison * Translated using Weblate (Spanish) Currently translated at 98.2% (55 of 56 strings) Translation: Habitica/Messages Translate-URL: https://translate.habitica.com/projects/habitica/messages/es/ Translated using Weblate (Spanish) Currently translated at 99.4% (179 of 180 strings) Translation: Habitica/Settings Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/ Merge branch 'origin/develop' into Weblate. Translated using Weblate (Spanish) Currently translated at 99.4% (175 of 176 strings) Translation: Habitica/Subscriber Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/ Translated using Weblate (Spanish (Latin America)) Currently translated at 98.6% (359 of 364 strings) Translation: Habitica/Groups Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/ Translated using Weblate (Spanish) Currently translated at 85.7% (151 of 176 strings) Translation: Habitica/Subscriber Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/ Translated using Weblate (Spanish) Currently translated at 95.3% (538 of 564 strings) Translation: Habitica/Backgrounds Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/ Translated using Weblate (Spanish (Latin America)) Currently translated at 98.6% (359 of 364 strings) Translation: Habitica/Groups Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/ Translated using Weblate (French) Currently translated at 100.0% (56 of 56 strings) Translation: Habitica/Messages Translate-URL: https://translate.habitica.com/projects/habitica/messages/fr/ Translated using Weblate (German) Currently translated at 100.0% (56 of 56 strings) Translation: Habitica/Messages Translate-URL: https://translate.habitica.com/projects/habitica/messages/de/ Translated using Weblate (French) Currently translated at 100.0% (718 of 718 strings) Translation: Habitica/Questscontent Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/ Translated using Weblate (German) Currently translated at 100.0% (718 of 718 strings) Translation: Habitica/Questscontent Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/ Translated using Weblate (Czech) Currently translated at 100.0% (56 of 56 strings) Translation: Habitica/Spells Translate-URL: https://translate.habitica.com/projects/habitica/spells/cs/ Translated using Weblate (Japanese) Currently translated at 100.0% (175 of 175 strings) Translation: Habitica/Subscriber Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/ Translated using Weblate (Italian) Currently translated at 100.0% (56 of 56 strings) Translation: Habitica/Messages Translate-URL: https://translate.habitica.com/projects/habitica/messages/it/ Translated using Weblate (Italian) Currently translated at 100.0% (718 of 718 strings) Translation: Habitica/Questscontent Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/ Translated using Weblate (Czech) Currently translated at 100.0% (180 of 180 strings) Translation: Habitica/Settings Translate-URL: https://translate.habitica.com/projects/habitica/settings/cs/ Translated using Weblate (Basque) Currently translated at 100.0% (2 of 2 strings) Translation: Habitica/Noscript Translate-URL: https://translate.habitica.com/projects/habitica/noscript/eu/ Translated using Weblate (Basque) Currently translated at 6.5% (8 of 123 strings) Translation: Habitica/Communityguidelines Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/eu/ Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (56 of 56 strings) Translation: Habitica/Messages Translate-URL: https://translate.habitica.com/projects/habitica/messages/zh_Hans/ Translated using Weblate (Japanese) Currently translated at 100.0% (56 of 56 strings) Translation: Habitica/Messages Translate-URL: https://translate.habitica.com/projects/habitica/messages/ja/ Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (718 of 718 strings) Translation: Habitica/Questscontent Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (718 of 718 strings) Translation: Habitica/Questscontent Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.8% (717 of 718 strings) Translation: Habitica/Questscontent Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/ * clarify a/b test values * add tests * refactor user dropdown * fix hover state * fix user dropdown * fix user menu hierarchy * restore i18n files to release version Co-authored-by: Melior <admin@habitica.com>
131 lines
3.7 KiB
JavaScript
131 lines
3.7 KiB
JavaScript
import _ from 'lodash';
|
|
import mongoose from 'mongoose';
|
|
import { v4 as uuid } from 'uuid';
|
|
import validator from 'validator';
|
|
import baseModel from '../libs/baseModel';
|
|
|
|
const NOTIFICATION_TYPES = [
|
|
'DROPS_ENABLED', // unused
|
|
'REBIRTH_ENABLED',
|
|
'WON_CHALLENGE',
|
|
'STREAK_ACHIEVEMENT',
|
|
'ULTIMATE_GEAR_ACHIEVEMENT',
|
|
'REBIRTH_ACHIEVEMENT',
|
|
'NEW_CONTRIBUTOR_LEVEL',
|
|
'CRON',
|
|
'GROUP_TASK_APPROVAL',
|
|
'GROUP_TASK_APPROVED',
|
|
'GROUP_TASK_ASSIGNED',
|
|
'GROUP_TASK_CLAIMED',
|
|
'GROUP_TASK_NEEDS_WORK',
|
|
'LOGIN_INCENTIVE',
|
|
'GROUP_INVITE_ACCEPTED',
|
|
'SCORED_TASK',
|
|
'BOSS_DAMAGE', // Not used currently but kept to avoid validation errors
|
|
'GIFT_ONE_GET_ONE',
|
|
'GUILD_PROMPT',
|
|
'GUILD_JOINED_ACHIEVEMENT',
|
|
'CHALLENGE_JOINED_ACHIEVEMENT',
|
|
'INVITED_FRIEND_ACHIEVEMENT',
|
|
'CARD_RECEIVED',
|
|
'NEW_MYSTERY_ITEMS',
|
|
'UNALLOCATED_STATS_POINTS',
|
|
'NEW_INBOX_MESSAGE',
|
|
'NEW_STUFF',
|
|
'NEW_CHAT_MESSAGE',
|
|
'LEVELED_UP', // Not in use
|
|
'FIRST_DROPS',
|
|
'ONBOARDING_COMPLETE',
|
|
'ACHIEVEMENT_ALL_YOUR_BASE',
|
|
'ACHIEVEMENT_BACK_TO_BASICS',
|
|
'ACHIEVEMENT_JUST_ADD_WATER',
|
|
'ACHIEVEMENT_LOST_MASTERCLASSER',
|
|
'ACHIEVEMENT_MIND_OVER_MATTER',
|
|
'ACHIEVEMENT_DUST_DEVIL',
|
|
'ACHIEVEMENT_ARID_AUTHORITY',
|
|
'ACHIEVEMENT_PARTY_UP',
|
|
'ACHIEVEMENT_PARTY_ON',
|
|
'ACHIEVEMENT_BEAST_MASTER',
|
|
'ACHIEVEMENT_MOUNT_MASTER',
|
|
'ACHIEVEMENT_TRIAD_BINGO',
|
|
'ACHIEVEMENT_MONSTER_MAGUS',
|
|
'ACHIEVEMENT_UNDEAD_UNDERTAKER',
|
|
'ACHIEVEMENT_PRIMED_FOR_PAINTING',
|
|
'ACHIEVEMENT_PEARLY_PRO',
|
|
'ACHIEVEMENT_TICKLED_PINK',
|
|
'ACHIEVEMENT_ROSY_OUTLOOK',
|
|
'ACHIEVEMENT_BUG_BONANZA',
|
|
'ACHIEVEMENT_BARE_NECESSITIES',
|
|
'ACHIEVEMENT_FRESHWATER_FRIENDS',
|
|
'ACHIEVEMENT_GOOD_AS_GOLD',
|
|
'ACHIEVEMENT_ALL_THAT_GLITTERS',
|
|
'ACHIEVEMENT', // generic achievement notification, details inside `notification.data`
|
|
'DROP_CAP_REACHED',
|
|
];
|
|
|
|
const { Schema } = mongoose;
|
|
|
|
export const schema = new Schema({
|
|
id: {
|
|
$type: String,
|
|
default: uuid,
|
|
validate: [v => validator.isUUID(v), 'Invalid uuid for userNotification.'],
|
|
required: true,
|
|
},
|
|
type: {
|
|
$type: String,
|
|
required: true,
|
|
enum: NOTIFICATION_TYPES,
|
|
},
|
|
data: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
// A field to mark the notification as seen without deleting it, optional use
|
|
seen: {
|
|
$type: Boolean,
|
|
// required: true,
|
|
default: () => false,
|
|
},
|
|
}, {
|
|
strict: true,
|
|
minimize: false, // So empty objects are returned
|
|
_id: false, // use id instead of _id,
|
|
typeKey: '$type', // So that we can use fields named `type`
|
|
});
|
|
|
|
/**
|
|
* Remove invalid data from an array of notifications.
|
|
* Fix for https://github.com/HabitRPG/habitica/issues/9923
|
|
* Called by user's post init hook (models/user/hooks.js)
|
|
*/
|
|
schema.statics.cleanupCorruptData = function cleanupCorruptNotificationsData (notifications) {
|
|
if (!notifications) return notifications;
|
|
|
|
let filteredNotifications = notifications.filter(notification => {
|
|
// Exclude notifications with a nullish value, no id or no type
|
|
if (!notification || !notification.id || !notification.type) return false;
|
|
return true;
|
|
});
|
|
|
|
// Remove duplicate NEW_CHAT_MESSAGES notifications
|
|
// can be caused by a race condition when adding a new notification of this type
|
|
// in group.sendChat if two messages are posted at the same time
|
|
filteredNotifications = _.uniqWith(filteredNotifications, (val, otherVal) => {
|
|
if (val.type === 'NEW_CHAT_MESSAGE' && val.type === otherVal.type) {
|
|
return val.data.group.id === otherVal.data.group.id;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
return filteredNotifications;
|
|
};
|
|
|
|
schema.plugin(baseModel, {
|
|
noSet: ['_id', 'id'],
|
|
// timestamps: true, // Temporarily removed to debug a possible bug
|
|
_id: false, // use id instead of _id
|
|
});
|
|
|
|
export const model = mongoose.model('UserNotification', schema);
|