import React, { useEffect, useRef, useState } from 'react'; import { useInView } from 'framer-motion'; import { useSite } from '../../api'; import { useFieldSaver } from '../../admin/AdminContext'; import { AddItemButton, EditableItem } from '../../admin/Editable'; import { InlineEdit } from '../admin/InlineEdit'; function toFa(n: number) { return n.toLocaleString('fa-IR'); } function Counter({ value }: {value: number;}) { const ref = useRef(null); const inView = useInView(ref, { once: true, margin: '-60px' }); const [display, setDisplay] = useState(0); useEffect(() => { if (!inView) return; let frame = 0; const total = 60; const id = window.setInterval(() => { frame += 1; const progress = 1 - Math.pow(1 - frame / total, 3); setDisplay(Math.round(value * progress)); if (frame >= total) window.clearInterval(id); }, 20); return () => window.clearInterval(id); }, [inView, value]); return {toFa(display)}; } export function Stats() { const { stats } = useSite(); const save = useFieldSaver(); return (
{stats.map((stat) =>

save('stats', stat.id, { suffix: v }, (d) => { const s = d.stats.find((x) => x.id === stat.id); if (s) s.suffix = v; })} className="mr-1 text-2xl" />

save('stats', stat.id, { label: v }, (d) => { const s = d.stats.find((x) => x.id === stat.id); if (s) s.label = v; })} />

)}
); }