/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react/jsx-key */ import { Button, chakra, Checkbox, Flex, HStack, Text } from '@chakra-ui/react' import { AlignLeftTextIcon } from 'assets/icons' import { ResultHeaderCell } from 'models' import React, { useEffect, useMemo, useRef } from 'react' import { Hooks, useRowSelect, useTable } from 'react-table' import { parseSubmissionsColumns } from 'services/typebots' import { LoadingRows } from './LoadingRows' type SubmissionsTableProps = { resultHeader: ResultHeaderCell[] data?: any hasMore?: boolean onNewSelection: (indices: number[]) => void onScrollToBottom: () => void onLogOpenIndex: (index: number) => () => void } export const SubmissionsTable = ({ resultHeader, data, hasMore, onNewSelection, onScrollToBottom, onLogOpenIndex, }: SubmissionsTableProps) => { const columns: any = useMemo( () => parseSubmissionsColumns(resultHeader), [resultHeader] ) const bottomElement = useRef(null) const tableWrapper = useRef(null) const { getTableProps, headerGroups, rows, prepareRow, getTableBodyProps, selectedFlatRows, } = useTable({ columns, data }, useRowSelect, checkboxColumnHook) as any useEffect(() => { onNewSelection(selectedFlatRows.map((row: any) => row.index)) // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedFlatRows]) useEffect(() => { if (!bottomElement.current) return const options: IntersectionObserverInit = { root: tableWrapper.current, threshold: 0, } const observer = new IntersectionObserver(handleObserver, options) if (bottomElement.current) observer.observe(bottomElement.current) // eslint-disable-next-line react-hooks/exhaustive-deps }, [bottomElement.current]) const handleObserver = (entities: any[]) => { const target = entities[0] if (target.isIntersecting) onScrollToBottom() } return ( {headerGroups.map((headerGroup: any) => { return ( {headerGroup.headers.map((column: any) => { return ( {column.render('Header')} ) })} Logs ) })} {rows.map((row: any, idx: number) => { prepareRow(row) return ( { if (idx === data.length - 10) bottomElement.current = ref }} > {row.cells.map((cell: any) => { return ( 100 ? 'normal' : 'nowrap' } {...cell.getCellProps()} > {cell.render('Cell')} ) })} ) })} {hasMore === true && ( )} ) } const checkboxColumnHook = (hooks: Hooks) => { hooks.visibleColumns.push((columns) => [ { id: 'selection', Header: ({ getToggleAllRowsSelectedProps }: any) => ( ), Cell: ({ row }: any) => ( ), }, ...columns, ]) } const IndeterminateCheckbox = React.forwardRef( ({ indeterminate, checked, ...rest }: any, ref) => { const defaultRef = React.useRef() const resolvedRef: any = ref || defaultRef return ( ) } )