Clean ovewview code
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
import React, { useState, useMemo, useRef, useEffect } from 'react';
|
import React, { useState, useMemo, useRef, useEffect } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { Phone, CheckCircle, Clock, UserCheck, Activity, Filter, ChevronDown, BarChart3, HelpCircle, Mail, Sparkles, ArrowDown, Bot, Zap, Rocket, LineChart, Layers, Fingerprint, Network, MonitorPlay, Plus } from 'lucide-react';
|
import { Phone, CheckCircle, Clock, UserCheck, ChevronDown, BarChart3, HelpCircle, Mail, ArrowDown, Bot, Zap, Rocket, LineChart, Layers, Fingerprint, Network, MonitorPlay, Plus } from 'lucide-react';
|
||||||
import { Card, Button } from '../components/UI';
|
import { Card, Button } from '../components/UI';
|
||||||
import { getDashboardStats } from '../services/mockData';
|
import { getDashboardStats } from '../services/mockData';
|
||||||
import { Assistant } from '../types';
|
import { Assistant } from '../types';
|
||||||
@@ -27,45 +27,78 @@ export const DashboardPage: React.FC = () => {
|
|||||||
}, [timeRange, selectedAssistantId]);
|
}, [timeRange, selectedAssistantId]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
let disposed = false;
|
||||||
|
|
||||||
const loadAssistants = async () => {
|
const loadAssistants = async () => {
|
||||||
try {
|
try {
|
||||||
const list = await fetchAssistants();
|
const list = await fetchAssistants();
|
||||||
setAssistants(list);
|
if (!disposed) {
|
||||||
|
setAssistants(list);
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
if (!disposed) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
loadAssistants();
|
loadAssistants();
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
disposed = true;
|
||||||
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const updateTopRailHeight = () => {
|
const updateTopRailHeight = () => {
|
||||||
setTopRailHeight(topRailRef.current?.offsetHeight ?? 0);
|
const nextHeight = topRailRef.current?.offsetHeight ?? 0;
|
||||||
|
setTopRailHeight((prev) => (prev === nextHeight ? prev : nextHeight));
|
||||||
};
|
};
|
||||||
|
|
||||||
updateTopRailHeight();
|
updateTopRailHeight();
|
||||||
|
|
||||||
const observer = new ResizeObserver(() => {
|
let observer: ResizeObserver | null = null;
|
||||||
updateTopRailHeight();
|
if (typeof ResizeObserver !== 'undefined' && topRailRef.current) {
|
||||||
});
|
observer = new ResizeObserver(() => {
|
||||||
|
updateTopRailHeight();
|
||||||
if (topRailRef.current) {
|
});
|
||||||
observer.observe(topRailRef.current);
|
observer.observe(topRailRef.current);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('resize', updateTopRailHeight);
|
window.addEventListener('resize', updateTopRailHeight);
|
||||||
return () => {
|
return () => {
|
||||||
observer.disconnect();
|
if (observer) {
|
||||||
|
observer.disconnect();
|
||||||
|
}
|
||||||
window.removeEventListener('resize', updateTopRailHeight);
|
window.removeEventListener('resize', updateTopRailHeight);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!scrollRootRef.current || !overviewRef.current) return;
|
if (!scrollRootRef.current || !overviewRef.current) return;
|
||||||
|
if (typeof IntersectionObserver === 'undefined') {
|
||||||
|
const onScroll = () => {
|
||||||
|
if (!scrollRootRef.current || !overviewRef.current) return;
|
||||||
|
const rootRect = scrollRootRef.current.getBoundingClientRect();
|
||||||
|
const overviewRect = overviewRef.current.getBoundingClientRect();
|
||||||
|
const lowerBound = rootRect.top + rootRect.height * 0.35;
|
||||||
|
const upperBound = rootRect.bottom - rootRect.height * 0.35;
|
||||||
|
const isVisible = overviewRect.bottom > lowerBound && overviewRect.top < upperBound;
|
||||||
|
setIsOverviewVisible((prev) => (prev === isVisible ? prev : isVisible));
|
||||||
|
};
|
||||||
|
|
||||||
|
onScroll();
|
||||||
|
scrollRootRef.current.addEventListener('scroll', onScroll, { passive: true });
|
||||||
|
window.addEventListener('resize', onScroll);
|
||||||
|
return () => {
|
||||||
|
scrollRootRef.current?.removeEventListener('scroll', onScroll);
|
||||||
|
window.removeEventListener('resize', onScroll);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const observer = new IntersectionObserver(
|
const observer = new IntersectionObserver(
|
||||||
([entry]) => {
|
([entry]) => {
|
||||||
setIsOverviewVisible(entry.isIntersecting);
|
setIsOverviewVisible((prev) => (prev === entry.isIntersecting ? prev : entry.isIntersecting));
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
root: scrollRootRef.current,
|
root: scrollRootRef.current,
|
||||||
@@ -81,22 +114,25 @@ export const DashboardPage: React.FC = () => {
|
|||||||
const updateScrollRootCenter = () => {
|
const updateScrollRootCenter = () => {
|
||||||
if (!scrollRootRef.current) return;
|
if (!scrollRootRef.current) return;
|
||||||
const rect = scrollRootRef.current.getBoundingClientRect();
|
const rect = scrollRootRef.current.getBoundingClientRect();
|
||||||
setScrollRootCenterX(rect.left + rect.width / 2);
|
const nextCenterX = rect.left + rect.width / 2;
|
||||||
|
setScrollRootCenterX((prev) => (prev === nextCenterX ? prev : nextCenterX));
|
||||||
};
|
};
|
||||||
|
|
||||||
updateScrollRootCenter();
|
updateScrollRootCenter();
|
||||||
|
|
||||||
const observer = new ResizeObserver(() => {
|
let observer: ResizeObserver | null = null;
|
||||||
updateScrollRootCenter();
|
if (typeof ResizeObserver !== 'undefined' && scrollRootRef.current) {
|
||||||
});
|
observer = new ResizeObserver(() => {
|
||||||
|
updateScrollRootCenter();
|
||||||
if (scrollRootRef.current) {
|
});
|
||||||
observer.observe(scrollRootRef.current);
|
observer.observe(scrollRootRef.current);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('resize', updateScrollRootCenter);
|
window.addEventListener('resize', updateScrollRootCenter);
|
||||||
return () => {
|
return () => {
|
||||||
observer.disconnect();
|
if (observer) {
|
||||||
|
observer.disconnect();
|
||||||
|
}
|
||||||
window.removeEventListener('resize', updateScrollRootCenter);
|
window.removeEventListener('resize', updateScrollRootCenter);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
Reference in New Issue
Block a user