Newer
Older
job-tracker / frontend / src / App.js
import React from "react";
import { BrowserRouter, Routes, Route, Link, Navigate } from "react-router-dom";
import { AuthProvider, useAuth } from "./contexts/AuthContext";
import CompanyList from "./components/CompanyList";
import JobList from "./components/JobList";
import CompanyForm from "./components/CompanyForm";
import JobForm from "./components/JobForm";
import CompanyJobs from "./components/CompanyJobs";
import Login from "./components/Login";
import Register from "./components/Register";
import Profile from "./components/Profile";

function PrivateRoute({ children }) {
  const { isAuthenticated } = useAuth();
  return isAuthenticated ? children : <Navigate to="/login" replace />;
}

function AppContent() {
  const { isAuthenticated, logout } = useAuth();
  return (
    <BrowserRouter>
      <nav style={{padding:8, borderBottom:"1px solid #ccc", marginBottom:16}}>
        <Link to="/">Jobs</Link> | {" "}
        <Link to="/companies">Companies</Link>
        {isAuthenticated ? (
          <>
            | <Link to="/profile">Profile</Link> | <button onClick={logout}>Logout</button>
          </>
        ) : (
          <>
            | <Link to="/login">Login</Link> | <Link to="/register">Register</Link>
          </>
        )}
      </nav>
      <Routes>
        <Route path="/login" element={<Login />} />
        <Route path="/register" element={<Register />} />
        <Route path="/" element={
          <PrivateRoute>
            <JobList />
          </PrivateRoute>
        } />
        <Route path="/jobs/new" element={
          <PrivateRoute>
            <JobForm />
          </PrivateRoute>
        } />
        <Route path="/jobs/:id/edit" element={
          <PrivateRoute>
            <JobForm />
          </PrivateRoute>
        } />
        <Route path="/companies" element={
          <PrivateRoute>
            <CompanyList />
          </PrivateRoute>
        } />
        <Route path="/companies/new" element={
          <PrivateRoute>
            <CompanyForm />
          </PrivateRoute>
        } />
        <Route path="/companies/:id/edit" element={
          <PrivateRoute>
            <CompanyForm />
          </PrivateRoute>
        } />
        <Route path="/companies/:id/jobs" element={
          <PrivateRoute>
            <CompanyJobs />
          </PrivateRoute>
        } />
        <Route path="/profile" element={<PrivateRoute><Profile /></PrivateRoute>} />
        <Route path="*" element={<Navigate to="/" replace />} />
      </Routes>
    </BrowserRouter>
  );
}

function App() {
  return (
    <AuthProvider>
      <AppContent />
    </AuthProvider>
  );
}

export default App;