File size: 2,734 Bytes
8314dad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { Toaster } from "react-hot-toast";
import { ReactNode } from "react";
import { ApiKeyProvider, useApiKey } from "./context/ApiKeyContext";
import AppLayout from "./layouts/AppLayout";
import Gate from "./pages/Gate";

// All Real Pages
import Dashboard from "./pages/Dashboard";
import Campaigns from "./pages/Campaigns";
import CampaignDetail from "./pages/CampaignDetail";
import Leads from "./pages/Leads";
import EmailAccounts from "./pages/EmailAccounts";
import Warmup from "./pages/Warmup";
import Inbox from "./pages/Inbox";
import Webhooks from "./pages/Webhooks";
import Analytics from "./pages/Analytics";
import Clients from "./pages/Clients";
import Settings from "./pages/Settings";

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 30_000,
      retry: 2,
      refetchOnWindowFocus: true,
    },
  },
});

function RequireKey({ children }: { children: ReactNode }) {
  const { activeKey } = useApiKey();
  if (!activeKey) {
    return <Navigate to="/connect" replace />;
  }
  return <>{children}</>;
}

export default function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <ApiKeyProvider>
        <BrowserRouter>
          <Routes>
            <Route path="/connect" element={<Gate />} />
            <Route
              path="/"
              element={
                <RequireKey>
                  <AppLayout />
                </RequireKey>
              }
            >
              <Route index element={<Dashboard />} />
              <Route path="campaigns" element={<Campaigns />} />
              <Route path="campaigns/:id" element={<CampaignDetail />} />
              <Route path="leads" element={<Leads />} />
              <Route path="email-accounts" element={<EmailAccounts />} />
              <Route path="warmup" element={<Warmup />} />
              <Route path="inbox" element={<Inbox />} />
              <Route path="webhooks" element={<Webhooks />} />
              <Route path="analytics" element={<Analytics />} />
              <Route path="clients" element={<Clients />} />
              <Route path="settings" element={<Settings />} />
            </Route>
          </Routes>
        </BrowserRouter>
        <Toaster 
          position="bottom-right"
          toastOptions={{
            style: {
              background: 'var(--nt-bg-surface-raised)',
              color: 'var(--nt-text-primary)',
              border: '1px solid var(--nt-border-accent)'
            }
          }} 
        />
      </ApiKeyProvider>
    </QueryClientProvider>
  );
}