fix: formatting

This commit is contained in:
Moyasee
2025-10-30 23:26:22 +02:00
parent 101bc35460
commit 4dd3c9de76
8 changed files with 108 additions and 55 deletions

View File

@@ -11,6 +11,8 @@ export const getLastDownloadSourcesCheck = async (): Promise<string | null> => {
}
};
export const updateLastDownloadSourcesCheck = async (timestamp: string): Promise<void> => {
export const updateLastDownloadSourcesCheck = async (
timestamp: string
): Promise<void> => {
await db.put(levelKeys.lastDownloadSourcesCheck, timestamp);
};
};

View File

@@ -57,7 +57,7 @@ export const loadState = async () => {
const { syncDownloadSourcesFromApi } = await import("./services/user");
void syncDownloadSourcesFromApi();
// Check for new download options on startup
void DownloadSourcesChecker.checkForChanges();
// WSClient.connect();

View File

@@ -1,5 +1,10 @@
import { HydraApi } from "./hydra-api";
import { gamesSublevel, getLastDownloadSourcesCheck, updateLastDownloadSourcesCheck, downloadSourcesSublevel } from "@main/level";
import {
gamesSublevel,
getLastDownloadSourcesCheck,
updateLastDownloadSourcesCheck,
downloadSourcesSublevel,
} from "@main/level";
import { logger } from "./logger";
import { WindowManager } from "./window-manager";
import type { Game } from "@types";
@@ -14,62 +19,85 @@ interface DownloadSourcesChangeResponse {
export class DownloadSourcesChecker {
static async checkForChanges(): Promise<void> {
logger.info("DownloadSourcesChecker.checkForChanges() called");
try {
// Get all installed games (excluding custom games)
const installedGames = await gamesSublevel.values().all();
const nonCustomGames = installedGames.filter((game: Game) => game.shop !== 'custom');
logger.info(`Found ${installedGames.length} total games, ${nonCustomGames.length} non-custom games`);
const nonCustomGames = installedGames.filter(
(game: Game) => game.shop !== "custom"
);
logger.info(
`Found ${installedGames.length} total games, ${nonCustomGames.length} non-custom games`
);
if (nonCustomGames.length === 0) {
logger.info("No non-custom games found, skipping download sources check");
logger.info(
"No non-custom games found, skipping download sources check"
);
return;
}
// Get download sources
const downloadSources = await downloadSourcesSublevel.values().all();
const downloadSourceIds = downloadSources.map(source => source.id);
logger.info(`Found ${downloadSourceIds.length} download sources: ${downloadSourceIds.join(', ')}`);
const downloadSourceIds = downloadSources.map((source) => source.id);
logger.info(
`Found ${downloadSourceIds.length} download sources: ${downloadSourceIds.join(", ")}`
);
if (downloadSourceIds.length === 0) {
logger.info("No download sources found, skipping download sources check");
logger.info(
"No download sources found, skipping download sources check"
);
return;
}
// Get last check timestamp or use a default (24 hours ago)
const lastCheck = await getLastDownloadSourcesCheck();
const since = lastCheck || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
const since =
lastCheck || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
logger.info(`Last check: ${lastCheck}, using since: ${since}`);
// Clear any previously stored new download option counts so badges don't persist across restarts
const previouslyFlaggedGames = nonCustomGames.filter(
(game: Game) => (game as Game).newDownloadOptionsCount && (game as Game).newDownloadOptionsCount! > 0
(game: Game) =>
(game as Game).newDownloadOptionsCount &&
(game as Game).newDownloadOptionsCount! > 0
);
const clearedPayload: { gameId: string; count: number }[] = [];
if (previouslyFlaggedGames.length > 0) {
logger.info(`Clearing stale newDownloadOptionsCount for ${previouslyFlaggedGames.length} games`);
logger.info(
`Clearing stale newDownloadOptionsCount for ${previouslyFlaggedGames.length} games`
);
for (const game of previouslyFlaggedGames) {
await gamesSublevel.put(`${game.shop}:${game.objectId}`, {
...game,
newDownloadOptionsCount: undefined,
});
clearedPayload.push({ gameId: `${game.shop}:${game.objectId}`, count: 0 });
clearedPayload.push({
gameId: `${game.shop}:${game.objectId}`,
count: 0,
});
}
}
// Prepare games array for API call (excluding custom games)
const games = nonCustomGames.map((game: Game) => ({
shop: game.shop,
objectId: game.objectId
objectId: game.objectId,
}));
logger.info(`Checking download sources changes for ${games.length} non-custom games since ${since}`);
logger.info(`Making API call to HydraApi.checkDownloadSourcesChanges with:`, {
downloadSourceIds,
gamesCount: games.length,
since
});
logger.info(
`Checking download sources changes for ${games.length} non-custom games since ${since}`
);
logger.info(
`Making API call to HydraApi.checkDownloadSourcesChanges with:`,
{
downloadSourceIds,
gamesCount: games.length,
since,
}
);
// Call the API
const response = await HydraApi.checkDownloadSourcesChanges(
@@ -77,7 +105,7 @@ export class DownloadSourcesChecker {
games,
since
);
logger.info("API call completed, response:", response);
// Update the last check timestamp
@@ -86,37 +114,45 @@ export class DownloadSourcesChecker {
// Process the response and store newDownloadOptionsCount for games with new options
if (response && Array.isArray(response)) {
const gamesWithNewOptions: { gameId: string; count: number }[] = [];
for (const gameUpdate of response as DownloadSourcesChangeResponse[]) {
if (gameUpdate.newDownloadOptionsCount > 0) {
const game = nonCustomGames.find(g =>
g.shop === gameUpdate.shop && g.objectId === gameUpdate.objectId
const game = nonCustomGames.find(
(g) =>
g.shop === gameUpdate.shop && g.objectId === gameUpdate.objectId
);
if (game) {
// Store the new download options count in the game data
await gamesSublevel.put(`${game.shop}:${game.objectId}`, {
...game,
newDownloadOptionsCount: gameUpdate.newDownloadOptionsCount
newDownloadOptionsCount: gameUpdate.newDownloadOptionsCount,
});
gamesWithNewOptions.push({
gameId: `${game.shop}:${game.objectId}`,
count: gameUpdate.newDownloadOptionsCount
count: gameUpdate.newDownloadOptionsCount,
});
logger.info(`Game ${game.title} has ${gameUpdate.newDownloadOptionsCount} new download options`);
logger.info(
`Game ${game.title} has ${gameUpdate.newDownloadOptionsCount} new download options`
);
}
}
}
// Send IPC event to renderer to clear stale badges and set fresh counts from response
const eventPayload = [...clearedPayload, ...gamesWithNewOptions];
if (eventPayload.length > 0 && WindowManager.mainWindow) {
WindowManager.mainWindow.webContents.send("on-new-download-options", eventPayload);
WindowManager.mainWindow.webContents.send(
"on-new-download-options",
eventPayload
);
}
logger.info(`Found new download options for ${gamesWithNewOptions.length} games`);
logger.info(
`Found new download options for ${gamesWithNewOptions.length} games`
);
}
logger.info("Download sources check completed successfully");
@@ -124,4 +160,4 @@ export class DownloadSourcesChecker {
logger.error("Failed to check download sources changes:", error);
}
}
}
}

View File

@@ -409,22 +409,31 @@ export class HydraApi {
downloadSourceIds,
gamesCount: games.length,
since,
isLoggedIn: this.isLoggedIn()
isLoggedIn: this.isLoggedIn(),
});
try {
const result = await this.post<Array<{
shop: string;
objectId: string;
newDownloadOptionsCount: number;
downloadSourceIds: string[];
}>>("/download-sources/changes", {
downloadSourceIds,
games,
since,
}, { needsAuth: true });
logger.info("HydraApi.checkDownloadSourcesChanges completed successfully:", result);
const result = await this.post<
Array<{
shop: string;
objectId: string;
newDownloadOptionsCount: number;
downloadSourceIds: string[];
}>
>(
"/download-sources/changes",
{
downloadSourceIds,
games,
since,
},
{ needsAuth: true }
);
logger.info(
"HydraApi.checkDownloadSourcesChanges completed successfully:",
result
);
return result;
} catch (error) {
logger.error("HydraApi.checkDownloadSourcesChanges failed:", error);

View File

@@ -84,7 +84,9 @@ export function SidebarGameItem({
{game.newDownloadOptionsCount && game.newDownloadOptionsCount > 0 && (
<span className="sidebar__game-badge">
<div className="sidebar__game-badge-plus">+</div>
<div className="sidebar__game-badge-count">{game.newDownloadOptionsCount}</div>
<div className="sidebar__game-badge-count">
{game.newDownloadOptionsCount}
</div>
</span>
)}
</button>

View File

@@ -116,7 +116,7 @@
}
&__game-badge {
background: rgba(255, 255, 255, 0.1);;
background: rgba(255, 255, 255, 0.1);
color: #fff;
font-size: 10px;
font-weight: bold;

View File

@@ -39,4 +39,8 @@ export const librarySlice = createSlice({
},
});
export const { setLibrary, updateGameNewDownloadOptions, clearNewDownloadOptions } = librarySlice.actions;
export const {
setLibrary,
updateGameNewDownloadOptions,
clearNewDownloadOptions,
} = librarySlice.actions;

View File

@@ -16,4 +16,4 @@ export function useDownloadOptionsListener() {
return unsubscribe;
}, [dispatch]);
}
}