From ea1c3e29edcede5423c1e7c5f6fe421e400114e4 Mon Sep 17 00:00:00 2001 From: RockinChaos Date: Thu, 1 Aug 2024 16:16:13 -0700 Subject: [PATCH] feat: Better relations cards --- common/components/cards/PreviewCard.svelte | 32 +++++++++--- common/components/cards/SmallCard.svelte | 19 ++++++- common/modules/al.d.ts | 45 +++++++++++------ common/modules/anilist.js | 58 ++++++++++++++-------- common/modules/scroll.js | 9 ++++ common/views/ViewAnime/ToggleList.svelte | 8 ++- common/views/ViewAnime/ViewAnime.svelte | 46 +++++++++++------ 7 files changed, 159 insertions(+), 58 deletions(-) diff --git a/common/components/cards/PreviewCard.svelte b/common/components/cards/PreviewCard.svelte index 3734a26..5745478 100644 --- a/common/components/cards/PreviewCard.svelte +++ b/common/components/cards/PreviewCard.svelte @@ -4,8 +4,10 @@ import { click } from '@/modules/click.js' import Scoring from '@/views/ViewAnime/Scoring.svelte' import AudioLabel from '@/views/ViewAnime/AudioLabel.svelte' + import Helper from "@/modules/helper.js" /** @type {import('@/modules/al.d.ts').Media} */ export let media + export let type = null let hide = true @@ -91,7 +93,21 @@ {/if} -
+
+ {#if type || type === 0} + + {#if Number.isInteger(type) && type >= 0} + + thumb_up + + {:else if Number.isInteger(type) && type < 0} + + thumb_down + + {/if} + {(Number.isInteger(type) ? Math.abs(type).toLocaleString() + (type >= 0 ? ' likes' : ' dislikes') : type)} + + {/if} {#if media.format} {formatMap[media.format]} @@ -118,15 +134,19 @@ Rated 18+ {/if} +
+
{#if media.season || media.seasonYear} {[media.season?.toLowerCase(), media.seasonYear].filter(s => s).join(' ')} {/if}
-
- {media.description?.replace(/<[^>]*>/g, '')} -
+ {#if media.description} +
+ {media.description?.replace(/<[^>]*>/g, '')} +
+ {/if}
@@ -136,9 +156,9 @@ -webkit-line-clamp: 4; -webkit-box-orient: vertical; } - .details span + span::before { + .details > span:not(:last-child)::after { content: '•'; - padding: 0 .5rem; + padding: .5rem; font-size: .6rem; align-self: center; white-space: normal; diff --git a/common/components/cards/SmallCard.svelte b/common/components/cards/SmallCard.svelte index ffbdbf1..d6388a0 100644 --- a/common/components/cards/SmallCard.svelte +++ b/common/components/cards/SmallCard.svelte @@ -7,8 +7,11 @@ import AudioLabel from '@/views/ViewAnime/AudioLabel.svelte' import { page } from '@/App.svelte' + import { anilistClient } from "@/modules/anilist" + import Helper from "@/modules/helper.js" /** @type {import('@/modules/al.d.ts').Media} */ export let media + export let type = null export let variables = null let preview = false @@ -23,7 +26,7 @@
{#if preview} - + {/if}
= media?.nextAiringEpisode?.episode - 1}> {#if $page === 'schedule'} @@ -42,6 +45,20 @@ cover
+ {#if type || type === 0} +
+ {#if Number.isInteger(type) && type >= 0} + + thumb_up + + {:else if Number.isInteger(type) && type < 0} + + thumb_down + + {/if} + {(Number.isInteger(type) ? Math.abs(type).toLocaleString() + (type >= 0 ? ' likes' : ' dislikes') : type)} +
+ {/if}
{#if media.mediaListEntry?.status}
diff --git a/common/modules/al.d.ts b/common/modules/al.d.ts index 05a2344..1ae5be7 100644 --- a/common/modules/al.d.ts +++ b/common/modules/al.d.ts @@ -31,6 +31,12 @@ export type Media = { isAdult?: boolean bannerImage?: string synonyms?: string[] + stats: { + scoreDistribution: { + score: number + amount: number + }[] + } nextAiringEpisode?: { episode: number airingAt: number @@ -55,6 +61,16 @@ export type Media = { status?: string customLists?: string[] score?: number + startedAt?: { + year: number + month: number + day: number + } + completedAt?: { + year: number + month: number + day: number + } } studios?: { edges: { @@ -74,7 +90,11 @@ export type Media = { relationType: string node: { id: number + idMal: number title: { + romaji?: string + english?: string + native?: string userPreferred: string } type: string @@ -97,21 +117,16 @@ export type Media = { } }[] } - // recommendations?: { - // edges?: { - // node: { - // media: { - // id: number - // title: { - // userPreferred: string - // } - // coverImage?: { - // medium: string - // } - // } - // } - // }[] - // } + recommendations?: { + edges?: { + node: { + rating: number + mediaRecommendation: { + id: number + } + } + }[] + } } export type Following = { diff --git a/common/modules/anilist.js b/common/modules/anilist.js index 35feccf..470fbd7 100644 --- a/common/modules/anilist.js +++ b/common/modules/anilist.js @@ -94,6 +94,12 @@ countryOfOrigin, isAdult, bannerImage, synonyms, +stats { + scoreDistribution { + score, + amount + } +}, nextAiringEpisode { timeUntilAiring, episode @@ -117,7 +123,17 @@ mediaListEntry { repeat, status, customLists(asArray: true), - score(format: POINT_10) + score(format: POINT_10), + startedAt { + year, + month, + day + }, + completedAt { + year, + month, + day + } }, studios(isMain: true) { nodes { @@ -135,9 +151,17 @@ relations { relationType(version:2), node { id, - title {userPreferred}, - coverImage {medium}, idMal, + title { + romaji, + english, + native, + userPreferred + }, + coverImage { + medium, + extraLarge + }, type, status, format, @@ -157,23 +181,17 @@ relations { } } } -}` - -// recommendations { -// edges { -// node { -// mediaRecommendation { -// id, -// title { -// userPreferred -// }, -// coverImage { -// medium -// } -// } -// } -// } -// } +}, + recommendations { + edges { + node { + rating, + mediaRecommendation { + id + } + } + } + }` class AnilistClient { limiter = new Bottleneck({ diff --git a/common/modules/scroll.js b/common/modules/scroll.js index 4ceb327..2a61768 100644 --- a/common/modules/scroll.js +++ b/common/modules/scroll.js @@ -28,6 +28,15 @@ export default function (t, { speed = 120, smooth = 10 } = {}) { return deltaTime / 14 } + t.addEventListener('scrolltop', () => { + pos = 0 + t.scrollTop = scrollTop + if (!moving) { + lastTime = null + update() + } + }) + t.addEventListener('pointerup', () => { pos = scrollTop = t.scrollTop }) function update () { diff --git a/common/views/ViewAnime/ToggleList.svelte b/common/views/ViewAnime/ToggleList.svelte index 69f9c15..5c79103 100644 --- a/common/views/ViewAnime/ToggleList.svelte +++ b/common/views/ViewAnime/ToggleList.svelte @@ -6,6 +6,7 @@ showMore = !showMore } export let title = 'Relations' + export let promise = null {#if list?.length} @@ -18,14 +19,17 @@ {/if}
-
+ {/if}