} */ ({}));
+
+/** @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,
@@ -120,10 +164,10 @@
: ""}">
Files stored in the browser
- ${trackCount} track${trackCount ===
- 1
- ? ""
- : "s"}
+
+
+ ${trackCount} track${trackCount === 1 ? "" : "s"}
+