import Button from "@moduletrace/twui/layout/Button"; import Row from "@moduletrace/twui/layout/Row"; import Span from "@moduletrace/twui/layout/Span"; import Stack from "@moduletrace/twui/layout/Stack"; import { useState } from "react"; import { AppData } from "@/src/data/app-data"; import { BotHookEventStatuses } from "@/src/dict/bot-hook-dict"; import useHookCall from "@/src/hooks/use-hook-call"; import type { BotHookCall } from "@/src/types"; import relativeTime from "@/src/utils/relative-time"; import HookCallText from "./hook-call-text"; type Props = { event: BotHookCall; }; /** * One call to a hook: what became of it and when, where it came from, why * it was refused, then what it sent and what its run answered. Previews * at first; Show all loads the whole call. */ export default function HookEventRow({ event }: Props) { const [open, set_open] = useState(false); const { call, loading, error } = useHookCall({ event_id: Number(event.id), open }); const shown = open && call ? call : event; const status = BotHookEventStatuses.find((s) => s.value == event.status)?.title || event.status || ""; const meta = [ `#${event.id}`, status, event.created_at ? relativeTime({ at: Number(event.created_at) }) : "", event.source_ip || "", event.job_id ? `job #${event.job_id}` : "", event.error || "", ] .filter(Boolean) .join(" ยท "); const cut = String(event.payload || "").length >= AppData.BotHookCallPreviewChars || String(event.response || "").length >= AppData.BotHookCallPreviewChars; return ( {meta} {cut ? ( ) : null} {shown.payload ? : null} {shown.response ? ( ) : null} {error ? {error} : null} ); }