From 0e77160e2f897cd2910ce70ccc63f0c9d7f6397a Mon Sep 17 00:00:00 2001 From: Gaurav Karakoti Date: Tue, 3 Mar 2026 06:00:36 +0000 Subject: [PATCH 1/2] Favourite Feature added --- app/page.tsx | 102 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 9 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index b66f425..a6772be 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,28 @@ 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(() => { + const storedFavorites = localStorage.getItem("favoriteTools"); + if (storedFavorites) { + setFavorites(JSON.parse(storedFavorites)); + } + }, []); + + const toggleFavorite = (e: React.MouseEvent, title: string) => { + e.preventDefault(); + e.stopPropagation(); + let updatedFavorites; + if (favorites.includes(title)) { + updatedFavorites = favorites.filter((fav) => fav !== title); + } else { + updatedFavorites = [...favorites, title]; + } + setFavorites(updatedFavorites); + localStorage.setItem("favoriteTools", JSON.stringify(updatedFavorites)); + }; const handleClearSearch = () => { setValue("txtSearch", ""); @@ -151,7 +172,7 @@ const Page = () => { __basis: classifyBasis(item?.title || "", item?.url || ""), })); - const filteredItems = itemsWithMeta + let filteredItems = itemsWithMeta .filter((item) => searchTerm ? (item?.title || "") @@ -162,6 +183,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.title)); + } else { + filteredItems.sort((a, b) => { + const aFav = favorites.includes(a.title); + const bFav = favorites.includes(b.title); + 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 +265,13 @@ const Page = () => {