From d8615932c173f0b76f3e519c78057c958afc9ac3 Mon Sep 17 00:00:00 2001 From: gauravwarale <131575530+gauravwarale@users.noreply.github.com> Date: Mon, 2 Jun 2025 15:05:48 +0530 Subject: [PATCH 1/2] Add Auto refersh feature for jobs, commands and clusters --- web/src/app/layout.tsx | 20 ++++-- .../AutoRefreshProviderContainer.tsx | 9 +++ .../common/AutoRefreshProvider/context.tsx | 63 +++++++++++++++++++ .../AutoRefreshSelect/AutoRefreshSelect.tsx | 46 ++++++++++++++ .../auto-fresh-select.module.scss | 10 +++ web/src/components/Header/Header.tsx | 2 + web/src/modules/Clusters/Clusters.tsx | 4 +- web/src/modules/Commands/Commands.tsx | 3 + web/src/modules/Jobs/Jobs.tsx | 3 + 9 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 web/src/common/AutoRefreshProvider/AutoRefreshProviderContainer.tsx create mode 100644 web/src/common/AutoRefreshProvider/context.tsx create mode 100644 web/src/common/AutoRefreshSelect/AutoRefreshSelect.tsx create mode 100644 web/src/common/AutoRefreshSelect/auto-fresh-select.module.scss diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index 33450b5..53a2551 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -19,6 +19,14 @@ const BreadcrumbProvidercontainer = dynamic( { ssr: false }, ) +const AutoRefreshProvidercontainer = dynamic( + () => + import('../common/AutoRefreshProvider/AutoRefreshProviderContainer').then( + (mod) => mod.AutoRefreshProvidercontainer, + ), + { ssr: false }, +) + export const metadata = { title: 'Heimdall', description: 'Welcome to the Heimdall application', @@ -39,11 +47,13 @@ export default async function RootLayout({
- -
- -
{children}
-
+ + +
+ +
{children}
+
+
diff --git a/web/src/common/AutoRefreshProvider/AutoRefreshProviderContainer.tsx b/web/src/common/AutoRefreshProvider/AutoRefreshProviderContainer.tsx new file mode 100644 index 0000000..9fe588c --- /dev/null +++ b/web/src/common/AutoRefreshProvider/AutoRefreshProviderContainer.tsx @@ -0,0 +1,9 @@ +'use client' + +import { AutoRefreshProvider } from './context' + +export const AutoRefreshProvidercontainer: React.FC<{ + children: React.ReactNode +}> = ({ children }) => { + return {children} +} diff --git a/web/src/common/AutoRefreshProvider/context.tsx b/web/src/common/AutoRefreshProvider/context.tsx new file mode 100644 index 0000000..25640e6 --- /dev/null +++ b/web/src/common/AutoRefreshProvider/context.tsx @@ -0,0 +1,63 @@ +'use client' + +import React, { createContext, useCallback, useEffect, useState } from 'react' + +type RefreshInterval = { + label: string + value: number +} + +type ContextStateType = { + refreshInterval: RefreshInterval + updateRefreshInterval: (interval: RefreshInterval) => void +} + +export const AutoRefreshContext = createContext({ + refreshInterval: { label: 'OFF', value: 0 }, // Default 0 seconds + updateRefreshInterval: () => {}, +}) + +const { Provider } = AutoRefreshContext + +export const AutoRefreshProvider: React.FC<{ children: React.ReactNode }> = ({ + children, +}) => { + const [refreshInterval, setRefreshInterval] = useState( + () => { + if (typeof window !== 'undefined') { + const savedInterval = localStorage.getItem('refreshInterval') + try { + return savedInterval + ? JSON.parse(savedInterval) + : { label: 'OFF', value: 0 } + } catch (error) { + console.error( + 'Error parsing refresh interval from localStorage', + error, + ) + return 0 + } + } + return { label: 'OFF', value: 0 } + }, + ) + + const updateRefreshInterval = useCallback((interval: RefreshInterval) => { + setRefreshInterval(interval) + }, []) + + useEffect(() => { + localStorage.setItem('refreshInterval', JSON.stringify(refreshInterval)) + }, [refreshInterval]) + + return ( + + {children} + + ) +} diff --git a/web/src/common/AutoRefreshSelect/AutoRefreshSelect.tsx b/web/src/common/AutoRefreshSelect/AutoRefreshSelect.tsx new file mode 100644 index 0000000..cd46d59 --- /dev/null +++ b/web/src/common/AutoRefreshSelect/AutoRefreshSelect.tsx @@ -0,0 +1,46 @@ +'use client' + +import { Select } from '@patterninc/react-ui' +import { useContext, useState } from 'react' +import { AutoRefreshContext } from '../AutoRefreshProvider/context' +import styles from './auto-fresh-select.module.scss' + +export type RefreshInterval = { + label: string + value: number +} + +const refreshOptions = [ + { label: 'OFF', value: 0 }, + { label: '5 seconds', value: 5000 }, + { label: '15 seconds', value: 15000 }, + { label: '30 seconds', value: 30000 }, + { label: '1 minute', value: 60000 }, + { label: '5 minutes', value: 300000 }, +] + +export const AutoRefreshSelect = () => { + const { refreshInterval, updateRefreshInterval } = + useContext(AutoRefreshContext) + const [intervalValue, setIntervalValue] = useState( + refreshInterval || { label: 'OFF', value: 0 }, + ) + + return ( +
+ Auto Refresh: +
+