feat: implement SequencerCanvas for visualizing tracks and placed sounds feat: create SoundLibrary for draggable sound selection feat: add TimelineControls for managing duration and zoom levels feat: implement TrackControls for adding, removing, and renaming tracks
175 lines
4.1 KiB
TypeScript
175 lines
4.1 KiB
TypeScript
import { Navigate, Route, Routes } from 'react-router'
|
|
import { LocaleProvider } from './components/LocaleProvider'
|
|
import { ThemeProvider } from './components/ThemeProvider'
|
|
import { Toaster } from './components/ui/sonner'
|
|
import { AuthProvider, useAuth } from './contexts/AuthContext'
|
|
import { SocketProvider } from './contexts/SocketContext'
|
|
import { AccountPage } from './pages/AccountPage'
|
|
import { AuthCallbackPage } from './pages/AuthCallbackPage'
|
|
import { DashboardPage } from './pages/DashboardPage'
|
|
import { ExtractionsPage } from './pages/ExtractionsPage'
|
|
import { LoginPage } from './pages/LoginPage'
|
|
import { PlaylistEditPage } from './pages/PlaylistEditPage'
|
|
import { PlaylistsPage } from './pages/PlaylistsPage'
|
|
import { RegisterPage } from './pages/RegisterPage'
|
|
import { SchedulersPage } from './pages/SchedulersPage'
|
|
import { SequencerPage } from './pages/SequencerPage'
|
|
import { SoundsPage } from './pages/SoundsPage'
|
|
import { SettingsPage } from './pages/admin/SettingsPage'
|
|
import { UsersPage } from './pages/admin/UsersPage'
|
|
|
|
function ProtectedRoute({ children }: { children: React.ReactNode }) {
|
|
const { user, loading } = useAuth()
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="min-h-screen flex items-center justify-center">
|
|
Loading...
|
|
</div>
|
|
)
|
|
}
|
|
|
|
if (!user) {
|
|
return <Navigate to="/login" replace />
|
|
}
|
|
|
|
return <>{children}</>
|
|
}
|
|
|
|
function AdminRoute({ children }: { children: React.ReactNode }) {
|
|
const { user, loading } = useAuth()
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="min-h-screen flex items-center justify-center">
|
|
Loading...
|
|
</div>
|
|
)
|
|
}
|
|
|
|
if (!user) {
|
|
return <Navigate to="/login" replace />
|
|
}
|
|
|
|
if (user.role !== 'admin') {
|
|
return <Navigate to="/" replace />
|
|
}
|
|
|
|
return <>{children}</>
|
|
}
|
|
|
|
function AppRoutes() {
|
|
const { user } = useAuth()
|
|
|
|
return (
|
|
<Routes>
|
|
<Route
|
|
path="/login"
|
|
element={user ? <Navigate to="/" replace /> : <LoginPage />}
|
|
/>
|
|
<Route
|
|
path="/register"
|
|
element={user ? <Navigate to="/" replace /> : <RegisterPage />}
|
|
/>
|
|
<Route path="/auth/callback" element={<AuthCallbackPage />} />
|
|
<Route
|
|
path="/"
|
|
element={
|
|
<ProtectedRoute>
|
|
<DashboardPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/sounds"
|
|
element={
|
|
<ProtectedRoute>
|
|
<SoundsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/playlists"
|
|
element={
|
|
<ProtectedRoute>
|
|
<PlaylistsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/playlists/:id/edit"
|
|
element={
|
|
<ProtectedRoute>
|
|
<PlaylistEditPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/extractions"
|
|
element={
|
|
<ProtectedRoute>
|
|
<ExtractionsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/sequencer"
|
|
element={
|
|
<ProtectedRoute>
|
|
<SequencerPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/schedulers"
|
|
element={
|
|
<ProtectedRoute>
|
|
<SchedulersPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/account"
|
|
element={
|
|
<ProtectedRoute>
|
|
<AccountPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/admin/users"
|
|
element={
|
|
<AdminRoute>
|
|
<UsersPage />
|
|
</AdminRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/admin/settings"
|
|
element={
|
|
<AdminRoute>
|
|
<SettingsPage />
|
|
</AdminRoute>
|
|
}
|
|
/>
|
|
</Routes>
|
|
)
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<LocaleProvider defaultLocale="fr-FR" defaultTimezone="Europe/Paris">
|
|
<ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme">
|
|
<AuthProvider>
|
|
<SocketProvider>
|
|
<AppRoutes />
|
|
<Toaster richColors position='top-right' />
|
|
</SocketProvider>
|
|
</AuthProvider>
|
|
</ThemeProvider>
|
|
</LocaleProvider>
|
|
)
|
|
}
|
|
|
|
export default App
|