import React, { type CSSProperties } from 'react'; import { Card, Col, Row } from 'antd'; import { useIntersectionObserver } from 'usehooks-ts'; import ReactECharts from '../../components/ECharts'; import type { ClassroomOccupancy, GanttRoom } from './Dashboard.types'; import { buildClassroomHeatmapOption, buildGanttOption } from './DashboardCharts'; const useInViewport = (rootMargin = '200px') => { const { ref, isIntersecting } = useIntersectionObserver({ rootMargin, freezeOnceVisible: true, }); return { ref, inView: isIntersecting }; }; const LazySection: React.FC<{ title: string; vp: { ref: (node?: Element | null) => void; inView: boolean }; minHeight: number; style?: CSSProperties; children: React.ReactNode; }> = ({ title, vp, minHeight, style, children }) => { return (
{vp.inView ? ( {children} ) : (
加载中…
)}
); }; export const ClassroomHeatmapCard: React.FC<{ data: ClassroomOccupancy[]; isMobile: boolean; }> = ({ data, isMobile }) => { const vp = useInViewport('200px'); return ( {data.length > 0 ? ( ) : (
暂无教室数据
)}
); }; export const GanttCard: React.FC<{ data: GanttRoom[]; isMobile: boolean }> = ({ data, isMobile, }) => { const vp = useInViewport('200px'); return ( {data.length > 0 ? ( ) : (
暂无入住数据
)}
); };