fix cookie

This commit is contained in:
krikorios
2025-06-09 01:55:55 +03:00
parent 83ffdf860a
commit 31b54a1ecc
13 changed files with 1659 additions and 1816 deletions
-2
View File
@@ -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
View File
@@ -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>
); );
} }
+8
View File
@@ -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');
+2 -1
View File
@@ -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);
+18 -3
View File
@@ -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!");
}
+15 -25
View File
@@ -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>
-1
View File
@@ -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
+1546 -1622
View File
File diff suppressed because it is too large Load Diff
+18
View File
@@ -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;
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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);
} }
-10
View File
@@ -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: {