diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 53760b42..3d730e39 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -235,7 +235,8 @@ "source_already_exists": "This source has been already added", "must_be_valid_url": "The source must be a valid URL", "blocked_users": "Blocked users", - "user_unblocked": "User has been unblocked" + "user_unblocked": "User has been unblocked", + "enable_achievement_notifications": "When an achievement in unlocked" }, "notifications": { "download_complete": "Download complete", diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index 72a941bc..c658ce78 100644 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -234,7 +234,8 @@ "source_already_exists": "Essa fonte já foi adicionada", "must_be_valid_url": "A fonte deve ser uma URL válida", "blocked_users": "Usuários bloqueados", - "user_unblocked": "Usuário desbloqueado" + "user_unblocked": "Usuário desbloqueado", + "enable_achievement_notifications": "Quando uma conquista é desbloqueada" }, "notifications": { "download_complete": "Download concluído", diff --git a/src/main/entity/user-preferences.entity.ts b/src/main/entity/user-preferences.entity.ts index 92db958d..dc6d465d 100644 --- a/src/main/entity/user-preferences.entity.ts +++ b/src/main/entity/user-preferences.entity.ts @@ -26,6 +26,9 @@ export class UserPreferences { @Column("boolean", { default: false }) repackUpdatesNotificationsEnabled: boolean; + @Column("boolean", { default: true }) + achievementNotificationsEnabled: boolean; + @Column("boolean", { default: false }) preferQuitInsteadOfHiding: boolean; diff --git a/src/main/knex-client.ts b/src/main/knex-client.ts index 6530e653..c289eebe 100644 --- a/src/main/knex-client.ts +++ b/src/main/knex-client.ts @@ -7,6 +7,7 @@ import { EnsureRepackUris } from "./migrations/20240915035339_ensure_repack_uris import { app } from "electron"; import { FixMissingColumns } from "./migrations/20240918001920_FixMissingColumns"; import { CreateGameAchievement } from "./migrations/20240919030940_create_game_achievement"; +import { AddAchievementNotificationPreference } from "./migrations/20241013012900_add_achievement_notification_preference"; export type HydraMigration = Knex.Migration & { name: string }; @@ -19,6 +20,7 @@ class MigrationSource implements Knex.MigrationSource { EnsureRepackUris, FixMissingColumns, CreateGameAchievement, + AddAchievementNotificationPreference, ]); } getMigrationName(migration: HydraMigration): string { diff --git a/src/main/migrations/20241013012900_add_achievement_notification_preference.ts b/src/main/migrations/20241013012900_add_achievement_notification_preference.ts new file mode 100644 index 00000000..a4f48265 --- /dev/null +++ b/src/main/migrations/20241013012900_add_achievement_notification_preference.ts @@ -0,0 +1,17 @@ +import type { HydraMigration } from "@main/knex-client"; +import type { Knex } from "knex"; + +export const AddAchievementNotificationPreference: HydraMigration = { + name: "AddAchievementNotificationPreference", + up: (knex: Knex) => { + return knex.schema.alterTable("user_preferences", (table) => { + return table.boolean("achievementNotificationsEnabled").defaultTo(true); + }); + }, + + down: (knex: Knex) => { + return knex.schema.alterTable("user_preferences", (table) => { + return table.dropColumn("achievementNotificationsEnabled"); + }); + }, +}; diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index 6438a413..bf2ee461 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -1,4 +1,8 @@ -import { gameAchievementRepository, gameRepository } from "@main/repository"; +import { + gameAchievementRepository, + gameRepository, + userPreferencesRepository, +} from "@main/repository"; import type { GameShop, UnlockedAchievement } from "@types"; import { WindowManager } from "../window-manager"; import { HydraApi } from "../hydra-api"; @@ -38,12 +42,15 @@ export const mergeAchievements = async ( if (!game) return; - const localGameAchievement = await gameAchievementRepository.findOne({ - where: { - objectId, - shop, - }, - }); + const [localGameAchievement, userPreferences] = await Promise.all([ + gameAchievementRepository.findOne({ + where: { + objectId, + shop, + }, + }), + userPreferencesRepository.findOne({ where: { id: 1 } }), + ]); const unlockedAchievements = JSON.parse( localGameAchievement?.unlockedAchievements || "[]" @@ -64,7 +71,11 @@ export const mergeAchievements = async ( }; }); - if (newAchievements.length && publishNotification) { + if ( + newAchievements.length && + publishNotification && + userPreferences?.achievementNotificationsEnabled + ) { const achievementsInfo = newAchievements .sort((a, b) => { return a.unlockTime - b.unlockTime; diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx index a363f55d..6737c4b7 100644 --- a/src/renderer/src/pages/settings/settings-general.tsx +++ b/src/renderer/src/pages/settings/settings-general.tsx @@ -30,6 +30,7 @@ export function SettingsGeneral() { downloadsPath: "", downloadNotificationsEnabled: false, repackUpdatesNotificationsEnabled: false, + achievementNotificationsEnabled: false, language: "", }); @@ -103,6 +104,8 @@ export function SettingsGeneral() { userPreferences.downloadNotificationsEnabled, repackUpdatesNotificationsEnabled: userPreferences.repackUpdatesNotificationsEnabled, + achievementNotificationsEnabled: + userPreferences.achievementNotificationsEnabled, language: language ?? "en", })); } @@ -155,6 +158,17 @@ export function SettingsGeneral() { }) } /> + + + handleChange({ + achievementNotificationsEnabled: + !form.achievementNotificationsEnabled, + }) + } + /> ); } diff --git a/src/types/index.ts b/src/types/index.ts index 7ef8073a..987e9f32 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -154,6 +154,7 @@ export interface UserPreferences { language: string; downloadNotificationsEnabled: boolean; repackUpdatesNotificationsEnabled: boolean; + achievementNotificationsEnabled: boolean; realDebridApiToken: string | null; preferQuitInsteadOfHiding: boolean; runAtStartup: boolean;