Fork of atp.tools as a universal profile for people on the ATmosphere
at main 49 lines 1.5 kB view raw
1"use client"; 2import { useTheme } from "@/providers/themeProvider"; 3import { useEffect, useState } from "react"; 4import { ChevronsUpDown, Circle, Moon, Sun } from "lucide-react"; 5import { Button } from "./ui/button"; 6import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; 7 8const THEMES: ("dark" | "light")[] = ["dark", "light"]; 9 10export function ColorToggle() { 11 const { setTheme, theme } = useTheme(); 12 const [isOpen, setIsOpen] = useState(false); 13 const [mounted, setMounted] = useState(false); 14 useEffect(() => { 15 setMounted(true); 16 }, []); 17 18 const DarkLightIcon = !mounted ? Circle : theme === "dark" ? Moon : Sun; 19 20 return ( 21 <Popover open={isOpen} onOpenChange={() => setIsOpen(!isOpen)}> 22 <PopoverTrigger asChild> 23 <Button 24 variant="outline" 25 className="gap-2 mr-0 rounded-l-none flex-row align-middle w-full" 26 > 27 <DarkLightIcon className="h-4 w-4" /> 28 Theme 29 <ChevronsUpDown className="h-4 w-4 opacity-50" /> 30 </Button> 31 </PopoverTrigger> 32 <PopoverContent className="w-[200px]"> 33 <div className="grid gap-1 p-2"> 34 {THEMES.map((t) => ( 35 <button 36 onClick={() => { 37 setTheme(t); 38 setIsOpen(false); 39 }} 40 className="flex items-center justify-between rounded-sm p-2 text-sm hover:bg-accent" 41 > 42 {t} 43 </button> 44 ))} 45 </div> 46 </PopoverContent> 47 </Popover> 48 ); 49}