Skip to content

Commit 7915774

Browse files
authored
Merge pull request #13 from Roshanjossey/move-icon-date-fetching-to-client-side
move fetching icons to client side
2 parents 5d55709 + 8f129e6 commit 7915774

File tree

3 files changed

+70
-56
lines changed

3 files changed

+70
-56
lines changed

src/lib/stores/iconStore.ts

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,76 @@ export const selectedTags: Writable<string[]> = writable([])
88
export const isDarkMode: Writable<boolean> = writable(false)
99
export const selectedIcon: Writable<IIcon | null> = writable(null)
1010
export const isModalOpen: Writable<boolean> = writable(false)
11+
export const isLoading: Writable<boolean> = writable(false)
12+
export const error: Writable<string | null> = writable(null)
1113

12-
export function initializeStore(
13-
initialIcons: IIcon[],
14-
initialTags: string[],
15-
): void {
16-
icons.set(initialIcons)
17-
availableTags.set(initialTags)
14+
export async function fetchIconsData(): Promise<void> {
15+
isLoading.set(true)
16+
error.set(null)
17+
18+
try {
19+
const response = await fetch(
20+
"https://raw.githubusercontent.com/devicons/devicon/master/devicon.json",
21+
)
22+
23+
if (!response.ok) {
24+
throw new Error(`Failed to fetch icons: ${response.statusText}`)
25+
}
26+
27+
const iconsData: IIcon[] = await response.json()
28+
29+
// Extract all available tags
30+
const availableTagsSet = new Set<string>()
31+
iconsData.forEach((icon) => {
32+
if (icon.tags && Array.isArray(icon.tags)) {
33+
icon.tags.forEach((tag) => availableTagsSet.add(tag))
34+
}
35+
})
1836

19-
// Check local storage for dark mode preference
37+
const sortedTags = Array.from(availableTagsSet).sort()
38+
39+
// Set the data in stores
40+
icons.set(iconsData)
41+
availableTags.set(sortedTags)
42+
43+
// Initialize dark mode preference
44+
initializeDarkMode()
45+
} catch (err: any) {
46+
console.error("Error fetching icons:", err)
47+
error.set(err.message)
48+
icons.set([])
49+
availableTags.set([])
50+
} finally {
51+
isLoading.set(false)
52+
}
53+
}
54+
55+
function initializeDarkMode(): void {
2056
if (typeof window !== "undefined") {
21-
const storedDarkMode = localStorage.getItem("darkMode") === "true"
22-
isDarkMode.set(storedDarkMode)
57+
// Check local storage for dark mode preference, default to true if not set
58+
const storedDarkMode = localStorage.getItem("darkMode")
59+
const isDark = storedDarkMode === null ? true : storedDarkMode === "true"
60+
61+
isDarkMode.set(isDark)
2362

2463
// Apply theme to document
25-
if (storedDarkMode) {
64+
if (isDark) {
2665
document.documentElement.classList.add("dark")
66+
} else {
67+
document.documentElement.classList.remove("dark")
2768
}
2869
}
2970
}
3071

72+
export function initializeStore(
73+
initialIcons: IIcon[],
74+
initialTags: string[],
75+
): void {
76+
icons.set(initialIcons)
77+
availableTags.set(initialTags)
78+
initializeDarkMode()
79+
}
80+
3181
export const filteredIcons: Readable<IIcon[]> = derived(
3282
[icons, searchTerm, selectedTags],
3383
([$icons, $searchTerm, $selectedTags]) => {

src/routes/+page.server.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/routes/+page.svelte

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
11
<script lang="ts">
22
import { onMount } from "svelte"
33
import IconGrid from "../components/iconGrid/IconGrid.svelte"
4-
54
import IconModal from "../components/modal/IconModal.svelte"
65
import {
7-
initializeStore,
6+
fetchIconsData,
87
filteredIcons,
98
isModalOpen,
9+
isLoading,
10+
error,
1011
} from "$lib/stores/iconStore"
1112
import FiltersBar from "../components/filters/FiltersBar.svelte"
1213
13-
export let data
14-
1514
onMount(() => {
16-
const tags: string[] = Array.isArray(data.availableTags)
17-
? data.availableTags.map((tag) => String(tag))
18-
: []
19-
20-
initializeStore(data.icons, tags)
15+
fetchIconsData()
2116
})
2217
</script>
2318

2419
<main class="min-h-screen dark:bg-gray-900 dark:text-white">
2520
<div class="base-container">
26-
{#if data.error}
21+
{#if $isLoading}
22+
<div class="flex items-center justify-center py-8">
23+
<div class="text-lg">Loading icons...</div>
24+
</div>
25+
{:else if $error}
2726
<div class="rounded-lg bg-red-100 p-4 dark:bg-red-900">
28-
<p class="text-red-700 dark:text-red-300">Error: {data.error}</p>
27+
<p class="text-red-700 dark:text-red-300">Error: {$error}</p>
2928
</div>
3029
{:else}
3130
<FiltersBar />

0 commit comments

Comments
 (0)