aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiguel Ángel Moreno <mail@migalmoreno.com>2024-01-23 13:04:38 +0100
committerMiguel Ángel Moreno <mail@migalmoreno.com>2024-01-23 13:04:38 +0100
commit54253a64e2da861381aa197347239bdf7325da90 (patch)
tree952c0e7931d8388cd0b3b6865458e9ca4f8e231d /src
parent8258620eab20b4a53e6cc921d884b0aa886b8565 (diff)
feat(frontend): add more common player components
Diffstat (limited to 'src')
-rw-r--r--src/frontend/tubo/components/audio_player.cljs14
-rw-r--r--src/frontend/tubo/components/play_queue.cljs49
-rw-r--r--src/frontend/tubo/components/player.cljs23
3 files changed, 40 insertions, 46 deletions
diff --git a/src/frontend/tubo/components/audio_player.cljs b/src/frontend/tubo/components/audio_player.cljs
index cd2d581..ec8337c 100644
--- a/src/frontend/tubo/components/audio_player.cljs
+++ b/src/frontend/tubo/components/audio_player.cljs
@@ -45,19 +45,7 @@
loop-playback @(rf/subscribe [:loop-playback])]
[:div.flex.flex-col.items-center.ml-auto
[:div.flex.justify-end
- [player/button
- [:div.relative.flex.items-center
- [:i.fa-solid.fa-repeat
- {:style {:color (when loop-playback service-color)}}]
- (when (= loop-playback :stream)
- [:span.absolute.font-bold
- {:style {:color (when loop-playback service-color)
- :font-size "6px"
- :right "6px"
- :top "6.5px"}}
- "1"])]
- #(rf/dispatch [::events/toggle-loop-playback])
- :extra-styles "text-sm"]
+ [player/loop-button loop-playback service-color]
[player/button
[:i.fa-solid.fa-backward-step]
#(when (and media-queue (not= media-queue-pos 0))
diff --git a/src/frontend/tubo/components/play_queue.cljs b/src/frontend/tubo/components/play_queue.cljs
index 9ae758a..b4d1dc0 100644
--- a/src/frontend/tubo/components/play_queue.cljs
+++ b/src/frontend/tubo/components/play_queue.cljs
@@ -3,7 +3,7 @@
[re-frame.core :as rf]
[reitit.frontend.easy :as rfe]
[tubo.components.items :as items]
- [tubo.components.loading :as loading]
+ [tubo.components.layout :as layout]
[tubo.components.player :as player]
[tubo.events :as events]
[tubo.util :as util]))
@@ -31,17 +31,18 @@
(defn queue
[]
- (let [show-media-queue @(rf/subscribe [:show-media-queue])
- show-audio-player-loading? @(rf/subscribe [:show-audio-player-loading])
- media-queue @(rf/subscribe [:media-queue])
- media-queue-pos @(rf/subscribe [:media-queue-pos])
+ (let [show-media-queue @(rf/subscribe [:show-media-queue])
+ loading? @(rf/subscribe [:show-audio-player-loading])
+ paused? @(rf/subscribe [:paused])
+ media-queue @(rf/subscribe [:media-queue])
+ media-queue-pos @(rf/subscribe [:media-queue-pos])
{:keys [uploader-name uploader-url
name stream url service-color]
- :as current-stream} @(rf/subscribe [:media-queue-stream])
- !elapsed-time @(rf/subscribe [:elapsed-time])
- !player @(rf/subscribe [:player])
- loop-playback @(rf/subscribe [:loop-playback])
- player-ready? (and @!player (> (.-readyState @!player) 0))]
+ :as current-stream} @(rf/subscribe [:media-queue-stream])
+ !elapsed-time @(rf/subscribe [:elapsed-time])
+ !player @(rf/subscribe [:player])
+ loop-playback @(rf/subscribe [:loop-playback])
+ player-ready? (and @!player (> (.-readyState @!player) 0))]
(when (and show-media-queue media-queue)
[:div.fixed.flex.flex-col.items-center.px-5.py-2.min-w-full.w-full.z-30
{:style {:minHeight "calc(100dvh - 56px)" :height "calc(100dvh - 56px)"}
@@ -49,8 +50,8 @@
[:div.flex.justify-between.pl-4.items-center.w-full.shrink-0
{:class "lg:w-4/5 xl:w-3/5"}
[:h1.text-2xl.font-bold.py-6 "Play Queue"]
- [:div.mx-2
- [:i.fa-solid.fa-close.cursor-pointer
+ [:button.mx-2
+ [:i.fa-solid.fa-close
{:on-click #(rf/dispatch [::events/toggle-media-queue])}]]]
[:div.flex.flex-col.sm:p-4.w-full.overflow-y-auto.flex-auto
{:class "lg:w-4/5 xl:w-3/5"}
@@ -68,19 +69,7 @@
[player/time-slider !player !elapsed-time service-color]
[:span.ml-2 (if player-ready? (util/format-duration (.-duration @!player)) "00:00")]]
[:div.flex.justify-center.items-center
- [player/button
- [:div.relative
- [:i.fa-solid.fa-repeat
- {:style {:color (when loop-playback service-color)}}]
- (when (= loop-playback :stream)
- [:span.absolute.font-bold
- {:style {:color (when loop-playback service-color)
- :font-size "6px"
- :right "6px"
- :top "6.5px"}}
- "1"])]
- #(rf/dispatch [::events/toggle-loop-playback])
- :show-on-mobile? true]
+ [player/loop-button loop-playback service-color true]
[player/button
[:i.fa-solid.fa-backward-step]
#(when (and media-queue (not= media-queue-pos 0))
@@ -95,14 +84,12 @@
:extra-styles "text-xl"
:show-on-mobile? true]
[player/button
- (if show-audio-player-loading?
- [loading/loading-icon service-color "text-3xl"]
- (if (.-paused @!player)
+ (if (or loading? (not @!player))
+ [layout/loading-icon service-color "text-2xl"]
+ (if paused?
[:i.fa-solid.fa-play]
[:i.fa-solid.fa-pause]))
- #(if (.-paused @!player)
- (.play @!player)
- (.pause @!player))
+ #(rf/dispatch [::events/player-paused (not paused?)])
:extra-styles "text-3xl"
:show-on-mobile? true]
[player/button
diff --git a/src/frontend/tubo/components/player.cljs b/src/frontend/tubo/components/player.cljs
index ac721e2..c44a408 100644
--- a/src/frontend/tubo/components/player.cljs
+++ b/src/frontend/tubo/components/player.cljs
@@ -25,6 +25,23 @@
:on-click on-click-cb}
icon])
+(defn loop-button
+ [loop-playback service-color show-on-mobile?]
+ [button
+ [:div.relative.flex.items-center
+ [:i.fa-solid.fa-repeat
+ {:style {:color (when loop-playback service-color)}}]
+ (when (= loop-playback :stream)
+ [:div.absolute.font-bold
+ {:style {:color (when loop-playback service-color)
+ :font-size "5.5px"
+ :right "6px"
+ :top "-4px"}}
+ "1"])]
+ #(rf/dispatch [::events/toggle-loop-playback])
+ :extra-styles "text-sm"
+ :show-on-mobile? show-on-mobile?])
+
(defn volume-slider [player volume-level muted? service-color]
(let [show-slider? (r/atom nil)]
(fn [player volume-level muted? service-color]
@@ -35,10 +52,12 @@
(if muted? [:i.fa-solid.fa-volume-xmark] [:i.fa-solid.fa-volume-low])
#(rf/dispatch [::events/toggle-mute player])]
(when @show-slider?
- [:input.rounded-lg.cursor-pointer.focus:outline-none.absolute
+ [:input.rounded-lg.w-24.cursor-pointer.focus:outline-none.absolute
{:class "rotate-[270deg]"
:type "range"
:on-input #(rf/dispatch [::events/change-volume-level (.. % -target -value) player])
- :style {:accentColor service-color :left "-48px" :bottom "80px" :display (if @show-slider? "block" "none")}
+ :style {:accentColor service-color
+ :left "-32.5px"
+ :bottom "67.5px"}
:max 100
:value volume-level}])])))