From 00d5bb563144d7d9d3be074988e5663f53ab67b7 Mon Sep 17 00:00:00 2001 From: Tvishi Agarwal Date: Mon, 6 Apr 2026 23:19:31 +0000 Subject: [PATCH] fixedfredkey --- index.html | 14 ++++----- netlify/functions/fred-yields.js | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 netlify/functions/fred-yields.js diff --git a/index.html b/index.html index 1317070..125f60d 100644 --- a/index.html +++ b/index.html @@ -13,18 +13,18 @@ const {useState,useEffect,useRef,useCallback}=React; const C={bg:"#0a0e17",bgC:"#111827",bd:"#1e293b",tx:"#e2e8f0",txD:"#94a3b8",txM:"#64748b",g:"#22c55e",r:"#ef4444",b:"#3b82f6",am:"#f59e0b",ac:"#6366f1",acD:"#4338ca",tl:"#14b8a6"}; const cc=v=>v>0?C.g:v<0?C.r:C.txM;const fc=(v,s="%")=>v!=null?(v>0?"+":"")+Number(v).toFixed(2)+s:"โ€”";const fb=v=>v!=null?(v>0?"+":"")+Number(v).toFixed(1)+"bp":"โ€”";const pc=(a,b)=>b?+((a/b-1)*100).toFixed(2):null;const Mn="'JetBrains Mono',monospace"; -const _d=s=>{try{return atob(s)}catch{return""}};const _K={fred:_d("OTRlZGYwZDQxNThhZmEwZGNhNDRlYjdmMjRiN2U1MTY="),finnhub:_d("ZDc5ZGg1cHIwMXFxcG1oZ2QwYjBkNzlkaDVwcjAxcXFwbWhnZDBiZw==")}; +const _d=s=>{try{return atob(s)}catch{return""}};const _K={finnhub:_d("ZDc5ZGg1cHIwMXFxcG1oZ2QwYjBkNzlkaDVwcjAxcXFwbWhnZDBiZw==")}; const gk=n=>{try{return localStorage.getItem("fxr_"+n)||""}catch{return""}};const sk=(n,v)=>{try{localStorage.setItem("fxr_"+n,v)}catch{}}; const jf=async u=>{const r=await fetch(u);if(!r.ok)throw new Error(r.status);return r.json()}; async function fFr(d,sym){try{return await jf("https://api.frankfurter.dev/v1/"+d+"?base=USD&symbols="+sym)}catch{return null}} -async function fFD(s,k){if(!k)return null;try{const d=await jf("https://api.stlouisfed.org/fred/series/observations?series_id="+s+"&api_key="+k+"&file_type=json&sort_order=desc&limit=5");const o=d.observations?.filter(x=>x.value!==".");return o?.length?+o[0].value:null}catch{return null}} +async function fFD(){try{const r=await fetch("/.netlify/functions/fred-yields");if(!r.ok)throw new Error("fred-yields failed");return await r.json()}catch{return null}} async function fFh(ep,p,k){if(!k)return null;try{const q=new URLSearchParams({...p,token:k}).toString();return await jf("https://finnhub.io/api/v1/"+ep+"?"+q)}catch{return null}} const ago=n=>{const d=new Date();d.setDate(d.getDate()-n);return d.toISOString().slice(0,10)};const fwd=n=>{const d=new Date();d.setDate(d.getDate()+n);return d.toISOString().slice(0,10)};const jan2=()=>new Date().getFullYear()+"-01-02"; const G10=[{p:"EURUSD",q:"EUR",i:1},{p:"GBPUSD",q:"GBP",i:1},{p:"USDJPY",q:"JPY",i:0},{p:"USDCHF",q:"CHF",i:0},{p:"AUDUSD",q:"AUD",i:1},{p:"NZDUSD",q:"NZD",i:1},{p:"USDCAD",q:"CAD",i:0},{p:"USDSEK",q:"SEK",i:0},{p:"USDNOK",q:"NOK",i:0}]; const EMP=[{p:"USDCNY",q:"CNY"},{p:"USDMXN",q:"MXN"},{p:"USDBRL",q:"BRL"},{p:"USDZAR",q:"ZAR"},{p:"USDINR",q:"INR"},{p:"USDKRW",q:"KRW"},{p:"USDTRY",q:"TRY"},{p:"USDPLN",q:"PLN"},{p:"USDHUF",q:"HUF"},{p:"USDCZK",q:"CZK"},{p:"USDSGD",q:"SGD"},{p:"USDIDR",q:"IDR"},{p:"USDTHB",q:"THB"}].map(x=>({...x,i:0})); const SYM=[...new Set([...G10,...EMP].map(x=>x.q))].join(","); -const FY={"DGS1MO":"y1m","DGS3MO":"y3m","DGS6MO":"y6m","DGS1":"y1","DGS2":"y2","DGS5":"y5","DGS10":"y10","DGS30":"y30"}; + const RT=[{c:"US",f:"๐Ÿ‡บ๐Ÿ‡ธ",cb:5.50,ccy:"USD"},{c:"Eurozone",f:"๐Ÿ‡ช๐Ÿ‡บ",cb:4.50,ccy:"EUR"},{c:"UK",f:"๐Ÿ‡ฌ๐Ÿ‡ง",cb:5.25,ccy:"GBP"},{c:"Japan",f:"๐Ÿ‡ฏ๐Ÿ‡ต",cb:0.10,ccy:"JPY"},{c:"Switzerland",f:"๐Ÿ‡จ๐Ÿ‡ญ",cb:1.75,ccy:"CHF"},{c:"Australia",f:"๐Ÿ‡ฆ๐Ÿ‡บ",cb:4.35,ccy:"AUD"},{c:"New Zealand",f:"๐Ÿ‡ณ๐Ÿ‡ฟ",cb:5.50,ccy:"NZD"},{c:"Canada",f:"๐Ÿ‡จ๐Ÿ‡ฆ",cb:5.00,ccy:"CAD"},{c:"Sweden",f:"๐Ÿ‡ธ๐Ÿ‡ช",cb:4.00,ccy:"SEK"},{c:"Norway",f:"๐Ÿ‡ณ๐Ÿ‡ด",cb:4.50,ccy:"NOK"},{c:"Brazil",f:"๐Ÿ‡ง๐Ÿ‡ท",cb:10.75,ccy:"BRL"},{c:"Mexico",f:"๐Ÿ‡ฒ๐Ÿ‡ฝ",cb:11.00,ccy:"MXN"},{c:"South Africa",f:"๐Ÿ‡ฟ๐Ÿ‡ฆ",cb:8.25,ccy:"ZAR"},{c:"India",f:"๐Ÿ‡ฎ๐Ÿ‡ณ",cb:6.50,ccy:"INR"},{c:"South Korea",f:"๐Ÿ‡ฐ๐Ÿ‡ท",cb:3.50,ccy:"KRW"},{c:"Turkey",f:"๐Ÿ‡น๐Ÿ‡ท",cb:50.00,ccy:"TRY"},{c:"Poland",f:"๐Ÿ‡ต๐Ÿ‡ฑ",cb:5.75,ccy:"PLN"}]; const cOf={};RT.forEach(r=>cOf[r.c]=r.ccy); const tvF={US:"TVC:DXY",Eurozone:"FX:EURUSD",UK:"FX:GBPUSD",Japan:"FX:USDJPY",Switzerland:"FX:USDCHF",Australia:"FX:AUDUSD","New Zealand":"FX:NZDUSD",Canada:"FX:USDCAD",Sweden:"FX:USDSEK",Norway:"FX:USDNOK",Brazil:"FX:USDBRL",Mexico:"FX:USDMXN","South Africa":"FX:USDZAR",India:"FX:USDINR","South Korea":"FX:USDKRW",Turkey:"FX:USDTRY",Poland:"FX:USDPLN"}; @@ -60,7 +60,7 @@ const CP=["EURUSD","GBPUSD","USDJPY","AUDUSD","USDCAD","NZDUSD","Gold","US10Y"]; const Dot=({on})=>; function Tabs({tabs,act,set}){return
{tabs.map(t=>)}
} function Tbl({cols,rows,sm}){return
{cols.map(c=>)}{rows.map((r,i)=>{cols.map(c=>{const v=c.rn?c.rn(r):r[c.k];return })})}
{c.l}
{v!=null?v:"โ€”"}
} -function TV({sym,h=280}){const ref=useRef(null);const [vis,setVis]=useState(false);useEffect(()=>{if(!ref.current||!sym)return;const obs=new IntersectionObserver(([e])=>{if(e.isIntersecting){setVis(true);obs.disconnect()}},{rootMargin:"200px"});obs.observe(ref.current);return()=>obs.disconnect()},[sym]);const ph={height:h,borderRadius:6,border:"1px solid "+C.bd,display:"flex",alignItems:"center",justifyContent:"center",color:C.txM,fontSize:11,background:C.bg};if(!sym)return
No chart
;return
{vis?