import { Component, For, createSignal, Match, Switch as JsSwitch, ErrorBoundary, createSelector, } from "solid-js"; import { type mastodon } from "masto"; import { Button } from "@suid/material"; import { createTimelineSnapshot } from "../masto/timelines.js"; import { vibrate } from "../platform/hardware.js"; import PullDownToRefresh from "./PullDownToRefresh.jsx"; import Thread from "./Thread.jsx"; const TrendTimelinePanel: Component<{ client: mastodon.rest.Client; openFullScreenToot: ( toot: mastodon.v1.Status, srcElement?: HTMLElement, reply?: boolean, ) => void; }> = (props) => { const [scrollLinked, setScrollLinked] = createSignal(); const [ timeline, snapshot, { refetch: refetchTimeline, mutate: mutateTimeline }, ] = createTimelineSnapshot( () => props.client.v1.trends.statuses, () => 120, ); const [expandedId, setExpandedId] = createSignal(); const isExpandedId = createSelector(expandedId); const isExpanded = (st: mastodon.v1.Status) => isExpandedId(st.id); const onBookmark = async ( index: number, 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()); mutateTimeline((o) => { o![index] = [result]; return o; }); }; const onBoost = async ( index: number, client: mastodon.rest.Client, status: mastodon.v1.Status, ) => { const reblogged = status.reblog ? status.reblog.reblogged : status.reblogged; vibrate(50); mutateTimeline(index, (th) => { const x = th[0]; if (x.reblog) { x.reblog = { ...x.reblog, reblogged: !reblogged }; return [Object.assign({}, x)]; } else { return [ Object.assign({}, x, { reblogged: !reblogged, }), ]; } }); const result = reblogged ? await client.v1.statuses.$select(status.id).unreblog() : (await client.v1.statuses.$select(status.id).reblog()).reblog!; mutateTimeline(index, (th) => { Object.assign(th[0].reblog ?? th[0], { reblogged: result.reblogged, reblogsCount: result.reblogsCount, }); return th; }); }; return ( { return

Oops: {String(err)}

; }} > refetchTimeline({ direction: "new" })} />
setTimeout(() => { setScrollLinked(e.parentElement!); }, 0) } > {(item, index) => { let element: HTMLElement | undefined; return ( onBoost(index(), ...args)} onBookmark={(...args) => onBookmark(index(), ...args)} onReply={({ status }, element) => props.openFullScreenToot(status, element, true) } client={props.client} isExpended={isExpanded} onItemClick={(x) => { if (x.id !== expandedId()) { setExpandedId((o) => (o ? undefined : x.id)); } else { props.openFullScreenToot(x, element); } }} /> ); }}

{`Oops: ${snapshot.error}`}

); }; export default TrendTimelinePanel;