pinia+track
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
export * from './HistoryQuartils';
|
||||
export * from './scan';
|
||||
|
||||
export { default as BuyModal } from './BuyModal.vue';
|
||||
export { default as ScanResultTable } from './ScanResultTable.vue';
|
||||
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { MarketOrderHistory, MarketType } from "@/market";
|
||||
import { usePocketBase, watchCollection } from "@/pocketbase";
|
||||
import { defineStore } from "pinia";
|
||||
import { RecordModel } from "pocketbase";
|
||||
import { computed, onMounted, ref } from "vue";
|
||||
|
||||
export type ScanResult = {
|
||||
type: MarketType;
|
||||
@@ -7,3 +11,33 @@ export type ScanResult = {
|
||||
sell: number
|
||||
}
|
||||
|
||||
interface MarketScan extends RecordModel {
|
||||
owner: string;
|
||||
types: number[];
|
||||
};
|
||||
|
||||
const marketScans = 'marketScans';
|
||||
|
||||
export const useMarkeyScanStore = defineStore(marketScans, () => {
|
||||
const pb = usePocketBase();
|
||||
const marketScan = ref<MarketScan>();
|
||||
|
||||
const types = computed(() => marketScan.value?.types ?? []);
|
||||
const setTypes = async (types: number[]) => {
|
||||
if (marketScan.value?.id) {
|
||||
pb.collection(marketScans).update(marketScan.value.id, { owner: pb.authStore.model!.id, types });
|
||||
} else {
|
||||
pb.collection(marketScans).create({ owner: pb.authStore.model!.id, types });
|
||||
}
|
||||
}
|
||||
|
||||
watchCollection<MarketScan>(marketScans, '*', data => {
|
||||
if (data.action === 'delete') {
|
||||
marketScan.value = undefined;
|
||||
} else if (!marketScan.value || data.record.id === marketScan.value.id) {
|
||||
marketScan.value = data.record;
|
||||
}
|
||||
});
|
||||
onMounted(async () => marketScan.value = await pb.collection(marketScans).getFirstListItem<MarketScan>('').catch(() => undefined));
|
||||
return { types, setTypes };
|
||||
});
|
||||
@@ -2,16 +2,11 @@
|
||||
import Modal from '@/Modal.vue';
|
||||
import { formatIsk } from '@/formaters';
|
||||
import { MarketType } from '@/market';
|
||||
import { useTrackedItemsStorage } from '@/market/track';
|
||||
import { ref } from 'vue';
|
||||
import { useTrackedItemStore } from './track';
|
||||
|
||||
interface Emit {
|
||||
(e: 'added'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emit>();
|
||||
|
||||
const itemsStorage = useTrackedItemsStorage();
|
||||
const trackedItemStore = useTrackedItemStore();
|
||||
|
||||
const modalOpen = ref<boolean>(false);
|
||||
const type = ref<MarketType>();
|
||||
@@ -43,24 +38,7 @@ const add = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
const oldItem = itemsStorage.value.find(i => i.typeID === id);
|
||||
|
||||
if (oldItem) {
|
||||
const item = {
|
||||
typeID: id,
|
||||
count: count.value + oldItem.count,
|
||||
averagePrice: ((price.value * count.value) + (oldItem.averagePrice * oldItem.count)) / (count.value + oldItem.count)
|
||||
};
|
||||
itemsStorage.value = itemsStorage.value.map(i => i.typeID === id ? item : i);
|
||||
} else {
|
||||
const item = {
|
||||
typeID: id,
|
||||
count: count.value,
|
||||
averagePrice: price.value
|
||||
};
|
||||
itemsStorage.value = [ ...itemsStorage.value, item ];
|
||||
}
|
||||
emit('added');
|
||||
trackedItemStore.addTrackedItem(id, count.value, price.value);
|
||||
modalOpen.value = false;
|
||||
}
|
||||
|
||||
@@ -69,7 +47,7 @@ defineExpose({ open });
|
||||
|
||||
<template>
|
||||
<Modal v-model:open="modalOpen">
|
||||
<div class="p-4 bg-slate-800 rounded mt-20 flex">
|
||||
<div class="p-4 bg-slate-800 rounded flex">
|
||||
<div class="flex me-2">
|
||||
<span>Price: </span>
|
||||
<div class="ms-2">
|
||||
@@ -1,16 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import Modal from '@/Modal.vue';
|
||||
import { MarketType } from '@/market';
|
||||
import { useTrackedItemsStorage } from '@/market/track';
|
||||
import { ref } from 'vue';
|
||||
import { useTrackedItemStore } from './track';
|
||||
|
||||
interface Emit {
|
||||
(e: 'removed'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emit>();
|
||||
|
||||
const itemsStorage = useTrackedItemsStorage();
|
||||
const trackedItemStore = useTrackedItemStore();
|
||||
|
||||
const modalOpen = ref<boolean>(false);
|
||||
const type = ref<MarketType>();
|
||||
@@ -29,26 +24,7 @@ const remove = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
const oldItem = itemsStorage.value.find(i => i.typeID === id);
|
||||
|
||||
if (!oldItem) {
|
||||
modalOpen.value = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const c = oldItem.count - count.value;
|
||||
|
||||
if (c > 0) {
|
||||
const item = {
|
||||
typeID: id,
|
||||
count: oldItem.count - count.value,
|
||||
averagePrice: oldItem.averagePrice
|
||||
};
|
||||
itemsStorage.value = itemsStorage.value.map(i => i.typeID === id ? item : i);
|
||||
} else {
|
||||
itemsStorage.value = itemsStorage.value.filter(i => i.typeID !== id);
|
||||
}
|
||||
emit('removed');
|
||||
trackedItemStore.removeTrackedItem(id, count.value);
|
||||
modalOpen.value = false;
|
||||
}
|
||||
|
||||
@@ -57,7 +33,7 @@ defineExpose({ open });
|
||||
|
||||
<template>
|
||||
<Modal v-model:open="modalOpen">
|
||||
<div class="p-4 bg-slate-800 rounded mt-20 flex">
|
||||
<div class="p-4 bg-slate-800 rounded flex">
|
||||
<div class="flex me-2 mb-auto">
|
||||
<span>Count: </span>
|
||||
<input class="ms-2" type="number" min="0" step="1" v-model="count" />
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
export * from './TrackedItem';
|
||||
export * from './storage';
|
||||
export * from './track';
|
||||
|
||||
export { default as BuyModal } from './BuyModal.vue';
|
||||
export { default as SellModal } from './SellModal.vue';
|
||||
export { default as TrackResultTable } from './TrackResultTable.vue';
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import { createSharedComposable, useLocalStorage } from '@vueuse/core';
|
||||
|
||||
export type TrackedMarketItemStorage = {
|
||||
typeID: number;
|
||||
count: number;
|
||||
averagePrice: number;
|
||||
}
|
||||
|
||||
export const useTrackedItemsStorage = createSharedComposable(() => useLocalStorage<TrackedMarketItemStorage[]>('market-track-items', []));
|
||||
58
src/market/track/track.ts
Normal file
58
src/market/track/track.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import { useCollection, usePocketBase } from "@/pocketbase";
|
||||
import { createSharedComposable, useLocalStorage } from '@vueuse/core';
|
||||
import { defineStore } from "pinia";
|
||||
import { RecordModel } from "pocketbase";
|
||||
import { computed } from "vue";
|
||||
|
||||
export type TrackedMarketItemStorage = {
|
||||
typeID: number;
|
||||
count: number;
|
||||
averagePrice: number;
|
||||
}
|
||||
|
||||
interface TrackedMarketItem extends RecordModel {
|
||||
owner: string;
|
||||
typeID: number;
|
||||
count: number;
|
||||
averagePrice: number;
|
||||
}
|
||||
|
||||
const marketTrackings = 'marketTrackings';
|
||||
|
||||
export const useTrackedItemsStorage = createSharedComposable(() => useLocalStorage<TrackedMarketItemStorage[]>('market-track-items', []));
|
||||
|
||||
export const useTrackedItemStore = defineStore(marketTrackings, () => {
|
||||
const pb = usePocketBase();
|
||||
const trackedItems = useCollection<TrackedMarketItem>(marketTrackings);
|
||||
|
||||
const items = computed(() => trackedItems);
|
||||
const addTrackedItem = async (typeID: number, count: number, averagePrice: number) => {
|
||||
const oldItem = trackedItems.value.find(i => i.typeID === typeID);
|
||||
|
||||
if (oldItem?.id) {
|
||||
pb.collection(marketTrackings).update(oldItem.id, {
|
||||
...oldItem,
|
||||
count: count + oldItem.count,
|
||||
averagePrice: ((averagePrice * count) + (oldItem.averagePrice * oldItem.count)) / (count + oldItem.count)
|
||||
});
|
||||
} else {
|
||||
pb.collection(marketTrackings).create({ owner: pb.authStore.model!.id, typeID, count, averagePrice});
|
||||
}
|
||||
};
|
||||
const removeTrackedItem = async (typeID: number, count: number) => {
|
||||
const oldItem = trackedItems.value.find(i => i.typeID === typeID);
|
||||
|
||||
if (!oldItem?.id) {
|
||||
return;
|
||||
} else if (oldItem.count > count) {
|
||||
pb.collection(marketTrackings).update(oldItem.id, {
|
||||
...oldItem,
|
||||
count: oldItem.count - count
|
||||
});
|
||||
} else {
|
||||
pb.collection(marketTrackings).delete(oldItem.id);
|
||||
}
|
||||
};
|
||||
|
||||
return { items, addTrackedItem, removeTrackedItem };
|
||||
});
|
||||
Reference in New Issue
Block a user