diff --git a/src/components/CursorWrapper.tsx b/src/components/CursorWrapper.tsx new file mode 100644 index 0000000..8f17e47 --- /dev/null +++ b/src/components/CursorWrapper.tsx @@ -0,0 +1,50 @@ +import React, { useEffect, useRef } from "react"; +import { Table } from "@mantine/core"; + +type CursorWrapperProps = { + clickFunc: () => void; + bg: string; + children: React.ReactNode; + isCursor: boolean; + getNextPage: (cursorIdx: number) => void; + cursorIdx: number; +}; + +const CursorWrapper: React.FC = ({ + clickFunc, + bg, + children, + isCursor, + getNextPage, + cursorIdx, +}) => { + const ref = useRef(null); + + useEffect(() => { + if (!isCursor) return; + const element = ref.current; + + if (!element) return; + + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + getNextPage(cursorIdx); + } + }, + { threshold: 0.5 }, + ); + + observer.observe(element); + + return () => observer.disconnect(); + }, []); + + return ( + + {children} + + ); +}; + +export default CursorWrapper; diff --git a/src/components/DataTable.tsx b/src/components/DataTable.tsx index 8ee822e..1e53a7c 100644 --- a/src/components/DataTable.tsx +++ b/src/components/DataTable.tsx @@ -1,6 +1,7 @@ import { Table } from "@mantine/core"; import { useMantineTheme } from "@mantine/core"; import { Input, Textarea } from "@mantine/core"; +import CursorWrapper from "./CursorWrapper"; // Data table of the files/root page interface DataTableProps { @@ -10,6 +11,7 @@ interface DataTableProps { setSelectedData: React.Dispatch< React.SetStateAction >; + getNextPage: (cursorIdx: number) => void; } export default function DataTable({ @@ -17,6 +19,7 @@ export default function DataTable({ selectedRow, setSelectedRow, setSelectedData, + getNextPage, }: DataTableProps) { const theme = useMantineTheme(); @@ -51,22 +54,27 @@ export default function DataTable({ ) : ( - data.map((file) => ( - ( + setPreviewData(file)} + clickFunc={() => setPreviewData(file)} bg={selectedRow === file.id ? theme.primaryColor : ""} + isCursor={idx === data.length - 1} + getNextPage={getNextPage} + cursorIdx={idx} > - {getFileNameWithoutExtension(file.mcap_files[0].file_name)} + {file.mcap_files + ? getFileNameWithoutExtension(file.mcap_files[0].file_name) + : null} {file.date} - - + +