1import { useEffect, useState } from "react";
2import YAML from "yaml";
3import {
4 type NodeType,
5 NodeBackendSettingConfigFormat,
6 useNodesSettingsMutation,
7 useNodesSettingsQuery,
8} from "../..";
9
10const parseConfig = (data: {
11 config: string;
12 format: NodeBackendSettingConfigFormat;
13}) => {
14 return {
15 [NodeBackendSettingConfigFormat.PLAIN]: () => data.config,
16 [NodeBackendSettingConfigFormat.JSON]: () =>
17 JSON.stringify(JSON.parse(data.config), null, " "),
18 [NodeBackendSettingConfigFormat.YAML]: () =>
19 YAML.stringify(YAML.parse(data.config), null, " "),
20 }[data.format]();
21};
22
23const parseLanguage = (format: NodeBackendSettingConfigFormat) =>
24 ({
25 [NodeBackendSettingConfigFormat.PLAIN]: "text",
26 [NodeBackendSettingConfigFormat.JSON]: "json",
27 [NodeBackendSettingConfigFormat.YAML]: "yaml",
28 })[format];
29
30export const useNodesSettings = (entity: NodeType, backend: string) => {
31 const { data, isFetching } = useNodesSettingsQuery(entity, backend);
32 const [config, setConfig] = useState<string>(data.config);
33 const [payloadValidity, setPayloadValidity] = useState<boolean>(true);
34 const mutate = useNodesSettingsMutation();
35 const language = parseLanguage(data.format);
36
37 useEffect(() => {
38 if (!isFetching) setConfig(parseConfig(data));
39 }, [isFetching, data]);
40
41 const handleEditorValidation = (markers: any[]) => {
42 setPayloadValidity(!markers.length);
43 };
44
45 const handleConfigSave = () => {
46 mutate.mutate({ node: entity, backend, config, format: data.format });
47 };
48
49 const handleConfigChange = (newConfig: string | undefined) => {
50 if (newConfig) {
51 try {
52 setConfig(parseConfig({ config: newConfig, format: data.format }));
53 setPayloadValidity(true);
54 } catch (error) {
55 setPayloadValidity(false);
56 }
57 }
58 };
59
60 return {
61 payloadValidity,
62 language,
63 isFetching,
64 config: parseConfig(data),
65 handleConfigSave,
66 handleConfigChange,
67 handleEditorValidation,
68 };
69};