gitscope
← marzneshin / v0.7.0 / dashboard/src/modules/nodes/dialogs/settings/use-nodes-settings.ts
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/modules/nodes/dialogs/settings/use-nodes-settings.ts · TypeScript
Blame Raw
 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};