37 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="player-container fixed left-0 z-50 w-full h-20 bg-white"
 | |
|     :class="playerStore.currentTrack ? '-bottom-0 opacity-100' : '-bottom-32 opacity-0'">
 | |
|     <div class="flex items-center gap-3 p-2">
 | |
|       <img v-if="playerStore.getCurrentCoverUrl" :src="playerStore.getCurrentCoverUrl as string" alt="Current cover"
 | |
|         class="size-16 object-cover object-center rounded" />
 | |
|       <audio ref="audioRef" class="flex-1" controls />
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script setup lang="ts">
 | |
| import { ref, onMounted, onUnmounted } from 'vue'
 | |
| import { usePlayerStore } from '~/store/player'
 | |
| 
 | |
| const playerStore = usePlayerStore()
 | |
| const audioRef = ref<HTMLAudioElement | null>(null)
 | |
| 
 | |
| onMounted(() => {
 | |
|   if (audioRef.value) {
 | |
|     playerStore.attachAudio(audioRef.value)
 | |
|     audioRef.value.addEventListener("timeupdate", playerStore.updateTime)
 | |
|   }
 | |
| })
 | |
| 
 | |
| onUnmounted(() => {
 | |
|   if (audioRef.value) {
 | |
|     audioRef.value.removeEventListener("timeupdate", playerStore.updateTime)
 | |
|   }
 | |
| })
 | |
| </script>
 | |
| 
 | |
| <style>
 | |
| .player-container {
 | |
|   transition: all 1s ease-in-out;
 | |
| }
 | |
| </style> |