diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index df6d7d8..77e2bfb 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -32,6 +32,8 @@ import { UserMenuContent } from '@/components/user-menu-content'; import { useCurrentUrl } from '@/hooks/use-current-url'; import { useInitials } from '@/hooks/use-initials'; import { cn } from '@/lib/utils'; +import { dashboard, home } from '@/routes'; +import { dashboard as adminDashboard } from '@/routes/admin'; import type { BreadcrumbItem, NavItem } from '@/types'; type Props = { @@ -49,12 +51,12 @@ export function AppHeader({ breadcrumbs = [] }: Props) { const mainNavItems: NavItem[] = [ { title: 'Live', - href: '/', + href: home(), icon: Radio, }, { title: 'Studio', - href: '/dashboard', + href: dashboard(), icon: LayoutGrid, }, ]; @@ -62,7 +64,7 @@ export function AppHeader({ breadcrumbs = [] }: Props) { if (auth.user?.is_admin) { mainNavItems.push({ title: 'Admin', - href: '/admin', + href: adminDashboard(), icon: Shield, }); } @@ -118,7 +120,7 @@ export function AppHeader({ breadcrumbs = [] }: Props) { @@ -167,7 +169,7 @@ export function AppHeader({ breadcrumbs = [] }: Props) { size="icon" className="group h-9 w-9 cursor-pointer" > - + @@ -175,7 +177,7 @@ export function AppHeader({ breadcrumbs = [] }: Props) { diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index 65cabad..e568319 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -12,6 +12,8 @@ import { SidebarMenuButton, SidebarMenuItem, } from '@/components/ui/sidebar'; +import { dashboard, home } from '@/routes'; +import { dashboard as adminDashboard } from '@/routes/admin'; import type { NavItem } from '@/types'; export function AppSidebar() { @@ -19,12 +21,12 @@ export function AppSidebar() { const mainNavItems: NavItem[] = [ { title: 'Live', - href: '/', + href: home(), icon: Radio, }, { title: 'Studio', - href: '/dashboard', + href: dashboard(), icon: LayoutGrid, }, ]; @@ -32,7 +34,7 @@ export function AppSidebar() { if (auth.user?.is_admin) { mainNavItems.push({ title: 'Admin', - href: '/admin', + href: adminDashboard(), icon: Shield, }); } @@ -43,7 +45,7 @@ export function AppSidebar() { - + diff --git a/resources/js/pages/admin/dashboard.tsx b/resources/js/pages/admin/dashboard.tsx index 39122cc..d99ed80 100644 --- a/resources/js/pages/admin/dashboard.tsx +++ b/resources/js/pages/admin/dashboard.tsx @@ -1,6 +1,10 @@ import { Head, Link, router } from '@inertiajs/react'; import { Ban, Radio, Shield, StopCircle, Undo2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; +import { dashboard as adminDashboard } from '@/routes/admin'; +import { stop as stopBroadcast } from '@/routes/admin/broadcasts'; +import { restore, suspend } from '@/routes/admin/channels'; +import { show as showChannel } from '@/routes/channels'; type LiveBroadcast = { id: number; @@ -89,7 +93,9 @@ export default function AdminDashboard({
@@ -148,7 +152,7 @@ export default function AdminDashboard({ size="sm" onClick={() => router.post( - `/admin/channels/${channel.slug}/restore`, + restore(channel.slug), ) } > @@ -161,7 +165,7 @@ export default function AdminDashboard({ size="sm" onClick={() => router.post( - `/admin/channels/${channel.slug}/suspend`, + suspend(channel.slug), ) } > @@ -183,7 +187,7 @@ AdminDashboard.layout = { breadcrumbs: [ { title: 'Admin', - href: '/admin', + href: adminDashboard(), }, ], }; diff --git a/resources/js/pages/channels/show.tsx b/resources/js/pages/channels/show.tsx index 6b897e3..b8ab8f1 100644 --- a/resources/js/pages/channels/show.tsx +++ b/resources/js/pages/channels/show.tsx @@ -12,6 +12,9 @@ import type { FormEvent } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { VideoPlayer } from '@/components/video-player'; +import { home, login } from '@/routes'; +import { follow, unfollow } from '@/routes/channels'; +import { store as storeChat } from '@/routes/channels/chat'; import type { BroadcastSummary, ChannelDetail, @@ -39,7 +42,7 @@ export default function ChannelShow({ function submitChat(event: FormEvent) { event.preventDefault(); - chatForm.post(`/channels/${channel.slug}/chat`, { + chatForm.submit(storeChat(channel.slug), { preserveScroll: true, onSuccess: () => chatForm.reset('body'), }); @@ -108,13 +111,13 @@ export default function ChannelShow({ onClick={() => isFollowing ? router.delete( - `/channels/${channel.slug}/follow`, + unfollow(channel.slug), { preserveScroll: true, }, ) : router.post( - `/channels/${channel.slug}/follow`, + follow(channel.slug), undefined, { preserveScroll: true, @@ -127,7 +130,7 @@ export default function ChannelShow({ ) : ( )}
@@ -258,7 +261,7 @@ ChannelShow.layout = { breadcrumbs: [ { title: 'Channel', - href: '/', + href: home(), }, ], }; diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index 057576f..71d0695 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,4 +1,4 @@ -import { Head, router, useForm } from '@inertiajs/react'; +import { Head, Link, router, useForm } from '@inertiajs/react'; import { Copy, KeyRound, @@ -13,6 +13,17 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { useClipboard } from '@/hooks/use-clipboard'; +import { dashboard as dashboardRoute } from '@/routes'; +import { show as showChannel } from '@/routes/channels'; +import { + stop as stopBroadcastRoute, + store as storeBroadcastRoute, +} from '@/routes/creator/broadcasts'; +import { + store as storeChannelRoute, + update as updateChannelRoute, +} from '@/routes/creator/channel'; +import { rotate as rotateStreamKeyRoute } from '@/routes/creator/stream-key'; import type { BroadcastSummary, Category } from '@/types'; type CreatorChannel = { @@ -46,6 +57,7 @@ export default function Dashboard({ recentBroadcasts, }: Props) { const [, copy] = useClipboard(); + const liveBroadcast = channel?.live_broadcast ?? null; const createForm = useForm({ display_name: '', slug: '', @@ -65,17 +77,17 @@ export default function Dashboard({ function createChannel(event: FormEvent) { event.preventDefault(); - createForm.post('/creator/channel'); + createForm.submit(storeChannelRoute()); } function updateChannel(event: FormEvent) { event.preventDefault(); - channelForm.patch('/creator/channel'); + channelForm.submit(updateChannelRoute()); } function createBroadcast(event: FormEvent) { event.preventDefault(); - broadcastForm.post('/creator/broadcasts', { + broadcastForm.submit(storeBroadcastRoute(), { onSuccess: () => broadcastForm.reset('title', 'recording_enabled'), }); } @@ -96,10 +108,10 @@ export default function Dashboard({ {channel && ( )} @@ -353,7 +365,9 @@ export default function Dashboard({ size="sm" onClick={() => router.post( - `/creator/broadcasts/${broadcast.id}/stop`, + stopBroadcastRoute( + broadcast.id, + ), ) } > @@ -404,9 +418,7 @@ export default function Dashboard({ {canRegister && (