blob: b42bf15df47fb792f4ce29fd889279faa46bef1a (
plain)
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
|
import { bind } from 'decko';
import { Component, h } from 'preact';
import { Xterm, XtermOptions } from './xterm';
import '@xterm/xterm/css/xterm.css';
import { Modal } from '../modal';
interface Props extends XtermOptions {
id: string;
}
interface State {
modal: boolean;
}
export class Terminal extends Component<Props, State> {
private container: HTMLElement;
private xterm: Xterm;
constructor(props: Props) {
super();
this.xterm = new Xterm(props, this.showModal);
}
async componentDidMount() {
await this.xterm.refreshToken();
this.xterm.open(this.container);
this.xterm.connect();
}
componentWillUnmount() {
this.xterm.dispose();
}
render({ id }: Props, { modal }: State) {
return (
<div id={id} ref={c => (this.container = c as HTMLElement)}>
<Modal show={modal}>
<label class="file-label">
<input onChange={this.sendFile} class="file-input" type="file" multiple />
<span class="file-cta">Choose files…</span>
</label>
</Modal>
</div>
);
}
@bind
showModal() {
this.setState({ modal: true });
}
@bind
sendFile(event: Event) {
this.setState({ modal: false });
const files = (event.target as HTMLInputElement).files;
if (files) this.xterm.sendFile(files);
}
}
|