Skip to content

Commit 9d75371

Browse files
author
István Beregszászi
authored
[DEV-19774] Add support for optional `baseCdnUrl` in asset-related components
2 parents ca39b00 + 0501af5 commit 9d75371

File tree

7 files changed

+54
-14
lines changed

7 files changed

+54
-14
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ build/
1010

1111
# Dependencies
1212
node_modules/
13+
.pnpm-store/
1314
# Ignoring package-lock should make the dependencies installed on CI and on fresh environments match what the package consumers would have installed.
1415
# See https://github.com/sindresorhus/ama/issues/479#issuecomment-310661514 for context.
1516
package-lock.json

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
"@prezly/linear-partition": "^1.0.2",
8787
"@prezly/sdk": "^23.10.0",
8888
"@prezly/story-content-format": "^0.70.1",
89-
"@prezly/uploadcare": "^2.5.0",
89+
"@prezly/uploadcare": "^2.6.0",
9090
"@react-hookz/web": "^12.0.0",
9191
"classnames": "^2.2.6",
9292
"player.js": "^0.1.0",

src/components/CoverageCard/CoverageCard.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ interface Props {
1414
newTab: boolean;
1515
renderDate: (date: string) => ReactNode;
1616
withThumbnail: boolean;
17+
baseCdnUrl?: string;
1718
}
1819

