Files
2026-08-19 01:04:57 -07:00

146 lines
4.1 KiB
JavaScript

const oidcConfigLinking = {
pluginUniqueId: "c2e83d4a-1a92-11f1-a789-f84d896c963f",
loadProviders: (view) => {
const provider_list_oidc = view.querySelector('#oidc-provider-list');
provider_list_oidc.innerHTML = "";
fetch(new Request(ApiClient.getUrl("oidc/GetNames"))).then((resp) => {
resp.json().then((config_names) => {
oidcConfigLinking.loadProviderList(provider_list_oidc, config_names);
});
});
},
loadProviderList: (container, providers) => {
providers.forEach((provider_name) => {
var provider_config = document.createElement("div");
provider_config.classList.add("oidc-provider-links-container");
provider_config.setAttribute("data-id", provider_name);
//TODO: fix links here
provider_config.innerHTML = `
<label class="inputLabel inputLabelUnfocused oidc-provider-link-title">
${provider_name}
</label>
<a class="fab emby-button oidc-provider" href="oidc/${provider_name}?isLinking=true">
<span class="material-icons add" aria-hidden="true"></span>
</a>
<div class="oidc-provider-existing-links-container" data-provider="${provider_name}">
</div>
`;
container.appendChild(provider_config);
});
const currentUserId = ApiClient.getCurrentUserId();
if (currentUserId) {
ApiClient.fetch(
{
type: "GET",
url: ApiClient.getUrl(`oidc/links/${currentUserId}`),
},
true,
).then((resp) => {
resp.json().then((provider_map) => {
console.log({ provider_map, currentUserId });
Object.keys(provider_map).forEach((provider_name) => {
const provider_container = container.querySelector(
`.oidc-provider-existing-links-container[data-provider="${provider_name}"]`,
);
oidcConfigLinking.populateExistingLinks(
provider_container,
provider_name,
provider_map[provider_name],
);
});
});
});
}
},
populateExistingLinks: (container, provider_name, canonical_names) => {
container
.querySelectorAll(".oidc-provider-link-checkbox-wrapper")
.forEach((e) => e.remove());
const checkboxes = canonical_names.map((canonical_name) => {
var out = document.createElement("label");
out.classList.add("oidc-provider-link-checkbox-wrapper");
out.classList.add("checkbox-wrapper");
out.innerHTML = `
<input
is="emby-checkbox"
class="oidc-link-checkbox"
data-id="${canonical_name}"
data-provider="${provider_name}"
type="checkbox"
/>
<span class="checkbox-label">${canonical_name}</span>
`;
return out;
});
checkboxes.forEach((e) => {
container.appendChild(e);
});
},
handleDeleteButtonPressed: (evt, view) => {
if (evt.target.disabled) return;
const currentUserId = ApiClient.getCurrentUserId();
if (!currentUserId) return;
const delete_requests = [...view.querySelectorAll(".oidc-link-checkbox")]
.filter((checkbox_link) => {
const canonical_name = checkbox_link.getAttribute("data-id");
const provider_name = checkbox_link.getAttribute("data-provider");
if (![canonical_name, provider_name].every((e) => e)) {
return false;
}
if (!checkbox_link.checked) {
return false;
}
return true;
})
.map((checked_link) => {
const canonical_name = checked_link.getAttribute("data-id");
const provider_name = checked_link.getAttribute("data-provider");
return ApiClient.fetch({
type: "DELETE",
url: ApiClient.getUrl(
`oidc/link/${provider_name}/${currentUserId}/${canonical_name}`,
),
});
});
Promise.all(delete_requests).then((values) => {
console.log({ message: "Delete requests handled", values });
window.location.reload();
});
},
};
export default function (view) {
if (view.dataset.loaded === true) {
return;
}
view.dataset.loaded = true;
oidcConfigLinking.loadProviders(view);
view.querySelector("#enable-delete").addEventListener("change", (e) => {
const link = view.querySelector("#btn-delete-selected-links");
link.disabled = !e.target.checked;
});
view
.querySelector("#btn-delete-selected-links")
.addEventListener("click", (e) =>
oidcConfigLinking.handleDeleteButtonPressed(e, view),
);
}