protect endpoints

This commit is contained in:
MuslemRahimi 2024-09-23 00:03:09 +02:00
parent c441ce6fd3
commit 2827d4dde3
56 changed files with 309 additions and 557 deletions

View File

@ -31,13 +31,12 @@
if (cachedData) { if (cachedData) {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = { ticker: ticker }; const postData = { ticker: ticker, path: 'analyst-insight' };
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + "/analyst-insight", { const response = await fetch("/api/ticker-data", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });

View File

@ -184,12 +184,12 @@ function findLowestAndHighestFee(data, lastDateStr) {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'borrowed-share'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/borrowed-share', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json",
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -169,17 +169,17 @@ const getClinicalTrial = async (ticker) => {
displayList = cachedData; displayList = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'clinical-trial'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/clinical-trial', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
rawData = await response.json(); rawData = await response?.json();
displayList = rawData; displayList = rawData;
// Cache the data for this specific tickerID with a specific name 'getClinicalTrial' // Cache the data for this specific tickerID with a specific name 'getClinicalTrial'
setCache(ticker, rawData, 'getClinicalTrial'); setCache(ticker, rawData, 'getClinicalTrial');

View File

@ -106,12 +106,12 @@ const getCorporateLobbing = async (ticker) => {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'corporate-lobbying'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/corporate-lobbying', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -33,15 +33,15 @@
rawData = cachedData; rawData = cachedData;
} else { } else {
try { try {
const response = await fetch(data?.apiURL+'/correlation-ticker', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey "X-API-KEY": data?.apiKey
}, },
body: JSON.stringify({ ticker }) body: JSON.stringify({ ticker:ticker, path: 'correlation-ticker' })
}); });
rawData = (await response.json()) || []; rawData = (await response?.json()) || [];
+ +
setCache(ticker, rawData, 'getCorrelation'); setCache(ticker, rawData, 'getCorrelation');
} catch (error) { } catch (error) {

View File

@ -190,13 +190,12 @@ async function getFairPrice(ticker) {
fairPrice = cachedData; fairPrice = cachedData;
} else { } else {
try { try {
const response = await fetch(data?.apiURL+'/fair-price', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey
}, },
body: JSON.stringify({ ticker }) body: JSON.stringify({ ticker: ticker, path: 'fair-price' })
}); });
fairPrice = await response.json(); fairPrice = await response.json();

View File

