From eef17b38ebcf35c85b2e652e51e024024089bf52 Mon Sep 17 00:00:00 2001 From: Sven Czarnian Date: Fri, 4 Nov 2022 14:07:34 +0100 Subject: [PATCH] introduce the time context to get the offset between the server and the local time --- src/contexts/index.ts | 8 +++++- src/contexts/timecontext.tsx | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/contexts/timecontext.tsx diff --git a/src/contexts/index.ts b/src/contexts/index.ts index b61094b..5c622d0 100644 --- a/src/contexts/index.ts +++ b/src/contexts/index.ts @@ -1,3 +1,9 @@ import AuthContext, { AuthProvider } from "./authcontext"; +import TimeContext, { TimeProvider } from "./timecontext"; -export { AuthContext, AuthProvider }; +export { + AuthContext, + AuthProvider, + TimeContext, + TimeProvider +}; diff --git a/src/contexts/timecontext.tsx b/src/contexts/timecontext.tsx new file mode 100644 index 0000000..e28ec00 --- /dev/null +++ b/src/contexts/timecontext.tsx @@ -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>; +}>({ offset: 0, setOffset: () => 0 }); + +export const TimeProvider = ({ children }: { children: any }) => { + const [offset, setOffset] = useState(0); + const navigate = useNavigate(); + + useEffect(() => { + const estimateTimeOffset = async () => { + axios.get(`${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 ( + <> + + {children} + + + ); +}; + +export default TimeContext;