- {this.props.isLoading ? (
+ {isLoading ? (
'Loading'
) : (
-
+
+
+ {days.map(day => (
+
+ ))}
+
)}
);
diff --git a/config/daemon/fetch-windows-params.js b/config/daemon/fetch-windows-params.js
index e2e1548..dfba7d9 100644
--- a/config/daemon/fetch-windows-params.js
+++ b/config/daemon/fetch-windows-params.js
@@ -19,16 +19,36 @@ import log from './logger';
const queue = new Queue({ concurrency: 1, autoStart: false });
-const httpClient = got.extend({ baseUrl: 'https://z.cash/downloads/', retry: 3, useElectronNet: true });
+const httpClient = got.extend({
+ baseUrl: 'https://z.cash/downloads/',
+ retry: 3,
+ useElectronNet: true,
+});
const FILES: Array<{ name: string, hash: string }> = [
- { name: 'sprout-proving.key', hash: '8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7' },
- { name: 'sprout-verifying.key', hash: '4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82' },
- { name: 'sapling-spend.params', hash: '8e48ffd23abb3a5fd9c5589204f32d9c31285a04b78096ba40a79b75677efc13' },
- { name: 'sapling-output.params', hash: '2f0ebbcbb9bb0bcffe95a397e7eba89c29eb4dde6191c339db88570e3f3fb0e4' },
- { name: 'sprout-groth16.params', hash: 'b685d700c60328498fbde589c8c7c484c722b788b265b72af448a5bf0ee55b50' },
+ {
+ name: 'sprout-proving.key',
+ hash: '8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7',
+ },
+ {
+ name: 'sprout-verifying.key',
+ hash: '4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82',
+ },
+ {
+ name: 'sapling-spend.params',
+ hash: '8e48ffd23abb3a5fd9c5589204f32d9c31285a04b78096ba40a79b75677efc13',
+ },
+ {
+ name: 'sapling-output.params',
+ hash: '2f0ebbcbb9bb0bcffe95a397e7eba89c29eb4dde6191c339db88570e3f3fb0e4',
+ },
+ {
+ name: 'sprout-groth16.params',
+ hash: 'b685d700c60328498fbde589c8c7c484c722b788b265b72af448a5bf0ee55b50',
+ },
];
+// eslint-disable-next-line max-len
const checkSha256 = (pathToFile: string, expectedHash: string) => new Promise((resolve, reject) => {
fs.readFile(pathToFile, (err, file) => {
if (err) return reject(new Error(err));
@@ -39,6 +59,7 @@ const checkSha256 = (pathToFile: string, expectedHash: string) => new Promise((r
});
});
+// eslint-disable-next-line max-len
const downloadFile = ({ file, pathToSave }): Promise<*> => new Promise((resolve, reject) => {
log(`Downloading ${file.name}...`);
@@ -50,7 +71,9 @@ const downloadFile = ({ file, pathToSave }): Promise<*> => new Promise((resolve,
log(`SHA256 validation for file ${file.name} succeeded!`);
resolve(file.name);
} else {
- reject(new Error(`SHA256 validation failed for file: ${file.name}`));
+ reject(
+ new Error(`SHA256 validation failed for file: ${file.name}`),
+ );
}
});
})
@@ -61,7 +84,9 @@ const downloadFile = ({ file, pathToSave }): Promise<*> => new Promise((resolve,
let missingDownloadParam = false;
export default (): Promise<*> => new Promise((resolve, reject) => {
- const firstRunProcess = cp.spawn(path.join(getBinariesPath(), 'win', 'first-run.bat'));
+ const firstRunProcess = cp.spawn(
+ path.join(getBinariesPath(), 'win', 'first-run.bat'),
+ );
firstRunProcess.stdout.on('data', data => log(data.toString()));
firstRunProcess.stderr.on('data', data => reject(data.toString()));
@@ -70,20 +95,33 @@ export default (): Promise<*> => new Promise((resolve, reject) => {
await Promise.all(
FILES.map(async (file) => {
- const pathToSave = path.join(app.getPath('userData'), '..', 'ZcashParams', file.name);
+ const pathToSave = path.join(
+ app.getPath('userData'),
+ '..',
+ 'ZcashParams',
+ file.name,
+ );
- const [cannotAccess] = await eres(util.promisify(fs.access)(pathToSave, fs.constants.F_OK));
+ const [cannotAccess] = await eres(
+ util.promisify(fs.access)(pathToSave, fs.constants.F_OK),
+ );
if (cannotAccess) {
missingDownloadParam = true;
+ // eslint-disable-next-line max-len
queue.add(() => downloadFile({ file, pathToSave }).then(() => log(`Download ${file.name} finished!`)));
} else {
const isValid = await checkSha256(pathToSave, file.hash);
if (isValid) {
log(`${file.name} already is in ${pathToSave}...`);
} else {
- log(`File: ${file.name} failed in the SHASUM validation, downloading again...`);
+ log(
+ `File: ${
+ file.name
+ } failed in the SHASUM validation, downloading again...`,
+ );
queue.add(() => {
+ // eslint-disable-next-line max-len
downloadFile({ file, pathToSave }).then(() => log(`Download ${file.name} finished!`));
});
}
diff --git a/config/daemon/get-binaries-path.js b/config/daemon/get-binaries-path.js
index aa827b3..c5b8f0a 100644
--- a/config/daemon/get-binaries-path.js
+++ b/config/daemon/get-binaries-path.js
@@ -3,5 +3,8 @@ import path from 'path';
/* eslint-disable-next-line import/no-extraneous-dependencies */
import isDev from 'electron-is-dev';
-// $FlowFixMe
-export default () => (isDev ? path.join(__dirname, '..', '..', './bin') : path.join(process.resourcesPath, 'bin'));
+/* eslint-disable operator-linebreak */
+export default () => (isDev
+ ? path.join(__dirname, '..', '..', './bin')
+ : // $FlowFixMe
+ path.join(process.resourcesPath, 'bin'));
diff --git a/config/daemon/run-fetch-params.js b/config/daemon/run-fetch-params.js
index fac0e1d..1ef41aa 100644
--- a/config/daemon/run-fetch-params.js
+++ b/config/daemon/run-fetch-params.js
@@ -8,5 +8,7 @@ import runUnixFetchParams from './fetch-unix-params';
export default (): Promise<*> => {
log('Fetching params');
- return os.platform() === 'win32' ? fetchWindowsParams() : runUnixFetchParams();
+ return os.platform() === 'win32'
+ ? fetchWindowsParams()
+ : runUnixFetchParams();
};
diff --git a/config/daemon/zcashd-child-process.js b/config/daemon/zcashd-child-process.js
index af09d67..34779b1 100644
--- a/config/daemon/zcashd-child-process.js
+++ b/config/daemon/zcashd-child-process.js
@@ -35,13 +35,20 @@ const getDaemonOptions = ({ username, password }) => {
`-rpcuser=${username}`,
`-rpcpassword=${password}`,
];
- return isDev ? defaultOptions.concat(['-testnet', '-addnode=testnet.z.cash']) : defaultOptions;
+ return isDev
+ ? defaultOptions.concat(['-testnet', '-addnode=testnet.z.cash'])
+ : defaultOptions;
};
let resolved = false;
+// eslint-disable-next-line
const runDaemon: () => Promise = () => new Promise(async (resolve, reject) => {
- const processName = path.join(getBinariesPath(), getOsFolder(), getDaemonName());
+ const processName = path.join(
+ getBinariesPath(),
+ getOsFolder(),
+ getDaemonName(),
+ );
const [err] = await eres(fetchParams());
@@ -76,9 +83,13 @@ const runDaemon: () => Promise = () => new Promise(async (resolve
store.set('rpcpassword', rpcCredentials.password);
}
- const childProcess = cp.spawn(processName, getDaemonOptions(rpcCredentials), {
- stdio: ['ignore', 'pipe', 'pipe'],
- });
+ const childProcess = cp.spawn(
+ processName,
+ getDaemonOptions(rpcCredentials),
+ {
+ stdio: ['ignore', 'pipe', 'pipe'],
+ },
+ );
childProcess.stdout.on('data', (data) => {
if (mainWindow) mainWindow.webContents.send('zcashd-log', data.toString());
diff --git a/config/electron.js b/config/electron.js
index 3c741d4..5f5816c 100644
--- a/config/electron.js
+++ b/config/electron.js
@@ -13,6 +13,8 @@ import eres from 'eres';
import { registerDebugShortcut } from '../utils/debug-shortcut';
import runDaemon from './daemon/zcashd-child-process';
import zcashLog from './daemon/logger';
+import getZecPrice from '../services/zec-price';
+import store from './electron-store';
let mainWindow: BrowserWindowType;
let updateAvailable: boolean = false;
@@ -37,9 +39,9 @@ const createWindow = () => {
autoUpdater.on('download-progress', progress => showStatus(
/* eslint-disable-next-line max-len */
- `Download speed: ${progress.bytesPerSecond} - Downloaded ${progress.percent}% (${progress.transferred}/${
- progress.total
- })`,
+ `Download speed: ${progress.bytesPerSecond} - Downloaded ${
+ progress.percent
+ }% (${progress.transferred}/${progress.total})`,
));
autoUpdater.on('update-downloaded', () => {
updateAvailable = true;
@@ -58,10 +60,18 @@ const createWindow = () => {
},
});
+ getZecPrice().then((obj) => {
+ store.set('ZEC_DOLLAR_PRICE', obj.USD);
+ });
+
mainWindow.setVisibleOnAllWorkspaces(true);
registerDebugShortcut(app, mainWindow);
- mainWindow.loadURL(isDev ? 'http://0.0.0.0:8080/' : `file://${path.join(__dirname, '../build/index.html')}`);
+ mainWindow.loadURL(
+ isDev
+ ? 'http://0.0.0.0:8080/'
+ : `file://${path.join(__dirname, '../build/index.html')}`,
+ );
exports.app = app;
exports.mainWindow = mainWindow;
diff --git a/package.json b/package.json
index 97adb48..9972e63 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,6 @@
"css-loader": "^1.0.1",
"docz": "^0.12.13",
"docz-plugin-css": "^0.11.0",
- "electron": "^3.0.10",
"electron-builder": "^20.36.2",
"electron-icon-maker": "^0.0.4",
"electron-is-dev": "^1.0.1",
@@ -88,17 +87,20 @@
"@babel/register": "^7.0.0",
"autoprefixer": "^9.3.1",
"connected-react-router": "^5.0.1",
+ "date-fns": "^1.30.1",
+ "electron": "^3.0.10",
"electron-store": "^2.0.0",
"eres": "^1.0.1",
"got": "^9.3.2",
"history": "^4.7.2",
+ "lodash.flow": "^3.5.0",
+ "lodash.groupby": "^4.6.0",
"p-queue": "^3.0.0",
"process-exists": "^3.1.0",
"qrcode.react": "^0.8.0",
"react": "^16.6.0",
"react-click-outside": "tj/react-click-outside",
"react-dom": "^16.6.0",
- "react-icons": "^3.2.2",
"react-popover": "^0.5.10",
"react-redux": "^5.0.7",
"react-router-dom": "^4.2.2",
diff --git a/services/utils.js b/services/utils.js
index 356a15b..20e7e09 100644
--- a/services/utils.js
+++ b/services/utils.js
@@ -745,8 +745,8 @@ export type APIMethods = {
z_exportwallet: (filename: string) => Promise