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