Skip to content

Commit cb84077

Browse files
authored
Merge pull request #51 from deepraj21/main
updated landing page for optimization
2 parents 1e30322 + 311ee06 commit cb84077

16 files changed

+1943
-312
lines changed

client/dist/assets/index-CLZc1W7c.js

Lines changed: 256 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/dist/assets/index-CUzNbDSS.css

Lines changed: 0 additions & 1 deletion
This file was deleted.

client/dist/assets/index-DQXpIS55.js

Lines changed: 0 additions & 296 deletions
This file was deleted.

client/dist/assets/index-ndDbH7-g.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/dist/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<link rel="icon" type="image" href="/logo.png" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>DevHub</title>
8-
<script type="module" crossorigin src="/assets/index-DQXpIS55.js"></script>
9-
<link rel="stylesheet" crossorigin href="/assets/index-CUzNbDSS.css">
8+
<script type="module" crossorigin src="/assets/index-CLZc1W7c.js"></script>
9+
<link rel="stylesheet" crossorigin href="/assets/index-ndDbH7-g.css">
1010
</head>
1111
<body>
1212
<div id="root"></div>

client/package-lock.json

Lines changed: 362 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
"@radix-ui/react-toast": "^1.2.1",
2323
"@reduxjs/toolkit": "^2.2.7",
2424
"@tabler/icons-react": "^3.11.0",
25+
"@tsparticles/engine": "^3.5.0",
26+
"@tsparticles/react": "^3.0.0",
27+
"@tsparticles/slim": "^3.5.0",
2528
"axios": "^1.7.4",
2629
"class-variance-authority": "^0.7.0",
2730
"clsx": "^2.1.1",

client/src/components/Auth/user-auth-form-login.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"use client"
1+
"use client";
22

