feat: Implement custom scrollbar, refine agent profile edit navigation, and enhance quick link scrolling on the agent edit page.

This commit is contained in:
pradeepkumar
2026-01-18 21:29:52 +05:30
parent 5fc28117d2
commit 82a33ce8b9
5 changed files with 94 additions and 23 deletions

View File

@@ -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<HTMLDivElement | null>;
}
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);
}
};

View File

@@ -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<HTMLDivElement>(null);
const handleCancel = () => {
router.push('/agent/dashboard');
@@ -124,16 +125,14 @@ export default function EditProfilePage() {
};
return (
<div className="flex gap-6">
<div className="flex gap-6 h-[calc(100vh-180px)]">
{/* Left Sidebar - Quick Links */}
<div className="w-[220px] flex-shrink-0 hidden lg:block">
<div className="sticky top-6">
<QuickLinks />
</div>
<div className="w-[220px] flex-shrink-0 hidden lg:block h-full overflow-y-auto scrollbar-thin">
<QuickLinks scrollContainerRef={scrollContainerRef} />
</div>
{/* Main Content */}
<div className="flex-1 space-y-6">
{/* Main Content - Scrollable */}
<div ref={scrollContainerRef} className="flex-1 space-y-6 overflow-y-auto pr-2 scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-transparent">
{/* Basic Information */}
<div className="bg-white rounded-[20px] p-6">
<FormSection id="basic-info" icon="/assets/icons/user-icon.svg" title="Basic Information">