import ko from 'ko'; import { pString } from 'Common/Utils'; import { KeyState } from 'Common/Enums'; import { popup, command } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; @popup({ name: 'View/Popup/MessageOpenPgp', templateID: 'PopupsMessageOpenPgp' }) class MessageOpenPgpPopupView extends AbstractViewNext { constructor() { super(); this.notification = ko.observable(''); this.selectedKey = ko.observable(null); this.privateKeys = ko.observableArray([]); this.password = ko.observable(''); this.resultCallback = null; this.submitRequest = ko.observable(false); this.sDefaultKeyScope = KeyState.PopupMessageOpenPGP; } @command((self) => !self.submitRequest()) doCommand() { this.submitRequest(true); setTimeout(() => { let privateKey = null; try { if (this.resultCallback && this.selectedKey()) { const privateKeys = this.selectedKey().getNativeKeys(); privateKey = privateKeys && privateKeys[0] ? privateKeys[0] : null; if (privateKey) { try { if (!privateKey.decrypt(pString(this.password()))) { console.log('Error: Private key cannot be decrypted'); privateKey = null; } } catch (e) { console.log(e); privateKey = null; } } else { console.log('Error: Private key cannot be found'); } } } catch (e) { console.log(e); privateKey = null; } this.submitRequest(false); this.cancelCommand(); this.resultCallback(privateKey); }, 100); } clearPopup() { this.notification(''); this.password(''); this.selectedKey(false); this.submitRequest(false); this.resultCallback = null; this.privateKeys([]); } onBuild(oDom) { key('tab,shift+tab', KeyState.PopupMessageOpenPGP, () => { let btn = this.querySelector('.inputPassword'); if (btn.matches(':focus')) { btn = this.querySelector('.buttonDo'); } btn.focus(); return false; }); const self = this; oDom.addEventListener('click', event => { const el = event.target.closestWithin('.key-list__item', oDom); if (el) { oDom.querySelectorAll('.key-list__item .key-list__item__radio').forEach(node => { node.classList.toggle('icon-radio-unchecked', el !== node); node.classList.toggle('icon-radio-checked', el === node); }); self.selectedKey(ko.dataFor(el)); // eslint-disable-line no-invalid-this // this.querySelector('.inputPassword').focus(); } }); } onHideWithDelay() { this.clearPopup(); } onShow(fCallback, privateKeys) { this.clearPopup(); this.resultCallback = fCallback; this.privateKeys(privateKeys); if (this.viewModelDom) { const el = this.viewModelDom.querySelector('.key-list__item'); el && el.click(); } } } export { MessageOpenPgpPopupView, MessageOpenPgpPopupView as default };