first stab at working ui + lib
This commit is contained in:
parent
c4cd602f51
commit
dbf6168907
File diff suppressed because it is too large
Load Diff
|
@ -2,7 +2,7 @@
|
||||||
"name": "status-x",
|
"name": "status-x",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
|
@ -15,5 +15,10 @@
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/status-im/status-x/issues"
|
"url": "https://github.com/status-im/status-x/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/status-im/status-x#readme"
|
"homepage": "https://github.com/status-im/status-x#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"colors": "^1.3.2",
|
||||||
|
"neo-blessed": "^0.2.0",
|
||||||
|
"status-js-api": "^1.0.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
var UI = require('./ui.js')
|
||||||
|
var StatusJS = require('status-js-api')
|
||||||
|
|
||||||
|
const DEFAULT_CHANNEL = "mytest";
|
||||||
|
|
||||||
|
var ui = new UI();
|
||||||
|
|
||||||
|
let channels = [];
|
||||||
|
ui.availableUsers([{name: "iuri", status: "on"}, {name: "rramos", status: "on"}, {name: "barry", status: "on"}, {name: "satoshi", status: "off"}])
|
||||||
|
|
||||||
|
ui.logEntry(`
|
||||||
|
Welcome to
|
||||||
|
_________ __ __ ____ ___
|
||||||
|
/ _____// |______ _/ |_ __ __ _____\\ \\/ /
|
||||||
|
\\_____ \\\\ __\\__ \\\\ __\\ | \\/ ___/\\ /
|
||||||
|
/ \\| | / __ \\| | | | /\\___ \\ / \\
|
||||||
|
/_______ /|__| (____ /__| |____//____ >___/\\ \\
|
||||||
|
\\/ \\/ \\/ \\_/
|
||||||
|
`)
|
||||||
|
|
||||||
|
ui.logEntry(`Generating Identify....`)
|
||||||
|
ui.logEntry(`Connecting to Peers....`)
|
||||||
|
ui.logEntry(`Rejoining Channels....`)
|
||||||
|
ui.logEntry(`-----------------------------------------------------------`)
|
||||||
|
|
||||||
|
var status = new StatusJS();
|
||||||
|
status.connect("ws://localhost:8546");
|
||||||
|
|
||||||
|
status.joinChat(DEFAULT_CHANNEL, () => {
|
||||||
|
ui.logEntry(("Joined #" + DEFAULT_CHANNEL).green.underline)
|
||||||
|
|
||||||
|
channels.push('#' + DEFAULT_CHANNEL);
|
||||||
|
ui.availableChannels(channels);
|
||||||
|
|
||||||
|
status.onMessage(DEFAULT_CHANNEL, (err, data) => {
|
||||||
|
let msg = JSON.parse(data)[1][0];
|
||||||
|
ui.logEntry(("someone> ").green.underline + msg);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
ui.events.on('cmd', (cmd) => {
|
||||||
|
if (cmd.split(' ')[0] === '/join') {
|
||||||
|
let channelName = cmd.split(' ')[1].replace('#','');
|
||||||
|
ui.logEntry("joining " + channelName)
|
||||||
|
status.joinChat(channelName).then(() => {
|
||||||
|
ui.logEntry("joined #" + channelName)
|
||||||
|
|
||||||
|
channels.push('#' + channelName);
|
||||||
|
ui.availableChannels(channels);
|
||||||
|
})
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
status.sendMessage(DEFAULT_CHANNEL, cmd);
|
||||||
|
})
|
||||||
|
|
|
@ -0,0 +1,259 @@
|
||||||
|
require('colors');
|
||||||
|
const blessed = require("neo-blessed");
|
||||||
|
const Events = require("events");
|
||||||
|
|
||||||
|
class UI {
|
||||||
|
constructor(_options) {
|
||||||
|
let options = _options || {};
|
||||||
|
this.events = new Events();
|
||||||
|
|
||||||
|
this.color = options.color || "green";
|
||||||
|
this.minimal = options.minimal || false;
|
||||||
|
|
||||||
|
this.screen = blessed.screen({
|
||||||
|
smartCSR: true,
|
||||||
|
title: options.title || ("StatusX"),
|
||||||
|
dockBorders: false,
|
||||||
|
fullUnicode: true,
|
||||||
|
autoPadding: true
|
||||||
|
});
|
||||||
|
|
||||||
|
this.layoutLog();
|
||||||
|
this.layoutUsers();
|
||||||
|
this.layoutChannels();
|
||||||
|
this.layoutCmd();
|
||||||
|
|
||||||
|
this.screen.key(["C-c"], function () {
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.logEntry = this.logEntry.bind(this);
|
||||||
|
this.availableUsers = this.availableUsers.bind(this);
|
||||||
|
this.availableChannels = this.availableChannels.bind(this);
|
||||||
|
|
||||||
|
this.screen.render();
|
||||||
|
this.input.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
availableUsers(users) {
|
||||||
|
let stateColors = {
|
||||||
|
'on': 'green',
|
||||||
|
'off': 'grey'
|
||||||
|
};
|
||||||
|
|
||||||
|
let user_list = Object.keys(users).map((user) => {
|
||||||
|
let userObj = users[user];
|
||||||
|
if (userObj.status in stateColors) {
|
||||||
|
let color = stateColors[userObj.status];
|
||||||
|
return userObj.name[color];
|
||||||
|
}
|
||||||
|
return userObj.name;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.users.setContent(user_list.join('\n'));
|
||||||
|
this.screen.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
availableChannels(channels) {
|
||||||
|
this.channels.setContent(channels.join('\n'));
|
||||||
|
this.screen.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
setStatus(status) {
|
||||||
|
this.operations.setContent(status);
|
||||||
|
this.screen.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
logEntry() {
|
||||||
|
this.logText.log(...arguments);
|
||||||
|
this.screen.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutLog() {
|
||||||
|
this.log = blessed.box({
|
||||||
|
label: "Logs",
|
||||||
|
padding: 1,
|
||||||
|
width: "73%",
|
||||||
|
height: "95%",
|
||||||
|
left: "7%",
|
||||||
|
top: "0%",
|
||||||
|
border: {
|
||||||
|
type: "line"
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
fg: -1,
|
||||||
|
border: {
|
||||||
|
fg: this.color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.logText = blessed.log({
|
||||||
|
parent: this.log,
|
||||||
|
tags: true,
|
||||||
|
width: "100%-5",
|
||||||
|
//height: '90%',
|
||||||
|
scrollable: true,
|
||||||
|
input: false,
|
||||||
|
alwaysScroll: true,
|
||||||
|
scrollbar: {
|
||||||
|
ch: " ",
|
||||||
|
inverse: true
|
||||||
|
},
|
||||||
|
keys: false,
|
||||||
|
vi: false,
|
||||||
|
mouse: true
|
||||||
|
});
|
||||||
|
|
||||||
|
this.screen.append(this.log);
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutUsers() {
|
||||||
|
|
||||||
|
this.wrapper = blessed.layout({
|
||||||
|
width: "20%",
|
||||||
|
height: "100%",
|
||||||
|
top: "0%",
|
||||||
|
left: "80%",
|
||||||
|
layout: "grid"
|
||||||
|
});
|
||||||
|
|
||||||
|
this.users = blessed.box({
|
||||||
|
parent: this.wrapper,
|
||||||
|
label: "Users",
|
||||||
|
tags: true,
|
||||||
|
padding: this.minimal ? {
|
||||||
|
left: 1
|
||||||
|
} : 1,
|
||||||
|
width: "100%",
|
||||||
|
height: "95%",
|
||||||
|
valign: "top",
|
||||||
|
border: {
|
||||||
|
type: "line"
|
||||||
|
},
|
||||||
|
scrollable: true,
|
||||||
|
alwaysScroll: true,
|
||||||
|
scrollbar: {
|
||||||
|
ch: " ",
|
||||||
|
inverse: true
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
fg: -1,
|
||||||
|
border: {
|
||||||
|
fg: this.color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.screen.append(this.wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutChannels() {
|
||||||
|
|
||||||
|
this.wrapper = blessed.layout({
|
||||||
|
width: "7%",
|
||||||
|
height: "100%",
|
||||||
|
top: "0%",
|
||||||
|
left: "0%",
|
||||||
|
layout: "grid"
|
||||||
|
});
|
||||||
|
|
||||||
|
this.channels = blessed.box({
|
||||||
|
parent: this.wrapper,
|
||||||
|
label: "Channels",
|
||||||
|
tags: true,
|
||||||
|
padding: this.minimal ? {
|
||||||
|
left: 1
|
||||||
|
} : 1,
|
||||||
|
width: "100%",
|
||||||
|
height: "95%",
|
||||||
|
valign: "top",
|
||||||
|
border: {
|
||||||
|
type: "line"
|
||||||
|
},
|
||||||
|
scrollable: true,
|
||||||
|
alwaysScroll: true,
|
||||||
|
scrollbar: {
|
||||||
|
ch: " ",
|
||||||
|
inverse: true
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
fg: -1,
|
||||||
|
border: {
|
||||||
|
fg: this.color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.screen.append(this.wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layoutCmd() {
|
||||||
|
this.consoleBox = blessed.box({
|
||||||
|
label: 'Messages',
|
||||||
|
tags: true,
|
||||||
|
padding: 0,
|
||||||
|
width: '100%',
|
||||||
|
height: '6%',
|
||||||
|
left: '0%',
|
||||||
|
top: '95%',
|
||||||
|
border: {
|
||||||
|
type: 'line'
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
fg: 'black',
|
||||||
|
border: {
|
||||||
|
fg: this.color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.input = blessed.textbox({
|
||||||
|
parent: this.consoleBox,
|
||||||
|
name: 'input',
|
||||||
|
input: true,
|
||||||
|
keys: false,
|
||||||
|
top: 0,
|
||||||
|
left: 1,
|
||||||
|
height: '50%',
|
||||||
|
width: '100%-2',
|
||||||
|
inputOnFocus: true,
|
||||||
|
style: {
|
||||||
|
fg: 'green',
|
||||||
|
bg: 'black',
|
||||||
|
focus: {
|
||||||
|
bg: 'black',
|
||||||
|
fg: 'green'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let self = this;
|
||||||
|
|
||||||
|
this.input.key(["C-c"], function () {
|
||||||
|
self.events.emit('exit');
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.input.key(["C-w"], function () {
|
||||||
|
self.input.clearValue();
|
||||||
|
self.input.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.input.on('submit', this.submitCmd.bind(this));
|
||||||
|
|
||||||
|
this.screen.append(this.consoleBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
submitCmd(cmd) {
|
||||||
|
if (cmd !== '') {
|
||||||
|
this.events.emit('cmd', cmd);
|
||||||
|
}
|
||||||
|
this.input.clearValue();
|
||||||
|
this.input.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = UI;
|
Loading…
Reference in New Issue