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...
}
>
-
-
+
+ Waiting for a valid username...
+
+ }
+ >
-
- Top Albums
-
-
+
+
+
+ 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 (
-
-
- }
- >
-
-
-
-
- {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}
+ }
+ >
+
+
+
+ );
+};
+
+type CardItemProps = {
+ imageUrl: string | null | undefined;
+ imageFallbackUrl: string;
+ imageLoading: boolean;
+ title: string;
+ subtitle: string;
+ linkUrl: string;
+ isCircularImage?: boolean;
+};
+
+export const CardItem: Component = (props) => {
return (
+
}
>
-
- {props.release.release_name}
+
+ {props.title}
-
- {props.release.listen_count} listens
-
+ {props.subtitle}
);
};