flip types/bsky sources to #/lexicons, add chat client and strict hook contracts
Phase 3 task 2: types/bsky sibling modules (post/profile/starterPack) now source from generated #/lexicons with interim dual-world widening aliases (TODO(phase4) markers). SessionBundle gains a chatClient proxied to did:web:api.bsky.chat#bsky_chat via useChatClient(). usePdsClient() and useChatClient() no longer fall back to the public appview when logged out - they return a client that throws NotAuthenticatedError before any network I/O; useMaybePdsClient()/useMaybeChatClient() cover logged-out-aware callers. RichText pilot: useRichText.ts on @bsky.app/sdk/richtext with detectFacets(pdsClient); RichText.tsx display sink accepts both worlds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,20 @@
|
||||
import {useEffect, useState} from 'react'
|
||||
import {RichText as RichTextAPI} from '@atproto/api'
|
||||
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
|
||||
|
||||
import {useAgent} from '#/state/session'
|
||||
import {usePdsClient} from '#/state/session'
|
||||
|
||||
export function useRichText(text: string): [RichTextAPI, boolean] {
|
||||
const [prevText, setPrevText] = useState(text)
|
||||
const [rawRT, setRawRT] = useState(() => new RichTextAPI({text}))
|
||||
const [resolvedRT, setResolvedRT] = useState<RichTextAPI | null>(null)
|
||||
const agent = useAgent()
|
||||
/*
|
||||
* Facet detection resolves handles via `com.atproto.identity.resolveHandle`,
|
||||
* which the account (PDS) client serves. We standardize on the account client
|
||||
* where a session is in scope (design section B). Logged out, this is the
|
||||
* throwing client; `detectFacets` will reject, and the raw (unresolved)
|
||||
* RichText is returned in the meantime.
|
||||
*/
|
||||
const client = usePdsClient()
|
||||
if (text !== prevText) {
|
||||
setPrevText(text)
|
||||
setRawRT(new RichTextAPI({text}))
|
||||
@@ -19,7 +26,7 @@ export function useRichText(text: string): [RichTextAPI, boolean] {
|
||||
async function resolveRTFacets() {
|
||||
// new each time
|
||||
const resolvedRT = new RichTextAPI({text})
|
||||
await resolvedRT.detectFacets(agent)
|
||||
await resolvedRT.detectFacets(client)
|
||||
if (!ignore) {
|
||||
setResolvedRT(resolvedRT)
|
||||
}
|
||||
@@ -28,7 +35,7 @@ export function useRichText(text: string): [RichTextAPI, boolean] {
|
||||
return () => {
|
||||
ignore = true
|
||||
}
|
||||
}, [text, agent])
|
||||
}, [text, client])
|
||||
const isResolving = resolvedRT === null
|
||||
return [resolvedRT ?? rawRT, isResolving]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user