From cb2b4f0d86e6609df766ce6264b0628dd2b98988 Mon Sep 17 00:00:00 2001 From: OCbwoy3 Date: Fri, 14 Feb 2025 19:43:05 +0200 Subject: [PATCH] switched theme --- app/api/user/authenticated/route.ts | 25 ++++ app/api/user/route.ts | 23 ++++ app/globals.css | 93 ++++++-------- app/page.tsx | 10 +- bun.lockb | Bin 132154 -> 132571 bytes components/gameCard.tsx | 4 +- components/lazyLoadedImage.tsx | 4 +- components/loggedInHeader.tsx | 31 +++++ hooks/use-lazy-load.ts | 4 +- lib/profile.ts | 40 ++++++ lib/thumbnailLoader.ts | 6 +- package.json | 1 + tailwind.config.ts | 186 ++++++++++++++-------------- 13 files changed, 267 insertions(+), 160 deletions(-) create mode 100644 app/api/user/authenticated/route.ts create mode 100644 app/api/user/route.ts create mode 100644 components/loggedInHeader.tsx create mode 100644 lib/profile.ts diff --git a/app/api/user/authenticated/route.ts b/app/api/user/authenticated/route.ts new file mode 100644 index 0000000..cf7102c --- /dev/null +++ b/app/api/user/authenticated/route.ts @@ -0,0 +1,25 @@ +import { type NextRequest, NextResponse } from "next/server" + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const apiUrl = "https://users.roblox.com/v1/users/authenticated"; + + const url = `${apiUrl}?${searchParams.toString()}`; + + try { + const response = await fetch(url, { + headers: { + "User-Agent": "OCbwoy3ChanAI/1.0", + "Accept": "application/json, text/plain, */*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Content-Type": "application/json;charset=UTF-8", + "Cookie": request.headers.get("Authorization") || "", + }, + }); + + return NextResponse.json(await response.json()); + } catch (error) { + console.error("Error proxying request:", error); + return NextResponse.json({ error: "Internal Server Error" }); + } +} diff --git a/app/api/user/route.ts b/app/api/user/route.ts new file mode 100644 index 0000000..6b18954 --- /dev/null +++ b/app/api/user/route.ts @@ -0,0 +1,23 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export async function GET(request: NextRequest) { + const u = new URL(request.url); + const apiUrl = `https://users.roblox.com/v1/users/${u.searchParams.get("id")}`; + + try { + const response = await fetch(apiUrl, { + headers: { + "User-Agent": "OCbwoy3ChanAI/1.0", + "Accept": "application/json, text/plain, */*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Content-Type": "application/json;charset=UTF-8", + "Cookie": request.headers.get("Authorization") || "", + }, + }); + + return NextResponse.json(await response.json()); + } catch (error) { + console.error("Error proxying request:", error); + return NextResponse.json({ error: "Internal Server Error" }); + } +} diff --git a/app/globals.css b/app/globals.css index a4d605b..078412b 100644 --- a/app/globals.css +++ b/app/globals.css @@ -8,31 +8,42 @@ body { @layer base { :root { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - --ring: 0 0% 3.9%; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; + --background: 240 21.052631735801697% 14.901961386203766%; /* base */ + --foreground: 226 63.93442749977112% 88.03921341896057%; /* text */ + + --muted: 237 16.239316761493683% 22.94117659330368%; /* surface0 */ + --muted-foreground: 227 35.29411852359772% 80.0000011920929%; /* subtext1 */ + + --popover: 240 21.052631735801697% 14.901961386203766%; /* base */ + --popover-foreground: 226 63.93442749977112% 88.03921341896057%; /* text */ + + --card: 240 21.052631735801697% 14.901961386203766%; /* base */ + --card-foreground: 226 63.93442749977112% 88.03921341896057%; /* text */ + + --border: 234 13.20754736661911% 31.176471710205078%; /* surface1 */ + --input: 234 13.20754736661911% 31.176471710205078%; /* surface1 */ + + --primary: 217 91.86992049217224% 75.88235139846802%; /* accent - Blue */ + --primary-foreground: 240 21.052631735801697% 14.901961386203766%; /* base */ + + --secondary: 237 16.239316761493683% 22.94117659330368%; /* surface0 */ + --secondary-foreground: 226 63.93442749977112% 88.03921341896057%; /* text */ + + --accent: 237 16.239316761493683% 22.94117659330368%; /* surface0 */ + --accent-foreground: 226 63.93442749977112% 88.03921341896057%; /* text */ + + --destructive: 343 81.25% 74.90196228027344%; /* red */ + --destructive-foreground: 240 21.311475336551666% 11.96078434586525%; /* mantle */ + + --ring: 226 63.93442749977112% 88.03921341896057%; /* text */ + --radius: 0.5rem; + + --chart-1: 343 81.25% 74.90196228027344%; /* red */ + --chart-2: 170 57.35294222831726% 73.33333492279053%; /* teal */ + --chart-3: 217 91.86992049217224% 75.88235139846802%; /* blue */ + --chart-4: 41 86.04651093482971% 83.13725590705872%; /* yellow */ + --chart-5: 115 54.09836173057556% 76.07843279838562%; /* green */ --sidebar-background: 0 0% 98%; --sidebar-foreground: 240 5.3% 26.1%; --sidebar-primary: 240 5.9% 10%; @@ -42,40 +53,6 @@ body { --sidebar-border: 220 13% 91%; --sidebar-ring: 217.2 91.2% 59.8%; } - .dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - --ring: 0 0% 83.1%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; - --sidebar-background: 240 5.9% 10%; - --sidebar-foreground: 240 4.8% 95.9%; - --sidebar-primary: 224.3 76.3% 48%; - --sidebar-primary-foreground: 0 0% 100%; - --sidebar-accent: 240 3.7% 15.9%; - --sidebar-accent-foreground: 240 4.8% 95.9%; - --sidebar-border: 240 3.7% 15.9%; - --sidebar-ring: 217.2 91.2% 59.8%; - } } @layer base { diff --git a/app/page.tsx b/app/page.tsx index 09233ec..273e2aa 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,13 @@ "use client"; import { GameCard } from "@/components/gameCard"; +import { HomeLoggedInHeader } from "@/components/loggedInHeader"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { getOmniRecommendationsHome, OmniRecommendation, } from "@/lib/omniRecommendation"; +import { getCookie } from "@/lib/roblox"; import { loadThumbnails, ThumbnailRequest } from "@/lib/thumbnailLoader"; import { useEffect, useState } from "react"; @@ -27,8 +29,8 @@ export default function Home() { }) }) }); - loadThumbnails(th).catch(a=>console.error(a)) setRec(r); + loadThumbnails(th).catch(a=>console.error(a)) })(); }, []); @@ -50,9 +52,9 @@ export default function Home() { return (
- {"roblox x next.js when"} -
- {"experimental (functional) roblox.com clone"} + + {"roblox in nextjs"}
+ {"require(\"@/lib/roblox\").getCookie().length = "}{getCookie().length}{";"}
{rec.sorts .filter((a) => SORTS_ALLOWED_IDS.includes(a.topicId)) diff --git a/bun.lockb b/bun.lockb index 7856b31efc955bcbdb9edfd517a75b2f59865a6b..40f151471af2c74706f418c5442ee1200fbddbeb 100755 GIT binary patch delta 20095 zcmdnh!Ew8rV}hRMqUAeMVxL8v;63H$dh6Z7McIkx7ucH~;?w*V`AS}1=C(I069Wk7 zPYjo5`m8;%LZLp4nSp_mfuW%&H8Ht_fq@~P1;UqMWMB|uU}$h`Q4RnV1QYeCj|)!eQ8KY#X{4PXy3FfjBfLQ+GWBE(8>C5V0pD1AwZfq|ca zp+SA}LT35;Vnv8-s|v&;xtV#H1&PJQS&9(8wJJpQ1XYO35~1RnY7o<9)F7@9Rfnj5 zp#}+|1L_cZs~W_Eff|ss$HS=H+WO(42bjCD&gb5j{o zjCB)>iV`a?nm|19%@{(b80)4c7N;_pKuuAD(mZC6(3jMQ1Rk$GB$R)fLE`?S86+^l zMU!r3ah*9tKF|Veu2Ms>IXL)1Ik=>AXz+y6I!+7>vJ4Cj0#1;k z@{1#czU2sU$RS6F#j7157EX19SXd9Gvm7C@8w#Zz9U%_U1=G?D4U%96Lj#8+B$K&$ zLPFy2WJh-KdKWK9uukxTgx(`BNO=6Sfrvka(l?>>c^gQysQN(E9kT&P2fSQNDlJaR zuVi4b_J!!zXNJ&f(3(bw8REQ7Kd`s!8>;;v7ANPXWP=hfdQ}3eVu-Dhh^%^`HBUWe z)dQC=o5hi_qIV5kRGzEc??KC5Gd`1C?NB#tr}Ar|{HLL6qq2#&J` z21ba*PZ=NvpJjj;xSavw;Moii`Fbdw#sG0pFasoK+Au)uF=Akte4101@!95=oc^2~ zxmzo11r=LaCtC;?FfN_EQrMpH%H)^A_M9dx3=Gx`3=P7Q3l+^dD_9s9jA1;+)st6> z*fTzx{8Gf8apq)AQF~Tpb_RyH$-1J}jE$35irTX>b1*O@f%&PEHO1^1cTdg~vuEYz zWMFWc{8reSHIS2m!DX_pm^IT>&dFM0cC4>C85lyqQubU741QqNIxYr=1dt)DeB2BS zJ|N|cQIj(z>=~C#UMXSEm_PZY1juMjNqg3}JYWMwtr-m`uavZBtepH((w_ASF9Utb`raf!BJOhKy z6jm z4JNe@5*OqJte2 z=A4YGkXYfI{881M(@Pa*i=n>-hbkoCz*&Uz5mX`bg(||-L%jA!e=BybS3=Co5%(qVi5&#?^Pjdc&@>nK= z0>@nw5~NHZ6Idr}f^tf(gf-`RO^B@=lQ)K0aA-j+We10#E0o6u<~3?TECr`E&huIj z&oO|qFQ>3J#A43Lg(~KpflwaXRfnjo?lsRL}WK9!$ z#zT`cP3$>EbRja#pm1f4(*>7>veu02Cu^G8vp&#eV9=ZVR>GQ-Pmh5?kAb0qb@E0< z3l2SqGnhfXVr-bKX$C5wGtKN7D<-crv*)xhU|{eDCy3=FnlC5B?=jI$Bc z=A5@oAR)~(8C1N8m_m5WlRt`DaG1ihee||qF$EQGYbC8YPk>n9*!ZYr&M9LC$xTd? zH_DoGrkFtz49jFgX>-nHW{}utnG6a8L30L%5O8q`(${4U@hAUeLrHVSFiNkWTmc1QgFomG>^vsfh z!4lM)n{23T&L}@w)4`rI)QW+@0GvNT#c!(>#63)tH=3I>30O~lmYSyg2&I}C6VAcj_28Kj1 zOVEXZA%5~(R~r@xL(Q7?ybA+EELc*R?+0L(IQhp`&mL5&HJj&pF9j0dHLGd}IGUuaSqnqJ)uWmts=S^QSm znlWp#X1G1;rf5)FdMjbg`U4^(Va*yB12REZ)S7ck3_MIF%{lpEA+gRld83sDODxDp zP-AXREJP6#IB7hKg%ksfpn8$hDh`Rq+7}1%E6722;y@wyR>Yc7W3pzHJ!?xml+XDj z9umC})3g#`#oeRCTY$Yl?=%kkn(a~GQ@WbAm1^5nY=RA zp3@)&QY;HkE)1~XNP!fu!jnHLnKQ1LoEc}&_-XRWIO}?I1_lNY26bOSG&2KOB?D-< z71Y-Oi6hfO4B&P<14vyU0|QtcsBgr{z`zj0zyKDHhl(dMFfgz(fE(Um@l23m3=9k) z8f1Pp14BInI|Bnl5d#AQ8v_GF1yo}dl&*n_H!(1P)pas3Ft9K%F!VwVLZ(3ungErb z0+k2RAoVk#4g+=W7#SEC<}fgT`hg5{8S25kK8DRu3%5cwBGVuPc0$Fm(IB7fhFY)> zsty|sGUpIf-BGBzqdYJM$VHQD6T~O4N#FqWJsD0wWw6m8Kb!>VU|?W41yu*4K~6aX z<%4Jt{~VMLqCxu3L-k#N(ifrfNVF0-)~-P%Kr~3>b!Zsf1ksai6XgX#qIaRHKs3kX z+(dD(#C?XU{{p4ILe*iTK?&tIR31cwJoy*O{|icx z%#(SOAkJW9gv2uw$fY2sFoNV67+9cuWEv#I3RTYr;(*c~R6Pfj528WV^D#maIw%A{ zQbHhtfq?-;gS;ck2ufHC3=E=B2@nlpia{+92XR0n2~dNipyJX{aS#nMNDj)!M}yQU zLLI6MRj82;t*{0#cO`JVeHz&j=n6Vz7le%noGm91mA{ZDLKs3m`F;G5;1~Fqn1Oo#D5)HN=Spej6Fdt+MNf83Ri9jvD#6GwxiwY39%R%k5W&E} zfJ}oNJ_qWdc~B3|hpI!SK|%{a1Oo#Dhz99f1mz>spd_{wYR)pK{4!7)2eFq!Em{eU zvNceJYeABr=`Th|p}i3rwcDZm-B9)W7{McJ3>Tr|SE1rJph@u&RQws#+~-jFSB&)x z3>*v$44)VwwZl)S#2+aAA8H|J>JU`R@GwCfBESSG6$F{UV~z}pOpt0yjR}(GO_(6L z+Z;+;fr158EkgOWOpsEiyMYLF`vczl^5fC)T3z!1v>acC-3V>%PW!Ff;z z)G>j_nHjpE`ldqFO=kj+b~7x4+5@6NnPfF&kd&eR2-Jd$P?z6lg5;j3OpqY`!2}+@ zW#D3l_)G#ap}?TW4DqosGsJ-okck8aZ)QmD4}}bTGbBRkTxN&|N}>9yAnMo{T0jO& z*3Ezvx09J60XqdsPleLcK+4#t)Tfq`qX;9c>_1;Qee7YMUV?zz*z=r@`7t~%>yVFm_n zklf~gyGxi^6+jDuK-|dzcPl_jdDkg}n_CS#lo=QVKr)*H?&dIoq$Vpo;b2{&i_pIU zEX-K9`QtNVM%E4+1_oZJ1{bglXK`w7S!xjj!^O=LUm3H3T_bRZW%G#-dRCJk6dH0_ z=s@z_3EgShj5eS$>fe6|0EHx|KMImp1#zJLQc!UR!dg%|`37VL7Xt&sF{qd>R2?@11H&1pm>yINWcem&e?TABbKzxRVDJH%!oa{_ z09DAxz`(!>6*Gi7h99&54=QF1RVTo}z`zR?Gl5nfg3uuVkQwGsb)fbuKO>~0VF48r z2CX|3fC^ed1%H5?&%nU&z-an2Lq?_PUvwDn)SEFdFo0UopcXY~jA;)81H)bh28Im` z3=DG_7#KkDu$+N`VIBhm11S7gg9=s#28Q_z3=GQ{7#LQ7`dKc(?SN7zXhjStHG@(g90N1!%qeVhHnfE4Br_T7(jz_zZe)8elRdFfCltFg8JeN3=9() z7#Kh!wV-}8sGT%}5i&Y4n~{M5G_DiK$N(N!0*xtoGBPkYFfuSWGcqu^F+xU?KqHi( zLB>0vL9}BG3=E*rEzn5cAJ8ZwC=-K51VDL?k%0j;atP{>+kqAgF)}dBWn^FgHQqqO zo3|Ml82&LZF#Km=U;vE}f`;!vd7F!ofq|Qmfq{n+l7~UVexP9z(3mi2$WRuvMu?Gt zK?F3w0xIG_#UrRF0~KAVj0_A985kHYGcYh5WMp7C$;iNPl#zh}RDzviWMBZ5TA)(u z2qUCqI?M6>JR?6Jwl#o}r!@cn%Z16ngTNj!R)l z0Xvx(<4p7n^b8mn(x%%xGD@0)G6-l5b-?58I}CR3l4W9yGlXabWesSH(U#=u}So!^O3(iFDD>%QCZxv%d2{fkflTLiX3r>QIWi?kXOW1Nwm zp`H-~L*4XPCq_x>snFG9VQEhpTXTQ@0BbeUGi6}dGJT>Gqa@?$>8nBNV9U>1=9{&h zTy^{?RGl#c!@ueGL2iJpSK|-q)9_d~O9g6^83O}sMH^d5#6(}6s}I0h!EW%FuItPw zDGgh9UR`_pe7eZ-RR{$|(-WN;B^f)WSA*2SmeO5qzjC&~N#ib9oe?OSHcnsf%qVFJ zUX;hc(2)7~eS^xo-3(v_V4Gme0NvShwUVslFG6K37#My{|Le?{E)6QGL2KW8v&yI3 zPHPuqVvMuUGX({d+VpxCMoC8f=`&pzjTx<{p9N8F(-~bEB^kq}OS>{kO2d|?I;_w$ zoc(cu0TW}Kxt^(so)JUdbbnVyU&fZ{b3w`{P2UdU$xLT;W7Jk=VS!Aa!j|z@OIZKP zY!68jV1&u!PY-ruG-foIzOkE8lF@qlLN`W9M&Id$)r^vi3Df_B1mmVZtYwsBES^5G zj8T%YbNa!4MoGp6(;IsjB^h^2KiI@5$#`*kp*y1_8)T^nrdwb#%-FA3%L!$<^N#e+CgQGv1I8?zI%vjHyfq|1}xkmroS0muq=Vk8c5hx>Fnl2c|C}|4Yb5Y#s@o&pgl^U=DLp?(V2G}MD z>6P{O*FE0~%D$k&){ueW!}PO(jFK|2T@+nKS$ku>ULIp&j5CIm#%u!9A{Zr@LKfX+;i*XeXxlJptyi-2idPP`<8X6gcmpxjP#5_L47xr(U=h&S-y<=)8oS!CCy;F zMB3Rk=lL$)v>dG5P|uQq0n-X2Jp)kn!5}0veO(yiEHl^+lzDBtomc$jTgJp#X9}r; zV4F=`_%|#s>Ald!#8?NaoD3Kk*aW86g)qjY<2@Z6Ob}c ztV_doT+9~T{z|HKPd2#vHU@d~(sbhpMq|d?)6*jueWl;XK~_e;3QVpJ=+>wMs{{LD z^Yrr(jFQr@9W6nf*Vf5JcyU2fg&_mO>FLaojM|(c3gCH)28jCU0g;SSjEU2;BN-*7 zVf$6&nI6RjzI#`|#29C(2XJOm z`Kk#xbis`bhv{!486_FLr?W>f`bxt#&NztPpJBD1qZS&S1`G`9)AOSkT{*K=AWOYl zr|*qol$3^Tor&E4j&;txw;E9Oh71f7rhklLlw_2d&K=DtDGl37v!e1}zVQNSM;37N z2jsM^)9pbDZb0|i{PbzzYVf=D|F}1 z-yFsb1xhZrz_9_=`eHhN45OqpY>Q76Y3dC3p85rEA$AXl?cK@u& zH{6o*E_og}@WDZBHGN_XxaM39QU~1?)ZnLoXp!Wp!y@2<18nEk>GwhEARfkMwHYMq zK^4Gu2fay&3cYJ{zy+Kfz{TLf>4~w7l1#!n(`#ZGC8S~7gMJF8X8$ueI};rFCVGYj z49?Tn$1+Mv!}bj&cqVfzb%uh1!B`LMB#r5hV;Qxjx9EYJx(%3B;g;!|ag3o%y!z7{ z;us}NVViZ9cfL(kOVn@&2Pn9_fNkqp@_zf%>Pdw=z&XPNl*LS@pN(UbWOSPTJdROY zIzS&%D_~j`FkLsEaWUiG=@;X{jmFpUjFQr@y+^wHx5}n#H-JhsP#!d;+7S z8En(i(hcdC+nAm?L0x3TzyRCc^rGh3HKplmguoF7_O*z?^t=Q{32E5IsM{h;H& zYF!Y@#K-~N6eVafy(f{;#}u|n>S2!Rjip|drza5Ktq;kAV%t>DLeG%l_jJc3Mr~zSy^9&bFqzcpf(48s z3Z|e!7PgD3Cpdh`jP*13Gcm?Nb3om6?PNwt#*fqQCNUZ_hD{d)@t}hHrn@FH8cRd> zVl}*2(Zzr58e0JqqoW0Qn5F?@#q{OLjPi_b(~l=JYD?d=0(2o^>|sG)Mx8&er28BM0oPGyvohV2cT@L|Onx3V+J2zANR z&!;je<8&Aeg;ATY`d998-th5@`%X@nRU};(-@5zPfQO?W0YjPF+Dqt zQPS|0EdzKzt;x2f(;mnR6p1jxMi?<;oz;$k!4MpXOssa(&!jP0nf`SEPp&s){H$qU zvEK^H#-KXan1KPdN$kNv(SI#BGM=z78t54tgA$75bnA3RNomNoGKPl6^Gxc&%}lij z1&-76(-|dAVf)Yy{m}Wb{>0lw2nDd6Y6Z*eb~IJLo{x~JpS~AlHf(F#uWm=>y2~?5 z5eimM|Cr7w$#`fwcLt-RG;C|!`-rAG2rlG3n^pcf-nUGV%e|0yVsLRy&~#O;~6Fc+fe6ue4oqOEBox2 z7@^%zhR*4mvl+FOm-#_j^ymr&;0k4?GvrxKoipn#EW`mIt%9ZnQ^S2!2kV-=ZxK9`Y| z5vmp3dlhB}7tjpg4x_Llgag|(-uj@fK0$KhWhO==J#gv9faFj}4;Q2#G|}HVy)X~f z&lR3NFOQLpamRF!cOji!m@*{iO2am@FW;K%aG3AhN+w1_NQKP+?gk1iN;Jyd@7!ep?F0|hca+x6m0|V5xNDhRWA_3_y$5Uv#BqZ1| z9D&nbBS@zg7N4Y~1jgR!2TK`^NiqP{QBoSV50!^2)lMcu z{yQi+gGag;-cGNt05@nsLqXE8{jGbxFa240D{?JFodIa?=k&86by$Z%pko?DI0rm@ z0T~~F4+lY^m)({b6vCuP^Gkswdqa@?n>AR6AqC){(fJicKoZbx@ z3xf`O-JCAi1upmwf`+|5O^*lhAOl=P_yjfLu^O2&T@WNQaFbk{h(pK}yOZ4eBFk zY)NBD(u_{i^ZVcfodkmz?i<*CY-xeuA1#{}cOWtjRy$F>ff9-^7myliL}vzYZ7V5_ z+r_9!8+GIuYte?)H`vFKA;AkP_wc3^TkrrP0|S;$1WX3EA5cRbYvMu6m*DUwrbxwV zG&C)th6Kb0MrhFj@j9f1sL(E{-XvBtv#m1y%(QXKaAHK>!p#SIBL z3gU7!BcY`ZYG9CE&VbrMa4&=1M@%tAY7&ArYrx%3VRn=Zh~f`$8;8_P4htV_`9~VG zSOau08QaZ!bGlPR%OG{MF=)LCc(M~(G@HSS58MR{`V6iBW1RVPhX6(ib~{_pkfp(N z$GMEAD$i0N*g}*36>;g=9FjV zrMO35QhTSpQ9XD1$GMF1jJeYV=P}AF#>zp4ac+lJF9~0*AekWtF}qPbl<&WY$-R>4 zf%6#crCuaMgj+03&oEZ-{SyGKcwt~*aAuvpY93>1 g8NHLIb8cXi=5|0RneMfYQJNLJwqbiP6Vr1>08z%SnE(I) delta 19660 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 BMT7tV diff --git a/components/gameCard.tsx b/components/gameCard.tsx index 9f83944..a0b9b8c 100644 --- a/components/gameCard.tsx +++ b/components/gameCard.tsx @@ -1,4 +1,4 @@ -import { useGameThumbnailLazyLoad } from "@/hooks/use-lazy-load"; +import { useThumbnailLazyLoad } from "@/hooks/use-lazy-load"; import { ContentMetadata } from "@/lib/omniRecommendation"; import LazyLoadedImage from "./lazyLoadedImage"; import { ContextMenu, ContextMenuContent, ContextMenuSeparator, ContextMenuTrigger } from "./ui/context-menu"; @@ -16,7 +16,7 @@ export function GameCard({ game }: GameCardProps) {
{game.primaryMediaAsset ? ( diff --git a/components/lazyLoadedImage.tsx b/components/lazyLoadedImage.tsx index 55b2dee..03b6b0a 100644 --- a/components/lazyLoadedImage.tsx +++ b/components/lazyLoadedImage.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useGameThumbnailLazyLoad } from '@/hooks/use-lazy-load'; +import { useThumbnailLazyLoad } from '@/hooks/use-lazy-load'; interface LazyLoadedImageProps { imgId: string; @@ -8,7 +8,7 @@ interface LazyLoadedImageProps { } const LazyLoadedImage: React.FC = ({ imgId, alt, ...props }: LazyLoadedImageProps) => { - const imgUrl = useGameThumbnailLazyLoad(imgId); + const imgUrl = useThumbnailLazyLoad(imgId); return (
diff --git a/components/loggedInHeader.tsx b/components/loggedInHeader.tsx new file mode 100644 index 0000000..60be100 --- /dev/null +++ b/components/loggedInHeader.tsx @@ -0,0 +1,31 @@ +import { + getLoggedInUser, + getUserByUserId, + UserProfileDetails, +} from "@/lib/profile"; +import { useEffect, useState } from "react"; + +export function HomeLoggedInHeader() { + const [profileDetails, setProfileDetails] = + useState(null); + + useEffect(() => { + (async () => { + const authed = await getLoggedInUser(); + setProfileDetails(await getUserByUserId(authed.id.toString())); + })(); + }, []); + + if (!profileDetails) { + return (<>) + } + + return ( +
+ Hello, {profileDetails.displayName} + {"@"}{profileDetails.name} +
+ {profileDetails.id} +
+ ); +} diff --git a/hooks/use-lazy-load.ts b/hooks/use-lazy-load.ts index 76a509e..a78320b 100644 --- a/hooks/use-lazy-load.ts +++ b/hooks/use-lazy-load.ts @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react'; let gameImages: { [id: string]: string } = {}; -export function useGameThumbnailLazyLoad(img: string) { +export function useThumbnailLazyLoad(img: string) { const [status, setStatus] = useState(undefined); useEffect(() => { @@ -19,6 +19,6 @@ export function useGameThumbnailLazyLoad(img: string) { return status; } -export function addGameThumbnail(id: string, url: string) { +export function addThumbnail(id: string, url: string) { gameImages[id] = url; } \ No newline at end of file diff --git a/lib/profile.ts b/lib/profile.ts new file mode 100644 index 0000000..d6d3b13 --- /dev/null +++ b/lib/profile.ts @@ -0,0 +1,40 @@ +import { getCookie } from "./roblox" + +export type UserProfileDetails = { + description: string, + created: Date, + isBanned: boolean, + externalAppDisplayName: string, + hasVerifiedBadge: boolean, + id: number, + name: string, + displayName: string +} + +export async function getLoggedInUser(): Promise<{ + id: number, + name: string, + displayName: string +}> { + const data = await fetch(`${document.baseURI}api/user/authenticated`, { + method: "GET", + headers: { + Authorization: `${getCookie()}` + }, + }) + return (await data.json() as any) as { + id: number, + name: string, + displayName: string + } +} + +export async function getUserByUserId(userid: string): Promise { + const data = await fetch(`${document.baseURI}api/user?id=${userid}`, { + method: "GET", + headers: { + Authorization: `${getCookie()}` + }, + }) + return (await data.json() as any) as UserProfileDetails +} \ No newline at end of file diff --git a/lib/thumbnailLoader.ts b/lib/thumbnailLoader.ts index 773ab82..c7dc3b1 100644 --- a/lib/thumbnailLoader.ts +++ b/lib/thumbnailLoader.ts @@ -1,6 +1,6 @@ "use client"; -import { addGameThumbnail } from "@/hooks/use-lazy-load"; +import { addThumbnail } from "@/hooks/use-lazy-load"; import { getCookie } from "./roblox"; export type AssetThumbnail = { @@ -45,7 +45,9 @@ export async function getThumbnails(b: ThumbnailRequest[]): Promise { const th = await getThumbnails(b); th.forEach(a=>{ - addGameThumbnail(a.targetId.toString(), a.imageUrl) + // match GameThumbnail from 4972273297::GameThumbnail:384x216:webp:regular and any like- string + const ty = b.find(c=>c.targetId==a.targetId)! + addThumbnail(ty.type+'_'+a.targetId.toString(), a.imageUrl) }) } diff --git a/package.json b/package.json index c9ce8fb..5a5835c 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@catppuccin/tailwindcss": "^0.1.6", "@hookform/resolvers": "^4.0.0", "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-alert-dialog": "^1.1.6", diff --git a/tailwind.config.ts b/tailwind.config.ts index 4197ec5..bc68ff6 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,94 +1,100 @@ import type { Config } from "tailwindcss"; export default { - darkMode: ["class"], - content: [ - "./pages/**/*.{js,ts,jsx,tsx,mdx}", - "./components/**/*.{js,ts,jsx,tsx,mdx}", - "./app/**/*.{js,ts,jsx,tsx,mdx}", - ], - theme: { - extend: { - colors: { - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))' - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))' - }, - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))' - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))' - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))' - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))' - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))' - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - chart: { - '1': 'hsl(var(--chart-1))', - '2': 'hsl(var(--chart-2))', - '3': 'hsl(var(--chart-3))', - '4': 'hsl(var(--chart-4))', - '5': 'hsl(var(--chart-5))' - }, - sidebar: { - DEFAULT: 'hsl(var(--sidebar-background))', - foreground: 'hsl(var(--sidebar-foreground))', - primary: 'hsl(var(--sidebar-primary))', - 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', - accent: 'hsl(var(--sidebar-accent))', - 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', - border: 'hsl(var(--sidebar-border))', - ring: 'hsl(var(--sidebar-ring))' - } - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - }, - keyframes: { - 'accordion-down': { - from: { - height: '0' - }, - to: { - height: 'var(--radix-accordion-content-height)' - } - }, - 'accordion-up': { - from: { - height: 'var(--radix-accordion-content-height)' - }, - to: { - height: '0' - } - } - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out' - } - } - }, - plugins: [require("tailwindcss-animate")], + darkMode: ["class"], + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + }, + sidebar: { + DEFAULT: 'hsl(var(--sidebar-background))', + foreground: 'hsl(var(--sidebar-foreground))', + primary: 'hsl(var(--sidebar-primary))', + 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', + accent: 'hsl(var(--sidebar-accent))', + 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', + border: 'hsl(var(--sidebar-border))', + ring: 'hsl(var(--sidebar-ring))' + } + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + keyframes: { + 'accordion-down': { + from: { + height: '0' + }, + to: { + height: 'var(--radix-accordion-content-height)' + } + }, + 'accordion-up': { + from: { + height: 'var(--radix-accordion-content-height)' + }, + to: { + height: '0' + } + } + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out' + } + } + }, + plugins: [ + require("tailwindcss-animate"), + require("@catppuccin/tailwindcss")({ + prefix: false, + defaultFlavour: "mocha" + }) + ], } satisfies Config;