diff --git a/src/index.html b/src/index.html index c710889..3fa0baa 100644 --- a/src/index.html +++ b/src/index.html @@ -209,6 +209,7 @@ + diff --git a/src/js/auth.js b/src/js/auth.js index bfa4ad7..b120957 100644 --- a/src/js/auth.js +++ b/src/js/auth.js @@ -67,7 +67,7 @@ async function handleLogin() { await initializeApp(); } catch (error) { console.error("[Auth] Login failed:", error); - ui.authError.textContent = `${MESSAGES.CONNECTION_ERROR} ${error.message}`; + ui.authError.textContent = `${STRINGS.CONNECTION_ERROR} ${error.message}`; state.api = null; } finally { handleLogin.isInProgress = false; diff --git a/src/js/constants.js b/src/js/constants.js index e383914..0cb6754 100644 --- a/src/js/constants.js +++ b/src/js/constants.js @@ -56,13 +56,6 @@ const DOM_IDS = { SECTION_TOGGLE: "section-toggle", }; -const MESSAGES = { - NO_TRACK_PLAYING: "no track playing", - NO_ARTISTS: "no artists", - NO_PLAYLISTS: "no playlists", - CONNECTION_ERROR: "connection failed:", -}; - const ICONS = { PLAY: document.getElementById("icon-play")?.src || diff --git a/src/js/library.js b/src/js/library.js index 07c25dd..d3394cf 100644 --- a/src/js/library.js +++ b/src/js/library.js @@ -143,7 +143,7 @@ const TREE_CONFIGS = { data: () => state.library, expandedKey: "artists", expandedMap: () => state.expanded.items.artists, - message: MESSAGES.NO_ARTISTS, + message: STRINGS.NO_ARTISTS, artType: "artArtist", itemMapper: (artist) => ({ label: artist.title || artist.name, @@ -164,7 +164,7 @@ const TREE_CONFIGS = { data: () => state.playlists, expandedKey: "playlists", expandedMap: () => state.expanded.items.playlists, - message: MESSAGES.NO_PLAYLISTS, + message: STRINGS.NO_PLAYLISTS, artType: "artArtist", itemMapper: (playlist) => ({ label: playlist.name, diff --git a/src/js/player.js b/src/js/player.js index 12c5015..a1e0e0e 100644 --- a/src/js/player.js +++ b/src/js/player.js @@ -5,8 +5,8 @@ function playTrack(song) { return; } - ui.trackTitle.textContent = song.title || "Unknown"; - ui.trackArtist.textContent = song.artist || "Unknown Artist"; + ui.trackTitle.textContent = song.title || STRINGS.UNKNOWN_TRACK; + ui.trackArtist.textContent = song.artist || STRINGS.UNKNOWN_ARTIST; setCoverArt(song); ui.player.src = state.api.getStreamUrl(song.id); ui.player.play(); @@ -67,7 +67,7 @@ function highlightCurrentTrack() { // clear player UI and reset to default state function clearPlayerUI() { ui.player.src = ""; - ui.trackTitle.textContent = MESSAGES.NO_TRACK_PLAYING; + ui.trackTitle.textContent = STRINGS.NO_TRACK_PLAYING; ui.trackArtist.textContent = ""; clearLyrics(); ui.coverArt.src = "static/subsonic.png"; @@ -112,8 +112,8 @@ const updateMediaSession = (song) => { if (!song) return; withMediaSession((ms) => { ms.metadata = new MediaMetadata({ - title: song.title || "Unknown", - artist: song.artist || "Unknown Artist", + title: song.title || STRINGS.UNKNOWN_TRACK, + artist: song.artist || STRINGS.UNKNOWN_ARTIST, album: song.album || "", artwork: song.coverArt ? [ diff --git a/src/js/strings/en.js b/src/js/strings/en.js new file mode 100644 index 0000000..893ff69 --- /dev/null +++ b/src/js/strings/en.js @@ -0,0 +1,10 @@ +const STRINGS = { + NO_TRACK_PLAYING: "no track playing", + NO_ARTISTS: "no artists", + NO_PLAYLISTS: "no playlists", + CONNECTION_ERROR: "connection failed:", + UNKNOWN_TRACK: "unknown", + UNKNOWN_ARTIST: "unknown artist", + SERVER_URL_EMPTY: "server URL cannot be empty", + SERVER_URL_REQUIRED: "server URL is required", +}; diff --git a/src/js/strings/index.js b/src/js/strings/index.js new file mode 100644 index 0000000..5ce2609 --- /dev/null +++ b/src/js/strings/index.js @@ -0,0 +1,2 @@ +// TODO: add language support +export { STRINGS } from "./en.js"; diff --git a/src/js/validation.js b/src/js/validation.js index c3ac16d..df911e5 100644 --- a/src/js/validation.js +++ b/src/js/validation.js @@ -14,12 +14,12 @@ function validateId(value, fieldName = "ID") { // validate server URL is valid HTTP(S) format function validateServerUrl(url) { if (!url || typeof url !== "string") { - return buildValidation(false, null, "Server URL is required"); + return buildValidation(false, null, STRINGS.SERVER_URL_REQUIRED); } const trimmed = url.trim(); if (!trimmed) { - return buildValidation(false, null, "Server URL cannot be empty"); + return buildValidation(false, null, STRINGS.SERVER_URL_EMPTY); } try {