Bluesky app fork with some witchin' additions 馃挮
1import {useEffect, useState} from 'react'
2import {RichText as RichTextAPI} from '@atproto/api'
3
4import {detectFacets} from '#/lib/strings/detect-facets'
5import {useAgent} from '#/state/session'
6
7export function useRichText(text: string): [RichTextAPI, boolean] {
8 const [prevText, setPrevText] = useState(text)
9 const [rawRT, setRawRT] = useState(() => new RichTextAPI({text}))
10 const [resolvedRT, setResolvedRT] = useState<RichTextAPI | null>(null)
11 const agent = useAgent()
12 if (text !== prevText) {
13 setPrevText(text)
14 setRawRT(new RichTextAPI({text}))
15 setResolvedRT(null)
16 // This will queue an immediate re-render
17 }
18 useEffect(() => {
19 let ignore = false
20 async function resolveRTFacets() {
21 // new each time
22 const resolvedRT = new RichTextAPI({text})
23 await detectFacets(agent, resolvedRT)
24 if (!ignore) {
25 setResolvedRT(resolvedRT)
26 }
27 }
28 resolveRTFacets()
29 return () => {
30 ignore = true
31 }
32 }, [text, agent])
33 const isResolving = resolvedRT === null
34 return [resolvedRT ?? rawRT, isResolving]
35}