diff --git a/app/renderer/css/preference.css b/app/renderer/css/preference.css index 86168fba..31a34ffb 100644 --- a/app/renderer/css/preference.css +++ b/app/renderer/css/preference.css @@ -55,6 +55,7 @@ html, body { width: 100%; display: flex; padding: 30px; + overflow-y: scroll; } .server-info-container { @@ -103,6 +104,7 @@ img.server-info-icon { border-bottom: #ddd 1px solid; outline-width: 0; background: transparent; + max-width: 500px; } .server-info-value:focus { @@ -115,6 +117,7 @@ img.server-info-icon { color: #235d3a; vertical-align: middle; margin: 10px 0; + flex-wrap: wrap; } .action { @@ -146,10 +149,14 @@ img.server-info-icon { .server-info.active { background: #ecf4ef; - padding: 20px; } .server-info { display: flex; - margin: 20px 0; + padding: 10px; + margin: 10px 0 10px 0; +} + +.hidden { + display: none; } \ No newline at end of file diff --git a/app/renderer/js/main.js b/app/renderer/js/main.js index a2c412d4..56fd964d 100644 --- a/app/renderer/js/main.js +++ b/app/renderer/js/main.js @@ -82,7 +82,7 @@ class ServerManagerView { const $webView = document.getElementById(`webview-${index}`); this.isLoading = false; $webView.classList.remove('loading'); - // $webView.openDevTools(); + $webView.openDevTools(); } initActions() { diff --git a/app/renderer/js/preference.js b/app/renderer/js/preference.js index 37aed47c..35e40d61 100644 --- a/app/renderer/js/preference.js +++ b/app/renderer/js/preference.js @@ -6,22 +6,25 @@ class PreferenceView { constructor() { this.$newServerButton = document.getElementById('new-server-action'); this.$saveServerButton = document.getElementById('save-server-action'); - this.$serverInfoContainer = document.querySelector('.server-info-container'); + this.$serverInfoContainer = document.querySelector('.server-info-container'); } init() { this.domainUtil = new DomainUtil(); this.initServers(); + this.initActions(); } initServers() { + this.$serverInfoContainer.innerHTML = ''; + this.initNewServerForm(); const servers = this.domainUtil.getDomains(); - for (let server of servers) { - this.initServer(server); + for (let i in servers) { + this.initServer(servers[i], i); } } - initServer(server) { + initServer(server, index) { const { alias, url, @@ -35,21 +38,86 @@ class PreferenceView {
Name - +
Url - +
Icon - + +
+
+ Actions +
+ indeterminate_check_box + Delete +
`; this.$serverInfoContainer.appendChild(this.__insert_node(serverInfoTemplate)); + document.getElementById(`delete-server-action-${index}`).addEventListener('click', () => { + this.domainUtil.removeDomain(index); + this.initServers(); + }); } + initNewServerForm() { + const newServerFormTemplate = ` + + `; + this.$serverInfoContainer.appendChild(this.__insert_node(newServerFormTemplate)); + + this.$newServerForm = document.querySelector('.server-info.active'); + this.$newServerAlias = this.$newServerForm.querySelectorAll('input.server-info-value')[0]; + this.$newServerUrl = this.$newServerForm.querySelectorAll('input.server-info-value')[1]; + this.$newServerIcon = this.$newServerForm.querySelectorAll('input.server-info-value')[2]; + } + + initActions() { + this.$newServerButton.addEventListener('click', () => { + this.$newServerForm.classList.remove('hidden'); + this.$saveServerButton.classList.remove('hidden'); + this.$newServerButton.classList.add('hidden'); + }); + this.$saveServerButton.addEventListener('click', () => { + this.domainUtil.checkDomain(this.$newServerUrl.value).then((domain) => { + const server = { + alias: this.$newServerAlias.value, + url: domain, + icon: this.$newServerIcon.value + }; + this.domainUtil.addDomain(server); + this.$saveServerButton.classList.add('hidden'); + this.$newServerButton.classList.remove('hidden'); + this.$newServerForm.classList.add('hidden'); + + this.initServers(); + }, (errorMessage) => { + alert(errorMessage); + }); + }); + } __insert_node(html) { let wrapper= document.createElement('div'); wrapper.innerHTML= html; diff --git a/app/renderer/js/utils/domain-util.js b/app/renderer/js/utils/domain-util.js index fa3d3c54..f98d75cc 100644 --- a/app/renderer/js/utils/domain-util.js +++ b/app/renderer/js/utils/domain-util.js @@ -2,6 +2,7 @@ const {app} = require('electron').remote; const JsonDB = require('node-json-db'); +const request = require('request'); class DomainUtil { constructor() { @@ -12,18 +13,37 @@ class DomainUtil { return this.db.getData('/domains'); } - addDomain() { - const servers = { - url: 'https://chat.zulip.org', - alias: 'Zulip 2333', - icon: 'https://chat.zulip.org/static/images/logo/zulip-icon-128x128.271d0f6a0ca2.png' - } + addDomain(server) { + server.icon = server.icon || 'https://chat.zulip.org/static/images/logo/zulip-icon-128x128.271d0f6a0ca2.png'; this.db.push("/domains[]", servers, true); } removeDomains() { this.db.delete("/domains"); } + + removeDomain(index) { + this.db.delete(`/domains[${index}]`); + } + + checkDomain(domain) { + const hasPrefix = (domain.indexOf('http') == 0); + if (!hasPrefix) { + domain = (domain.indexOf('localhost:') >= 0)? `http://${domain}` : `https://${domain}`; + } + + const checkDomain = domain + '/static/audio/zulip.ogg'; + + return new Promise((res, rej) => { + request(checkDomain, (error, response) => { + if (!error && response.statusCode !== 404) { + res(domain); + } else { + rej('Not a valid Zulip server'); + } + }); + }) + } } module.exports = DomainUtil; \ No newline at end of file diff --git a/app/renderer/preference.html b/app/renderer/preference.html index 03226fa7..1a1f61e3 100644 --- a/app/renderer/preference.html +++ b/app/renderer/preference.html @@ -25,7 +25,7 @@ add_box New Server -
+