// Copyright (C) 2022-present Daniel31x13 // This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . import Checkbox from "@/components/Checkbox"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import LinkList from "@/components/LinkList"; import RadioButton from "@/components/RadioButton"; import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; import useSearchSettingsStore from "@/store/search"; import { faFilter, faSearch, faSort } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ChangeEvent, useEffect, useState } from "react"; export default function Links() { const { links } = useLinkStore(); const [filterDropdown, setFilterDropdown] = useState(false); const [sortDropdown, setSortDropdown] = useState(false); const [sortBy, setSortBy] = useState("Name (A-Z)"); const [sortedLinks, setSortedLinks] = useState(links); const { searchSettings, toggleCheckbox, setSearchSettings, setSearchQuery } = useSearchSettingsStore(); const handleSortChange = (event: ChangeEvent) => { setSortBy(event.target.value); }; const { name, url, title, collection, tags } = searchSettings.filter; useEffect(() => { const linksArray = [ ...links.filter((link) => { const query = searchSettings.query.toLowerCase(); if ( (name && link.name.toLowerCase().includes(query)) || (url && link.url.toLowerCase().includes(query)) || (title && link.title.toLowerCase().includes(query)) || (collection && link.collection.name.toLowerCase().includes(query)) || (tags && link.tags.some((tag) => tag.name.toLowerCase().includes(query))) ) return true; }), ]; if (sortBy === "Name (A-Z)") setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); else if (sortBy === "Title (A-Z)") setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); else if (sortBy === "Name (Z-A)") setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); else if (sortBy === "Title (Z-A)") setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); else if (sortBy === "Date (Newest First)") setSortedLinks( linksArray.sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() ) ); else if (sortBy === "Date (Oldest First)") setSortedLinks( linksArray.sort( (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() ) ); }, [searchSettings, links, sortBy]); return (

Search Results

setFilterDropdown(!filterDropdown)} id="filter-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" >
{filterDropdown ? ( { const target = e.target as HTMLInputElement; if (target.id !== "filter-dropdown") setFilterDropdown(false); }} className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-20 border border-sky-100 w-40" >

Filter by

toggleCheckbox("name")} /> toggleCheckbox("url")} /> toggleCheckbox("title")} /> toggleCheckbox("collection")} /> toggleCheckbox("tags")} />
) : null}
setSortDropdown(!sortDropdown)} id="sort-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" >
{sortDropdown ? ( { const target = e.target as HTMLInputElement; if (target.id !== "sort-dropdown") setSortDropdown(false); }} className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" >

Sort by

) : null}
{sortedLinks[0] ? ( sortedLinks.map((e, i) => { return ; }) ) : (

Nothing found.{" "} ¯\_(ツ)_/¯

)}
); }