faster display of dynamic list (plugins, monitor)

Massimo Melina committed Apr 12, 2022 at 20:58 UTC de85d4da8954712b802c48695d630ca169674133
3 files changed +10 -2
admin/src/PluginsPage.ts
+2 -1
@@ -6,11 +6,12 @@ import { IconBtn } from './misc'
6 import { PowerSettingsNew } from '@mui/icons-material'
7
8 export default function PluginsPage() {
9 - const { list, error } = useApiList('get_plugins')
9 + const { list, error, initializing } = useApiList('get_plugins')
10 if (error)
11 return h(Alert, { severity: 'error' }, error)
12 return h(DataGrid, {
13 rows: list,
14 + loading: initializing,
15 disableColumnSelector: true,
16 disableColumnMenu: true,
17 columns: [
admin/src/api.ts
+7 -1
@@ -108,6 +108,7 @@ export function useApiList<T=any>(cmd:string|Falsy, params: Dict={}, { addId=fal
108 const [list, setList] = useStateMounted<T[]>([])
109 const [error, setError] = useStateMounted<any>(undefined)
110 const [loading, setLoading] = useStateMounted(false)
111 + const [initializing, setInitializing] = useStateMounted(true)
112 const idRef = useRef(0)
113 useEffect(() => {
114 if (!cmd) return
@@ -131,6 +132,11 @@ export function useApiList<T=any>(cmd:string|Falsy, params: Dict={}, { addId=fal
132 case 'msg':
133 if (src?.readyState === src?.CLOSED)
134 return stop()
135 + if (data === 'init') {
136 + flush()
137 + setInitializing(false)
138 + return
139 + }
140 if (data.add) {
141 const rec = map(data.add)
142 if (addId)
@@ -181,5 +187,5 @@ export function useApiList<T=any>(cmd:string|Falsy, params: Dict={}, { addId=fal
187 clearInterval(timer)
188 }
189 }, [cmd, JSON.stringify(params)]) //eslint-disable-line
184 - return { list, loading, error }
190 + return { list, loading, error, initializing }
191 }
server/src/adminApis.ts
+1
@@ -187,6 +187,7 @@ function sendList<T>(addAtStart: T[]=[]) {
187 }
188 for (const x of addAtStart)
189 ret.add(x)
190 + stream.push('init')
191 return ret
192 }
193