Repository navigation
Expand file tree
/
Copy pathuseEvaluate.ts
More file actions
68 lines (60 loc) · 1.88 KB
/
Copy pathuseEvaluate.ts
File metadata and controls
68 lines (60 loc) · 1.88 KB
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
import {
EvaluationError, EvaluationResult, MissingSources,
StartEvaluationRequest
} from "@jsheets/protocol/src/jsheets/api/snippet_runtime_pb";
import Client, {EvaluationListener} from "../client";
import {useDispatch} from "react-redux";
import {useState} from "react";
import {removeOutput, reportOutput} from "./state";
import {SheetSnippetComponentOutput} from "./index";
type UseEvaluate = [(start: StartEvaluationRequest) => void, boolean]
export default function useEvaluate(): UseEvaluate {
const dispatch = useDispatch()
const [evaluating, setEvaluating] = useState(false)
const evaluate = (start: StartEvaluationRequest) => {
const client = Client.create()
setEvaluating(true)
dispatch(removeOutput({}))
client.evaluate(
start,
new Listener({
reportOutput(componentId, output) {
dispatch(reportOutput({componentId, output}))
},
close() {
setEvaluating(false)
}
}
))
}
return [evaluate, evaluating]
}
type ReportOutput = (componentId: string, output: SheetSnippetComponentOutput) => void
class Listener implements EvaluationListener {
constructor(
private readonly callback: { reportOutput: ReportOutput, close: () => void }
) {
}
onEnd(): void {
this.callback.close()
}
onError = (error: EvaluationError) => {
this.callback.reportOutput(error.getComponentId(), {
span: {
start: error.getSpan()?.getStart() || 0,
end: error.getSpan()?.getEnd() || 0
},
code: error.getKind(),
message: error.getMessage()
})
}
onMissingSources(sources: MissingSources): void {
console.log({sources: sources.toObject()})
}
onResult = (result: EvaluationResult) => {
this.callback.reportOutput(result.getComponentId(), {
type: result.getKind() === 1 ? 'info' : 'error',
message: result.getOutput()
})
}
}