diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index aa9cd58..908253b 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -1,16 +1,16 @@ -import { useState } from "react"; +import { useRef, useState, type RefObject } from "react"; import { HomeIcon } from "@/components/ui/home"; import { HistoryIcon } from "@/components/ui/history-icon"; import { SettingsIcon } from "@/components/ui/settings"; -import { ActivityIcon } from "@/components/ui/activity"; +import { ActivityIcon, type ActivityIconHandle } from "@/components/ui/activity"; import { TerminalIcon } from "@/components/ui/terminal"; -import { FileMusicIcon } from "@/components/ui/file-music"; -import { FilePenIcon } from "@/components/ui/file-pen"; +import { FileMusicIcon, type FileMusicIconHandle } from "@/components/ui/file-music"; +import { FilePenIcon, type FilePenIconHandle } from "@/components/ui/file-pen"; import { CoffeeIcon } from "@/components/ui/coffee"; import { BadgeAlertIcon } from "@/components/ui/badge-alert"; import { GithubIcon } from "@/components/ui/github"; import { BlocksIcon } from "@/components/ui/blocks-icon"; -import { AudioLinesIcon } from "@/components/ui/audio-lines"; +import { AudioLinesIcon, type AudioLinesIconHandle } from "@/components/ui/audio-lines"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Checkbox } from "@/components/ui/checkbox"; @@ -23,9 +23,19 @@ interface SidebarProps { currentPage: PageType; onPageChange: (page: PageType) => void; } + +interface AnimatedIconHandle { + startAnimation: () => void; + stopAnimation: () => void; +} + export function Sidebar({ currentPage, onPageChange }: SidebarProps) { const [isIssuesDialogOpen, setIsIssuesDialogOpen] = useState(false); const [hasIssueAgreement, setHasIssueAgreement] = useState(false); + const analyzerIconRef = useRef(null); + const converterIconRef = useRef(null); + const resamplerIconRef = useRef(null); + const fileManagerIconRef = useRef(null); const handleIssuesDialogChange = (open: boolean) => { setIsIssuesDialogOpen(open); if (!open) { @@ -36,6 +46,12 @@ export function Sidebar({ currentPage, onPageChange }: SidebarProps) { openExternal("https://github.com/afkarxyz/SpotiFLAC/issues"); handleIssuesDialogChange(false); }; + const getAnimatedItemHandlers = (iconRef: RefObject) => ({ + onMouseEnter: () => iconRef.current?.startAnimation(), + onMouseLeave: () => iconRef.current?.stopAnimation(), + onFocus: () => iconRef.current?.startAnimation(), + onBlur: () => iconRef.current?.stopAnimation(), + }); return (
@@ -96,20 +112,20 @@ export function Sidebar({ currentPage, onPageChange }: SidebarProps) { - onPageChange("audio-analysis")} className="gap-3 cursor-pointer py-2 px-3"> - + onPageChange("audio-analysis")} className="gap-3 cursor-pointer py-2 px-3" {...getAnimatedItemHandlers(analyzerIconRef)}> + Audio Quality Analyzer - onPageChange("audio-converter")} className="gap-3 cursor-pointer py-2 px-3"> - + onPageChange("audio-converter")} className="gap-3 cursor-pointer py-2 px-3" {...getAnimatedItemHandlers(converterIconRef)}> + Audio Converter - onPageChange("audio-resampler")} className="gap-3 cursor-pointer py-2 px-3"> - + onPageChange("audio-resampler")} className="gap-3 cursor-pointer py-2 px-3" {...getAnimatedItemHandlers(resamplerIconRef)}> + Audio Resampler - onPageChange("file-manager")} className="gap-3 cursor-pointer py-2 px-3"> - + onPageChange("file-manager")} className="gap-3 cursor-pointer py-2 px-3" {...getAnimatedItemHandlers(fileManagerIconRef)}> + File Manager