@ -167,12 +167,12 @@ const getDarkPool = async (ticker) => {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'dark-pool'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/dark-pool', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
@ -192,7 +192,7 @@ const getDarkPool = async (ticker) => {
$: { $: {
if($assetType === 'stock' ? $stockTicker :$etfTicker && typeof window !== 'undefined') { if($assetType === 'stock' ? $stockTicker :$etfTicker && typeof window !== 'undefined') {
isLoaded=false; isLoaded=false;
const ticker = $assetType === 'stock' ? $stockTicker :$etfTicker const ticker = $assetType === 'stock' ? $stockTicker : $etfTicker
const asyncFunctions = [ const asyncFunctions = [
getDarkPool(ticker) getDarkPool(ticker)
]; ];

View File

@ -137,12 +137,12 @@ const getEnterPriseValues = async (ticker) => {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'enterprise-values'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/enterprise-values', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -6,11 +6,6 @@
//export let executiveList; //export let executiveList;
let executiveList = []; let executiveList = [];
let apiURL = import.meta.env.VITE_USEAST_API_URL;
let apiKey = import.meta.env.VITE_STOCKNEAR_API_KEY;
let isLoaded = false; let isLoaded = false;
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
@ -25,11 +20,11 @@ async function fetchData() {
executiveList = $clientSideCache[$stockTicker]?.getExecutives; executiveList = $clientSideCache[$stockTicker]?.getExecutives;
} }
else { else {
const postData = { ticker: $stockTicker}; const postData = { ticker: $stockTicker, path: 'get-executives'};
const response = await fetch(apiURL+'/get-executives', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -179,12 +179,12 @@ function findLowestAndHighestPrice(data, lastDateStr) {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'fail-to-deliver'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/fail-to-deliver', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -24,12 +24,12 @@ const getFundamentalAnalysis = async (ticker) => {
fundamentalAnalysisDict = cachedData; fundamentalAnalysisDict = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'fundamental-predictor-analysis'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/fundamental-predictor-analysis', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -154,17 +154,17 @@ use([BarChart, GridComponent, CanvasRenderer])
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'government-contract'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/government-contract', { const response = await fetch('/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
rawData = (await response.json()); rawData = await response?.json();
// Cache the data for this specific tickerID with a specific name 'getGovernmentContract' // Cache the data for this specific tickerID with a specific name 'getGovernmentContract'
setCache(ticker, rawData, 'getGovernmentContract'); setCache(ticker, rawData, 'getGovernmentContract');
} }

View File

@ -188,17 +188,17 @@ function changeStatement(event)
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'implied-volatility'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/implied-volatility', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
rawData = (await response.json()); rawData = await response?.json();
// Cache the data for this specific tickerID with a specific name 'getImpliedVolatility' // Cache the data for this specific tickerID with a specific name 'getImpliedVolatility'
setCache(ticker, rawData, 'getImpliedVolatility'); setCache(ticker, rawData, 'getImpliedVolatility');
} }

View File

@ -166,17 +166,17 @@ const getMarketMaker = async (ticker) => {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'market-maker'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/market-maker', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
rawData = await response.json(); rawData = await response?.json();
// Cache the data for this specific tickerID with a specific name 'getMarketMaker' // Cache the data for this specific tickerID with a specific name 'getMarketMaker'
setCache(ticker, rawData, 'getMarketMaker'); setCache(ticker, rawData, 'getMarketMaker');
} }

View File

@ -42,17 +42,17 @@ const getOptionsBubble = async (ticker) => {
optionsDict = cachedData; optionsDict = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'options-bubble'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/options-bubble', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
optionsDict = await response.json(); optionsDict = await response?.json();
// Cache the data for this specific tickerID with a specific name 'getOptionsBubble' // Cache the data for this specific tickerID with a specific name 'getOptionsBubble'
setCache(ticker, optionsDict, 'getOptionsBubble'); setCache(ticker, optionsDict, 'getOptionsBubble');

View File

@ -152,12 +152,12 @@
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'options-net-flow-ticker'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/options-net-flow-ticker', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -145,12 +145,12 @@ const getPriceAnalysis = async (ticker) => {
priceAnalysisDict = cachedData; priceAnalysisDict = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'price-analysis'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/price-analysis', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -204,12 +204,12 @@ const getRetailVolume = async (ticker) => {
historyData = rawData?.history; historyData = rawData?.history;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'retail-volume'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/retail-volume', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -8,8 +8,6 @@
import InfoModal from "$lib/components/InfoModal.svelte"; import InfoModal from "$lib/components/InfoModal.svelte";
export let userTier; export let userTier;
export let apiURL;
export let apiKey;
let isLoaded = false; let isLoaded = false;
@ -128,18 +126,17 @@
if (cachedData) { if (cachedData) {
revenueSegmentation = cachedData; revenueSegmentation = cachedData;
} else { } else {
const postData = { ticker: ticker }; const postData = { ticker: ticker, path: 'revenue-segmentation' };
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(apiURL + "/revenue-segmentation", { const response = await fetch("/api/ticker-data", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });
revenueSegmentation = await response.json(); revenueSegmentation = await response?.json();
// Cache the data for this specific tickerID with a specific name 'getRevenueSegmentation' // Cache the data for this specific tickerID with a specific name 'getRevenueSegmentation'
setCache(ticker, revenueSegmentation, "getRevenueSegmentation"); setCache(ticker, revenueSegmentation, "getRevenueSegmentation");

View File

@ -7,9 +7,6 @@ import { fade } from 'svelte/transition';
let secFilingsList; let secFilingsList;
let apiURL = import.meta.env.VITE_USEAST_API_URL;
let apiKey = import.meta.env.VITE_STOCKNEAR_API_KEY;
let displayList = []; let displayList = [];
let accordionOpen = {}; let accordionOpen = {};
@ -86,11 +83,11 @@ async function fetchData() {
secFilingsList = $clientSideCache[$stockTicker]?.getSECFilings; secFilingsList = $clientSideCache[$stockTicker]?.getSECFilings;
} }
else { else {
const postData = { ticker: $stockTicker}; const postData = { ticker: $stockTicker, path: 'get-sec-filings'};
const response = await fetch(apiURL+'/get-sec-filings', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -5,10 +5,6 @@
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import Search from "lucide-svelte/icons/search"; import Search from "lucide-svelte/icons/search";
export let apiURL;
export let apiKey;
let dataLoaded = false; // Flag to track data loading let dataLoaded = false; // Flag to track data loading
let assetType = ''; let assetType = '';
@ -27,10 +23,10 @@
else { else {
dataLoaded = true; dataLoaded = true;
// make the GET request to the endpoint // make the GET request to the endpoint
const response = await fetch(apiURL+'/searchbar-data', { const response = await fetch('/api/searchbar-data', {
method: 'GET', method: 'GET',
headers: { headers: {
"Content-Type": "application/json","X-API-KEY": apiKey "Content-Type": "application/json"
}, },
}); });

View File

@ -33,12 +33,12 @@ const getSentimentAnalysis = async (ticker) => {
sentimentList = cachedData; sentimentList = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'sentiment-analysis'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/sentiment-analysis', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -91,12 +91,12 @@ const getShareholders = async (ticker) => {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'shareholders'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/shareholders', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -121,17 +121,17 @@ const getShareStatistics = async (ticker) => {
rawData = cachedData; rawData = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'share-statistics'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/share-statistics', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
rawData = await response.json(); rawData = await response?.json();
// Cache the data for this specific tickerID with a specific name 'getShareStatistics' // Cache the data for this specific tickerID with a specific name 'getShareStatistics'
setCache(ticker, rawData, 'getShareStatistics'); setCache(ticker, rawData, 'getShareStatistics');

View File

@ -170,19 +170,19 @@
return option; return option;
} }
async function getSwapData(ticker) { async function getSwapData(ticker) {
const cachedData = getCache(ticker, 'getSwapData'); const cachedData = getCache(ticker, 'getSwapData');
if (cachedData) { if (cachedData) {
rawData = cachedData; rawData = cachedData;
} else { } else {
try { try {
const response = await fetch(`${data?.apiURL}/swap-ticker`, { const postData = {ticker: ticker, path: 'swap-ticker'}
const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey
}, },
body: JSON.stringify({ ticker }) body: JSON.stringify(postData)
}); });
if (!response.ok) throw new Error('API request failed'); if (!response.ok) throw new Error('API request failed');
rawData = await response.json(); rawData = await response.json();
@ -194,7 +194,6 @@
} }
$swapComponent = rawData?.length !== 0; $swapComponent = rawData?.length !== 0;
} }
$: if ($stockTicker && typeof window !== 'undefined') { $: if ($stockTicker && typeof window !== 'undefined') {
isLoaded = false; isLoaded = false;

View File

@ -28,15 +28,14 @@ async function getTaRating(ticker) {
rawData = cachedData; rawData = cachedData;
} else { } else {
try { try {
const response = await fetch(data?.apiURL+'/stock-rating', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey
}, },
body: JSON.stringify({ ticker }) body: JSON.stringify({ ticker: ticker, path: 'stock-rating' })
}); });
rawData = await response.json(); rawData = await response?.json();
setCache(ticker, rawData, 'getTaRating'); setCache(ticker, rawData, 'getTaRating');
} catch (error) { } catch (error) {

View File

@ -34,12 +34,12 @@ const getTrendAnalysis = async (ticker) => {
trendList = cachedData; trendList = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, path: 'trend-analysis'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/trend-analysis', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -113,12 +113,12 @@ function getPlotOptions() {
varDict = cachedData; varDict = cachedData;
} else { } else {
const postData = {'ticker': ticker}; const postData = {'ticker': ticker, 'path': 'value-at-risk'};
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/value-at-risk', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -6,9 +6,7 @@
import InfoModal from '$lib/components/InfoModal.svelte'; import InfoModal from '$lib/components/InfoModal.svelte';
export let watchListId; export let watchListId;
export let apiKey;
export let apiURL;
const sortTickersByName = (tickerList) => { const sortTickersByName = (tickerList) => {
@ -126,18 +124,18 @@ async function getWatchlistData()
const postData = {'watchListId': watchListId} const postData = {'watchListId': watchListId}
const response = await fetch(apiURL+'/get-watchlist', { const response = await fetch('/api/get-watchlist', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json","X-API-KEY": apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
const output = await response.json(); const output = await response?.json();
try { try {
watchList = sortTickersByChange(output[0]); watchList = sortTickersByChange(output?.at(0));
} }
catch(e) { catch(e) {
watchList = [] watchList = []

View File

@ -1,13 +1,10 @@
export const load = ({ locals, cookies }) => { export const load = ({ locals, cookies }) => {
const { user, isUSRegion, apiURL, fastifyURL, wsURL, apiKey } = locals; const { user, isUSRegion, wsURL } = locals;
return { return {
user: user || undefined, user: user || undefined,
isUSRegion, isUSRegion,
cookieConsent: cookies?.get("cookie-consent"), cookieConsent: cookies?.get("cookie-consent"),
apiURL,
fastifyURL,
wsURL, wsURL,
apiKey,
}; };
}; };

View File

@ -628,7 +628,7 @@ $: {
autocomplete="off" autocomplete="off"
/> />
--> -->
<Searchbar apiURL={data?.apiURL} apiKey={data?.apiKey}/> <Searchbar/>
<NotificationBell <NotificationBell
data={data} data={data}

View File

@ -0,0 +1,24 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = {
ticker: data?.ticker,
quarter: data?.quarter,
year: data?.year,
};
const response = await fetch(apiURL + "/earnings-call-transcripts", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,20 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { ticker: data?.ticker, timePeriod: data?.timePeriod };
const response = await fetch(apiURL + "/export-price-data", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,20 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { watchListId: data?.watchListId };
const response = await fetch(apiURL + "/get-watchlist", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,20 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { ticker: data?.ticker, timePeriod: data?.timePeriod };
const response = await fetch(apiURL + "/historical-price", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,20 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { parameter: data?.parameter };
const response = await fetch(apiURL + "/info-text", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,20 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { transactionId: data?.transactionId };
const response = await fetch(apiURL + "/options-daily-transactions", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,17 @@
import type { RequestHandler } from "./$types";
export const GET: RequestHandler = async ({ locals }) => {
const { apiURL, apiKey } = locals;
const response = await fetch(apiURL + "/searchbar-data", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
});
const output = await response?.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,21 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { ruleOfList: data?.ruleOfList };
const response = await fetch(apiURL + "/stock-screener-data", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response?.json();
return new Response(JSON.stringify(output));
};

View File

@ -0,0 +1,20 @@
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const { apiURL, apiKey } = locals;
const postData = { ticker: data?.ticker };
const response = await fetch(apiURL + "/" + data?.path, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return new Response(JSON.stringify(output));
};

View File

@ -25,10 +25,10 @@ async function loadSearchData() {
else { else {
// make the GET request to the endpoint // make the GET request to the endpoint
const response = await fetch(data?.apiURL+'/searchbar-data', { const response = await fetch('/api/searchbar-data', {
method: 'GET', method: 'GET',
headers: { headers: {
"Content-Type": "application/json","X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
}); });

View File

@ -291,10 +291,10 @@
timePeriod: timePeriod, timePeriod: timePeriod,
}; };
const response = await fetch(data?.apiURL+'/historical-price', { const response = await fetch('/api/historical-price', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -1,153 +0,0 @@
// lib/workers/test.ts
let apiKey = import.meta.env.VITE_STOCKNEAR_API_KEY;
async function getOneDayPrice(ticker: string, apiURL: string) {
let oneDayPrice = [];
try {
const postData = { ticker: ticker };
const response = await fetch(apiURL + "/one-day-price", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
oneDayPrice = await response.json();
oneDayPrice = oneDayPrice?.map((item) => ({
time: Date.parse(item?.time),
open: item?.open !== null ? item?.open : NaN,
high: item?.high !== null ? item?.high : NaN,
low: item?.low !== null ? item?.low : NaN,
close: item?.close !== null ? item?.close : NaN,
}));
// Set worker status to finished and send chart data
return oneDayPrice;
} catch (error) {
// Set worker status to idle and send error message
return oneDayPrice;
}
}
async function getHistoricalPrice(ticker: string, apiURL: string) {
let oneWeekPrice;
let oneMonthPrice;
let sixMonthPrice;
let oneYearPrice;
let threeYearPrice;
try {
const postData = { ticker: ticker };
const response = await fetch(apiURL + "/historical-price", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const pastPriceList = await response.json();
oneWeekPrice = pastPriceList["1W"]?.map(
({ time, open, high, low, close }) => ({
time: Date.parse(time),
open,
high,
low,
close,
}),
);
oneMonthPrice = pastPriceList["1M"]?.map(
({ time, open, high, low, close }) => ({
time: Date.parse(time),
open,
high,
low,
close,
}),
);
sixMonthPrice = pastPriceList["6M"]?.map(
({ time, open, high, low, close }) => ({
time: Date.parse(time),
open,
high,
low,
close,
}),
);
oneYearPrice = pastPriceList["1Y"]?.map(
({ time, open, high, low, close }) => ({
time: Date.parse(time),
open,
high,
low,
close,
}),
);
threeYearPrice = pastPriceList["MAX"]?.map(
({ time, open, high, low, close }) => ({
time: Date.parse(time),
open,
high,
low,
close,
}),
);
// Set worker status to finished and send chart data
return {
oneWeekPrice,
oneMonthPrice,
sixMonthPrice,
oneYearPrice,
threeYearPrice,
pastPriceList,
};
} catch (error) {
// Set worker status to idle and send error message
return {};
}
}
onmessage = async (event: MessageEvent) => {
const ticker = event.data?.message?.ticker;
const apiURL = event.data?.message?.apiURL;
//console.log(ticker, apiURL);
try {
const [output, oneDayPrice] = await Promise.all([
getHistoricalPrice(ticker, apiURL),
getOneDayPrice(ticker, apiURL),
]);
const oneWeekPrice = output?.oneWeekPrice;
const oneMonthPrice = output?.oneMonthPrice;
const sixMonthPrice = output?.sixMonthPrice;
const oneYearPrice = output?.oneYearPrice;
const threeYearPrice = output?.threeYearPrice;
const pastPriceList = output?.pastPriceList;
const chartData = {
oneDayPrice,
oneWeekPrice,
oneMonthPrice,
sixMonthPrice,
oneYearPrice,
threeYearPrice,
pastPriceList,
};
//console.log(pastPriceList)
postMessage({ message: "success", chartData });
} catch (e) {
postMessage({ message: "error", e });
}
// Sending data back to the main thread
//postMessage({ message: 'Data received in the worker'});
};
export {};

View File

@ -29,10 +29,10 @@ async function loadSearchData() {
else { else {
// make the GET request to the endpoint // make the GET request to the endpoint
const response = await fetch(data?.apiURL+'/searchbar-data', { const response = await fetch('/api/searchbar-data', {
method: 'GET', method: 'GET',
headers: { headers: {
"Content-Type": "application/json","X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
}); });

View File

@ -318,10 +318,10 @@ async function historicalPrice(timePeriod:string) {
timePeriod: timePeriod, timePeriod: timePeriod,
}; };
const response = await fetch(data?.apiURL+'/historical-price', { const response = await fetch('/api/historical-price', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
@ -416,11 +416,11 @@ async function initializePrice() {
async function getPrePostQuote() { async function getPrePostQuote() {
if(!$isOpen) { if(!$isOpen) {
const postData = { ticker: $etfTicker}; const postData = { ticker: $etfTicker, path: 'pre-post-quote'};
const response = await fetch(data?.apiURL+'/pre-post-quote', { const response = await fetch('/api/ticker-data', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });
@ -729,16 +729,15 @@ async function initializePrice() {
timePeriod: timePeriod, timePeriod: timePeriod,
}; };
const response = await fetch(data?.apiURL + "/export-price-data", { const response = await fetch("/api/export-price-data", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });
const output = (await response?.json()) ?? []; const output = await response?.json() ?? [];
setCache($etfTicker, output, "exportPriceData" + timePeriod); setCache($etfTicker, output, "exportPriceData" + timePeriod);
return output; return output;

View File

@ -31,16 +31,15 @@ let activeIdx = 0;
}; };
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + "/options-daily-transactions", { const response = await fetch("/api/options-daily-transactions", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });
output = await response.json(); output = await response?.json();
setCache(transactionId, output, "getDailyTransactions"); setCache(transactionId, output, "getDailyTransactions");
} }

View File

@ -229,7 +229,7 @@ async function getInfoText(parameter, title) {
infoText = cachedData; infoText = cachedData;
} else { } else {
const postData = { parameter }; const postData = { parameter };
const response = await fetch(data?.apiURL + "/info-text", { const response = await fetch("/api/info-text", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -406,7 +406,7 @@ const loadWorker = async () => {
}; };
const updateStockScreenerData = async () => { const updateStockScreenerData = async () => {
downloadWorker.postMessage({ ruleOfList: ruleOfList, apiURL: data?.apiURL, apiKey: data?.apiKey }); downloadWorker.postMessage({ ruleOfList: ruleOfList});
}; };
function handleAddRule() { function handleAddRule() {

View File

@ -22,7 +22,7 @@ const getStockScreenerData = async (rules, apiKey, apiURL) => {
// Function to check and add missing EMA parameters // Function to check and add missing EMA parameters
const ensureAllEmaParameters = (params) => { const ensureAllEmaParameters = (params) => {
const includedEmaParameters = params.filter((param) => const includedEmaParameters = params.filter((param) =>
emaParameters.includes(param), emaParameters.includes(param)
); );
if (includedEmaParameters.length > 0) { if (includedEmaParameters.length > 0) {
emaParameters.forEach((param) => { emaParameters.forEach((param) => {
@ -47,11 +47,10 @@ const getStockScreenerData = async (rules, apiKey, apiURL) => {
// Fetch new data if it's not in the cache // Fetch new data if it's not in the cache
const postData = { ruleOfList: getRuleOfList }; const postData = { ruleOfList: getRuleOfList };
const response = await fetch(apiURL + "/stock-screener-data", { const response = await fetch("/api/stock-screener-data", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });
@ -76,9 +75,9 @@ onmessage = async (event) => {
value !== undefined && value !== undefined &&
(typeof value !== "object" || (typeof value !== "object" ||
Object.values(value)?.every( Object.values(value)?.every(
(subValue) => subValue !== null && subValue !== undefined, (subValue) => subValue !== null && subValue !== undefined
)), ))
), )
); );
postMessage({ message: "success", stockScreenerData }); postMessage({ message: "success", stockScreenerData });

View File

@ -17,11 +17,10 @@
return; return;
} else { } else {
// make the GET request to the endpoint // make the GET request to the endpoint
const response = await fetch(data?.apiURL + "/searchbar-data", { const response = await fetch("/api/searchbar-data", {
method: "GET", method: "GET",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
}); });

View File

@ -280,11 +280,10 @@ async function historicalPrice(timePeriod: string) {
timePeriod: timePeriod, timePeriod: timePeriod,
}; };
const response = await fetch(data?.apiURL + "/historical-price", { const response = await fetch("/api/historical-price", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });
@ -375,12 +374,11 @@ async function historicalPrice(timePeriod: string) {
async function getPrePostQuote() { async function getPrePostQuote() {
if (!$isOpen) { if (!$isOpen) {
const postData = { ticker: $stockTicker }; const postData = { ticker: $stockTicker, path: 'pre-post-quote' };
const response = await fetch(data?.apiURL + "/pre-post-quote", { const response = await fetch("/api/ticker-data", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });
@ -605,7 +603,7 @@ async function historicalPrice(timePeriod: string) {
timePeriod: timePeriod, timePeriod: timePeriod,
}; };
const response = await fetch(data?.apiURL + "/export-price-data", { const response = await fetch("/api/export-price-data", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",

View File

@ -41,10 +41,10 @@
year: year year: year
}; };
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + '/earnings-call-transcripts', { const response = await fetch('/api/earnings-call-transcripts', {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "X-API-KEY": data?.apiKey "Content-Type": "application/json"
}, },
body: JSON.stringify(postData) body: JSON.stringify(postData)
}); });

View File

@ -31,11 +31,10 @@ let activeIdx = 0;
}; };
// make the POST request to the endpoint // make the POST request to the endpoint
const response = await fetch(data?.apiURL + "/options-daily-transactions", { const response = await fetch("/api/options-daily-transactions", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-API-KEY": data?.apiKey,
}, },
body: JSON.stringify(postData), body: JSON.stringify(postData),
}); });

View File

@ -208,7 +208,7 @@ updateYearRange()
<!--Start RevenueSegmentation--> <!--Start RevenueSegmentation-->
<Lazy> <Lazy>
<div class="w-full pt-10 sm:pb-6 sm:pt-6 m-auto {!$revenueSegmentationComponent ? 'hidden' : ''}"> <div class="w-full pt-10 sm:pb-6 sm:pt-6 m-auto {!$revenueSegmentationComponent ? 'hidden' : ''}">
<RevenueSegmentation apiURL={data?.apiURL} apiKey={data?.apiKey} userTier={data?.user?.tier} /> <RevenueSegmentation userTier={data?.user?.tier} />
</div> </div>
</Lazy> </Lazy>
<!--End RevenueSegmentation--> <!--End RevenueSegmentation-->

View File

@ -1,209 +0,0 @@
<script lang='ts'>
import { goto } from '$app/navigation';
import { screenWidth, numberOfUnreadNotification, etfTicker, stockTicker } from '$lib/store';
import { abbreviateNumber} from '$lib/utils';
import logo from '$lib/images/trending_logo.png';
import { fly } from 'svelte/transition';
import InfiniteLoading from '$lib/components/InfiniteLoading.svelte';
export let data;
let rawData = data?.getTrendingStocks;
let trendingList = rawData?.slice(0,20);
async function infiniteHandler({ detail: { loaded, complete } })
{
if (trendingList?.length === rawData?.length) {
complete();
} else {
const nextIndex = trendingList?.length;
const newArticles = rawData?.slice(nextIndex, nextIndex + 5);
trendingList = [...trendingList, ...newArticles];
loaded();
}
}
async function assetSelector(symbol, assetType)
{
if(assetType === 'etf')
{
etfTicker.update(value => symbol);
goto(`/etf/${symbol}`)
}
else if(assetType === 'stock') {
stockTicker.update(value => symbol);
goto(`/stocks/${symbol}`)
}
}
let charNumber = 25;
$: {
if ($screenWidth < 640)
{
charNumber = 11;
}
else {
charNumber = 25;
}
}
</script>
<!-- HEADER FOR BETTER SEO -->
<svelte:head>
<title> {$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ''} Today's Top Trending Stocks · stocknear</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<meta name="description" content="A list of the most popular stocks today based on pageviews. The list is updated every 15 min.">
<!-- Other meta tags -->
<meta property="og:title" content="Today's Top Trending Stocks · stocknear"/>
<meta property="og:description" content="A list of the most popular stocks today based on pageviews. The list is updated every 15 min.">
<meta property="og:image" content="https://stocknear-pocketbase.s3.amazonaws.com/logo/meta_logo.jpg"/>
<meta property="og:type" content="website"/>
<!-- Add more Open Graph meta tags as needed -->
<!-- Twitter specific meta tags -->
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:title" content="Today's Top Trending Stocks · stocknear"/>
<meta name="twitter:description" content="A list of the most popular stocks today based on pageviews. The list is updated every 15 min.">
<meta name="twitter:image" content="https://stocknear-pocketbase.s3.amazonaws.com/logo/meta_logo.jpg"/>
<!-- Add more Twitter meta tags as needed -->
</svelte:head>
<section in:fly={{ x: -10, duration: 150, delay:150 }} out:fly={{ x: 5, duration: 150 }} class="w-full max-w-4xl overflow-hidden m-auto min-h-screen pt-5 pb-40">
<!--
<div class="text-sm breadcrumbs ml-4">
<ul>
<li><a href="/" class="text-gray-300">Home</a></li>
<li class="text-gray-300">Today's Top Trending Stocks</li>
</ul>
</div>
-->
<div class="w-full max-w-4xl m-auto sm:bg-[#09090B] sm:rounded-xl h-auto pl-10 pr-10 pt-5 sm:pb-10 sm:pt-10 mt-3 mb-8">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-10">
<!-- Start Column -->
<div>
<div class="flex flex-row justify-center items-center">
<h1 class="text-3xl sm:text-4xl text-white text-center font-bold mb-5">
Trending Stocks
</h1>
</div>
<span class="text-white text-md font-medium text-center flex justify-center items-center ">
Get the latest data on the top-viewed stock in the last 24 hours.
</span>
</div>
<!-- End Column -->
<!-- Start Column -->
<div class="hidden sm:block relative m-auto mb-5 mt-5 sm:mb-0 sm:mt-0">
<svg class="w-40 -my-10" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="glow">
<feGaussianBlur stdDeviation="5" result="glow"/>
<feMerge>
<feMergeNode in="glow"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<path fill="#1E40AF" d="M57.6,-58.7C72.7,-42.6,81.5,-21.3,82,0.5C82.5,22.3,74.7,44.6,59.7,60.1C44.6,75.6,22.3,84.3,0,84.3C-22.3,84.2,-44.6,75.5,-61.1,60.1C-77.6,44.6,-88.3,22.3,-87.6,0.7C-86.9,-20.8,-74.7,-41.6,-58.2,-57.7C-41.6,-73.8,-20.8,-85.2,0.2,-85.4C21.3,-85.6,42.6,-74.7,57.6,-58.7Z" transform="translate(100 100)" filter="url(#glow)" />
</svg>
<div class="z-1 absolute -top-7 right-11">
<img class="w-20" src={logo} alt="logo" loading="lazy">
</div>
</div>
<!-- End Column -->
</div>
</div>
<!-- Page wrapper -->
<div class="flex justify-center w-full max-w-5xl m-auto h-full overflow-hidden">
<!-- Content area -->
<div class="w-screen sm:w-full relative flex flex-col flex-1 overflow-hidden overflow-x-auto">
<table class="table table-sm sm:table-md table-compact rounded-none sm:rounded-md w-full border-bg-[#09090B] m-auto mt-4 overflow-x-auto">
<thead>
<tr>
<td class="text-slate-200 font-medium text-sm text-start">No.</td>
<th class="text-slate-200 font-medium text-sm text-start">Symbol</th>
<td class="text-slate-200 hidden sm:table-cell font-medium text-sm text-start">Company Name</td>
<td class="text-slate-200 font-medium text-sm text-end">Views</td>
<td class="text-slate-200 font-medium text-sm text-end">Market Cap</td>
<td class="text-slate-200 font-medium text-end text-sm">Volume</td>
<td class="text-slate-200 font-medium text-sm text-end">EPS</td>
</tr>
</thead>
<tbody>
{#each trendingList as item,index}
<!-- row -->
<tr on:click={() => assetSelector(item?.symbol, item?.assetType)} class="sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-[#27272A] border-b-[#09090B] shake-ticker cursor-pointer">
<td class="text-gray-200 pb-3 text-md text-start">
{index+1}
</td>
<th class="text-blue-400 font-normal">
{item?.symbol}
</th>
<td class="text-gray-200 pb-3 hidden sm:table-cell">
{item?.name?.length > charNumber ? item?.name?.slice(0,charNumber) + "..." : item?.name}
</td>
<td class="text-end text-white">
{item?.views}
</td>
<td class="text-white text-end">
{item?.marketCap !== null ? abbreviateNumber(item?.marketCap,true) : '-'}
</td>
<td class="text-white text-end">
{item?.volume !== null ? abbreviateNumber(item?.volume) : '-'}
</td>
<td class="text-white text-end w-10">
{item?.eps !== null ? item?.eps?.toFixed(2) : '-'}
</td>
</tr>
{/each}
</tbody>
</table>
<InfiniteLoading on:infinite={infiniteHandler} />
</div>
</section>

View File

@ -1,35 +0,0 @@
import { getCache, setCache } from "$lib/store";
export const load = async ({ parent }) => {
const getTrendingStocks = async () => {
let output;
// Get cached data for the specific tickerID
const cachedData = getCache("", "getTrendingStocks");
if (cachedData) {
output = cachedData;
} else {
const { apiKey, apiURL } = await parent();
// make the POST request to the endpoint
const response = await fetch(apiURL + "/trending", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
});
output = await response.json();
// Cache the data for this specific tickerID with a specific name 'getTrendingStocks'
setCache("", output, "getTrendingStocks");
}
return output;
};
// Make sure to return a promise
return {
getTrendingStocks: await getTrendingStocks(),
};
};

View File

@ -511,8 +511,6 @@ onDestroy( () => {
<WatchListCard <WatchListCard
watchListId={displayWatchList?.id} watchListId={displayWatchList?.id}
apiURL = {data?.apiURL}
apiKey = {data?.apiKey}
/> />