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