2025-10-28 13:53:11 +00:00
|
|
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
|
|
|
import { useFileUpload } from "./useFileUpload";
|
|
|
|
|
import { getSoundFileURL } from "../utils/utils";
|
2025-10-29 15:04:40 +00:00
|
|
|
import type { SoundUploadValue } from "../types/types";
|
|
|
|
|
import { resolveSoundSource } from "../utils/soundResolver";
|
2025-10-28 13:53:11 +00:00
|
|
|
|
2025-10-29 15:04:40 +00:00
|
|
|
export function useCachedSoundSrc(
|
|
|
|
|
selected: string | undefined,
|
|
|
|
|
soundOptions: SoundUploadValue[] | undefined,
|
|
|
|
|
fallbackUrl: string
|
|
|
|
|
) {
|
2025-10-28 13:53:11 +00:00
|
|
|
const isUploaded = !!selected && (selected.endsWith(".mp3") || selected.endsWith(".wav"));
|
2025-10-29 15:04:40 +00:00
|
|
|
|
|
|
|
|
const resolved = resolveSoundSource(selected, soundOptions);
|
2025-10-28 13:53:11 +00:00
|
|
|
|
|
|
|
|
const { query } = useFileUpload({
|
2025-10-29 15:04:40 +00:00
|
|
|
queryKey: resolved?.type === "uploaded" ? [resolved?.url] : undefined,
|
2025-10-28 13:53:11 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const [objectUrl, setObjectUrl] = useState<string>();
|
|
|
|
|
const objRef = useRef<string | null>(null);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const blob = query?.data;
|
2025-10-29 15:04:40 +00:00
|
|
|
|
2025-10-28 13:53:11 +00:00
|
|
|
if (blob instanceof Blob) {
|
|
|
|
|
if (objRef.current) URL.revokeObjectURL(objRef.current);
|
|
|
|
|
const url = URL.createObjectURL(blob);
|
|
|
|
|
objRef.current = url;
|
|
|
|
|
setObjectUrl(url);
|
|
|
|
|
} else {
|
|
|
|
|
if (objRef.current) URL.revokeObjectURL(objRef.current);
|
|
|
|
|
objRef.current = null;
|
|
|
|
|
setObjectUrl(undefined);
|
|
|
|
|
}
|
|
|
|
|
}, [query?.data]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
return () => {
|
|
|
|
|
if (objRef.current) URL.revokeObjectURL(objRef.current);
|
|
|
|
|
};
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const src = useMemo(() => {
|
|
|
|
|
if (isUploaded && objectUrl) return objectUrl;
|
|
|
|
|
if (!selected) return fallbackUrl;
|
|
|
|
|
return getSoundFileURL(selected) ?? fallbackUrl;
|
|
|
|
|
}, [isUploaded, objectUrl, selected, fallbackUrl]);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
src,
|
|
|
|
|
isUploaded,
|
|
|
|
|
isLoading: !!query?.isLoading,
|
|
|
|
|
error: (query?.error as Error) || undefined,
|
|
|
|
|
};
|
|
|
|
|
}
|