68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { useAuthStore } from "@/auth";
|
|
import { marbasAxiosInstance } from "@/service";
|
|
import { defineStore } from "pinia";
|
|
import { computed, onMounted, ref } from "vue";
|
|
|
|
export type AcquiredMarketItem = {
|
|
id: number;
|
|
type: number;
|
|
quantity: number;
|
|
remaining: number;
|
|
price: number;
|
|
date: Date;
|
|
source: 'bo' | 'so' | 'prod';
|
|
user: number;
|
|
}
|
|
|
|
const endpoint = '/api/acquisitions';
|
|
|
|
export const useAcquiredItemStore = defineStore('market-acquisition', () => {
|
|
const acquiredItems = ref<AcquiredMarketItem[]>([]);
|
|
const authStore = useAuthStore();
|
|
|
|
const items = computed(() => acquiredItems.value);
|
|
const addAcquiredItem = async (type: number, quantity: number, price: number) => {
|
|
acquiredItems.value = [...acquiredItems.value, (await marbasAxiosInstance.post<AcquiredMarketItem>(endpoint, {
|
|
type: type,
|
|
quantity: quantity,
|
|
remaining: quantity,
|
|
price: price,
|
|
date: new Date(),
|
|
source: 'bo',
|
|
user: authStore.userId,
|
|
})).data];
|
|
};
|
|
const removeAcquiredItem = async (type: number, quantity: number) => {
|
|
const found = acquiredItems.value.find(item => item.type === type);
|
|
|
|
if (!found) {
|
|
return;
|
|
}
|
|
|
|
if (found.remaining <= 0) {
|
|
acquiredItems.value = acquiredItems.value.filter(i => i.type !== type);
|
|
|
|
} else {
|
|
acquiredItems.value = acquiredItems.value.map(i => {
|
|
if (i.type === item.type) {
|
|
return item;
|
|
} else {
|
|
return i;
|
|
}
|
|
});
|
|
}
|
|
|
|
const item = {
|
|
...found,
|
|
remaining: found.remaining - quantity
|
|
};
|
|
|
|
await marbasAxiosInstance.put(`${endpoint}/${item.id}`, item);
|
|
};
|
|
|
|
onMounted(async () => {
|
|
acquiredItems.value = (await marbasAxiosInstance.get<AcquiredMarketItem[]>(endpoint)).data.filter(item => item.remaining > 0);
|
|
});
|
|
|
|
return { items, addAcquiredItem, removeAcquiredItem };
|
|
}); |