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 });
-
+
Price:
diff --git a/src/market/track/SellModal.vue b/src/market/track/SellModal.vue
index 626c392..16eaced 100644
--- a/src/market/track/SellModal.vue
+++ b/src/market/track/SellModal.vue
@@ -1,16 +1,11 @@
diff --git a/src/pages/market/Track.vue b/src/pages/market/Track.vue
index 50bace9..8a24726 100644
--- a/src/pages/market/Track.vue
+++ b/src/pages/market/Track.vue
@@ -1,31 +1,27 @@
@@ -34,8 +30,8 @@ onMounted(relaod);
buyModal?.open(type, { 'Price': price, 'Buy': buy, 'Sell': sell })" @sell="type => sellModal?.open(type)" />
-
-
+
+
\ No newline at end of file
diff --git a/src/pocketbase/collection.ts b/src/pocketbase/collection.ts
new file mode 100644
index 0000000..0b5b57d
--- /dev/null
+++ b/src/pocketbase/collection.ts
@@ -0,0 +1,31 @@
+
+import { usePocketBase } from "@/pocketbase";
+import { RecordModel, RecordSubscription, UnsubscribeFunc } from "pocketbase";
+import { Ref, computed, onMounted, onUnmounted, ref } from "vue";
+
+export const watchCollection =
(collection: string, query: string, callback: (data: RecordSubscription) => void) => {
+ const pb = usePocketBase();
+ let unsubscribe: UnsubscribeFunc = () => Promise.resolve();
+
+ onMounted(async () => {
+ unsubscribe = await pb.collection(collection).subscribe(query, callback);
+ });
+ onUnmounted(() => unsubscribe());
+};
+
+export const useCollection = (collection: string) => {
+ const pb = usePocketBase();
+ const list = ref([]) as Ref;
+
+ watchCollection(collection, '*', data => {
+ if (data.action === 'delete') {
+ list.value = list.value.filter(i => i.id !== data.record.id);
+ } else if (data.action === 'update') {
+ list.value = list.value.map(i => i.id === data.record.id ? data.record : i);
+ } else if (data.action === 'create') {
+ list.value = [...list.value, data.record];
+ }
+ });
+ onMounted(async () => list.value = await pb.collection(collection).getFullList().catch(() => [] as T[]));
+ return computed(() => list.value);
+}
\ No newline at end of file
diff --git a/src/pocketbase/index.ts b/src/pocketbase/index.ts
index 14491ae..9639df4 100644
--- a/src/pocketbase/index.ts
+++ b/src/pocketbase/index.ts
@@ -1 +1,2 @@
+export * from './collection';
export * from './pocketbase';