import { batch, createRenderEffect, createSelector, createSignal, Index, Show, untrack, type Component, } from "solid-js"; import "./TootPoll.css"; import type { mastodon } from "masto"; import { resolveCustomEmoji } from "../../masto/toot"; import { Button, Checkbox, Divider, List, ListItemButton, ListItemText, Radio, } from "@suid/material"; import { formatDistance, isBefore, } from "date-fns"; import { useTimeSource } from "~platform/timesrc"; import { useDateFnLocale } from "~platform/i18n"; import TootPollDialog from "./TootPollDialog"; import { ANIM_CURVE_STD } from "~material/theme"; type TootPollProps = { options: Readonly; multiple?: boolean; votesCount: number; expired?: boolean; expiredAt?: Date; voted?: boolean; ownVotes?: readonly number[]; onVote(votes: readonly number[]): void | Promise; }; const TootPoll: Component = (props) => { let list: HTMLUListElement; const now = useTimeSource(); const dateFnLocale = useDateFnLocale(); const [mustShowResult, setMustShowResult] = createSignal(); const [showVoteDialog, setShowVoteDialog] = createSignal(false); const [initialVote, setInitialVote] = createSignal(0); const isShowResult = () => { const n = mustShowResult(); if (typeof n !== "undefined") { return n; } return props.expired || props.voted; }; const isOwnVote = createSelector( () => props.ownVotes, (idx: number, votes) => votes?.includes(idx) || false, ); const openVote = (i: number, event: Event) => { event.stopPropagation(); if (props.expired || props.voted) { return; } batch(() => { setInitialVote(i); setShowVoteDialog(true); }); }; const animateAndSetMustShow = (event: Event) => { event.stopPropagation(); list.animate( { opacity: [0.5, 0, 0.5], }, { duration: 220, easing: ANIM_CURVE_STD, }, ); setMustShowResult((x) => { if (typeof x === "undefined") { return !untrack(isShowResult); } else { return undefined; } }); }; return (
{props.votesCount} votes in total Poll is ended
{(option, index) => { return ( <> createRenderEffect(() => { e.innerHTML = resolveCustomEmoji( option().title, option().emojis, ); }) } > {option().votesCount} votes } > ); }}
{isBefore(now(), props.expiredAt!) ? "Expire in" : "Expired"}
console.debug(votes)} onClose={() => setShowVoteDialog(false)} initialVotes={[initialVote()]} />
); }; export default TootPoll;