add websocket back to Table.svelte

This commit is contained in:
MuslemRahimi 2025-01-10 22:31:38 +01:00
parent 19187e87d9
commit 45927896ea

View File

@ -16,6 +16,7 @@
export let data; export let data;
export let rawData; export let rawData;
export let excludedRules = new Set([ export let excludedRules = new Set([
"volume", "volume",
"price", "price",
@ -356,6 +357,16 @@
} }
} }
// Save scroll position before data changes
function saveScrollPosition() {
scrollPosition = window.scrollY;
}
// Restore scroll position after data changes
function restoreScrollPosition() {
window.scrollTo(0, scrollPosition);
}
function sendMessage(message) { function sendMessage(message) {
if (socket && socket.readyState === WebSocket.OPEN) { if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(JSON?.stringify(message)); socket.send(JSON?.stringify(message));
@ -371,6 +382,7 @@
socket.addEventListener("open", () => { socket.addEventListener("open", () => {
console.log("WebSocket connection opened"); console.log("WebSocket connection opened");
// Send only current watchlist symbols // Send only current watchlist symbols
//Only update 200 tickers because of a bug. The previous price is getting changed for tickers. To-do list.
const tickerList = rawData?.map((item) => item?.symbol) || []; const tickerList = rawData?.map((item) => item?.symbol) || [];
sendMessage(tickerList); sendMessage(tickerList);
}); });
@ -380,16 +392,19 @@
try { try {
const newList = JSON?.parse(data); const newList = JSON?.parse(data);
if (newList?.length > 0) { if (newList?.length > 0) {
stockList = calculateChange(stockList, newList); if (originalData?.some((item) => "changesPercentage" in item)) {
//stockList = updateStockList(stockList, originalData); originalData = calculateChange(originalData, newList);
stockList = updateStockList(stockList, originalData);
setTimeout(() => { setTimeout(() => {
stockList = stockList?.map((item) => ({ stockList = stockList?.map((item) => ({
...item, ...item,
previous: null, previous: null,
})); }));
}, 800); }, 800);
saveScrollPosition();
sortMode = true; sortMode = true;
} }
}
} catch (e) { } catch (e) {
console.error("Error parsing WebSocket message:", e); console.error("Error parsing WebSocket message:", e);
} }
@ -402,53 +417,20 @@
console.error("WebSocket connection error:", error); console.error("WebSocket connection error:", error);
} }
} }
/*
$: stockList = [...stockList];
$: if ($isOpen) { $: if ($isOpen) {
websocketRealtimeData(); websocketRealtimeData();
console.log("WebSocket restarted"); console.log("WebSocket restarted");
} }
afterUpdate(async () => {
// Compare only the symbols to detect changes
const currentSymbols = rawData?.map((item) => item?.symbol).sort();
const previousSymbols = previousList?.map((item) => item?.symbol).sort();
// Check if symbols have changed
if (
JSON.stringify(currentSymbols) !== JSON.stringify(previousSymbols) &&
typeof socket !== "undefined"
) {
// Update previous list
previousList = rawData;
try {
// Close existing socket if open
if (socket && socket.readyState !== WebSocket.CLOSED) {
socket?.close();
}
// Wait for socket to close
await new Promise((resolve) => {
socket?.addEventListener("close", resolve, { once: true });
});
// Reconnect with new symbols
if ($isOpen) {
await websocketRealtimeData();
console.log("WebSocket restarted due to watchlist changes");
}
} catch (error) {
console.error("Error restarting WebSocket:", error);
}
}
});
*/
onMount(async () => { onMount(async () => {
try { try {
const savedRules = localStorage?.getItem(pagePathName); const savedRules = localStorage?.getItem(pagePathName);
if (savedRules) { if (savedRules) {
const parsedRules = JSON.parse(savedRules); const parsedRules = JSON?.parse(savedRules);
// Compare and update ruleOfList based on allRows // Compare and update ruleOfList based on allRows
ruleOfList = parsedRules.map((rule) => { ruleOfList = parsedRules.map((rule) => {
@ -498,6 +480,41 @@
let previousList = []; let previousList = [];
let reconnectionTimeout; let reconnectionTimeout;
afterUpdate(async () => {
// Compare only the symbols to detect changes
const currentSymbols = rawData?.map((item) => item?.symbol).sort();
const previousSymbols = previousList?.map((item) => item?.symbol).sort();
// Check if symbols have changed
if (
JSON.stringify(currentSymbols) !== JSON.stringify(previousSymbols) &&
typeof socket !== "undefined"
) {
// Update previous list
previousList = rawData;
try {
// Close existing socket if open
if (socket && socket.readyState !== WebSocket.CLOSED) {
socket?.close();
}
// Wait for socket to close
await new Promise((resolve) => {
socket?.addEventListener("close", resolve, { once: true });
});
// Reconnect with new symbols
if ($isOpen) {
await websocketRealtimeData();
console.log("WebSocket restarted due to watchlist changes");
}
} catch (error) {
console.error("Error restarting WebSocket:", error);
}
}
});
onDestroy(() => { onDestroy(() => {
try { try {
// Clear any pending reconnection timeout // Clear any pending reconnection timeout
@ -595,11 +612,6 @@
} }
} }
stockList = stockList?.map((item) => ({
...item,
previous: null,
}));
// If input is false, cycle through 'none', 'asc', 'desc' for the clicked key // If input is false, cycle through 'none', 'asc', 'desc' for the clicked key
if (!input) { if (!input) {
const orderCycle = ["none", "asc", "desc"]; const orderCycle = ["none", "asc", "desc"];