fix(tweet-preview): guard JSON.parse to avoid crashing on malformed tweet data

TweetPreview was passing the result of `JSON.parse(data)` straight into
`enrichTweet` whenever `data` was a string. If a document's stored tweet
metadata was ever a non-JSON string, truncated JSON, or `"null"` / `"123"`,
the unguarded parse threw and crashed the React tree rendering the
document modal or memory card.

Extract the parse into a `parseTweetData` helper that returns `null` when
the input is missing, fails to parse, or doesn't resolve to an object.
TweetPreview now renders nothing in those cases instead of crashing.

Also widen the prop type from `Tweet` to `Tweet | string` to reflect the
runtime input both call sites already pass.
This commit is contained in:
vimzh 2026-05-24 11:46:19 +05:30
parent a8d36df38e
commit e5ead50a3d

View file

@ -117,14 +117,26 @@ function CustomTweetMedia({
)
}
function parseTweetData(data: Tweet | string): Tweet | null {
if (!data) return null
if (typeof data !== "string") return data
try {
const parsed = JSON.parse(data)
return parsed && typeof parsed === "object" ? (parsed as Tweet) : null
} catch {
return null
}
}
export function TweetPreview({
data,
noBgColor,
}: {
data: Tweet
data: Tweet | string
noBgColor?: boolean
}) {
const parsedTweet = typeof data === "string" ? JSON.parse(data) : data
const parsedTweet = parseTweetData(data)
if (!parsedTweet) return null
const tweet = enrichTweet(parsedTweet)
return (