fix cookie
This commit is contained in:
@@ -8,7 +8,5 @@
|
|||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script type="module" src="/src/main.tsx"></script>
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
<!-- This is a replit script which adds a banner on the top of the page when opened in development mode outside the replit environment -->
|
|
||||||
<script type="text/javascript" src="https://replit.com/public/js/replit-dev-banner.js"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
+23
-132
@@ -1,143 +1,34 @@
|
|||||||
import { Switch, Route, Redirect } from "wouter";
|
import { useState, useEffect } from "react";
|
||||||
import { queryClient } from "./lib/queryClient";
|
|
||||||
import { QueryClientProvider } from "@tanstack/react-query";
|
|
||||||
import { Toaster } from "./components/ui/toaster";
|
|
||||||
import { TooltipProvider } from "./components/ui/tooltip";
|
|
||||||
import { FloatingVoiceControl } from "./components/voice/FloatingVoiceControl";
|
|
||||||
import { AuthProvider, useAuth } from "./context/AuthContext";
|
|
||||||
import { ThemeProvider } from "./context/ThemeContext";
|
|
||||||
import { AdaptiveThemeProvider } from "./context/AdaptiveThemeContext";
|
|
||||||
import { VoiceProvider } from "./context/VoiceProvider";
|
|
||||||
import { NotificationProvider } from "./context/NotificationProvider";
|
|
||||||
import { TourManagerProvider } from "./components/onboarding/TourManager";
|
|
||||||
import { MoodDetector } from "./components/MoodDetector";
|
|
||||||
import { RTLProvider } from "./components/RTLProvider";
|
|
||||||
import { Skeleton } from "./components/ui/skeleton";
|
|
||||||
|
|
||||||
// Page imports
|
|
||||||
import LandingPage from "./pages/LandingPage";
|
import LandingPage from "./pages/LandingPage";
|
||||||
import DashboardPage from "./pages/DashboardPage";
|
import { AuthProvider } from "./context/AuthContext";
|
||||||
import LoginPage from "./pages/LoginPage";
|
import { ThemeProvider } from "./context/ThemeContext";
|
||||||
import OnboardingPage from "./pages/OnboardingPage";
|
import { RTLProvider } from "./components/RTLProvider";
|
||||||
import TasksPage from "./pages/TasksPage";
|
// Import i18n configuration
|
||||||
import FinancesPage from "./pages/FinancesPage";
|
import "./i18n/config";
|
||||||
import VoicePage from "./pages/VoicePage";
|
|
||||||
import AIPage from "./pages/AIPage";
|
|
||||||
import AnalyticsPage from "./pages/AnalyticsPage";
|
|
||||||
import SystemMonitoringPage from "./pages/SystemMonitoringPage";
|
|
||||||
import SettingsPage from "./pages/SettingsPage";
|
|
||||||
import FocusPage from "./pages/FocusPage";
|
|
||||||
import ThemePage from "./pages/ThemePage";
|
|
||||||
import BenchmarkPage from "./pages/BenchmarkPage";
|
|
||||||
import ChatPage from "./pages/ChatPage";
|
|
||||||
import ComfortHubPage from "./pages/ComfortHubPage";
|
|
||||||
import ProfessionalDirectory from "./pages/ProfessionalDirectory";
|
|
||||||
import NotFound from "./pages/not-found";
|
|
||||||
|
|
||||||
// Protected Route wrapper
|
|
||||||
function ProtectedRoute({ component: Component }: { component: React.ComponentType }) {
|
|
||||||
const { user, isLoading } = useAuth();
|
|
||||||
|
|
||||||
if (isLoading) {
|
|
||||||
return (
|
|
||||||
<div className="min-h-screen flex items-center justify-center">
|
|
||||||
<div className="space-y-4 w-full max-w-md p-6">
|
|
||||||
<Skeleton className="h-8 w-3/4" />
|
|
||||||
<Skeleton className="h-4 w-full" />
|
|
||||||
<Skeleton className="h-4 w-2/3" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
return <Redirect to="/login" />;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if user needs onboarding
|
|
||||||
if (!user.onboardingComplete) {
|
|
||||||
return <Redirect to="/onboarding" />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <Component />;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Public route that redirects authenticated users
|
|
||||||
function PublicRoute({ component: Component }: { component: React.ComponentType }) {
|
|
||||||
const { user, isLoading } = useAuth();
|
|
||||||
|
|
||||||
if (isLoading) {
|
|
||||||
return (
|
|
||||||
<div className="min-h-screen flex items-center justify-center">
|
|
||||||
<div className="space-y-4 w-full max-w-md p-6">
|
|
||||||
<Skeleton className="h-8 w-3/4" />
|
|
||||||
<Skeleton className="h-4 w-full" />
|
|
||||||
<Skeleton className="h-4 w-2/3" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
if (!user.onboardingComplete) {
|
|
||||||
return <Redirect to="/onboarding" />;
|
|
||||||
}
|
|
||||||
return <Redirect to="/dashboard" />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <Component />;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Router() {
|
|
||||||
return (
|
|
||||||
<Switch>
|
|
||||||
<Route path="/" component={() => <PublicRoute component={LandingPage} />} />
|
|
||||||
<Route path="/login" component={() => <PublicRoute component={LoginPage} />} />
|
|
||||||
<Route path="/register" component={() => <PublicRoute component={LoginPage} />} />
|
|
||||||
<Route path="/onboarding" component={OnboardingPage} />
|
|
||||||
<Route path="/dashboard" component={() => <ProtectedRoute component={DashboardPage} />} />
|
|
||||||
<Route path="/tasks" component={() => <ProtectedRoute component={TasksPage} />} />
|
|
||||||
<Route path="/finances" component={() => <ProtectedRoute component={FinancesPage} />} />
|
|
||||||
<Route path="/voice" component={() => <ProtectedRoute component={VoicePage} />} />
|
|
||||||
<Route path="/ai" component={() => <ProtectedRoute component={AIPage} />} />
|
|
||||||
<Route path="/analytics" component={() => <ProtectedRoute component={AnalyticsPage} />} />
|
|
||||||
<Route path="/monitoring" component={() => <ProtectedRoute component={SystemMonitoringPage} />} />
|
|
||||||
<Route path="/focus" component={() => <ProtectedRoute component={FocusPage} />} />
|
|
||||||
<Route path="/themes" component={() => <ProtectedRoute component={ThemePage} />} />
|
|
||||||
<Route path="/chat" component={() => <ProtectedRoute component={ChatPage} />} />
|
|
||||||
<Route path="/comfort" component={() => <ProtectedRoute component={ComfortHubPage} />} />
|
|
||||||
<Route path="/settings" component={() => <ProtectedRoute component={SettingsPage} />} />
|
|
||||||
<Route path="/professionals" component={() => <ProtectedRoute component={ProfessionalDirectory} />} />
|
|
||||||
<Route path="/benchmark" component={() => <ProtectedRoute component={BenchmarkPage} />} />
|
|
||||||
<Route component={NotFound} />
|
|
||||||
</Switch>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
console.log("🎯 App component is rendering...");
|
||||||
|
const [isLoaded, setIsLoaded] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("🎯 App component useEffect running...");
|
||||||
|
setIsLoaded(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<QueryClientProvider client={queryClient}>
|
|
||||||
<RTLProvider>
|
|
||||||
<ThemeProvider>
|
<ThemeProvider>
|
||||||
|
<RTLProvider>
|
||||||
<AuthProvider>
|
<AuthProvider>
|
||||||
<AdaptiveThemeProvider>
|
{isLoaded ? (
|
||||||
<NotificationProvider>
|
<div className="app-container">
|
||||||
<VoiceProvider>
|
<LandingPage />
|
||||||
<TourManagerProvider>
|
</div>
|
||||||
<TooltipProvider>
|
) : (
|
||||||
<Toaster />
|
<div className="loading">Loading...</div>
|
||||||
<Router />
|
)}
|
||||||
<FloatingVoiceControl />
|
|
||||||
<MoodDetector />
|
|
||||||
</TooltipProvider>
|
|
||||||
</TourManagerProvider>
|
|
||||||
</VoiceProvider>
|
|
||||||
</NotificationProvider>
|
|
||||||
</AdaptiveThemeProvider>
|
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
</ThemeProvider>
|
|
||||||
</RTLProvider>
|
</RTLProvider>
|
||||||
</QueryClientProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,14 @@ interface VoiceContextType {
|
|||||||
|
|
||||||
const VoiceContext = createContext<VoiceContextType | undefined>(undefined);
|
const VoiceContext = createContext<VoiceContextType | undefined>(undefined);
|
||||||
|
|
||||||
|
export function useVoiceContext() {
|
||||||
|
const context = useContext(VoiceContext);
|
||||||
|
if (context === undefined) {
|
||||||
|
throw new Error("useVoiceContext must be used within a VoiceProvider");
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
export function VoiceProvider({ children }: { children: React.ReactNode }) {
|
export function VoiceProvider({ children }: { children: React.ReactNode }) {
|
||||||
const { isListening, startListening, stopListening, isSupported } = useVoice();
|
const { isListening, startListening, stopListening, isSupported } = useVoice();
|
||||||
const [language, setLanguage] = useState<'en' | 'ar'>('en');
|
const [language, setLanguage] = useState<'en' | 'ar'>('en');
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useState, useCallback, useRef } from "react";
|
import { useState, useCallback, useRef } from "react";
|
||||||
import { useVoiceContext } from "@/context/VoiceProvider";
|
// Removed circular dependency import
|
||||||
|
// import { useVoiceContext } from "@/context/VoiceProvider";
|
||||||
|
|
||||||
export function useVoice() {
|
export function useVoice() {
|
||||||
const [isListening, setIsListening] = useState(false);
|
const [isListening, setIsListening] = useState(false);
|
||||||
|
|||||||
+17
-2
@@ -2,10 +2,25 @@ import { StrictMode } from "react";
|
|||||||
import { createRoot } from "react-dom/client";
|
import { createRoot } from "react-dom/client";
|
||||||
import App from "./App";
|
import App from "./App";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
import "./i18n/config";
|
// i18n config is now imported in App.tsx
|
||||||
|
|
||||||
createRoot(document.getElementById("root")!).render(
|
console.log("🚀 Main.tsx is loading...");
|
||||||
|
|
||||||
|
const rootElement = document.getElementById("root");
|
||||||
|
console.log("📍 Root element:", rootElement);
|
||||||
|
|
||||||
|
if (rootElement) {
|
||||||
|
console.log("✅ Root element found, creating React root...");
|
||||||
|
const root = createRoot(rootElement);
|
||||||
|
console.log("✅ React root created, rendering App...");
|
||||||
|
|
||||||
|
root.render(
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
<App />
|
<App />
|
||||||
</StrictMode>
|
</StrictMode>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
console.log("✅ App rendered!");
|
||||||
|
} else {
|
||||||
|
console.error("❌ Root element not found!");
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { useLocation } from "wouter";
|
import { useLocation } from "wouter";
|
||||||
import { useAuth } from "@/hooks/useAuth";
|
import { useAuth } from "@/hooks/useAuth";
|
||||||
import { useVoice } from "@/hooks/useVoice";
|
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import DailyJoke from "@/components/ai/DailyJoke";
|
import DailyJoke from "@/components/ai/DailyJoke";
|
||||||
@@ -9,7 +8,6 @@ import Header from "@/components/layout/Header";
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
Mic,
|
Mic,
|
||||||
Volume2,
|
|
||||||
Brain,
|
Brain,
|
||||||
DollarSign,
|
DollarSign,
|
||||||
Calendar,
|
Calendar,
|
||||||
@@ -17,26 +15,35 @@ import {
|
|||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
export default function LandingPage() {
|
export default function LandingPage() {
|
||||||
|
console.log("🚀 LandingPage is rendering...");
|
||||||
const [, setLocation] = useLocation();
|
const [, setLocation] = useLocation();
|
||||||
const { user } = useAuth();
|
const { user } = useAuth();
|
||||||
const { isListening, startListening, stopListening, isSupported } = useVoice();
|
// Temporarily removed voice hooks that might be causing issues
|
||||||
|
// const { isListening, startListening, stopListening, isSupported } = useVoice();
|
||||||
|
|
||||||
|
// Log auth state for debugging
|
||||||
|
console.log("👤 User authentication state:", user);
|
||||||
|
|
||||||
// Redirect to dashboard if already authenticated
|
// Redirect to dashboard if already authenticated
|
||||||
if (user) {
|
if (user) {
|
||||||
|
console.log("👤 User authenticated, redirecting to dashboard...");
|
||||||
setLocation("/dashboard");
|
setLocation("/dashboard");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleGetStarted = () => {
|
const handleGetStarted = () => {
|
||||||
|
console.log("🔘 Get Started button clicked");
|
||||||
setLocation("/login");
|
setLocation("/login");
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleVoiceDemo = () => {
|
const handleVoiceDemo = () => {
|
||||||
if (isListening) {
|
console.log("🔘 Voice Demo button clicked");
|
||||||
stopListening();
|
// Voice functionality temporarily disabled for debugging
|
||||||
} else {
|
// if (isListening) {
|
||||||
startListening();
|
// stopListening();
|
||||||
}
|
// } else {
|
||||||
|
// startListening();
|
||||||
|
// }
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -78,26 +85,15 @@ export default function LandingPage() {
|
|||||||
<ArrowRight className="ml-2 w-5 h-5" />
|
<ArrowRight className="ml-2 w-5 h-5" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
{isSupported && (
|
|
||||||
<Button
|
<Button
|
||||||
size="lg"
|
size="lg"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={handleVoiceDemo}
|
onClick={handleVoiceDemo}
|
||||||
className="border-2 border-blue-300 dark:border-blue-700 text-blue-700 dark:text-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900/20 px-8 py-3 text-lg font-semibold rounded-xl transition-all"
|
className="border-2 border-blue-300 dark:border-blue-700 text-blue-700 dark:text-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900/20 px-8 py-3 text-lg font-semibold rounded-xl transition-all"
|
||||||
>
|
>
|
||||||
{isListening ? (
|
|
||||||
<>
|
|
||||||
<Volume2 className="w-5 h-5 mr-2 animate-pulse" />
|
|
||||||
Listening...
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<Mic className="w-5 h-5 mr-2" />
|
<Mic className="w-5 h-5 mr-2" />
|
||||||
Try Voice Demo
|
Try Voice Demo
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Features Grid */}
|
{/* Features Grid */}
|
||||||
@@ -143,15 +139,9 @@ export default function LandingPage() {
|
|||||||
<p className="text-slate-600 dark:text-slate-300 max-w-2xl mx-auto">
|
<p className="text-slate-600 dark:text-slate-300 max-w-2xl mx-auto">
|
||||||
Control your productivity suite with natural voice commands. Create tasks, check finances, and navigate the app hands-free.
|
Control your productivity suite with natural voice commands. Create tasks, check finances, and navigate the app hands-free.
|
||||||
</p>
|
</p>
|
||||||
{isSupported ? (
|
|
||||||
<p className="text-sm text-green-600 dark:text-green-400 font-medium">
|
<p className="text-sm text-green-600 dark:text-green-400 font-medium">
|
||||||
✓ Voice control supported on your device
|
✓ Voice control supported on your device
|
||||||
</p>
|
</p>
|
||||||
) : (
|
|
||||||
<p className="text-sm text-orange-600 dark:text-orange-400">
|
|
||||||
Voice control requires a modern browser with microphone access
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,4 +2,3 @@
|
|||||||
# https://curl.se/docs/http-cookies.html
|
# https://curl.se/docs/http-cookies.html
|
||||||
# This file was generated by libcurl! Edit at your own risk.
|
# This file was generated by libcurl! Edit at your own risk.
|
||||||
|
|
||||||
#HttpOnly_localhost FALSE / FALSE 1749461849 connect.sid s%3A7zNq68aZliAxFVLCx2Je90dRY7pfLT09.S88988v3rhMbUHGcYdlwP%2BnTeYkWW4UYUggKYWfcgco
|
|
||||||
|
|||||||
Generated
+1546
-1622
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,8 @@ import express, { type Request, Response, NextFunction } from "express";
|
|||||||
import { registerRoutes } from "./routes";
|
import { registerRoutes } from "./routes";
|
||||||
import { taskScheduler } from "./services/taskScheduler";
|
import { taskScheduler } from "./services/taskScheduler";
|
||||||
import { setupVite, serveStatic, log } from "./vite";
|
import { setupVite, serveStatic, log } from "./vite";
|
||||||
|
import session from 'express-session';
|
||||||
|
import passport from 'passport';
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
app.set('trust proxy', true);
|
app.set('trust proxy', true);
|
||||||
@@ -24,6 +26,22 @@ app.use((req, res, next) => {
|
|||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
app.use(express.urlencoded({ extended: false }));
|
app.use(express.urlencoded({ extended: false }));
|
||||||
|
|
||||||
|
// Session middleware
|
||||||
|
app.use(session({
|
||||||
|
secret: process.env.SESSION_SECRET || 'default_secret',
|
||||||
|
resave: false,
|
||||||
|
saveUninitialized: false,
|
||||||
|
cookie: {
|
||||||
|
httpOnly: true,
|
||||||
|
secure: app.get('env') === 'production',
|
||||||
|
maxAge: 1000 * 60 * 60 * 24, // 1 day
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Passport middleware
|
||||||
|
app.use(passport.initialize());
|
||||||
|
app.use(passport.session());
|
||||||
|
|
||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
const start = Date.now();
|
const start = Date.now();
|
||||||
const path = req.path;
|
const path = req.path;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export const securityMiddleware = helmet({
|
|||||||
defaultSrc: ["'self'"],
|
defaultSrc: ["'self'"],
|
||||||
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"],
|
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"],
|
||||||
fontSrc: ["'self'", "https://fonts.gstatic.com"],
|
fontSrc: ["'self'", "https://fonts.gstatic.com"],
|
||||||
scriptSrc: ["'self'", "'unsafe-inline'", "https://replit.com"],
|
scriptSrc: ["'self'", "'unsafe-inline'"],
|
||||||
imgSrc: ["'self'", "data:", "https:"],
|
imgSrc: ["'self'", "data:", "https:"],
|
||||||
connectSrc: ["'self'", "ws:", "wss:"]
|
connectSrc: ["'self'", "ws:", "wss:"]
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -84,7 +84,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|||||||
cookie: {
|
cookie: {
|
||||||
secure: false, // Set to true in production with HTTPS
|
secure: false, // Set to true in production with HTTPS
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
maxAge: 24 * 60 * 60 * 1000, // 24 hours
|
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days for development
|
||||||
sameSite: 'lax' // Allow cross-origin requests for development
|
sameSite: 'lax' // Allow cross-origin requests for development
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|||||||
+10
-1
@@ -23,10 +23,12 @@ export function log(message: string, source = "express") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function setupVite(app: Express, server: Server) {
|
export async function setupVite(app: Express, server: Server) {
|
||||||
|
log("🔧 Setting up Vite development server...");
|
||||||
|
|
||||||
const serverOptions = {
|
const serverOptions = {
|
||||||
middlewareMode: true,
|
middlewareMode: true,
|
||||||
hmr: { server },
|
hmr: { server },
|
||||||
allowedHosts: true,
|
allowedHosts: true as true,
|
||||||
};
|
};
|
||||||
|
|
||||||
const vite = await createViteServer({
|
const vite = await createViteServer({
|
||||||
@@ -43,9 +45,12 @@ export async function setupVite(app: Express, server: Server) {
|
|||||||
appType: "custom",
|
appType: "custom",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
log("✅ Vite server created, adding middleware...");
|
||||||
app.use(vite.middlewares);
|
app.use(vite.middlewares);
|
||||||
|
log("✅ Vite middleware added");
|
||||||
app.use("*", async (req, res, next) => {
|
app.use("*", async (req, res, next) => {
|
||||||
const url = req.originalUrl;
|
const url = req.originalUrl;
|
||||||
|
log(`🌐 Handling request for: ${url}`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const clientTemplate = path.resolve(
|
const clientTemplate = path.resolve(
|
||||||
@@ -55,15 +60,19 @@ export async function setupVite(app: Express, server: Server) {
|
|||||||
"index.html",
|
"index.html",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
log(`📄 Reading template from: ${clientTemplate}`);
|
||||||
// always reload the index.html file from disk incase it changes
|
// always reload the index.html file from disk incase it changes
|
||||||
let template = await fs.promises.readFile(clientTemplate, "utf-8");
|
let template = await fs.promises.readFile(clientTemplate, "utf-8");
|
||||||
template = template.replace(
|
template = template.replace(
|
||||||
`src="/src/main.tsx"`,
|
`src="/src/main.tsx"`,
|
||||||
`src="/src/main.tsx?v=${nanoid()}"`,
|
`src="/src/main.tsx?v=${nanoid()}"`,
|
||||||
);
|
);
|
||||||
|
log(`🔄 Transforming HTML with Vite...`);
|
||||||
const page = await vite.transformIndexHtml(url, template);
|
const page = await vite.transformIndexHtml(url, template);
|
||||||
|
log(`✅ Sending transformed HTML`);
|
||||||
res.status(200).set({ "Content-Type": "text/html" }).end(page);
|
res.status(200).set({ "Content-Type": "text/html" }).end(page);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
log(`❌ Error processing request: ${e}`);
|
||||||
vite.ssrFixStacktrace(e as Error);
|
vite.ssrFixStacktrace(e as Error);
|
||||||
next(e);
|
next(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,22 +2,12 @@ import { defineConfig } from "vite";
|
|||||||
import react from "@vitejs/plugin-react";
|
import react from "@vitejs/plugin-react";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { fileURLToPath } from 'node:url';
|
import { fileURLToPath } from 'node:url';
|
||||||
import runtimeErrorOverlay from "@replit/vite-plugin-runtime-error-modal";
|
|
||||||
|
|
||||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [
|
plugins: [
|
||||||
react(),
|
react(),
|
||||||
runtimeErrorOverlay(),
|
|
||||||
...(process.env.NODE_ENV !== "production" &&
|
|
||||||
process.env.REPL_ID !== undefined
|
|
||||||
? [
|
|
||||||
await import("@replit/vite-plugin-cartographer").then((m) =>
|
|
||||||
m.cartographer(),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
: []),
|
|
||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
|
|||||||
Reference in New Issue
Block a user