mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-09 23:15:46 +01:00
121 lines
4.1 KiB
TypeScript
121 lines
4.1 KiB
TypeScript
import {
|
|
Badge,
|
|
Button,
|
|
Group,
|
|
Select,
|
|
Stack,
|
|
Tabs,
|
|
Text,
|
|
Title,
|
|
useMantineTheme,
|
|
} from '@mantine/core';
|
|
import { IconPlayerPause, IconPlayerPlay } from '@tabler/icons';
|
|
import { useEffect, useState } from 'react';
|
|
|
|
import { useElementSize } from '@mantine/hooks';
|
|
import dayjs from 'dayjs';
|
|
import duration from 'dayjs/plugin/duration';
|
|
import { useTranslation } from 'next-i18next';
|
|
import { UsenetQueueList } from './UsenetQueueList';
|
|
import { UsenetHistoryList } from './UsenetHistoryList';
|
|
import { BaseTileProps } from '../../components/Dashboard/Tiles/type';
|
|
import { AppIntegrationType } from '../../types/app';
|
|
import { useConfigContext } from '../../config/provider';
|
|
import { useGetUsenetInfo, usePauseUsenetQueue, useResumeUsenetQueue } from '../../tools/hooks/api';
|
|
import { HomarrCardWrapper } from '../../components/Dashboard/Tiles/HomarrCardWrapper';
|
|
import { humanFileSize } from '../../tools/humanFileSize';
|
|
|
|
dayjs.extend(duration);
|
|
|
|
const downloadAppTypes: AppIntegrationType['type'][] = ['sabnzbd', 'nzbGet'];
|
|
|
|
interface UseNetTileProps extends BaseTileProps {}
|
|
|
|
export const UseNetTile = ({ className }: UseNetTileProps) => {
|
|
const { t } = useTranslation('modules/usenet');
|
|
const { config } = useConfigContext();
|
|
const downloadApps =
|
|
config?.apps.filter(
|
|
(x) => x.integration && downloadAppTypes.includes(x.integration.type)
|
|
) ?? [];
|
|
|
|
const [selectedAppId, setSelectedApp] = useState<string | null>(downloadApps[0]?.id);
|
|
const { data } = useGetUsenetInfo({ appId: selectedAppId! });
|
|
|
|
useEffect(() => {
|
|
if (!selectedAppId && downloadApps.length) {
|
|
setSelectedApp(downloadApps[0].id);
|
|
}
|
|
}, [downloadApps, selectedAppId]);
|
|
|
|
const { mutate: pause } = usePauseUsenetQueue({ appId: selectedAppId! });
|
|
const { mutate: resume } = useResumeUsenetQueue({ appId: selectedAppId! });
|
|
|
|
if (downloadApps.length === 0) {
|
|
return (
|
|
<HomarrCardWrapper className={className}>
|
|
<Stack>
|
|
<Title order={3}>{t('card.errors.noDownloadClients.title')}</Title>
|
|
<Group>
|
|
<Text>{t('card.errors.noDownloadClients.text')}</Text>
|
|
</Group>
|
|
</Stack>
|
|
</HomarrCardWrapper>
|
|
);
|
|
}
|
|
|
|
if (!selectedAppId) {
|
|
return null;
|
|
}
|
|
|
|
const { ref, width, height } = useElementSize();
|
|
const MIN_WIDTH_MOBILE = useMantineTheme().breakpoints.xs;
|
|
|
|
return (
|
|
<HomarrCardWrapper className={className}>
|
|
<Tabs keepMounted={false} defaultValue="queue">
|
|
<Tabs.List ref={ref} mb="md" style={{ flex: 1 }} grow>
|
|
<Tabs.Tab value="queue">{t('tabs.queue')}</Tabs.Tab>
|
|
<Tabs.Tab value="history">{t('tabs.history')}</Tabs.Tab>
|
|
{data && (
|
|
<Group position="right" ml="auto">
|
|
{width > MIN_WIDTH_MOBILE && (
|
|
<>
|
|
<Badge>{humanFileSize(data?.speed)}/s</Badge>
|
|
<Badge>
|
|
{t('info.sizeLeft')}: {humanFileSize(data?.sizeLeft)}
|
|
</Badge>
|
|
</>
|
|
)}
|
|
</Group>
|
|
)}
|
|
</Tabs.List>
|
|
{downloadApps.length > 1 && (
|
|
<Select
|
|
value={selectedAppId}
|
|
onChange={setSelectedApp}
|
|
ml="xs"
|
|
data={downloadApps.map((app) => ({ value: app.id, label: app.name }))}
|
|
/>
|
|
)}
|
|
<Tabs.Panel value="queue">
|
|
<UsenetQueueList appId={selectedAppId} />
|
|
{!data ? null : data.paused ? (
|
|
<Button uppercase onClick={() => resume()} radius="xl" size="xs" fullWidth mt="sm">
|
|
<IconPlayerPlay size={12} style={{ marginRight: 5 }} /> {t('info.paused')}
|
|
</Button>
|
|
) : (
|
|
<Button uppercase onClick={() => pause()} radius="xl" size="xs" fullWidth mt="sm">
|
|
<IconPlayerPause size={12} style={{ marginRight: 5 }} />{' '}
|
|
{dayjs.duration(data.eta, 's').format('HH:mm')}
|
|
</Button>
|
|
)}
|
|
</Tabs.Panel>
|
|
<Tabs.Panel value="history" style={{ display: 'flex', flexDirection: 'column' }}>
|
|
<UsenetHistoryList appId={selectedAppId} />
|
|
</Tabs.Panel>
|
|
</Tabs>
|
|
</HomarrCardWrapper>
|
|
);
|
|
};
|