diff --git a/app/page.tsx b/app/page.tsx index b66f425..faab675 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,5 @@ "use client"; -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import BBIcon from "./components/theme/Icon/bbIcon"; import DevelopmentToolsStyles from "./developmentToolsStyles.module.scss"; import { InputField } from "./components/theme/form/formFeildComponent"; @@ -119,7 +119,6 @@ const classifyBasis = (title: string, url: string): BasisType => { if (t.includes("date") || t.includes("time")) return "Date/Time"; - return "All"; }; @@ -129,6 +128,38 @@ const Page = () => { const [searchTerm, setSearchTerm] = useState(""); const [selectedCategory, setSelectedCategory] = useState(null); const [selectedBasis, setSelectedBasis] = useState("All"); + const [favorites, setFavorites] = useState([]); + const [showFavoritesOnly, setShowFavoritesOnly] = useState(false); + + useEffect(() => { + try { + const storedFavorites = localStorage.getItem("favoriteTools"); + if (storedFavorites) { + setFavorites(JSON.parse(storedFavorites)); + } + } catch (error) { + console.error("Failed to parse favorites from localStorage:", error); + setFavorites([]); + } + }, []); + + const toggleFavorite = (e: React.MouseEvent, url: string) => { + e.preventDefault(); + e.stopPropagation(); + let updatedFavorites; + if (favorites.includes(url)) { + updatedFavorites = favorites.filter((fav) => fav !== url); + } else { + updatedFavorites = [...favorites, url]; + } + setFavorites(updatedFavorites); + + try { + localStorage.setItem("favoriteTools", JSON.stringify(updatedFavorites)); + } catch (error) { + console.error("Failed to save favorites to localStorage:", error); + } + }; const handleClearSearch = () => { setValue("txtSearch", ""); @@ -151,7 +182,7 @@ const Page = () => { __basis: classifyBasis(item?.title || "", item?.url || ""), })); - const filteredItems = itemsWithMeta + let filteredItems = itemsWithMeta .filter((item) => searchTerm ? (item?.title || "") @@ -162,6 +193,18 @@ const Page = () => { .filter((item) => (selectedCategory ? item.__group === selectedCategory : true)) .filter((item) => (selectedBasis === "All" ? true : item.__basis === selectedBasis)); + if (showFavoritesOnly) { + filteredItems = filteredItems.filter((item) => favorites.includes(item.url)); + } else { + filteredItems.sort((a, b) => { + const aFav = favorites.includes(a.url); + const bFav = favorites.includes(b.url); + if (aFav && !bFav) return -1; + if (!aFav && bFav) return 1; + return 0; + }); + } + const countsByGroup: Record = CATEGORY_GROUPS.reduce( (acc, g) => ({ ...acc, [g]: itemsWithMeta.filter((i) => i.__group === g).length }), {} as Record @@ -232,12 +275,13 @@ const Page = () => {