import { Component, For, onCleanup, createSignal, Show, untrack, Match, Switch as JsSwitch, ErrorBoundary, } from "solid-js"; import { type mastodon } from "masto"; import { Button, LinearProgress } from "@suid/material"; import { createTimeline } from "../masto/timelines"; import { vibrate } from "../platform/hardware"; import PullDownToRefresh from "./PullDownToRefresh"; import TootComposer from "./TootComposer"; import Thread from "./Thread.jsx"; const TimelinePanel: Component<{ client: mastodon.rest.Client; name: "home" | "public"; prefetch?: boolean; openFullScreenToot: ( toot: mastodon.v1.Status, srcElement?: HTMLElement, reply?: boolean, ) => void; }> = (props) => { const [scrollLinked, setScrollLinked] = createSignal(); const [timeline, snapshot, { refetch: refetchTimeline }] = createTimeline( () => props.client.v1.timelines[props.name], () => 20, ); const [expandedThreadId, setExpandedThreadId] = createSignal(); const [typing, setTyping] = createSignal(false); const tlEndObserver = new IntersectionObserver(() => { if (untrack(() => props.prefetch) && !snapshot.loading) refetchTimeline("next"); }); onCleanup(() => tlEndObserver.disconnect()); const onBookmark = async ( client: mastodon.rest.Client, status: mastodon.v1.Status, ) => { const result = await (status.bookmarked ? client.v1.statuses.$select(status.id).unbookmark() : client.v1.statuses.$select(status.id).bookmark()); timeline.set(result.id, result); }; const onBoost = async ( client: mastodon.rest.Client, status: mastodon.v1.Status, ) => { vibrate(50); const rootStatus = status.reblog ? status.reblog : status; const reblogged = rootStatus.reblogged; if (status.reblog) { status.reblog = { ...status.reblog, reblogged: !reblogged }; timeline.set(status.id, status); } else { timeline.set( status.id, Object.assign(status, { reblogged: !reblogged, }), ); } const result = reblogged ? await client.v1.statuses.$select(status.id).unreblog() : (await client.v1.statuses.$select(status.id).reblog()).reblog!; timeline.set( status.id, Object.assign(status.reblog ?? status, result.reblog), ); }; return ( { return

Oops: {String(err)}

; }} > refetchTimeline("next")} />
setTimeout(() => { setScrollLinked(e.parentElement!); }, 0) } > refetchTimeline("prev")} /> {(itemId, index) => { const path = timeline.getPath(itemId)!; const toots = path.reverse().map((x) => x.value); return ( props.openFullScreenToot(status, element, true) } client={props.client} isExpended={(status) => status.id === expandedThreadId()} onItemClick={(status, event) => { setTyping(false); if (status.id !== expandedThreadId()) { setExpandedThreadId((x) => (x ? undefined : status.id)); } else { props.openFullScreenToot( status, event.currentTarget as HTMLElement, ); } }} /> ); }}
tlEndObserver.observe(e)}>
); }; export default TimelinePanel;