} */ ({}));
/** @param {{ [scheme: string]: import("~/components/input/types.d.ts").Source[] }} sourcesRecord */
async function checkOnlineStatus(sourcesRecord) {
const sources = Object.values(sourcesRecord).flat();
const entries = await Promise.all(
sources.map(async ({ uri }) => {
const result = await inputConfigurator.consult(uri);
const online =
result.supported && result.consult !== "undetermined"
? result.consult
: null;
return /** @type {[string, boolean | null]} */ ([trackPrefix(uri), online]);
}),
);
onlineMap.value = Object.fromEntries(entries);
}
effect(() => {
checkOnlineStatus(sourcesOrchestrator.sources());
});
effect(() => {
const sourcesRecord = sourcesOrchestrator.sources();
const statusMap = onlineMap.get();
const tracksCol = outputOrchestrator.tracks.collection();
const tracks = tracksCol.state === "loaded" ? tracksCol.data : [];
/** @param {string} uri */
const statusClass = (uri) => {
const status = statusMap[trackPrefix(uri)];
if (status === true) return "sources-item__status--online";
if (status === false) return "sources-item__status--offline";
return "sources-item__status--unknown";
};
/** @param {string} uri */
const statusTitle = (uri) => {
const status = statusMap[trackPrefix(uri)];
if (status === true) return "Online";
if (status === false) return "Offline";
return "Status unknown";
};
const entries = Object.entries(sourcesRecord).filter(
([, sources]) => sources.length > 0,
);
list.hidden = entries.length === 0;
empty.hidden = entries.length > 0;
litRender(
html`
${entries.map(([scheme, sources]) => {
if (scheme === SCHEME_EPHEMERAL_CACHE) {
const uri = `${SCHEME_EPHEMERAL_CACHE}://`;
const isDisabled = sourcesOrchestrator.isDisabled(uri);
const trackCount = tracks.filter((t) => t.uri.startsWith(uri)).length;
return html`
${SCHEME_NAMES[scheme] ?? scheme}
Files stored in the browser
${trackCount} track${trackCount === 1 ? "" : "s"}
`;
}
return html`
${SCHEME_NAMES[scheme] ?? scheme}
${sources.map(({ label, uri }) => {
const isDisabled = sourcesOrchestrator.isDisabled(uri);
const trackCount = tracks.filter((t) =>
t.uri.startsWith(trackPrefix(uri))
).length;
return html`
${label}
${trackCount} track${trackCount === 1 ? "" : "s"}
`;
})}
`;
})}
`,
list,
);
});
////////////////////////////////////////////
// ACTIONS
////////////////////////////////////////////
async function removeEphemeralSources() {
return removeSource(SCHEME_EPHEMERAL_CACHE);
}
/** @param {string} uri */
async function removeSource(uri) {
const tracks = await Output.data(outputOrchestrator.tracks);
const detachedTracks = await inputConfigurator.detach({
fileUriOrScheme: uri,
tracks,
});
if (detachedTracks) await outputOrchestrator.tracks.save(detachedTracks);
}
////////////////////////////////////////////
// 🚀
////////////////////////////////////////////
foundation.ready();