From a3703c30807621ddd4dce7b3cae0918d79fa8de1 Mon Sep 17 00:00:00 2001 From: Biswa Kalyan Bhuyan Date: Thu, 24 Apr 2025 09:33:48 +0530 Subject: feat: updated advance ui and animation --- frontend/src/components/shared/ThemeToggle.tsx | 53 +++++++++++++++++++++----- 1 file changed, 43 insertions(+), 10 deletions(-) (limited to 'frontend/src/components/shared/ThemeToggle.tsx') diff --git a/frontend/src/components/shared/ThemeToggle.tsx b/frontend/src/components/shared/ThemeToggle.tsx index 679bbc5..b54bda9 100644 --- a/frontend/src/components/shared/ThemeToggle.tsx +++ b/frontend/src/components/shared/ThemeToggle.tsx @@ -1,36 +1,69 @@ 'use client'; +import { useState, useEffect } from 'react'; import { Moon, Sun } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { useTheme } from './ThemeProvider'; export function ThemeToggle() { const { theme, setTheme } = useTheme(); + const [isAnimating, setIsAnimating] = useState(false); + + // Track initial mount to prevent animation on first render + const [isMounted, setIsMounted] = useState(false); + useEffect(() => { + setIsMounted(true); + }, []); const toggleTheme = () => { - if (theme === 'dark') { - setTheme('light'); - } else { - setTheme('dark'); - } + if (isAnimating) return; + + setIsAnimating(true); + + // Set new theme after a small delay for animation + const newTheme = theme === 'dark' ? 'light' : 'dark'; + setTimeout(() => { + setTheme(newTheme); + setTimeout(() => { + setIsAnimating(false); + }, 300); + }, 200); }; + if (!isMounted) { + return ( + + ); + } + return ( ); } \ No newline at end of file -- cgit v1.2.3-59-g8ed1b