1920
export function CoverageCard({
@@ -24,8 +25,9 @@ export function CoverageCard({
2425
newTab,
2526
renderDate,
2627
withThumbnail,
28+
baseCdnUrl,
2729
}: Props) {
28-
const imageUrl = getCoverageImageUrl(coverage);
30+
const imageUrl = getCoverageImageUrl(coverage, baseCdnUrl);
2931
const href = coverage.attachment_oembed?.url || coverage.url;
3032
const autoLayout = withThumbnail && imageUrl ? layout : 'horizontal';
3133

src/components/CoverageCard/getCoverageImageUrl.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@ import { UploadcareImage } from '@prezly/uploadcare';
44

55
const IMAGE_WIDTH = 580 * 2;
66

7-
export function getCoverageImageUrl(coverage: CoverageEntry): string | null {
7+
export function getCoverageImageUrl(
8+
coverage: CoverageEntry,
9+
baseCdnUrl: string | undefined,
10+
): string | null {
811
if (coverage.attachment_oembed && coverage.attachment_oembed.thumbnail_url) {
912
return coverage.attachment_oembed.thumbnail_url;
1013
}
1114

1215
// @ts-expect-error `isImage` is not defined in the type, but it is present
1316
if (coverage.attachment && coverage.attachment.isImage) {
1417
try {
15-
const image = UploadcareImage.createFromPrezlyStoragePayload(
16-
coverage.attachment as UploadedImage,
17-
);
18+
const image = baseCdnUrl
19+
? UploadcareImage.createFromPrezlyStoragePayload(
20+
coverage.attachment as UploadedImage,
21+
).withBaseCdnUrl(baseCdnUrl)
22+
: UploadcareImage.createFromPrezlyStoragePayload(
23+
coverage.attachment as UploadedImage,
24+
);
1825
return image.resize(IMAGE_WIDTH).cdnUrl;
1926
} catch {
2027
return null;

src/elements/Attachment/Attachment.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ import './Attachment.scss';
1010

1111
interface Props extends Omit<HTMLAttributes<HTMLAnchorElement>, 'children'> {
1212
node: AttachmentNode;
13+
baseCdnUrl?: string;
1314
}
1415

15-
export function Attachment({ className, node, ...props }: Props) {
16+
export function Attachment({ className, node, baseCdnUrl, ...props }: Props) {
1617
const { description, file } = node;
17-
const attachment = UploadcareFile.createFromPrezlyStoragePayload(file);
18+
const attachment = baseCdnUrl
19+
? UploadcareFile.createFromPrezlyStoragePayload(file).withBaseCdnUrl(baseCdnUrl)
20+
: UploadcareFile.createFromPrezlyStoragePayload(file);
1821
const isUsingCustomTitle = Boolean(description);
1922

2023
return (

src/elements/Gallery/Gallery.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface Props extends HTMLAttributes<HTMLElement> {
1818
node: GalleryNode;
1919
onImageDownload?: (image: UploadcareImage) => void;
2020
onPreviewOpen?: (image: UploadcareImage) => void;
21+
baseCdnUrl?: string;
2122
}
2223

2324
interface Tile {
@@ -26,12 +27,19 @@ interface Tile {
2627
height: number;
2728
}
2829

29-
export function Gallery({ className, node, onImageDownload, onPreviewOpen, ...props }: Props) {
30+
export function Gallery({
31+
className,
32+
node,
33+
onImageDownload,
34+
onPreviewOpen,
35+
baseCdnUrl,
36+
...props
37+
}: Props) {
3038
const [rect, ref] = useMeasure<HTMLDivElement>();
3139
const galleryWidth = rect?.width || DEFAULT_GALLERY_WIDTH_SSR[node.layout];
3240
const margin = IMAGE_PADDING[node.padding];
3341
const idealHeight = IMAGE_SIZE[node.thumbnail_size] + 2 * margin;
34-
const originalImages = useMemo(() => extractImages(node), [node]);
42+
const originalImages = useMemo(() => extractImages(node, baseCdnUrl), [node, baseCdnUrl]);
3543
const calculatedLayout = calculateLayout({
3644
idealHeight,
3745
images: originalImages,
@@ -120,9 +128,13 @@ function Row(props: {
120128
);
121129
}
122130

123-
function extractImages(node: GalleryNode): UploadcareImage[] {
131+
function extractImages(node: GalleryNode, baseCdnUrl: string | undefined): UploadcareImage[] {
124132
return node.images.map(({ caption, file }) =>
125-
UploadcareImage.createFromPrezlyStoragePayload(file, caption),
133+
baseCdnUrl
134+
? UploadcareImage.createFromPrezlyStoragePayload(file, caption).withBaseCdnUrl(
135+
baseCdnUrl,
136+
)
137+
: UploadcareImage.createFromPrezlyStoragePayload(file, caption),
126138
);
127139
}
128140

src/elements/Image/Image.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface Props extends HTMLAttributes<HTMLElement> {
1515
node: ImageNode;
1616
onDownload?: (image: UploadcareImage) => void;
1717
onPreviewOpen?: (image: UploadcareImage) => void;
18+
baseCdnUrl?: string;
1819
}
1920

2021
function getContainerStyle(node: ImageNode): CSSProperties {
@@ -37,7 +38,15 @@ const NEW_TAB_ATTRIBUTES: Partial<AnchorHTMLAttributes<HTMLAnchorElement>> = {
3738
rel: 'noopener noreferrer',
3839
};
3940

40-
export function Image({ children, className, node, onDownload, onPreviewOpen, ...props }: Props) {
41+
export function Image({
42+
children,
43+
className,
44+
node,
45+
onDownload,
46+
onPreviewOpen,
47+
baseCdnUrl,
48+
...props
49+
}: Props) {
4150
const { file, href, align, layout } = node;
4251

4352
const isNewTab = node.new_tab ?? true;
@@ -46,7 +55,13 @@ export function Image({ children, className, node, onDownload, onPreviewOpen, ..
4655

4756
const [isPreviewOpen, setIsPreviewOpen] = useState<boolean>(false);
4857
// eslint-disable-next-line react-hooks/exhaustive-deps
49-
const image = useMemo(() => UploadcareImage.createFromPrezlyStoragePayload(file), [file.uuid]);
58+
const image = useMemo(
59+
() =>
60+
baseCdnUrl
61+
? UploadcareImage.createFromPrezlyStoragePayload(file).withBaseCdnUrl(baseCdnUrl)
62+
: UploadcareImage.createFromPrezlyStoragePayload(file),
63+
[file, baseCdnUrl],
64+
);
5065

5166
function handleRolloverClick() {
5267
setIsPreviewOpen(true);

0 commit comments

Comments
 (0)