diff --git a/bun.lockb b/bun.lockb index d8218b9de233f39bda3caf7d2e7d37afbba3fb55..bb99019d49af2574ba5eed9fb0dbd8d0dea90d13 100755 GIT binary patch delta 25432 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 NCq|C#UUiJlvH%%wS(^X= delta 18483 zcmaFc$=`8DT8%lg+l!+1_lOh28M>43=9l{3=9ornI)+pC27T}WvO{3#aoye7`PZ18dfti zFmN(3G^C|u7J=l8@^f-Z3m6#c*cliU7#JE7*%=sQ85kN|*%=sQ7#JF~*%=t57#JG( zpyFTI7#JiO7#gm#F)+w6Ff{Ch(De;7*cccT85kNW*dPW)Kxr$8f(CIm1_osYhK8@K z3=B#P3=P*<85ral7#g-i>6xq$18Z3!7RN!wouGVmRt5%X28ISHRt5%M28M=${Nj@2 z;$nt9{2+ckL&GM1h!67;^YSxO7#LEElS(slQW#DNF)#>$ED~a15N2R#SS-ZAAi}`V zFcB(VE(GymGF04Gh=D(~v)QCgrA5xGgxFrP%dI<%H z1HQ;JFbFU(G?WzQWF|2%Fg%rKVBiO(EqMk89tMU676pid_CWQ`mttTCCz>fzlTR_5 z)gM-Zc-)#9k`||{K+NS-g`}MhRY+78szL(nlM00HRD-B%SAp7}Sdf^Mlggm04oTb9 zDiHf&`tLDA_!XKA3=#|s4Y8VFbL$%%G$DytK@;L(7EMT+daVI*z&Qx?gVr-Z)G_Hp0$`UO!~s?LDIjGGQ}jXndWMF#dJvzS zFaRY^h6X-EhyfjjkdQ1jgoKci5yWSbMvz|5&@N$F=b#70;Rwi5vhs_;#X^xDB#E3fgIHLamy(&B$-tmv z4zXY{1IQ-~4JA1##UQWUHHTy_Sg|sb0m5&Bsw*x_%>flS+btOw#6acHa!ZJhXInxH zl46~BOHQ`el7WGbfuW(<5~4jZIlm~6fq@~@l7T^L@>*8q`f_N{&$5L?1)Cj&PP2m~ z`U`dtok#5;AqUIlu*?U`m9R_*%Ve<31j}TwQUI3gp}D%g0i2x~7#d)?7M5FKxe}He zw?m5uSTO<1?XcVoD|TST46OKol>)zPAps-g1_`J(TTq&+XJ{z1g$PjDXT*8T6{(;k z*Jo!1CP#6|CC%^yd5EE*(+`s7YyBV|PJz+_0g$AbTAZAilbDjq9018H@BJbAPWeNU zW~3h^rb8GYDZx4jLO%+ce2YU)=v^=*#ipbtm8LT=Fq{aU%*AQvr5X-NC(U7ygrA+0 zS_-Q0Qc}wjb4pVglJoPkGgBED%EBPFCWb+BtPlgFh|p$$h<8O!p2Vp(xq#~dhg}@g zo-6M;?r#p@zQH)zg3CZ7qvokk4@OCf?yq@+j-Kuw*#O}Vzo4?*|5}*8l(}TltvX$q=CwFg7KEbE3c>})( zGt*aw$-ji`7_}!`3fnU#Pp%ZUXZp)D`InwOBlF~4l6FkrnJ52}v}4j|nQSFx$C<;z zz+eR`lP5chnsY8=VPG&|U}#{Q>?mQ*^ps`tFDX0LdF%`fiIe|IS+o9UXJCj1v!XZ{ z7$U)}%^VC2p1Q{*(o9n48CA>4@F>l zHAER0yuo6{qAMr7q9F5Cs-%lxJXw0I`^K z6(;}EvSTV&m~5qO$Fx&na+S6n>uUuD2D{0&64tDmiVO@EU{<0c1B1upze3imD;2?- zHEmdw7#PAprf`NUF)-LMFf=etW)wDOnyNI}O4p9_ni2zp83RKD>*Rw@=1lU+lXvOb zF$F76{-tZj*{#gLV8Ou9z&_bg#GLc6G6RDN149EdNG0cYWd;T}a85a>YtCe=GPz39 zj%kg` zCu)6bRu3(34$`+~U9H8ykU9CUzBQ|eHaG|ATeFsGgY%)jHR}a!m^xz}nBGY`;OwGr z&H7#koFVkBS>1FQ80@=aV|AtV2FT3o|rk)U!%#p z%C(e$ zvX!VEQ-{^$Dp5Pm!&VFoMv$-&HfQ>3HTjpQ9h0{8WGgW{&S+}}1{ZL;1SRtM){}RM z*)ct_p8QM9j!E2Ra+SCpXQmCLSZAEvsBO+U(}saT4_wS0G&AQsZUag3ERzrFnsfe# z^BDEanaph`S2^1;ZM2=d%h`@o)(#TE%wWe?*iE)_v17VrH@V8ij!DcO{xs3K}FSH7i-qr_Mj5wucr-*1DN4r%~}d)9fGs?9l-(YV$B-m2r7&~S{K7vZ{RFb zCzxy21xL z3TLf_v%bPvw%!a3ZeR5Tp zeJAe&Xa`K=2E69$i(|@v6 zupOsb00Tn^IPEb8nR7M=K++yFI2-K_nEWf)j_F^(WUCN6rs%-QRUvk)n*%{*{@y@q zrjLP>e}&jFbq7th3bo_>5Clo}jFTDl%sK6XkxS~LU&- z$-lzwIG=|>@)fw;V$}}^RZ4qxtvS=fAyzVhDh{UE;gf$w*fHG*pKKLr$D|Z7xhm3* zH6((8!EEwgF>B7Q2#8{a$&KFTockgmMH-mL`ZI!o!Ey3lCu>ftNJtQ~P6m}%QzIw; zin3!m7dhD~+NvJZ<^*BTppG!8x5WVNyn)7F81xw!7+4q>7>pUf{U1=F3s&LEz`(%7 zz`)=R=0RwXeh)}1nIRr3P6S;KR!W3I8mR*{wHX+|E@oz6U;vFcfNa7>OHHngSwFca zMx&mOfq|h5q>M^58v_Hw1O^5MkP9X=Fff3^athRZ5Dnr_g@*Zb28MdDf*DW+*l3V} z^Puv`G{~U&P;q1$B)))wfq|WYfnhn+qLom3HB>!i-KBN2WPIjs_WmLf1p`nK)DeM1!J4juAX^!Jq>bN2WnSx*&pqfdNE= zn0g?Bfq{V-8l+U85t8N%>OnjP1_lGDfFYC*qCr7w$_UB$=1|%aN?SwKA=6?E3=Dx# zaboFuVinRzT|L;vAV&v*2nGfQWEzwvLKwjV01VksdFs;j3^Xzr)m)IRWL%beKklS0|NswG$_Psp=kt`wvcI%#cj~E*3Jmce;@|P zjt)jh?b8EI{m^*_1`rL>xR4P%y27vt>aeXKO$-bS6wo05Lks|=_MK1*PC*R@Wn)lP z3Bn*D>Q|Q#`@yvl$TGTDi#{M*q17RXiO&I`5)NB63DO4=AFVDyA;GX3H1PxqD^N8F z5&_Ymd;zW|85kJA^k{X-z%W`}l3J^cR+ppICBpz#m!Kvdmg;iz%-kBr$$!hd8CfTL zmWMO4OCMPJIkGaGk!SM8%5X;B z$(&W;jC_+5tHK%iC-1BZXB3z$SRKwNI61RAoKa}WOslN;;88Ko!RtP5w9nQT}e&L}&%vp$?r zZt}zWa7OvbmJQ*PS5)v$ep>9!s5p6ILpY<-XR2Xg)?eQ{@E1Hs5v>XIh;{z^2+9LM(xRrE#ZthlOtQg8FeRbYzb%7 zo6Ol7&Zs{*u{E60VDiq^a7M$)f^Ff9Mw2t!!WoSxA8ZR}G?^^f9?obwxv)K)(QNX` z_Hah?$%-A}j24qCJHi<)CtvIcXSABE*%{7gJ-M+noY7|T&CYN}+sTGq;f!{ZJG;Ue z?I%C%3TJefY}p;o=s0;|cQ~WdLhQ*@X3mk z!xSV!!@X0$S@J=o*@McV( z{BUYGW5#65Y2l2SlP69KXUv-Xa#}cJ_GHKD;fy(xXHE}i%$@vkdN^a=WX~DljQNun z&Io5LnEZ1_IAh`Dz?tEbZ%pBxymh8GWAS9hS>cmArt(fso#o9~I(g%)aK^I9oU_9j z%O@w!4ri>GymNLqW94MQIpK^|lQZXpGgePNI47L3X0qhmaK_rng>%Ch>n5L^8_rli zS#e(Y z@8qcqycydkKU@$#Ib#m*WY>k>jGdDwE)1V6F_(Ap*M;7U-IE;`g-<>)mv{2gMc$0P zlRqvBpIkAIcXH@rZ^r(~3m1n^)|k&bnRSUbk@Cq$&(qEhEMKT zz&km0sW;=)$s3o3PqtXdJ6Uv@H{3;PUXvJC^ZIE?w@;xP0=#<>8Yvmh(>DyTO}r zGDpPu{sFeDaCSypv`3dNZD#oVhoAa>W+j$!GU^ zGoGI;xi5UO##Y|RwfnpoFHSzWFMRTit-O8Lv;ic_4i9i|xFVZ4Y`g-kjWdFnsci9lVp@9`t6sJ=yY5_+*cryp!i1 z@@Bj{`Q@ST$v<}TPWC&+9M1S~vgeWT$q~DGC$Bx?&G>lo&m-ZJ zIri{Qjy>wl^ps)ps-s~{&ln~%9SdW6&M-OZSQyg_hRK_bg)zNkn9OxNjOi7_ZjF^oC)w(1|dnw+xfBPJ}VNW0-vCL>SY1hRISV!Qorh7lz4~PKALcn6*xaF@0m0+;lpO={v*ZTc^XAelScnIupk9 zlVNh#nJ}hb43i(731j-rFxl#C*kq3*yp!ji^=A6ZF!|Nlu*pA;@J{wU=gst=Ve+hV zVUt%J<(>TZoHrxmWY6>AlOvAtPF{Q7n~{0)&-3AvIgayAj=cb?gjQY%pSTrdF^%@HU13yS~bHTM8j38k} z*upM%0q{^v1E>WLTO`pX05xQD!L=4VgNlo=R=p{9HRn=<*pZ4RbZ-N}7V zoi-O-GhhNMb+~7s1$G8#3>?%!fQ}kLnc#s|*h-hP79hQo3$FEmv`)Ir!Ft=8fq@fb z$>ak<8X&>RFCH|oBD?4e#Oj2H94NvNe{p3)*U+&0P40W@CI(v{k(`sMmsJcI>=6i< z{OYM6FKkIfKp@n&@F1J>jDyuAn1O){?2dwKHXwH(J5C%Vz$+LASrs7-TJ-=`x&VjF z0U?gbCv-J77hGGxOew*{wSpDYU1wnMV4JR}z-U$f?>_{9g7_44l+XyGgaO6}MX&}` z>@-vjs2c|wlLP5H0~G@e6qrHPorQ{lhD$)hs33Lcpkkl_#0HQ61A{ulc?JdskN{{H z12mQfG6Xc732IPPut7{y;hLVN$f!2GLy^&=9yF%0jgf(2J0k-FXxw8FBLl-?Mh1o@ zj0_A*85tOsF)}bLXJlYl!N|a{l97R76(a+~YDNZzwV**2M$nuI14APt14A<-WZ))` zk%1wfk%1wXk%6Ir5i$x?$jHD@#K^#4%*eoC!pOh?3K7uAqdX%+J%b`61A{Un1A_`9 z1A{6f1A{sv0|O{{G#MEfv_WHHj0_ACj0_Btj0_Cij0_Cyj0_B%j0_B1pwS)B2oPwH zhLM4Rg^_^)G!FWYfq~&aC^#4y81^tQFzjVuVA#jNz_6czf#CoH1H(ZE28Kfn3=D@E z7#NN))Ptu=7!08!^vMhi44_4Cpw(n)3=9mQr8gO%m0S$qIT!{|qRwGpV8~@)U;wS~ z%4c9;C}3bJ4IV5nqZV5kBOZ80z~fW|~Y zBTHKt85r6@V^*MXtU5->xL7G8149`j14B6@Wa=Q1fq?;(2uwlIz`(!&8aoG#p$0H8 zFnBY7r|=mf85kIR85kI%LF1yJkwpgZ1T%v_19(=8A)JAMA(R0;Q3RU0W{6>6V2EX4 zV2ER2V5s+DU|}&~!EfLk9x`Ln{LV zLoEXXLk$B118C6C0u=wCt|@2+05oV0>Zt!>U|;}^WPnyBZew6z*u=oVu$zH_VFv>P z!*&J+hMf!y44WAk7GB9{EGBDUP zGBEfuGBCI@GBALKq1_l67#tWG82lI+7y=j>7~B~d82lL-7(5sm7;G3B7#tZH7(5vn z7;G6C7`zx67@Qax80Hkw|j$S7_KDn&s4{say1#|#V%E1>?G z4ozCq7#J8pQ#F&I$*W|#s2XFtCMeZ`BHjTs+|R(kpvnMVIK}{)22g}7X9Q2auuV5q zXViBDO@n}>K*f{-w5*V4U;r(82Ca1kPtHk0)`Nl;M1vNff>!^6mJWlK3p0pJU#Z5Z zY{<>Pz@WkaUY846_RL_<0A9twV9NkrWdK_K09rV}V95ZUN@XygUZ~FK&I?-X21;x} zpp-iOuR5c)DJbEB5~?2q0|O{6!V)&J7)T8WgXBQ8@AO0sM&ZaXXu6JI058d40A)T< zaDXx`C<7}&Gc_o^CqUCYXxtH$?m_tqmIpu?9+dGx86M=i!s#nD7^Um8p!pt@|3Rr2 zlukgY8ImW9a2I&RO>49AWJ|NfW$z2m<1p{$Z}A&L>33} zL2@7mgFFIC{2(?cBY@0l0+lWkp|giD13)u|Ad5jWi6G4&$AR)P$bldq;7@z?pzvM> zO`ggO3=B)4DIAotL2(2Mf6xkDP`U&aEeoN=3}`+PG}j2q(V*N7%H^Q=1?6~9P6z1& zsRtEHpvn>Cj1vqD44`Q~PHt(NfT{;jH36zF zK-C7Q`T!L@prQs;?7)g3P_eWXTJ(U5B2W>v5jx-sDz=U>Fff4T1VQtPpt-{P3=9nS z7^Y9tW(=wa6>}iZzhz)xc+SAU0GbMX%D}(?ni>SDP1_)u!n& z&XI<#@_r3n$;!bPXR2pxsb|K}H2tC;qan9+%vLv!nQqYty~5M)f*hgD z1fErHh~B^vk($|(Bf=PGsAr;Q$iQGaUC@Y8lF?(jwh^PGbPN+@6>>v-Oh5bL3#uS1 zz`kZEoE~q)C~4XTRj}wso&n1Vsa%9jvzZ{vrCHOxvhQV^iB75WR#SFZRE(&{LHDX_Gda1 zBQ!D?e3+-dGiB6biesKGWyWa5w3>OkfCZz(^gJ_06Q(W9(>1&qjYKYkdU&86H~LY% zYFlkBMHu%nPtWsav|_r)JbjfnqY=|9=IQsm8D~xZV$LW9GeZWpRVg&#&HrB$62FNs z#u+Qr)F{N6NU=_Lv0yYZgY600Eg~iq+ds33h0#RM)IiUOfdRH_XzTwspSYw>sUl?J zSf{VCV3d%7?K8S&wEKVWr*KAuikYm_A6PI-n89`?ZB}K8HF(h~j8FmFyJYd9+MiFL z{USoYsMhO|%4k~l? zwH8LdFSsF8%wU_o0c1LK(^bRFllQjQ&EM~ZPyySP6>@L?!uBtXQV5x^Y}5aN^ujiB z$yWI@KCQXhfKUP3>eb{uKl}AcE+2%9EBkaGD@F+!*ygZ~qS@+qJ3M(2D(cv$H&`(m z$-p*Y6?c04+p<)ph6$9=4M7Qg5C8OYR*Vv6uw6{|?(Ltu+GwvO3!{Oak*S`c0RwDj z#R>L+>25D_4W|WZOgzk)z`1Q*$=#*J1LWQj0^Z;u{2{YL43j?QF@!Q$> znGh;q8$o!*U0%*xS9TmB6D>G>9!M{2XGZ2un-wN(xz7+PV0%GsH>bH7PP=swAv0BQ z`WukTVB1YryJf}}*{jb%sMsesUBQM?!VI>rL`z7+n6dluLWBy~mX(}@MgOl&-06sr z`7by<52P2icjWoBl1~fmzwJh-fNf6G$rfk-d^pPuA!8*peUA;JgbZvun~`8`*uz~x zNeC6mLeoEhOowfN+m*Uc&s09_Btivj@5;fa6ITd}yMIT>EEbw>XUixd1KS0|A!w() zgK^3kgo;x_(~E2wjbx@sLAGyX{H$qUvES;>#29C!XP{@oz%XBG`T<);2{YI>vU4x5 zu5DfPwHK7CAcY=mV_L@2ux%3qmK7jmen?H{vjgQb=vKCgJ16fsTkOt`PyyTQ*6})I z*_LHK4hWfW>FF_cpnL}17B`bOO!A<|XCZ`&nbOlIfK1;F-B9<^hc)0WW7YwL3ecWA z(3ZQC*0l)+rR~888Ah4u_v{#rWNtz?%ia4w@ou{6c`YYUPA~y2Vty(=UB{kLLI$?Y z&RHPW=D~|*c_(o7XrO1nz@jic!JbjV47MRp^wJZZU*{{gf>jvl85%L5n-0!rCVIx8 z&3e<<*)vKoeUYDj!k*EGiA7<$m;<8^(_y9QDGrP;7@hEBEVIi`#f zOi(>c9jen8fcU!V(_c9<8iDw8Oc*7Yrbtbfb7GV*Yl809Gmp$n`?yd~j|J`p*nYlx zmLTOH6FV*U?tV3PL7AZ@P^$ zql8QmbZ1`K#tRZcR#y_37!5!TA4>*?DSFcjoEasU*6B@;b7hoZ+NC$$!G%$R>6qU1 zea?&$X4mx~8>$$BKK@sJZgUi>(|~~iwjHtSUQG41$jWjhOfhr$2CIl#qdKf($YGupmk>vm0Du7=dba6bF?W zPPg-7l#uCw?y2n7XOXMz_&j7A`TJ#k|+l7a1} z{BWeUV9xb3mqD4xK+j0e03OsZPiGrUPjd(9ghm09m(GF2p@G6AV>(?1j7G4Cfw@5jwq^4x@BZwx%2oa7!RW&T z4MBLo;||Fa2Ge`I7=2((GcucZ(3~wceS#088Pg{I=_h;`T~uT(!OQs?WF{C(w(l3Vtqv4ldZwU4B-3*GoM=V~CMnkGb;gWFGO+!n9!vAq z-H>Nv2Nzl3)Y)q}{fseV8q;jc={Yfs5=_f2r~82l6-cQkVFud33hFMvHtB)wFa#w& z*v4}^=r%yGi~%SYL5eV=>3Y75Ceszn7$xLP7+||NGiANZHsAQ|1TOHvZf&!j9v8$Y zVFugb%D4Q?(!l9=lfdy~3aTJrTSGm0muy4 zF4&g;Tj%|j5Y2r|ShXN|<45R2W+585uBO ztM(x>r-Y{01T#v=U~6VUR7@3|z5!%9Z1ZRb%bJXML8}T-!vLZJTay7Ib6;TkKagH* z%{+(-*k;^A4Da04UNSi#Ol=gL?i0c&A%m@%1=0IoaC$=sql6i3$M0n8H_BPPvpNuF z!1e^6_|_m_vm|sfLPl0_`ZEAy9?SfvVzMIDzG&#A@;5ioGuf}C?SKbnFmp^ zPjGrbD5C_EklXaEP(~NKuWsOx$p)-VWkXO3!P-;>%Lofie*>}&TO1mJRh$xBSa@5EWP(@nBOq1*h)`W0a7=7KaeMje^rZ zfK100hY%IeUD^#vVt+XK8m0bjhIgPPrnzzC}9TM zQ;pE^$RDBuwu}0;bzD5t;?lRwlA)DV}=L~4DWD2-*{;CjRv<{hm zFN)EJ$t`rcPBfzt7fdCr4N8Z~K?Zl_K$^p(HlFAdb(^#%`eKGJ~4w)di#oGMsB9*`E86`+t21Oeq-b*sVqn>)=w=iDN0S9zMz6pdi&ix zMk%i8_8E-Q(_dyXDs2B=!T3Z(D>pGcGg-H|q$o2lJvA>QF)ukaMYkxmI6tQ>)gh}W zGbKH>JT)grzbJM3`YcAh>FHUFTc_KmF-lJlEM}CM9+Sn$J>4^nk$-waI-~gZ%xp$} z#_4Q*j3=inr!!97exZ-?v%qxzG)5^&$e3zYv3?@xEDT++`;vdQ3kwpYh!GMavnzWdRb=)|CJN diff --git a/package.json b/package.json index 4318080..7818ebf 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@tailwindcss/typography": "^0.5.19", "autoprefixer": "^10.4.21", "drizzle-kit": "^0.31.4", + "open-graph-scraper": "^6.11.0", "svelte": "^5.39.6", "svelte-check": "^4.3.2", "tailwindcss": "^4.1.13", @@ -30,6 +31,7 @@ "@atproto/oauth-client-node": "^0.3.8", "@oslojs/encoding": "^1.1.0", "@tailwindcss/vite": "^4.1.13", + "@tanstack/svelte-query": "^6.0.9", "drizzle-orm": "^0.44.5", "postgres": "^3.4.7", "valibot": "^1.1.0" diff --git a/src/app.css b/src/app.css index 7a8d68f..9a8e553 100644 --- a/src/app.css +++ b/src/app.css @@ -18,3 +18,4 @@ @utility border-groove { border-style: groove; } + diff --git a/src/lib/components/BookmarkCard.svelte b/src/lib/components/BookmarkCard.svelte index e30e78d..33c5c30 100644 --- a/src/lib/components/BookmarkCard.svelte +++ b/src/lib/components/BookmarkCard.svelte @@ -12,15 +12,39 @@ let { isOwner = false, bookmark, onTagClick, onTagDeleteClick }: BookmarkCardProps = $props(); -
- {bookmark.subject} - {#if bookmark.tags && bookmark.tags.length > 0} -
- {#each bookmark.tags as tag} - - {/each} + +
+
+ {#if bookmark.$enriched?.favicon} + {bookmark.$enriched.title} + {/if} +

{bookmark.$enriched?.title}

- {:else} -

No tags

- {/if} -
+ + + {bookmark.subject} + + {#if bookmark.$enriched?.description} +

{bookmark.$enriched.description}

+ {/if} + {#if bookmark.tags && bookmark.tags.length > 0} +
+ {#each bookmark.tags as tag} + + {/each} +
+ {:else} +

No tags

+ {/if} +
+ + + diff --git a/src/lib/components/TagPill.svelte b/src/lib/components/TagPill.svelte index 6398657..0454b29 100644 --- a/src/lib/components/TagPill.svelte +++ b/src/lib/components/TagPill.svelte @@ -10,7 +10,7 @@ let { tag, variant, showDeleteButton, onTagClick, onTagDeleteClick }: TagPillProps = $props(); -
+
{#if showDeleteButton && variant !== "menu"} + + {:else} +
+ + +
{/if} - - {#if user} -
- -
- {:else} -
- - -
- {/if} -
- - - {#key page.url.pathname} -
- - {@render children()} - - {#snippet pending()} -

Loading...

- {/snippet} -
-
- {/key} -
- + + + + {#key page.url.pathname} +
+ + {@render children()} + + {#snippet pending()} +

Loading...

+ {/snippet} +
+
+ {/key} + + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 52272d5..1095f69 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,31 +1,40 @@
-

Explore

-

recent 50

+

Explore

@@ -44,14 +53,16 @@ {/each} {/if} - + + {#if data.user} - {/if} @@ -59,16 +70,25 @@
-{#if userBookmarksQuery.loading} +{#if exploreBookmarksQuery.isPending}

Loading...

-{:else if userBookmarksQuery.error} +{:else if exploreBookmarksQuery.isError}

Error

-{:else if queryData} +{:else if exploreBookmarksQuery.isSuccess}
- {#each queryData.bookmarks as bookmark} - {#if bookmark.subject.includes(query) && (bookmark.tags?.some(t => filterTags.length > 0 ? filterTags.includes(t) : true))} - - {/if} - {/each} + {#if bookmarks} + {@const pagedBookmarks = bookmarks.slice(bookmarkPage*50)} + {#each pagedBookmarks as info} + {@const bookmark = info.bookmark} + {#if bookmark.subject.includes(query)} + {#if (bookmark.tags && bookmark.tags.length > 0 + && bookmark.tags.some(t => filterTags.length > 0 ? filterTags.includes(t.toLowerCase()) : true) + ) + || (bookmark.tags && bookmark.tags.length === 0 && filterTags.length === 0)} + + {/if} + {/if} + {/each} + {/if}
{/if} diff --git a/src/routes/[handle]/bookmarks/+page.svelte b/src/routes/[handle]/bookmarks/+page.svelte index 3725554..21d4571 100644 --- a/src/routes/[handle]/bookmarks/+page.svelte +++ b/src/routes/[handle]/bookmarks/+page.svelte @@ -1,32 +1,43 @@ -

Bookmarks by @{handle}

+
+

Bookmarks by {page.params.handle}

+
- - {#if isOwner} - + + {#if data.user} + {/if} @@ -59,17 +72,25 @@
-{#if userBookmarksQuery.loading} +{#if userBookmarksQuery.isPending}

Loading...

-{:else if userBookmarksQuery.error} +{:else if userBookmarksQuery.isError}

Error

-{:else} - {@const { cursor: returnedCursor, bookmarks } = userBookmarksQuery.current || { cursor: "", bookmarks: []}} +{:else if userBookmarksQuery.isSuccess}
- {#each bookmarks as bookmark} - {#if bookmark.subject.includes(query) && (bookmark.tags?.every(t => filterTags.length > 0 ? filterTags.includes(t) : true))} - - {/if} - {/each} + {#if bookmarks} + {@const pagedBookmarks = bookmarks.slice(bookmarkPage*50)} + {#each pagedBookmarks as info} + {@const bookmark = info.bookmark} + {#if bookmark.subject.includes(query)} + {#if (bookmark.tags && bookmark.tags.length > 0 + && bookmark.tags.some(t => filterTags.length > 0 ? filterTags.includes(t.toLowerCase()) : true) + ) + || (bookmark.tags && bookmark.tags.length === 0 && filterTags.length === 0)} + + {/if} + {/if} + {/each} + {/if}
{/if} diff --git a/src/routes/api/bookmarks/data.remote.ts b/src/routes/api/bookmarks/data.remote.ts index 0e16d21..1cf21ac 100644 --- a/src/routes/api/bookmarks/data.remote.ts +++ b/src/routes/api/bookmarks/data.remote.ts @@ -1,7 +1,6 @@ import * as v from "valibot"; -import { getRequestEvent, query } from "$app/server" +import { query } from "$app/server" import { LexiconBookmarkSlicesAPI } from "$lib/server/api" -import { Agent } from "@atproto/api"; const GetUserBookmarksValidator = v.object({ handle: v.string(), @@ -9,19 +8,23 @@ const GetUserBookmarksValidator = v.object({ }); export const getUserBookmarks = query(GetUserBookmarksValidator, async ({ handle, cursor }) => { - const { locals } = getRequestEvent(); - const agent = locals.authedAgent ?? new Agent({ service: "https://api.bsky.app" }); - const result = await agent.resolveHandle({ handle }); - if (!result.success) { throw Error() }; + const result = await fetch(`https://slingshot.microcosm.blue/xrpc/com.atproto.identity.resolveHandle?handle=${handle}`) + const info = await result.json(); + + if (!info) { throw Error(); } const data = await LexiconBookmarkSlicesAPI.getList({ - cursor, + cursor: !cursor ? null : cursor, where: { - did: { eq: result.data.did } + did: { eq: info.did } } }); - return { cursor: data.cursor, bookmarks: data.records.map((r) => r.value )}; + console.log(info); + + return { cursor: data.cursor, list: data.records.map((r) => { + return { did: r.did, bookmark: r.value } + })}; }); @@ -32,5 +35,7 @@ const GetAllBookmarksValidator = v.object({ export const getAllBookmarks = query(GetAllBookmarksValidator, async ({ cursor }) => { const data = await LexiconBookmarkSlicesAPI.getList({ cursor }); - return { cursor: data.cursor, bookmarks: data.records.map((r) => r.value )}; + return { cursor: data.cursor, list: data.records.map((r) => { + return { did: r.did, bookmark: r.value } + })}; }); diff --git a/src/routes/api/metadata.remote.ts b/src/routes/api/metadata.remote.ts index e69de29..80742d6 100644 --- a/src/routes/api/metadata.remote.ts +++ b/src/routes/api/metadata.remote.ts @@ -0,0 +1,11 @@ +import * as v from "valibot"; +import ogs from "open-graph-scraper"; +import { query } from "$app/server"; +import { error } from "@sveltejs/kit"; + +export const getMetadata = query(v.string(), async (url) => { + if (url === "/") { return error(401); } + const response = await ogs({ url }); + if (response.error) { return error(404); } + return response.result; +});