import { bindToPage, pageEffect, bindPageTitle, onPageShow, onPageHide, } from "/js/router.js"; import { html, render } from "/js/lib/lit-html.js"; import { headerTemplate } from "/js/templates/header.template.js"; import { feedsFeedTemplate } from "/js/templates/feedsFeed.template.js"; import { fillableIconTemplate } from "/js/templates/fillableIcon.template.js"; import "/js/components/app-icon.js"; import { linkToList, linkToFeed } from "/js/navigation.js"; import { Signal, ReactiveStore, SignalSet, SignalArray } from "/js/signals.js"; import { enableReorder } from "/js/utils.js"; import { showToast } from "/js/toasts.js"; import { cdnImageUrl, valueForPinnedItem } from "/js/dataHelpers.js"; import "/js/components/container-link.js"; export default async function feedsView({ root, layout, context: { auth, dataLayer }, }) { await auth.requireAuth(); const state = new ReactiveStore("feedsView"); state.$draftOrder = new SignalArray(); state.$draftUnpinned = new SignalSet(); state.$isEditing = new Signal.State(false); state.$isSaving = new Signal.State(false); function orderMatches(orderA, orderB) { if (orderA.length !== orderB.length) return false; for (let i = 0; i < orderA.length; i++) { if (orderA[i] !== orderB[i]) return false; } return true; } async function handleSave() { if (state.$isSaving.get()) return; const draftOrder = state.$draftOrder; const draftUnpinned = state.$draftUnpinned; if (draftOrder.length > 0 || draftUnpinned.size > 0) { const pinnedItems = dataLayer.derived.$hydratedPinnedItems.get(); if (!pinnedItems) return; const baseOrder = draftOrder.length > 0 ? [...draftOrder] : pinnedItems.map(valueForPinnedItem); const nextValues = draftUnpinned.size > 0 ? baseOrder.filter((value) => !draftUnpinned.has(value)) : baseOrder; state.$isSaving.set(true); try { await dataLayer.mutations.setPinnedItems(nextValues); showToast("Feeds updated!"); } catch { showToast("Couldn't save changes"); return; } finally { state.$isSaving.set(false); } } state.$draftOrder.clear(); state.$draftUnpinned.clear(); state.$isEditing.set(false); } function cancelEditing() { if (state.$isSaving.get()) return; state.$draftOrder.clear(); state.$draftUnpinned.clear(); state.$isEditing.set(false); } function editControlsTemplate({ value, isSaving, showUnpin }) { return html`${showUnpin ? html`` : ""} `; } function rowTemplate({ item, currentUser, rightItem }) { const value = valueForPinnedItem(item); if (item.type === "timeline") { return html`