import { Fragment, useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { useDataset } from "../../hooks/useDataset.ts"; import { useMutate } from "../../hooks/useMutate.ts"; import { addPost, movePost, setPostArchived, updatePost } from "../../../store/actions.ts"; import { CURRENCIES, type Currency, type Post } from "../../../domain/types.ts"; import { ruleAt } from "../../../domain/allocation.ts"; import { currentMonth } from "../../../store/index.ts"; import { RuleHistory } from "../../components/RuleHistory.tsx"; import { Section } from "../../components/Section.tsx"; export function PostsSection() { const dataset = useDataset(); const { mutate } = useMutate(); const [newName, setNewName] = useState(""); const [openHistory, setOpenHistory] = useState(null); const ordered = [...dataset.posts].sort((a, b) => a.order - b.order); const base = dataset.settings.baseCurrency; function ruleSummary(post: Post) { const effective = ruleAt(post, currentMonth); if (!effective) { return not budgeted; } const { rule } = effective; return ( {rule.kind === "fixed" ? `${rule.amount.amount} ${rule.amount.currency}` : `${rule.percent}% of income`} from {effective.from} ); } return (
{ordered.map((post, index) => ( {openHistory === post.id && ( )} ))}
Name Display currency Rule
{ const name = event.target.value; mutate((draft) => updatePost(draft, post.id, { name })); }} />

Archiving hides a post from new purchases while keeping its history. Posts are never deleted, because purchases reference them.

setNewName(event.target.value)} />
); }