// From: src/lib/features/conversion/useConversionQueue.svelte.ts
import {
setupConversionListeners,
startConversion as startConversionService,
pauseConversion,
resumeConversion,
cancelConversion
} from '$lib/services/conversion';
import { FileStatus, type FileItem } from '$lib/types';
export function createConversionQueue(callbacks) {
// Set up event listeners
function setupListeners() {
const unlistenPromise = setupConversionListeners(
// Progress
(payload) => {
callbacks.onFilesUpdate((files) =>
files.map((f) => {
if (f.id === payload.id) {
const status = f.status === FileStatus.QUEUED
? FileStatus.CONVERTING
: f.status;
return { ...f, status, progress: payload.progress };
}
return f;
})
);
},
// Completed
(payload) => {
callbacks.onFilesUpdate((files) =>
files.map((f) =>
f.id === payload.id
? { ...f, status: FileStatus.COMPLETED, progress: 100 }
: f
)
);
},
// Error
(payload) => {
callbacks.onFilesUpdate((files) =>
files.map((f) =>
f.id === payload.id
? { ...f, status: FileStatus.ERROR, conversionError: payload.error }
: f
)
);
},
// Logs
(payload) => {
callbacks.onLogsUpdate((logs) => {
const current = logs[payload.id] || [];
return { ...logs, [payload.id]: [...current, payload.line] };
});
},
// Started
(payload) => {
callbacks.onFilesUpdate((files) =>
files.map((f) => {
if (f.id === payload.id && f.status === FileStatus.QUEUED) {
return { ...f, status: FileStatus.CONVERTING, progress: 0 };
}
return f;
})
);
}
);
return () => {
unlistenPromise?.then((unlisten) => unlisten());
};
}
// Queue conversions
async function startConversion() {
const pendingFiles = files.filter(
(f) => f.isSelectedForConversion &&
f.status !== FileStatus.CONVERTING &&
f.status !== FileStatus.COMPLETED
);
for (const file of pendingFiles) {
try {
await startConversionService(
file.id,
file.path,
file.config,
file.outputName
);
} catch (error) {
console.error('Failed to queue:', error);
}
}
}
return {
setupListeners,
startConversion,
handlePause: pauseConversion,
handleResume: resumeConversion,
cancelTask: cancelConversion
};
}