mirror of
https://github.com/d0zingcat/nextjs-notion-starter-kit.git
synced 2026-05-13 15:09:47 +00:00
feat: improve tweet embedding using react-tweet
This commit is contained in:
62
lib/get-tweets.ts
Normal file
62
lib/get-tweets.ts
Normal 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)
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user