From e82da2375d3284db107e7c32cc9577cc533d1801 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Sat, 18 May 2024 17:37:26 +0100 Subject: [PATCH] Add useInstanceConfig hook Currently the web interface implements configs by pulling the state directly in the components where they are used. I need to access the instance config for a plugin, which would require me to duplicate parts of the instance config retrival code. Instead, I implement it here under lib. This allows 3rd party consumers to get immediate access if we decide to implement a subscription model for configs in the future. --- packages/web_ui/src/model/instance.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/web_ui/src/model/instance.ts b/packages/web_ui/src/model/instance.ts index 41bb8b99..444e794b 100644 --- a/packages/web_ui/src/model/instance.ts +++ b/packages/web_ui/src/model/instance.ts @@ -1,4 +1,6 @@ -import { useCallback, useContext, useSyncExternalStore } from "react"; +import { useCallback, useContext, useEffect, useState, useSyncExternalStore } from "react"; +import { Static } from "@sinclair/typebox"; +import { Config, InstanceConfigGetRequest } from "@clusterio/lib"; import ControlContext from "../components/ControlContext"; export function useInstance(id?: number) { @@ -11,3 +13,17 @@ export function useInstances() { const subscribe = useCallback((callback: () => void) => control.instances.subscribe(callback), [control]); return useSyncExternalStore(subscribe, () => control.instances.getSnapshot()); } + +export function useInstanceConfig(id?: number) { + let control = useContext(ControlContext); + const [config, setConfig] = useState(undefined as undefined | Static); + + useEffect(() => { + if (id) { + control.send(new InstanceConfigGetRequest(id)) + .then(conf => setConfig(conf)); + } + }, [id]); + + return config; +};