import DeleteIcon from '@mui/icons-material/Delete' import EditIcon from '@mui/icons-material/Edit' import { Box, Button, Container, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TablePagination, TableRow } from '@mui/material' import { matchW } from 'fp-ts/lib/Either' import { pipe } from 'fp-ts/lib/function' import { useAtomValue } from 'jotai' import { useState, useTransition } from 'react' import { serverURL } from '../atoms/settings' import LoadingBackdrop from '../components/LoadingBackdrop' import NoSubscriptions from '../components/subscriptions/NoSubscriptions' import SubscriptionsDialog from '../components/subscriptions/SubscriptionsDialog' import SubscriptionsEditDialog from '../components/subscriptions/SubscriptionsEditDialog' import SubscriptionsSpeedDial from '../components/subscriptions/SubscriptionsSpeedDial' import { useToast } from '../hooks/toast' import useFetch from '../hooks/useFetch' import { useI18n } from '../hooks/useI18n' import { ffetch } from '../lib/httpClient' import { Subscription } from '../services/subscriptions' import { PaginatedResponse } from '../types' const SubscriptionsView: React.FC = () => { const { i18n } = useI18n() const { pushMessage } = useToast() const baseURL = useAtomValue(serverURL) const [selectedSubscription, setSelectedSubscription] = useState() const [openDialog, setOpenDialog] = useState(false) const [startId, setStartId] = useState(0) const [limit, setLimit] = useState(9) const [page, setPage] = useState(0) const { data: subs, fetcher: refecth } = useFetch>( `/subscriptions?id=${startId}&limit=${limit}` ) const [isPending, startTransition] = useTransition() const deleteSubscription = async (id: string) => { const task = ffetch(`${baseURL}/subscriptions/${id}`, { method: 'DELETE', }) const either = await task() pipe( either, matchW( (l) => pushMessage(l, 'error'), () => refecth() ) ) } return ( <> setOpenDialog(s => !s)} /> { setSelectedSubscription(undefined) refecth() }} /> { setOpenDialog(s => !s) refecth() }} /> {!subs || subs.data.length === 0 ? : URL Params {i18n.t('cronExpressionLabel')} Actions {subs.data.map(x => ( {x.url} {x.params} {x.cron_expression} ))}
{ if (p < page) { setPage(s => (s - 1 <= 0 ? 0 : s - 1)) setStartId(subs.first) return } setPage(s => s + 1) setStartId(subs.next) }} rowsPerPage={limit} rowsPerPageOptions={[9, 10, 25, 50, 100]} onRowsPerPageChange={(e) => { setLimit(parseInt(e.target.value)) }} />
} ) } export default SubscriptionsView