diff --git a/README.md b/README.md
index 2c22059..97a7c24 100644
--- a/README.md
+++ b/README.md
@@ -68,7 +68,7 @@ To Be Played is split into three repositories:
- **Detail per platform**: the details page of a game with several platforms (or a PlayStation title on a Steam game)
shows `PlatformsCard` above the editions: one row per platform with playtime, last played and the achievement or
trophy progress of that platform, a total row, and a link to the edition whose page lists the achievements. The hero
- playtime and the library card show the set total (`totalPlaytimeMinutes`); sorting and the stats stay per edition.
+ playtime and the library card show the set total (`totalPlaytimeMinutes`); sorting, stats, dashboard cards and the public profile use the set total (Core V45); per row stay the playtime history, rewards and the played / never started counts.
- **Add a game by name** for games outside Steam (PlayStation, Switch, Xbox, physical): search IGDB, pick a hit,
a platform and optional hours. Works without a Steam ID. Games already in ToBePlayed come first. Check several
hits to add them at once through the import review.
diff --git a/src/components/CurrentlyPlayingCard.jsx b/src/components/CurrentlyPlayingCard.jsx
index 7716535..4a3a4b7 100644
--- a/src/components/CurrentlyPlayingCard.jsx
+++ b/src/components/CurrentlyPlayingCard.jsx
@@ -40,7 +40,7 @@ export default function CurrentlyPlayingCard({games, syncing, wide}) {
- {formatPlaytime(g.playtimeMinutes)}
+ {formatPlaytime(g.totalPlaytimeMinutes ?? g.playtimeMinutes)}
diff --git a/src/components/CurrentlyPlayingCard.test.jsx b/src/components/CurrentlyPlayingCard.test.jsx
new file mode 100644
index 0000000..154c3a5
--- /dev/null
+++ b/src/components/CurrentlyPlayingCard.test.jsx
@@ -0,0 +1,18 @@
+// @vitest-environment jsdom
+import {afterEach, describe, expect, it, vi} from 'vitest';
+import {cleanup, render, screen} from '@testing-library/react';
+import {MemoryRouter} from 'react-router-dom';
+import CurrentlyPlayingCard from './CurrentlyPlayingCard.jsx';
+
+vi.mock('react-i18next', () => import('../test/i18n-mock.js'));
+
+describe('CurrentlyPlayingCard', () => {
+ afterEach(cleanup);
+
+ it('shows the set total of a game, not the minutes of its own row', () => {
+ render();
+
+ expect(screen.getByText('10h')).toBeTruthy();
+ });
+});
diff --git a/src/components/MostPlayedCard.jsx b/src/components/MostPlayedCard.jsx
index 42efb37..3387841 100644
--- a/src/components/MostPlayedCard.jsx
+++ b/src/components/MostPlayedCard.jsx
@@ -12,15 +12,17 @@ import {formatPlaytime} from '../utils/games.js';
import {coverEffect} from '../utils/rewards.js';
import {playChart} from '../utils/statCharts.js';
+const total = (g) => g.totalPlaytimeMinutes ?? g.playtimeMinutes;
+
/**
* @param chart LIST, BARS, PIE or DONUT
* @param onChart `(form)`: shows the picker
*/
export default function MostPlayedCard({games, syncing, equipped, chart = 'LIST', onChart}) {
const {t} = useTranslation();
- const mapped = games.map((g) => ({appid: g.appid, name: g.name, minutes: g.playtimeMinutes}));
+ const mapped = games.map((g) => ({appid: g.appid, name: g.name, minutes: total(g)}));
const form = playChart(chart, mapped);
- const maxMinutes = games[0]?.playtimeMinutes || 1;
+ const maxMinutes = mapped[0]?.minutes || 1;
return (
@@ -62,12 +64,12 @@ export default function MostPlayedCard({games, syncing, equipped, chart = 'LIST'
- {formatPlaytime(g.playtimeMinutes)}
+ {formatPlaytime(total(g))}
diff --git a/src/components/MostPlayedCard.test.jsx b/src/components/MostPlayedCard.test.jsx
new file mode 100644
index 0000000..5ac94f4
--- /dev/null
+++ b/src/components/MostPlayedCard.test.jsx
@@ -0,0 +1,18 @@
+// @vitest-environment jsdom
+import {afterEach, describe, expect, it, vi} from 'vitest';
+import {cleanup, render, screen} from '@testing-library/react';
+import {MemoryRouter} from 'react-router-dom';
+import MostPlayedCard from './MostPlayedCard.jsx';
+
+vi.mock('react-i18next', () => import('../test/i18n-mock.js'));
+
+describe('MostPlayedCard', () => {
+ afterEach(cleanup);
+
+ it('shows the set total of a game, not the minutes of its own row', () => {
+ render();
+
+ expect(screen.getByText('10h')).toBeTruthy();
+ });
+});