Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/crazy-cups-jump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"thirdweb": patch
---

Fix "Cannot read properties of undefined (reading 'forwardRef')" error in certain bundler setups
247 changes: 123 additions & 124 deletions packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"use client";
import React, { useState, useRef, useEffect } from "react";
import type React from "react";
import { forwardRef, useEffect, useRef, useState } from "react";
import {
CarbonDocumentAudio,
CarbonDocumentUnknown,
Expand Down Expand Up @@ -49,134 +50,132 @@
* @param props - Refer to [`MediaRendererProps`](https://portal.thirdweb.com/references/typescript/v5/MediaRendererProps) to see the available props.
*/
export const MediaRenderer = /* @__PURE__ */ (() =>
React.forwardRef<HTMLMediaElement, MediaRendererProps>(
function Media_Renderer(
{
src,
poster,
alt,
gatewayUrl,
requireInteraction = false,
width = "300px",
height = "300px",
style,
mimeType,
client,
controls,
className,
},
ref,
) {
const mergedStyle: React.CSSProperties = {
objectFit: "contain",
...style,
};
forwardRef<HTMLMediaElement, MediaRendererProps>(function Media_Renderer(
{
src,
poster,
alt,
gatewayUrl,
requireInteraction = false,
width = "300px",
height = "300px",
style,
mimeType,
client,
controls,
className,
},
ref,
) {
const mergedStyle: React.CSSProperties = {
objectFit: "contain",
...style,
};

const { mediaInfo, isFetched: mediaInfoIsFetched } = useResolvedMediaType(
client,
src ?? undefined,
mimeType,
gatewayUrl,
);
const { mediaInfo, isFetched: mediaInfoIsFetched } = useResolvedMediaType(
client,
src ?? undefined,
mimeType,
gatewayUrl,
);

const { mediaInfo: possiblePosterSrc } = useResolvedMediaType(
client,
poster ?? undefined,
undefined,
gatewayUrl,
);
const { mediaInfo: possiblePosterSrc } = useResolvedMediaType(
client,
poster ?? undefined,
undefined,
gatewayUrl,
);

if (!mediaInfoIsFetched || !src) {
return <div style={style} />;
}
if (!mediaInfoIsFetched || !src) {
return <div style={style} />;
}

if (mediaInfo.mimeType) {
// html content
if (mediaInfo.mimeType.startsWith("text/html")) {
return (
<IframePlayer
style={mergedStyle}
src={mediaInfo.url}
poster={possiblePosterSrc.url}
ref={ref as unknown as React.ForwardedRef<HTMLIFrameElement>}
requireInteraction={requireInteraction}
className={className}
alt={alt}
/>
);
}
if (mediaInfo.mimeType) {

Check warning on line 93 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L93

Added line #L93 was not covered by tests
// html content
if (mediaInfo.mimeType.startsWith("text/html")) {
return (
<IframePlayer
style={mergedStyle}
src={mediaInfo.url}
poster={possiblePosterSrc.url}
ref={ref as unknown as React.ForwardedRef<HTMLIFrameElement>}
requireInteraction={requireInteraction}
className={className}
alt={alt}
/>

Check warning on line 105 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L95-L105

Added lines #L95 - L105 were not covered by tests
);
}

Check warning on line 107 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L107

Added line #L107 was not covered by tests

// 3d model
if (mediaInfo.mimeType.startsWith("model")) {
console.error(
"Encountered an unsupported media type. 3D model support was removed in v5.92.0. To add a 3D model to your app, use @google/model-viewer and use the ModelViewer component.",
);
}
// 3d model
if (mediaInfo.mimeType.startsWith("model")) {
console.error(
"Encountered an unsupported media type. 3D model support was removed in v5.92.0. To add a 3D model to your app, use @google/model-viewer and use the ModelViewer component.",
);
}

Check warning on line 114 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L110-L114

Added lines #L110 - L114 were not covered by tests

// video
if (mediaInfo.mimeType.startsWith("video")) {
return (
<VideoPlayer
style={mergedStyle}
src={mediaInfo.url}
ref={ref as unknown as React.ForwardedRef<HTMLVideoElement>}
poster={
possiblePosterSrc.mimeType?.startsWith("image/")
? possiblePosterSrc.url
: undefined
}
requireInteraction={requireInteraction}
className={className}
controls={controls}
/>
);
}
// video
if (mediaInfo.mimeType.startsWith("video")) {
return (
<VideoPlayer
style={mergedStyle}
src={mediaInfo.url}
ref={ref as unknown as React.ForwardedRef<HTMLVideoElement>}
poster={
possiblePosterSrc.mimeType?.startsWith("image/")
? possiblePosterSrc.url
: undefined

Check warning on line 126 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L117-L126

Added lines #L117 - L126 were not covered by tests
}
requireInteraction={requireInteraction}
className={className}
controls={controls}
/>

Check warning on line 131 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L128-L131

Added lines #L128 - L131 were not covered by tests
);
}

Check warning on line 133 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L133

Added line #L133 was not covered by tests

// audio
if (mediaInfo.mimeType.startsWith("audio")) {
return (
<AudioPlayer
style={mergedStyle}
src={mediaInfo.url}
poster={possiblePosterSrc.url}
alt={alt}
ref={ref as unknown as React.ForwardedRef<HTMLAudioElement>}
className={className}
height={height}
width={width}
controls={controls}
/>
);
}
// audio
if (mediaInfo.mimeType.startsWith("audio")) {
return (
<AudioPlayer
style={mergedStyle}
src={mediaInfo.url}
poster={possiblePosterSrc.url}
alt={alt}
ref={ref as unknown as React.ForwardedRef<HTMLAudioElement>}
className={className}
height={height}
width={width}
controls={controls}
/>

Check warning on line 148 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L136-L148

Added lines #L136 - L148 were not covered by tests
);
}

Check warning on line 150 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L150

Added line #L150 was not covered by tests

// image
if (mediaInfo.mimeType.startsWith("image/")) {
return (
<ImageRenderer
style={mergedStyle}
src={mediaInfo.url}
alt={alt}
ref={ref as unknown as React.ForwardedRef<HTMLImageElement>}
className={className}
height={height}
width={width}
/>
);
}
// image
if (mediaInfo.mimeType.startsWith("image/")) {
return (
<ImageRenderer
style={mergedStyle}
src={mediaInfo.url}
alt={alt}
ref={ref as unknown as React.ForwardedRef<HTMLImageElement>}
className={className}
height={height}
width={width}
/>

Check warning on line 163 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L153-L163

Added lines #L153 - L163 were not covered by tests
);
}
}

Check warning on line 166 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L166

Added line #L166 was not covered by tests

// unknown mime types or no mime type
return (
<LinkPlayer
style={mergedStyle}
src={mediaInfo.url}
alt={alt}
ref={ref as unknown as React.Ref<HTMLAnchorElement>}
className={className}
/>
);
},
))();
// unknown mime types or no mime type
return (
<LinkPlayer
style={mergedStyle}
src={mediaInfo.url}
alt={alt}
ref={ref as unknown as React.Ref<HTMLAnchorElement>}
className={className}
/>

Check warning on line 176 in packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx

View check run for this annotation

Codecov / codecov/patch

packages/thirdweb/src/react/web/ui/MediaRenderer/MediaRenderer.tsx#L169-L176

Added lines #L169 - L176 were not covered by tests
);
}))();

interface PlayButtonProps {
onClick: () => void;
Expand Down Expand Up @@ -227,7 +226,7 @@
};

const ImageRenderer = /* @__PURE__ */ (() =>
React.forwardRef<
forwardRef<
HTMLImageElement,
Pick<
MediaRendererProps,
Expand Down Expand Up @@ -266,7 +265,7 @@
}))();

const VideoPlayer = /* @__PURE__ */ (() =>
React.forwardRef<
forwardRef<
HTMLVideoElement,
Pick<
MediaRendererProps,
Expand Down Expand Up @@ -393,7 +392,7 @@
}))();

const AudioPlayer = /* @__PURE__ */ (() =>
React.forwardRef<
forwardRef<
HTMLAudioElement,
Pick<
MediaRendererProps,
Expand Down Expand Up @@ -504,7 +503,7 @@
* @internal Exported for tests
*/
export const IframePlayer = /* @__PURE__ */ (() =>
React.forwardRef<
forwardRef<
HTMLIFrameElement,
Omit<
MediaRendererProps,
Expand Down Expand Up @@ -574,7 +573,7 @@
* @internal Exported for tests
*/
export const LinkPlayer = /* @__PURE__ */ (() =>
React.forwardRef<
forwardRef<
HTMLAnchorElement,
Pick<MediaRendererProps, "src" | "alt" | "style" | "className">
>(function Link_Player({ src, alt, style, className }, ref) {
Expand Down