prometheus
59 строк · 1.7 Кб
1import React, { FC, ComponentType } from 'react';
2import { Progress, Alert } from 'reactstrap';
3
4import { useFetchReadyInterval } from '../hooks/useFetch';
5import { WALReplayData } from '../types/types';
6import { usePathPrefix } from '../contexts/PathPrefixContext';
7import { useReady } from '../contexts/ReadyContext';
8
9interface StartingContentProps {
10isUnexpected: boolean;
11status?: WALReplayData;
12}
13
14export const StartingContent: FC<StartingContentProps> = ({ status, isUnexpected }) => {
15if (isUnexpected) {
16return (
17<Alert color="danger">
18<strong>Error:</strong> Server is not responding
19</Alert>
20);
21}
22
23return (
24<div className="text-center m-3">
25<div className="m-4">
26<h2>Starting up...</h2>
27{status && status.max > 0 ? (
28<div>
29<p>
30Replaying WAL ({status.current}/{status.max})
31</p>
32<Progress
33animated
34value={status.current - status.min + 1}
35min={status.min}
36max={status.max - status.min + 1}
37color={status.max === status.current ? 'success' : undefined}
38style={{ width: '10%', margin: 'auto' }}
39/>
40</div>
41) : null}
42</div>
43</div>
44);
45};
46
47export const withStartingIndicator =
48<T extends Record<string, unknown>>(Page: ComponentType<T>): FC<T> =>
49({ ...rest }) => {
50const pathPrefix = usePathPrefix();
51const { ready, walReplayStatus, isUnexpected } = useFetchReadyInterval(pathPrefix);
52const staticReady = useReady();
53
54if (staticReady || ready) {
55return <Page {...(rest as T)} />;
56}
57
58return <StartingContent isUnexpected={isUnexpected} status={walReplayStatus.data} />;
59};
60