From 82a33ce8b9245b2307d458abdc4b7ace2544c4ab Mon Sep 17 00:00:00 2001 From: pradeepkumar Date: Sun, 18 Jan 2026 21:29:52 +0530 Subject: [PATCH] feat: Implement custom scrollbar, refine agent profile edit navigation, and enhance quick link scrolling on the agent edit page. --- .../agent/dashboard/component/ProfileCard.tsx | 7 ++- src/app/(agent)/agent/dashboard/page.tsx | 10 +-- .../agent/edit/components/QuickLinks.tsx | 61 +++++++++++++++++-- src/app/(agent)/agent/edit/page.tsx | 15 +++-- src/app/globals.css | 24 ++++++++ 5 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/app/(agent)/agent/dashboard/component/ProfileCard.tsx b/src/app/(agent)/agent/dashboard/component/ProfileCard.tsx index 5329f31..60b73b6 100644 --- a/src/app/(agent)/agent/dashboard/component/ProfileCard.tsx +++ b/src/app/(agent)/agent/dashboard/component/ProfileCard.tsx @@ -1,6 +1,7 @@ 'use client'; import Image from 'next/image'; +import Link from 'next/link'; import { Tag } from './Tag'; interface ProfileCardProps { @@ -47,14 +48,14 @@ export function ProfileCard({ )} - +

{title}

diff --git a/src/app/(agent)/agent/dashboard/page.tsx b/src/app/(agent)/agent/dashboard/page.tsx index fa4a21a..3188def 100644 --- a/src/app/(agent)/agent/dashboard/page.tsx +++ b/src/app/(agent)/agent/dashboard/page.tsx @@ -2,7 +2,6 @@ import { useSession } from 'next-auth/react'; import Image from 'next/image'; -import Link from 'next/link'; // Import components from component folder import { @@ -104,17 +103,14 @@ export default function AgentDashboard() {
{/* Edit Icon - Top Right Outside */} - +
{/* Status Buttons */} diff --git a/src/app/(agent)/agent/edit/components/QuickLinks.tsx b/src/app/(agent)/agent/edit/components/QuickLinks.tsx index da88b2a..fa862f9 100644 --- a/src/app/(agent)/agent/edit/components/QuickLinks.tsx +++ b/src/app/(agent)/agent/edit/components/QuickLinks.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; const links = [ { id: 'basic-info', label: 'Basic Information' }, @@ -20,14 +20,65 @@ const links = [ { id: 'availability', label: 'Availability' }, ]; -export function QuickLinks() { +interface QuickLinksProps { + scrollContainerRef: React.RefObject; +} + +export function QuickLinks({ scrollContainerRef }: QuickLinksProps) { const [activeLink, setActiveLink] = useState('basic-info'); + const isClickScrolling = useRef(false); + + useEffect(() => { + const container = scrollContainerRef.current; + if (!container) return; + + const handleScroll = () => { + if (isClickScrolling.current) return; + + const containerRect = container.getBoundingClientRect(); + const containerTop = containerRect.top; + + let currentSection = 'basic-info'; + + for (const link of links) { + const element = document.getElementById(link.id); + if (element) { + const rect = element.getBoundingClientRect(); + // Check if the section is near the top of the container + if (rect.top <= containerTop + 100) { + currentSection = link.id; + } + } + } + + setActiveLink(currentSection); + }; + + container.addEventListener('scroll', handleScroll); + return () => container.removeEventListener('scroll', handleScroll); + }, [scrollContainerRef]); const scrollToSection = (id: string) => { - setActiveLink(id); + const container = scrollContainerRef.current; const element = document.getElementById(id); - if (element) { - element.scrollIntoView({ behavior: 'smooth', block: 'start' }); + + if (element && container) { + isClickScrolling.current = true; + setActiveLink(id); + + const containerRect = container.getBoundingClientRect(); + const elementRect = element.getBoundingClientRect(); + const scrollTop = container.scrollTop + (elementRect.top - containerRect.top) - 20; + + container.scrollTo({ + top: scrollTop, + behavior: 'smooth' + }); + + // Reset the flag after scroll animation completes + setTimeout(() => { + isClickScrolling.current = false; + }, 500); } }; diff --git a/src/app/(agent)/agent/edit/page.tsx b/src/app/(agent)/agent/edit/page.tsx index f9fbe98..2d495b9 100644 --- a/src/app/(agent)/agent/edit/page.tsx +++ b/src/app/(agent)/agent/edit/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState } from 'react'; +import { useState, useRef } from 'react'; import { useRouter } from 'next/navigation'; import Image from 'next/image'; import { @@ -108,6 +108,7 @@ const initialFormData = { export default function EditProfilePage() { const router = useRouter(); const [formData, setFormData] = useState(initialFormData); + const scrollContainerRef = useRef(null); const handleCancel = () => { router.push('/agent/dashboard'); @@ -124,16 +125,14 @@ export default function EditProfilePage() { }; return ( -
+
{/* Left Sidebar - Quick Links */} -
-
- -
+
+
- {/* Main Content */} -
+ {/* Main Content - Scrollable */} +
{/* Basic Information */}
diff --git a/src/app/globals.css b/src/app/globals.css index c0a97fd..41ebe63 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -95,3 +95,27 @@ html { background-color: var(--color-primary-light); color: var(--color-primary-dark); } + +/* Custom Scrollbar Styles */ +.scrollbar-thin::-webkit-scrollbar { + width: 6px; +} + +.scrollbar-thin::-webkit-scrollbar-track { + background: transparent; +} + +.scrollbar-thin::-webkit-scrollbar-thumb { + background-color: #d1d5db; + border-radius: 3px; +} + +.scrollbar-thin::-webkit-scrollbar-thumb:hover { + background-color: #9ca3af; +} + +/* Firefox scrollbar */ +.scrollbar-thin { + scrollbar-width: thin; + scrollbar-color: #d1d5db transparent; +}