import React from 'react' import {RichText as RichTextAPI} from '@atproto/api' import {useAgent} from '#/state/session' export function useRichText(text: string): [RichTextAPI, boolean] { const [prevText, setPrevText] = React.useState(text) const [rawRT, setRawRT] = React.useState(() => new RichTextAPI({text})) const [resolvedRT, setResolvedRT] = React.useState(null) const {getAgent} = useAgent() if (text !== prevText) { setPrevText(text) setRawRT(new RichTextAPI({text})) setResolvedRT(null) // This will queue an immediate re-render } React.useEffect(() => { let ignore = false async function resolveRTFacets() { // new each time const resolvedRT = new RichTextAPI({text}) await resolvedRT.detectFacets(getAgent()) if (!ignore) { setResolvedRT(resolvedRT) } } resolveRTFacets() return () => { ignore = true } }, [text, getAgent]) const isResolving = resolvedRT === null return [resolvedRT ?? rawRT, isResolving] }