diff --git a/bower.json b/bower.json
index cf1a4f301..ed357189c 100644
--- a/bower.json
+++ b/bower.json
@@ -21,6 +21,7 @@
"bitcore": "0.1.34",
"angular-moment": "~0.7.1",
"socket.io-client": ">=1.0.0",
- "mousetrap": "1.4.6"
+ "mousetrap": "1.4.6",
+ "ng-idle": "*"
}
}
diff --git a/index.html b/index.html
index acc29b64d..6369c9331 100644
--- a/index.html
+++ b/index.html
@@ -62,6 +62,7 @@
+
diff --git a/js/app.js b/js/app.js
index cf5656438..058dfbba6 100644
--- a/js/app.js
+++ b/js/app.js
@@ -27,6 +27,7 @@ var copayApp = window.copayApp = angular.module('copayApp', [
'angularMoment',
'mm.foundation',
'monospaced.qrcode',
+ 'ngIdle',
'copayApp.filters',
'copayApp.services',
'copayApp.controllers',
@@ -40,6 +41,7 @@ copayApp.config(function($sceDelegateProvider) {
]);
});
+
angular.module('copayApp.filters', []);
angular.module('copayApp.services', []);
angular.module('copayApp.controllers', []);
diff --git a/js/controllers/sidebar.js b/js/controllers/sidebar.js
index 79b8ad859..7606483b9 100644
--- a/js/controllers/sidebar.js
+++ b/js/controllers/sidebar.js
@@ -82,4 +82,15 @@ angular.module('copayApp.controllers').controller('SidebarController',
// Init socket handlers (with no wallet yet)
controllerUtils.setSocketHandlers();
+ if ($rootScope.wallet) {
+ $scope.$on('$idleStart', function(a) {
+ notification.warning('Session will be closed', 'Your session is about to expire due to inactivity');
+ });
+
+ $scope.$on('$idleTimeout', function() {
+ $scope.signout();
+ notification.warning('Session closed', 'Session closed because a long time of inactivity');
+ });
+ }
+
});
diff --git a/js/routes.js b/js/routes.js
index 9db46fdc1..00ab8b185 100644
--- a/js/routes.js
+++ b/js/routes.js
@@ -65,17 +65,22 @@ angular
//Setting HTML5 Location Mode
angular
.module('copayApp')
- .config(function($locationProvider) {
+ .config(function($locationProvider, $idleProvider) {
$locationProvider
.html5Mode(false)
.hashPrefix('!');
+ // IDLE timeout
+ $idleProvider.idleDuration(15 * 60); // in seconds
+ $idleProvider.warningDuration(10); // in seconds
})
- .run(function($rootScope, $location) {
+ .run(function($rootScope, $location, $idle) {
+ $idle.watch();
$rootScope.$on('$routeChangeStart', function(event, next, current) {
if (!util.supports.data) {
$location.path('unsupported');
} else {
if ((!$rootScope.wallet || !$rootScope.wallet.id) && next.validate) {
+ $idle.unwatch();
$location.path('/');
}
if ($rootScope.wallet && !$rootScope.wallet.isReady()) {
diff --git a/karma.conf.js b/karma.conf.js
index 8bd9d8e1b..fd2c586fe 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -21,6 +21,7 @@ module.exports = function(config) {
'lib/angular/angular.min.js',
'lib/angular-mocks/angular-mocks.js',
'lib/moment/moment.js',
+ 'lib/ng-idle/angular-idle.min.js',
'lib/angular-moment/angular-moment.js',
'lib/qrcode-generator/js/qrcode.js',
'lib/angular-qrcode/qrcode.js',