AppearanceDropdown.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { Monitor, Moon, Sun } from 'lucide-react';
  2. import { HTMLAttributes } from 'react';
  3. import { useAppearance } from '@/common/hooks/useAppearance';
  4. import { Button } from '@/shadcn/button';
  5. import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/shadcn/dropdown-menu';
  6. export function AppearanceToggleDropdown({ className = '', ...props }: HTMLAttributes<HTMLDivElement>) {
  7. const { appearance, updateAppearance } = useAppearance();
  8. const getCurrentIcon = () => {
  9. switch (appearance) {
  10. case 'dark':
  11. return <Moon className="h-5 w-5" />;
  12. case 'light':
  13. return <Sun className="h-5 w-5" />;
  14. default:
  15. return <Monitor className="h-5 w-5" />;
  16. }
  17. };
  18. return (
  19. <div className={className} {...props}>
  20. <DropdownMenu>
  21. <DropdownMenuTrigger asChild>
  22. <Button variant="ghost" size="icon" className="h-9 w-9 rounded-md">
  23. {getCurrentIcon()}
  24. <span className="sr-only">Toggle theme</span>
  25. </Button>
  26. </DropdownMenuTrigger>
  27. <DropdownMenuContent align="end">
  28. <DropdownMenuItem onClick={() => updateAppearance('light')}>
  29. <span className="flex items-center gap-2">
  30. <Sun className="h-5 w-5" />
  31. Light
  32. </span>
  33. </DropdownMenuItem>
  34. <DropdownMenuItem onClick={() => updateAppearance('dark')}>
  35. <span className="flex items-center gap-2">
  36. <Moon className="h-5 w-5" />
  37. Dark
  38. </span>
  39. </DropdownMenuItem>
  40. <DropdownMenuItem onClick={() => updateAppearance('system')}>
  41. <span className="flex items-center gap-2">
  42. <Monitor className="h-5 w-5" />
  43. System
  44. </span>
  45. </DropdownMenuItem>
  46. </DropdownMenuContent>
  47. </DropdownMenu>
  48. </div>
  49. );
  50. }