wavesurfer lazy loading
This commit is contained in:
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user