89 lines
3.6 KiB
TypeScript
89 lines
3.6 KiB
TypeScript
|
import * as electronRemote from '@electron/remote';
|
||
|
const electronConsole = electronRemote.getGlobal('console') as Console;
|
||
|
import Logger from '../../../logger/logger';
|
||
|
const LOG = new Logger(__filename, electronConsole);
|
||
|
|
||
|
import * as fs from 'fs/promises';
|
||
|
|
||
|
import Elements from '../elements';
|
||
|
import ElementsUtil from './require/elements-util.js';
|
||
|
|
||
|
import { $, $$, $$$, $$$$ } from './require/q-module';
|
||
|
|
||
|
import IState from './require/elements-state';
|
||
|
import { IAddServerData } from './overlay-add-server';
|
||
|
|
||
|
export default function bindAddServerEvents(state: IState): void {
|
||
|
const { document, ui } = state;
|
||
|
$.setDocument(document);
|
||
|
|
||
|
let choosingFile = false;
|
||
|
$('#add-server').addEventListener('click', async () => {
|
||
|
if (choosingFile) return;
|
||
|
choosingFile = true;
|
||
|
|
||
|
let result = await electronRemote.dialog.showOpenDialog({
|
||
|
title: 'Select Server File',
|
||
|
defaultPath: 'D:\\development\\cordis\\client-server\\server\\data',
|
||
|
properties: [ 'openFile' ],
|
||
|
filters: [
|
||
|
{ name: 'Cordis Server Files', extensions: [ 'cordis' ] }
|
||
|
]
|
||
|
});
|
||
|
|
||
|
if (result.canceled) {
|
||
|
choosingFile = false;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let filePath = result.filePaths[0];
|
||
|
let fileText = (await fs.readFile(filePath)).toString('utf-8'); // TODO: try/catch?
|
||
|
|
||
|
let addServerData: any | null = null;
|
||
|
try {
|
||
|
addServerData = JSON.parse(fileText);
|
||
|
if (
|
||
|
typeof addServerData !== 'object' ||
|
||
|
typeof addServerData?.name !== 'string' ||
|
||
|
typeof addServerData?.url !== 'string' ||
|
||
|
typeof addServerData?.cert !== 'string' ||
|
||
|
typeof addServerData?.token !== 'string' ||
|
||
|
typeof addServerData?.expires !== 'number' ||
|
||
|
typeof addServerData?.iconSrc !== 'string'
|
||
|
) {
|
||
|
LOG.debug('bad server data:', { addServerData, fileText })
|
||
|
throw new Error('bad server data');
|
||
|
}
|
||
|
let overlayElement = Elements.createAddServerOverlay(addServerData as IAddServerData);
|
||
|
document.body.appendChild(overlayElement);
|
||
|
} catch (e) {
|
||
|
LOG.error('Unable to parse server data', e);
|
||
|
let errorOverlayElement = Elements.createErrorMessageOverlay('Unable to parse server file', e.message);
|
||
|
document.body.appendChild(errorOverlayElement);
|
||
|
}
|
||
|
|
||
|
choosingFile = false;
|
||
|
});
|
||
|
|
||
|
let contextElement = $.create({ class: 'context', content: {
|
||
|
class: 'info', content: [
|
||
|
{ ns: 'http://www.w3.org/2000/svg', tag: 'svg', width: 10, height: 20, viewBox: '0 0 8 12', content: [
|
||
|
{ ns: 'http://www.w3.org/2000/svg', tag: 'path', fill: 'currentColor', //'fill-rule': 'evenodd', 'clip-rule': 'evenodd',
|
||
|
d: 'M 0,6 ' +
|
||
|
'L 8,12 ' +
|
||
|
'L 8,0 ' +
|
||
|
'Z' }
|
||
|
] },
|
||
|
{ class: 'content', content: 'Add a Server' }
|
||
|
]
|
||
|
} }) as HTMLElement;
|
||
|
$('#add-server').addEventListener('mouseenter', () => {
|
||
|
document.body.appendChild(contextElement);
|
||
|
ElementsUtil.alignContextElement(contextElement, $('#add-server'), { left: 'right', centerY: 'centerY' })
|
||
|
});
|
||
|
$('#add-server').addEventListener('mouseleave', () => {
|
||
|
if (contextElement.parentElement) {
|
||
|
contextElement.parentElement.removeChild(contextElement);
|
||
|
}
|
||
|
});
|
||
|
}
|