Decorations should now work correctly
This commit is contained in:
@@ -39,10 +39,73 @@ const validateWritability = (editor: monaco.editor.IStandaloneCodeEditor) => {
|
||||
}
|
||||
};
|
||||
|
||||
let decorations: string[] | undefined = [];
|
||||
let decorations: { [key: string]: string[] } = {};
|
||||
|
||||
const setMarkers = (monacoE: typeof monaco) => {
|
||||
// Get all the markers that are active at the moment,
|
||||
// Also if same error is there twice, we can show the content
|
||||
// only once (that's why we're using uniqBy)
|
||||
const markers = uniqBy(
|
||||
monacoE.editor
|
||||
.getModelMarkers({})
|
||||
// Filter out the markers that are hooks specific
|
||||
.filter(
|
||||
(marker) =>
|
||||
typeof marker?.code === "string" &&
|
||||
// Take only markers that starts with "hooks-"
|
||||
marker?.code?.includes("hooks-")
|
||||
),
|
||||
"code"
|
||||
);
|
||||
|
||||
// Get the active model (aka active file you're editing)
|
||||
// const model = monacoE.editor?.getModel(
|
||||
// monacoE.Uri.parse(`file:///work/c/${state.files?.[state.active]?.name}`)
|
||||
// );
|
||||
// console.log(state.active);
|
||||
// Add decoration (aka extra hoverMessages) to markers in the
|
||||
// exact same range (location) where the markers are
|
||||
const models = monacoE.editor.getModels();
|
||||
models.forEach((model) => {
|
||||
console.log(decorations);
|
||||
decorations[model.id] = model?.deltaDecorations(
|
||||
decorations?.[model.id] || [],
|
||||
markers
|
||||
.filter((marker) =>
|
||||
marker?.resource.path
|
||||
.split("/")
|
||||
.includes(`${state.files?.[state.active]?.name}`)
|
||||
)
|
||||
.map((marker) => ({
|
||||
range: new monacoE.Range(
|
||||
marker.startLineNumber,
|
||||
marker.startColumn,
|
||||
marker.endLineNumber,
|
||||
marker.endColumn
|
||||
),
|
||||
options: {
|
||||
hoverMessage: {
|
||||
value:
|
||||
// Find the related hover message markdown from the
|
||||
// /xrpl-hooks-docs/xrpl-hooks-docs-files.json file
|
||||
// which was generated from rst files
|
||||
|
||||
(typeof marker.code === "string" &&
|
||||
docs[marker?.code]?.toString()) ||
|
||||
"",
|
||||
supportHtml: true,
|
||||
isTrusted: true,
|
||||
},
|
||||
},
|
||||
}))
|
||||
);
|
||||
});
|
||||
console.log("decorat", decorations);
|
||||
};
|
||||
|
||||
const HooksEditor = () => {
|
||||
const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();
|
||||
const monacoRef = useRef<typeof monaco>();
|
||||
const subscriptionRef = useRef<ReconnectingWebSocket | null>(null);
|
||||
const snap = useSnapshot(state);
|
||||
const router = useRouter();
|
||||
@@ -57,6 +120,11 @@ const HooksEditor = () => {
|
||||
subscriptionRef?.current?.close();
|
||||
};
|
||||
}, []);
|
||||
useEffect(() => {
|
||||
if (monacoRef.current) {
|
||||
setMarkers(monacoRef.current);
|
||||
}
|
||||
}, [snap.active]);
|
||||
return (
|
||||
<Box
|
||||
css={{
|
||||
@@ -70,6 +138,7 @@ const HooksEditor = () => {
|
||||
}}
|
||||
>
|
||||
<EditorNavigation />
|
||||
{console.log(snap)}
|
||||
{snap.files.length > 0 && router.isReady ? (
|
||||
<Editor
|
||||
className="hooks-editor"
|
||||
@@ -79,6 +148,7 @@ const HooksEditor = () => {
|
||||
path={`file:///work/c/${snap.files?.[snap.active]?.name}`}
|
||||
defaultValue={snap.files?.[snap.active]?.content}
|
||||
beforeMount={(monaco) => {
|
||||
console.log(monaco.languages.getLanguages());
|
||||
if (!snap.editorCtx) {
|
||||
snap.files.forEach((file) =>
|
||||
monaco.editor.createModel(
|
||||
@@ -138,6 +208,7 @@ const HooksEditor = () => {
|
||||
}}
|
||||
onMount={(editor, monaco) => {
|
||||
editorRef.current = editor;
|
||||
monacoRef.current = monaco;
|
||||
editor.updateOptions({
|
||||
glyphMargin: true,
|
||||
lightbulb: {
|
||||
@@ -154,61 +225,9 @@ const HooksEditor = () => {
|
||||
// Lets improve the markers by adding extra content to them from related
|
||||
// md files
|
||||
monaco.editor.onDidChangeMarkers(() => {
|
||||
// Get all the markers that are active at the moment,
|
||||
// Also if same error is there twice, we can show the content
|
||||
// only once (that's why we're using uniqBy)
|
||||
const markers = uniqBy(
|
||||
monaco.editor
|
||||
.getModelMarkers({})
|
||||
// Filter out the markers that are hooks specific
|
||||
.filter(
|
||||
(marker) =>
|
||||
typeof marker?.code === "string" &&
|
||||
// Take only markers that starts with "hooks-"
|
||||
marker?.code?.includes("hooks-") &&
|
||||
// Filter also markers that are related to active model
|
||||
// We don't want to show markers from other files
|
||||
marker?.resource.path
|
||||
.split("/")
|
||||
.includes(`${state.files?.[state.active]?.name}`)
|
||||
),
|
||||
"code"
|
||||
);
|
||||
|
||||
// Get the active model (aka active file you're editing)
|
||||
const model = monaco.editor?.getModel(
|
||||
monaco.Uri.parse(
|
||||
`file:///work/c/${state.files?.[state.active]?.name}`
|
||||
)
|
||||
);
|
||||
// Add decoration (aka extra hoverMessages) to markers in the
|
||||
// exact same range (location) where the markers are
|
||||
|
||||
decorations = model?.deltaDecorations(
|
||||
decorations || [],
|
||||
markers.map((marker) => ({
|
||||
range: new monaco.Range(
|
||||
marker.startLineNumber,
|
||||
marker.startColumn,
|
||||
marker.endLineNumber,
|
||||
marker.endColumn
|
||||
),
|
||||
options: {
|
||||
hoverMessage: {
|
||||
value:
|
||||
// Find the related hover message markdown from the
|
||||
// /xrpl-hooks-docs/xrpl-hooks-docs-files.json file
|
||||
// which was generated from rst files
|
||||
|
||||
(typeof marker.code === "string" &&
|
||||
docs[marker?.code]?.toString()) ||
|
||||
"",
|
||||
supportHtml: true,
|
||||
isTrusted: true,
|
||||
},
|
||||
},
|
||||
}))
|
||||
);
|
||||
if (monacoRef.current) {
|
||||
setMarkers(monacoRef.current);
|
||||
}
|
||||
});
|
||||
|
||||
validateWritability(editor);
|
||||
|
||||
Reference in New Issue
Block a user