habitica-self-host/website/client/store/actions/user.js

156 lines
4.4 KiB
JavaScript
Raw Normal View History

import { loadAsyncResource } from 'client/libs/asyncResource';
Client Redesign: Inventory pages, secondary menu, misc css and design items (#8631) * add colors palette * add secondary menu component and style it * add box shadow to secondary menu * misc css, fixes for secondary menu * client: add equipment page with grouping, css: add some styles * add typography * more equipment * stable: fix linting * equipment: add styles (lots of general styles too) * remove duplicate google fonts loading * add dropdowns * design: white search input background, remove gray from items * start adding drawer and selected indicator * wip equipment * fix equipment * equipment: correctly bind new properties on items.gear.equipped * equipment: fix vue binding. version 2 * equipment: fix vue binding. version 3 * back to first fix for equip op, fix for sourcemaps, send http request when an item is equipped, load bootstrap-vue components where needed * checkboxes and radio buttons * correctly renders selected items in first postion during the first render * add search * general changes, constants part of app state, add popovers * add toggle switch, rename css * correct offset * upgrade deps * upgrade deps * drawer and lot of other work * update equipping mechanism * finish equipment * fix compilation and upgrade deps * use v-show in place of v-if to fix ui issues * v-show -> v-if * fix linting in test/client * fix es6 compilation in test/client * fix babel compilation for tests * fix groupsUtilities mixin tests * client: buttons * client: buttons: fix colors * client: finish buttons and dropdowns * upgrade bootstrap-vue, finish buttons and dropdowns * fix tasks page layout * misc fixes for buttons * add textareas * fix app menu * add inputs * fixes for toggleSwitch * typography * checkboxes and radio buttons * add checkbox icon * fix equip.js * extract strings to newClient.json * add Popover above 'Use Costume' / 'Auto Equip' slider - disable item select if costume-mode and 'useCostume' isn't active * show "you have disabled your costume" error above the drawer items * check errorMessage for null * hide star if costume not enabled * fix errorMessage (!errorMessage seems not to work for string) * show minimize / expand icon - always centered by css * drawer test * drawer: fix centering on large screens * fix show more button * add margin when two dropdowns are next to each other * adjust the page padding based on the drawer, misc fixes * drawer fixes
2017-05-16 19:09:55 +00:00
import setProps from 'lodash/set';
import axios from 'axios';
2016-12-07 01:11:40 +00:00
import { togglePinnedItem as togglePinnedItemOp } from 'common/script/ops/pinnedGearUtils';
import changeClassOp from 'common/script/ops/changeClass';
import disableClassesOp from 'common/script/ops/disableClasses';
export function fetch (store, options = {}) { // eslint-disable-line no-shadow
return loadAsyncResource({
store,
path: 'user',
url: '/api/v3/user',
deserialize (response) {
return response.data.data;
},
forceLoad: options.forceLoad,
});
Client Redesign: Inventory pages, secondary menu, misc css and design items (#8631) * add colors palette * add secondary menu component and style it * add box shadow to secondary menu * misc css, fixes for secondary menu * client: add equipment page with grouping, css: add some styles * add typography * more equipment * stable: fix linting * equipment: add styles (lots of general styles too) * remove duplicate google fonts loading * add dropdowns * design: white search input background, remove gray from items * start adding drawer and selected indicator * wip equipment * fix equipment * equipment: correctly bind new properties on items.gear.equipped * equipment: fix vue binding. version 2 * equipment: fix vue binding. version 3 * back to first fix for equip op, fix for sourcemaps, send http request when an item is equipped, load bootstrap-vue components where needed * checkboxes and radio buttons * correctly renders selected items in first postion during the first render * add search * general changes, constants part of app state, add popovers * add toggle switch, rename css * correct offset * upgrade deps * upgrade deps * drawer and lot of other work * update equipping mechanism * finish equipment * fix compilation and upgrade deps * use v-show in place of v-if to fix ui issues * v-show -> v-if * fix linting in test/client * fix es6 compilation in test/client * fix babel compilation for tests * fix groupsUtilities mixin tests * client: buttons * client: buttons: fix colors * client: finish buttons and dropdowns * upgrade bootstrap-vue, finish buttons and dropdowns * fix tasks page layout * misc fixes for buttons * add textareas * fix app menu * add inputs * fixes for toggleSwitch * typography * checkboxes and radio buttons * add checkbox icon * fix equip.js * extract strings to newClient.json * add Popover above 'Use Costume' / 'Auto Equip' slider - disable item select if costume-mode and 'useCostume' isn't active * show "you have disabled your costume" error above the drawer items * check errorMessage for null * hide star if costume not enabled * fix errorMessage (!errorMessage seems not to work for string) * show minimize / expand icon - always centered by css * drawer test * drawer: fix centering on large screens * fix show more button * add margin when two dropdowns are next to each other * adjust the page padding based on the drawer, misc fixes * drawer fixes
2017-05-16 19:09:55 +00:00
}
export async function set (store, changes) {
Client Redesign: Inventory pages, secondary menu, misc css and design items (#8631) * add colors palette * add secondary menu component and style it * add box shadow to secondary menu * misc css, fixes for secondary menu * client: add equipment page with grouping, css: add some styles * add typography * more equipment * stable: fix linting * equipment: add styles (lots of general styles too) * remove duplicate google fonts loading * add dropdowns * design: white search input background, remove gray from items * start adding drawer and selected indicator * wip equipment * fix equipment * equipment: correctly bind new properties on items.gear.equipped * equipment: fix vue binding. version 2 * equipment: fix vue binding. version 3 * back to first fix for equip op, fix for sourcemaps, send http request when an item is equipped, load bootstrap-vue components where needed * checkboxes and radio buttons * correctly renders selected items in first postion during the first render * add search * general changes, constants part of app state, add popovers * add toggle switch, rename css * correct offset * upgrade deps * upgrade deps * drawer and lot of other work * update equipping mechanism * finish equipment * fix compilation and upgrade deps * use v-show in place of v-if to fix ui issues * v-show -> v-if * fix linting in test/client * fix es6 compilation in test/client * fix babel compilation for tests * fix groupsUtilities mixin tests * client: buttons * client: buttons: fix colors * client: finish buttons and dropdowns * upgrade bootstrap-vue, finish buttons and dropdowns * fix tasks page layout * misc fixes for buttons * add textareas * fix app menu * add inputs * fixes for toggleSwitch * typography * checkboxes and radio buttons * add checkbox icon * fix equip.js * extract strings to newClient.json * add Popover above 'Use Costume' / 'Auto Equip' slider - disable item select if costume-mode and 'useCostume' isn't active * show "you have disabled your costume" error above the drawer items * check errorMessage for null * hide star if costume not enabled * fix errorMessage (!errorMessage seems not to work for string) * show minimize / expand icon - always centered by css * drawer test * drawer: fix centering on large screens * fix show more button * add margin when two dropdowns are next to each other * adjust the page padding based on the drawer, misc fixes * drawer fixes
2017-05-16 19:09:55 +00:00
const user = store.state.user.data;
for (let key in changes) {
if (key === 'tags') {
// Keep challenge and group tags
const oldTags = user.tags.filter(t => {
return t.group;
});
user.tags = changes[key].concat(oldTags);
// Remove deleted tags from tasks
const userTasksByType = (await store.dispatch('tasks:fetchUserTasks')).data; // eslint-disable-line no-await-in-loop
Object.keys(userTasksByType).forEach(taskType => {
userTasksByType[taskType].forEach(task => {
const tagsIndexesToRemove = [];
task.tags.forEach((tagId, tagIndex) => {
if (user.tags.find(tag => tag.id === tagId)) return; // eslint-disable-line max-nested-callbacks
tagsIndexesToRemove.push(tagIndex);
});
tagsIndexesToRemove.forEach(i => task.tags.splice(i, 1));
});
});
} else {
setProps(user, key, changes[key]);
}
Client Redesign: Inventory pages, secondary menu, misc css and design items (#8631) * add colors palette * add secondary menu component and style it * add box shadow to secondary menu * misc css, fixes for secondary menu * client: add equipment page with grouping, css: add some styles * add typography * more equipment * stable: fix linting * equipment: add styles (lots of general styles too) * remove duplicate google fonts loading * add dropdowns * design: white search input background, remove gray from items * start adding drawer and selected indicator * wip equipment * fix equipment * equipment: correctly bind new properties on items.gear.equipped * equipment: fix vue binding. version 2 * equipment: fix vue binding. version 3 * back to first fix for equip op, fix for sourcemaps, send http request when an item is equipped, load bootstrap-vue components where needed * checkboxes and radio buttons * correctly renders selected items in first postion during the first render * add search * general changes, constants part of app state, add popovers * add toggle switch, rename css * correct offset * upgrade deps * upgrade deps * drawer and lot of other work * update equipping mechanism * finish equipment * fix compilation and upgrade deps * use v-show in place of v-if to fix ui issues * v-show -> v-if * fix linting in test/client * fix es6 compilation in test/client * fix babel compilation for tests * fix groupsUtilities mixin tests * client: buttons * client: buttons: fix colors * client: finish buttons and dropdowns * upgrade bootstrap-vue, finish buttons and dropdowns * fix tasks page layout * misc fixes for buttons * add textareas * fix app menu * add inputs * fixes for toggleSwitch * typography * checkboxes and radio buttons * add checkbox icon * fix equip.js * extract strings to newClient.json * add Popover above 'Use Costume' / 'Auto Equip' slider - disable item select if costume-mode and 'useCostume' isn't active * show "you have disabled your costume" error above the drawer items * check errorMessage for null * hide star if costume not enabled * fix errorMessage (!errorMessage seems not to work for string) * show minimize / expand icon - always centered by css * drawer test * drawer: fix centering on large screens * fix show more button * add margin when two dropdowns are next to each other * adjust the page padding based on the drawer, misc fixes * drawer fixes
2017-05-16 19:09:55 +00:00
}
axios.put('/api/v3/user', changes);
// TODO
// .then((res) => console.log('set', res))
// .catch((err) => console.error('set', err));
}
export async function sleep (store) {
const user = store.state.user.data;
user.preferences.sleep = !user.preferences.sleep;
let response = await axios.post('/api/v3/user/sleep');
return response.data.data;
}
export async function addWebhook (store, payload) {
let response = await axios.post('/api/v3/user/webhook', payload.webhookInfo);
return response.data.data;
}
export async function updateWebhook (store, payload) {
let response = await axios.put(`/api/v3/user/webhook/${payload.webhook.id}`, payload.webhook);
return response.data.data;
}
export async function deleteWebhook (store, payload) {
let response = await axios.delete(`/api/v3/user/webhook/${payload.webhook.id}`);
return response.data.data;
}
export async function changeClass (store, params) {
const user = store.state.user.data;
changeClassOp(user, params);
user.flags.classSelected = true;
let response = await axios.post(`/api/v3/user/change-class?class=${params.query.class}`);
return response.data.data;
}
export async function disableClasses (store) {
const user = store.state.user.data;
disableClassesOp(user);
let response = await axios.post('/api/v3/user/disable-classes');
return response.data.data;
}
export function togglePinnedItem (store, params) {
const user = store.state.user.data;
let addedItem = togglePinnedItemOp(user, params);
axios.get(`/api/v3/user/toggle-pinned-item/${params.type}/${params.path}`);
// TODO
// .then((res) => console.log('equip', res))
// .catch((err) => console.error('equip', err));
return addedItem;
}
Feature/sortable reward area (#9930) * Client POC We need to wrap each draggable region it its own div or else the "draggable" element will conflict with each other. This screws up the styling but that is totally fixable * Ah that ref was being used after all, changing back * Scaffold out a new callback for when we drag these things Next is going to be the hard part: I need to save the sort order for these to the database. I don't even know if there is a schema but hey this is the best place to start * Firefox caching is the problem: don't actually need the wrapper div So I guess I should try this in chrome and see how it works then come back to firefox and figure out what the heck is going on * Scaffolding out our API call to save the sort order The endpoint doesn't exist yet so we will need to add that * Ok we are now calling our API endpoint to reorder these things Of course it doesn't exist yet so you get a 404 when you try, but that is ok * Defining api endpoint, a work in progress In particular I really had ought to use _id for these too, it appears that the primary way we detect order doesn't even use "key" at all. * Switching to using the pinned item UUID This has much better results, but of course the server and client logic don't match now. Will have to keep working on my splice to make sure that they are the same * I thought this would fix our server/client mismatch but it is not it Something is really wrong with my logic somewhere, maybe I need to update the db step? * Moving this logic to the "user" rather than "tasks" and key off path Path is unique and is less finiky than dealing with string comparisons with ids. Unfortunately everything is still not working... I suppose user.update() doesn't care about the position? * This client code caused quite a lot of problems if you dragged fast We don't really need it it seems, so off it goes * Updating markup and CSS so it actually looks good. Everything is working horray!! I did just notice the following bug: the popover text sometimes makes it very annoying to drag because you can't drop over it@ * Cleaning up my comments in the API section user.js I had a lot of TODOS that are mostly done now * Fixing a spacing code standards thing * Turns out we never use type, so we should remove this from the API call * Adding pinnedItemsOrder into the user schema And disabling my call in the frontend before I do any more damage * Halfway to using pinnedItemsOrder This isn't working yet but it is not going to break it horribly like it was before. * Hooking up inAppRewards to always produce sorted information It is suspicially working right now even though I have not added the seasonal stuff logic yet... * Updating the comments in user.js in movedPinnedItem It turns out that my bandaid fix to just get the ball rolling perfectly does what I need it to do when we have a length discrepancy. So we are getting much closer to the final product, just need lots of testing * Cleaning up code standards kinds of things * Yay, this fixes the popover issue I hope this is the right "vue" way to do things, because I tried a bunch of other things that definately were not the right way to do it. And this appears to work too * ** Partial Work ** Starting tests on api call for draggable items Doesn't work, doesn't compile so don't include in PR! * Test failing still... This is worth a save. The api call grabs the seasonal items too, so we can't get away from using the common functions and calls here to get the actual list of items * Okay have the first test passing Need to clean up my linter problems though * Planning out the next two tests and fixing my format problems * 2nd Test case written, this time with the "more" odd case * Making sure that we didn't mess with pinned items * Huh... this test doesn't give me the expected result Drat, I guess I found a bug * Throw an error when we put garbage in our api call. Well, before we got user.pinnedItemsOrder filled with a bunch of "null" entries which is not ideal. it still worked, but isn't this confusing enough already? * Cleaning up the multitude of linting problems thanks gulp :) * Writing tests for inAppRewards.js, but something is wrong * Fixing my linting errors in inAppRewards tests These tests still do not run though, so they may fail and I would not know * Applying Negue's fixes to inAppRewards.js test It never occured to me that we shouldn't try to reach the database while in the common tests. Well, we shouldn't do that, we should use the common.helpers instead. Thanks!
2018-04-13 13:22:06 +00:00
export async function movePinnedItem (store, params) {
let response = await axios.post(`/api/v3/user/move-pinned-item/${params.path}/move/to/${params.position}`);
return response.data.data;
}
export function castSpell (store, params) {
let spellUrl = `/api/v3/user/class/cast/${params.key}`;
const data = {};
if (params.targetId) spellUrl += `?targetId=${params.targetId}`;
if (params.quantity) data.quantity = params.quantity;
return axios.post(spellUrl, data);
}
export function openMysteryItem () {
return axios.post('/api/v3/user/open-mystery-item');
}
export function newStuffLater (store) {
store.state.user.data.flags.newStuff = false;
Notifications v2 and Bailey API (#9716) * Added initial bailey api * wip * implement new panel header * Fixed lint * add ability to mark notification as seen * add notification count, remove top badge from user and add ability to mark multiple notifications as seen * add support dismissall and mark all as read * do not dismiss actionable notif * mark as seen when menu is opened instead of closed * implement ordering, list of actionable notifications * add groups messages and fix badges count * add notifications for received cards * send card received notification to target not sender * rename notificaion field * fix integration tests * mark cards notifications as read and update tests * add mystery items notifications * add unallocated stats points notifications * fix linting * simplify code * refactoring and fixes * fix dropdown opening * start splitting notifications into their own component * add notifications for inbox messages * fix unit tests * fix default buttons styles * add initial bailey support * add title and tests to new stuff notification * add notification if a group task needs more work * add tests and fixes for marking a task as needing more work * make sure user._v is updated * remove console.log * notification: hover status and margins * start styling notifications, add separate files and basic functionalities * fix tests * start adding mystery items notification * wip card notification * fix cards text * initial implementation inbox messages * initial implementation group messages * disable inbox notifications until mobile is ready * wip group chat messages * finish mystery and card notifications * add bailey notification and fix a lot of stuff * start adding guilds and parties invitations * misc invitation fixes * fix lint issues * remove old code and add key to notifications * fix tests * remove unused code * add link for public guilds invite * starts to implement needs work notification design and feature * fixes to needs work, add group task approved notification * finish needs work feature * lots of fixes * implement quest notification * bailey fixes and static page * routing fixes * fixes # this.$store.dispatch(guilds:join, {groupId: group.id, type: party}); * read notifications on click * chat notifications * fix tests for chat notifications * fix chat notification test * fix tests * fix tests (again) * try awaiting * remove only * more sleep * add bailey tests * fix icons alignment * fix issue with multiple points notifications * remove merge code * fix rejecting guild invitation * make remove area bigger * fix error with notifications and add migration * fix migration * fix typos * add cleanup migration too * notifications empty state, new counter color, fix marking messages as seen in guilds * fixes * add image and install correct packages * fix mongoose version * update bailey * typo * make sure chat is marked as read after other requests
2018-01-31 10:55:39 +00:00
return axios.post('/api/v3/news/tell-me-later');
}
export async function rebirth () {
let result = await axios.post('/api/v3/user/rebirth');
window.location.reload(true);
return result;
}
export async function togglePrivateMessagesOpt (store) {
let response = await axios.put('/api/v3/user',
{
'inbox.optOut': !store.state.user.data.inbox.optOut,
}
);
store.state.user.data.inbox.optOut = !store.state.user.data.inbox.optOut;
return response;
}