Minor improvements and api fix

This commit is contained in:
2025-11-03 13:34:00 +03:30
parent de8c0486cc
commit 66ab88c924
4 changed files with 28 additions and 21 deletions

View File

@@ -3,6 +3,7 @@ import { useMediaStore } from '@/stores/media'
import { computed } from 'vue' import { computed } from 'vue'
import type { MediaType } from '@/types/Media' import type { MediaType } from '@/types/Media'
import ImageWithFallback from './ImageWithFallback.vue' import ImageWithFallback from './ImageWithFallback.vue'
import ScoreRing from './ScoreRing.vue'
const props = defineProps<{ const props = defineProps<{
media: MediaType media: MediaType
@@ -20,7 +21,7 @@ const alreadyAdded = computed(() => store.mediaList.some((media) => media.Id ===
<template> <template>
<div <div
class="card relative w-full h-full overflow-hidden bg-white/70 backdrop-blur-md border border-gray-200/60 shadow-md hover:shadow-xl transition-all duration-300" class="card relative w-full h-full overflow-hidden bg-white/70 backdrop-blur-md border border-gray-200/60 shadow-xs hover:shadow-xl transition-all duration-300"
v-motion-fade-visible-once v-motion-fade-visible-once
> >
<!-- Poster wrapper with fixed aspect --> <!-- Poster wrapper with fixed aspect -->
@@ -39,21 +40,7 @@ const alreadyAdded = computed(() => store.mediaList.some((media) => media.Id ===
<!-- Radial progress placed on the right edge, centered on the seam between poster and body --> <!-- Radial progress placed on the right edge, centered on the seam between poster and body -->
<div class="absolute left-3 bottom-0 z-20 translate-y-1/2" aria-hidden="true"> <div class="absolute left-3 bottom-0 z-20 translate-y-1/2" aria-hidden="true">
<div <ScoreRing :VoteAverage="props.media.VoteAverage" />
class="radial-progress bg-primary text-primary-content border-primary border-4 font-bold flex items-center justify-center"
:style="{
'--value': props.media.VoteAverage * 10,
'--size': '2rem',
'--thickness': '3px',
}"
:aria-valuenow="props.media.VoteAverage"
role="progressbar"
>
<span class="flex items-baseline text-[0.7em]">
{{ props.media.VoteAverage === 0 ? '?' : (props.media.VoteAverage * 10).toFixed(0) }}
<span class="text-[0.5em] relative -top-1 ml-0.5">%</span>
</span>
</div>
</div> </div>
</div> </div>
@@ -70,14 +57,14 @@ const alreadyAdded = computed(() => store.mediaList.some((media) => media.Id ===
</h2> </h2>
<time <time
class="text-sm text-gray-400" class="text-sm text-gray-400"
:datetime="new Date(props.media.ReleaseDate).toISOString()" :datetime="new Date(props.media.ReleaseDate === '' ? props.media.FirstAirDate : props.media.ReleaseDate).toISOString()"
> >
{{ {{
new Intl.DateTimeFormat('default', { new Intl.DateTimeFormat('default', {
year: 'numeric', year: 'numeric',
month: 'long', month: 'long',
day: 'numeric', day: 'numeric',
}).format(new Date(props.media.ReleaseDate)) }).format(new Date(props.media.ReleaseDate === '' ? props.media.FirstAirDate : props.media.ReleaseDate))
}} }}
</time> </time>
</router-link> </router-link>

21
src/components/ScoreRing.vue Executable file
View File

@@ -0,0 +1,21 @@
<script setup lang="ts">
const props = defineProps<{ VoteAverage: number }>()
</script>
<template>
<div
class="radial-progress bg-primary text-primary-content border-primary border-4 font-bold flex items-center justify-center"
:style="{
'--value': props.VoteAverage * 10,
'--size': '2rem',
'--thickness': '3px',
}"
:aria-valuenow="props.VoteAverage"
role="progressbar"
>
<span class="flex items-baseline text-[0.7em]">
{{ props.VoteAverage === 0 ? '?' : (props.VoteAverage * 10).toFixed(0) }}
<span class="text-[0.5em] relative -top-1 ml-0.5">%</span>
</span>
</div>
</template>

View File

@@ -41,7 +41,7 @@ export const loadMedia = async (
const responses = await Promise.all(requests) const responses = await Promise.all(requests)
// If only one type was requested, handle that directly // If only one type was requested, handle that directly
if (filters.onlyMovies) { if (filters.onlyMovies && !filters.onlySeries) {
const movieSearch = responses[0] const movieSearch = responses[0]
if (movieSearch.status !== 200) { if (movieSearch.status !== 200) {
return { return {
@@ -62,7 +62,7 @@ export const loadMedia = async (
} }
} }
if (filters.onlySeries) { if (filters.onlySeries && !filters.onlyMovies) {
const tvSearch = responses[0] const tvSearch = responses[0]
if (tvSearch.status !== 200) { if (tvSearch.status !== 200) {
return { return {

View File

@@ -41,7 +41,6 @@ export const useSearchPageStore = defineStore('searchPage', () => {
searchQuery.value = query searchQuery.value = query
mediaList.value = medias mediaList.value = medias
searchFilters.value = filters searchFilters.value = filters
console.log('setState', page, query, medias, filters)
} }
return { searchPage, searchQuery, mediaList, searchFilters, setState } return { searchPage, searchQuery, mediaList, searchFilters, setState }
}) })