import { useNavigate, useParams } from "@solidjs/router"; import { createEffect, createRenderEffect, createResource, Show, type Component, } from "solid-js"; import Scaffold from "../material/Scaffold"; import TootThread from "./TootThread"; import { AppBar, Avatar, IconButton, Toolbar } from "@suid/material"; import { Title } from "../material/typography"; import { Close as CloseIcon, Send } from "@suid/icons-material"; import { isiOS } from "../platform/host"; import { createUnauthorizedClient, useSessions } from "../masto/clients"; import { resolveCustomEmoji } from "../masto/toot"; import RegularToot from "./RegularToot"; import type { mastodon } from "masto"; import cards from "../material/cards.module.css"; import { css } from "solid-styled"; let cachedEntry: [string, mastodon.v1.Status] | undefined; export function setCache(acct: string, status: mastodon.v1.Status) { cachedEntry = [acct, status]; } function getCache(acct: string, id: string) { if (acct === cachedEntry?.[0] && id === cachedEntry?.[1].id) { return cachedEntry[1]; } } const TootBottomSheet: Component = (props) => { const params = useParams<{ acct: string; id: string }>(); const navigate = useNavigate(); const allSession = useSessions(); const acctText = () => decodeURIComponent(params.acct); const session = () => { const [inputUsername, inputSite] = acctText().split("@", 2); const authedSession = allSession().find( (x) => x.account.site === inputSite && x.account.inf?.username === inputUsername, ); return ( authedSession ?? { client: createUnauthorizedClient(inputSite), account: undefined, } ); }; const profile = () => { return session().account; }; const [remoteToot] = createResource( () => [session().client, params.id] as const, async ([client, id]) => { return await client.v1.statuses.$select(id).fetch(); }, ); const toot = () => remoteToot() ?? getCache(acctText(), params.id); const tootTitle = () => { const t = toot(); if (t) { const name = resolveCustomEmoji(t.account.displayName, t.account.emojis); return `${name}'s toot`; } return "A toot"; }; css` .bottom-dock { position: sticky; bottom: 0; } .name :global(img) { max-height: 1em; } `; return ( createRenderEffect(() => (e.innerHTML = tootTitle())) } > } >
); }; export default TootBottomSheet;