33
import React, { useState } from 'react';
44
import axios from 'axios';
@@ -30,12 +30,15 @@ export function UserAuthForm({ className, onLoginSuccess, ...props }: UserAuthFo
3030
try {
3131
const response = await axios.post(`${backendUrl}/login`, { username, password }, { withCredentials: true });
3232
if (response.status === 200) {
33+
34+
localStorage.setItem('devhub_username', username);
35+
3336
if (onLoginSuccess) {
34-
onLoginSuccess(username); // Pass the username to the callback
37+
onLoginSuccess(username);
3538
}
3639
navigate('/home');
3740
}
38-
} catch (err:any) {
41+
} catch (err: any) {
3942
if (err.response && err.response.data && err.response.data.message) {
4043
toast.error(err.response.data.message, {
4144
description: "Please check your details and try again.",
@@ -103,4 +106,4 @@ export function UserAuthForm({ className, onLoginSuccess, ...props }: UserAuthFo
103106
</form>
104107
</div>
105108
);
106-
}
109+
}
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import {
2+
CircleUser,
3+
Home,
4+
LineChart,
5+
Menu,
6+
Fullscreen,
7+
Shrink
8+
} from "lucide-react"
9+
import {
10+
DropdownMenu,
11+
DropdownMenuContent,
12+
DropdownMenuItem,
13+
DropdownMenuLabel,
14+
DropdownMenuSeparator,
15+
DropdownMenuTrigger,
16+
} from "@/components/ui/dropdown-menu"
17+
import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"
18+
import { Button } from "@/components/ui/button"
19+
import { ModeToggle } from "@/components/Theme/mode-toggle"
20+
import { useNavigate } from "react-router-dom";
21+
import { useState, useEffect } from "react"
22+
23+
const BACKEND_URL = import.meta.env.VITE_BACKEND_URL || "http://localhost:5000";
24+
25+
const MobileSidebar = () => {
26+
const [userImage, setUserImage] = useState<string | null>(null);
27+
const [isFullscreen, setIsFullscreen] = useState(() => {
28+
// Parse the value from localStorage as a boolean
29+
return localStorage.getItem('isFullscreen') === 'true';
30+
});
31+
const navigate = useNavigate();
32+
33+
const handleFullscreenToggle = () => {
34+
if (!isFullscreen) {
35+
document.documentElement.requestFullscreen();
36+
} else {
37+
document.exitFullscreen();
38+
}
39+
setIsFullscreen(!isFullscreen);
40+
// Store the fullscreen state as a string ("true"/"false")
41+
localStorage.setItem('isFullscreen', String(!isFullscreen));
42+
};
43+
44+
useEffect(() => {
45+
const handleFullscreenChange = () => {
46+
const fullscreen = document.fullscreenElement !== null;
47+
setIsFullscreen(fullscreen);
48+
localStorage.setItem('isFullscreen', String(fullscreen));
49+
};
50+
51+
document.addEventListener('fullscreenchange', handleFullscreenChange);
52+
return () => {
53+
document.removeEventListener('fullscreenchange', handleFullscreenChange);
54+
};
55+
}, []);
56+
57+
useEffect(() => {
58+
const fetchUserData = async () => {
59+
try {
60+
const username = localStorage.getItem('username');
61+
if (!username) {
62+
throw new Error('Username not found in localStorage');
63+
}
64+
65+
const response = await fetch(`${BACKEND_URL}/profile/${username}`, {
66+
method: 'GET',
67+
headers: {
68+
'Content-Type': 'application/json',
69+
},
70+
});
71+
72+
if (!response.ok) {
73+
throw new Error('Network response was not ok');
74+
}
75+
76+
const responseData = await response.json();
77+
setUserImage(responseData.user.image || null);
78+
} catch (error) {
79+
console.error('Error fetching user data', error);
80+
}
81+
};
82+
83+
fetchUserData();
84+
}, []);
85+
86+
return (
87+
<header className="flex h-14 items-center gap-4 border-b bg-muted/40 px-4 lg:h-[60px] lg:px-6">
88+
<Sheet>
89+
<SheetTrigger asChild>
90+
<Button variant="outline" size="icon" className="shrink-0 md:hidden">
91+
<Menu className="h-5 w-5" />
92+
<span className="sr-only">Toggle navigation menu</span>
93+
</Button>
94+
</SheetTrigger>
95+
<SheetContent side="left" className="flex flex-col">
96+
<nav className="grid gap-2 text-lg font-medium">
97+
<a href="#" className="flex items-center gap-2 text-lg font-semibold">
98+
<span>Quantica</span>
99+
</a>
100+
<a
101+
href="/home"
102+
className="mx-[-0.65rem] flex items-center gap-4 rounded-xl px-3 py-2 text-muted-foreground hover:text-foreground"
103+
>
104+
<Home className="h-5 w-5" />
105+
Home
106+
</a>
107+
<a
108+
href="/plot"
109+
className="mx-[-0.65rem] flex items-center gap-4 rounded-xl px-3 py-2 text-muted-foreground hover:text-foreground"
110+
>
111+
<LineChart className="h-5 w-5" />
112+
f(x) Plotter
113+
</a>
114+
</nav>
115+
</SheetContent>
116+
</Sheet>
117+
<div className="w-full flex-1"></div>
118+
<DropdownMenu>
119+
{isFullscreen ? (
120+
<Shrink onClick={handleFullscreenToggle} />
121+
) : (
122+
<Fullscreen onClick={handleFullscreenToggle} />
123+
)}
124+
<ModeToggle />
125+
<DropdownMenuTrigger asChild>
126+
<Button variant="secondary" size="icon" className="rounded-full">
127+
{userImage ? (
128+
<img src={userImage} alt="User Profile" className="h-5 w-5 rounded-full" />
129+
) : (
130+
<CircleUser className="h-5 w-5" />
131+
)}
132+
<span className="sr-only">Toggle user menu</span>
133+
</Button>
134+
</DropdownMenuTrigger>
135+
<DropdownMenuContent align="end">
136+
<DropdownMenuLabel>My Account</DropdownMenuLabel>
137+
<DropdownMenuSeparator />
138+
<DropdownMenuItem
139+
onClick={() => {
140+
const username = localStorage.getItem('username');
141+
if (username) {
142+
navigate(`/profile/${username}`);
143+
} else {
144+
console.error('Username not found in localStorage');
145+
}
146+
}}
147+
>
148+
Profile
149+
</DropdownMenuItem>
150+
<DropdownMenuItem onClick={() => navigate('/settings')}>Settings</DropdownMenuItem>
151+
<DropdownMenuSeparator />
152+
<DropdownMenuItem>Logout</DropdownMenuItem>
153+
</DropdownMenuContent>
154+
</DropdownMenu>
155+
</header>
156+
);
157+
};
158+
159+
export default MobileSidebar;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {
2+
Home,
3+
LineChart,
4+
} from "lucide-react"
5+
6+
const Sidebar = () => {
7+
return (
8+
<div className="hidden border-r bg-muted/40 md:block">
9+
<div className="flex h-full max-h-screen flex-col gap-2">
10+
<div className="flex h-14 items-center border-b px-4 lg:h-[60px] lg:px-6">
11+
<a href="/" className="flex items-center gap-2 font-semibold">
12+
<span className="">Quantica</span>
13+
</a>
14+
15+
</div>
16+
<div className="flex-1">
17+
<nav className="grid items-start px-2 text-sm font-medium lg:px-4">
18+
<a
19+
href="/home"
20+
className="flex items-center gap-3 rounded-lg px-3 py-2 text-muted-foreground transition-all hover:text-primary"
21+
>
22+
<Home className="h-4 w-4" />
23+
Home
24+
</a>
25+
<a
26+
href="/plot"
27+
className="flex items-center gap-3 rounded-lg px-3 py-2 text-muted-foreground transition-all hover:text-primary"
28+
>
29+
<LineChart className="h-4 w-4" />
30+
f(x) Plotter
31+
</a>
32+
</nav>
33+
</div>
34+
</div>
35+
</div>
36+
)
37+
}
38+
39+
export default Sidebar

0 commit comments

Comments
 (0)