import React, { useState, useEffect } from 'react'; import Skeleton from 'react-loading-skeleton'; const MediaViewer = ({ mediaUrls }) => { const [loadedMedia, setLoadedMedia] = useState([]); const [loading, setLoading] = useState(true); function isMediaUrl(url) { const urls = url[0]; const audioExtensions = ['.mp3', '.wav', '.ogg', '.m4a', '.aac', '.flac']; const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp']; const lowercasedUrl = urls.toLowerCase(); const isAudio = audioExtensions.some(extension => lowercasedUrl.endsWith(extension)); const isImage = imageExtensions.some(extension => lowercasedUrl.endsWith(extension)); return isAudio || isImage; } const preloadMedia = (urls) => { return Promise.all( urls.map((url) => { return new Promise((resolve, reject) => { const mediaType = url.split('.').pop(); if (['jpg', 'jpeg', 'png', 'gif'].includes(mediaType)) { const img = new Image(); img.src = url; img.onload = () => resolve({ type: 'image', url }); img.onerror = () => reject(`Failed to load image: ${url}`); } else if (['mp3', 'wav'].includes(mediaType)) { const audio = new Audio(); audio.src = url; audio.onloadedmetadata = () => resolve({ type: 'audio', url }); audio.onerror = () => reject(`Failed to load audio: ${url}`); } else { resolve({ type: 'unknown', url }); } }); }) ); }; const renderVideo = (url) => { // Cek apakah ini link YouTube if (url.includes('youtube.com') || url.includes('youtu.be')) { const youtubeId = url.includes('youtube.com') ? new URLSearchParams(new URL(url).search).get('v') // Ambil ID dari link YouTube : url.split('/').pop(); // Ambil ID dari youtu.be link return ( ); } else if (url.includes('drive.google.com')) { const driveId = url.includes('file/d/') ? url.split('file/d/')[1].split('/')[0] : ''; return ( ); } else { return ( ); } }; useEffect(() => { if (mediaUrls && mediaUrls.length > 0 && isMediaUrl(mediaUrls)) { preloadMedia(mediaUrls) .then((loaded) => { setLoadedMedia(loaded); setLoading(false); }) .catch((error) => { console.error(error); setLoading(false); }); } else { setLoading(false); } }, [mediaUrls]); if (loading) { return ( ); } return (
{isMediaUrl(mediaUrls) ? ( loadedMedia.map((media, index) => { if (media.type === 'image') { return {`Media; } else if (media.type === 'audio') { return ; } else { return
Unknown media type
; } }) ) : ( renderVideo(mediaUrls[0]) // Panggil fungsi renderVideo dengan URL yang benar )}
); }; export default MediaViewer;