vercel / react-tweet

Embed tweets in your React application.

Home Page:https://react-tweet.vercel.app

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Does not play nicely with Next.js App Directory

JamesSingleton opened this issue · comments

This library started giving the following error when used in the app directory

DynamicServerError: Dynamic server usage: no-store fetch https://cdn.syndication.twimg.com/tweet-result?id=1631369196163440648&lang=en&features=tfw_timeline_list%3A%3Btfw_follower_count_sunset%3Atrue%3Btfw_tweet_edit_backend%3Aon%3Btfw_refsrc_session%3Aon%3Btfw_show_business_verified_badge%3Aon%3Btfw_duplicate_scribes_to_settings%3Aon%3Btfw_show_blue_verified_badge%3Aon%3Btfw_legacy_timeline_sunset%3Atrue%3Btfw_show_gov_verified_badge%3Aon%3Btfw_show_business_affiliate_badge%3Aon%3Btfw_tweet_edit_frontend%3Aon /[slug]
    at /Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/server/lib/patch-fetch.js:261:37
    at /Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/server/lib/trace/tracer.js:108:36
    at NoopContextManager.with (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)
    at ContextAPI.with (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)
    at NoopTracer.startActiveSpan (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)
    at ProxyTracer.startActiveSpan (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)
    at /Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/server/lib/trace/tracer.js:97:107
    at NoopContextManager.with (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)
    at ContextAPI.with (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)
    at NextTracerImpl.trace (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/server/lib/trace/tracer.js:97:32)
    at globalThis.fetch (/Users/jamessingleton/Code/Projects/redshirt-sports/node_modules/next/dist/server/lib/patch-fetch.js:31:47)
    at getTweet (webpack-internal:///(sc_server)/./node_modules/react-tweet/dist/api/get-tweet.js:38:23)
    at TweetContent (webpack-internal:///(sc_server)/./node_modules/react-tweet/dist/tweet.js:19:85)
    at attemptResolveElement (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:1091:30)
    at resolveModelToJSON (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:1366:41)
    at Object.toJSON (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:948:28)
    at stringify (<anonymous>)
    at processModelChunk (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:156:24)
    at retryTask (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:1605:38)
    at performWork (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:1643:21)
    at Timeout.eval [as _onTimeout] (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js:1188:28)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7) {
  digest: 'DYNAMIC_SERVER_USAGE'
}

This is how I am using it in my application

import Image from 'next/image'
import {
  PortableText,
  PortableTextComponents,
} from '@portabletext/react'
import { PortableTextBlock } from 'sanity'
import { Tweet } from 'react-tweet'

const TweetComponents: TweetComponents = {
  AvatarImg: (props) => <Image {...props} alt={props.alt} />,
  MediaImg: (props) => <Image {...props} alt={props.alt} fill unoptimized />,
}

export function CustomPortableText({
  value,
}: {
  value: PortableTextBlock[]
}) {
  const components: PortableTextComponents = {
    types: {
      twitter: ({ value }) => {
        return (
          <div className="not-prose flex items-center justify-center">
            <Tweet id={value.id} components={TweetComponents} />
          </div>
        )
      },
    },
  }

  return <PortableText components={components} value={value} />
}

What version of react-tweet do you have installed? I think this issue was fixed in this PR for this similar issue. Has not been released yet though...

Maybe @lfades or @leerob have some insight on when a new release will be published that has this fix in it? I've seen others are still waiting on the current v2.0.1 to get published to NPM as well.

Ah I have the latest that's on NPM. I'm waiting for another fix to be released as well. Hopefully they can get it release and I'll check it out. I just randomly started having this issue so I wasn't 100% certain what was causing it.

Update: I confirmed I have "react-tweet": "^2.0.0", in my package.json.

I am also waiting for this PR to be released but it looks like it didn't even create a release in GitHub.

Should be up now: https://www.npmjs.com/package/react-tweet. I'm sorry for the delay! and yes the release action is broken (the action itself is not failing but the token it's using is invalid). The ownership of the package is being moved to the vercel npm org and we'll have a new token for it!