Merge pull request #1076 from matiu/bug/02-open-wallet
Bug/02 open wallet
This commit is contained in:
commit
815c98f7e8
15 changed files with 682 additions and 478 deletions
|
|
@ -1178,7 +1178,7 @@ a.text-warning:hover {color: #FD7262;}
|
||||||
|
|
||||||
.wide-page {
|
.wide-page {
|
||||||
background-color: #2C3E50;
|
background-color: #2C3E50;
|
||||||
margin: 10% 0;
|
margin: 5% 0;
|
||||||
padding: 50px;
|
padding: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
13
index.html
13
index.html
|
|
@ -17,7 +17,8 @@
|
||||||
<div class="off-canvas-wrap">
|
<div class="off-canvas-wrap">
|
||||||
<div class="inner-wrap">
|
<div class="inner-wrap">
|
||||||
|
|
||||||
<nav class="tab-bar" ng-class="{'hide-tab-bar' : !$root.wallet || !$root.wallet.isReady()}">
|
<nav class="tab-bar" ng-class="{'hide-tab-bar' : !$root.wallet ||
|
||||||
|
!$root.wallet.isReady() || $root.wallet.isLocked}">
|
||||||
<section class="left-small">
|
<section class="left-small">
|
||||||
<a class="left-off-canvas-toggle menu-icon" ><span></span></a>
|
<a class="left-off-canvas-toggle menu-icon" ><span></span></a>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -39,12 +40,15 @@
|
||||||
<div notifications="right top"></div>
|
<div notifications="right top"></div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ng-class="{'sidebar' : $root.wallet && $root.wallet.isReady()}"
|
ng-class="{'sidebar' : $root.wallet && $root.wallet.isReady() &&
|
||||||
|
!$root.wallet.isLocked}"
|
||||||
ng-include="'views/includes/sidebar.html'"
|
ng-include="'views/includes/sidebar.html'"
|
||||||
role='navigation'
|
role='navigation'
|
||||||
ng-if="$root.wallet && $root.wallet.isReady()"></div>
|
ng-if="$root.wallet && $root.wallet.isReady() &&
|
||||||
|
!$root.wallet.isLocked"></div>
|
||||||
|
|
||||||
<section ng-class="{'main' : $root.wallet && $root.wallet.isReady()}" ng-view></section>
|
<section ng-class="{'main' : $root.wallet && $root.wallet.isReady() &&
|
||||||
|
!$root.wallet.isLocked}" ng-view></section>
|
||||||
|
|
||||||
<a class="exit-off-canvas"></a>
|
<a class="exit-off-canvas"></a>
|
||||||
|
|
||||||
|
|
@ -108,6 +112,7 @@
|
||||||
<script src="js/controllers/settings.js"></script>
|
<script src="js/controllers/settings.js"></script>
|
||||||
<script src="js/controllers/uriPayment.js"></script>
|
<script src="js/controllers/uriPayment.js"></script>
|
||||||
<script src="js/controllers/version.js"></script>
|
<script src="js/controllers/version.js"></script>
|
||||||
|
<script src="js/controllers/warning.js"></script>
|
||||||
|
|
||||||
<!-- PLACEHOLDER: CORDOVA SRIPT -->
|
<!-- PLACEHOLDER: CORDOVA SRIPT -->
|
||||||
<script src="js/mobile.js"></script>
|
<script src="js/mobile.js"></script>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('SidebarController',
|
angular.module('copayApp.controllers').controller('SidebarController', function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) {
|
||||||
function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) {
|
|
||||||
|
|
||||||
$scope.menu = [{
|
$scope.menu = [{
|
||||||
'title': 'Receive',
|
'title': 'Receive',
|
||||||
|
|
@ -26,7 +25,9 @@ angular.module('copayApp.controllers').controller('SidebarController',
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ensures a graceful disconnect
|
// Ensures a graceful disconnect
|
||||||
window.onbeforeunload = logout;
|
window.onbeforeunload = function() {
|
||||||
|
controllerUtils.logout();
|
||||||
|
};
|
||||||
|
|
||||||
$scope.$on('$destroy', function() {
|
$scope.$on('$destroy', function() {
|
||||||
window.onbeforeunload = undefined;
|
window.onbeforeunload = undefined;
|
||||||
|
|
@ -73,5 +74,4 @@ angular.module('copayApp.controllers').controller('SidebarController',
|
||||||
notification.warning('Session closed', 'Session closed because a long time of inactivity');
|
notification.warning('Session closed', 'Session closed because a long time of inactivity');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
28
js/controllers/warning.js
Normal file
28
js/controllers/warning.js
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
'use strict';
|
||||||
|
angular.module('copayApp.controllers').controller('WarningController', function($scope, $rootScope, $location, controllerUtils) {
|
||||||
|
|
||||||
|
|
||||||
|
$scope.checkLock = function() {
|
||||||
|
if (!$rootScope.tmp || !$rootScope.tmp.getLock()) {
|
||||||
|
controllerUtils.redirIfLogged();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$scope.signout = function() {
|
||||||
|
controllerUtils.logout();
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.ignoreLock = function() {
|
||||||
|
var w = $rootScope.tmp;
|
||||||
|
delete $rootScope['tmp'];
|
||||||
|
|
||||||
|
if (!w) {
|
||||||
|
$location.path('/');
|
||||||
|
} else {
|
||||||
|
w.ignoreLock = 1;
|
||||||
|
$scope.loading = true;
|
||||||
|
controllerUtils.startNetwork(w, $scope);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
@ -44,6 +44,7 @@ function Wallet(opts) {
|
||||||
this.id = opts.id || Wallet.getRandomId();
|
this.id = opts.id || Wallet.getRandomId();
|
||||||
this.name = opts.name;
|
this.name = opts.name;
|
||||||
|
|
||||||
|
this.ignoreLock = opts.ignoreLock;
|
||||||
this.verbose = opts.verbose;
|
this.verbose = opts.verbose;
|
||||||
this.publicKeyRing.walletId = this.id;
|
this.publicKeyRing.walletId = this.id;
|
||||||
this.txProposals.walletId = this.id;
|
this.txProposals.walletId = this.id;
|
||||||
|
|
@ -92,6 +93,27 @@ Wallet.prototype.connectToAll = function() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Wallet.prototype.getLock = function() {
|
||||||
|
return this.storage.getLock(this.id);
|
||||||
|
};
|
||||||
|
|
||||||
|
Wallet.prototype.setLock = function() {
|
||||||
|
return this.storage.setLock(this.id);
|
||||||
|
};
|
||||||
|
|
||||||
|
Wallet.prototype.unlock = function() {
|
||||||
|
this.storage.removeLock(this.id);
|
||||||
|
};
|
||||||
|
|
||||||
|
Wallet.prototype.checkAndLock = function() {
|
||||||
|
if (this.getLock()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setLock();
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
Wallet.prototype._handleIndexes = function(senderId, data, isInbound) {
|
Wallet.prototype._handleIndexes = function(senderId, data, isInbound) {
|
||||||
this.log('RECV INDEXES:', data);
|
this.log('RECV INDEXES:', data);
|
||||||
var inIndexes = HDParams.fromList(data.indexes);
|
var inIndexes = HDParams.fromList(data.indexes);
|
||||||
|
|
@ -112,7 +134,7 @@ Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) {
|
||||||
try {
|
try {
|
||||||
hasChanged = this.publicKeyRing.merge(inPKR, true);
|
hasChanged = this.publicKeyRing.merge(inPKR, true);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.log('## WALLET ERROR', e); //TODO
|
this.log('## WALLET ERROR', e);
|
||||||
this.emit('connectionError', e.message);
|
this.emit('connectionError', e.message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -306,9 +328,10 @@ Wallet.prototype._handleData = function(senderId, data, isInbound) {
|
||||||
|
|
||||||
if (data.type !== 'walletId' && this.id !== data.walletId) {
|
if (data.type !== 'walletId' && this.id !== data.walletId) {
|
||||||
this.emit('badMessage', senderId);
|
this.emit('badMessage', senderId);
|
||||||
this.log('badMessage FROM:', senderId); //TODO
|
this.log('badMessage FROM:', senderId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (data.type) {
|
switch (data.type) {
|
||||||
// This handler is repeaded on WalletFactory (#join). TODO
|
// This handler is repeaded on WalletFactory (#join). TODO
|
||||||
case 'walletId':
|
case 'walletId':
|
||||||
|
|
@ -409,6 +432,12 @@ Wallet.prototype._lockIncomming = function() {
|
||||||
Wallet.prototype.netStart = function(callback) {
|
Wallet.prototype.netStart = function(callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var net = this.network;
|
var net = this.network;
|
||||||
|
|
||||||
|
if (this.checkAndLock() && !this.ignoreLock) {
|
||||||
|
this.emit('locked');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
net.removeAllListeners();
|
net.removeAllListeners();
|
||||||
net.on('connect', self._handleConnect.bind(self));
|
net.on('connect', self._handleConnect.bind(self));
|
||||||
net.on('disconnect', self._handleDisconnect.bind(self));
|
net.on('disconnect', self._handleDisconnect.bind(self));
|
||||||
|
|
@ -722,7 +751,6 @@ Wallet.prototype.sendTx = function(ntxid, cb) {
|
||||||
} else {
|
} else {
|
||||||
self.log('Sent failed. Checking is the TX was sent already');
|
self.log('Sent failed. Checking is the TX was sent already');
|
||||||
self._checkSentTx(ntxid, function(txid) {
|
self._checkSentTx(ntxid, function(txid) {
|
||||||
console.log('[Wallet.js.730:txid:]', txid); //TODO
|
|
||||||
if (txid)
|
if (txid)
|
||||||
self.store();
|
self.store();
|
||||||
|
|
||||||
|
|
@ -993,6 +1021,7 @@ Wallet.prototype.indexDiscovery = function(start, change, cosigner, gap, cb) {
|
||||||
|
|
||||||
Wallet.prototype.disconnect = function() {
|
Wallet.prototype.disconnect = function() {
|
||||||
this.log('## DISCONNECTING');
|
this.log('## DISCONNECTING');
|
||||||
|
this.unlock();
|
||||||
this.network.disconnect();
|
this.network.disconnect();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,18 @@ Storage.prototype.getLastOpened = function() {
|
||||||
return this.getGlobal('lastOpened');
|
return this.getGlobal('lastOpened');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Storage.prototype.setLock = function(walletId) {
|
||||||
|
this.setGlobal(this._key(walletId, 'Lock'), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Storage.prototype.getLock = function(walletId) {
|
||||||
|
return this.getGlobal(this._key(walletId, 'Lock'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Storage.prototype.removeLock = function(walletId) {
|
||||||
|
this.removeGlobal(this._key(walletId, 'Lock'));
|
||||||
|
}
|
||||||
|
|
||||||
//obj contains keys to be set
|
//obj contains keys to be set
|
||||||
Storage.prototype.setFromObj = function(walletId, obj) {
|
Storage.prototype.setFromObj = function(walletId, obj) {
|
||||||
for (var k in obj) {
|
for (var k in obj) {
|
||||||
|
|
|
||||||
20
js/routes.js
20
js/routes.js
|
|
@ -56,6 +56,10 @@ angular
|
||||||
.when('/uri-payment/:data', {
|
.when('/uri-payment/:data', {
|
||||||
templateUrl: 'views/uri-payment.html'
|
templateUrl: 'views/uri-payment.html'
|
||||||
})
|
})
|
||||||
|
.when('/warning', {
|
||||||
|
templateUrl: 'views/warning.html',
|
||||||
|
validate: true
|
||||||
|
})
|
||||||
.otherwise({
|
.otherwise({
|
||||||
templateUrl: 'views/errors/404.html',
|
templateUrl: 'views/errors/404.html',
|
||||||
title: 'Error'
|
title: 'Error'
|
||||||
|
|
@ -79,10 +83,26 @@ angular
|
||||||
if (!util.supports.data) {
|
if (!util.supports.data) {
|
||||||
$location.path('unsupported');
|
$location.path('unsupported');
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
// Locked?
|
||||||
|
if ($rootScope.showLockWarning) {
|
||||||
|
if ($rootScope.tmp) {
|
||||||
|
if ($location.path() !== '/warning') {
|
||||||
|
$location.path('/warning');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
delete $rootScope['showLockWarning'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((!$rootScope.wallet || !$rootScope.wallet.id) && next.validate) {
|
if ((!$rootScope.wallet || !$rootScope.wallet.id) && next.validate) {
|
||||||
$idle.unwatch();
|
$idle.unwatch();
|
||||||
$location.path('/');
|
$location.path('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In creation?
|
||||||
if ($rootScope.wallet && !$rootScope.wallet.isReady()) {
|
if ($rootScope.wallet && !$rootScope.wallet.isReady()) {
|
||||||
$location.path('/copayers');
|
$location.path('/copayers');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,17 +15,20 @@ angular.module('copayApp.services')
|
||||||
};
|
};
|
||||||
|
|
||||||
root.redirIfLogged = function() {
|
root.redirIfLogged = function() {
|
||||||
var w = $rootScope.wallet;
|
if ($rootScope.wallet) {
|
||||||
if (w) {
|
$rootScope.wallet.path('receive');
|
||||||
$location.path('addresses');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
root.logout = function() {
|
root.logout = function() {
|
||||||
|
if ($rootScope.wallet)
|
||||||
|
$rootScope.wallet.disconnect();
|
||||||
|
|
||||||
Socket.removeAllListeners();
|
Socket.removeAllListeners();
|
||||||
|
|
||||||
$rootScope.wallet = null;
|
$rootScope.wallet = $rootScope.tmp = null;
|
||||||
delete $rootScope['wallet'];
|
delete $rootScope['wallet'];
|
||||||
|
|
||||||
video.close();
|
video.close();
|
||||||
// Clear rootScope
|
// Clear rootScope
|
||||||
for (var i in $rootScope) {
|
for (var i in $rootScope) {
|
||||||
|
|
@ -69,6 +72,7 @@ angular.module('copayApp.services')
|
||||||
root.setupRootVariables = function() {
|
root.setupRootVariables = function() {
|
||||||
uriHandler.register();
|
uriHandler.register();
|
||||||
$rootScope.unitName = config.unitName;
|
$rootScope.unitName = config.unitName;
|
||||||
|
$rootScope.showLockWarning = false;
|
||||||
$rootScope.txAlertCount = 0;
|
$rootScope.txAlertCount = 0;
|
||||||
$rootScope.insightError = 0;
|
$rootScope.insightError = 0;
|
||||||
$rootScope.isCollapsed = true;
|
$rootScope.isCollapsed = true;
|
||||||
|
|
@ -121,6 +125,12 @@ angular.module('copayApp.services')
|
||||||
};
|
};
|
||||||
|
|
||||||
notification.enableHtml5Mode(); // for chrome: if support, enable it
|
notification.enableHtml5Mode(); // for chrome: if support, enable it
|
||||||
|
w.on('locked', function() {
|
||||||
|
$rootScope.tmp = w;
|
||||||
|
$rootScope.showLockWarning=true;
|
||||||
|
$location.path('/warning');
|
||||||
|
$rootScope.$digest();
|
||||||
|
});
|
||||||
|
|
||||||
w.on('badMessage', function(peerId) {
|
w.on('badMessage', function(peerId) {
|
||||||
notification.error('Error', 'Received wrong message from peer ' + peerId);
|
notification.error('Error', 'Received wrong message from peer ' + peerId);
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,18 @@ FakeStorage.prototype.getLastOpened = function() {
|
||||||
return this.storage['lastOpened'];
|
return this.storage['lastOpened'];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FakeStorage.prototype.setLock = function(id) {
|
||||||
|
this.storage[id + '::lock'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FakeStorage.prototype.getLock = function(id) {
|
||||||
|
return this.storage[id + '::lock'];
|
||||||
|
}
|
||||||
|
|
||||||
|
FakeStorage.prototype.removeLock = function(id) {
|
||||||
|
delete this.storage[id + '::lock'];
|
||||||
|
}
|
||||||
|
|
||||||
FakeStorage.prototype.removeGlobal = function(id) {
|
FakeStorage.prototype.removeGlobal = function(id) {
|
||||||
delete this.storage[id];
|
delete this.storage[id];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ var FakeWallet = function() {
|
||||||
this.safeBalance = 1000;
|
this.safeBalance = 1000;
|
||||||
this.totalCopayers = 2;
|
this.totalCopayers = 2;
|
||||||
this.requiredCopayers = 2;
|
this.requiredCopayers = 2;
|
||||||
|
this.isLocked = false;
|
||||||
this.balanceByAddr = {
|
this.balanceByAddr = {
|
||||||
'1CjPR7Z5ZSyWk6WtXvSFgkptmpoi4UM9BC': 1000
|
'1CjPR7Z5ZSyWk6WtXvSFgkptmpoi4UM9BC': 1000
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,7 @@ describe('Wallet model', function() {
|
||||||
cachedW2obj.opts.reconnectDelay = 100;
|
cachedW2obj.opts.reconnectDelay = 100;
|
||||||
}
|
}
|
||||||
var w = Wallet.fromObj(cachedW2obj, cachedW2.storage, cachedW2.network, cachedW2.blockchain);
|
var w = Wallet.fromObj(cachedW2obj, cachedW2.storage, cachedW2.network, cachedW2.blockchain);
|
||||||
|
w.unlock();
|
||||||
return w;
|
return w;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1022,6 +1023,37 @@ describe('Wallet model', function() {
|
||||||
w.netStart();
|
w.netStart();
|
||||||
w.network.start.getCall(0).args[0].privkey.length.should.equal(64);
|
w.network.start.getCall(0).args[0].privkey.length.should.equal(64);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should check if wallet is already opened', function() {
|
||||||
|
var w = cachedCreateW2();
|
||||||
|
should.not.exist(w.getLock());
|
||||||
|
w.checkAndLock().should.equal(false);
|
||||||
|
w.getLock().should.equal(true);
|
||||||
|
});
|
||||||
|
it('should check if wallet is already opened', function() {
|
||||||
|
var w = cachedCreateW2();
|
||||||
|
should.not.exist(w.getLock());
|
||||||
|
w.checkAndLock().should.equal(false);
|
||||||
|
w.getLock().should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should not start if locked', function() {
|
||||||
|
var w = cachedCreateW2();
|
||||||
|
w.netStart();
|
||||||
|
w.emit = sinon.spy();
|
||||||
|
w.netStart();
|
||||||
|
w.emit.getCall(0).args[0].should.equal('locked');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should accept ignoreLocked', function() {
|
||||||
|
var w = cachedCreateW2();
|
||||||
|
w.netStart();
|
||||||
|
w.network.start = sinon.spy();
|
||||||
|
w.ignoreLock=1;
|
||||||
|
w.netStart();
|
||||||
|
w.network.start.getCall(0).args[0].privkey.length.should.equal(64);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#forceNetwork in config', function() {
|
describe('#forceNetwork in config', function() {
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,19 @@ describe('Storage/LocalEncrypted model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#WalletLock', function() {
|
||||||
|
it('should get/set/remove opened', function() {
|
||||||
|
var s = new LocalEncrypted({
|
||||||
|
localStorage: localMock,
|
||||||
|
password: 'password'
|
||||||
|
});
|
||||||
|
s.setLock('walletId');
|
||||||
|
s.getLock('walletId').should.equal(true);
|
||||||
|
s.removeLock('walletId');
|
||||||
|
should.not.exist(s.getLock('walletId'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('#getWallets', function() {
|
describe('#getWallets', function() {
|
||||||
it('should retreive wallets from storage', function() {
|
it('should retreive wallets from storage', function() {
|
||||||
var s = new LocalEncrypted({
|
var s = new LocalEncrypted({
|
||||||
|
|
|
||||||
|
|
@ -288,8 +288,10 @@ describe("Unit: Controllers", function() {
|
||||||
describe("Unit: Sidebar Controller", function() {
|
describe("Unit: Sidebar Controller", function() {
|
||||||
var rootScope;
|
var rootScope;
|
||||||
beforeEach(inject(function($controller, $rootScope) {
|
beforeEach(inject(function($controller, $rootScope) {
|
||||||
rootScope = $rootScope;
|
|
||||||
scope = $rootScope.$new();
|
scope = $rootScope.$new();
|
||||||
|
rootScope = $rootScope;
|
||||||
|
rootScope.wallet = new FakeWallet(config);
|
||||||
|
|
||||||
headerCtrl = $controller('SidebarController', {
|
headerCtrl = $controller('SidebarController', {
|
||||||
$scope: scope,
|
$scope: scope,
|
||||||
});
|
});
|
||||||
|
|
@ -437,4 +439,18 @@ describe("Unit: Controllers", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Warning Controller', function() {
|
||||||
|
var what;
|
||||||
|
beforeEach(inject(function($controller, $rootScope) {
|
||||||
|
scope = $rootScope.$new();
|
||||||
|
what = $controller('WarningController', {
|
||||||
|
$scope: scope,
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should exist', function() {
|
||||||
|
should.exist(what);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -97,14 +97,14 @@ var createBundle = function(opts) {
|
||||||
expose: '../js/models/core/HDPath'
|
expose: '../js/models/core/HDPath'
|
||||||
});
|
});
|
||||||
|
|
||||||
if (opts.dontminify) {
|
if (opts.debug) {
|
||||||
//include dev dependencies
|
//include dev dependencies
|
||||||
b.require('sinon');
|
b.require('sinon');
|
||||||
b.require('blanket');
|
b.require('blanket');
|
||||||
b.require('soop');
|
b.require('soop');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opts.dontminify) {
|
if (!opts.debug) {
|
||||||
b.transform({
|
b.transform({
|
||||||
global: true
|
global: true
|
||||||
}, 'uglifyify');
|
}, 'uglifyify');
|
||||||
|
|
@ -120,7 +120,7 @@ if (require.main === module) {
|
||||||
var program = require('commander');
|
var program = require('commander');
|
||||||
program
|
program
|
||||||
.version('0.0.1')
|
.version('0.0.1')
|
||||||
.option('-d, --dontminify', 'Development. Don\'t minify the code.')
|
.option('-d, --debug', 'Development. Don\'t minify the codem and include debug packages.')
|
||||||
.option('-o, --stdout', 'Specify output as stdout')
|
.option('-o, --stdout', 'Specify output as stdout')
|
||||||
.parse(process.argv);
|
.parse(process.argv);
|
||||||
|
|
||||||
|
|
|
||||||
26
views/warning.html
Normal file
26
views/warning.html
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
<div class="wide-page" ng-controller="WarningController"
|
||||||
|
ng-init="checkLock()">
|
||||||
|
<div class="text-center">
|
||||||
|
<img src="img/logo-negative-beta.svg" alt="Copay">
|
||||||
|
<div class="text-white" ng-include="'views/includes/version.html'"></div>
|
||||||
|
</div>
|
||||||
|
<h1 class="text-center text-warning">Warning!</h1>
|
||||||
|
<h3 class="text-center text-white">
|
||||||
|
This wallet appears to be currently open.
|
||||||
|
<br>
|
||||||
|
Opening the wallet in multiple browser tabs could lead to unexpected results
|
||||||
|
</h3>
|
||||||
|
<div class="text-center m30v large-12 columns">
|
||||||
|
<div class="row">
|
||||||
|
<div class="large-12 columns medium-12 small-12 text-center">
|
||||||
|
<a href class="button sucess" ng-click="signout()">Go back</a>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<a href ng-click="ignoreLock()">Continue anyways</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center text-gray small cb">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue