From 2952d448843e9ebe601945b6a8b9a30e30c92dfe Mon Sep 17 00:00:00 2001 From: Leandro Perin Date: Tue, 4 Feb 2025 19:05:11 -0300 Subject: [PATCH 1/7] feat: favorites --- src/locales/be/translation.json | 3 +- src/locales/bg/translation.json | 3 +- src/locales/ca/translation.json | 3 +- src/locales/cs/translation.json | 3 +- src/locales/da/translation.json | 3 +- src/locales/de/translation.json | 3 +- src/locales/en/translation.json | 4 +- src/locales/es/translation.json | 3 +- src/locales/et/translation.json | 3 +- src/locales/fa/translation.json | 3 +- src/locales/fr/translation.json | 4 +- src/locales/hu/translation.json | 3 +- src/locales/id/translation.json | 3 +- src/locales/it/translation.json | 3 +- src/locales/kk/translation.json | 3 +- src/locales/ko/translation.json | 3 +- src/locales/nb/translation.json | 3 +- src/locales/nl/translation.json | 3 +- src/locales/pl/translation.json | 3 +- src/locales/pt-BR/translation.json | 4 +- src/locales/pt-PT/translation.json | 4 +- src/locales/ro/translation.json | 3 +- src/locales/ru/translation.json | 3 +- src/locales/tr/translation.json | 3 +- src/locales/uk/translation.json | 3 +- src/locales/zh/translation.json | 3 +- src/main/events/index.ts | 2 + .../events/library/add-game-to-favorites.ts | 21 ++++ .../library/remove-game-from-favorites.ts | 21 ++++ src/preload/index.ts | 5 + .../src/components/sidebar/sidebar.tsx | 106 +++++++++++++----- src/renderer/src/declaration.d.ts | 5 + .../game-details/hero/hero-panel-actions.tsx | 36 ++++++ src/types/level.types.ts | 1 + 34 files changed, 222 insertions(+), 57 deletions(-) create mode 100644 src/main/events/library/add-game-to-favorites.ts create mode 100644 src/main/events/library/remove-game-from-favorites.ts diff --git a/src/locales/be/translation.json b/src/locales/be/translation.json index 6618e4f3..3c03e8bc 100644 --- a/src/locales/be/translation.json +++ b/src/locales/be/translation.json @@ -72,7 +72,8 @@ "change": "Змяніць", "repacks_modal_description": "Абярыце рэпак, які хочаце сцягнуць", "select_folder_hint": "Каб змяніць папку па змоўчанні, адкрыйце", - "download_now": "Сцягнуць зараз" + "download_now": "Сцягнуць зараз", + "favorites": "Улюбленыя" }, "activation": { "title": "Актываваць Hydra", diff --git a/src/locales/bg/translation.json b/src/locales/bg/translation.json index 857d3ed4..7f5bc6a4 100644 --- a/src/locales/bg/translation.json +++ b/src/locales/bg/translation.json @@ -176,7 +176,8 @@ "manage_files_description": "Управлявайте кои файлове ще бъдат архивирани и възстановени", "select_folder": "Избери папка", "backup_from": "Резервно копие от {{date}}", - "custom_backup_location_set": "Задаване на персонализирано местоположение за архивиране" + "custom_backup_location_set": "Задаване на персонализирано местоположение за архивиране", + "favorites": "Любими игри" }, "activation": { "title": "Активирай Hydra", diff --git a/src/locales/ca/translation.json b/src/locales/ca/translation.json index 6d689f2b..d341e685 100644 --- a/src/locales/ca/translation.json +++ b/src/locales/ca/translation.json @@ -113,7 +113,8 @@ "download_paused": "Descàrrega en pausa", "last_downloaded_option": "Opció de l'última descàrrega", "create_shortcut_success": "Accés directe creat satisfactòriament", - "create_shortcut_error": "Error al crear l'accés directe" + "create_shortcut_error": "Error al crear l'accés directe", + "favorites": "Favorits" }, "activation": { "title": "Activa l'Hydra", diff --git a/src/locales/cs/translation.json b/src/locales/cs/translation.json index b3543f94..62ce1952 100644 --- a/src/locales/cs/translation.json +++ b/src/locales/cs/translation.json @@ -166,7 +166,8 @@ "manage_files_description": "Spravovat, které soubory budou zálohovány a obnoveny", "select_folder": "Vybrat složku", "backup_from": "Zálohy z {{date}}", - "custom_backup_location_set": "Vlastní umístění záloh nastaveno" + "custom_backup_location_set": "Vlastní umístění záloh nastaveno", + "favorites": "Oblíbené" }, "activation": { "title": "Aktivovat hydru", diff --git a/src/locales/da/translation.json b/src/locales/da/translation.json index 9a7c700f..761fefac 100644 --- a/src/locales/da/translation.json +++ b/src/locales/da/translation.json @@ -129,7 +129,8 @@ "download": "Download", "executable_path_in_use": "Eksekverbar allerede i brug af \"{{game}}\"", "warning": "Advarsel:", - "hydra_needs_to_remain_open": "Hydra skal forblive åbent for at denne download kan gennemføres. I tilfælde af at Hydra lukker før downloaden er færdig, mister du dit fremskridt." + "hydra_needs_to_remain_open": "Hydra skal forblive åbent for at denne download kan gennemføres. I tilfælde af at Hydra lukker før downloaden er færdig, mister du dit fremskridt.", + "favorites": "Favoriter" }, "activation": { "title": "Aktivér Hydra", diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json index c94b0913..bbc37fcd 100644 --- a/src/locales/de/translation.json +++ b/src/locales/de/translation.json @@ -113,7 +113,8 @@ "download_paused": "Download ist pausiert", "last_downloaded_option": "Letzte Download-Option", "create_shortcut_success": "Verknüpfung erfolgreich erstellt", - "create_shortcut_error": "Fehler bei Erstellung von Verknüpfung" + "create_shortcut_error": "Fehler bei Erstellung von Verknüpfung", + "favorites": "Favoriten" }, "activation": { "title": "Hydra aktivieren", diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index bbe922f2..8a573cf7 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -188,8 +188,10 @@ "download_error_gofile_quota_exceeded": "You have exceeded your Gofile monthly quota. Please await the quota to reset.", "download_error_real_debrid_account_not_authorized": "Your Real-Debrid account is not authorized to make new downloads. Please check your account settings and try again.", "download_error_not_cached_in_real_debrid": "This download is not available on Real-Debrid and polling download status from Real-Debrid is not yet available.", - "download_error_not_cached_in_torbox": "This download is not available on Torbox and polling download status from Torbox is not yet available." + "download_error_not_cached_in_torbox": "This download is not available on Torbox and polling download status from Torbox is not yet available.", + "favorites": "Favorites" }, + "activation": { "title": "Activate Hydra", "installation_id": "Installation ID:", diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 43839e9e..3c0c02c1 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -184,7 +184,8 @@ "reset_achievements_description": "Esto reiniciará todos los logros de {{game}}", "reset_achievements_title": "¿Estás seguro?", "reset_achievements_success": "Logros reiniciados exitosamente", - "reset_achievements_error": "Se produjo un error al reiniciar los logros" + "reset_achievements_error": "Se produjo un error al reiniciar los logros", + "favorites": "Favorites" }, "activation": { "title": "Activar Hydra", diff --git a/src/locales/et/translation.json b/src/locales/et/translation.json index 97e69a90..f87933a2 100644 --- a/src/locales/et/translation.json +++ b/src/locales/et/translation.json @@ -165,7 +165,8 @@ "manage_files_description": "Hallake, millised failid varundatakse ja taastatakse", "select_folder": "Vali kaust", "backup_from": "Varundamine kuupäevast {{date}}", - "custom_backup_location_set": "Kohandatud varundamise asukoht määratud" + "custom_backup_location_set": "Kohandatud varundamise asukoht määratud", + "favorites": "Töölist" }, "activation": { "title": "Aktiveeri Hydra", diff --git a/src/locales/fa/translation.json b/src/locales/fa/translation.json index 9d4f7280..92d80cab 100644 --- a/src/locales/fa/translation.json +++ b/src/locales/fa/translation.json @@ -72,7 +72,8 @@ "change": "تغییر", "repacks_modal_description": "ریپک مورد نظر برای دانلود را انتخاب کنید", "select_folder_hint": "برای تغییر پوشه‌ی پیش‌فرض به <0>Settings بروید", - "download_now": "الان دانلود کن" + "download_now": "الان دانلود کن", + "favorites": "علاقه‌مندی‌ها" }, "activation": { "title": "فعال کردن هایدرا", diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index 4d310681..6ca4eaec 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -64,10 +64,12 @@ "close": "Fermer", "deleting": "Suppression du programme d'installation…", "playing_now": "Jeu en cours", - "last_time_played": "Dernièrement joué {{period}}" + "last_time_played": "Dernièrement joué {{period}}", + "favorites": "Favoris" }, "activation": { "title": "Activer Hydra", + "installation_id": "ID d'installation :", "enter_activation_code": "Entrez votre code d'activation", "message": "Si vous ne savez pas où demander ceci, vous ne devriez pas l'avoir.", diff --git a/src/locales/hu/translation.json b/src/locales/hu/translation.json index 0863d1e8..e428880c 100644 --- a/src/locales/hu/translation.json +++ b/src/locales/hu/translation.json @@ -72,7 +72,8 @@ "change": "Változtatás", "repacks_modal_description": "Choose the repack you want to download", "select_folder_hint": "Ahhoz, hogy megváltoztasd a helyet, hozzákell férned a", - "download_now": "Töltsd le most" + "download_now": "Töltsd le most", + "favorites": "Kedvenc játékok" }, "activation": { "title": "Hydra Aktiválása", diff --git a/src/locales/id/translation.json b/src/locales/id/translation.json index a813d770..1d443c0a 100644 --- a/src/locales/id/translation.json +++ b/src/locales/id/translation.json @@ -113,7 +113,8 @@ "download_paused": "Unduhan dijeda", "last_downloaded_option": "Opsi terakhir diunduh", "create_shortcut_success": "Pintasan berhasil dibuat", - "create_shortcut_error": "Gagal membuat pintasan" + "create_shortcut_error": "Gagal membuat pintasan", + "favorites": "Favorit" }, "activation": { "title": "Aktifkan Hydra", diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json index 742f889f..cb2d1947 100644 --- a/src/locales/it/translation.json +++ b/src/locales/it/translation.json @@ -79,7 +79,8 @@ "previous_screenshot": "Screenshot precedente", "next_screenshot": "Screenshot successivo", "screenshot": "Screenshot {{number}}", - "open_screenshot": "Apri screenshot {{number}}" + "open_screenshot": "Apri screenshot {{number}}", + "favorites": "Preferiti" }, "activation": { "title": "Attiva Hydra", diff --git a/src/locales/kk/translation.json b/src/locales/kk/translation.json index e66cd5ed..2edc6328 100644 --- a/src/locales/kk/translation.json +++ b/src/locales/kk/translation.json @@ -112,7 +112,8 @@ "download_paused": "Жүктеу тоқтатылды", "last_downloaded_option": "Соңғы жүктеу нұсқасы", "create_shortcut_success": "Жарлық жасалды", - "create_shortcut_error": "Жарлық жасау мүмкін болмады" + "create_shortcut_error": "Жарлық жасау мүмкін болмады", + "favorites": "Қолданған" }, "activation": { "title": "Hydra-ны белсендіру", diff --git a/src/locales/ko/translation.json b/src/locales/ko/translation.json index bc8e6056..6dcf9aaf 100644 --- a/src/locales/ko/translation.json +++ b/src/locales/ko/translation.json @@ -72,7 +72,8 @@ "change": "바꾸기", "repacks_modal_description": "다운로드 할 리팩을 선택해 주세요", "select_folder_hint": "기본 폴더를 바꾸려면 <0>설정으로 가세요", - "download_now": "지금 다운로드" + "download_now": "지금 다운로드", + "favorites": "즐겨찾기" }, "activation": { "title": "Hydra 실행", diff --git a/src/locales/nb/translation.json b/src/locales/nb/translation.json index a6fb1bcc..463b6503 100644 --- a/src/locales/nb/translation.json +++ b/src/locales/nb/translation.json @@ -129,7 +129,8 @@ "download": "Last ned", "executable_path_in_use": "Kjørbar fil blir allerede brukt av \"{{game}}\"", "warning": "Advarsel:", - "hydra_needs_to_remain_open": "Hydra skal forbli åpent for at denne nedlastingen kan gjennomføres. I tilfelle av at Hydra lukker før nedlastingen er ferdig, mister du fremskrittet ditt." + "hydra_needs_to_remain_open": "Hydra skal forbli åpent for at denne nedlastingen kan gjennomføres. I tilfelle av at Hydra lukker før nedlastingen er ferdig, mister du fremskrittet ditt.", + "favorites": "Favoritter" }, "activation": { "title": "Aktivér Hydra", diff --git a/src/locales/nl/translation.json b/src/locales/nl/translation.json index 6d9de5fa..05ecc542 100644 --- a/src/locales/nl/translation.json +++ b/src/locales/nl/translation.json @@ -72,7 +72,8 @@ "change": "Verander", "repacks_modal_description": "Kies de herverpakking die u wilt downloaden", "select_folder_hint": "Om de standaardmap te wijzigen, gaat u naar <0>instellingen", - "download_now": "Download nu" + "download_now": "Download nu", + "favorites": "Favorieten" }, "activation": { "title": "Activeer Hydra", diff --git a/src/locales/pl/translation.json b/src/locales/pl/translation.json index bdaf822c..add0cbda 100644 --- a/src/locales/pl/translation.json +++ b/src/locales/pl/translation.json @@ -79,7 +79,8 @@ "previous_screenshot": "Poprzedni zrzut ekranu", "next_screenshot": "Następny zrzut ekranu", "screenshot": "Zrzut ekranu {{number}}", - "open_screenshot": "Otwórz zrzut ekranu {{number}}" + "open_screenshot": "Otwórz zrzut ekranu {{number}}", + "favorites": "Ulubione" }, "activation": { "title": "Aktywuj Hydra", diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index b34f1874..9526eadd 100644 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -177,8 +177,10 @@ "download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde a cota resetar.", "download_error_real_debrid_account_not_authorized": "Sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique sua assinatura e tente novamente.", "download_error_not_cached_in_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.", - "download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível." + "download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível.", + "favorites": "Favoritos" }, + "activation": { "title": "Ativação", "installation_id": "ID da instalação:", diff --git a/src/locales/pt-PT/translation.json b/src/locales/pt-PT/translation.json index 3b8496ae..a89c8be7 100644 --- a/src/locales/pt-PT/translation.json +++ b/src/locales/pt-PT/translation.json @@ -157,8 +157,10 @@ "no_download_option_info": "Sem informações disponíveis", "backup_deletion_failed": "Falha ao apagar o backup", "max_number_of_artifacts_reached": "Número máximo de backups atingido para este jogo", - "achievements_not_sync": "As tuas conquistas não estão sincronizadas" + "achievements_not_sync": "As tuas conquistas não estão sincronizadas", + "favorites": "Favoritos" }, + "activation": { "title": "Ativação", "installation_id": "ID da instalação:", diff --git a/src/locales/ro/translation.json b/src/locales/ro/translation.json index 9003ecc6..d46f049f 100644 --- a/src/locales/ro/translation.json +++ b/src/locales/ro/translation.json @@ -84,7 +84,8 @@ "screenshot": "Captură de ecran {{number}}", "open_screenshot": "Deschide captura de ecran {{number}}", "download_settings": "Setări de descărcare", - "downloader": "Program de descărcare" + "downloader": "Program de descărcare", + "favorites": "Favorite" }, "activation": { "title": "Activează Hydra", diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index 18b8f1f5..1639cf8c 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -182,7 +182,8 @@ "no_write_permission": "Невозможно загрузить в эту директорию. Нажмите здесь, чтобы узнать больше.", "reset_achievements_title": "Вы уверены?", "reset_achievements_success": "Достижения успешно сброшены", - "reset_achievements_error": "Не удалось сбросить достижения" + "reset_achievements_error": "Не удалось сбросить достижения", + "favorites": "Избранное" }, "activation": { "title": "Активировать Hydra", diff --git a/src/locales/tr/translation.json b/src/locales/tr/translation.json index 9095b693..3423704d 100644 --- a/src/locales/tr/translation.json +++ b/src/locales/tr/translation.json @@ -184,7 +184,8 @@ "reset_achievements_description": "Bu işlem {{game}} için tüm başarıları sıfırlar", "reset_achievements_title": "Emin misiniz?", "reset_achievements_success": "Başarılar başarıyla sıfırlandı", - "reset_achievements_error": "Başarılar sıfırlanamadı" + "reset_achievements_error": "Başarılar sıfırlanamadı", + "favorites": "Favoriler" }, "activation": { "title": "Hydra'yı Aktive Et", diff --git a/src/locales/uk/translation.json b/src/locales/uk/translation.json index 174e768c..919560a6 100644 --- a/src/locales/uk/translation.json +++ b/src/locales/uk/translation.json @@ -110,7 +110,8 @@ "remove_from_library_description": "{{game}} буде видалено з вашої бібліотеки", "remove_from_library_title": "Ви впевнені?", "screenshot": "Скріншот", - "select_executable": "Обрати" + "select_executable": "Обрати", + "favorites": "Улюблені" }, "activation": { "title": "Активувати Hydra", diff --git a/src/locales/zh/translation.json b/src/locales/zh/translation.json index ba48a21b..3c99d774 100644 --- a/src/locales/zh/translation.json +++ b/src/locales/zh/translation.json @@ -165,7 +165,8 @@ "manage_files_description": "管理哪些文件要备份和恢复", "select_folder": "选择文件夹", "backup_from": "{{date}} 时备份", - "custom_backup_location_set": "自定义备份文件位置" + "custom_backup_location_set": "自定义备份文件位置", + "favorites": "收藏" }, "activation": { "title": "激活 Hydra", diff --git a/src/main/events/index.ts b/src/main/events/index.ts index 570fa378..dc64b40e 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -13,6 +13,8 @@ import "./catalogue/get-developers"; import "./hardware/get-disk-free-space"; import "./hardware/check-folder-write-permission"; import "./library/add-game-to-library"; +import "./library/add-game-to-favorites"; +import "./library/remove-game-from-favorites"; import "./library/create-game-shortcut"; import "./library/close-game"; import "./library/delete-game-folder"; diff --git a/src/main/events/library/add-game-to-favorites.ts b/src/main/events/library/add-game-to-favorites.ts new file mode 100644 index 00000000..93237541 --- /dev/null +++ b/src/main/events/library/add-game-to-favorites.ts @@ -0,0 +1,21 @@ +import { registerEvent } from "../register-event"; +import { gamesSublevel, levelKeys } from "@main/level"; +import type { GameShop } from "@types"; + +const addGameToFavorites = async ( + _event: Electron.IpcMainInvokeEvent, + shop: GameShop, + objectId: string +) => { + const gameKey = levelKeys.game(shop, objectId); + + const game = await gamesSublevel.get(gameKey); + if (!game) return; + + await gamesSublevel.put(gameKey, { + ...game, + favorite: true, + }); +}; + +registerEvent("addGameToFavorites", addGameToFavorites); diff --git a/src/main/events/library/remove-game-from-favorites.ts b/src/main/events/library/remove-game-from-favorites.ts new file mode 100644 index 00000000..9e592314 --- /dev/null +++ b/src/main/events/library/remove-game-from-favorites.ts @@ -0,0 +1,21 @@ +import { registerEvent } from "../register-event"; +import { gamesSublevel, levelKeys } from "@main/level"; +import type { GameShop } from "@types"; + +const removeGameFromFavorites = async ( + _event: Electron.IpcMainInvokeEvent, + shop: GameShop, + objectId: string +) => { + const gameKey = levelKeys.game(shop, objectId); + + const game = await gamesSublevel.get(gameKey); + if (!game) return; + + await gamesSublevel.put(gameKey, { + ...game, + favorite: false, + }); +}; + +registerEvent("removeGameFromFavorites", removeGameFromFavorites); diff --git a/src/preload/index.ts b/src/preload/index.ts index e1393269..ef61cbb9 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -110,11 +110,16 @@ contextBridge.exposeInMainWorld("electron", { executablePath: string | null ) => ipcRenderer.invoke("updateExecutablePath", shop, objectId, executablePath), + addGameToFavorites: (shop: GameShop, objectId: string) => + ipcRenderer.invoke("addGameToFavorites", shop, objectId), + removeGameFromFavorites: (shop: GameShop, objectId: string) => + ipcRenderer.invoke("removeGameFromFavorites", shop, objectId), updateLaunchOptions: ( shop: GameShop, objectId: string, launchOptions: string | null ) => ipcRenderer.invoke("updateLaunchOptions", shop, objectId, launchOptions), + selectGameWinePrefix: ( shop: GameShop, objectId: string, diff --git a/src/renderer/src/components/sidebar/sidebar.tsx b/src/renderer/src/components/sidebar/sidebar.tsx index 5801de37..816bbdb0 100644 --- a/src/renderer/src/components/sidebar/sidebar.tsx +++ b/src/renderer/src/components/sidebar/sidebar.tsx @@ -206,6 +206,48 @@ export function Sidebar() { +
+ {t("favorites")} + + +
+
{t("my_library")} @@ -217,39 +259,41 @@ export function Sidebar() { />
diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index ab485359..8e31aa83 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -96,6 +96,11 @@ declare global { objectId: string, executablePath: string | null ) => Promise; + addGameToFavorites: (shop: GameShop, objectId: string) => Promise; + removeGameFromFavorites: ( + shop: GameShop, + objectId: string + ) => Promise; updateLaunchOptions: ( shop: GameShop, objectId: string, diff --git a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx index 68290313..f2884a1f 100644 --- a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx +++ b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx @@ -1,6 +1,8 @@ import { DownloadIcon, GearIcon, + HeartFillIcon, + HeartIcon, PlayIcon, PlusCircleIcon, } from "@primer/octicons-react"; @@ -52,6 +54,30 @@ export function HeroPanelActions() { } }; + const addGameToFavorites = async () => { + setToggleLibraryGameDisabled(true); + + try { + await window.electron.addGameToFavorites(shop, objectId!); + updateLibrary(); + updateGame(); + } finally { + setToggleLibraryGameDisabled(false); + } + }; + + const removeGameFromFavorites = async () => { + setToggleLibraryGameDisabled(true); + + try { + await window.electron.removeGameFromFavorites(shop, objectId!); + updateLibrary(); + updateGame(); + } finally { + setToggleLibraryGameDisabled(false); + } + }; + const openGame = async () => { if (game) { if (game.executablePath) { @@ -159,6 +185,16 @@ export function HeroPanelActions() {
{gameActionButton()}
+ + + + + ); + return (