Wallet/src/js/routes.js

544 lines
15 KiB
JavaScript
Raw Normal View History

2015-03-06 12:00:10 -03:00
'use strict';
2015-05-12 14:56:24 -03:00
var unsupported, isaosp;
2015-03-06 12:00:10 -03:00
if (window && window.navigator) {
var rxaosp = window.navigator.userAgent.match(/Android.*AppleWebKit\/([\d.]+)/);
2015-05-12 14:56:24 -03:00
isaosp = (rxaosp && rxaosp[1] < 537);
2015-03-06 12:00:10 -03:00
if (!window.cordova && isaosp)
unsupported = true;
if (unsupported) {
window.location = '#/unsupported';
}
2015-03-06 12:00:10 -03:00
}
//Setting up route
angular
.module('copayApp')
2015-05-07 19:02:38 -03:00
.config(function(historicLogProvider, $provide, $logProvider, $stateProvider, $urlRouterProvider) {
2015-03-06 12:00:10 -03:00
$urlRouterProvider.otherwise('/');
2015-04-25 12:37:04 -03:00
$logProvider.debugEnabled(true);
$provide.decorator('$log', ['$delegate',
function($delegate) {
var historicLog = historicLogProvider.$get();
['debug', 'info', 'warn', 'error', 'log'].forEach(function(level) {
var orig = $delegate[level];
$delegate[level] = function() {
var args = [].slice.call(arguments);
2015-04-27 02:07:26 -03:00
if (!Array.isArray(args)) args = [args];
args = args.map(function(v) {
2015-04-25 20:53:31 -03:00
try {
if (typeof v == 'undefined') v = 'undefined';
if (!v) v = 'null';
2015-04-25 20:53:31 -03:00
if (typeof v == 'object') {
2015-04-27 02:07:26 -03:00
if (v.message)
v = v.message;
else
v = JSON.stringify(v);
2015-04-25 20:53:31 -03:00
}
v = v.toString();
if (v.length > 200)
v = v.substr(0, 197) + '...';
2015-04-25 20:53:31 -03:00
} catch (e) {
console.log('Error at log decorator:', e);
v = 'undefined';
}
2015-04-25 12:37:04 -03:00
return v;
});
2015-04-26 20:13:02 -03:00
try {
if (window.cordova)
console.log(args.join(' '));
historicLog.add(level, args.join(' '));
2015-05-04 12:23:43 -03:00
orig.apply(null, args);
2015-04-26 20:13:02 -03:00
} catch (e) {
console.log('Error at log decorator:', e);
}
2015-04-25 12:37:04 -03:00
};
});
return $delegate;
}
]);
2015-03-06 12:00:10 -03:00
$stateProvider
.state('splash', {
url: '/splash',
needProfile: false,
views: {
'main': {
2015-05-13 11:58:19 -03:00
templateUrl: 'views/splash.html',
controller: function($scope, $timeout, $log, profileService, go) {
if (profileService.profile) {
go.walletHome();
}
2015-05-13 11:58:19 -03:00
$scope.create = function(noWallet) {
$scope.creatingProfile = true;
2015-05-13 11:58:19 -03:00
profileService.create({noWallet: noWallet}, function(err) {
if (err) {
$scope.creatingProfile = false;
$log.warn(err);
$scope.error = err;
$scope.$apply();
$timeout(function() {
2015-05-13 11:58:19 -03:00
$scope.create(noWallet);
}, 3000);
}
});
};
}
2015-03-06 12:00:10 -03:00
}
}
})
.state('walletHome', {
url: '/',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
2015-05-07 18:35:54 -03:00
templateUrl: 'views/walletHome.html',
2015-03-06 12:00:10 -03:00
},
}
})
.state('unsupported', {
url: '/unsupported',
needProfile: false,
views: {
'main': {
templateUrl: 'views/unsupported.html'
}
}
})
.state('uri-payment', {
url: '/uri-payment/:data',
templateUrl: 'views/paymentUri.html',
views: {
'main': {
templateUrl: 'views/paymentUri.html',
},
},
needProfile: true
})
.state('selectWalletForPayment', {
url: '/selectWalletForPayment',
controller: 'walletForPaymentController',
needProfile: true
})
.state('join', {
url: '/join',
needProfile: true,
views: {
'main': {
templateUrl: 'views/join.html'
},
}
})
.state('import', {
url: '/import',
needProfile: true,
views: {
'main': {
templateUrl: 'views/import.html'
},
}
})
.state('importProfile', {
url: '/importProfile',
templateUrl: 'views/importProfile.html',
needProfile: false
})
.state('importLegacy', {
url: '/importLegacy',
needProfile: true,
views: {
'main': {
templateUrl: 'views/importLegacy.html',
},
}
})
.state('create', {
url: '/create',
templateUrl: 'views/create.html',
needProfile: true,
views: {
'main': {
templateUrl: 'views/create.html'
},
}
})
.state('copayers', {
url: '/copayers',
needProfile: true,
views: {
'main': {
templateUrl: 'views/copayers.html'
},
}
})
.state('preferences', {
url: '/preferences',
templateUrl: 'views/preferences.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
2015-05-07 18:35:54 -03:00
templateUrl: 'views/preferences.html',
2015-03-06 12:00:10 -03:00
},
}
})
2015-04-22 15:19:08 -03:00
.state('preferencesLanguage', {
url: '/preferencesLanguage',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesLanguage.html'
},
}
})
2015-03-06 12:00:10 -03:00
.state('preferencesUnit', {
url: '/preferencesUnit',
templateUrl: 'views/preferencesUnit.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesUnit.html'
},
}
})
2015-05-04 12:23:43 -03:00
.state('preferencesAdvanced', {
url: '/preferencesAdvanced',
templateUrl: 'views/preferencesAdvanced.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesAdvanced.html'
},
}
})
2015-03-06 12:00:10 -03:00
.state('preferencesColor', {
url: '/preferencesColor',
templateUrl: 'views/preferencesColor.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesColor.html'
},
}
})
2015-04-13 14:58:07 -03:00
.state('preferencesAltCurrency', {
2015-03-06 12:00:10 -03:00
url: '/preferencesAltCurrency',
templateUrl: 'views/preferencesAltCurrency.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesAltCurrency.html'
},
}
})
2015-05-14 10:39:22 -03:00
.state('preferencesAlias', {
url: '/preferencesAlias',
templateUrl: 'views/preferencesAlias.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesAlias.html'
},
}
})
2015-03-06 12:00:10 -03:00
.state('preferencesBwsUrl', {
url: '/preferencesBwsUrl',
templateUrl: 'views/preferencesBwsUrl.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesBwsUrl.html'
},
2015-05-08 16:54:32 -03:00
2015-03-06 12:00:10 -03:00
}
})
.state('delete', {
url: '/delete',
templateUrl: 'views/preferencesDeleteWallet.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesDeleteWallet.html'
},
}
})
2015-04-25 12:37:04 -03:00
.state('about', {
url: '/about',
templateUrl: 'views/preferencesAbout.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesAbout.html'
},
}
})
.state('logs', {
url: '/logs',
templateUrl: 'views/preferencesLogs.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/preferencesLogs.html'
},
}
})
2015-03-06 12:00:10 -03:00
.state('backup', {
url: '/backup',
templateUrl: 'views/backup.html',
walletShouldBeComplete: true,
needProfile: true,
views: {
'main': {
templateUrl: 'views/backup.html'
},
}
})
.state('settings', {
url: '/settings',
controller: 'settingsController',
templateUrl: 'views/settings.html',
needProfile: false
})
.state('warning', {
url: '/warning',
controller: 'warningController',
templateUrl: 'views/warning.html',
needProfile: false
})
.state('add', {
2015-04-13 14:58:07 -03:00
url: '/add',
needProfile: true,
views: {
'main': {
templateUrl: 'views/add.html'
},
2015-03-06 12:00:10 -03:00
}
2015-04-13 14:58:07 -03:00
})
.state('cordova', {
url: '/cordova/:status',
2015-03-06 12:00:10 -03:00
views: {
'main': {
controller: function($rootScope, $stateParams, $timeout, go) {
2015-03-06 12:00:10 -03:00
switch ($stateParams.status) {
2015-04-13 14:58:07 -03:00
case 'resume':
2015-04-28 18:11:06 -03:00
$rootScope.$emit('Local/Resume');
2015-03-06 12:00:10 -03:00
break;
2015-04-13 17:09:33 -03:00
case 'offline':
2015-04-28 18:11:06 -03:00
$rootScope.$emit('Local/Offline');
2015-04-13 17:09:33 -03:00
break;
2015-03-06 12:00:10 -03:00
};
$timeout(function() {
$rootScope.$emit('Local/SetTab', 'walletHome', true);
}, 100);
2015-03-06 12:00:10 -03:00
go.walletHome();
}
}
},
needProfile: false
});
})
2015-05-07 18:35:54 -03:00
.run(function($rootScope, $state, $log, gettextCatalog, uriHandler, isCordova, amMoment, profileService, $timeout) {
2015-04-23 18:05:31 -03:00
FastClick.attach(document.body);
2015-04-25 12:37:04 -03:00
2015-04-22 18:41:30 -03:00
// Auto-detect browser language
var userLang, androidLang;
2015-03-06 12:00:10 -03:00
2015-04-22 18:41:30 -03:00
if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
userLang = androidLang[1];
} else {
// works for iOS and Android 4.x
userLang = navigator.userLanguage || navigator.language;
}
2015-03-06 12:00:10 -03:00
2015-04-22 18:41:30 -03:00
userLang = userLang ? (userLang.split('-', 1)[0] || 'en') : 'en';
gettextCatalog.setCurrentLanguage(userLang);
amMoment.changeLocale(userLang);
2015-03-06 12:00:10 -03:00
// Register URI handler, not for mobileApp
if (!isCordova) {
uriHandler.register();
}
var pageWeight = {
2015-04-14 01:15:37 -03:00
walletHome: 0,
2015-05-08 16:54:32 -03:00
copayers: -1,
2015-04-29 18:09:26 -03:00
preferences: 11,
2015-03-06 12:00:10 -03:00
preferencesColor: 12,
backup: 12,
2015-05-04 12:23:43 -03:00
preferencesAdvanced: 12,
delete: 13,
2015-04-22 15:19:08 -03:00
preferencesLanguage: 12,
2015-03-06 12:00:10 -03:00
preferencesUnit: 12,
preferencesAltCurrency: 12,
preferencesBwsUrl: 12,
2015-05-14 10:39:22 -03:00
preferencesAlias: 12,
2015-04-25 12:37:04 -03:00
about: 12,
logs: 13,
2015-05-04 19:23:18 -03:00
add: 11,
2015-03-06 12:00:10 -03:00
create: 12,
join: 12,
import: 12,
2015-05-13 11:58:19 -03:00
importLegacy: 13
2015-03-06 12:00:10 -03:00
};
2015-05-08 16:54:32 -03:00
2015-05-08 18:28:50 -03:00
var cachedTransitionState, cachedBackPanel;
2015-05-08 16:54:32 -03:00
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
2015-05-04 19:23:18 -03:00
2015-03-06 12:00:10 -03:00
if (!profileService.profile && toState.needProfile) {
// Give us time to open / create the profile
2015-04-25 12:37:04 -03:00
event.preventDefault();
2015-03-06 12:00:10 -03:00
// Try to open local profile
profileService.loadAndBindProfile(function(err) {
if (err) {
if (err.message.match('NOPROFILE')) {
$log.debug('No profile... redirecting');
$state.transitionTo('splash');
} else {
throw new Error(err); // TODO
}
} else {
2015-04-25 12:37:04 -03:00
$log.debug('Profile loaded ... Starting UX.');
2015-05-04 12:23:43 -03:00
$state.transitionTo(toState.name || toState, toParams);
2015-03-06 12:00:10 -03:00
}
});
}
if (profileService.focusedClient && !profileService.focusedClient.isComplete() && toState.walletShouldBeComplete) {
2015-05-04 12:23:43 -03:00
2015-03-06 12:00:10 -03:00
$state.transitionTo('copayers');
event.preventDefault();
}
2015-05-07 18:35:54 -03:00
2015-05-08 11:38:34 -03:00
/*
* --------------------
*/
2015-05-08 18:28:50 -03:00
function cleanUpLater(e, e2) {
var cleanedUp = false, timeoutID;
2015-05-08 16:54:32 -03:00
var cleanUp = function() {
if (cleanedUp) return;
cleanedUp = true;
e2.parentNode.removeChild(e2);
e2.innerHTML = "";
e.className = '';
2015-05-08 18:28:50 -03:00
cachedBackPanel = null;
cachedTransitionState = '';
if (timeoutID) {
timeoutID=null;
window.clearTimeout(timeoutID);
}
2015-05-08 16:54:32 -03:00
};
e.addEventListener("animationend", cleanUp, true);
e2.addEventListener("animationend", cleanUp, true);
e.addEventListener("webkitAnimationEnd", cleanUp, true);
e2.addEventListener("webkitAnimationEnd", cleanUp, true);
2015-05-08 18:28:50 -03:00
// TODO
timeoutID = setTimeout(cleanUp, 500);
2015-05-08 16:54:32 -03:00
};
function animateTransition(fromState, toState, event) {
if (isaosp || toState.name == 'cordova' || toState.name == 'uri-payment')
2015-05-12 14:56:24 -03:00
return true;
2015-05-08 09:35:33 -03:00
// Animation in progress?
var x = document.getElementById('mainSectionDup');
2015-05-08 18:28:50 -03:00
if (x && !cachedTransitionState) {
2015-05-08 09:35:33 -03:00
console.log('Anim in progress');
2015-05-08 18:28:50 -03:00
return true;
2015-05-07 18:35:54 -03:00
}
2015-05-08 16:54:32 -03:00
var fromName = fromState.name;
var toName = toState.name;
2015-05-08 18:28:50 -03:00
if (!fromName || !toName)
return true;
2015-05-08 16:54:32 -03:00
var fromWeight = pageWeight[fromName];
var toWeight = pageWeight[toName];
2015-05-08 18:28:50 -03:00
var entering = null,
leaving = null;
2015-05-08 16:54:32 -03:00
if (fromWeight && toWeight) {
if (fromWeight > toWeight) {
leaving = 'CslideOutRight';
} else {
entering = 'CslideInRight';
}
} else if (fromName && fromWeight >= 0 && toWeight >= 0) {
2015-05-08 18:28:50 -03:00
if (toWeight) {
2015-05-08 16:54:32 -03:00
entering = 'CslideInUp';
} else {
leaving = 'CslideOutDown';
}
}
2015-05-08 09:35:33 -03:00
var e = document.getElementById('mainSection');
2015-05-07 18:35:54 -03:00
2015-05-08 18:28:50 -03:00
var desiredTransitionState = (fromName || '-') + ':' + (toName || '-');
2015-05-08 09:35:33 -03:00
2015-05-08 18:28:50 -03:00
if (desiredTransitionState == cachedTransitionState) {
e.className = entering || '';
cachedBackPanel.className = leaving || '';
cleanUpLater(e, cachedBackPanel);
console.log('USing', cachedTransitionState); //TODO
return true;
} else {
2015-05-11 15:12:27 -03:00
var sc;
2015-05-11 15:21:08 -03:00
// Keep prefDiv scroll
var contentDiv = e.getElementsByClassName('content');
if (contentDiv && contentDiv[0])
2015-05-11 15:12:27 -03:00
sc = contentDiv[0].scrollTop;
2015-05-08 18:28:50 -03:00
cachedBackPanel = e.cloneNode(true);
cachedBackPanel.id = 'mainSectionDup';
var c = document.getElementById('sectionContainer');
c.appendChild(cachedBackPanel);
2015-05-11 15:12:27 -03:00
if (sc)
cachedBackPanel.getElementsByClassName('content')[0].scrollTop = sc;
2015-05-08 18:28:50 -03:00
cachedTransitionState = desiredTransitionState;
console.log('CACHing', cachedTransitionState); //TODO
return false;
}
}
if (!animateTransition(fromState, toState)) {
event.preventDefault();
// Time for the backpane to render
setTimeout(function() {
$state.transitionTo(toState);
}, 50);
2015-05-07 18:35:54 -03:00
}
2015-03-06 12:00:10 -03:00
});
});