"use client" import * as React from "react" import { ListFilterIcon } from "lucide-react" import { Button } from "@/components/ui/button" import { ContentHeader, SidebarToggleButton } from "@/components/custom/content-header" import { useMedia } from "react-use" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { useAtom } from "jotai" import { linkSortAtom } from "@/store/link" import { atom } from "jotai" import { LEARNING_STATES } from "@/lib/constants" import { useQueryState, parseAsStringLiteral } from "nuqs" import { FancySwitch } from "@omit/react-fancy-switch" import { cn } from "@/lib/utils" const ALL_STATES = [{ label: "All", value: "all", icon: "List", className: "text-foreground" }, ...LEARNING_STATES] const ALL_STATES_STRING = ALL_STATES.map(ls => ls.value) export const learningStateAtom = atom("all") export const LinkHeader = React.memo(() => { const isTablet = useMedia("(max-width: 1024px)") return ( <>
Links
{!isTablet && }
{isTablet && (
)} ) }) LinkHeader.displayName = "LinkHeader" const LearningTab = React.memo(() => { const [activeTab, setActiveTab] = useAtom(learningStateAtom) const [activeState, setActiveState] = useQueryState( "state", parseAsStringLiteral(Object.values(ALL_STATES_STRING)).withDefault(ALL_STATES_STRING[0]) ) const handleTabChange = React.useCallback( (value: string) => { setActiveTab(value) setActiveState(value) }, [setActiveTab, setActiveState] ) React.useEffect(() => { setActiveTab(activeState) }, [activeState, setActiveTab]) return ( { handleTabChange(value as string) }} options={ALL_STATES} className="bg-secondary flex rounded-lg" highlighterClassName="bg-secondary-foreground/10 rounded-lg" radioClassName={cn( "relative mx-2 flex h-8 cursor-pointer items-center justify-center rounded-full px-1 text-sm text-secondary-foreground/60 data-[checked]:text-secondary-foreground font-medium transition-colors focus:outline-none" )} highlighterIncludeMargin={true} /> ) }) LearningTab.displayName = "LearningTab" const FilterAndSort = React.memo(() => { const [sort, setSort] = useAtom(linkSortAtom) const [sortOpen, setSortOpen] = React.useState(false) const getFilterText = React.useCallback(() => { return sort.charAt(0).toUpperCase() + sort.slice(1) }, [sort]) const handleSortChange = React.useCallback( (value: string) => { setSort(value) setSortOpen(false) }, [setSort] ) return (
) }) FilterAndSort.displayName = "FilterAndSort"