mirror of
				https://github.com/mmahdium/TBW.git
				synced 2025-11-04 04:28:13 +01:00 
			
		
		
		
	Minor improvements and api fix
This commit is contained in:
		@@ -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
									
								
							
							
						
						
									
										21
									
								
								src/components/ScoreRing.vue
									
									
									
									
									
										Executable 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>
 | 
				
			||||||
@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 }
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user