40 lines
1.6 KiB
TypeScript
40 lines
1.6 KiB
TypeScript
'use client'
|
|
|
|
export default function openinaryLoader({ src, width, quality }: { src: string, width: number, quality?: number }) {
|
|
// Handle already absolute openinary URLs
|
|
let path = src;
|
|
if (src.startsWith('https://media.ayris.tech/t/')) {
|
|
// format: https://media.ayris.tech/t/w_800,h_800/moyqr/img.jpg
|
|
const parts = src.split('/');
|
|
path = parts.slice(5).join('/');
|
|
} else if (src.startsWith('https://media.ayris.tech/upload/')) {
|
|
// format: https://media.ayris.tech/upload/moyqr/img.jpg
|
|
const parts = src.split('/');
|
|
path = parts.slice(4).join('/');
|
|
} else if (src.includes('res.cloudinary.com')) {
|
|
// Correctly apply width & quality for unmigrated Cloudinary URLs
|
|
// e.g. https://res.cloudinary.com/domain/image/upload/v1234/path.jpg
|
|
// becomes: https://res.cloudinary.com/domain/image/upload/w_800,f_webp,q_75/v1234/path.jpg
|
|
const parts = src.split('/upload/');
|
|
if (parts.length === 2) {
|
|
return `${parts[0]}/upload/w_${width},f_webp,q_${quality || 75}/${parts[1]}`;
|
|
}
|
|
return src;
|
|
} else if (src.startsWith('http')) {
|
|
// For other external URLs, we append the width as a query parameter to satisfy Next.js.
|
|
const url = new URL(src);
|
|
url.searchParams.set('w', width.toString());
|
|
if (quality) {
|
|
url.searchParams.set('q', quality.toString());
|
|
}
|
|
return url.toString();
|
|
}
|
|
|
|
// Clean up any leading slash
|
|
if (path.startsWith('/')) {
|
|
path = path.substring(1);
|
|
}
|
|
|
|
return `https://media.ayris.tech/t/w_${width},f_webp,q_${quality || 75}/${path}`
|
|
}
|