Skip to content

Commit 10635e3

Browse files
committed
feat: Unify Thumbnail & ThumbnailComponent
1 parent ef7bbab commit 10635e3

File tree

2 files changed

+22
-74
lines changed

2 files changed

+22
-74
lines changed

Diff for: packages/ui/src/elements/Thumbnail/index.tsx

+19-70
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,28 @@ import type { SanitizedCollectionConfig } from 'payload'
1010
import { File } from '../../graphics/File/index.js'
1111
import { ShimmerEffect } from '../ShimmerEffect/index.js'
1212

13-
/**
14-
* Check if specific media exist before render it in it's appropriate HTML tag.
15-
* This internal hook allows to share this logic between Thumbnail & ThumbnailComponent
16-
*/
17-
const useFileExists = (fileSrc: string | undefined, fileType: string): boolean => {
13+
export type ThumbnailProps = {
14+
alt?: string
15+
className?: string
16+
collectionSlug?: string
17+
doc?: Record<string, unknown>
18+
fileSrc?: string
19+
imageCacheTag?: string
20+
size?: 'expand' | 'large' | 'medium' | 'small'
21+
uploadConfig?: SanitizedCollectionConfig['upload']
22+
}
23+
24+
export const Thumbnail = (props: ThumbnailProps) => {
25+
const { className = '', doc: { filename, mimeType } = {}, fileSrc, imageCacheTag, size } = props
26+
const classNames = [baseClass, `${baseClass}--size-${size || 'medium'}`, className].join(' ')
27+
const fileType = (mimeType as string)?.split('/')?.[0]
1828
const [fileExists, setFileExists] = React.useState<boolean | undefined>(undefined)
1929

2030
React.useEffect(() => {
2131
if (!fileSrc || !fileType) {
2232
setFileExists(false)
2333
return
2434
}
25-
2635
if (fileType === 'image') {
2736
const img = new Image()
2837
img.src = fileSrc
@@ -39,76 +48,16 @@ const useFileExists = (fileSrc: string | undefined, fileType: string): boolean =
3948
}
4049
}, [fileSrc, fileType])
4150

42-
return fileExists
43-
}
44-
45-
export type ThumbnailProps = {
46-
className?: string
47-
collectionSlug?: string
48-
doc?: Record<string, unknown>
49-
fileSrc?: string
50-
imageCacheTag?: string
51-
size?: 'expand' | 'large' | 'medium' | 'small'
52-
uploadConfig?: SanitizedCollectionConfig['upload']
53-
}
54-
55-
export const Thumbnail: React.FC<ThumbnailProps> = (props) => {
56-
const { className = '', doc: { filename, mimeType } = {}, fileSrc, imageCacheTag, size } = props
57-
const classNames = [baseClass, `${baseClass}--size-${size || 'medium'}`, className].join(' ')
58-
const fileType = (mimeType as string)?.split('/')?.[0]
59-
60-
const fileExists = useFileExists(fileSrc, fileType)
61-
const src = React.useMemo(
62-
() => `${fileSrc}${imageCacheTag ? `?${imageCacheTag}` : ''}`,
63-
[fileSrc, imageCacheTag],
64-
)
65-
66-
return (
67-
<div className={classNames}>
68-
{fileExists === undefined && <ShimmerEffect height="100%" />}
69-
{fileExists && fileType === 'image' && <img alt={filename as string} src={src} />}
70-
{fileExists && fileType === 'video' && (
71-
<video
72-
aria-label={filename as string}
73-
autoPlay={false}
74-
controls={false}
75-
muted={true}
76-
playsInline={true}
77-
src={src}
78-
/>
79-
)}
80-
{fileExists === false && <File />}
81-
</div>
82-
)
83-
}
84-
85-
type ThumbnailComponentProps = {
86-
readonly alt?: string
87-
readonly className?: string
88-
readonly filename: string
89-
readonly fileSrc: string
90-
readonly imageCacheTag?: string
91-
readonly mimeType?: string
92-
readonly size?: 'expand' | 'large' | 'medium' | 'small'
93-
}
94-
export function ThumbnailComponent(props: ThumbnailComponentProps) {
95-
const { alt, className = '', filename, fileSrc, imageCacheTag, mimeType, size } = props
96-
const classNames = [baseClass, `${baseClass}--size-${size || 'medium'}`, className].join(' ')
97-
const fileType = mimeType?.split('/')?.[0]
98-
99-
const fileExists = useFileExists(fileSrc, fileType)
100-
const src = React.useMemo(
101-
() => `${fileSrc}${imageCacheTag ? `?${imageCacheTag}` : ''}`,
102-
[fileSrc, imageCacheTag],
103-
)
51+
const src = `${fileSrc}${imageCacheTag ? `?${imageCacheTag}` : ''}`
52+
const alt = props.alt || (filename as string)
10453

10554
return (
10655
<div className={classNames}>
10756
{fileExists === undefined && <ShimmerEffect height="100%" />}
108-
{fileExists && fileType === 'image' && <img alt={alt || filename} src={src} />}
57+
{fileExists && fileType === 'image' && <img alt={alt} src={src} />}
10958
{fileExists && fileType === 'video' && (
11059
<video
111-
aria-label={alt || filename}
60+
aria-label={alt}
11261
autoPlay={false}
11362
controls={false}
11463
muted={true}

Diff for: packages/ui/src/fields/Upload/RelationshipContent/index.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import React from 'react'
55

66
import { Button } from '../../../elements/Button/index.js'
77
import { useDocumentDrawer } from '../../../elements/DocumentDrawer/index.js'
8-
import { ThumbnailComponent } from '../../../elements/Thumbnail/index.js'
8+
import { Thumbnail } from '../../../elements/Thumbnail/index.js'
99
import './index.scss'
1010

1111
const baseClass = 'upload-relationship-details'
@@ -71,12 +71,11 @@ export function RelationshipContent(props: Props) {
7171
return (
7272
<div className={[baseClass, className].filter(Boolean).join(' ')}>
7373
<div className={`${baseClass}__imageAndDetails`}>
74-
<ThumbnailComponent
74+
<Thumbnail
7575
alt={alt}
7676
className={`${baseClass}__thumbnail`}
77-
filename={filename}
77+
doc={{ filename, mimeType }}
7878
fileSrc={src}
79-
mimeType={mimeType}
8079
size="small"
8180
/>
8281
<div className={`${baseClass}__details`}>

0 commit comments

Comments
 (0)