+8
deno.lock
+8
deno.lock
···
1
1
{
2
2
"version": "5",
3
3
"specifiers": {
4
+
"npm:@solid-primitives/resource@~0.4.2": "0.4.2_solid-js@1.9.9__seroval@1.3.2",
4
5
"npm:@tailwindcss/vite@^4.1.13": "4.1.13_vite@7.1.5__picomatch@4.0.3",
5
6
"npm:solid-devtools@~0.34.3": "0.34.3_solid-js@1.9.9__seroval@1.3.2_vite@7.1.5__picomatch@4.0.3_@babel+core@7.28.4",
6
7
"npm:solid-js@^1.9.9": "1.9.9_seroval@1.3.2",
···
531
532
"@solid-primitives/rootless",
532
533
"@solid-primitives/static-store",
533
534
"@solid-primitives/utils",
535
+
"solid-js"
536
+
]
537
+
},
538
+
"@solid-primitives/resource@0.4.2_solid-js@1.9.9__seroval@1.3.2": {
539
+
"integrity": "sha512-NY3M4adgLUS/jZLbLOT8N61oIWlCg2XlOBVvRMjNc61JyrzKTiiy9Khurjikxetjm0nt0PZv4R83lwAkbFjRkw==",
540
+
"dependencies": [
534
541
"solid-js"
535
542
]
536
543
},
···
1158
1165
"workspace": {
1159
1166
"packageJson": {
1160
1167
"dependencies": [
1168
+
"npm:@solid-primitives/resource@~0.4.2",
1161
1169
"npm:@tailwindcss/vite@^4.1.13",
1162
1170
"npm:solid-devtools@~0.34.3",
1163
1171
"npm:solid-js@^1.9.9",
+1
package.json
+1
package.json
+49
-23
src/App.tsx
+49
-23
src/App.tsx
···
1
+
import { makeCache } from "@solid-primitives/resource";
1
2
import {
2
3
type Component,
3
4
createResource,
···
17
18
username: "karitham",
18
19
range: "all_time",
19
20
});
20
-
const [artistRes] = createResource<ArtistStats, Settings>(settings, (set) =>
21
-
artists(set.username, undefined, set.range),
21
+
const [artistFetcher] = makeCache(
22
+
(set: Settings) => artists(set.username, undefined, set.range),
23
+
{
24
+
storage: localStorage,
25
+
sourceHash(source) {
26
+
return `artists-${JSON.stringify(source)}`;
27
+
},
28
+
},
22
29
);
23
-
const [groupsRes] = createResource<ReleaseGroupsStats, Settings>(
24
-
settings,
25
-
(set) => releaseGroups(set.username, undefined, set.range),
30
+
const [artistRes] = createResource(settings, artistFetcher);
31
+
const [groupsFetcher] = makeCache(
32
+
(set: Settings) => releaseGroups(set.username, undefined, set.range),
33
+
{
34
+
storage: localStorage,
35
+
sourceHash(source) {
36
+
return `groups-${JSON.stringify(source)}`;
37
+
},
38
+
},
26
39
);
40
+
const [groupsRes] = createResource(settings, groupsFetcher);
27
41
28
42
return (
29
43
<div class="bg-black min-h-screen text-white p-8">
···
79
93
};
80
94
81
95
const ArtistsItem: Component<{ artist: ArtistStatsArtist }> = (props) => {
82
-
const [image] = createResource(async () => {
83
-
if (!props.artist.artist_mbid) {
84
-
return null;
85
-
}
96
+
const [imageFetcher] = makeCache(
97
+
async (artist: ArtistStatsArtist) => {
98
+
if (!artist.artist_mbid) {
99
+
return null;
100
+
}
86
101
87
-
return await getWikidataURL(props.artist.artist_mbid).then((s) =>
88
-
s ? getWikidataThumbnail(s) : null,
89
-
);
90
-
});
102
+
return await getWikidataURL(artist.artist_mbid).then((s) =>
103
+
s ? getWikidataThumbnail(s) : null,
104
+
);
105
+
},
106
+
{
107
+
storage: localStorage,
108
+
},
109
+
);
110
+
const [image] = createResource(props.artist, imageFetcher);
91
111
92
112
return (
93
113
<div class="group relative w-40 p-4 rounded-lg bg-gray-900 transition-all duration-300 hover:bg-gray-800 cursor-pointer">
···
127
147
};
128
148
129
149
const ReleaseGroupItem: Component<{ group: ReleaseGroupsGroup }> = (props) => {
130
-
const [image] = createResource(async () => {
131
-
if (!props.group.caa_release_mbid) {
132
-
return null;
133
-
}
134
-
const result = await getReleaseImageURL(
135
-
"release",
136
-
props.group.caa_release_mbid,
137
-
);
138
-
return result[0]?.image.replace("http://", "https://");
139
-
});
150
+
const [imageFetcher] = makeCache(
151
+
async (group: ReleaseGroupsGroup) => {
152
+
if (!group.caa_release_mbid) {
153
+
return null;
154
+
}
155
+
const result = await getReleaseImageURL(
156
+
"release",
157
+
group.caa_release_mbid,
158
+
);
159
+
return result[0]?.image.replace("http://", "https://");
160
+
},
161
+
{
162
+
storage: localStorage,
163
+
},
164
+
);
165
+
const [image] = createResource(props.group, imageFetcher);
140
166
141
167
return (
142
168
<div class="group relative w-40 p-4 rounded-lg bg-gray-900 transition-all duration-300 hover:bg-gray-800 cursor-pointer">