|
1 | 1 | "use client"; |
2 | | -import React, { useState, useRef, useEffect } from "react"; |
| 2 | +import type React from "react"; |
| 3 | +import { forwardRef, useEffect, useRef, useState } from "react"; |
3 | 4 | import { |
4 | 5 | CarbonDocumentAudio, |
5 | 6 | CarbonDocumentUnknown, |
@@ -49,134 +50,132 @@ import { useResolvedMediaType } from "./useResolvedMediaType.js"; |
49 | 50 | * @param props - Refer to [`MediaRendererProps`](https://portal.thirdweb.com/references/typescript/v5/MediaRendererProps) to see the available props. |
50 | 51 | */ |
51 | 52 | export const MediaRenderer = /* @__PURE__ */ (() => |
52 | | - React.forwardRef<HTMLMediaElement, MediaRendererProps>( |
53 | | - function Media_Renderer( |
54 | | - { |
55 | | - src, |
56 | | - poster, |
57 | | - alt, |
58 | | - gatewayUrl, |
59 | | - requireInteraction = false, |
60 | | - width = "300px", |
61 | | - height = "300px", |
62 | | - style, |
63 | | - mimeType, |
64 | | - client, |
65 | | - controls, |
66 | | - className, |
67 | | - }, |
68 | | - ref, |
69 | | - ) { |
70 | | - const mergedStyle: React.CSSProperties = { |
71 | | - objectFit: "contain", |
72 | | - ...style, |
73 | | - }; |
| 53 | + forwardRef<HTMLMediaElement, MediaRendererProps>(function Media_Renderer( |
| 54 | + { |
| 55 | + src, |
| 56 | + poster, |
| 57 | + alt, |
| 58 | + gatewayUrl, |
| 59 | + requireInteraction = false, |
| 60 | + width = "300px", |
| 61 | + height = "300px", |
| 62 | + style, |
| 63 | + mimeType, |
| 64 | + client, |
| 65 | + controls, |
| 66 | + className, |
| 67 | + }, |
| 68 | + ref, |
| 69 | + ) { |
| 70 | + const mergedStyle: React.CSSProperties = { |
| 71 | + objectFit: "contain", |
| 72 | + ...style, |
| 73 | + }; |
74 | 74 |
|
75 | | - const { mediaInfo, isFetched: mediaInfoIsFetched } = useResolvedMediaType( |
76 | | - client, |
77 | | - src ?? undefined, |
78 | | - mimeType, |
79 | | - gatewayUrl, |
80 | | - ); |
| 75 | + const { mediaInfo, isFetched: mediaInfoIsFetched } = useResolvedMediaType( |
| 76 | + client, |
| 77 | + src ?? undefined, |
| 78 | + mimeType, |
| 79 | + gatewayUrl, |
| 80 | + ); |
81 | 81 |
|
82 | | - const { mediaInfo: possiblePosterSrc } = useResolvedMediaType( |
83 | | - client, |
84 | | - poster ?? undefined, |
85 | | - undefined, |
86 | | - gatewayUrl, |
87 | | - ); |
| 82 | + const { mediaInfo: possiblePosterSrc } = useResolvedMediaType( |
| 83 | + client, |
| 84 | + poster ?? undefined, |
| 85 | + undefined, |
| 86 | + gatewayUrl, |
| 87 | + ); |
88 | 88 |
|
89 | | - if (!mediaInfoIsFetched || !src) { |
90 | | - return <div style={style} />; |
91 | | - } |
| 89 | + if (!mediaInfoIsFetched || !src) { |
| 90 | + return <div style={style} />; |
| 91 | + } |
92 | 92 |
|
93 | | - if (mediaInfo.mimeType) { |
94 | | - // html content |
95 | | - if (mediaInfo.mimeType.startsWith("text/html")) { |
96 | | - return ( |
97 | | - <IframePlayer |
98 | | - style={mergedStyle} |
99 | | - src={mediaInfo.url} |
100 | | - poster={possiblePosterSrc.url} |
101 | | - ref={ref as unknown as React.ForwardedRef<HTMLIFrameElement>} |
102 | | - requireInteraction={requireInteraction} |
103 | | - className={className} |
104 | | - alt={alt} |
105 | | - /> |
106 | | - ); |
107 | | - } |
| 93 | + if (mediaInfo.mimeType) { |
| 94 | + // html content |
| 95 | + if (mediaInfo.mimeType.startsWith("text/html")) { |
| 96 | + return ( |
| 97 | + <IframePlayer |
| 98 | + style={mergedStyle} |
| 99 | + src={mediaInfo.url} |
| 100 | + poster={possiblePosterSrc.url} |
| 101 | + ref={ref as unknown as React.ForwardedRef<HTMLIFrameElement>} |
| 102 | + requireInteraction={requireInteraction} |
| 103 | + className={className} |
| 104 | + alt={alt} |
| 105 | + /> |
| 106 | + ); |
| 107 | + } |
108 | 108 |
|
109 | | - // 3d model |
110 | | - if (mediaInfo.mimeType.startsWith("model")) { |
111 | | - console.error( |
112 | | - "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.", |
113 | | - ); |
114 | | - } |
| 109 | + // 3d model |
| 110 | + if (mediaInfo.mimeType.startsWith("model")) { |
| 111 | + console.error( |
| 112 | + "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.", |
| 113 | + ); |
| 114 | + } |
115 | 115 |
|
116 | | - // video |
117 | | - if (mediaInfo.mimeType.startsWith("video")) { |
118 | | - return ( |
119 | | - <VideoPlayer |
120 | | - style={mergedStyle} |
121 | | - src={mediaInfo.url} |
122 | | - ref={ref as unknown as React.ForwardedRef<HTMLVideoElement>} |
123 | | - poster={ |
124 | | - possiblePosterSrc.mimeType?.startsWith("image/") |
125 | | - ? possiblePosterSrc.url |
126 | | - : undefined |
127 | | - } |
128 | | - requireInteraction={requireInteraction} |
129 | | - className={className} |
130 | | - controls={controls} |
131 | | - /> |
132 | | - ); |
133 | | - } |
| 116 | + // video |
| 117 | + if (mediaInfo.mimeType.startsWith("video")) { |
| 118 | + return ( |
| 119 | + <VideoPlayer |
| 120 | + style={mergedStyle} |
| 121 | + src={mediaInfo.url} |
| 122 | + ref={ref as unknown as React.ForwardedRef<HTMLVideoElement>} |
| 123 | + poster={ |
| 124 | + possiblePosterSrc.mimeType?.startsWith("image/") |
| 125 | + ? possiblePosterSrc.url |
| 126 | + : undefined |
| 127 | + } |
| 128 | + requireInteraction={requireInteraction} |
| 129 | + className={className} |
| 130 | + controls={controls} |
| 131 | + /> |
| 132 | + ); |
| 133 | + } |
134 | 134 |
|
135 | | - // audio |
136 | | - if (mediaInfo.mimeType.startsWith("audio")) { |
137 | | - return ( |
138 | | - <AudioPlayer |
139 | | - style={mergedStyle} |
140 | | - src={mediaInfo.url} |
141 | | - poster={possiblePosterSrc.url} |
142 | | - alt={alt} |
143 | | - ref={ref as unknown as React.ForwardedRef<HTMLAudioElement>} |
144 | | - className={className} |
145 | | - height={height} |
146 | | - width={width} |
147 | | - controls={controls} |
148 | | - /> |
149 | | - ); |
150 | | - } |
| 135 | + // audio |
| 136 | + if (mediaInfo.mimeType.startsWith("audio")) { |
| 137 | + return ( |
| 138 | + <AudioPlayer |
| 139 | + style={mergedStyle} |
| 140 | + src={mediaInfo.url} |
| 141 | + poster={possiblePosterSrc.url} |
| 142 | + alt={alt} |
| 143 | + ref={ref as unknown as React.ForwardedRef<HTMLAudioElement>} |
| 144 | + className={className} |
| 145 | + height={height} |
| 146 | + width={width} |
| 147 | + controls={controls} |
| 148 | + /> |
| 149 | + ); |
| 150 | + } |
151 | 151 |
|
152 | | - // image |
153 | | - if (mediaInfo.mimeType.startsWith("image/")) { |
154 | | - return ( |
155 | | - <ImageRenderer |
156 | | - style={mergedStyle} |
157 | | - src={mediaInfo.url} |
158 | | - alt={alt} |
159 | | - ref={ref as unknown as React.ForwardedRef<HTMLImageElement>} |
160 | | - className={className} |
161 | | - height={height} |
162 | | - width={width} |
163 | | - /> |
164 | | - ); |
165 | | - } |
| 152 | + // image |
| 153 | + if (mediaInfo.mimeType.startsWith("image/")) { |
| 154 | + return ( |
| 155 | + <ImageRenderer |
| 156 | + style={mergedStyle} |
| 157 | + src={mediaInfo.url} |
| 158 | + alt={alt} |
| 159 | + ref={ref as unknown as React.ForwardedRef<HTMLImageElement>} |
| 160 | + className={className} |
| 161 | + height={height} |
| 162 | + width={width} |
| 163 | + /> |
| 164 | + ); |
166 | 165 | } |
| 166 | + } |
167 | 167 |
|
168 | | - // unknown mime types or no mime type |
169 | | - return ( |
170 | | - <LinkPlayer |
171 | | - style={mergedStyle} |
172 | | - src={mediaInfo.url} |
173 | | - alt={alt} |
174 | | - ref={ref as unknown as React.Ref<HTMLAnchorElement>} |
175 | | - className={className} |
176 | | - /> |
177 | | - ); |
178 | | - }, |
179 | | - ))(); |
| 168 | + // unknown mime types or no mime type |
| 169 | + return ( |
| 170 | + <LinkPlayer |
| 171 | + style={mergedStyle} |
| 172 | + src={mediaInfo.url} |
| 173 | + alt={alt} |
| 174 | + ref={ref as unknown as React.Ref<HTMLAnchorElement>} |
| 175 | + className={className} |
| 176 | + /> |
| 177 | + ); |
| 178 | + }))(); |
180 | 179 |
|
181 | 180 | interface PlayButtonProps { |
182 | 181 | onClick: () => void; |
@@ -227,7 +226,7 @@ const PlayButton: React.FC<PlayButtonProps> = ({ onClick, isPlaying }) => { |
227 | 226 | }; |
228 | 227 |
|
229 | 228 | const ImageRenderer = /* @__PURE__ */ (() => |
230 | | - React.forwardRef< |
| 229 | + forwardRef< |
231 | 230 | HTMLImageElement, |
232 | 231 | Pick< |
233 | 232 | MediaRendererProps, |
@@ -266,7 +265,7 @@ const ImageRenderer = /* @__PURE__ */ (() => |
266 | 265 | }))(); |
267 | 266 |
|
268 | 267 | const VideoPlayer = /* @__PURE__ */ (() => |
269 | | - React.forwardRef< |
| 268 | + forwardRef< |
270 | 269 | HTMLVideoElement, |
271 | 270 | Pick< |
272 | 271 | MediaRendererProps, |
@@ -393,7 +392,7 @@ const VideoPlayer = /* @__PURE__ */ (() => |
393 | 392 | }))(); |
394 | 393 |
|
395 | 394 | const AudioPlayer = /* @__PURE__ */ (() => |
396 | | - React.forwardRef< |
| 395 | + forwardRef< |
397 | 396 | HTMLAudioElement, |
398 | 397 | Pick< |
399 | 398 | MediaRendererProps, |
@@ -504,7 +503,7 @@ const AudioPlayer = /* @__PURE__ */ (() => |
504 | 503 | * @internal Exported for tests |
505 | 504 | */ |
506 | 505 | export const IframePlayer = /* @__PURE__ */ (() => |
507 | | - React.forwardRef< |
| 506 | + forwardRef< |
508 | 507 | HTMLIFrameElement, |
509 | 508 | Omit< |
510 | 509 | MediaRendererProps, |
@@ -574,7 +573,7 @@ export const IframePlayer = /* @__PURE__ */ (() => |
574 | 573 | * @internal Exported for tests |
575 | 574 | */ |
576 | 575 | export const LinkPlayer = /* @__PURE__ */ (() => |
577 | | - React.forwardRef< |
| 576 | + forwardRef< |
578 | 577 | HTMLAnchorElement, |
579 | 578 | Pick<MediaRendererProps, "src" | "alt" | "style" | "className"> |
580 | 579 | >(function Link_Player({ src, alt, style, className }, ref) { |
|
0 commit comments