Clean ovewview code

This commit is contained in:
Xin Wang
2026-02-11 15:01:59 +08:00
parent 44ad52669f
commit 6e63b49a4c

View File

@@ -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);
}; };
}, []); }, []);