(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)))