mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 06:07:21 +01:00
* add files for new client side and reorg gulp tasks * add deps and script for new client * fix webpack paths so that building works * fix static assets not copied into prod build * fix linting * add eslint deps and re-enable it in webpack * add most missing deps for client side and split .babelrc for client * reorganize .eslintignore * update client tests paths and .gitignore * uncomment code * client: move App component * client: update oaths in App component * fix client tests and add more deps * add client side tests to npm test * fix typo in depencency name * update more deps * fix karma.conf.js and upgrade phantomjs * fix dep and move karma.conf to subdirectory * update karma.conf.js position in Gruntfile * try downgrading phantomjs * Fixup client tests (#8032) * Use phantom 2 * fix(tests): Fix refresher test * gitignore translation mock * Update karma version * disable e2e tests for new client from build * write vue templates with pug * add basic routing * remove unnecessary Function.bind shim * remove unused dependency
357 lines
13 KiB
JavaScript
357 lines
13 KiB
JavaScript
"use strict";
|
|
|
|
/* Refresh page if idle > 6h */
|
|
var REFRESH_FREQUENCY = 21600000;
|
|
var refresh;
|
|
window.refresher = function() {
|
|
window.location.reload(true);
|
|
};
|
|
|
|
var awaitIdle = function() {
|
|
if(refresh) clearTimeout(refresh);
|
|
refresh = setTimeout(window.refresher, REFRESH_FREQUENCY);
|
|
};
|
|
|
|
awaitIdle();
|
|
$(document).on('mousemove keydown mousedown touchstart', awaitIdle);
|
|
/* Refresh page if idle > 6h */
|
|
|
|
window.habitrpg = angular.module('habitrpg',
|
|
['ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'infinite-scroll', 'ui.select2', 'angular.filter', 'ngResource', 'ngSanitize'])
|
|
|
|
// @see https://github.com/angular-ui/ui-router/issues/110 and https://github.com/HabitRPG/habitrpg/issues/1705
|
|
// temporary hack until they have a better solution
|
|
|
|
.constant("API_URL", "")
|
|
.constant("STORAGE_USER_ID", 'habitrpg-user')
|
|
.constant("STORAGE_SETTINGS_ID", 'habit-mobile-settings')
|
|
.constant("MOBILE_APP", false)
|
|
.constant("TAVERN_ID", window.habitrpgShared.TAVERN_ID)
|
|
//.constant("STORAGE_GROUPS_ID", "") // if we decide to take groups offline
|
|
|
|
.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', 'STORAGE_SETTINGS_ID',
|
|
function($stateProvider, $urlRouterProvider, $httpProvider, STORAGE_SETTINGS_ID) {
|
|
|
|
$urlRouterProvider
|
|
// Setup default selected tabs
|
|
.when('/options', '/options/profile/avatar')
|
|
.when('/options/profile', '/options/profile/avatar')
|
|
.when('/options/groups', '/options/groups/tavern')
|
|
.when('/options/groups/guilds', '/options/groups/guilds/public')
|
|
.when('/options/groups/hall', '/options/groups/hall/heroes')
|
|
.when('/options/inventory', '/options/inventory/drops')
|
|
.when('/options/settings', '/options/settings/settings')
|
|
// post cards with promo codes went out with this address
|
|
.when('/options/settings/coupon', '/options/settings/promo')
|
|
|
|
// redirect states that don't match
|
|
.otherwise("/tasks");
|
|
|
|
$stateProvider
|
|
|
|
// Tasks
|
|
.state('tasks', {
|
|
url: "/tasks",
|
|
templateUrl: "partials/main.html",
|
|
title: env.t('titleTasks')
|
|
})
|
|
|
|
// Options
|
|
.state('options', {
|
|
url: "/options",
|
|
templateUrl: "partials/options.html",
|
|
controller: function(){}
|
|
})
|
|
|
|
// Options > Profile
|
|
.state('options.profile', {
|
|
url: "/profile",
|
|
templateUrl: "partials/options.profile.html",
|
|
controller: 'UserCtrl'
|
|
})
|
|
.state('options.profile.avatar', {
|
|
url: "/avatar",
|
|
templateUrl: "partials/options.profile.avatar.html",
|
|
title: env.t('titleAvatar')
|
|
})
|
|
.state('options.profile.backgrounds', {
|
|
url: '/backgrounds',
|
|
templateUrl: "partials/options.profile.backgrounds.html",
|
|
title: env.t('titleBackgrounds')
|
|
})
|
|
.state('options.profile.stats', {
|
|
url: "/stats",
|
|
templateUrl: "partials/options.profile.stats.html",
|
|
title: env.t('titleStats')
|
|
})
|
|
.state('options.profile.achievements', {
|
|
url: "/achievements",
|
|
templateUrl: "partials/options.profile.achievements.html",
|
|
title: env.t('titleAchievs')
|
|
})
|
|
.state('options.profile.profile', {
|
|
url: "/profile",
|
|
templateUrl: "partials/options.profile.profile.html",
|
|
title: env.t('titleProfile')
|
|
})
|
|
|
|
// Options > Groups
|
|
.state('options.social', {
|
|
url: "/groups",
|
|
templateUrl: "partials/options.social.html"
|
|
})
|
|
|
|
.state('options.social.inbox', {
|
|
url: '/inbox',
|
|
templateUrl: 'partials/options.social.inbox.html',
|
|
controller: 'InboxCtrl',
|
|
title: env.t('titleInbox')
|
|
})
|
|
|
|
.state('options.social.tavern', {
|
|
url: "/tavern",
|
|
templateUrl: "partials/options.social.tavern.html",
|
|
controller: 'TavernCtrl',
|
|
title: env.t('titleTavern')
|
|
})
|
|
|
|
.state('options.social.party', {
|
|
url: '/party',
|
|
templateUrl: "partials/options.social.party.html",
|
|
controller: 'PartyCtrl',
|
|
title: env.t('titleParty')
|
|
})
|
|
|
|
.state('options.social.hall', {
|
|
url: '/hall',
|
|
templateUrl: "partials/options.social.hall.html"
|
|
})
|
|
.state('options.social.hall.heroes', {
|
|
url: '/heroes',
|
|
templateUrl: "partials/options.social.hall.heroes.html",
|
|
controller: 'HallHeroesCtrl',
|
|
title: env.t('titleHeroes')
|
|
})
|
|
.state('options.social.hall.patrons', {
|
|
url: '/patrons',
|
|
templateUrl: "partials/options.social.hall.patrons.html",
|
|
controller: 'HallPatronsCtrl',
|
|
title: env.t('titlePatrons')
|
|
})
|
|
|
|
.state('options.social.guilds', {
|
|
url: '/guilds',
|
|
templateUrl: "partials/options.social.guilds.html",
|
|
controller: 'GuildsCtrl',
|
|
title: env.t('titleGuilds')
|
|
})
|
|
.state('options.social.guilds.public', {
|
|
url: '/public',
|
|
templateUrl: "partials/options.social.guilds.public.html",
|
|
title: env.t('titleGuilds')
|
|
})
|
|
.state('options.social.guilds.create', {
|
|
url: '/create',
|
|
templateUrl: "partials/options.social.guilds.create.html",
|
|
title: env.t('titleGuilds')
|
|
})
|
|
.state('options.social.guilds.detail', {
|
|
url: '/:gid',
|
|
templateUrl: 'partials/options.social.guilds.detail.html',
|
|
title: env.t('titleGuilds'),
|
|
controller: ['$scope', 'Groups', 'Chat', '$stateParams', 'Members', 'Challenges',
|
|
function($scope, Groups, Chat, $stateParams, Members, Challenges){
|
|
Groups.Group.get($stateParams.gid)
|
|
.then(function (response) {
|
|
$scope.group = response.data.data;
|
|
Chat.markChatSeen($scope.group._id);
|
|
Members.getGroupMembers($scope.group._id)
|
|
.then(function (response) {
|
|
$scope.group.members = response.data.data;
|
|
});
|
|
Members.getGroupInvites($scope.group._id)
|
|
.then(function (response) {
|
|
$scope.group.invites = response.data.data;
|
|
});
|
|
Challenges.getGroupChallenges($scope.group._id)
|
|
.then(function (response) {
|
|
$scope.group.challenges = response.data.data;
|
|
});
|
|
});
|
|
}]
|
|
})
|
|
|
|
// Options > Social > Challenges
|
|
.state('options.social.challenges', {
|
|
url: "/challenges",
|
|
params: { groupIdFilter: null },
|
|
controller: 'ChallengesCtrl',
|
|
templateUrl: "partials/options.social.challenges.html",
|
|
title: env.t('titleChallenges')
|
|
})
|
|
.state('options.social.challenges.detail', {
|
|
url: '/:cid',
|
|
templateUrl: 'partials/options.social.challenges.detail.html',
|
|
title: env.t('titleChallenges'),
|
|
controller: ['$scope', 'Challenges', '$stateParams', 'Tasks', 'Members',
|
|
function ($scope, Challenges, $stateParams, Tasks, Members) {
|
|
Challenges.getChallenge($stateParams.cid)
|
|
.then(function (response) {
|
|
$scope.obj = $scope.challenge = response.data.data;
|
|
$scope.challenge._locked = true;
|
|
return Tasks.getChallengeTasks($scope.challenge._id);
|
|
})
|
|
.then(function (response) {
|
|
var tasks = response.data.data;
|
|
tasks.forEach(function (element, index, array) {
|
|
if (!$scope.challenge[element.type + 's']) $scope.challenge[element.type + 's'] = [];
|
|
$scope.challenge[element.type + 's'].push(element);
|
|
})
|
|
|
|
return Members.getChallengeMembers($scope.challenge._id);
|
|
})
|
|
.then(function (response) {
|
|
$scope.challenge.members = response.data.data;
|
|
});
|
|
}]
|
|
})
|
|
.state('options.social.challenges.edit', {
|
|
url: '/:cid/edit',
|
|
templateUrl: 'partials/options.social.challenges.detail.html',
|
|
title: env.t('titleChallenges'),
|
|
controller: ['$scope', 'Challenges', '$stateParams', 'Tasks',
|
|
function ($scope, Challenges, $stateParams, Tasks) {
|
|
Challenges.getChallenge($stateParams.cid)
|
|
.then(function (response) {
|
|
$scope.obj = $scope.challenge = response.data.data;
|
|
$scope.challenge._locked = false;
|
|
return Tasks.getChallengeTasks($scope.challenge._id);
|
|
})
|
|
.then(function (response) {
|
|
var tasks = response.data.data;
|
|
tasks.forEach(function (element, index, array) {
|
|
if (!$scope.challenge[element.type + 's']) $scope.challenge[element.type + 's'] = [];
|
|
$scope.challenge[element.type + 's'].push(element);
|
|
})
|
|
});
|
|
}]
|
|
})
|
|
.state('options.social.challenges.detail.member', {
|
|
url: '/:uid',
|
|
templateUrl: 'partials/options.social.challenges.detail.member.html',
|
|
title: env.t('titleChallenges'),
|
|
controller: ['$scope', 'Members', '$stateParams',
|
|
function($scope, Members, $stateParams){
|
|
Members.getChallengeMemberProgress($stateParams.cid, $stateParams.uid)
|
|
.then(function(response) {
|
|
$scope.obj = response.data.data;
|
|
|
|
$scope.obj.habits = [];
|
|
$scope.obj.todos = [];
|
|
$scope.obj.dailys = [];
|
|
$scope.obj.rewards = [];
|
|
$scope.obj.tasks.forEach(function (element, index, array) {
|
|
$scope.obj[element.type + 's'].push(element)
|
|
});
|
|
|
|
$scope.obj._locked = true;
|
|
});
|
|
}]
|
|
})
|
|
|
|
// Options > Inventory
|
|
.state('options.inventory', {
|
|
url: '/inventory',
|
|
templateUrl: "partials/options.inventory.html",
|
|
controller: 'InventoryCtrl'
|
|
})
|
|
.state('options.inventory.drops', {
|
|
url: '/drops',
|
|
templateUrl: "partials/options.inventory.drops.html",
|
|
title: env.t('titleDrops')
|
|
})
|
|
.state('options.inventory.quests', {
|
|
url: '/quests',
|
|
templateUrl: "partials/options.inventory.quests.html",
|
|
title: env.t('titleQuests')
|
|
})
|
|
.state('options.inventory.pets', {
|
|
url: '/pets',
|
|
templateUrl: "partials/options.inventory.pets.html",
|
|
title: env.t('titlePets')
|
|
})
|
|
.state('options.inventory.mounts', {
|
|
url: '/mounts',
|
|
templateUrl: "partials/options.inventory.mounts.html",
|
|
title: env.t('titleMounts')
|
|
})
|
|
.state('options.inventory.equipment', {
|
|
url: '/equipment',
|
|
templateUrl: "partials/options.inventory.equipment.html",
|
|
title: env.t('titleEquipment')
|
|
})
|
|
.state('options.inventory.timetravelers', {
|
|
url: '/timetravelers',
|
|
templateUrl: "partials/options.inventory.timetravelers.html",
|
|
title: env.t('titleTimeTravelers')
|
|
})
|
|
.state('options.inventory.seasonalshop', {
|
|
url: '/seasonalshop',
|
|
templateUrl: "partials/options.inventory.seasonalshop.html",
|
|
title: env.t('titleSeasonalShop')
|
|
})
|
|
|
|
// Options > Settings
|
|
.state('options.settings', {
|
|
url: "/settings",
|
|
controller: 'SettingsCtrl',
|
|
templateUrl: "partials/options.settings.html",
|
|
})
|
|
.state('options.settings.settings', {
|
|
url: "/settings",
|
|
templateUrl: "partials/options.settings.settings.html",
|
|
title: env.t('titleSettings')
|
|
})
|
|
.state('options.settings.api', {
|
|
url: "/api",
|
|
templateUrl: "partials/options.settings.api.html",
|
|
title: env.t('titleSettings')
|
|
})
|
|
.state('options.settings.export', {
|
|
url: "/export",
|
|
templateUrl: "partials/options.settings.export.html",
|
|
title: env.t('titleSettings')
|
|
})
|
|
.state('options.settings.promo', {
|
|
url: "/promo",
|
|
templateUrl: "partials/options.settings.promo.html",
|
|
title: env.t('titleSettings')
|
|
})
|
|
.state('options.settings.subscription', {
|
|
url: "/subscription",
|
|
templateUrl: "partials/options.settings.subscription.html",
|
|
title: env.t('titleSettings')
|
|
})
|
|
.state('options.settings.notifications', {
|
|
url: "/notifications",
|
|
templateUrl: "partials/options.settings.notifications.html",
|
|
title: env.t('titleSettings')
|
|
});
|
|
|
|
var settings;
|
|
|
|
try {
|
|
settings = JSON.parse(localStorage.getItem(STORAGE_SETTINGS_ID));
|
|
} catch (e) {
|
|
settings = {};
|
|
}
|
|
|
|
if (settings && settings.auth && settings.auth.apiId && settings.auth.apiToken) {
|
|
$httpProvider.defaults.headers.common['x-api-user'] = settings.auth.apiId;
|
|
$httpProvider.defaults.headers.common['x-api-key'] = settings.auth.apiToken;
|
|
}
|
|
|
|
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json;charset=utf-8';
|
|
$httpProvider.defaults.headers.common['x-client'] = 'habitica-web';
|
|
}]);
|