89 lines
3.0 KiB
JavaScript
89 lines
3.0 KiB
JavaScript
import {useChartOrderStore} from "@/orderbuild.js";
|
|
import {changeIntervalSecs, onChartReady, setSymbol, widget} from "@/charts/chart.js";
|
|
import {usePrefStore, useStore} from "@/store/store.js";
|
|
import {lookupSymbol} from "@/charts/datafeed.js";
|
|
import {track} from "@/track.js";
|
|
|
|
import {socket} from "@/socket.js";
|
|
|
|
export async function getShareUrl() {
|
|
const co = useChartOrderStore();
|
|
const s = useStore()
|
|
const sym = co.selectedSymbol
|
|
console.log('symbol', sym)
|
|
const data = {
|
|
version: 1,
|
|
chainId: s.chainId,
|
|
orders: co.orders,
|
|
symbol: {
|
|
base: {a: sym.base.a, s: sym.base.s},
|
|
quote: {a: sym.quote.a, s: sym.quote.s},
|
|
route: {
|
|
fee: sym.fee,
|
|
exchange: sym.exchangeId,
|
|
}
|
|
},
|
|
period: co.intervalSecs,
|
|
}
|
|
const json = JSON.stringify(data)
|
|
console.log('sharing data', json, data)
|
|
const snapshot = await takeSnapshot()
|
|
|
|
const code = await new Promise((resolve)=>socket.emit('share', data, snapshot, resolve))
|
|
if (code===null) return null
|
|
|
|
return import.meta.env.VITE_SHARE_URL+ '/share/'+code;
|
|
}
|
|
|
|
export async function loadShareUrl(code) {
|
|
// console.log('loading share url', code)
|
|
const data = await new Promise((resolve, reject) => {
|
|
// Set a timeout (e.g., 8 seconds)
|
|
const timeout = setTimeout(() => {
|
|
reject(new Error('Timed out waiting for response from server'));
|
|
}, 8000);
|
|
|
|
socket.emit('shared', code, (response) => {
|
|
clearTimeout(timeout);
|
|
resolve(response);
|
|
});
|
|
}).catch(err => {
|
|
// Optional: show error to user or log it
|
|
console.error('Failed to load shared URL:', err.message);
|
|
return null;
|
|
});
|
|
if (data===null) return false
|
|
console.log('loaded shared orders data', data)
|
|
const co = useChartOrderStore();
|
|
const s = useStore()
|
|
const ticker = `${data.chainId}|${data.symbol.route.exchange}|${data.symbol.base.a}|${data.symbol.quote.a}|${data.symbol.route.fee}`;
|
|
const symbol = lookupSymbol(ticker)
|
|
if (symbol===null) {
|
|
console.error('could not find symbol for ticker', ticker)
|
|
return false
|
|
}
|
|
s.chainId = data.chainId
|
|
const prefs = usePrefStore()
|
|
prefs.selectedSymbol = ticker
|
|
for (const order of data.orders) {
|
|
// force amount to be zero so that the user MUST enter a size before confirming the placement
|
|
order.amount = 0
|
|
order.amountIsTokenA = true
|
|
order.valid = false
|
|
}
|
|
co.orders = data.orders
|
|
changeIntervalSecs(data.period)
|
|
onChartReady(()=>{
|
|
setSymbol(symbol)
|
|
.catch((e)=>console.error('could not set symbol', e))
|
|
})
|
|
track('shared')
|
|
console.log('loaded orders', s.chainId, co.orders)
|
|
return true;
|
|
}
|
|
|
|
export async function takeSnapshot() {
|
|
const screenshotCanvas = await widget.takeClientScreenshot();
|
|
return await new Promise((resolve) => screenshotCanvas.toBlob(resolve));
|
|
}
|