diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 0c1ed914..d5a0708c 100755 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -219,6 +219,7 @@ "uploading_backup": "Uploading backup…", "no_backups": "You haven't created any backups for this game yet", "backup_uploaded": "Backup uploaded", + "backup_failed": "Backup failed", "backup_deleted": "Backup deleted", "backup_restored": "Backup restored", "see_all_achievements": "See all achievements", diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 6f0fc9f1..226f77af 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -204,6 +204,7 @@ "uploading_backup": "Subiendo copia de seguridad…", "no_backups": "No has creado ninguna copia de seguridad para este juego todavía", "backup_uploaded": "Copia de seguridad subida", + "backup_failed": "Copia de seguridad fallida", "backup_deleted": "Copia de seguridad eliminada", "backup_restored": "Copia de seguridad restaurada", "see_all_achievements": "Ver todos los logros", diff --git a/src/locales/pt-PT/translation.json b/src/locales/pt-PT/translation.json index 654e94ec..d36e3083 100644 --- a/src/locales/pt-PT/translation.json +++ b/src/locales/pt-PT/translation.json @@ -142,6 +142,7 @@ "uploading_backup": "A criar backup…", "no_backups": "Ainda não fizeste nenhum backup deste jogo", "backup_uploaded": "Backup criado", + "backup_failed": "Falha ao criar backup", "backup_deleted": "Backup apagado", "backup_restored": "Backup restaurado", "see_all_achievements": "Ver todas as conquistas", diff --git a/src/main/services/cloud-sync.ts b/src/main/services/cloud-sync.ts index 6da24ce1..200a5ee3 100644 --- a/src/main/services/cloud-sync.ts +++ b/src/main/services/cloud-sync.ts @@ -80,7 +80,7 @@ export class CloudSync { try { await fs.promises.rm(backupPath, { recursive: true }); } catch (error) { - logger.error("Failed to remove backup path", error); + logger.error("Failed to remove backup path", { backupPath, error }); } } @@ -163,7 +163,7 @@ export class CloudSync { try { await fs.promises.unlink(bundleLocation); } catch (error) { - logger.error("Failed to remove tar file", error); + logger.error("Failed to remove tar file", { bundleLocation, error }); } } } diff --git a/src/main/services/library-sync/merge-with-remote-games.ts b/src/main/services/library-sync/merge-with-remote-games.ts index b5b2d551..68b4b835 100644 --- a/src/main/services/library-sync/merge-with-remote-games.ts +++ b/src/main/services/library-sync/merge-with-remote-games.ts @@ -22,7 +22,8 @@ export const mergeWithRemoteGames = async () => { const updatedLastTimePlayed = localGame.lastTimePlayed == null || (game.lastTimePlayed && - new Date(game.lastTimePlayed) > localGame.lastTimePlayed) + new Date(game.lastTimePlayed) > + new Date(localGame.lastTimePlayed)) ? game.lastTimePlayed : localGame.lastTimePlayed; diff --git a/src/main/services/steam.ts b/src/main/services/steam.ts index bc867111..886772b5 100644 --- a/src/main/services/steam.ts +++ b/src/main/services/steam.ts @@ -19,7 +19,12 @@ export interface SteamAppDetailsResponse { export const getSteamLocation = async () => { if (process.platform === "linux") { - return path.join(SystemPath.getPath("home"), ".local", "share", "Steam"); + const possiblePaths = [ + path.join(SystemPath.getPath("home"), ".steam", "steam"), + path.join(SystemPath.getPath("home"), ".local", "share", "Steam"), + ]; + + return possiblePaths.find((p) => fs.existsSync(p)) || possiblePaths[0]; } if (process.platform === "darwin") { @@ -76,7 +81,11 @@ export const getSteamAppDetails = async ( return null; }) .catch((err) => { - logger.error(err, { method: "getSteamAppDetails" }); + logger.error("Error on getSteamAppDetails", { + message: err?.message, + code: err?.code, + name: err?.name, + }); return null; }); }; diff --git a/src/renderer/src/components/confirm-modal/confirm-modal.tsx b/src/renderer/src/components/confirm-modal/confirm-modal.tsx index d210c035..75a8f5c9 100644 --- a/src/renderer/src/components/confirm-modal/confirm-modal.tsx +++ b/src/renderer/src/components/confirm-modal/confirm-modal.tsx @@ -33,9 +33,18 @@ export function ConfirmModal({ }; return ( - +
- diff --git a/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx b/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx index f9287a11..e1ea9e2f 100644 --- a/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx +++ b/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx @@ -87,7 +87,7 @@ export function CloudSyncContextProvider({ const [loadingPreview, setLoadingPreview] = useState(false); const [freezingArtifact, setFreezingArtifact] = useState(false); - const { showSuccessToast } = useToast(); + const { showSuccessToast, showErrorToast } = useToast(); const downloadGameArtifact = useCallback( async (gameArtifactId: string) => { @@ -122,9 +122,15 @@ export function CloudSyncContextProvider({ const uploadSaveGame = useCallback( async (downloadOptionTitle: string | null) => { setUploadingBackup(true); - window.electron.uploadSaveGame(objectId, shop, downloadOptionTitle); + window.electron + .uploadSaveGame(objectId, shop, downloadOptionTitle) + .catch((err) => { + setUploadingBackup(false); + logger.error("Failed to upload save game", { objectId, shop, err }); + showErrorToast(t("backup_failed")); + }); }, - [objectId, shop] + [objectId, shop, t, showErrorToast] ); const toggleArtifactFreeze = useCallback( diff --git a/src/renderer/src/context/game-details/game-details.context.tsx b/src/renderer/src/context/game-details/game-details.context.tsx index 23ea3845..5be5cf98 100644 --- a/src/renderer/src/context/game-details/game-details.context.tsx +++ b/src/renderer/src/context/game-details/game-details.context.tsx @@ -201,7 +201,8 @@ export function GameDetailsContextProvider({ }, [objectId, gameTitle, dispatch]); useEffect(() => { - const state = (location && (location.state as Record)) || {}; + const state = + (location && (location.state as Record)) || {}; if (state.openRepacks) { setShowRepacksModal(true); try { 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 ac8a1615..e23120a8 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 @@ -69,14 +69,32 @@ export function HeroPanelActions() { updateGame(); }; - window.addEventListener("hydra:game-favorite-toggled", onFavoriteToggled as EventListener); - window.addEventListener("hydra:game-removed-from-library", onGameRemoved as EventListener); - window.addEventListener("hydra:game-files-removed", onFilesRemoved as EventListener); + window.addEventListener( + "hydra:game-favorite-toggled", + onFavoriteToggled as EventListener + ); + window.addEventListener( + "hydra:game-removed-from-library", + onGameRemoved as EventListener + ); + window.addEventListener( + "hydra:game-files-removed", + onFilesRemoved as EventListener + ); return () => { - window.removeEventListener("hydra:game-favorite-toggled", onFavoriteToggled as EventListener); - window.removeEventListener("hydra:game-removed-from-library", onGameRemoved as EventListener); - window.removeEventListener("hydra:game-files-removed", onFilesRemoved as EventListener); + window.removeEventListener( + "hydra:game-favorite-toggled", + onFavoriteToggled as EventListener + ); + window.removeEventListener( + "hydra:game-removed-from-library", + onGameRemoved as EventListener + ); + window.removeEventListener( + "hydra:game-files-removed", + onFilesRemoved as EventListener + ); }; }, [updateLibrary, updateGame]); @@ -226,7 +244,7 @@ export function HeroPanelActions() { onClick={() => setShowRepacksModal(true)} theme="outline" disabled={isGameDownloading} - className={`hero-panel-actions__action ${!repacks.length ? 'hero-panel-actions__action--disabled' : ''}`} + className={`hero-panel-actions__action ${!repacks.length ? "hero-panel-actions__action--disabled" : ""}`} > {t("download")} diff --git a/src/renderer/src/pages/game-details/modals/repacks-modal.tsx b/src/renderer/src/pages/game-details/modals/repacks-modal.tsx index ec7dc3f8..97b8b1b5 100644 --- a/src/renderer/src/pages/game-details/modals/repacks-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/repacks-modal.tsx @@ -277,4 +277,4 @@ export function RepacksModal({ ); -} \ No newline at end of file +}