introduce the time context to get the offset between the server and the local time

This commit is contained in:
Sven Czarnian
2022-11-04 14:07:34 +01:00
parent 8e7bb265af
commit eef17b38eb
2 changed files with 56 additions and 1 deletions

View File

@@ -1,3 +1,9 @@
import AuthContext, { AuthProvider } from "./authcontext"; import AuthContext, { AuthProvider } from "./authcontext";
import TimeContext, { TimeProvider } from "./timecontext";
export { AuthContext, AuthProvider }; export {
AuthContext,
AuthProvider,
TimeContext,
TimeProvider
};

View File

@@ -0,0 +1,49 @@
import axios from 'axios';
import React, { Dispatch, SetStateAction, useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { Configuration } from '../services';
const TimeContext = React.createContext<{
offset: number;
setOffset: Dispatch<SetStateAction<number>>;
}>({ offset: 0, setOffset: () => 0 });
export const TimeProvider = ({ children }: { children: any }) => {
const [offset, setOffset] = useState<number>(0);
const navigate = useNavigate();
useEffect(() => {
const estimateTimeOffset = async () => {
axios.get<number>(`${Configuration.resourceServer}/system/timestamp`, {
headers: {
Authorization: `Bearer ${sessionStorage.getItem('token')}`,
},
}).then((response) => {
// calculate the time offset (not accurate) between the server and the client to show "correct" times
const clientTimeUtc = new Date().getTime()
const serverTimeUtc = response.data;
setOffset(serverTimeUtc - clientTimeUtc);
}).catch(() => {
setOffset(0);
navigate('/');
});
}
estimateTimeOffset();
const interval = setInterval(estimateTimeOffset, 30000);
return () => {
clearInterval(interval);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<>
<TimeContext.Provider value={{ offset, setOffset }}>
{children}
</TimeContext.Provider>
</>
);
};
export default TimeContext;