diff --git a/package-lock.json b/package-lock.json index f1f3844..fdd503c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@vueuse/core": "^10.2.1", "@vueuse/integrations": "^10.2.1", "axios": "^1.4.0", + "pinia": "^2.1.6", "pocketbase": "^0.18.0", "vue": "^3.3.4", "vue-router": "^4.2.4" @@ -1719,6 +1720,56 @@ "node": ">=0.10.0" } }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -2111,7 +2162,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index ce6b0f8..dac1173 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@vueuse/core": "^10.2.1", "@vueuse/integrations": "^10.2.1", "axios": "^1.4.0", + "pinia": "^2.1.6", "pocketbase": "^0.18.0", "vue": "^3.3.4", "vue-router": "^4.2.4" diff --git a/src/Modal.vue b/src/Modal.vue index 2f31cd5..54ecdc7 100644 --- a/src/Modal.vue +++ b/src/Modal.vue @@ -37,7 +37,7 @@ useEventListener('keyup', e => {
-
+
diff --git a/src/main.ts b/src/main.ts index 19d8704..2968361 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,5 @@ import { providePocketBase } from '@/pocketbase'; +import { createPinia } from 'pinia'; import { createApp } from 'vue'; import { createRouter, createWebHistory } from 'vue-router'; import App from './App.vue'; @@ -7,6 +8,7 @@ import './style.css'; const app = createApp(App); const pb = providePocketBase(app); +const pinia = createPinia(); const router = createRouter({ history: createWebHistory(), routes, @@ -20,6 +22,7 @@ router.beforeEach(async to => { } }); +app.use(pinia); app.use(router); app.mount('#app'); diff --git a/src/market/scan/index.ts b/src/market/scan/index.ts index dfc6363..02cbf73 100644 --- a/src/market/scan/index.ts +++ b/src/market/scan/index.ts @@ -1,6 +1,5 @@ export * from './HistoryQuartils'; export * from './scan'; -export { default as BuyModal } from './BuyModal.vue'; export { default as ScanResultTable } from './ScanResultTable.vue'; diff --git a/src/market/scan/scan.ts b/src/market/scan/scan.ts index 5667d83..1afbd6c 100644 --- a/src/market/scan/scan.ts +++ b/src/market/scan/scan.ts @@ -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(); + + 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(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('').catch(() => undefined)); + return { types, setTypes }; +}); \ No newline at end of file diff --git a/src/market/scan/BuyModal.vue b/src/market/track/BuyModal.vue similarity index 66% rename from src/market/scan/BuyModal.vue rename to src/market/track/BuyModal.vue index 79c5deb..2896369 100644 --- a/src/market/scan/BuyModal.vue +++ b/src/market/track/BuyModal.vue @@ -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(); - -const itemsStorage = useTrackedItemsStorage(); +const trackedItemStore = useTrackedItemStore(); const modalOpen = ref(false); const type = ref(); @@ -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 });