+ basic address book support
+ notify of new transactions + refresh transactions ! fixed a lot of transactions bugs
This commit is contained in:
159
renderer/addressBook.js
Normal file
159
renderer/addressBook.js
Normal file
@@ -0,0 +1,159 @@
|
||||
const {ipcRenderer} = require('electron');
|
||||
|
||||
class AddressBook {
|
||||
constructor() {
|
||||
}
|
||||
|
||||
setAddressName(address, name) {
|
||||
console.log(address);
|
||||
console.log(name);
|
||||
var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
|
||||
|
||||
if (!addressBook) {
|
||||
addressBook = { names: {} };
|
||||
}
|
||||
|
||||
// set the wallet name from the dialog box
|
||||
addressBook.names[address] = name;
|
||||
ipcRenderer.sendSync('setJSONFile',
|
||||
{
|
||||
file: 'addresses.json',
|
||||
data: addressBook
|
||||
});
|
||||
}
|
||||
|
||||
getAddressName(address) {
|
||||
var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
|
||||
|
||||
if (!addressBook) {
|
||||
addressBook = { names: {} };
|
||||
}
|
||||
|
||||
// set the wallet name from the dialog box
|
||||
return addressBook.names[address] || "";
|
||||
}
|
||||
|
||||
getAddressList() {
|
||||
var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
|
||||
|
||||
if (!addressBook) {
|
||||
addressBook = { names: {} };
|
||||
}
|
||||
|
||||
return addressBook.names;
|
||||
}
|
||||
|
||||
deleteAddress(address) {
|
||||
var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
|
||||
|
||||
if (!addressBook) {
|
||||
addressBook = { names: {} };
|
||||
} else {
|
||||
delete addressBook.names[address];
|
||||
}
|
||||
|
||||
ipcRenderer.sendSync('setJSONFile',
|
||||
{
|
||||
file: 'addresses.json',
|
||||
data: addressBook
|
||||
});
|
||||
}
|
||||
|
||||
enableButtonTooltips() {
|
||||
}
|
||||
|
||||
renderAddressBook() {
|
||||
var addressObject = EthoAddressBook.getAddressList();
|
||||
var renderData = { addressData: [] };
|
||||
|
||||
for (var key in addressObject) {
|
||||
if (addressObject.hasOwnProperty(key)) {
|
||||
var addressEntry = {};
|
||||
addressEntry.name = addressObject[key];
|
||||
addressEntry.address = key;
|
||||
renderData.addressData.push(addressEntry);
|
||||
}
|
||||
}
|
||||
|
||||
// render the wallets current state
|
||||
EthoMainGUI.renderTemplate("addressBook.html", renderData);
|
||||
$(document).trigger("render_addressBook");
|
||||
EthoAddressBook.enableButtonTooltips();
|
||||
}
|
||||
}
|
||||
|
||||
// the event to tell us that the wallets are rendered
|
||||
$(document).on("render_addressBook", function() {
|
||||
$("#btnNewAddress").off('click').on('click', function() {
|
||||
$("#dlgCreateAddressAndName").iziModal();
|
||||
$("#addressName").val("");
|
||||
$("#addressHash").val("");
|
||||
$('#dlgCreateAddressAndName').iziModal('open');
|
||||
|
||||
function doCreateNewWallet() {
|
||||
$('#dlgCreateAddressAndName').iziModal('close');
|
||||
|
||||
EthoAddressBook.setAddressName($("#addressHash").val(), $("#addressName").val());
|
||||
EthoAddressBook.renderAddressBook();
|
||||
|
||||
iziToast.success({
|
||||
title: 'Created',
|
||||
message: 'New address was successfully created',
|
||||
position: 'topRight',
|
||||
timeout: 5000
|
||||
});
|
||||
}
|
||||
|
||||
$("#btnCreateAddressConfirm").off('click').on('click', function() {
|
||||
doCreateNewWallet();
|
||||
});
|
||||
|
||||
$("#dlgCreateAddressAndName").off('keypress').on('keypress', function(e) {
|
||||
if(e.which == 13) {
|
||||
doCreateNewWallet();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(".btnChangAddressName").off('click').on('click', function() {
|
||||
var walletAddress = $(this).attr('data-address');
|
||||
var walletName = $(this).attr('data-name');
|
||||
|
||||
$("#dlgChangeAddressName").iziModal();
|
||||
$("#inputAddressName").val(walletName);
|
||||
$('#dlgChangeAddressName').iziModal('open');
|
||||
|
||||
function doChangeAddressName() {
|
||||
EthoAddressBook.setAddressName(walletAddress, $("#inputAddressName").val());
|
||||
$('#dlgChangeAddressName').iziModal('close');
|
||||
EthoAddressBook.renderAddressBook();
|
||||
}
|
||||
|
||||
$("#btnChangeAddressNameConfirm").off('click').on('click', function() {
|
||||
doChangeAddressName();
|
||||
});
|
||||
|
||||
$("#dlgChangeAddressName").off('keypress').on('keypress', function(e) {
|
||||
if(e.which == 13) {
|
||||
doChangeAddressName();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(".btnDeleteAddress").off('click').on('click', function() {
|
||||
$("#dlgDeleteAddressConfirm").iziModal();
|
||||
$('#dlgDeleteAddressConfirm').iziModal('open');
|
||||
|
||||
$("#btnDeleteAddressCancel").off('click').on('click', function() {
|
||||
$('#dlgDeleteAddressConfirm').iziModal('close');
|
||||
});
|
||||
|
||||
$("#btnDeleteAddressConfirm").off('click').on('click', function() {
|
||||
EthoAddressBook.deleteAddress($(this).attr('data-address'));
|
||||
$('#dlgDeleteAddressConfirm').iziModal('close');
|
||||
EthoAddressBook.renderAddressBook();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
EthoAddressBook = new AddressBook();
|
||||
@@ -14,7 +14,10 @@ class MainGUI {
|
||||
case "account":
|
||||
$("#mainNavBtnWalletsWrapper").addClass("iconSelected");
|
||||
break;
|
||||
case "send":
|
||||
case "addressBook":
|
||||
$("#mainNavBtnAddressBoookWrapper").addClass("iconSelected");
|
||||
break;
|
||||
case "send":
|
||||
$("#mainNavBtnSendWrapper").addClass("iconSelected");
|
||||
break;
|
||||
case "transactions":
|
||||
@@ -69,6 +72,11 @@ $("#mainNavBtnTransactions").click(function() {
|
||||
EthoTransactions.renderTransactions();
|
||||
});
|
||||
|
||||
$("#mainNavBtnAddressBoook").click(function() {
|
||||
EthoMainGUI.changeAppState("addressBook");
|
||||
EthoAddressBook.renderAddressBook();
|
||||
});
|
||||
|
||||
$("#mainNavBtnSend").click(function() {
|
||||
EthoMainGUI.changeAppState("send");
|
||||
EthoSend.renderSendState();
|
||||
|
||||
@@ -79,7 +79,7 @@ $(document).on("render_send", function() {
|
||||
},
|
||||
function(data) {
|
||||
$("#dlgAddressList").iziModal({ width: "800px" });
|
||||
EthoMainGUI.renderTemplate("addresslist.html", data, $("#dlgAddressListBody"));
|
||||
EthoMainGUI.renderTemplate("addressList.html", data, $("#dlgAddressListBody"));
|
||||
$('#dlgAddressList').iziModal('open');
|
||||
|
||||
$(".btnSelectToAddress").off('click').on('click', function() {
|
||||
|
||||
@@ -7,12 +7,13 @@ class tableTransactions {
|
||||
// register the sort datetime format
|
||||
$.fn.dataTable.moment('MMM Do YYYY HH:mm:ss');
|
||||
|
||||
var namesType = $.fn.dataTable.absoluteOrder(
|
||||
var namesType = $.fn.dataTable.absoluteOrderNumber(
|
||||
[
|
||||
{ value: null, position: 'top' }
|
||||
]);
|
||||
// render the transactions
|
||||
$(id).DataTable({
|
||||
"dom": 'Bfrtip',
|
||||
"paging": false,
|
||||
"scrollY": "calc(100vh - 115px)",
|
||||
"responsive": true,
|
||||
@@ -20,6 +21,15 @@ class tableTransactions {
|
||||
"order": [[ 1, "desc" ]],
|
||||
"data": data,
|
||||
"oSearch": {"sSearch": EthoTransactions.getFilter() },
|
||||
"buttons":
|
||||
[
|
||||
{
|
||||
text: 'Refresh',
|
||||
action: function ( e, dt, node, config ) {
|
||||
EthoTransactions.renderTransactions();
|
||||
}
|
||||
}
|
||||
],
|
||||
"columnDefs": [
|
||||
{
|
||||
"targets": 0,
|
||||
|
||||
@@ -119,22 +119,33 @@ $(document).on("onSyncInterval", function() {
|
||||
counters = {};
|
||||
}
|
||||
|
||||
function finalizeCounters(lastBlock) {
|
||||
counters.transactions = lastBlock;
|
||||
|
||||
ipcRenderer.sendSync('setJSONFile',
|
||||
{
|
||||
file: 'counters.json',
|
||||
data: counters
|
||||
});
|
||||
}
|
||||
|
||||
function doSyncRemainingBlocks() {
|
||||
EthoBlockchain.getBlock("latest", false,
|
||||
function(error) {
|
||||
EthoMainGUI.showGeneralError(error);
|
||||
},
|
||||
function(block) {
|
||||
var lastBlock = counters.transactions || 0;
|
||||
var lastBlock = counters.transactions || 1;
|
||||
|
||||
if (lastBlock < block.number) {
|
||||
function getNextBlockTransactions(blockNumber, maxBlock) {
|
||||
EthoBlockchain.getBlock(blockNumber, true,
|
||||
function(error) {
|
||||
EthoMainGUI.showGeneralError(error);
|
||||
},
|
||||
function(data) {
|
||||
if (blockNumber < maxBlock) {
|
||||
if (blockNumber < maxBlock) {
|
||||
EthoBlockchain.getBlock(blockNumber, true,
|
||||
function(error) {
|
||||
EthoMainGUI.showGeneralError(error);
|
||||
getNextBlockTransactions(blockNumber + 1 , maxBlock);
|
||||
},
|
||||
function(data) {
|
||||
if (data.transactions) {
|
||||
data.transactions.forEach(element => {
|
||||
if ((EthoWallets.getAddressExists(element.from)) || (EthoWallets.getAddressExists(element.to))) {
|
||||
@@ -151,34 +162,33 @@ $(document).on("onSyncInterval", function() {
|
||||
ipcRenderer.send('storeTransaction', Transaction);
|
||||
$(document).trigger("onNewAccountTransaction");
|
||||
|
||||
if (EthoMainGUI.getAppState() == "transactions") {
|
||||
//$('#tableTransactionsForAll').DataTable().ajax.reload();
|
||||
}
|
||||
iziToast.info({
|
||||
title: 'New Transaction',
|
||||
message: vsprintf('Transaction from address %s to address %s was just processed', [Transaction.fromaddr, Transaction.toaddr]),
|
||||
position: 'topRight',
|
||||
timeout: 10000
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// call the next iteration for the next block
|
||||
getNextBlockTransactions(blockNumber + 1 , maxBlock)
|
||||
} else {
|
||||
setTimeout(function() {
|
||||
doSyncRemainingBlocks();
|
||||
}, 10000);
|
||||
getNextBlockTransactions(blockNumber + 1 , maxBlock);
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
);
|
||||
} else {
|
||||
finalizeCounters(blockNumber);
|
||||
|
||||
setTimeout(function() {
|
||||
doSyncRemainingBlocks();
|
||||
}, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
// call initial call of function
|
||||
getNextBlockTransactions(lastBlock, block.number);
|
||||
} else {
|
||||
counters.transactions = block.number;
|
||||
ipcRenderer.sendSync('setJSONFile',
|
||||
{
|
||||
file: 'counters.json',
|
||||
data: counters
|
||||
});
|
||||
finalizeCounters(lastBlock);
|
||||
|
||||
setTimeout(function() {
|
||||
doSyncRemainingBlocks();
|
||||
|
||||
Reference in New Issue
Block a user