mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
- Add `#videoListTags` container to `views/explore.html` to support the hashtag helper bar in the Explore view. - Rename `#recentVideoTags` to `#videoListTags` in `views/most-recent-videos.html` for consistency across views. - Update `js/ui/videoListViewController.js` and `js/app.js` to reference the new generic `#videoListTags` ID. - Update `tests/ui/video-list-view-popular-tags.test.mjs` to reflect the ID change. This enables the hashtag aggregation and interaction features (filtering, muting, following) on the Explore tab, reusing the existing `VideoListView` logic.
113 lines
2.9 KiB
JavaScript
113 lines
2.9 KiB
JavaScript
import { devLogger as defaultLogger } from "../utils/logger.js";
|
|
|
|
export default class VideoListViewController {
|
|
constructor({ getSidebarLoadingMarkup, environment = {}, logger } = {}) {
|
|
this.getSidebarLoadingMarkup =
|
|
typeof getSidebarLoadingMarkup === "function"
|
|
? getSidebarLoadingMarkup
|
|
: () => "";
|
|
|
|
this.document = environment.document || (typeof document !== "undefined" ? document : null);
|
|
this.logger = logger || defaultLogger;
|
|
}
|
|
|
|
isElement(value) {
|
|
return (
|
|
typeof HTMLElement !== "undefined" && value instanceof HTMLElement
|
|
);
|
|
}
|
|
|
|
mount({
|
|
container = null,
|
|
popularTagsContainer = null,
|
|
view,
|
|
currentVideoList = null,
|
|
includeTags = true,
|
|
} = {}) {
|
|
if (!view) {
|
|
return { videoList: currentVideoList || null, popularTags: null };
|
|
}
|
|
|
|
const target = container || this.getElementById("videoList");
|
|
let popularTags = null;
|
|
if (this.isElement(popularTagsContainer)) {
|
|
popularTags = popularTagsContainer;
|
|
} else if (includeTags) {
|
|
popularTags = this.getElementById("videoListTags");
|
|
}
|
|
|
|
if (typeof view.setPopularTagsContainer === "function") {
|
|
view.setPopularTagsContainer(popularTags || null);
|
|
}
|
|
|
|
view.mount(target || null);
|
|
|
|
return {
|
|
videoList: target || null,
|
|
popularTags: popularTags || null,
|
|
};
|
|
}
|
|
|
|
reinitialize({
|
|
view,
|
|
reason,
|
|
postLoginResult,
|
|
currentVideoList = null,
|
|
popularTagsContainer = null,
|
|
} = {}) {
|
|
if (!view) {
|
|
return {
|
|
videoList: currentVideoList || null,
|
|
popularTags: null,
|
|
};
|
|
}
|
|
|
|
const container =
|
|
this.isElement(currentVideoList) && currentVideoList
|
|
? currentVideoList
|
|
: this.getElementById("videoList");
|
|
|
|
try {
|
|
view.destroy();
|
|
} catch (error) {
|
|
if (this.logger?.warn) {
|
|
this.logger.warn(
|
|
"[VideoListViewController] Failed to destroy VideoListView during reinitialization:",
|
|
error,
|
|
);
|
|
}
|
|
}
|
|
|
|
const messageContext =
|
|
reason === "login" && postLoginResult?.blocksLoaded !== false
|
|
? "Applying your filters…"
|
|
: "Refreshing videos…";
|
|
|
|
let tagsRoot = null;
|
|
if (this.isElement(popularTagsContainer)) {
|
|
tagsRoot = popularTagsContainer;
|
|
} else {
|
|
tagsRoot = this.getElementById("videoListTags");
|
|
}
|
|
if (typeof view.setPopularTagsContainer === "function") {
|
|
view.setPopularTagsContainer(this.isElement(tagsRoot) ? tagsRoot : null);
|
|
}
|
|
|
|
if (this.isElement(container)) {
|
|
container.innerHTML = this.getSidebarLoadingMarkup(messageContext);
|
|
}
|
|
|
|
return {
|
|
videoList: this.isElement(container) ? container : null,
|
|
popularTags: this.isElement(tagsRoot) ? tagsRoot : null,
|
|
};
|
|
}
|
|
|
|
getElementById(id) {
|
|
if (!this.document || typeof this.document.getElementById !== "function") {
|
|
return null;
|
|
}
|
|
return this.document.getElementById(id) || null;
|
|
}
|
|
}
|