{"version":3,"file":"infinite_scroll.min.js","names":["resultsElement: HTMLElement | null","onlyImages: boolean","intersectionObserveOptions: IntersectionObserverInit","observer: IntersectionObserver","initialObservedElement: HTMLElement | null"],"sources":["../../../../../client/simple/src/js/main/infinite_scroll.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { assertElement, http, settings } from \"../core/toolkit.ts\";\n\nconst newLoadSpinner = (): HTMLDivElement => {\n return Object.assign(document.createElement(\"div\"), {\n className: \"loader\"\n });\n};\n\nconst loadNextPage = async (onlyImages: boolean, callback: () => void): Promise => {\n const searchForm = document.querySelector(\"#search\");\n assertElement(searchForm);\n\n const form = document.querySelector(\"#pagination form.next_page\");\n assertElement(form);\n\n const action = searchForm.getAttribute(\"action\");\n if (!action) {\n throw new Error(\"Form action not defined\");\n }\n\n const paginationElement = document.querySelector(\"#pagination\");\n assertElement(paginationElement);\n\n paginationElement.replaceChildren(newLoadSpinner());\n\n try {\n const res = await http(\"POST\", action, { body: new FormData(form) });\n const nextPage = await res.text();\n if (!nextPage) return;\n\n const nextPageDoc = new DOMParser().parseFromString(nextPage, \"text/html\");\n const articleList = nextPageDoc.querySelectorAll(\"#urls article\");\n const nextPaginationElement = nextPageDoc.querySelector(\"#pagination\");\n\n document.querySelector(\"#pagination\")?.remove();\n\n const urlsElement = document.querySelector(\"#urls\");\n if (!urlsElement) {\n throw new Error(\"URLs element not found\");\n }\n\n if (articleList.length > 0 && !onlyImages) {\n // do not add
element when there are only images\n urlsElement.appendChild(document.createElement(\"hr\"));\n }\n\n urlsElement.append(...Array.from(articleList));\n\n if (nextPaginationElement) {\n const results = document.querySelector(\"#results\");\n results?.appendChild(nextPaginationElement);\n callback();\n }\n } catch (error) {\n console.error(\"Error loading next page:\", error);\n\n const errorElement = Object.assign(document.createElement(\"div\"), {\n textContent: settings.translations?.error_loading_next_page ?? \"Error loading next page\",\n className: \"dialog-error\"\n });\n errorElement.setAttribute(\"role\", \"alert\");\n document.querySelector(\"#pagination\")?.replaceChildren(errorElement);\n }\n};\n\nconst resultsElement: HTMLElement | null = document.getElementById(\"results\");\nif (!resultsElement) {\n throw new Error(\"Results element not found\");\n}\n\nconst onlyImages: boolean = resultsElement.classList.contains(\"only_template_images\");\nconst observedSelector = \"article.result:last-child\";\n\nconst intersectionObserveOptions: IntersectionObserverInit = {\n rootMargin: \"320px\"\n};\n\nconst observer: IntersectionObserver = new IntersectionObserver((entries: IntersectionObserverEntry[]) => {\n const [paginationEntry] = entries;\n\n if (paginationEntry?.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n\n loadNextPage(onlyImages, () => {\n const nextObservedElement = document.querySelector(observedSelector);\n if (nextObservedElement) {\n observer.observe(nextObservedElement);\n }\n }).then(() => {\n // wait until promise is resolved\n });\n }\n}, intersectionObserveOptions);\n\nconst initialObservedElement: HTMLElement | null = document.querySelector(observedSelector);\nif (initialObservedElement) {\n observer.observe(initialObservedElement);\n}\n"],"mappings":"wDAIA,MAAM,MACG,OAAO,OAAO,SAAS,cAAc,OAAQ,CAClD,UAAW,SACZ,EAGG,EAAe,MAAO,EAAqB,IAAwC,CACvF,IAAM,EAAa,SAAS,cAA+B,WAC3D,EAAc,GAEd,IAAM,EAAO,SAAS,cAA+B,8BACrD,EAAc,GAEd,IAAM,EAAS,EAAW,aAAa,UACvC,GAAI,CAAC,EACH,MAAU,MAAM,2BAGlB,IAAM,EAAoB,SAAS,cAA2B,eAC9D,EAAc,GAEd,EAAkB,gBAAgB,KAElC,GAAI,CACF,IAAM,EAAM,MAAM,EAAK,OAAQ,EAAQ,CAAE,KAAM,IAAI,SAAS,GAAO,EAC7D,EAAW,MAAM,EAAI,OAC3B,GAAI,CAAC,EAAU,OAEf,IAAM,EAAc,IAAI,YAAY,gBAAgB,EAAU,aACxD,EAAc,EAAY,iBAA8B,iBACxD,EAAwB,EAAY,cAA2B,eAErE,SAAS,cAAc,gBAAgB,SAEvC,IAAM,EAAc,SAAS,cAA2B,SACxD,GAAI,CAAC,EACH,MAAU,MAAM,0BAUlB,GAPI,EAAY,OAAS,GAAK,CAAC,GAE7B,EAAY,YAAY,SAAS,cAAc,OAGjD,EAAY,OAAO,GAAG,MAAM,KAAK,IAE7B,EAAuB,CACzB,IAAM,EAAU,SAAS,cAA2B,YACpD,GAAS,YAAY,GACrB,GACD,CACF,OAAQ,EAAO,CACd,QAAQ,MAAM,2BAA4B,GAE1C,IAAM,EAAe,OAAO,OAAO,SAAS,cAAc,OAAQ,CAChE,YAAa,EAAS,cAAc,yBAA2B,0BAC/D,UAAW,eACZ,EACD,EAAa,aAAa,OAAQ,SAClC,SAAS,cAAc,gBAAgB,gBAAgB,EACxD,CACF,EAEKA,EAAqC,SAAS,eAAe,WACnE,GAAI,CAAC,EACH,MAAU,MAAM,6BAGlB,MAAMC,EAAsB,EAAe,UAAU,SAAS,wBACxD,EAAmB,4BAEnBC,EAAuD,CAC3D,WAAY,QACb,CAEKC,EAAiC,IAAI,qBAAsB,GAAyC,CACxG,GAAM,CAAC,EAAgB,CAAG,EAEtB,GAAiB,iBACnB,EAAS,UAAU,EAAgB,QAEnC,EAAa,MAAkB,CAC7B,IAAM,EAAsB,SAAS,cAA2B,GAC5D,GACF,EAAS,QAAQ,EAEpB,GAAE,SAAW,CAEb,GAEJ,EAAE,GAEGC,EAA6C,SAAS,cAA2B,GACnF,GACF,EAAS,QAAQ"}