diff --git a/ui/src/nav/Nav.tsx b/ui/src/nav/Nav.tsx index 3896caa2..7d4947c1 100644 --- a/ui/src/nav/Nav.tsx +++ b/ui/src/nav/Nav.tsx @@ -28,6 +28,7 @@ import { NotificationsLink } from './notifications/NotificationsLink'; import { Search } from './Search'; import { SystemPreferences } from '../preferences/SystemPreferences'; import { useSystemUpdate } from '../logic/useSystemUpdate'; +import useVereState from '../state/vere'; import { Bullet } from '../components/icons/Bullet'; import { Cross } from '../components/icons/Cross'; import MagnifyingGlass16Icon from '../components/icons/MagnifyingGlass16Icon'; @@ -138,9 +139,12 @@ export const Nav: FunctionComponent = ({ menu }) => { const dialogNavRef = useRef(null); const { disableWayfinding } = useCalm(); const { systemBlocked } = useSystemUpdate(); + const { isLatest, loaded } = useVereState(); const [dialogContentOpen, setDialogContentOpen] = useState(false); const select = useAppSearchStore((state) => state.select); + const runtimeOutOfDate = (loaded && !(isLatest)); + const menuState = menu || 'closed'; const isOpen = menuState !== 'upgrading' && menuState !== 'closed' && menuState !== 'app'; @@ -188,7 +192,7 @@ export const Nav: FunctionComponent = ({ menu }) => { containerRef={dialogContentOpen ? dialogNavRef : navRef} className="flex w-full items-center space-x-2 sm:justify-center" > - + { const hash = basePike && getHash(basePike); const lag = useLag(); + const vere = useVereState.getState(); + const {isLatest, vereVersion, latestVereVersion, loaded} = vere; + + const runtimeUpToDate = (!loaded || isLatest) + return ( <>
@@ -51,6 +57,7 @@ export const AboutSystem = () => {

System update failed because your runtime was out of date.

+

Your runtime version is {vereVersion}, the latest runtime version is {latestVereVersion}.

Update your runtime or contact your hosting provider.

Once your runtime is up to date, click retry below.

diff --git a/ui/src/state/vere.ts b/ui/src/state/vere.ts new file mode 100644 index 00000000..d5b3a086 --- /dev/null +++ b/ui/src/state/vere.ts @@ -0,0 +1,53 @@ +import api from '@/api'; +import create, { SetState } from 'zustand'; +import produce from 'immer'; + +interface Vere { + cur: VereState; + next?: VereState; + set: SetState; + loaded: boolean; + isLatest: boolean; + vereVersion: string; + latestVereVersion: string; +} + +interface VereState { + rev: string; + non?: string; + zuse?: number; + arvo?: number; + lull?: number; + hoon?: number; + nock?: number; +} + +const useVereState = create((set, get) => ({ + loaded: false, + set +})) + +const fetchRuntimeVersion = () => { + api.thread({ + inputMark: 'noun', + outputMark: 'vere-update', + desk: 'base', + threadName: 'runtime-version', + body: '', + }).then((data: Vere) => { + useVereState.setState((state) => { + const vereVersion = data.cur.rev.split('/vere/~.')[1]; + const isLatest = data.next === undefined; + const latestVereVersion = !isLatest ? data.next.rev.split('/vere/~.')[1] : vereVersion + return Object.assign(data, {loaded: true, isLatest, vereVersion, latestVereVersion}); + }) + }); +} + +fetchRuntimeVersion() + +setInterval(fetchRuntimeVersion, 1800000) + +export default useVereState;; + +// window.vere = useVereState.getState;