From 3f36e6909f146ed6557b8fd160b173e65f77a289 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Thu, 27 Feb 2025 19:04:59 +0100 Subject: [PATCH] clean code --- src/routes/earnings-calendar/+page.server.ts | 3 +- src/routes/heatmap/+page.svelte | 126 ++++++++++++------- 2 files changed, 81 insertions(+), 48 deletions(-) diff --git a/src/routes/earnings-calendar/+page.server.ts b/src/routes/earnings-calendar/+page.server.ts index 49c3356b..9930dc79 100644 --- a/src/routes/earnings-calendar/+page.server.ts +++ b/src/routes/earnings-calendar/+page.server.ts @@ -1,4 +1,4 @@ -export const load = async ({ locals, setHeaders }) => { +export const load = async ({ locals }) => { const getEarningsCalendar = async () => { const { apiKey, apiURL } = locals; // make the POST request to the endpoint @@ -11,7 +11,6 @@ export const load = async ({ locals, setHeaders }) => { }); const output = await response.json(); - setHeaders({ "cache-control": "public, max-age=3000" }); return output; }; diff --git a/src/routes/heatmap/+page.svelte b/src/routes/heatmap/+page.svelte index eee590f9..5bd9be16 100644 --- a/src/routes/heatmap/+page.svelte +++ b/src/routes/heatmap/+page.svelte @@ -3,38 +3,71 @@ import { Button } from "$lib/components/shadcn/button/index.js"; import SEO from "$lib/components/SEO.svelte"; import { setCache, getCache } from "$lib/store"; - import { onDestroy } from "svelte"; + import { onDestroy, onMount } from "svelte"; import toast from "svelte-french-toast"; export let data; let isLoaded = false; + let isLoading = true; - let rawData = data?.getData; + let rawData; let iframe: HTMLIFrameElement; - let selectedFormat: "png" | "jpeg" | "svg" = "png"; let selectedTimePeriod = "1D"; - let iframeUrl: string; + let iframeUrl; - async function getHeatMap() { - const cachedData = getCache(selectedTimePeriod, "getHeatmap"); - if (cachedData) { - rawData = cachedData; - } else { - const postData = { params: selectedTimePeriod }; - const response = await fetch("/api/heatmap", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(postData), - }); + onMount(async () => { + await getHeatMap("1D"); + }); - rawData = await response.json(); - setCache(selectedTimePeriod, rawData, "getHeatmap"); + async function getHeatMap(timePeriod) { + selectedTimePeriod = timePeriod; + isLoading = true; + + try { + const cachedData = getCache(selectedTimePeriod, "getHeatmap"); + if (cachedData) { + rawData = cachedData; + } else { + const postData = { params: selectedTimePeriod }; + const response = await fetch("/api/heatmap", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(postData), + }); + + rawData = await response.json(); + setCache(selectedTimePeriod, rawData, "getHeatmap"); + } + + const blob = new Blob([rawData], { type: "text/html" }); + if (iframeUrl) { + URL.revokeObjectURL(iframeUrl); + } + iframeUrl = URL.createObjectURL(blob); + + // Wait for iframe to load before considering it ready + if (iframe) { + const loadPromise = new Promise((resolve) => { + iframe.onload = () => resolve(); + }); + + // Set a timeout to prevent hanging if iframe doesn't load properly + const timeoutPromise = new Promise((resolve) => { + setTimeout(() => resolve(), 50); + }); + + await Promise.race([loadPromise, timeoutPromise]); + } + + isLoaded = true; + } catch (error) { + console.error("Error loading heatmap:", error); + toast.error("Failed to load heatmap. Please try again."); + } finally { + isLoading = false; } - - const blob = new Blob([rawData], { type: "text/html" }); - iframeUrl = URL.createObjectURL(blob); } async function downloadPlot(item) { @@ -85,19 +118,15 @@ ); } + function handleIframeLoad() { + // This will be triggered when the iframe has fully loaded + isLoaded = true; + isLoading = false; + } + onDestroy(() => { if (iframeUrl) URL.revokeObjectURL(iframeUrl); }); - - $: { - if (selectedTimePeriod && typeof window !== "undefined") { - (async () => { - isLoaded = false; - getHeatMap(); - isLoaded = true; - })(); - } - } Time Period
-
- {#if isLoaded} - {#if rawData} -