mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-08-11 11:19:24 +00:00
fix(v3): refresh Songs grid after a Settings rescan / DLC-folder change (#624)
Reported on macOS: on a fresh install, pointing at a DLC folder in Settings and running a scan showed NO songs until an app restart. The scan itself was fine — _background_scan re-reads config.json fresh, so it scans the new folder and populates the library — but the v3 Songs grid never reloaded. The Settings Rescan / Full Rescan handlers only refreshed the classic (v2) library via loadLibrary(); the v3 grid (static/v3/songs.js) had no listener for a scan it didn't initiate (only its own upload path self-refreshes via watchUploadScan). So its cached, pre-DLC (empty) DOM/snapshot survived a sidebar return until a full reload (restart). Fix: the rescan handlers now emit `library:changed` (static/app.js). The v3 grid listens and reloads if it's the active screen, else sets `_libraryDirty` so the next onV3SongsScreenEnter does a full re-fetch — a short-circuit placed ahead of every cached-DOM fast-path so it can't restore the stale grid. Tests: tests/js/v3_library_refresh.test.js guards the emit + the reload/dirty wiring (DOM/event glue isn't headlessly unit-testable; end-to-end wants an in-app run of the reporter's flow: set DLC in Settings → scan → Songs populate without restart). Claude-Session: https://claude.ai/code/session_01QbexxfTt8q2tAn436MqGWF Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: byrongamatos <xasiklas@gmail.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
byrongamatos
parent
d841813e0b
commit
b103a722ce
@@ -4543,6 +4543,9 @@ async function rescanLibrary() {
|
||||
_treeStats = null;
|
||||
_tuningNames = null; // re-fetch on next drawer open
|
||||
loadLibrary();
|
||||
// Tell the v3 Songs grid the library changed so it reloads instead of
|
||||
// keeping a cached (e.g. pre-DLC, empty) grid until an app restart.
|
||||
if (window.feedBack) window.feedBack.emit('library:changed', { reason: 'rescan' });
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
@@ -4571,6 +4574,9 @@ async function fullRescanLibrary() {
|
||||
_treeStats = null;
|
||||
_tuningNames = null; // re-fetch on next drawer open
|
||||
loadLibrary();
|
||||
// Tell the v3 Songs grid the library changed so it reloads instead of
|
||||
// keeping a cached (e.g. pre-DLC, empty) grid until an app restart.
|
||||
if (window.feedBack) window.feedBack.emit('library:changed', { reason: 'rescan' });
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
@@ -338,6 +338,12 @@
|
||||
// tracks filenames scored while the library was off-screen, applied on enter.
|
||||
const _dirtyScores = new Set();
|
||||
|
||||
// Set when a library scan / DLC-folder change happened while this screen was
|
||||
// off (or showing a stale, e.g. pre-DLC empty, grid). The grid's cached DOM /
|
||||
// snapshot would otherwise survive a sidebar return, so we force a full
|
||||
// re-fetch on the next entry. (feedBack — "No DLC until restart".)
|
||||
let _libraryDirty = false;
|
||||
|
||||
function repaintAccuracy(key) {
|
||||
const apply = (el, variant) => {
|
||||
if (el.getAttribute('data-fn') !== key) return;
|
||||
@@ -1049,6 +1055,10 @@
|
||||
}
|
||||
|
||||
async function onV3SongsScreenEnter() {
|
||||
// A library scan / DLC-folder change marked the grid stale — re-fetch
|
||||
// from scratch instead of restoring a cached (possibly empty, pre-DLC)
|
||||
// snapshot. Must win over every fast-path below.
|
||||
if (_libraryDirty) { _libraryDirty = false; await reload(); return; }
|
||||
// Pull in any scores recorded while the library was off-screen (the usual
|
||||
// play→return flow) before the fast-paths below restore the cached DOM,
|
||||
// so the just-played song's badge is current. The full render() path
|
||||
@@ -1202,5 +1212,16 @@
|
||||
const active = document.querySelector('.screen.active');
|
||||
if (active && active.id === 'v3-songs') applyScoreRefresh();
|
||||
});
|
||||
// A library scan (rescan / full rescan from Settings, or a DLC-folder
|
||||
// change) can add or remove songs while this grid is cached — the
|
||||
// Settings rescan only refreshed the classic library, so the v3 grid
|
||||
// stayed on its pre-scan (e.g. empty, pre-DLC) state until an app
|
||||
// restart. Reload now if we're showing; otherwise mark dirty so the next
|
||||
// entry re-fetches instead of restoring the stale snapshot.
|
||||
sm.on('library:changed', () => {
|
||||
const active = document.querySelector('.screen.active');
|
||||
if (active && active.id === 'v3-songs') { _libraryDirty = false; reload(); }
|
||||
else _libraryDirty = true;
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user