aboutsummaryrefslogtreecommitdiff
path: root/src/dionysus/web/enduser
diff options
context:
space:
mode:
Diffstat (limited to 'src/dionysus/web/enduser')
-rw-r--r--src/dionysus/web/enduser/home.clj53
-rw-r--r--src/dionysus/web/enduser/home/search.clj67
2 files changed, 120 insertions, 0 deletions
diff --git a/src/dionysus/web/enduser/home.clj b/src/dionysus/web/enduser/home.clj
new file mode 100644
index 0000000..69d8ece
--- /dev/null
+++ b/src/dionysus/web/enduser/home.clj
@@ -0,0 +1,53 @@
+(ns dionysus.web.enduser.home
+ (:require [dionysus.web.utils :as dwutils]
+ [ring.util.response :as ruresp]
+ [dionysus.spotify :as dspotify]
+ [clojure.string :as cstr]
+ [dionysus.web.enduser.home.search :as dwehsearch]))
+
+(defn- render-current-track [_req]
+ (let [track (:item (dspotify/get-current-track!))]
+ [:div {:id "current-track"
+ :class "card"
+ :hx-swap "outerHTML"
+ :hx-get "/current-track/"
+ :hx-trigger "every 10s"}
+ [:img {:class "album-image"
+ :src (get-in track [:album :images 0 :url])
+ :width "130em"}]
+ [:div
+ [:b (:name track)]
+ [:p (str "Von " (cstr/join ", " (map :name (:artists track))))]
+ [:a {:href (get-in track [:external_urls :spotify])
+ :target "_blank"} "Auf Spotify anschauen"]]]))
+
+(defn handle-current-track [req]
+ (-> req
+ render-current-track
+ dwutils/render-html
+ ruresp/response))
+
+(defn- render [_req]
+ (dwutils/render-page (str @dwutils/title " - Home")
+ [:div {:class "text"}
+ [:h1 @dwutils/title]
+ [:p "Füge hier Lieder zur Warteschlange hinzu!"]]
+ [:input {:id "search-bar"
+ :type "text"
+ :placeholder "Suche nach einem Lied:"
+ :name "query"
+ :hx-get "/search/"
+ :hx-swap "innerHTML"
+ :hx-target "#search-results"
+ :hx-trigger "change"}]
+ [:div {:id "search-results"}
+ (dwehsearch/render-search nil)]
+ [:h2 {:class "text"}
+ "Aktuelles Lied"]
+ (render-current-track nil)
+ [:script {:src "/assets/htmx.js"}]))
+
+(defn handle [req]
+ (-> req
+ render
+ ruresp/response))
diff --git a/src/dionysus/web/enduser/home/search.clj b/src/dionysus/web/enduser/home/search.clj
new file mode 100644
index 0000000..cea539c
--- /dev/null
+++ b/src/dionysus/web/enduser/home/search.clj
@@ -0,0 +1,67 @@
+(ns dionysus.web.enduser.home.search
+ (:require [clojure.string :as cstr]
+ [dionysus.blacklist :as dblacklist]
+ [dionysus.spotify :as dspotify]
+ [dionysus.web.utils :as dwutils]
+ [ring.util.response :as ruresp]))
+
+(defn- search-item [track]
+ [:div {:class ["card" "search-item"]}
+ [:img {:class "album-image"
+ :src (get-in track [:album :images 0 :url])
+ :width "130em"}]
+ [:div
+ [:b (:name track)]
+ [:p (str "Von " (cstr/join ", " (map :name (:artists track))))]]
+ [:img {:class "track-action-icon"
+ :src "/assets/icons/plus.svg"
+ :hx-post (str "/search/add/" (:uri track) "/")
+ :hx-trigger "click"
+ :hx-swap "outerHTML"
+ :hx-target "this"
+ :height "60em"
+ :alt "plus icon"
+ :title "Lied zur Warteschlange hinzufügen"}]])
+
+(defn render-search [req]
+ (let [query (get-in req [:query-params "query"])
+ tracks (-> (dspotify/search! query)
+ (get-in [:tracks :items])
+ delay)]
+ (cond
+ (cstr/blank? query)
+ [:i "Nutze die Suchleiste oben, um nach einem Lied zu suchen oder füge den Link zu dem Lied ein."]
+
+ (nil? @tracks)
+ [:b "An error occurred."]
+
+ :else
+ (for [track @tracks]
+ (search-item track)))))
+
+(defn handle-search [req]
+ (-> req
+ render-search
+ dwutils/render-html
+ ruresp/response))
+
+(defn handle-search-add [req]
+ (let [uri (get-in req [:path-params :uri])
+ on-blacklist? (-> uri
+ (cstr/split #":")
+ last
+ dblacklist/on-blacklist?)]
+ (when on-blacklist? (dspotify/add-item-to-queue! uri))
+ (-> [:img {:class "track-action-icon"
+ :src (if on-blacklist?
+ "/assets/icons/warning.svg"
+ "/assets/icons/check.svg")
+ :alt (if on-blacklist?
+ "warn dreieck icon"
+ "haken icon")
+ :title (if on-blacklist?
+ "Lied oder Künstler ist auf der Blacklist"
+ "Lied wurde zur Warteschlange hinzugefügt")
+ :height "60em"}]
+ dwutils/render-html
+ ruresp/response)))