mirror of
https://github.com/heyarne/airsonic-ui.git
synced 2026-05-06 18:33:38 +02:00
Squashed commit of the following:
commit b03c1ea7ed0d2fbd56f56f3273e694abc5454101
Author: Arne Schlüter <arne@schlueter.is>
Date: Wed Aug 29 11:38:32 2018 +0200
Fix bug where dropdown menus behind notifications could not be hovered
commit f4d3cd3dad89d0de84f131dbef7268422b26aa35
Author: Arne Schlüter <arne@schlueter.is>
Date: Wed Aug 29 11:16:41 2018 +0200
Move navigation to top
commit 564d972291aebb382d1ca560a21fad332d70cd0c
Author: Arne Schlüter <arne@schlueter.is>
Date: Wed Aug 29 10:23:17 2018 +0200
Move audio player into its own component
commit 382e9e88021db1506efc5fb78935b7846b8257db
Author: Arne Schlüter <arne@schlueter.is>
Date: Wed Aug 29 10:11:14 2018 +0200
Remove link to last.fm in bio
commit f248c2999ca88eeb82769d7491b1e786ee4a7c9d
Author: Arne Schlüter <arne@schlueter.is>
Date: Wed Aug 29 10:01:10 2018 +0200
Add links to external services & hero headers to album and artist pages
65 lines
3 KiB
Clojure
65 lines
3 KiB
Clojure
(ns airsonic-ui.components.audio-player.views
|
|
(:require [re-frame.core :refer [subscribe]]
|
|
[airsonic-ui.helpers :refer [add-classes dispatch]]
|
|
[airsonic-ui.views.cover :refer [cover]]
|
|
[airsonic-ui.views.icon :refer [icon]]))
|
|
|
|
;; currently playing / coming next / audio controls...
|
|
|
|
(defn current-song-info [song status]
|
|
[:article
|
|
[:div (:artist song) " - " (:title song)]
|
|
;; FIXME: Sometimes items don't have a duration
|
|
[:progress.progress.is-tiny {:value (:current-time status)
|
|
:max (:duration song)}]])
|
|
|
|
(defn song-controls [is-playing?]
|
|
[:div.field.has-addons
|
|
(let [buttons [[:media-step-backward :audio-player/previous-song]
|
|
[(if is-playing? :media-pause :media-play) :audio-player/toggle-play-pause]
|
|
[:media-step-forward :audio-player/next-song]]]
|
|
(map (fn [[icon-glyph event]]
|
|
^{:key icon-glyph} [:p.control>button.button.is-light
|
|
{:on-click (dispatch [event])}
|
|
[icon icon-glyph]])
|
|
buttons))])
|
|
|
|
(defn- toggle-shuffle [playback-mode]
|
|
(dispatch [:audio-player/set-playback-mode (if (= playback-mode :shuffled)
|
|
:linear :shuffled)]))
|
|
|
|
(defn- toggle-repeat-mode [current-mode]
|
|
(let [modes (cycle '(:repeat-none :repeat-all :repeat-single))
|
|
next-mode (->> (drop-while (partial not= current-mode) modes)
|
|
(second))]
|
|
(dispatch [:audio-player/set-repeat-mode next-mode])))
|
|
|
|
(defn playback-mode-controls [playlist]
|
|
(let [{:keys [repeat-mode playback-mode]} playlist
|
|
button :p.control>button.button.is-light
|
|
shuffle-button (add-classes button (when (= playback-mode :shuffled) :is-primary))
|
|
repeat-button (add-classes button (case repeat-mode
|
|
:repeat-single :is-info
|
|
:repeat-all :is-primary
|
|
nil))]
|
|
[:div.field.has-addons
|
|
^{:key :shuffle-button} [shuffle-button {:on-click (toggle-shuffle playback-mode)} [icon :random]]
|
|
^{:key :repeat-button} [repeat-button {:on-click (toggle-repeat-mode repeat-mode)} [icon :loop]]]))
|
|
|
|
(defn audio-player []
|
|
(let [current-song @(subscribe [:audio/current-song])
|
|
playlist @(subscribe [:audio/playlist])
|
|
playback-status @(subscribe [:audio/playback-status])
|
|
is-playing? @(subscribe [:audio/is-playing?])]
|
|
[:nav.navbar.is-fixed-bottom.audio-player
|
|
[:div.navbar-menu.is-active
|
|
(if current-song
|
|
;; show song info
|
|
[:section.level.audio-interaction
|
|
[:div.level-left>article.media
|
|
[:div.media-left [cover current-song 48]]
|
|
[:div.media-content [current-song-info current-song playback-status]]]
|
|
[:div.level-right [song-controls is-playing?]]
|
|
[:div.level-right [playback-mode-controls playlist]]]
|
|
;; not playing anything
|
|
[:p.has-text-light.navbar-item.idle-notification "Select a song to start playing"])]]))
|