const settings_html = `
`;
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');
});