You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lean4game/client/src/components/Infoview.tsx

75 lines
2.4 KiB
TypeScript

import * as React from 'react';
import { useEffect, useState, useRef } from 'react';
import { EditorApi } from '@leanprover/infoview-api'
import { LeanClient } from 'lean4web/client/src/editor/leanclient';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
import * as ls from 'vscode-languageserver-protocol'
import TacticState from './TacticState';
// TODO: move into Lean 4 web
function toLanguageServerPosition (pos: monaco.Position): ls.Position {
return {line : pos.lineNumber - 1, character: pos.column - 1}
}
function Infoview({ editor, editorApi, leanClient } : {editor: monaco.editor.IStandaloneCodeEditor, editorApi: EditorApi, leanClient: LeanClient}) {
const [rpcSession, setRpcSession] = useState<string>()
const [goals, setGoals] = useState<any[]>(null)
const [uri, setUri] = useState<string>()
console.log(rpcSession)
const fetchInteractiveGoals = () => {
console.log(rpcSession)
if (editor && rpcSession) {
const pos = toLanguageServerPosition(editor.getPosition())
leanClient.sendRequest("$/lean/rpc/call", {"method":"Game.getGoals",
"params":{"textDocument":{uri}, "position": pos},
"sessionId":rpcSession,
"textDocument":{uri},
"position": pos
}).then((res) => {
setGoals(res ? res.goals : null)
console.log(goals)
}).catch((err) => {
console.error(err)
})
}
}
useEffect(() => {
if (editor) {
const t = editor.onDidChangeModel((ev) => {
if (ev.newModelUrl) {
setRpcSession(undefined)
setUri(ev.newModelUrl.toString())
editorApi.createRpcSession(ev.newModelUrl.toString()).then((rpcSession) => {
setRpcSession(rpcSession)
fetchInteractiveGoals()
})
}
})
return () => {t.dispose()}
}
}, [editor, rpcSession]);
useEffect(() => {
if (editor) {
const t = editor.onDidChangeCursorPosition(async (ev) => {
fetchInteractiveGoals()
})
return () => { t.dispose() }
}
}, [editor, rpcSession])
useEffect(() => {
const t = leanClient.didChange(async (ev) => {
fetchInteractiveGoals()
})
return () => { t.dispose() }
}, [editor, leanClient, rpcSession])
return (<div>
<TacticState goals={goals} errors={[]} completed={goals?.length === 0}></TacticState>
</div>)
}
export default Infoview