App TSX
App TSX
// Login/Register states
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isRegistering, setIsRegistering] = useState(false);
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const [registeredUser, setRegisteredUser] = useState(null);
// Register handler
const handleRegister = () => {
const passwordRegex = /^(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$/;
if (!passwordRegex.test(password)) {
alert(
"Password must be at least 8 characters long and include a special
character."
);
return;
}
// Login handler
const handleLogin = () => {
if (
registeredUser &&
username === registeredUser.username &&
password === registeredUser.password
) {
setIsLoggedIn(true);
} else {
alert("Invalid username or password!");
}
};
if (!response.ok) {
throw new Error(`API error: ${response.statusText}`);
}
try {
const response = await getResponse(newMessage);
const responseParagraphs = response.split("\n").filter(Boolean); // Split
response into paragraphs
// Add the user message and each paragraph as separate messages
setMessages((prevMessages) => [
...prevMessages,
{ id: prevMessages.length + 1, text: newMessage, isUser: true },
...responseParagraphs.map((para, index) => ({
id: prevMessages.length + 2 + index,
text: para,
isUser: false,
})),
]);
setNewMessage("");
} catch (error) {
setMessages((prevMessages) => [
...prevMessages,
{ id: prevMessages.length + 1, text: newMessage, isUser: true },
{
id: prevMessages.length + 2,
text: "Error: Unable to fetch response.",
isUser: false,
},
]);
} finally {
setLoading(false);
}
};
// Show the login/register form or the main content based on login status
if (!isLoggedIn) {
return (
<div className="flex justify-center items-center h-screen bg-gradient-to-b
from-gray-900 via-gray-800 to-black">
{/* Spline 3D Background */}
<Spline
scene="https://prod.spline.design/t1jD7IKZJrp8aiQt/scene.splinecode"
className="absolute inset-0 z-0"
/>
return (
<div className="relative h-screen w-screen bg-gradient-to-b from-gray-900 via-
gray-800 to-black">
{/* 3D Background */}
<Spline
className="absolute inset-0 z-0"
scene="https://prod.spline.design/PwWEW8GMNt6pXgrw/scene.splinecode"
/>