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