Added home page with dashboard content and SEO metadata

This commit is contained in:
Chinraj P
2026-06-23 14:14:08 +05:30
parent 2245584734
commit 987ca11a4d
5 changed files with 107 additions and 50 deletions

View File

@@ -1,23 +1,26 @@
'use client'; "use client";
import { useSession } from 'next-auth/react'; import { useSession } from "next-auth/react";
import { useRouter, usePathname } from 'next/navigation'; import { useRouter, usePathname } from "next/navigation";
import { useEffect } from 'react'; import { useEffect } from "react";
import Image from 'next/image'; import Image from "next/image";
import { Footer } from '@/components/layout/Footer'; import { Footer } from "@/components/layout/Footer";
import { CommonHeader } from '@/components/layout/CommonHeader'; import { CommonHeader } from "@/components/layout/CommonHeader";
import { PresenceProvider } from '@/components/providers/presence-provider'; import { PresenceProvider } from "@/components/providers/presence-provider";
// Pages that don't require authentication // Pages that don't require authentication
const publicPaths = [ const publicPaths = [
'/user/dashboard', "/home",
'/user/profiles', "/user/dashboard",
'/user/profile/', // Agent profile view (includes /user/profile/[id]) "/user/profiles",
"/user/profile/", // Agent profile view (includes /user/profile/[id])
]; ];
// Check if current path is public // Check if current path is public
const isPublicPath = (pathname: string) => { const isPublicPath = (pathname: string) => {
return publicPaths.some(path => pathname === path || pathname.startsWith(path)); return publicPaths.some(
(path) => pathname === path || pathname.startsWith(path),
);
}; };
export default function UserLayout({ export default function UserLayout({
@@ -28,11 +31,12 @@ export default function UserLayout({
const { data: session, status } = useSession(); const { data: session, status } = useSession();
const router = useRouter(); const router = useRouter();
const pathname = usePathname(); const pathname = usePathname();
const isDashboard = pathname === '/user/dashboard'; // const isDashboard = pathname === "/user/dashboard";
const isDashboard = pathname === "/user/dashboard" || pathname === "/home";
const isPublic = isPublicPath(pathname); const isPublic = isPublicPath(pathname);
useEffect(() => { useEffect(() => {
if (status === 'loading') return; if (status === "loading") return;
// Allow public pages without authentication. // Allow public pages without authentication.
// Agents are intentionally allowed to land on /user/dashboard — the logo // Agents are intentionally allowed to land on /user/dashboard — the logo
@@ -49,19 +53,31 @@ export default function UserLayout({
// Redirect agents to agent dashboard for protected user pages // Redirect agents to agent dashboard for protected user pages
const userRole = (session.user as any)?.role; const userRole = (session.user as any)?.role;
if (userRole === 'AGENT') { if (userRole === "AGENT") {
router.replace('/agent/dashboard'); router.replace("/agent/dashboard");
} }
}, [session, status, router, pathname, isPublic]); }, [session, status, router, pathname, isPublic]);
const splashLoading = ( const splashLoading = (
<div <div
className="min-h-screen flex flex-col items-center justify-center" className="min-h-screen flex flex-col items-center justify-center"
style={{ background: 'linear-gradient(to bottom, #c4d9d4, #f0f5fc)' }} style={{ background: "linear-gradient(to bottom, #c4d9d4, #f0f5fc)" }}
> >
<Image src="/assets/images/splash-house.png" alt="" width={150} height={108} priority /> <Image
src="/assets/images/splash-house.png"
alt=""
width={150}
height={108}
priority
/>
<div className="mt-[35px]"> <div className="mt-[35px]">
<Image src="/assets/images/splash-logo.png" alt="RE-Quest" width={264} height={55} priority /> <Image
src="/assets/images/splash-logo.png"
alt="RE-Quest"
width={264}
height={55}
priority
/>
</div> </div>
<div className="mt-8"> <div className="mt-8">
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-[#00293d]" /> <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-[#00293d]" />
@@ -70,7 +86,7 @@ export default function UserLayout({
); );
// Show loading only for protected pages while checking auth // Show loading only for protected pages while checking auth
if (status === 'loading' && !isPublic) { if (status === "loading" && !isPublic) {
return splashLoading; return splashLoading;
} }
@@ -105,9 +121,7 @@ export default function UserLayout({
</div> </div>
{/* Main Content */} {/* Main Content */}
<main className="flex-1"> <main className="flex-1">{children}</main>
{children}
</main>
</> </>
)} )}

16
src/app/home/page.tsx Normal file
View File

@@ -0,0 +1,16 @@
import UserLayout from "../(user)/layout";
import DashboardPage from "../(user)/user/dashboard/page";
export const metadata = {
title: "RE-Quest - Connect with Trusted Real Estate Professionals",
description:
"Discover verified real estate professionals for buying, selling, renting, and investing. Search by location, specialization, and expertise to connect with trusted agents on RE-Quest.",
};
export default function HomePage() {
return (
<UserLayout>
<DashboardPage />
</UserLayout>
);
}

View File

@@ -1,27 +1,27 @@
'use client'; "use client";
import { useSession } from 'next-auth/react'; import { useSession } from "next-auth/react";
import { useRouter } from 'next/navigation'; import { useRouter } from "next/navigation";
import { useEffect } from 'react'; import { useEffect } from "react";
export default function Home() { export default function Home() {
const { data: session, status } = useSession(); const { data: session, status } = useSession();
const router = useRouter(); const router = useRouter();
useEffect(() => { useEffect(() => {
if (status === 'loading') return; if (status === "loading") return;
// Redirect based on user role, or to public dashboard if not logged in // Redirect based on user role, or to public dashboard if not logged in
if (session) { if (session) {
const userRole = (session.user as any)?.role; const userRole = (session.user as any)?.role;
if (userRole === 'AGENT') { if (userRole === "AGENT") {
router.replace('/agent/dashboard'); router.replace("/agent/dashboard");
} else { } else {
router.replace('/user/dashboard'); router.replace("/user/dashboard");
} }
} else { } else {
// Not logged in - go to public user dashboard // Not logged in - go to public user dashboard
router.replace('/user/dashboard'); router.replace("/home");
} }
}, [session, status, router]); }, [session, status, router]);

View File

@@ -7,6 +7,7 @@ import { useSession } from "next-auth/react";
import { useHeaderData } from "@/components/providers/header-provider"; import { useHeaderData } from "@/components/providers/header-provider";
const navLinks = [ const navLinks = [
{ label: "Professional", href: "/user/profiles" },
{ label: "Education", href: "/education" }, { label: "Education", href: "/education" },
{ label: "About Us", href: "/about" }, { label: "About Us", href: "/about" },
{ label: "FAQ's", href: "/faq" }, { label: "FAQ's", href: "/faq" },
@@ -56,6 +57,7 @@ export function CommonHeader() {
if (showProfileMenu || showGuestMenu || showMobileMenu) { if (showProfileMenu || showGuestMenu || showMobileMenu) {
document.addEventListener("mousedown", handleClickOutside); document.addEventListener("mousedown", handleClickOutside);
} }
// const showProfessional = userRole === "AGENT" || userRole === "LENDER";
return () => { return () => {
document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("mousedown", handleClickOutside);
@@ -66,12 +68,13 @@ export function CommonHeader() {
const userName = profileName || session?.user?.name; const userName = profileName || session?.user?.name;
const userEmail = session?.user?.email; const userEmail = session?.user?.email;
const userRole = (session?.user as any)?.role; const userRole = (session?.user as any)?.role;
const showProfessional = userRole === "AGENT" || userRole === "LENDER"; // const showProfessional = userRole === "AGENT" || userRole === "LENDER";
// Use fetched profile image, fallback to session image // Use fetched profile image, fallback to session image
const userImage = profileImage || session?.user?.image; const userImage = profileImage || session?.user?.image;
// Logo destination — always lands on the user dashboard regardless of role. // Logo destination — always lands on the user dashboard regardless of role.
const dashboardLink = "/user/dashboard"; // const dashboardLink = "/user/dashboard";
const dashboardLink = "/home";
return ( return (
<header <header
@@ -92,7 +95,7 @@ export function CommonHeader() {
</Link> </Link>
{/* Navigation - Desktop only */} {/* Navigation - Desktop only */}
{/* <nav className="hidden md:flex items-center gap-8 ml-auto mr-8"> <nav className="hidden md:flex items-center gap-8 ml-auto mr-8">
{navLinks.map((link) => ( {navLinks.map((link) => (
<Link <Link
key={link.href} key={link.href}
@@ -102,8 +105,8 @@ export function CommonHeader() {
{link.label} {link.label}
</Link> </Link>
))} ))}
</nav> */} </nav>
<nav className="hidden md:flex items-center gap-8 ml-auto mr-8"> {/* <nav className="hidden md:flex items-center gap-8 ml-auto mr-8">
{showProfessional && ( {showProfessional && (
<Link <Link
href="/user/profiles" href="/user/profiles"
@@ -122,7 +125,7 @@ export function CommonHeader() {
{link.label} {link.label}
</Link> </Link>
))} ))}
</nav> </nav> */}
{/* Right Side Icons */} {/* Right Side Icons */}
<div className="flex items-center gap-2 md:gap-4"> <div className="flex items-center gap-2 md:gap-4">
@@ -470,7 +473,7 @@ export function CommonHeader() {
{/* Mobile Navigation Menu */} {/* Mobile Navigation Menu */}
{showMobileMenu && ( {showMobileMenu && (
<div className="md:hidden border-t border-white/20 py-3 pb-4"> <div className="md:hidden border-t border-white/20 py-3 pb-4">
{/* <nav className="flex flex-col gap-1"> <nav className="flex flex-col gap-1">
{navLinks.map((link) => ( {navLinks.map((link) => (
<Link <Link
key={link.href} key={link.href}
@@ -481,8 +484,8 @@ export function CommonHeader() {
{link.label} {link.label}
</Link> </Link>
))} ))}
</nav> */} </nav>
<nav className="flex flex-col gap-1"> {/* <nav className="flex flex-col gap-1">
{showProfessional && ( {showProfessional && (
<Link <Link
href="/user/profiles" href="/user/profiles"
@@ -503,7 +506,7 @@ export function CommonHeader() {
{link.label} {link.label}
</Link> </Link>
))} ))}
</nav> </nav> */}
</div> </div>
)} )}
</header> </header>

View File

@@ -2,10 +2,30 @@ import { auth } from "@/auth";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
// Auth routes - logged-in users should be redirected away from these // Auth routes - logged-in users should be redirected away from these
const authRoutes = ["/login", "/signup", "/forgot-password", "/reset-password", "/verify-email"]; const authRoutes = [
"/login",
"/signup",
"/forgot-password",
"/reset-password",
"/verify-email",
];
// Public routes - accessible to everyone (logged in or not) // Public routes - accessible to everyone (logged in or not)
const publicRoutes = ["/", "/contact", "/about", "/faq", "/education", "/coming-soon", "/privacy-policy", "/terms-of-service", "/logout", "/user/dashboard", "/user/profiles", "/user/profile"]; const publicRoutes = [
"/",
"/home",
"/contact",
"/about",
"/faq",
"/education",
"/coming-soon",
"/privacy-policy",
"/terms-of-service",
"/logout",
"/user/dashboard",
"/user/profiles",
"/user/profile",
];
// Routes that should NEVER be redirected away from (even if logged in) // Routes that should NEVER be redirected away from (even if logged in)
const noRedirectRoutes = ["/logout"]; const noRedirectRoutes = ["/logout"];
@@ -16,23 +36,27 @@ export default auth((req) => {
const userRole = (req.auth?.user as any)?.role; const userRole = (req.auth?.user as any)?.role;
const isAuthRoute = authRoutes.some( const isAuthRoute = authRoutes.some(
(route) => nextUrl.pathname === route || nextUrl.pathname.startsWith(route + "/") (route) =>
nextUrl.pathname === route || nextUrl.pathname.startsWith(route + "/"),
); );
const isPublicRoute = publicRoutes.some( const isPublicRoute = publicRoutes.some(
(route) => nextUrl.pathname === route || nextUrl.pathname.startsWith(route + "/") (route) =>
nextUrl.pathname === route || nextUrl.pathname.startsWith(route + "/"),
); );
const isAgentRoute = nextUrl.pathname.startsWith("/agent"); const isAgentRoute = nextUrl.pathname.startsWith("/agent");
const isUserRoute = nextUrl.pathname.startsWith("/user"); const isUserRoute = nextUrl.pathname.startsWith("/user");
const isApiRoute = nextUrl.pathname.startsWith("/api"); const isApiRoute = nextUrl.pathname.startsWith("/api");
const isStaticRoute = nextUrl.pathname.startsWith("/_next") || const isStaticRoute =
nextUrl.pathname.startsWith("/_next") ||
nextUrl.pathname.startsWith("/assets") || nextUrl.pathname.startsWith("/assets") ||
nextUrl.pathname.includes("."); nextUrl.pathname.includes(".");
const isNoRedirectRoute = noRedirectRoutes.some( const isNoRedirectRoute = noRedirectRoutes.some(
(route) => nextUrl.pathname === route || nextUrl.pathname.startsWith(route + "/") (route) =>
nextUrl.pathname === route || nextUrl.pathname.startsWith(route + "/"),
); );
// Skip middleware for API routes and static files // Skip middleware for API routes and static files