Skip to content
Snippets Groups Projects
App.tsx 2.29 KiB
Newer Older
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';
Valentino's avatar
Valentino committed
import { Dashboard, Users, Login } 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 />}>
                <Route path="/users" element={<Users />} />
              </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;