koel/resources/assets/js/components/artist/ArtistInfo.vue

77 lines
2.3 KiB
Vue
Raw Normal View History

2022-04-15 14:24:30 +00:00
<template>
<article :class="mode" class="artist-info" data-testid="artist-info">
2022-04-15 14:24:30 +00:00
<h1 class="name">
<span>{{ artist.name }}</span>
2022-07-15 07:23:55 +00:00
<button :title="`Play all songs by ${artist.name}`" class="control" type="button" @click.prevent="play">
<icon :icon="faCirclePlay" size="xl"/>
2022-04-15 14:24:30 +00:00
</button>
</h1>
<main>
<ArtistThumbnail :entity="artist"/>
2022-04-15 14:24:30 +00:00
<template v-if="info">
<div v-if="info.bio?.summary" class="bio">
2022-07-10 13:50:41 +00:00
<div v-if="showSummary" class="summary" data-testid="summary" v-html="info.bio.summary"/>
<div v-if="showFull" class="full" data-testid="full" v-html="info.bio.full"/>
2022-04-15 14:24:30 +00:00
2022-07-10 13:50:41 +00:00
<button v-if="showSummary" class="more" data-testid="more-btn" @click.prevent="showingFullBio = true">
2022-04-15 14:24:30 +00:00
Full Bio
</button>
</div>
<footer>
2022-06-10 10:47:46 +00:00
Data &copy;
<a :href="info.url" rel="openener" target="_blank">Last.fm</a>
2022-06-10 10:47:46 +00:00
</footer>
2022-04-15 14:24:30 +00:00
</template>
</main>
</article>
</template>
2022-04-15 17:00:08 +00:00
<script lang="ts" setup>
2022-07-15 07:23:55 +00:00
import { faCirclePlay } from '@fortawesome/free-solid-svg-icons'
import { computed, ref, toRefs, watch } from 'vue'
import { playbackService, mediaInfoService } from '@/services'
2022-06-10 10:47:46 +00:00
import { useThirdPartyServices } from '@/composables'
import { songStore } from '@/stores'
import { RouterKey } from '@/symbols'
import { requireInjection } from '@/utils'
2022-04-15 14:24:30 +00:00
import ArtistThumbnail from '@/components/ui/AlbumArtistThumbnail.vue'
2022-04-15 14:24:30 +00:00
const router = requireInjection(RouterKey)
2022-07-10 09:31:55 +00:00
const props = withDefaults(defineProps<{ artist: Artist, mode?: MediaInfoDisplayMode }>(), { mode: 'aside' })
2022-04-15 17:00:08 +00:00
const { artist, mode } = toRefs(props)
2022-04-15 14:24:30 +00:00
2022-06-10 10:47:46 +00:00
const { useLastfm } = useThirdPartyServices()
const info = ref<ArtistInfo | null>(null)
const showingFullBio = ref(false)
watch(artist, async () => {
showingFullBio.value = false
info.value = null
useLastfm.value && (info.value = await mediaInfoService.fetchForArtist(artist.value))
}, { immediate: true })
2022-04-15 14:24:30 +00:00
2022-04-26 11:32:13 +00:00
const showSummary = computed(() => mode.value !== 'full' && !showingFullBio.value)
2022-04-15 17:00:08 +00:00
const showFull = computed(() => !showSummary.value)
2022-04-15 14:24:30 +00:00
const play = async () => {
await playbackService.queueAndPlay(await songStore.fetchForArtist(artist.value))
router.go('queue')
}
2022-04-15 14:24:30 +00:00
</script>
<style lang="scss" scoped>
2022-04-15 14:24:30 +00:00
.artist-info {
@include artist-album-info();
.none {
margin-top: 1rem;
}
}
</style>