import { useEffect, useState } from "react"; import { ago } from "../utils/ago"; import { TimerResponse, Friend, TimersFilter } from "../utils/types"; const replaceReferencedFriendsInName = ( name: string, referencedFriends: Friend[], onSelect: (select?: TimersFilter) => void ) => { const friendIdToFriend = referencedFriends.reduce( (friendMap: Record, friend) => { friendMap[friend.id.toString()] = friend; return friendMap; }, {} ); return name.split(/(@\<\d+\>)/g).map((s: string) => { const matches = /@\<(\d+)\>/g.exec(s); if (matches) { const [_match, id] = matches; const name = friendIdToFriend[id].name; return onSelect({ friendId: Number(id) })}>{name}; } return s; }); }; const refreshTimer = (id: number) => fetch(`/api/timers/${id}/refresh`, { method: "POST", }); export type TimerCardProps = { timer: TimerResponse; onSelect: (select?: TimersFilter) => void; }; export default function TimerCard({ timer, onSelect }: TimerCardProps) { const [since, setSince] = useState(""); useEffect(() => { const start = new Date(timer.start); let updateTimersInterval: ReturnType; const msTillNextSecond = 1000 - (start.getTime() % 1000); setSince(ago(start)); setTimeout(() => { updateTimersInterval = setInterval(() => setSince(ago(start)), 1_000); }, msTillNextSecond); return () => clearInterval(updateTimersInterval); }, [timer.start]); return (

{since || "..."}

{replaceReferencedFriendsInName( timer.name, timer.referenced_friends, onSelect ).map((element: JSX.Element | string, i: number) => ( {element} ))}

{timer.timer_refreshes && timer.timer_refreshes.length ? ( onSelect({ friendId: timer.timer_refreshes[0].refreshed_by.id, }) } > {timer.timer_refreshes[0].refreshed_by.name} {" "} refreshed it last ) : ( "has not yet been refreshed..." )}
); }