-
Notifications
You must be signed in to change notification settings - Fork 8.3k
/
use_json_editor_model.ts
71 lines (57 loc) · 2.14 KB
/
use_json_editor_model.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { useEffect, useMemo, useState } from 'react';
import { monaco } from '@kbn/monaco';
import { createInitializedObject } from '../utils/create_initialized_object';
import { safeJsonParse } from '../utils/safe_json_parse';
import { useFunctions } from './use_functions';
const { editor, languages, Uri } = monaco;
export const useJsonEditorModel = ({
functionName,
initialJson,
}: {
functionName: string | undefined;
initialJson?: string | undefined;
}) => {
const functions = useFunctions();
const functionDefinition = functions.find((func) => func.name === functionName);
const [initialJsonValue, setInitialJsonValue] = useState<string | undefined>(initialJson);
const SCHEMA_URI = `http://elastic.co/${functionName}.json`;
const modelUri = useMemo(() => Uri.parse(SCHEMA_URI), [SCHEMA_URI]);
useEffect(() => {
setInitialJsonValue(initialJson);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [functionName]);
return useMemo(() => {
if (!functionDefinition || !modelUri) {
return {};
}
const schema = { ...functionDefinition.parameters };
const initialJsonString = initialJsonValue
? JSON.stringify(safeJsonParse(initialJsonValue), null, 4) // prettify the json
: functionDefinition.parameters.properties
? JSON.stringify(createInitializedObject(functionDefinition.parameters), null, 4)
: '';
languages.json.jsonDefaults.setDiagnosticsOptions({
validate: true,
schemas: [
{
uri: SCHEMA_URI,
fileMatch: [String(modelUri)],
schema,
},
],
});
let model = editor.getModel(modelUri);
if (model === null) {
model = editor.createModel(initialJsonString, 'json', modelUri);
} else {
model.setValue(initialJsonString);
}
return { model, initialJsonString };
}, [SCHEMA_URI, functionDefinition, initialJsonValue, modelUri]);
};