fix(fileloader): prevent infinite reload loop via untrack #243
@@ -1,3 +1,5 @@
|
|||||||
|
import { untrack } from 'svelte';
|
||||||
|
|
||||||
export function createFileLoader() {
|
export function createFileLoader() {
|
||||||
let fileUrl = $state('');
|
let fileUrl = $state('');
|
||||||
let isLoading = $state(false);
|
let isLoading = $state(false);
|
||||||
@@ -6,7 +8,11 @@ export function createFileLoader() {
|
|||||||
async function loadFile(url: string): Promise<void> {
|
async function loadFile(url: string): Promise<void> {
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
fileError = '';
|
fileError = '';
|
||||||
if (fileUrl) URL.revokeObjectURL(fileUrl);
|
// untrack prevents callers ($effect) from accidentally subscribing to fileUrl.
|
||||||
|
// Without it, the calling effect would re-run every time fileUrl changes (i.e.
|
||||||
|
// on every successful load), creating an infinite load loop.
|
||||||
|
const prev = untrack(() => fileUrl);
|
||||||
|
if (prev) URL.revokeObjectURL(prev);
|
||||||
fileUrl = '';
|
fileUrl = '';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user