103 lines
4.9 KiB
TypeScript
103 lines
4.9 KiB
TypeScript
import type { ReactNode } from 'react';
|
|
import { useEffect, useState } from 'react';
|
|
import tw from 'twin.macro';
|
|
|
|
import type { VersionData } from '@/api/admin/getVersion';
|
|
import getVersion from '@/api/admin/getVersion';
|
|
import AdminContentBlock from '@/components/admin/AdminContentBlock';
|
|
import FlashMessageRender from '@/components/FlashMessageRender';
|
|
import Spinner from '@/components/elements/Spinner';
|
|
import useFlash from '@/plugins/useFlash';
|
|
|
|
const Code = ({ children }: { children: ReactNode }) => {
|
|
return (
|
|
<code css={tw`text-sm font-mono bg-neutral-900 rounded`} style={{ padding: '2px 6px' }}>
|
|
{children}
|
|
</code>
|
|
);
|
|
};
|
|
|
|
export default () => {
|
|
const { clearFlashes, clearAndAddHttpError } = useFlash();
|
|
const [loading, setLoading] = useState<boolean>(true);
|
|
const [versionData, setVersionData] = useState<VersionData | undefined>(undefined);
|
|
|
|
useEffect(() => {
|
|
clearFlashes('overview');
|
|
|
|
getVersion()
|
|
.then(versionData => setVersionData(versionData))
|
|
.catch(error => {
|
|
console.error(error);
|
|
clearAndAddHttpError({ key: 'overview', error });
|
|
})
|
|
.then(() => setLoading(false));
|
|
}, []);
|
|
|
|
return (
|
|
<AdminContentBlock title={'Overview'}>
|
|
<div css={tw`w-full flex flex-row items-center mb-8`}>
|
|
<div css={tw`flex flex-col flex-shrink`} style={{ minWidth: '0' }}>
|
|
<h2 css={tw`text-2xl text-neutral-50 font-header font-medium`}>Overview</h2>
|
|
<p css={tw`text-base text-neutral-400 whitespace-nowrap overflow-ellipsis overflow-hidden`}>
|
|
A quick glance at your system.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<FlashMessageRender byKey={'overview'} css={tw`mb-4`} />
|
|
|
|
<div css={tw`flex flex-col w-full rounded-lg shadow-md bg-neutral-700`}>
|
|
{loading ? (
|
|
<div css={tw`w-full flex flex-col items-center justify-center`} style={{ height: '16rem' }}>
|
|
<Spinner size={'base'} />
|
|
</div>
|
|
) : (
|
|
<div css={tw`rounded shadow-md bg-neutral-700`}>
|
|
<div css={tw`bg-neutral-900 rounded-t border-b border-black px-4 py-3`}>
|
|
<p css={tw`text-sm uppercase`}>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
css={tw`inline-block mr-2`}
|
|
style={{ height: '1rem' }}
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth={2}
|
|
d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"
|
|
/>
|
|
</svg>
|
|
System Information
|
|
</p>
|
|
</div>
|
|
|
|
<div css={tw`px-4 py-4`}>
|
|
{versionData?.panel.current === 'canary' ? (
|
|
<p css={tw`text-neutral-200`}>
|
|
I hope you enjoy living on the edge because you are running a{' '}
|
|
<Code>{versionData?.panel.current}</Code> version of Pterodactyl.
|
|
</p>
|
|
) : versionData?.panel.latest === versionData?.panel.current ? (
|
|
<p css={tw`text-neutral-200`}>
|
|
Your panel is <span css={tw`text-neutral-100`}>up-to-date</span>. The latest version
|
|
is <Code>{versionData?.panel.latest}</Code> and you are running version{' '}
|
|
<Code>{versionData?.panel.current}</Code>.
|
|
</p>
|
|
) : (
|
|
<p css={tw`text-neutral-200`}>
|
|
Your panel is <span css={tw`text-neutral-100`}>not up-to-date</span>. The latest
|
|
version is <Code>{versionData?.panel.latest}</Code> and you are running version{' '}
|
|
<Code>{versionData?.panel.current}</Code>.
|
|
</p>
|
|
)}
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</AdminContentBlock>
|
|
);
|
|
};
|