diff --git a/bun.lockb b/bun.lockb index 58777ca8441a3fa307a62ef6db85286274bd242f..4769cc72952b373ae63d62439f9aa443aa24157c 100755 GIT binary patch delta 14612 zcmcb(p6%K$wh4MlkquR~$C_ECx9rUH6Kpci2wUbJdv#g&`N^vsGf%s*t~fSlV!#f| zYs?G`ybKHtdzcv*q!<_)dYBm)L>U+w7&#aiBpDbQ7BVw1NHZ`rWO6Vth%+!WykdvY zX_Flp)j9WbF)(m3Ff?qNT*xS1U&F`1puoV;5YNZJAj`ne;LOLsAj81Wpvea@n+GcX znHOUARbB=LIR=J??NE9eF9U-j14Ba@FT|WMC~X0i7v*JOP-b9g_{_t=pv1t?aD|6~ zL7su3VJn2LZmSLK0trXat#B)Pblpg7(^Ht8bYArR+12pse#4o85#s685qPE z7#jXcKs3CNfQ05X35Y?5Bp?Q?k$|Y10p&MJKteSeDjosV?*f%Kg6fxp@;RXDzKTQa zc_7ZfAX?AB&~Qc^V!<|Xhy{zF{0ZU^2ZVD$=p#xD3~He0Re}U*9h8nyf&{I#5+o|5 zp!6?ANR-@y(z_KQK|fa!65_Yj7#M6p>1Mkc1A_nqLqkb%PG%AV1H%e61_pixhK4z6 z3=BLB3=PNCAP%gDYD`juq?Pc=Cz;Lb+cY8mapPiO5M*Fzu+xT`mROLOl#|LZU7LY{ zn}MO>B^SgrKV1d}2?mA+V_itZis?d3`=$eRt_~z29MplNxFtFe`A!{(`g|Qo1V-q9 z!+&x;i(>r^BZvzp7(wi)%1>bcfh=PP|F97xPUo3G63-J8h#TWfAwKmsh4|rzDa5Vs zO&J(CL2fjKxU~gpZmkIZdQb(QEFf{GX9BTctq~-S z=NLf(D=WV^735G4BL;Bxm~REKurx0vGdYuifyo+dLBnDOh(}6tQi?(9H(Ntee_3Wp zDg#431H()Ph(HrmVR2##*x=lvOptnpmG>O?9Vc6PPJD9rrh}-^%14${mQ{Y-dgHeJp1Plc zsoDQb&dyw1!O6I}fh&R8LW3n!z@76~#eCHU9qrcCB&`HlWzXveKh4d%dfoT%uZ`;r z%`EpS-r1ghpet6|UVoR8{B%iKrJ(N35_|znlN$syBwkN@m~PcOP2%SF{*+w{o_w6T zXt8+W9_G%;D+Cfaq|d0XT){0jVKRr{9mc51il*9=0|YrHO9%-}UgE3)VsDNRI>R)1 ziKq#aIQ!&Ta(0YClOsj#8JA3!6ticPnj9%+&(y#%`Ie|1=OqpX1}_GN2Ik3$Lgt(@ zoDd$vWJNJ^#_GwE;`Y1;IT;w-85kN^85kHKmQAqdoIF$9p0RE6O>uiBCho~n5_XJM zlOrYUIm@{j7_1l=8dxSL3Y&9op4B7cR`ekP2q)5oTbB2eYI_V5}+;n2zfrFh?1P!eskJ!D2Et zETRky;UKMy_LFbQ*|YYDF)%nymKC?=JSWD$U;}CzO->XsXOx&cQ{J92V)9LSd)E1q z3=FQ5@5)=VK9OW#a0j!rr5G4I!K@M~kgTkV4T}^g2tdmCq+ycb(hLl~U}a0BVOn2H zGcb6A#mrRGey*99d#5KB%El+Zz}Mm+|G%*i0uD?Ly`2eG{MLAeFQTBZ+E$7ul5 zn_&P-)F9cT2B35cV#ydXFxZ2<$e2Aj($JoBwjl$911u<*ZW~U%WoXCr#%QvXksYV8 zF$04+149D?I3Jfyo@r#yxODPOBYV!L#taOe5E(gh#?_M}jqN$Vm@qKdgT)dJ%~^9z z85nFQ%Nkj8t}?xH%__CBy~>P)_7@vV{1LVe&&=bH=90k>>WS=PW_FHrCvlQDE{-b9+XI$&wcK ztlOceJ$a^uJ*R^;q)cO)tY~U3SY^$?U*%NC-Vaq>e=b51K; z1_nKFgeaPtb7t5=5*N#4MICd_1#n)Xjycl}+sU)6L1p|+YkSUpc90lh1{ujHIXTkC zp0RrJOdETq?e>$SgzQ+q+JjR6Tss>U2T*Y!YirF~;{eLEAl6AZOUw}_mJDZYa0G?S zTw5C!M^N4dX>f6Zv3kL*yN)(2U1+?mdCvBX^C#bQwr9QO z&cNU|`L44ytBMB$gAbTh0B7xivTRs9VUi)93=CdiW%E247(BqNXK3cnS9s9hQ$}maJFWxgR>67 zS!{k#Sw^qPH$6ecprn^QLFz&Kga%bZgs5RwX+L0N$@X0oIYC=?@o?3w-qPM+ms#~Km@E-pQ- z1t$eTn-UBR44|fiFgWQ?aNwLA>1)q9F_?kD1#E1hjydQ3VC1q=ID~;A4BTn}<>D0~ z5IIJ0E*1=hr(+F@s8W)(hdFTq3Ju&B!tNW`I4T&1A_y zd&bJik%9J1ha)D>3bbSW8o|I|HuKUL6Fb%S}9h&$$APN{j zG>F;B$iM(fbiIt=J{!YqkRSsCmJjmi*Pzz2^ zo)|rOG&5nzGozUansz~%2vmN6Xi(b3mWe>}An_5NnKs`{R$+8l%<+7=kIjasPmP3b zwmoNGcTAtlLRoHWkwX86X^Yt^|9FXOy-3yl$jx%E`jN=-t?W7bC(Ky&UzX*b--?7| zIsVR*ZBr#2avp`xdc$qHO3Oy&n)S*4-QPbP>C3E0v=scldr@CgmRIqgye<1qUKL-t zF(TUbQYsb!w!u9!FMLW>t}UoO3W^VHM_%#&5Kycq>2SC)lOmdN6rd^XdYQF!vn ztnkSvvUn%!W_vS=PA<#}-&~O`%IGlp%N_SJscAKj@{Tj;>@loTy0UZMV)Kd2`b^Co z?_NFq$HC#Hxn=(H@9*9hI2JwsQ{TPBPIv#?xZPY_9P-beaK>&vo3n#+^4&6TM)S#< z<>8Yx%6TXEmU}Z=PQFMEhcgCD zK3E^l7&uw7A)GO2a$!R_WANmY4dIL-lNB4o8AB&mHik2XO}^L|&KN#fvniZ0Vsc|s zIAi4Gn@!=2QIidu!x^I|cQ%Jl?r7$n{I=PfF?O}z2S_NlW+EhGgeJD>nFeL z51;&^pLeqF1aHR1$ulQ}Po6P>ck?Ci-_Q@+Jg->2FiFY#ZWN*gK$&r)8Cr3=?oxFFlH)Ho?&MD!OIi~PV&Yj}T*gJXW zl<>(rrtnUdo$AflKRI)1_~eYKypzvP^=6znS#nzVWQl3KlWV7WGftj-a$5N06VrGn z>rVG(oI1I3didmu>AaKgPWNV{SW}H2_ zb7uJDj+wlZ-_G=AoIBZaR`_I#S$vb{&GPb{4=S^un8oI6)8xJXzO+kcUS(xDWb;x; z^r4H;Vw1=#Yp0vYZ~3957<75@_7nFdY()OXxG_JxxyJ0Vg;svMo>$JRw+nW#g-*UZ zOJcI`Y;VSelV{EjpFCqWuS4ht8_&b~3@x1|Q=?r>PL}9sIWkQ z-@!%rKmLD=3=B&r2hI(j{9_L9FMM*uJl@HB z=Xo=(p3FHvd@{#;-pRT1y&2a|-Z?*f@{akulVulpGp?VUxgeZz!{mbt!WlPCmRuM< zSz;mYTpZ50bMno_ z;f%W`8!icF+&#H-NjT%4$q$!=Gwz*ixip+{-{gr)!x{Haez`Q9@xWxqW#NnmC(m3K z&Uk3@$7SJ+hbMb34`)0wdExSK#-o#eE)QosHaT!bIOFljD_4Y1Ua^9AGVe-n#*>pH zSB6iHSjjti?@DjR(~~(@g-_;K#XC87l{e$r$vantGoG6)xH_Ei{N&8l;fxn1A6y;I zcyY4insCNTlMB~`GhUv2a!oknmC1^0!x^tmu3Q_=cy02&G>S1CO0ca^ueM$rU?zCqLck&G>z?;jZw>8asI>ho*Wn z{+yhd89w>OPTt9PcX<2$hT09HSR{X+TU}tk;z(kD(%*^|A2a${^_DrePnq$)&A3%) z^8er4n7$Z%U#TPb^k707!K6f`exm!NLf-Td$zI}_^)KaiTj1NI;ZM%KxO7lnCX^H9k-nR=50&p3djxL}h{9|I@P zyO_j!HJE{cYjWX%YLMh)n*$oWo5CPdMSH>+7Lrl|{-pkIYK79i_qenfcSGApyfnf(D z0|TgQwwRHDVF{>AWn^Gj#>l|1oRNWH1tSB)N=62TRg4S_s~H&>)-W_%bpuxH2*@_%JdsI509W_%SjtxG^#?fJRl^85tNH85tP- z85tM?85tNn7#SD>7#SEm85tOC85tOy7#SG67#SGs7#YMEycro7oEaGy>=_vtBDf(@ z)iS-2n^E1Ajgf%?R8D}(Do~mD1nLe@?1J0@>d}Gb=@&6DFo0@*&{TZm^t;@Q-Mqq} z(Pjql%sPYM^im#1b6Ww(^eSlP7_|HZw15Y+ECS3IWdP6VGZZi|FoZIImpy>y@jwe_ zK#Ok}%%;EOVRUB{oNma=7|m%3ol`ZRK9iR*UC}U0|RJvLJ`RJ={xxt)$2F!VDpFtjj0mMhF)U|?ux zU|?uwU|?v4inl@8FdC$HIs*g46b1%{$xt&UAejTw+X27DmX_4>M@6j1j!%fq{_`QUd>j z78?wV3=Dr57#KkIgR(Cu6v6IcU|;~L`OCn-z`+O}%m$CB(=DNfdRIt0k(R811|5<&{LE(5l@0U-k_xj+lQU@IjM zGNAkgTFmA3<75u&`^6y$8Q20O*eVNz46OB_!ID`IUWkE^0;Ob-MGr2!X^XxQ*~$bD z1yK40t!=!&GdN3)|4k!829(-CtJPky>FmwA_hdOj<|YGpRI@?XO4zhdaYrpe29#bw zYy4dHT-N&~JXLftLJE{LKtAeMTUgUMFK`z^2DIWZy(qO<$>`(i8;(joFq!RKB8=~t zSS$_njJE#~WBkC#^oo7@I|)V!M#ky+l8lm!nbQ>|8I7gWI3ep;9{xMKPQ!$E1`}hP zp`MYRAp-+goiC%?^t~YE;nS~6GHP>Va)Hxx!*mC0Mv3W4Qj9W;+osz~G5Rv@pWZ9Q zXe@jW+WMNPAJwb2)z(sk@#OT&QjFG&FQ@ZMGa55~o$f5nxD}#Fl5yK~VHrkWM%C$w zGK`Xp4%4e;7$v1)iz@?Xy?f`d;Nm|PMiV_#1JGi%>gnrc7$r?%t1;P1E~Vt0`^JXC@BqFbEO)-d=oG|?&Ncp1auR+wd>48R!!t6$-dWHrJXQnqAG74Km zIIz`l^P~-SU4EGy#lmQy2a$oTV>57?6~CR0p9vwuF+EqFQBoSVFzyh;J9o90Ob!SI zM$;F{GfFbLOy3Ps2U{4oXk}g2I}X)L2zA-h-^(*fn!=XuU0f(2dqm@UfUUNBKCR@_Li=yK5i&0%ruQf?N=U;N z?sc%N$%q%Usz9g^n7&_uQPLE)GH|l>8|AFtSse%ku(i6oQupbZ%7>jq$b?MiRb-T8 zOq+htgi(YI9Ntya9YI39)1ws`jTytI_bW0=n!=W&q$zC8u8Luxo^#Z$euM(ps@|7AtO0Ksvko9+7EWKQ z#3;#lWcqO>Mq|b~(|;>5N=n1l>Siup#J598$kho{$e8GvGB9kPuCL4}X?h&Gc(?ce z6P>5_iAG=r2B7t*p!L6?<-ekrp6L8KU%AzZG0p%~J{d90nO>`m#cXi0H_N3Z^h?dc78- zvzv)A&PdM)R0ANp%zL__7NaC%+;m4hMoDSdYUm@82H&}Qw)I2PfdK;pL=V#s)9JIc z7>yXSrk~YfG-gbj&Is}l)V)w&I!^c3W;AAm3Zi&o`UP!9DMm;zFnzL^o~OeofmIoH1FR&URSG#2dmuQWCJW-LM6$OpI|RdIoxi)9tJoWf;Y$uhnOil!h&Tj`vt_ zrbYa)JUD3>g4zJq(;w^Xlx2w4?azx!O=K&ohw+msh*J`18ik@ z%m1zOeoKhvfm4Nno&f_x;q+PqMoC6+^(3rlXrX6hz<{lufXIYQKW)G$DFa%^4O;DN z=5uD-!bw}IKxI8d!B_EVhKv%X*y=Zk0&F!5Ll-ml2LB@Y(qv#Y1o4F+s$cihSP2xM5voF{k$Qgq$#$_5Mmv+nhYWXuBe2k8yGRN zNn>jZKvaR-50Z==)3c2jC8fbj>lqjtR=Z`!7TK%MK{#a1^!XqK*eZ00L7S&vHez(; zoaPQ$kv(C$qA@H&M5g;2GqOr!iw`41P`wc{J>Qs7(iB^KKonqYv4FKkOy6tFD2cts z2P>$W{t@JmMbo)W7$q6O;V#S$F;#B5y$PeFDYnpuD8SlC0h@Ygdantiq%^kBhiC-VnqogUez=mjs?R3aVSoHte#GQ_yXn@ExPLDN(HxikC z`AuJA$|&IvTW_B~<2-*|htG6yE;KUHGhu+O$TyypTy=2nf?6gF#Vi4qY+bo$aE$P#tNnxA=7It7$unQ zgiN1i!RW*KJd}ZfcltsrM$zdB7K~D?GeQ^`1h$KcGv+fgWrm>WAFzNY|VdN^bc4{Y;6&BTLI><1L) zGBNH5pZ>;*(TY)fy1F%^F~mU0=_S^TQjAQvtgZq}#OY9kw8O^reuxIRGp8nLCQF;0oM@FgX zdxIDirf-8UP^cc%ZfXXKx5;>ajI-O`0oZ@aTABP%1L<#a=T zM&;=S{fs=@E8G~hc(&gSVhmPgGBlWOSix8`{dypy^z@f*i~@}2(^pn7PG>Zl?pVoa zHvM@eW8C!eO2&fe>uec0w%1lM-VtH7)GJA^+TPdC7{my1fzD(`q3Ks9GD~!@~Mw#hy(-}7d0B_{8hX4Qo delta 14720 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 IJcn^J00%1bu>b%7 diff --git a/package.json b/package.json index eacd14e..1994836 100644 --- a/package.json +++ b/package.json @@ -14,23 +14,23 @@ }, "devDependencies": { "@sveltejs/adapter-netlify": "^5.2.3", - "@sveltejs/kit": "^2.42.1", - "@sveltejs/vite-plugin-svelte": "^6.2.0", - "@tailwindcss/typography": "^0.5.16", + "@sveltejs/kit": "^2.43.4", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/typography": "^0.5.19", "autoprefixer": "^10.4.21", "drizzle-kit": "^0.31.4", - "svelte": "^5.39.2", - "svelte-check": "^4.3.1", + "svelte": "^5.39.6", + "svelte-check": "^4.3.2", "tailwindcss": "^4.1.13", "typescript": "^5.9.2", - "vite": "^7.1.6" + "vite": "^7.1.7" }, "dependencies": { - "@atproto/api": "^0.16.9", + "@atproto/api": "^0.16.10", "@atproto/oauth-client-node": "^0.3.8", "@oslojs/encoding": "^1.1.0", "@tailwindcss/vite": "^4.1.13", - "@tanstack/svelte-query": "^5.89.0", + "@tanstack/svelte-query": "^5.90.2", "drizzle-orm": "^0.44.5", "postgres": "^3.4.7" } diff --git a/src/app.d.ts b/src/app.d.ts index 77c3eb7..49da2b1 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,6 +1,6 @@ // See https://svelte.dev/docs/kit/types#app.d.ts -import type { Agent, AtpBaseClient } from "@atproto/api"; +import type { Agent } from "@atproto/api"; import type { ProfileViewDetailed } from "@atproto/api/dist/client/types/app/bsky/actor/defs"; // for information about these interfaces @@ -10,7 +10,7 @@ declare global { // set on `hooks.server.ts`, available on server functions interface Locals { - agent: Agent | AtpBaseClient | undefined; + authedAgent: Agent | undefined; user: ProfileViewDetailed | undefined; } diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 2615209..7b0acc3 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,5 +1,5 @@ +import { Agent } from "@atproto/api"; import { atclient } from "$lib/atproto"; -import { AtpBaseClient, Agent } from "@atproto/api"; import { decryptToString } from "$lib/server/encryption"; import { decodeBase64, decodeBase64urlIgnorePadding } from "@oslojs/encoding"; @@ -25,20 +25,13 @@ export const handle: Handle = async ({ event, resolve }) => { const oauthSession = await atclient.restore(decrypted); // set the authed agent - const agent = new Agent(oauthSession); - event.locals.agent = agent; + const authedAgent = new Agent(oauthSession); + event.locals.authedAgent = authedAgent; // set the authed user with decrypted session DID - const user = await agent.getProfile({ actor: decrypted }); + const user = await authedAgent.getProfile({ actor: decrypted }); event.locals.user = user.data; } - else { - // set public API agent - const agent = new AtpBaseClient({ - service: "https://slingshot.microcosm.blue" - }); - event.locals.agent = agent; - } return resolve(event); } diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..b978f95 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,24 @@ +// --- UTILITIES --- + +export type LexiconCommunityBookmark = { + $type: "community.lexicon.bookmarks.bookmark"; + subject: string; + createdAt: string; + tags?: string[]; +}; + +export type LexiconCommunityLike = { + $type: "community.lexicon.interaction.like"; + subject: string; + createdAt: string; +} + +export function parseAtUri(uri: string) { + const regex = /at:\/\/(?did.*)\/(?.*)\/(?.*)/; + const groups = regex.exec(uri)?.groups; + return { + did: groups?.did, + lexi: groups?.lexi, + rkey: groups?.rkey + } +} diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 0920fb8..71db0f7 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -2,5 +2,5 @@ import type { ServerLoadEvent } from "@sveltejs/kit"; export async function load({ locals }: ServerLoadEvent) { // have user available throughout the app via LayoutData - return { user: locals.user }; + return { user: locals.user, authedAgent: locals.authedAgent }; } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 21abc1b..8745123 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,42 +1,53 @@ -
-
- + +
+
+ -
- {#if user} - ๐Ÿก -
- -
- {:else} -
- - -
- {/if} -
-
+
+ {#if user} + ๐Ÿก +
+ +
+ {:else} +
+ + +
+ {/if} +
+
-
- {@render children()} -
-
+
+ + {@render children()} + + {#snippet pending()} +

Page loading...

+ {/snippet} +
+
+ + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e69de29..90433e2 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -0,0 +1,2 @@ +

explore

+

coming soon...

diff --git a/src/routes/[handle]/home/+page.svelte b/src/routes/[handle]/home/+page.svelte index 247a4c5..731b4d4 100644 --- a/src/routes/[handle]/home/+page.svelte +++ b/src/routes/[handle]/home/+page.svelte @@ -1,5 +1,35 @@ + +{#if $bookmarksQuery.isLoading} +

Loading...

+{:else if $bookmarksQuery.isError} +

Error

+{:else if $bookmarksQuery.isSuccess} + {@const bookmarks = $bookmarksQuery.data.records} + {#each bookmarks as { uri, cid, value: bookmark }} +

{bookmark.subject}

+ {/each} +{/if} diff --git a/src/routes/oauth/callback/+server.ts b/src/routes/oauth/callback/+server.ts index 130e0f1..e5c180c 100644 --- a/src/routes/oauth/callback/+server.ts +++ b/src/routes/oauth/callback/+server.ts @@ -30,5 +30,5 @@ export async function GET({ request, cookies }: RequestEvent) { error(500, { message: (err as Error).message }); } - redirect(301, "/farm"); + redirect(301, `/`); } diff --git a/svelte.config.js b/svelte.config.js index 573b201..0b4933e 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -9,7 +9,13 @@ const config = { kit: { adapter: adapter() - } + }, + + compilerOptions: { + experimental: { + async: true + } + } }; export default config;