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

166 lines
4.8 KiB
JavaScript
Raw Normal View History

import axios from 'axios';
import buyOp from 'common/script/ops/buy';
import content from 'common/script/content/index';
import purchaseOp from 'common/script/ops/purchaseWithSpell';
import hourglassPurchaseOp from 'common/script/ops/hourglassPurchase';
import sellOp from 'common/script/ops/sell';
import unlockOp from 'common/script/ops/unlock';
import rerollOp from 'common/script/ops/reroll';
import { getDropClass } from 'client/libs/notifications';
// @TODO: Purchase means gems and buy means gold. That wording is misused below, but we should also change
// the generic buy functions to something else. Or have a Gold Vendor and Gem Vendor, etc
export function buyItem (store, params) {
const quantity = params.quantity || 1;
const user = store.state.user.data;
let opResult = buyOp(user, {params, quantity});
return {
result: opResult,
httpCall: axios.post(`/api/v3/user/buy/${params.key}`),
};
}
export function buyQuestItem (store, params) {
const quantity = params.quantity || 1;
const user = store.state.user.data;
let opResult = buyOp(user, {
params,
type: 'quest',
quantity,
});
return {
result: opResult,
httpCall: axios.post(`/api/v3/user/buy/${params.key}`, {type: 'quest'}),
};
}
async function buyArmoire (store, params) {
const quantity = params.quantity || 1;
let armoire = content.armoire;
// We need the server result because Armoire has random item in the result
let result = await axios.post('/api/v3/user/buy/armoire', {
type: 'armoire',
quantity,
});
let buyResult = result.data.data;
if (buyResult) {
const resData = buyResult;
const item = resData.armoire;
const isExperience = item.type === 'experience';
if (item.type === 'gear') {
store.state.user.data.items.gear.owned[item.dropKey] = true;
}
// @TODO: We might need to abstract notifications to library rather than mixin
store.dispatch('snackbars:add', {
title: '',
text: `- ${armoire.value}`,
type: 'gp',
icon: '',
sign: '-',
timeout: true,
});
store.dispatch('snackbars:add', {
title: '',
text: isExperience ? item.value : item.dropText,
type: isExperience ? 'xp' : 'drop',
icon: isExperience ? null : getDropClass({type: item.type, key: item.dropKey}),
timeout: true,
});
}
}
export function purchase (store, params) {
const quantity = params.quantity || 1;
const user = store.state.user.data;
let opResult = purchaseOp(user, {params, quantity});
return {
result: opResult,
httpCall: axios.post(`/api/v3/user/purchase/${params.type}/${params.key}`, {quantity}),
};
}
export function purchaseMysterySet (store, params) {
const user = store.state.user.data;
let opResult = buyOp(user, {params, noConfirm: true, type: 'mystery'});
return {
result: opResult,
httpCall: axios.post(`/api/v3/user/buy/${params.key}`, {type: 'mystery'}),
};
}
export function purchaseHourglassItem (store, params) {
const user = store.state.user.data;
let opResult = hourglassPurchaseOp(user, {params});
return {
result: opResult,
httpCall: axios.post(`/api/v3/user/purchase-hourglass/${params.type}/${params.key}`),
};
}
export function unlock (store, params) {
const user = store.state.user.data;
let opResult = unlockOp(user, params);
return {
result: opResult,
httpCall: axios.post(`/api/v3/user/unlock?path=${params.query.path}`),
};
}
export async function genericPurchase (store, params) {
switch (params.pinType) {
case 'mystery_set':
return purchaseMysterySet(store, params);
case 'armoire': // eslint-disable-line
await buyArmoire(store, params);
return;
case 'fortify': {
let rerollResult = rerollOp(store.state.user.data, store.state.tasks.data);
await axios.post('/api/v3/user/reroll');
await Promise.all([
store.dispatch('user:fetch', {forceLoad: true}),
store.dispatch('tasks:fetchUserTasks', {forceLoad: true}),
]);
return rerollResult;
}
case 'rebirth_orb':
return store.dispatch('user:rebirth');
case 'potion':
case 'marketGear':
return buyItem(store, params);
case 'background':
return unlock(store, {
query: {
path: `background.${params.key}`,
},
});
default:
if (params.pinType === 'quests' && params.currency === 'gold') {
return buyQuestItem(store, params);
} else if (params.currency === 'hourglasses') {
return purchaseHourglassItem(store, params);
} else {
return purchase(store, params);
}
}
}
export function sellItems (store, params) {
const user = store.state.user.data;
sellOp(user, {params, query: {amount: params.amount}});
axios.post(`/api/v3/user/sell/${params.type}/${params.key}?amount=${params.amount}`);
}