feat: improve tweet embedding using react-tweet

This commit is contained in:
Travis Fischer
2024-11-10 16:07:25 +07:00
parent 172bd84f83
commit e2017fdd3e
7 changed files with 165 additions and 87 deletions

62
lib/get-tweets.ts Normal file
View File

@@ -0,0 +1,62 @@
import { type ExtendedRecordMap } from 'notion-types'
import { getPageTweetIds } from 'notion-utils'
import pMap from 'p-map'
import pMemoize from 'p-memoize'
import { getTweet as getTweetData } from 'react-tweet/api'
import type { ExtendedTweetRecordMap } from './types'
import { db } from './db'
export async function getTweetsMap(
recordMap: ExtendedRecordMap
): Promise<void> {
const tweetIds = getPageTweetIds(recordMap)
const tweetsMap = Object.fromEntries(
await pMap(
tweetIds,
async (tweetId: string) => {
return [tweetId, await getTweet(tweetId)]
},
{
concurrency: 8
}
)
)
;(recordMap as ExtendedTweetRecordMap).tweets = tweetsMap
}
async function getTweetImpl(tweetId: string): Promise<any> {
if (!tweetId) return null
const cacheKey = `tweet:${tweetId}`
try {
try {
const cachedTweet = await db.get(cacheKey)
if (cachedTweet) {
return cachedTweet
}
} catch (err) {
// ignore redis errors
console.warn(`redis error get "${cacheKey}"`, err.message)
}
const tweetData = await getTweetData(tweetId)
try {
await db.set(cacheKey, tweetData)
} catch (err) {
// ignore redis errors
console.warn(`redis error set "${cacheKey}"`, err.message)
}
return tweetData
} catch (err: any) {
console.warn('failed to get tweet', tweetId, err.message)
return null
}
}
export const getTweet = pMemoize(getTweetImpl)

View File

@@ -12,6 +12,7 @@ import {
navigationLinks,
navigationStyle
} from './config'
import { getTweetsMap } from './get-tweets'
import { notion } from './notion-api'
import { getPreviewImageMap } from './preview-images'
@@ -64,6 +65,8 @@ export async function getPage(pageId: string): Promise<ExtendedRecordMap> {
;(recordMap as any).preview_images = previewImageMap
}
await getTweetsMap(recordMap)
return recordMap
}

View File

@@ -18,6 +18,10 @@ export interface PageProps {
error?: PageError
}
export interface ExtendedTweetRecordMap extends ExtendedRecordMap {
tweets: Record<string, any>
}
export interface Params extends ParsedUrlQuery {
pageId: string
}