import { onDestroy, createElement, createFragment, nop } from "../../lib/skeleton/index.js"; import rxjs, { effect, applyMutation, onClick, preventDefault } from "../../lib/rx.js"; import { animate } from "../../lib/animate.js"; import { loadCSS } from "../../helpers/loader.js"; import { qs } from "../../lib/dom.js"; import { getSelection$, clearSelection } from "./model_files.js"; import { setAction } from "./model_action.js"; import componentShare from "./modal_share.js"; import componentEmbed from "./modal_embed.js"; import componentTag from "./modal_tag.js"; import componentRename from "./modal_rename.js"; import componentDelete from "./modal_delete.js"; import "../../components/dropdown.js"; import "../../components/icon.js"; import { createModal } from "../../components/modal.js"; const modalOpt = { withButtonsRight: "OK", withButtonsLeft: "CANCEL", }; export default async function(render) { const $page = createElement(`
`); render($page); onDestroy(() => clearSelection()); // feature1: layout base case effect(getSelection$().pipe( rxjs.filter((selections) => selections.length === 0), rxjs.map(() => createFragment(`
`)), applyMutation($page, "replaceChildren"), rxjs.mergeMap(() => rxjs.merge( rxjs.merge( onClick(qs($page, `[data-action="new-file"]`)).pipe(rxjs.mapTo("NEW_FILE")), onClick(qs($page, `[data-action="new-folder"]`)).pipe(rxjs.mapTo("NEW_FOLDER")), ).pipe(rxjs.mergeMap((actionName) => { $scroll.scrollTo({top: 0, behavior: "smooth"}); setAction(actionName); return rxjs.EMPTY; })), onClick(qs($page, `[data-action="search"]`)).pipe(rxjs.mapTo("SEARCH")), onClick(qs($page, `[data-action="view"]`)).pipe(rxjs.mapTo("VIEW")), )), )); // feature2: update when selection is preset effect(getSelection$().pipe( rxjs.filter((selections) => selections.length > 0), rxjs.tap((selections) => selections.length === 1 && animate($page)), rxjs.map((selections) => createFragment(`
`)), applyMutation($page, "replaceChildren"), rxjs.mergeMap(() => rxjs.merge( onClick(qs($page, `[data-bind="clear"]`)).pipe( rxjs.tap(() => clearSelection()), rxjs.mergeMap(() => rxjs.EMPTY), ), onClick(qs($page, `[data-action="download"]`)).pipe( rxjs.mergeMap(() => rxjs.EMPTY), ), onClick(qs($page, `[data-action="share"]`)).pipe(rxjs.tap(() => { componentShare(createModal(modalOpt)); })), onClick(qs($page, `[data-action="embed"]`)).pipe(rxjs.tap(() => { componentEmbed(createModal(modalOpt)); })), onClick(qs($page, `[data-action="tag"]`)).pipe(rxjs.tap(() => { componentTag(createModal(modalOpt)) })), onClick(qs($page, `[data-action="rename"]`)).pipe(rxjs.tap(() => { componentRename(createModal(modalOpt)); })), onClick(qs($page, `[data-action="delete"]`)).pipe(rxjs.tap(() => { componentDelete(createModal(modalOpt)); })), )), )); // feature3: effect on scroll const $scroll = $page.closest(".scroll-y"); effect(rxjs.fromEvent($scroll, "scroll", { passive: true }).pipe( rxjs.map((e) => e.target.scrollTop > 30), rxjs.distinctUntilChanged(), rxjs.startWith(false), rxjs.tap((scrolling) => scrolling ? $scroll.classList.add("scrolling") : $scroll.classList.remove("scrolling")), )); } export function init() { return loadCSS(import.meta.url, "./ctrl_submenu.css"); }