diff --git a/components/SortLinkDropdown.tsx b/components/SortLinkDropdown.tsx index a047abf..145355f 100644 --- a/components/SortLinkDropdown.tsx +++ b/components/SortLinkDropdown.tsx @@ -1,10 +1,11 @@ import React, { ChangeEvent } from "react"; import ClickAwayHandler from "./ClickAwayHandler"; import RadioButton from "./RadioButton"; +import { Sort } from "@/types/global"; type Props = { - handleSortChange: (e: ChangeEvent) => void; - sortBy: string; + handleSortChange: (e: Sort) => void; + sortBy: Sort; toggleSortDropdown: Function; }; @@ -25,38 +26,38 @@ export default function SortLinkDropdown({
handleSortChange(Sort.NameAZ)} /> handleSortChange(Sort.NameZA)} /> handleSortChange(Sort.TitleAZ)} /> handleSortChange(Sort.TitleZA)} /> handleSortChange(Sort.DateNewestFirst)} /> handleSortChange(Sort.DateOldestFirst)} />
diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 40b606c..288f605 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -2,7 +2,7 @@ import Dropdown from "@/components/Dropdown"; import LinkCard from "@/components/LinkCard"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; -import { CollectionIncludingMembers } from "@/types/global"; +import { CollectionIncludingMembers, Sort } from "@/types/global"; import { faEllipsis, faFolder, @@ -10,7 +10,7 @@ import { } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; -import { ChangeEvent, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import MainLayout from "@/layouts/MainLayout"; import { useSession } from "next-auth/react"; import ProfilePhoto from "@/components/ProfilePhoto"; @@ -29,15 +29,15 @@ export default function Index() { const [expandDropdown, setExpandDropdown] = useState(false); const [sortDropdown, setSortDropdown] = useState(false); - const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortBy, setSortBy] = useState(Sort.NameAZ); const [activeCollection, setActiveCollection] = useState(); const [sortedLinks, setSortedLinks] = useState(links); - const handleSortChange = (event: ChangeEvent) => { - setSortBy(event.target.value); + const handleSortChange = (e: Sort) => { + setSortBy(e); }; useEffect(() => { @@ -51,15 +51,15 @@ export default function Index() { ...links.filter((e) => e.collection.id === Number(router.query.id)), ]; - if (sortBy === "Name (A-Z)") + if (sortBy === Sort.NameAZ) setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); - else if (sortBy === "Title (A-Z)") + else if (sortBy === Sort.TitleAZ) setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); - else if (sortBy === "Name (Z-A)") + else if (sortBy === Sort.NameZA) setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); - else if (sortBy === "Title (Z-A)") + else if (sortBy === Sort.TitleZA) setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); - else if (sortBy === "Date (Newest First)") + else if (sortBy === Sort.DateNewestFirst) setSortedLinks( linksArray.sort( (a, b) => @@ -67,7 +67,7 @@ export default function Index() { new Date(a.createdAt as string).getTime() ) ); - else if (sortBy === "Date (Oldest First)") + else if (sortBy === Sort.DateOldestFirst) setSortedLinks( linksArray.sort( (a, b) => diff --git a/pages/links.tsx b/pages/links.tsx index d308dbc..992184a 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -2,6 +2,7 @@ import LinkCard from "@/components/LinkCard"; import SortLinkDropdown from "@/components/SortLinkDropdown"; import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; +import { Sort } from "@/types/global"; import { faLink, faSort } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ChangeEvent, useEffect, useState } from "react"; @@ -10,25 +11,25 @@ export default function Links() { const { links } = useLinkStore(); const [sortDropdown, setSortDropdown] = useState(false); - const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortBy, setSortBy] = useState(Sort.NameAZ); const [sortedLinks, setSortedLinks] = useState(links); - const handleSortChange = (event: ChangeEvent) => { - setSortBy(event.target.value); + const handleSortChange = (e: Sort) => { + setSortBy(e); }; useEffect(() => { const linksArray = [...links]; - if (sortBy === "Name (A-Z)") + if (sortBy === Sort.NameAZ) setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); - else if (sortBy === "Title (A-Z)") + else if (sortBy === Sort.TitleAZ) setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); - else if (sortBy === "Name (Z-A)") + else if (sortBy === Sort.NameZA) setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); - else if (sortBy === "Title (Z-A)") + else if (sortBy === Sort.TitleZA) setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); - else if (sortBy === "Date (Newest First)") + else if (sortBy === Sort.DateNewestFirst) setSortedLinks( linksArray.sort( (a, b) => @@ -36,7 +37,7 @@ export default function Links() { new Date(a.createdAt as string).getTime() ) ); - else if (sortBy === "Date (Oldest First)") + else if (sortBy === Sort.DateOldestFirst) setSortedLinks( linksArray.sort( (a, b) => diff --git a/pages/search/[query].tsx b/pages/search/[query].tsx index fff55cc..fce1a47 100644 --- a/pages/search/[query].tsx +++ b/pages/search/[query].tsx @@ -3,6 +3,7 @@ import LinkCard from "@/components/LinkCard"; import SortLinkDropdown from "@/components/SortLinkDropdown"; import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; +import { Sort } from "@/types/global"; import { faFilter, faSearch, faSort } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; @@ -35,11 +36,11 @@ export default function Links() { const [filterDropdown, setFilterDropdown] = useState(false); const [sortDropdown, setSortDropdown] = useState(false); - const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortBy, setSortBy] = useState(Sort.NameAZ); const [sortedLinks, setSortedLinks] = useState(links); - const handleSortChange = (event: ChangeEvent) => { - setSortBy(event.target.value); + const handleSortChange = (e: Sort) => { + setSortBy(e); }; useEffect(() => { @@ -61,15 +62,15 @@ export default function Links() { }), ]; - if (sortBy === "Name (A-Z)") + if (sortBy === Sort.NameAZ) setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); - else if (sortBy === "Title (A-Z)") + else if (sortBy === Sort.TitleAZ) setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); - else if (sortBy === "Name (Z-A)") + else if (sortBy === Sort.NameZA) setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); - else if (sortBy === "Title (Z-A)") + else if (sortBy === Sort.TitleZA) setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); - else if (sortBy === "Date (Newest First)") + else if (sortBy === Sort.DateNewestFirst) setSortedLinks( linksArray.sort( (a, b) => @@ -77,7 +78,7 @@ export default function Links() { new Date(a.createdAt as string).getTime() ) ); - else if (sortBy === "Date (Oldest First)") + else if (sortBy === Sort.DateOldestFirst) setSortedLinks( linksArray.sort( (a, b) => diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index 4510401..190876c 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -8,6 +8,7 @@ import MainLayout from "@/layouts/MainLayout"; import { Tag } from "@prisma/client"; import useTagStore from "@/store/tags"; import SortLinkDropdown from "@/components/SortLinkDropdown"; +import { Sort } from "@/types/global"; export default function Index() { const router = useRouter(); @@ -16,14 +17,14 @@ export default function Index() { const { tags } = useTagStore(); const [sortDropdown, setSortDropdown] = useState(false); - const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortBy, setSortBy] = useState(Sort.NameAZ); const [activeTag, setActiveTag] = useState(); const [sortedLinks, setSortedLinks] = useState(links); - const handleSortChange = (event: ChangeEvent) => { - setSortBy(event.target.value); + const handleSortChange = (e: Sort) => { + setSortBy(e); }; useEffect(() => { @@ -37,15 +38,15 @@ export default function Index() { ), ]; - if (sortBy === "Name (A-Z)") + if (sortBy === Sort.NameAZ) setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); - else if (sortBy === "Title (A-Z)") + else if (sortBy === Sort.TitleAZ) setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); - else if (sortBy === "Name (Z-A)") + else if (sortBy === Sort.NameZA) setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); - else if (sortBy === "Title (Z-A)") + else if (sortBy === Sort.TitleZA) setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); - else if (sortBy === "Date (Newest First)") + else if (sortBy === Sort.DateNewestFirst) setSortedLinks( linksArray.sort( (a, b) => @@ -53,7 +54,7 @@ export default function Index() { new Date(a.createdAt as string).getTime() ) ); - else if (sortBy === "Date (Oldest First)") + else if (sortBy === Sort.DateOldestFirst) setSortedLinks( linksArray.sort( (a, b) => diff --git a/types/global.ts b/types/global.ts index a73c8a4..8e73d47 100644 --- a/types/global.ts +++ b/types/global.ts @@ -42,3 +42,12 @@ export interface PublicCollectionIncludingLinks ownerName?: string; links: Link[]; } + +export enum Sort { + NameAZ, + NameZA, + TitleAZ, + TitleZA, + DateNewestFirst, + DateOldestFirst, +}