diff --git a/src/components/islands/loading-component.jsx b/src/components/islands/loading-component.jsx new file mode 100644 index 0000000..53620a0 --- /dev/null +++ b/src/components/islands/loading-component.jsx @@ -0,0 +1,26 @@ + + +export default function LoadingComponent() { + + + return ( +
+

+ +

+ + {/* List of recent searches or placeholders */} +
    + {[...Array(5)].map((_, i) => ( +
  1. +
    +
  2. + ))} + +
+
+ ); +} diff --git a/src/components/islands/recent-searches.jsx b/src/components/islands/recent-searches.jsx index fcb4006..7a98c0e 100644 --- a/src/components/islands/recent-searches.jsx +++ b/src/components/islands/recent-searches.jsx @@ -1,32 +1,35 @@ -import { useEffect } from "react"; -import { useStore } from "@nanostores/react"; +import { useEffect, useState } from 'react'; +import { useStore } from '@nanostores/react'; import { $recentSearches } from "../../lib/stores/search.js"; -/** - * Recent Searches Component - An Island that displays a user's last 5 searches - * - * @todo implement a default list instead of `null` when no `$recentSearch` is found - * @todo implement loading component to avoid flickering UI - */ export default function RecentSearches() { const recentSearches = useStore($recentSearches); - + useEffect(() => { - $recentSearches.set({...JSON.parse(localStorage.getItem("jargons.dev:recent_searches"))}) + const savedSearches = JSON.parse(localStorage.getItem("jargons.dev:recent_searches")); + if (savedSearches) { + $recentSearches.set(savedSearches); + } + + const loader = document.querySelector(".loading"); + if (loader) loader.remove(); + }, []); + + return Object.values(recentSearches).length ? (
-

Recent

-
    +

    Recent

    +
      {Object.values(recentSearches).slice(0, 5).map((item, i) => (
    1. - { item.word } + {item.word}
    2. ))} -
    -
+ + ) : null; -} \ No newline at end of file +} diff --git a/src/components/recent-searches.astro b/src/components/recent-searches.astro new file mode 100644 index 0000000..482d473 --- /dev/null +++ b/src/components/recent-searches.astro @@ -0,0 +1,7 @@ +--- +import RecentSearch from "./islands/recent-searches"; +import LoadingComponent from "./islands/loading-component"; +--- + + + \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro index 89ec8ba..e37f29d 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -2,37 +2,39 @@ import { getCollection } from "astro:content"; import BaseLayout from "../layouts/base.astro"; import Search from "../components/islands/search.jsx"; -import RecentSearches from "../components/islands/recent-searches.jsx"; - +import RecentSearches from "../components/recent-searches.astro"; const dictionary = await getCollection("dictionary"); --- - -
- -
-

- - jargons.dev - - Dictionary -

-
- - - +
+ +
+

+ + jargons.dev + + Dictionary +

+
+ + + - -
+ + +