|
@@ -1,21 +1,44 @@
|
|
|
-import React, { ReactElement, useEffect, useRef } from 'react';
|
|
|
-import router from 'next/router';
|
|
|
-import { useSystemStore } from '../../../state/systemStore';
|
|
|
+'use client';
|
|
|
+
|
|
|
+import React, { useRef, useEffect } from 'react';
|
|
|
+import { useAction } from 'next-safe-action/hook';
|
|
|
+import { useInterval } from 'usehooks-ts';
|
|
|
+import { getStatusAction } from '@/actions/settings/get-status';
|
|
|
+import { useSystemStore } from '@/client/state/systemStore';
|
|
|
+import { useRouter } from 'next/navigation';
|
|
|
import { StatusScreen } from '../../StatusScreen';
|
|
|
|
|
|
interface IProps {
|
|
|
- children: ReactElement;
|
|
|
+ children: React.ReactNode;
|
|
|
}
|
|
|
|
|
|
export const StatusProvider: React.FC<IProps> = ({ children }) => {
|
|
|
- const { status, setPollStatus } = useSystemStore();
|
|
|
+ const { status, setStatus, pollStatus, setPollStatus } = useSystemStore();
|
|
|
const s = useRef(status);
|
|
|
|
|
|
+ const router = useRouter();
|
|
|
+
|
|
|
+ const getStatusMutation = useAction(getStatusAction, {
|
|
|
+ onSuccess: (data) => {
|
|
|
+ if (data.success) {
|
|
|
+ setStatus(data.status);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ // Poll status every 5 seconds
|
|
|
+ useInterval(
|
|
|
+ () => {
|
|
|
+ getStatusMutation.execute({ currentStatus: status });
|
|
|
+ },
|
|
|
+ pollStatus ? 2000 : null,
|
|
|
+ );
|
|
|
+
|
|
|
useEffect(() => {
|
|
|
// If previous was not running and current is running, we need to refresh the page
|
|
|
if (status === 'RUNNING' && s.current !== 'RUNNING') {
|
|
|
setPollStatus(false);
|
|
|
- router.reload();
|
|
|
+ router.refresh();
|
|
|
}
|
|
|
if (status === 'RUNNING') {
|
|
|
s.current = 'RUNNING';
|
|
@@ -23,13 +46,9 @@ export const StatusProvider: React.FC<IProps> = ({ children }) => {
|
|
|
if (status === 'RESTARTING') {
|
|
|
s.current = 'RESTARTING';
|
|
|
}
|
|
|
- }, [status, s, setPollStatus]);
|
|
|
-
|
|
|
- if (s.current === 'LOADING') {
|
|
|
- return <StatusScreen title="" subtitle="" />;
|
|
|
- }
|
|
|
+ }, [status, s, router, setPollStatus]);
|
|
|
|
|
|
- if (s.current === 'RESTARTING') {
|
|
|
+ if (status === 'RESTARTING') {
|
|
|
return <StatusScreen title="Your system is restarting..." subtitle="Please do not refresh this page" />;
|
|
|
}
|
|
|
|