wavesurfer lazy loading

This commit is contained in:
michalcourson
2026-02-28 17:28:49 -05:00
parent aefb3f2648
commit 510b92f669
4 changed files with 29 additions and 9 deletions

View File

@ -44,6 +44,8 @@ export default function AudioTrimmer({
useSortable({ id: metadata.filename });
// Dialog state for editing name
const rootRef = useRef<HTMLDivElement | null>(null);
const [isVisible, setIsVisible] = useState(false);
const [editDialogOpen, setEditDialogOpen] = useState(false);
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [dropdownOpen, setDropdownOpen] = useState(false);
@ -202,25 +204,40 @@ export default function AudioTrimmer({
}, [onRegionCreated, onRegionUpdated, plugins]);
useEffect(() => {
let url: string | null = null;
const node = rootRef.current;
if (!node) return;
const observer = new window.IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setIsVisible(true);
}
},
{ threshold: 0.1 },
);
observer.observe(node);
return () => {
observer.disconnect();
};
}, []);
useEffect(() => {
if (!isVisible) return;
let cancelled = false;
async function fetchAudio() {
// console.log('Loading audio buffer for file:', filename);
const buffer = await window.audio.loadAudioBuffer(metadata.filename);
// console.log('Received buffer:', buffer.buffer);
if (cancelled) return;
if (buffer.buffer && !buffer.error) {
const audioData = buffer.buffer
? new Uint8Array(buffer.buffer)
: buffer;
url = URL.createObjectURL(new Blob([audioData]));
// console.log('Created blob URL:', url);
setBlobUrl(url);
wavesurfer?.loadBlob(new Blob([audioData]));
}
}
fetchAudio();
return () => {
if (url) URL.revokeObjectURL(url);
cancelled = true;
};
}, [metadata.filename]);
}, [isVisible, metadata.filename, wavesurfer]);
const onPlayPause = () => {
if (wavesurfer === null) return;
@ -245,7 +262,10 @@ export default function AudioTrimmer({
return (
<div
ref={setNodeRef}
ref={(el) => {
setNodeRef(el);
rootRef.current = el;
}}
style={{
transform: CSS.Transform.toString(transform),
transition,