import { createFragment } from "../../../lib/skeleton/index.js"; import rxjs, { effect } from "../../../lib/rx.js"; import { qs } from "../../../lib/dom.js"; import { join, forwardURLParams } from "../../../lib/path.js"; import { animate, slideXOut } from "../../../lib/animate.js"; import { loadCSS } from "../../../helpers/loader.js"; import { get as getConfig } from "../../../model/config.js"; import { getCurrentPath, getFilename } from "../common.js"; import { getMimeType } from "../mimetype.js"; import { createLink } from "../../filespage/ctrl_filesystem.js"; import fscache from "../../filespage/cache.js"; import { sort } from "../../filespage/helper.js"; import { getState$ as getParams$, init as initParams } from "../../filespage/state_config.js"; export default async function(render, { $img }) { const lsCache = await fscache().get(join(location, getCurrentPath() + "/../")); if (!lsCache) return; const params = await getParams$().pipe(rxjs.first()).toPromise(); const state = { prev: null, curr: null, next: null, length: 0, }; const files = filterImages( sort(lsCache.files, params["sort"], params["order"]), state, ); if (state.length <= 1) return; const $page = createFragment(` `); if (state.prev !== null) updateDOM({ $el: $page.children[0], name: files[state.prev].name, $img, }); if (state.next !== null) updateDOM({ $el: $page.children[1], name: files[state.next].name, $img, }); const $navigation = render($page); initMobileNavigation({ $img, $navigation }); initKeyboardNavigation({ $img, $navigation }); } function filterImages(files, state) { const currentFilename = getFilename(); const mimeTypes = getConfig("mime", {}); for (let i=0; i { if (e.target.hasAttribute("data-link")) return; e.preventDefault(); e.stopPropagation(); const sgn = $el.classList.contains("left") ? +1 : -1; await animate($img, { keyframes: slideXOut(sgn * 25), time: 100, easing: "ease-in", }); $link.setAttribute("data-link", "true"); $link.click(); }; const { link } = createLink({ name }, join(location, getCurrentPath() + "/../")); $link.setAttribute("href", forwardURLParams(link, ["share", "canary"])); $el.classList.remove("hidden"); } function initMobileNavigation({ $img, $navigation }) { const state = { active: false, originX: null, originT: null, dist: null, }; effect(rxjs.fromEvent($img, "touchstart", { passive: true }).pipe(rxjs.debounceTime(10), rxjs.tap((event) => { if (event.touches.length !== 1) return; $img.style.transition = "0s ease transform"; state.active = true; state.originT = performance.now(); state.originX = event.touches[0].pageX; }))); effect(rxjs.fromEvent($img, "touchmove", { passive: true }).pipe(rxjs.tap((event) => { if (event.touches.length !== 1 || state.active === false) return; state.dist = event.touches[0].pageX - state.originX; $img.style.transform = `translateX(${state.dist}px)`; }))); effect(rxjs.fromEvent($img, "touchend").pipe(rxjs.tap(async (event) => { if (state.active === false) return; state.active = false; const shouldTurnPage = ((distPx, elapsedMs, widthPx) => { const velocity = Math.abs(distPx) / elapsedMs; const fastEnough = velocity > 1; const farEnough = Math.abs(distPx) > widthPx * 0.5; return farEnough || fastEnough; })(state.dist, performance.now() - state.originT, $img.clientWidth); if (!shouldTurnPage) { $img.style.transition = "0.2s ease transform"; $img.style.transform = ""; return; } let $navlink = null; if (state.dist > 0) $navlink = qs($navigation, ".left a"); else $navlink = qs($navigation, ".right a"); if (!$navlink.hasAttribute("href")) { $img.style.transition = "0.5s ease transform"; $img.style.transform = ""; return; } $navlink.click(); await animate($img, { time: 200, keyframes: [ { transform: `translateX(${state.dist}px)`, opacity: 1 }, { transform: `translateX(${$img.clientWidth*Math.sign(state.dist)}px)`, opacity: 0 }, ]}); $img.classList.add("hidden"); }))); } function initKeyboardNavigation({ $img, $navigation }) { effect(rxjs.fromEvent(window, "keydown").pipe(rxjs.tap(({ key }) => { let $navlink = null; switch (key) { case "ArrowLeft": $navlink = qs($navigation, ".left a"); break; case "ArrowRight": $navlink = qs($navigation, ".right a"); break; } if (!$navlink || !$navlink.hasAttribute("href")) return; $navlink.click(); }))); } export function init() { return Promise.all([ loadCSS(import.meta.url, "./pagination.css"), initParams(), ]); }