import React, { useEffect } from 'react'; import Page from 'components/Page'; import globalize from 'lib/globalize'; import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; import { useTasks } from '../../features/tasks/api/useTasks'; import { getCategories, getTasksByCategory } from '../../features/tasks/utils/tasks'; import Loading from 'components/loading/LoadingComponent'; import Tasks from '../../features/tasks/components/Tasks'; import type { TaskInfo } from '@jellyfin/sdk/lib/generated-client/models/task-info'; import { SessionMessageType } from '@jellyfin/sdk/lib/generated-client/models/session-message-type'; import serverNotifications from 'scripts/serverNotifications'; import Events, { Event } from 'utils/events'; import { ApiClient } from 'jellyfin-apiclient'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; import { QueryKey } from 'apps/dashboard/features/tasks/api/queryKey'; export const Component = () => { const { __legacyApiClient__ } = useApi(); const { data: tasks, isPending } = useTasks({ isHidden: false }); // TODO: Replace usage of the legacy apiclient when websocket support is added to the TS SDK. useEffect(() => { const onScheduledTasksUpdate = (_e: Event, _apiClient: ApiClient, info: TaskInfo[]) => { queryClient.setQueryData([ QueryKey.Tasks ], info); }; const fallbackInterval = setInterval(() => { if (!__legacyApiClient__?.isMessageChannelOpen()) { void queryClient.invalidateQueries({ queryKey: [ QueryKey.Tasks ] }); } }, 1e4); __legacyApiClient__?.sendMessage(SessionMessageType.ScheduledTasksInfoStart, '1000,1000'); Events.on(serverNotifications, SessionMessageType.ScheduledTasksInfo, onScheduledTasksUpdate); return () => { clearInterval(fallbackInterval); __legacyApiClient__?.sendMessage(SessionMessageType.ScheduledTasksInfoStop, null); Events.off(serverNotifications, SessionMessageType.ScheduledTasksInfo, onScheduledTasksUpdate); }; }, [__legacyApiClient__]); if (isPending || !tasks) { return ; } const categories = getCategories(tasks); return ( {categories.map(category => { return ; })} ); }; Component.displayName = 'TasksPage';