misc_pterodactyl-panel/resources/scripts/components/server/ServerActivityLogContainer.tsx

70 lines
2.9 KiB
TypeScript
Raw Normal View History

2022-11-25 20:25:03 +00:00
import { useEffect, useState } from 'react';
2022-06-12 19:16:48 +00:00
import { useActivityLogs } from '@/api/server/activity';
import ServerContentBlock from '@/components/elements/ServerContentBlock';
import { useFlashKey } from '@/plugins/useFlash';
import FlashMessageRender from '@/components/FlashMessageRender';
import Spinner from '@/components/elements/Spinner';
import ActivityLogEntry from '@/components/elements/activity/ActivityLogEntry';
import PaginationFooter from '@/components/elements/table/PaginationFooter';
import { ActivityLogFilters } from '@/api/account/activity';
import { Link } from 'react-router-dom';
import classNames from 'classnames';
2022-06-12 19:17:14 +00:00
import { styles as btnStyles } from '@/components/elements/button/index';
2022-06-12 19:16:48 +00:00
import { XCircleIcon } from '@heroicons/react/solid';
import useLocationHash from '@/plugins/useLocationHash';
2022-06-12 19:16:48 +00:00
export default () => {
const { hash } = useLocationHash();
2022-06-12 19:16:48 +00:00
const { clearAndAddHttpError } = useFlashKey('server:activity');
const [filters, setFilters] = useState<ActivityLogFilters>({ page: 1, sorts: { timestamp: -1 } });
2022-06-12 19:16:48 +00:00
const { data, isValidating, error } = useActivityLogs(filters, {
revalidateOnMount: true,
revalidateOnFocus: false,
});
useEffect(() => {
2022-11-25 20:25:03 +00:00
setFilters(value => ({ ...value, filters: { ip: hash.ip, event: hash.event } }));
}, [hash]);
2022-06-12 19:16:48 +00:00
useEffect(() => {
clearAndAddHttpError(error);
}, [error]);
2022-06-12 19:16:48 +00:00
return (
<ServerContentBlock title={'Activity Log'}>
<FlashMessageRender byKey={'server:activity'} />
{(filters.filters?.event || filters.filters?.ip) && (
2023-01-12 19:31:47 +00:00
<div className={'mb-2 flex justify-end'}>
2022-06-12 19:16:48 +00:00
<Link
to={'#'}
className={classNames(btnStyles.button, btnStyles.text, 'w-full sm:w-auto')}
2022-11-25 20:25:03 +00:00
onClick={() => setFilters(value => ({ ...value, filters: {} }))}
2022-06-12 19:16:48 +00:00
>
2023-01-12 19:31:47 +00:00
Clear Filters <XCircleIcon className={'ml-2 h-4 w-4'} />
2022-06-12 19:16:48 +00:00
</Link>
</div>
)}
{!data && isValidating ? (
<Spinner centered />
) : !data?.items.length ? (
2023-01-12 19:31:47 +00:00
<p className={'text-center text-sm text-slate-400'}>No activity logs available for this server.</p>
) : (
<div className={'bg-slate-700'}>
2022-11-25 20:25:03 +00:00
{data?.items.map(activity => (
<ActivityLogEntry key={activity.id} activity={activity}>
<span />
</ActivityLogEntry>
))}
</div>
)}
{data && (
<PaginationFooter
pagination={data.pagination}
2022-11-25 20:25:03 +00:00
onPageSelect={page => setFilters(value => ({ ...value, page }))}
/>
)}
2022-06-12 19:16:48 +00:00
</ServerContentBlock>
);
};