]> littlesong.place Git - littlesongplace.git/commitdiff
Handle navigation errors and missing colors
authorChris Fulljames <christianfulljames@gmail.com>
Sat, 22 Feb 2025 20:00:31 +0000 (15:00 -0500)
committerChris Fulljames <christianfulljames@gmail.com>
Sat, 22 Feb 2025 20:00:31 +0000 (15:00 -0500)
main.py
static/nav.js
templates/base.html
todo.txt

diff --git a/main.py b/main.py
index 5ff19ffb518021d5188605492c7ad1e84389f5d1..c14637927faf70e536dd22c031cf053ba62c5d27 100644 (file)
--- a/main.py
+++ b/main.py
@@ -30,6 +30,10 @@ DB_VERSION = 3
 DATA_DIR = Path(os.environ["DATA_DIR"]) if "DATA_DIR" in os.environ else Path(".")
 SCRIPT_DIR = Path(__file__).parent
 
+BGCOLOR = "#e8e6b5"
+FGCOLOR = "#695c73"
+ACCOLOR = "#9373a9"
+
 ################################################################################
 # Logging
 ################################################################################
@@ -173,9 +177,9 @@ def users_profile(profile_username):
             name=profile_username,
             userid=profile_userid,
             bio=profile_bio,
-            fgcolor=profile_data["fgcolor"],
-            bgcolor=profile_data["bgcolor"],
-            accolor=profile_data["accolor"],
+            bgcolor=profile_data["bgcolor"] or BGCOLOR,
+            fgcolor=profile_data["fgcolor"] or FGCOLOR,
+            accolor=profile_data["accolor"] or ACCOLOR,
             playlists=plist_data,
             songs=songs,
             user_has_pfp=(get_user_images_path(profile_userid)/"pfp.jpg").exists(),
@@ -519,9 +523,9 @@ def song(userid, songid):
                     "song.html",
                     songs=[song],
                     song=song,
-                    bgcolor=user_data["bgcolor"],
-                    fgcolor=user_data["fgcolor"],
-                    accolor=user_data["accolor"])
+                    bgcolor=user_data["bgcolor"] or BGCOLOR,
+                    fgcolor=user_data["fgcolor"] or FGCOLOR,
+                    accolor=user_data["accolor"] or ACCOLOR)
         except ValueError:
             abort(404)
     else:
@@ -866,9 +870,9 @@ def playlists(playlistid):
             private=plist_data["private"],
             userid=plist_data["userid"],
             username=plist_data["username"],
-            bgcolor=plist_data["bgcolor"],
-            fgcolor=plist_data["fgcolor"],
-            accolor=plist_data["accolor"],
+            bgcolor=plist_data["bgcolor"] or BGCOLOR,
+            fgcolor=plist_data["fgcolor"] or FGCOLOR,
+            accolor=plist_data["accolor"] or ACCOLOR,
             songs=songs)
 
 def flash_and_log(msg, category=None):
index 4787f5ddfbc7a499d224009517938b0d90417454..87715469291354d9f5b41350b0ee067972f5ce0f 100644 (file)
@@ -28,6 +28,7 @@ document.addEventListener("DOMContentLoaded", (e) => {
     document.querySelectorAll(".nav-logged-out").forEach((e) => {e.hidden = loggedIn;});
     if (loggedIn) {
         document.getElementById("logged-in-status").innerText = `Signed in as ${username}`;
+        document.getElementById("my-profile").href = `/users/${username}`;
     }
 
     // Update activity indicator status
@@ -39,7 +40,7 @@ function onLinkClick(event) {
     if (urlIsOnSameSite(targetUrl)) {
         event.preventDefault();
         event.stopPropagation();
-        fetch(targetUrl, {redirect: "follow"}).then(handleAjaxResponse);
+        fetch(targetUrl, {redirect: "follow"}).then(handleAjaxResponse).catch((err) => console.log(err));
     }
 }
 
@@ -50,7 +51,8 @@ function onFormSubmit(event) {
         event.stopPropagation();
         var formData = new FormData(event.target);
         fetch(targetUrl, {redirect: "follow", body: formData, method: event.target.method})
-            .then(handleAjaxResponse);
+            .then(handleAjaxResponse)
+            .catch((err) => window.location.reload());  // Failed to submit form; just reload page (should never happen)
     }
 }
 
@@ -60,6 +62,9 @@ function urlIsOnSameSite(targetUrl) {
 }
 
 async function handleAjaxResponse(response) {
+    if (response.status != 200) {
+        window.location.href = response.url;
+    }
     // Update URL in browser window, minus request-type field
     var url = new URL(response.url);
     url.searchParams.delete("request-type");
@@ -78,7 +83,7 @@ function updatePageState(data) {
     // Replace the contents of the current page with those from data
 
     if (!data) {
-        fetch(window.location.href, {redirect: "follow"}).then(handleAjaxResponse);
+        fetch(window.location.href, {redirect: "follow"}).then(handleAjaxResponse).catch((err) => window.location.reload());
         return;
     }
     var parser = new DOMParser();
index 93fb69aaa7e8500488008b7cdbed1b5829f7495e..2189ea0ef80cf19937f909b56f1235bbd303a01f 100644 (file)
@@ -29,7 +29,7 @@
                 <a href="/">Home</a>
                 <a href="/site-news">News</a>
 
-                <a href="/users/{{ session["username"] }}" class="nav-logged-in" hidden>My Profile</a>
+                <a href="/users/{{ session["username"] }}" class="nav-logged-in" id="my-profile" hidden>My Profile</a>
                 <a href="/activity"><span id="activity-indicator" hidden></span>Activity</a>
                 <a href="/logout" class="nav-logged-in" hidden>Sign Out</a>
 
index f3b616788f0f67564977515e45e8e74c20bae93e..40011227a644c3078c779d523555b00ce3a2b412 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -1,11 +1,8 @@
 NOW
-- AJAX pages so songs can play during navigation
-    - Use correct content type header for response
-    - HTTP Error handling
-- Break up main.py, test_offline.py
-- Pinned profile playlists
 
 SOON
+- Break up main.py, test_offline.py
+- Pinned profile playlists
 - Image support in comments, descriptions, bios, etc.
 - Player minimize button
 - Shuffle all page