Skip to content
Snippets Groups Projects
App.tsx 2.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • Valentino's avatar
    Valentino committed
    import React from 'react';
    
    Luka's avatar
    Luka committed
    import { Helmet } from 'react-helmet';
    
    Davor's avatar
    Davor committed
    import { Routes, Route, Navigate, Outlet } from 'react-router-dom';
    
    Luka's avatar
    Luka committed
    import { Toaster } from 'react-hot-toast';
    
    import { useAuth } from 'src/services/auth';
    
    import { Dashboard, Users, Login, Apps, AppSingle } from './modules';
    
    Luka's avatar
    Luka committed
    import { Layout } from './components';
    
    Valentino's avatar
    Valentino committed
    import { LoginCallback } from './modules/login/LoginCallback';
    
    Luka's avatar
    Luka committed
    
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    
    Valentino's avatar
    Valentino committed
    function App() {
    
    Davor's avatar
    Davor committed
      const { authToken, currentUser, isAdmin } = useAuth();
    
    
      const redirectToLogin = !authToken || !currentUser?.app_roles;
    
    Luka's avatar
    Luka committed
    
    
    Davor's avatar
    Davor committed
      const ProtectedRoute = () => {
        return isAdmin ? <Outlet /> : <Navigate to="/dashboard" />;
      };
    
    
    Luka's avatar
    Luka committed
      return (
        <>
          <Helmet>
            <title>Stackspin</title>
            <meta name="description" content="Stackspin" />
            <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
            <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
            <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
            <link rel="manifest" href="/site.webmanifest" />
            <meta name="msapplication-TileColor" content="#da532c" />
            <meta name="theme-color" content="#ffffff" />
          </Helmet>
    
          <div className="app bg-gray-50 min-h-screen flex flex-col">
    
            {redirectToLogin ? (
    
    Valentino's avatar
    Valentino committed
              <Routes>
                <Route path="/login" element={<Login />} />
                <Route path="/login-callback" element={<LoginCallback />} />
                <Route path="*" element={<Navigate to="/login" />} />
              </Routes>
    
    Luka's avatar
    Luka committed
            ) : (
              <Layout>
    
    Valentino's avatar
    Valentino committed
                <Routes>
                  <Route path="/dashboard" element={<Dashboard />} />
    
    Davor's avatar
    Davor committed
                  <Route path="/users" element={<ProtectedRoute />}>
    
    Luka's avatar
    Luka committed
                    <Route index element={<Users />} />
                  </Route>
                  <Route path="/apps" element={<ProtectedRoute />}>
    
                    <Route path=":slug" element={<AppSingle />} />
    
    Luka's avatar
    Luka committed
                    <Route index element={<Apps />} />
    
    Davor's avatar
    Davor committed
                  </Route>
    
    Valentino's avatar
    Valentino committed
                  <Route path="*" element={<Navigate to="/dashboard" />} />
                </Routes>
    
    Luka's avatar
    Luka committed
              </Layout>
            )}
    
            {/* Place to load notifications */}
            <div
              aria-live="assertive"
              className="fixed inset-0 flex items-end px-4 py-6 pointer-events-none sm:p-6 sm:items-start"
            >
              <div className="w-full flex flex-col items-center space-y-4 sm:items-end" />
            </div>
          </div>
          <Toaster />
        </>
      );
    }
    
    export default App;