mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
120 lines
2.8 KiB
JavaScript
120 lines
2.8 KiB
JavaScript
import { attachFeedInfoPopover } from "./ui/components/FeedInfoPopover.js";
|
|
|
|
const VIDEO_CARD_SELECTOR = "[data-component=\"video-card\"]";
|
|
const EMPTY_STATE_SELECTOR = "[data-kids-empty-state]";
|
|
const LOADING_SELECTOR = ".sidebar-loading-wrapper";
|
|
|
|
class KidsView {
|
|
constructor({ document: doc = document } = {}) {
|
|
this.document = doc;
|
|
this.container = null;
|
|
this.observer = null;
|
|
this.handleMutation = this.handleMutation.bind(this);
|
|
}
|
|
|
|
init() {
|
|
this.container = this.document?.getElementById("videoList") || null;
|
|
if (!this.container) {
|
|
return;
|
|
}
|
|
|
|
this.observeContainer();
|
|
this.updateEmptyState();
|
|
|
|
const infoTrigger = this.document.getElementById("kidsInfoTrigger");
|
|
if (infoTrigger) {
|
|
attachFeedInfoPopover(
|
|
infoTrigger,
|
|
"Kid-friendly videos filtered for younger audiences."
|
|
);
|
|
}
|
|
}
|
|
|
|
observeContainer() {
|
|
if (!this.container || typeof MutationObserver === "undefined") {
|
|
return;
|
|
}
|
|
|
|
if (this.observer) {
|
|
this.observer.disconnect();
|
|
}
|
|
|
|
this.observer = new MutationObserver(this.handleMutation);
|
|
this.observer.observe(this.container, {
|
|
childList: true,
|
|
subtree: true,
|
|
});
|
|
}
|
|
|
|
handleMutation() {
|
|
this.updateEmptyState();
|
|
}
|
|
|
|
updateEmptyState() {
|
|
if (!this.container) {
|
|
return;
|
|
}
|
|
|
|
const hasVideos = Boolean(this.container.querySelector(VIDEO_CARD_SELECTOR));
|
|
const isLoading = Boolean(this.container.querySelector(LOADING_SELECTOR));
|
|
const existingEmptyState = this.container.querySelector(EMPTY_STATE_SELECTOR);
|
|
|
|
if (isLoading) {
|
|
if (existingEmptyState) {
|
|
existingEmptyState.remove();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (hasVideos) {
|
|
if (existingEmptyState) {
|
|
existingEmptyState.remove();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (existingEmptyState) {
|
|
return;
|
|
}
|
|
|
|
const emptyState = this.buildEmptyState();
|
|
if (emptyState) {
|
|
this.container.innerHTML = "";
|
|
this.container.appendChild(emptyState);
|
|
}
|
|
}
|
|
|
|
buildEmptyState() {
|
|
if (!this.document) {
|
|
return null;
|
|
}
|
|
|
|
const wrapper = this.document.createElement("div");
|
|
wrapper.className = "col-span-full";
|
|
wrapper.dataset.kidsEmptyState = "true";
|
|
|
|
const card = this.document.createElement("div");
|
|
card.className = "card p-lg text-center";
|
|
|
|
const title = this.document.createElement("h3");
|
|
title.className = "text-lg font-semibold text-text";
|
|
title.textContent = "No kids videos available yet.";
|
|
|
|
const copy = this.document.createElement("p");
|
|
copy.className = "mt-2 text-sm text-muted";
|
|
copy.textContent = "Check back soon for new kid-friendly videos.";
|
|
|
|
card.appendChild(title);
|
|
card.appendChild(copy);
|
|
wrapper.appendChild(card);
|
|
|
|
return wrapper;
|
|
}
|
|
}
|
|
|
|
export function initKidsView() {
|
|
const view = new KidsView();
|
|
view.init();
|
|
return view;
|
|
}
|