« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/client.js
diff options
context:
space:
mode:
Diffstat (limited to 'client.js')
-rw-r--r--client.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/client.js b/client.js
new file mode 100644
index 00000000..eb3c8697
--- /dev/null
+++ b/client.js
@@ -0,0 +1,52 @@
+// This is the JS file that gets loaded on the client! It's only really used for
+// the random track feature right now - the idea is we only use it for stuff
+// that cannot 8e done at static-site compile time, 8y its fundamentally
+// ephemeral nature.
+
+'use strict';
+
+const officialAlbumData = albumData.filter(album => !album.isFanon);
+const fandomAlbumData = albumData.filter(album => album.isFanon);
+const artistNames = C.getArtistNames(albumData);
+const allTracks = C.getAllTracks(albumData);
+
+function pick(array) {
+    return array[Math.floor(Math.random() * array.length)];
+}
+
+function getAlbum(el) {
+    const directory = getComputedStyle(el).getPropertyValue('--album-directory').trim();
+    return albumData.find(album => album.directory === directory);
+}
+
+function openAlbum(album) {
+    location.href = `${C.ALBUM_DIRECTORY}/${album.directory}/index.html`;
+}
+
+function openTrack(track) {
+    location.href = `${C.TRACK_DIRECTORY}/${track.directory}/index.html`;
+}
+
+function openArtist(artist) {
+    location.href = `${C.ARTIST_DIRECTORY}/${C.getArtistDirectory(artist)}/index.html`;
+}
+
+for (const a of document.body.querySelectorAll('[data-random]')) {
+    a.addEventListener('click', evt => {
+        try {
+            switch (a.dataset.random) {
+                case 'album': return openAlbum(pick(albumData));
+                case 'album-in-fandom': return openAlbum(pick(fandomAlbumData));
+                case 'album-in-official': openAlbum(pick(officialAlbumData));
+                case 'track': return openTrack(pick(allTracks));
+                case 'track-in-album': return openTrack(pick(getAlbum(a).tracks));
+                case 'track-in-fandom': return openTrack(pick(fandomAlbumData.reduce((acc, album) => acc.concat(album.tracks), [])));
+                case 'track-in-official': return openTrack(pick(officialAlbumData.reduce((acc, album) => acc.concat(album.tracks), [])));
+                case 'artist': return openArtist(pick(artistNames));
+                case 'artist-more-than-one-contrib': return openArtist(pick(artistNames.filter(name => C.getArtistNumContributions(name, {albumData, allTracks}) > 1)));
+            }
+        } finally {
+            evt.preventDefault();
+        }
+    });
+}