feat: Implement custom scrollbar, refine agent profile edit navigation, and enhance quick link scrolling on the agent edit page.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user