const settings_html = `

Extensions

Auto-connect

Not connected

Active extensions

`; const settings_style = ` `; const urlKey = 'extensions_url'; const autoConnectKey = 'extensions_autoconnect'; const defaultUrl = "http://localhost:5100"; let connectedToApi = false; let extensions = []; async function connectClickHandler() { const baseUrl = $("#extensions_url").val(); localStorage.setItem(urlKey, baseUrl); await connectToApi(baseUrl); } function autoConnectInputHandler() { const value = $(this).prop('checked'); localStorage.setItem(autoConnectKey, value.toString()); if (value && !connectedToApi) { $("#extensions_connect").trigger('click'); } } async function connectToApi(baseUrl) { const url = new URL(baseUrl); url.pathname = '/api/extensions'; try { const getExtensionsResult = await fetch(url, { method: 'GET' }); if (getExtensionsResult.ok) { const data = await getExtensionsResult.json(); extensions = data.extensions; applyExtensions(baseUrl); } updateStatus(getExtensionsResult.ok); } catch { updateStatus(false); } } function updateStatus(success) { connectedToApi = success; const _text = success ? 'Connected to API' : 'Could not connect to API'; const _class = success ? 'success' : 'failure'; $('#extensions_status').text(_text); $('#extensions_status').attr('class', _class); if (success && extensions.length) { $('#extensions_loaded').show(200); $('#extensions_list').empty(); for (let extension of extensions) { $('#extensions_list').append(`
  • ${extension.metadata.display_name}
  • `); } } else { $('#extensions_loaded').hide(200); $('#extensions_list').empty(); } } function applyExtensions(baseUrl) { const url = new URL(baseUrl); if (!Array.isArray(extensions) || extensions.length === 0) { return; } for (let extension of extensions) { if (extension.metadata.js) { url.pathname = `/api/script/${extension.name}`; const src = url.toString(); if ($(`script[src="${src}"]`).length === 0) { const script = document.createElement('script'); script.type = 'module'; script.src = src; $('body').append(script); } } if (extension.metadata.css) { url.pathname = `/api/style/${extension.name}`; const href = url.toString(); if ($(`link[href="${href}"]`).length === 0) { const link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = href; $('head').append(link); } } } } $(document).ready(async function () { const url = localStorage.getItem(urlKey) ?? defaultUrl; const autoConnect = Boolean(localStorage.getItem(autoConnectKey)) ?? false; $('#rm_api_block').append(settings_html); $('head').append(settings_style); $("#extensions_url").val(url); $("#extensions_connect").on('click', connectClickHandler); $("#extensions_autoconnect").on('input', autoConnectInputHandler); $("#extensions_autoconnect").prop('checked', autoConnect).trigger('input'); });