feat: add StopSoundsButton component to control sound playback in the sidebar
This commit is contained in:
@@ -18,6 +18,7 @@ import {
|
|||||||
import { CreditsNav } from './nav/CreditsNav'
|
import { CreditsNav } from './nav/CreditsNav'
|
||||||
import { NavGroup } from './nav/NavGroup'
|
import { NavGroup } from './nav/NavGroup'
|
||||||
import { NavItem } from './nav/NavItem'
|
import { NavItem } from './nav/NavItem'
|
||||||
|
import { StopSoundsButton } from './nav/StopSoundsButton'
|
||||||
import { UserNav } from './nav/UserNav'
|
import { UserNav } from './nav/UserNav'
|
||||||
import { CompactPlayer } from './player/CompactPlayer'
|
import { CompactPlayer } from './player/CompactPlayer'
|
||||||
|
|
||||||
@@ -67,6 +68,8 @@ export function AppSidebar({ showCompactPlayer = false }: AppSidebarProps) {
|
|||||||
<Separator className="mb-1 group-data-[collapsible=icon]:hidden" />
|
<Separator className="mb-1 group-data-[collapsible=icon]:hidden" />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
<StopSoundsButton />
|
||||||
|
<Separator className="mb-1 group-data-[collapsible=icon]:hidden" />
|
||||||
<CreditsNav user={user} />
|
<CreditsNav user={user} />
|
||||||
<Separator className="mb-1 group-data-[collapsible=icon]:hidden" />
|
<Separator className="mb-1 group-data-[collapsible=icon]:hidden" />
|
||||||
<UserNav user={user} logout={logout} />
|
<UserNav user={user} logout={logout} />
|
||||||
|
|||||||
44
src/components/nav/StopSoundsButton.tsx
Normal file
44
src/components/nav/StopSoundsButton.tsx
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { useState } from 'react'
|
||||||
|
import { Square } from 'lucide-react'
|
||||||
|
import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'
|
||||||
|
import { soundsService } from '@/lib/api/services/sounds'
|
||||||
|
import { toast } from 'sonner'
|
||||||
|
|
||||||
|
export function StopSoundsButton() {
|
||||||
|
const [isLoading, setIsLoading] = useState(false)
|
||||||
|
|
||||||
|
const handleStopSounds = async () => {
|
||||||
|
setIsLoading(true)
|
||||||
|
try {
|
||||||
|
await soundsService.stopSounds()
|
||||||
|
toast.success('All sounds stopped')
|
||||||
|
} catch (error) {
|
||||||
|
toast.error(
|
||||||
|
`Failed to stop sounds: ${error instanceof Error ? error.message : 'Unknown error'}`
|
||||||
|
)
|
||||||
|
} finally {
|
||||||
|
setIsLoading(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const tooltipText = isLoading ? 'Stopping sounds...' : 'Stop All Sounds'
|
||||||
|
|
||||||
|
return (
|
||||||
|
<SidebarMenu>
|
||||||
|
<SidebarMenuItem>
|
||||||
|
<SidebarMenuButton
|
||||||
|
size="lg"
|
||||||
|
onClick={handleStopSounds}
|
||||||
|
disabled={isLoading}
|
||||||
|
tooltip={tooltipText}
|
||||||
|
className="group-data-[collapsible=icon]:justify-center text-red-600 hover:text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:text-red-300 dark:hover:bg-red-950/50"
|
||||||
|
>
|
||||||
|
<Square className="h-5 w-5 fill-current" />
|
||||||
|
<span className="font-semibold group-data-[collapsible=icon]:hidden">
|
||||||
|
{isLoading ? 'Stopping...' : 'Stop All Sounds'}
|
||||||
|
</span>
|
||||||
|
</SidebarMenuButton>
|
||||||
|
</SidebarMenuItem>
|
||||||
|
</SidebarMenu>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user