| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import type { FetchPreviousPageOptions } from '@tanstack/react-query'
- import { CirclePause, CirclePlay } from 'lucide-react'
- import { useQueryStates } from 'nuqs'
- import { useEffect } from 'react'
- import { cn } from 'ui'
- import { ButtonTooltip } from '../ButtonTooltip'
- import { useDataTable } from './providers/DataTableProvider'
- import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
- import { useShortcut } from '@/state/shortcuts/useShortcut'
- const REFRESH_INTERVAL = 10_000
- interface LiveButtonProps {
- searchParamsParser: any
- fetchPreviousPage?: (options?: FetchPreviousPageOptions | undefined) => Promise<unknown>
- }
- export function LiveButton({ fetchPreviousPage, searchParamsParser }: LiveButtonProps) {
- const [{ live, date, sort }, setSearch] = useQueryStates(searchParamsParser)
- const { table } = useDataTable()
- useShortcut(SHORTCUT_IDS.DATA_TABLE_TOGGLE_LIVE, handleClick)
- useEffect(() => {
- let timeoutId: NodeJS.Timeout
- async function fetchData() {
- if (live) {
- await fetchPreviousPage?.()
- timeoutId = setTimeout(fetchData, REFRESH_INTERVAL)
- } else {
- clearTimeout(timeoutId)
- }
- }
- fetchData()
- return () => {
- clearTimeout(timeoutId)
- }
- }, [live, fetchPreviousPage])
- // REMINDER: make sure to reset live when date is set
- // TODO: test properly
- useEffect(() => {
- if ((date || sort) && live) {
- setSearch((prev) => ({ ...prev, live: null }))
- }
- }, [date, sort])
- function handleClick() {
- setSearch((prev) => ({
- ...prev,
- live: !prev.live,
- date: null,
- sort: null,
- }))
- table.getColumn('date')?.setFilterValue(undefined)
- table.resetSorting()
- }
- return (
- <ButtonTooltip
- className={cn(live && 'border-info text-info hover:text-info')}
- onClick={handleClick}
- type={live ? 'primary' : 'default'}
- size="tiny"
- icon={live ? <CirclePause className="h-4 w-4" /> : <CirclePlay className="h-4 w-4" />}
- tooltip={{ content: { side: 'bottom', text: live ? 'Pause live mode' : 'Start live mode' } }}
- >
- Live
- </ButtonTooltip>
- )
- }
|