refactor: close episode dropdown on range selection
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { state } from '../state';
|
||||
import { qs } from '../../q';
|
||||
|
||||
/**
|
||||
* Syncs autoplay checkbox with localStorage on init.
|
||||
@@ -57,7 +58,7 @@ export const updateEpisodeHighlight = (num: number): void => {
|
||||
* Updates dropdown label and hides/shows episode cards.
|
||||
*/
|
||||
export const switchEpisodeRange = (idx: number): void => {
|
||||
const dropdown = state.container.querySelector('[data-episode-dropdown]') as HTMLElement | null;
|
||||
const dropdown = qs<HTMLElement>('[data-episode-dropdown]');
|
||||
if (!dropdown) return;
|
||||
const btns = Array.from(dropdown.querySelectorAll('.episode-range-btn')) as HTMLButtonElement[];
|
||||
const target = btns[idx];
|
||||
|
||||
@@ -22,6 +22,14 @@ import { formatTime } from './controls';
|
||||
|
||||
let initialized = false; // prevent double init on htmx swaps
|
||||
|
||||
type ClosableDropdown = HTMLElement & { close: () => void };
|
||||
const isClosableDropdown = (el: Element | null): el is ClosableDropdown => {
|
||||
if (!el) return false;
|
||||
if (!(el instanceof HTMLElement)) return false;
|
||||
const maybe = el as Partial<{ close: unknown }>;
|
||||
return typeof maybe.close === 'function';
|
||||
};
|
||||
|
||||
const hidePreviewPopover = (): void => {
|
||||
if (!state.previewPopover) return;
|
||||
state.previewPopover.classList.add('opacity-0');
|
||||
@@ -221,7 +229,7 @@ const initPlayer = (): void => {
|
||||
state.video.addEventListener('click', showControls);
|
||||
|
||||
const searchInput = document.querySelector('[data-episode-search]') as HTMLInputElement | null;
|
||||
const dropdown = container.querySelector('[data-episode-dropdown]') as HTMLElement | null;
|
||||
const dropdown = document.querySelector('[data-episode-dropdown]') as HTMLElement | null;
|
||||
let searchDebounce: number | undefined;
|
||||
|
||||
if (searchInput) {
|
||||
@@ -256,6 +264,8 @@ const initPlayer = (): void => {
|
||||
btn.addEventListener('click', () => {
|
||||
const idx = Number.parseInt((btn as HTMLElement).dataset.rangeIndex ?? '0', 10);
|
||||
switchEpisodeRange(idx);
|
||||
const dd = btn.closest('ui-dropdown');
|
||||
if (isClosableDropdown(dd)) dd.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user