bf8b6bc0c7
- PasswordSession (@atproto/lex-password-session) is now the single auth
core; SessionAgent bridges it to the base Agent from @atproto/api so
the ~148 useAgent() consumer files keep working unchanged
- SessionBundle carries {session, agent, accountClient, appviewClient};
useLexClient() now returns the authed appview client, new
useAppviewClient()/usePdsClient() hooks
- reducer: OpaqueSessionBundle, new replaced-current-bundle action for
network-free cross-tab same-did sync (PasswordSession is immutable, so
the bundle is rebuilt instead of mutated in place)
- moderation: AtpAgent.configure -> Client.configure + Agent.configure,
per-account labelers on both the bridge and the appview client
- push-token unregistration uses temporary PasswordSessions
- hard-tail migrations: SignupQueued refresh via resumeSession shim,
useBeginAgeAssurance scoped-token raw Client, useAccountEmailState
reads currentAccount
- PDS routing preserved on the no-network resume fast path by
synthesizing a minimal didDoc from the persisted pdsUrl
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
42 lines
840 B
TypeScript
42 lines
840 B
TypeScript
import {type AppBskyFeedDefs} from '@atproto/api'
|
|
|
|
import {type SessionAgent} from '#/state/session'
|
|
import {type FeedAPI, type FeedAPIResponse} from './types'
|
|
|
|
export class FollowingFeedAPI implements FeedAPI {
|
|
agent: SessionAgent
|
|
|
|
constructor({agent}: {agent: SessionAgent}) {
|
|
this.agent = agent
|
|
}
|
|
|
|
async peekLatest(): Promise<AppBskyFeedDefs.FeedViewPost> {
|
|
const res = await this.agent.getTimeline({
|
|
limit: 1,
|
|
})
|
|
return res.data.feed[0]
|
|
}
|
|
|
|
async fetch({
|
|
cursor,
|
|
limit,
|
|
}: {
|
|
cursor: string | undefined
|
|
limit: number
|
|
}): Promise<FeedAPIResponse> {
|
|
const res = await this.agent.getTimeline({
|
|
cursor,
|
|
limit,
|
|
})
|
|
if (res.success) {
|
|
return {
|
|
cursor: res.data.cursor,
|
|
feed: res.data.feed,
|
|
}
|
|
}
|
|
return {
|
|
feed: [],
|
|
}
|
|
}
|
|
}
|