import { FC, ReactNode, isValidElement, useEffect } from "react"; import * as card from "../ui/card"; import { cn } from "@/utils"; import { useLocal } from "@/utils/use-local"; import { Skeleton } from "../ui/skeleton"; export const Card: FC<{ title: { left: ReactNode; right: ReactNode }; desc: | ((arg: { setOnClick: (fn: any) => void }) => Promise) | ReactNode; value: (() => Promise) | ReactNode; }> = ({ title, desc, value }) => { const local = useLocal({ value: "" as any, desc: "" as any, status_value: "init" as "init" | "loading" | "ready", status_desc: "init" as "init" | "loading" | "ready", onClick: null as null | (() => void), }); useEffect(() => { if (!isEditor) { if (!!value && typeof value === "function") { local.status_value = "loading"; local.render(); const result = value(); if (typeof result === "object" && result instanceof Promise) { result.then((val) => { local.value = val; local.status_value = "ready"; local.render(); }); } else { local.value = result; local.status_value = "ready"; local.render(); } } if (!!desc && typeof desc === "function") { local.status_desc = "loading"; local.render(); const result = desc({ setOnClick: (fn) => { local.onClick = fn; local.render(); }, }); if (typeof result === "object" && result instanceof Promise) { result.then((val) => { local.desc = val; local.status_desc = "ready"; local.render(); }); } else { local.desc = result; local.status_desc = "ready"; local.render(); } } } }, []); if (typeof desc !== "function") { local.status_desc = "ready"; local.desc = desc; } else if (isEditor) { local.desc = typeof desc === "function" ? "..." : desc; local.status_desc = "ready"; } if (typeof value !== "function") { local.status_value = "ready"; local.value = value; } else if (isEditor) { local.value = "..."; local.status_value = "ready"; } return ( { if (local.onClick) { local.onClick(); } }} >
{!!title && (title.left || title.right) && (
{title.left}
{title.right && (
{title.right}
)}
)} {!!value && ( {local.status_value === "ready" ? ( formatObject(local.value) ) : (
)}
)} {local.status_desc === "ready" ? ( formatObject(local.desc) ) : (
)}
); }; const formatObject = (val: any) => { if (typeof val === "object") { if (isValidElement(val)) return val; else return JSON.stringify(val); } return val; };