From 1a460306bc2de717a22958020407aa9f96c0f4ed Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Wed, 6 Nov 2024 15:15:13 +0100 Subject: [PATCH] add pre and after hours market movers --- src/routes/+page.svelte | 4 +- src/routes/market-mover/+layout.svelte | 47 +-- .../market-mover/afterhours/+page.server.ts | 23 ++ .../market-mover/afterhours/+page.svelte | 280 +++++++++++++++++ .../market-mover/premarket/+page.server.ts | 23 ++ .../market-mover/premarket/+page.svelte | 289 ++++++++++++++++++ 6 files changed, 629 insertions(+), 37 deletions(-) create mode 100644 src/routes/market-mover/afterhours/+page.server.ts create mode 100644 src/routes/market-mover/afterhours/+page.svelte create mode 100644 src/routes/market-mover/premarket/+page.server.ts create mode 100644 src/routes/market-mover/premarket/+page.svelte diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 29264887..c54e9665 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -241,7 +241,7 @@ ? "Top" : marketStatus === 1 ? "Pre-Market" - : "After-Market"} Gainers @@ -318,7 +318,7 @@ ? "Top" : marketStatus === 1 ? "Pre-Market" - : "After-Market"} Losers diff --git a/src/routes/market-mover/+layout.svelte b/src/routes/market-mover/+layout.svelte index 6ad17db2..0fb8af69 100644 --- a/src/routes/market-mover/+layout.svelte +++ b/src/routes/market-mover/+layout.svelte @@ -18,44 +18,17 @@ title: "Active", path: "/market-mover/active", }, + { + title: "Pre-Market", + path: "/market-mover/premarket", + }, + { + title: "After-Hours", + path: "/market-mover/afterhours", + }, ]; let activeIdx = 0; - let timePeriod = "1D"; - let buttonText = "Top Winners"; - - function changeSection(index) { - activeIdx = index; - sortOrders = { - symbol: { order: "none", type: "string" }, - name: { order: "none", type: "string" }, - changesPercentage: { order: "none", type: "number" }, - price: { order: "none", type: "number" }, - marketCap: { order: "none", type: "number" }, - volume: { order: "none", type: "number" }, - }; - if (index === 0) { - gainerLoserActive = outputList?.gainers[timePeriod]; - buttonText = "Top Winners"; - } else if (index === 1) { - gainerLoserActive = outputList?.losers[timePeriod]; - buttonText = "Top Losers"; - } else if (index === 2) { - gainerLoserActive = outputList?.active[timePeriod]; - buttonText = "Most Active"; - } - } - - function selectTimeInterval(state) { - timePeriod = state; - if (buttonText === "Top Winners") { - gainerLoserActive = outputList?.gainers[timePeriod]; - } else if (buttonText === "Top Losers") { - gainerLoserActive = outputList?.losers[timePeriod]; - } else if (buttonText === "Most Active") { - gainerLoserActive = outputList?.active[timePeriod]; - } - } // Subscribe to the $page store to reactively update the activeIdx based on the URL $: if ($page.url.pathname === "/market-mover") { @@ -64,6 +37,10 @@ activeIdx = 1; } else if ($page.url.pathname.startsWith("/market-mover/active")) { activeIdx = 2; + } else if ($page.url.pathname.startsWith("/market-mover/premarket")) { + activeIdx = 3; + } else if ($page.url.pathname.startsWith("/market-mover/afterhours")) { + activeIdx = 4; } diff --git a/src/routes/market-mover/afterhours/+page.server.ts b/src/routes/market-mover/afterhours/+page.server.ts new file mode 100644 index 00000000..8366e8de --- /dev/null +++ b/src/routes/market-mover/afterhours/+page.server.ts @@ -0,0 +1,23 @@ +export const load = async ({ locals }) => { + const { apiURL, apiKey } = locals; + + const getMarketMover = async () => { + const postData = { params: "afterhours" }; + const response = await fetch(apiURL + "/pre-after-market-movers", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-API-KEY": apiKey, + }, + body: JSON.stringify(postData), + }); + + const output = await response.json(); + + return output; + }; + + return { + getMarketMover: await getMarketMover(), + }; +}; diff --git a/src/routes/market-mover/afterhours/+page.svelte b/src/routes/market-mover/afterhours/+page.svelte new file mode 100644 index 00000000..66553c1a --- /dev/null +++ b/src/routes/market-mover/afterhours/+page.svelte @@ -0,0 +1,280 @@ + + + + + + + {$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ""} + Afterhours Top Stocks · stocknear + + + + + + + + + + + + + + + + +
+
+
+
+ + + + +
+
+
+

+ Afterhours {categoryType === "gainers" ? "Gainers" : "Losers"} +

+ +
+ + {lastTradingDay} +
+
+
+ +
+ + + + + + {#each stockList as item} + + + + + + + + + + + + + + + {/each} + +
+ {item?.rank} + + + {item?.symbol} + + + {item?.name?.length > charNumber + ? item?.name?.slice(0, charNumber) + "..." + : item?.name} + + {#if item?.changesPercentage >= 0} + +{item?.changesPercentage >= 1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + {:else} + {item?.changesPercentage <= -1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + + {/if} + + {item?.price?.toFixed(2)} + + {item?.marketCap !== null + ? abbreviateNumber(item?.marketCap) + : "-"} + + {item?.volume !== null + ? abbreviateNumber(item?.volume) + : "-"} +
+
+
+
+
+
+
diff --git a/src/routes/market-mover/premarket/+page.server.ts b/src/routes/market-mover/premarket/+page.server.ts new file mode 100644 index 00000000..ad1d6bab --- /dev/null +++ b/src/routes/market-mover/premarket/+page.server.ts @@ -0,0 +1,23 @@ +export const load = async ({ locals }) => { + const { apiURL, apiKey } = locals; + + const getMarketMover = async () => { + const postData = { params: "premarket" }; + const response = await fetch(apiURL + "/pre-after-market-movers", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-API-KEY": apiKey, + }, + body: JSON.stringify(postData), + }); + + const output = await response.json(); + + return output; + }; + + return { + getMarketMover: await getMarketMover(), + }; +}; diff --git a/src/routes/market-mover/premarket/+page.svelte b/src/routes/market-mover/premarket/+page.svelte new file mode 100644 index 00000000..3570b98e --- /dev/null +++ b/src/routes/market-mover/premarket/+page.svelte @@ -0,0 +1,289 @@ + + + + + + + {$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ""} + Premarket Top Stocks · stocknear + + + + + + + + + + + + + + + + +
+
+
+
+ + + + +
+
+
+

+ Premarket {categoryType === "gainers" ? "Gainers" : "Losers"} +

+ +
+ + {lastTradingDay} +
+
+
+ +
+ + + + + + {#each stockList as item} + + + + + + + + + + + + + + + {/each} + +
+ {item?.rank} + + + {item?.symbol} + + + {item?.name?.length > charNumber + ? item?.name?.slice(0, charNumber) + "..." + : item?.name} + + {#if item?.changesPercentage >= 0} + +{item?.changesPercentage >= 1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + {:else} + {item?.changesPercentage <= -1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + + {/if} + + {item?.price?.toFixed(2)} + + {item?.marketCap !== null + ? abbreviateNumber(item?.marketCap) + : "-"} + + {item?.volume !== null + ? abbreviateNumber(item?.volume) + : "-"} +
+
+
+
+
+
+