diff --git a/src/App.tsx b/src/App.tsx index 1eab7b1..47af9a2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,8 @@ import { createResource, createSignal, For, + type JSXElement, + type Resource, Show, Suspense, } from "solid-js"; @@ -20,12 +22,15 @@ export type Settings = { export default () => { const [settings, setSettings] = createSignal({ - username: "karitham", + username: "", range: "this_month", count: 10, }); const [artistFetcher] = makeCache( - (set: Settings) => artists(set.username, undefined, set.range, set.count), + (set: Settings) => { + if (set.username) + return artists(set.username, undefined, set.range, set.count); + }, { storage: localStorage, sourceHash(source) { @@ -35,7 +40,10 @@ export default () => { ); const [artistRes] = createResource(settings, artistFetcher); const [releasesFetcher] = makeCache( - (set: Settings) => releases(set.username, undefined, set.range, set.count), + (set: Settings) => { + if (set.username) + return releases(set.username, undefined, set.range, set.count); + }, { storage: localStorage, sourceHash(source) { @@ -72,30 +80,41 @@ export default () => { range: e.target.value as Range, })); }} - class="p-4 rounded-lg bg-gray-800 text-white focus:outline-none focus:ring-2 focus:ring-green-500 w-full sm:w-auto" + class="p-4 rounded-lg bg-gray-800 text-white focus:outline-none focus:ring-2 focus:ring-green-500 w-full sm:w-auto capitalize" > {ranges.map((r) => ( - + ))} Loading...

} > -
-
-

- Top Artists -

- -
+ + Waiting for a valid username... +

+ } + >
-

- Top Albums -

- +
+

+ Top Artists +

+ +
+
+

+ Top Albums +

+ +
-
+
@@ -106,117 +125,133 @@ const Artists: Component<{ artists: ArtistStatsArtist[] }> = (props) => { return (
- {(artist) => } + {(artist) => }
); }; -const ArtistsItem: Component<{ artist: ArtistStatsArtist }> = (props) => { +export const ArtistsItem: Component<{ item: ArtistStatsArtist }> = (props) => { const [imageFetcher] = makeCache( async (artist: ArtistStatsArtist) => { - if (!artist.artist_mbid) { - return null; - } - + if (!artist.artist_mbid) return null; return await getWikidataURL(artist.artist_mbid).then((s) => s ? getWikidataThumbnail(s) : null, ); }, - { - storage: localStorage, - }, + { storage: localStorage }, ); - const [image] = createResource(props.artist, imageFetcher); + const [image] = createResource(() => props.item, imageFetcher); return ( -
-
- } - > - {`Thumbnail - -

- - {props.artist.artist_name} - -

-

- {props.artist.listen_count} listens -

- + ); }; -const ReleaseGroups: Component<{ groups: Release[] }> = (props) => { +const Releases: Component<{ groups: Release[] }> = (props) => { return (
- {(group) => } + {(release) => }
); }; -const ReleaseGroupItem: Component<{ release: Release }> = (props) => { +export const ReleaseItem: Component<{ item: Release }> = (props) => { const [imageFetcher] = makeCache( async (release: Release) => { - if (!release.caa_release_mbid) { - return null; - } + if (!release.caa_release_mbid) return null; const result = await getReleaseImageURL( "release", release.caa_release_mbid, ); return result[0]?.image.replace("http://", "https://"); }, - { - storage: localStorage, - }, + { storage: localStorage }, + ); + const [image] = createResource(() => props.item, imageFetcher); + + return ( + ); - const [image] = createResource(props.release, imageFetcher); +}; +type CardSectionProps = { + title: string; + resource: Resource; + ItemComponent: (props: { item: T }) => JSXElement; + fallbackMessage: string; +}; + +export const CardSection = (props: CardSectionProps) => { + return ( +
+

{props.title}

+ 0} + fallback={ +

{props.fallbackMessage}

+ } + > +
+ + {(item) => } + +
+
+
+ ); +}; + +type CardItemProps = { + imageUrl: string | null | undefined; + imageFallbackUrl: string; + imageLoading: boolean; + title: string; + subtitle: string; + linkUrl: string; + isCircularImage?: boolean; +}; + +export const CardItem: Component = (props) => { return (
+
} > {`Cover

- - {props.release.release_name} + + {props.title}

-

- {props.release.listen_count} listens -

+

{props.subtitle}

); };