2023-02-16 22:18:27 +08:00
|
|
|
import 'codemirror/lib/codemirror.css';
|
|
|
|
import './style.css';
|
|
|
|
import 'codemirror/mode/toml/toml.js';
|
|
|
|
import CodeMirror from 'codemirror';
|
|
|
|
|
2023-02-12 00:48:38 +08:00
|
|
|
const { event, fs, path, tauri } = window.__TAURI__;
|
|
|
|
|
|
|
|
class View {
|
|
|
|
constructor() {
|
|
|
|
Object.assign(this, {
|
|
|
|
content: '',
|
|
|
|
action_time: 0,
|
|
|
|
is_auto_scroll: true,
|
|
|
|
is_edit_mode: false,
|
|
|
|
is_file_changed: false,
|
|
|
|
is_form_changed: false,
|
|
|
|
is_content_changed: false
|
|
|
|
}, ...arguments);
|
|
|
|
addEventListener('DOMContentLoaded', this.init.bind(this));
|
|
|
|
}
|
|
|
|
async init() {
|
|
|
|
this.editor = this.renderEditor();
|
|
|
|
this.editor.on('scroll', this.editorScroll.bind(this));
|
|
|
|
this.editor.on('keypress', this.editorSave.bind(this));
|
|
|
|
this.form = this.renderForm();
|
|
|
|
this.form.addEventListener('change', this.formChange.bind(this));
|
|
|
|
event.listen('__update__', this.appAction.bind(this));
|
|
|
|
event.emit('__action__', '__init__');
|
|
|
|
while (true) {
|
2023-02-16 13:39:08 +08:00
|
|
|
let now = Date.now();
|
2023-02-12 00:48:38 +08:00
|
|
|
try {
|
|
|
|
await this.update();
|
|
|
|
this.render();
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
2023-02-16 13:39:08 +08:00
|
|
|
await new Promise(r => setTimeout(r, Math.max(0, 33 - (Date.now() - now))));
|
2023-02-12 00:48:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
async update() {
|
|
|
|
if (this.is_file_changed) {
|
|
|
|
this.is_file_changed = false;
|
|
|
|
let now = Date.now(),
|
|
|
|
file = await path.resolveResource(this.file);
|
|
|
|
if (await fs.exists(file)) {
|
|
|
|
let content = await fs.readTextFile(file);
|
|
|
|
if (this.action_time < now) {
|
|
|
|
this.content = content;
|
|
|
|
this.is_content_changed = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (now >= this.action_time) {
|
|
|
|
if (this.is_edit_mode) {
|
|
|
|
this.content = `# https://github.com/rustdesk/rustdesk-server#env-variables
|
|
|
|
RUST_LOG=info
|
|
|
|
`;
|
|
|
|
}
|
|
|
|
this.is_content_changed = true;
|
|
|
|
}
|
|
|
|
console.warn(`${this.file} file is missing`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async editorSave(editor, e) {
|
|
|
|
if (e.ctrlKey && e.keyCode === 19 && this.is_edit_mode && !this.locked) {
|
|
|
|
this.locked = true;
|
|
|
|
try {
|
|
|
|
let now = Date.now(),
|
|
|
|
content = this.editor.doc.getValue(),
|
|
|
|
file = await path.resolveResource(this.file);
|
|
|
|
await fs.writeTextFile(file, content);
|
|
|
|
event.emit('__action__', 'restart');
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
} finally {
|
|
|
|
this.locked = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
editorScroll(e) {
|
|
|
|
let info = this.editor.getScrollInfo(),
|
|
|
|
distance = info.height - info.top - info.clientHeight,
|
|
|
|
is_end = distance < 1;
|
|
|
|
if (this.is_auto_scroll !== is_end) {
|
|
|
|
this.is_auto_scroll = is_end;
|
|
|
|
this.is_form_changed = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
formChange(e) {
|
|
|
|
switch (e.target.tagName.toLowerCase()) {
|
|
|
|
case 'input':
|
|
|
|
this.is_auto_scroll = e.target.checked;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
appAction(e) {
|
|
|
|
let [action, data] = e.payload;
|
|
|
|
switch (action) {
|
|
|
|
case 'file':
|
|
|
|
if (data === '.env') {
|
|
|
|
this.is_edit_mode = true;
|
|
|
|
this.file = `bin/${data}`;
|
|
|
|
} else {
|
|
|
|
this.is_edit_mode = false;
|
|
|
|
this.file = `logs/${data}`;
|
|
|
|
}
|
|
|
|
this.action_time = Date.now();
|
|
|
|
this.is_file_changed = true;
|
|
|
|
this.is_form_changed = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
render() {
|
|
|
|
if (this.is_form_changed) {
|
|
|
|
this.is_form_changed = false;
|
|
|
|
this.renderForm();
|
|
|
|
}
|
|
|
|
if (this.is_content_changed) {
|
|
|
|
this.is_content_changed = false;
|
|
|
|
this.renderEditor();
|
|
|
|
}
|
|
|
|
if (this.is_auto_scroll && !this.is_edit_mode) {
|
|
|
|
this.renderScrollbar();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
renderForm() {
|
|
|
|
let form = this.form || document.querySelector('form'),
|
|
|
|
label = form.querySelectorAll('label'),
|
|
|
|
input = form.querySelector('input');
|
|
|
|
input.checked = this.is_auto_scroll;
|
|
|
|
if (this.is_edit_mode) {
|
|
|
|
label[0].style.display = 'none';
|
2023-02-16 22:18:27 +08:00
|
|
|
label[1].style.display = 'block';
|
2023-02-12 00:48:38 +08:00
|
|
|
} else {
|
2023-02-16 22:18:27 +08:00
|
|
|
label[0].style.display = 'block';
|
2023-02-12 00:48:38 +08:00
|
|
|
label[1].style.display = 'none';
|
|
|
|
}
|
|
|
|
return form;
|
|
|
|
}
|
|
|
|
renderEditor() {
|
|
|
|
let editor = this.editor || CodeMirror.fromTextArea(document.querySelector('textarea'), {
|
|
|
|
mode: { name: 'toml' },
|
|
|
|
lineNumbers: true,
|
|
|
|
autofocus: true
|
|
|
|
});
|
|
|
|
editor.setOption('readOnly', !this.is_edit_mode);
|
|
|
|
editor.doc.setValue(this.content);
|
|
|
|
editor.doc.clearHistory();
|
|
|
|
this.content = '';
|
|
|
|
editor.focus();
|
|
|
|
return editor;
|
|
|
|
}
|
|
|
|
renderScrollbar() {
|
|
|
|
let info = this.editor.getScrollInfo();
|
|
|
|
this.editor.scrollTo(info.left, info.height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
new View();
|