feat: gql revamp (#2644)

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
This commit is contained in:
Anwarul Islam
2023-08-22 18:13:43 +06:00
committed by GitHub
parent 191fa376d2
commit 88212e8cfe
41 changed files with 2503 additions and 1702 deletions

View File

@@ -0,0 +1,58 @@
import { EditorState, Range } from "@codemirror/state"
import { Decoration, ViewPlugin } from "@codemirror/view"
import { syntaxTree } from "@codemirror/language"
function getOperationDefsPosInEditor(state: EditorState) {
const tree = syntaxTree(state)
const defs: Array<{ from: number; to: number }> = []
tree.iterate({
enter({ name, from, to }) {
if (name === "OperationDefinition") {
defs.push({ from, to })
}
},
})
return defs
}
function generateSelectedOpDecors(state: EditorState) {
const selectedPos = state.selection.main.head // Cursor Pos
const defsPositions = getOperationDefsPosInEditor(state)
if (defsPositions.length === 1) return Decoration.none
const decors = defsPositions
.map(({ from, to }) => ({
selected: selectedPos >= from && selectedPos <= to,
from,
to,
}))
.map((info) => ({
...info,
decor: Decoration.mark({
class: info.selected
? "gql-operation-highlight"
: "gql-operation-not-highlight",
inclusive: true,
}),
}))
.map(({ from, to, decor }) => <Range<Decoration>>{ from, to, value: decor }) // Convert to Range<Decoration> (Range from "@codemirror/view")
return Decoration.set(decors)
}
export const selectedGQLOpHighlight = ViewPlugin.define(
(view) => ({
decorations: generateSelectedOpDecors(view.state),
update(u) {
this.decorations = generateSelectedOpDecors(u.state)
},
}),
{
decorations: (v) => v.decorations,
}
)