diff options
Diffstat (limited to 'src/dionysus/web/enduser')
| -rw-r--r-- | src/dionysus/web/enduser/home.clj | 53 | ||||
| -rw-r--r-- | src/dionysus/web/enduser/home/search.clj | 67 |
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))) |
