diff --git a/src/blockchain/wallet.js b/src/blockchain/wallet.js
index 46ef44f..74afba6 100644
--- a/src/blockchain/wallet.js
+++ b/src/blockchain/wallet.js
@@ -7,6 +7,7 @@ import {defineStore} from "pinia";
import {computed, ref} from "vue";
import {metadataMap, version} from "@/version.js";
import {CancelAllTransaction, TransactionState, TransactionType} from "@/blockchain/transaction.js";
+import {track} from "@/track.js";
export let provider = null
@@ -90,6 +91,7 @@ function changeAccounts(chainId, accounts) {
const addr = accounts[0]
if (addr !== store.account) {
console.log('account logged in', addr)
+ track('login', {chainId, address: addr})
store.account = addr
store.vaults = []
// one of these two methods will call flushTransactions()
diff --git a/src/charts/datafeed.js b/src/charts/datafeed.js
index f38c978..f056f71 100644
--- a/src/charts/datafeed.js
+++ b/src/charts/datafeed.js
@@ -9,6 +9,7 @@ import {ohlcStart} from "@/charts/chart-misc.js";
import {timestamp, USD_FIAT} from "@/common.js";
import {erc20Contract} from "@/blockchain/contract.js";
import {provider} from "@/blockchain/wallet.js";
+import {track} from "@/track.js";
const DEBUG_LOGGING = false
const log = DEBUG_LOGGING ? console.log : ()=>{}
@@ -356,6 +357,8 @@ export const DataFeed = {
result.push(_symbols[ticker])
seen[ticker] = true
}
+ if (userInput.length>=3)
+ track('search', {search_term: userInput})
onResultReadyCallback(result);
},
diff --git a/src/components/NeedsSigner.vue b/src/components/NeedsSigner.vue
index b3858af..eb937a8 100644
--- a/src/components/NeedsSigner.vue
+++ b/src/components/NeedsSigner.vue
@@ -68,7 +68,6 @@ function reload() {
}
async function connect() {
- track('connect_wallet')
disabled.value = true
try {
await addNetworkAndConnectWallet(s.chainId);
diff --git a/src/components/OneTimeHint.vue b/src/components/OneTimeHint.vue
index f297b1a..1293dfe 100644
--- a/src/components/OneTimeHint.vue
+++ b/src/components/OneTimeHint.vue
@@ -12,9 +12,11 @@ const props = defineProps({
name: {type: String, required: true},
when: {type: Boolean, default: true}, // optional conditional for when to show
after: {type: String, default: null}, // set to the name of another hint that must happen before this hint, to chain hints into a tutorial.
+ onComplete: {type: Function, default: null},
})
const forceClose = ref(false)
+const shown = ref(false)
const show = computed({
get() {
@@ -23,11 +25,13 @@ const show = computed({
const afterOk = props.after === null || prefs.hints[props.after];
const result = !forceClose.value && !shownBefore && whenOk && afterOk
// console.log(`show ${props.name}? ${result} <=`, !forceClose.value, whenOk, afterOk, prefs.hints)
- if (result)
+ if (result) {
+ shown.value = true
prefs.hints[props.name] = true
+ }
return result
},
- set(v) { if(!v) forceClose.value=true; }
+ set(v) { if(!v) { forceClose.value=true; if (shown.value && props.onComplete) props.onComplete(); } }
})
diff --git a/src/components/WelcomeDialog.vue b/src/components/WelcomeDialog.vue
index 8e6490d..963a0ec 100644
--- a/src/components/WelcomeDialog.vue
+++ b/src/components/WelcomeDialog.vue
@@ -18,6 +18,7 @@
Breakout Orders buy above a price level
Stop-loss coming soon
+
@@ -51,7 +53,7 @@ import Logo from "@/components/Logo.vue";
const modelValue = defineModel()
function tryIt() {
- track('try-it')
+ track('tutorial_begin')
modelValue.value = false
}
diff --git a/src/components/chart/ChartPlaceOrder.vue b/src/components/chart/ChartPlaceOrder.vue
index 02871a3..2952a9c 100644
--- a/src/components/chart/ChartPlaceOrder.vue
+++ b/src/components/chart/ChartPlaceOrder.vue
@@ -149,7 +149,7 @@ watchEffect(()=>{
let built = []
async function placeOrder() {
- track('place_order')
+ track('place-order')
const chartOrders = co.orders;
const allWarns = []
built = []
diff --git a/src/components/chart/DiagonalBuilder.vue b/src/components/chart/DiagonalBuilder.vue
index fd1417f..26a3988 100644
--- a/src/components/chart/DiagonalBuilder.vue
+++ b/src/components/chart/DiagonalBuilder.vue
@@ -89,7 +89,10 @@
-
+
@@ -104,6 +107,7 @@ import {vectorEquals, vectorInterpolate} from "@/vector.js";
import AbsoluteTimeEntry from "@/components/AbsoluteTimeEntry.vue";
import {useStore} from "@/store/store.js";
import OneTimeHint from "@/components/OneTimeHint.vue";
+import {track} from "@/track.js";
const s = useStore()
const co = useChartOrderStore()
diff --git a/src/components/chart/LimitBuilder.vue b/src/components/chart/LimitBuilder.vue
index fef5dce..594463f 100644
--- a/src/components/chart/LimitBuilder.vue
+++ b/src/components/chart/LimitBuilder.vue
@@ -37,7 +37,10 @@
-
+
@@ -50,6 +53,7 @@ import RungBuilder from "@/components/chart/RungBuilder.vue";
import {computed, ref} from "vue";
import {allocationText, HLine} from "@/charts/shape.js";
import OneTimeHint from "@/components/OneTimeHint.vue";
+import {track} from "@/track.js";
const s = useStore()
const os = useOrderStore()
diff --git a/src/components/chart/RungBuilder.vue b/src/components/chart/RungBuilder.vue
index 54eb6c8..a26e45c 100644
--- a/src/components/chart/RungBuilder.vue
+++ b/src/components/chart/RungBuilder.vue
@@ -21,7 +21,9 @@
/>
+ :when="rungs===1&&endpoints[0]!==null"
+ :on-complete="()=>track('rungs')"
+ />
@@ -54,7 +56,9 @@
+ :when="balance100===0"
+ :on-complete="()=>track('balance-slider')"
+ />
@@ -88,6 +92,7 @@ import {
} from "@/vector.js";
import {logicalXOR} from "@/common.js";
import OneTimeHint from "@/components/OneTimeHint.vue";
+import {track} from "@/track.js";
const co = useChartOrderStore()
const endpoints = defineModel('modelValue') // 2-item list of points/values
diff --git a/src/socket.js b/src/socket.js
index 23352d7..4f8b04c 100644
--- a/src/socket.js
+++ b/src/socket.js
@@ -6,7 +6,12 @@ import { DataFeed } from "./charts/datafeed";
import {notifyFillEvent} from "@/notify.js";
import {refreshOHLCSubs} from "@/blockchain/ohlcs.js";
-export const socket = io(import.meta.env.VITE_WS_URL || undefined, {transports: ["websocket"]})
+const socketOptions = {
+ transports: ["websocket"],
+ pingInterval: 25000, // PING every 25 seconds
+ pingTimeout: 60000 // Timeout if no PONG in 60 seconds
+}
+export const socket = io(import.meta.env.VITE_WS_URL || undefined, socketOptions)
socket.on('connect', () => {
console.log(new Date(), 'ws connected')
diff --git a/src/track.js b/src/track.js
index 5dd1bd0..8f72769 100644
--- a/src/track.js
+++ b/src/track.js
@@ -1,12 +1,15 @@
-export let tracking_enabled = true
+export let tracking_enabled = window.gtag !== undefined
-export function track(event, info) {
+if(tracking_enabled)
+ console.log('gtag', tracking_enabled)
+else
+ console.log('tracking disabled')
+
+export function track(...args) {
if (tracking_enabled) {
- if (window.gtag !== undefined)
- window.gtag('event', event, info)
- else {
- console.log('gtag not available')
- tracking_enabled = false
+ try {
+ window.gtag('event', ...args)
+ } catch (e) {
}
}
}