import { useId } from "react";
import { errorMessage } from "./error-copy.js";
import { Button } from "./ui/button.jsx";
/** @param {{ label?: string }} props */
export function LoadingSurface({ label = "불러오는 중" }) {
return (
);
}
/**
* @param {{
* title?: string,
* description?: string,
* action?: React.ReactNode
* }} props
*/
export function EmptySurface({
title = "표시할 항목이 없습니다.",
description,
action,
}) {
return (
{title}
{description ? {description}
: null}
{action}
);
}
/**
* @param {{
* userMessageKey: string,
* action: "retry" | "reauth" | "navigate" | "reload-once" |
* "contact-support" | "none",
* onAction?: () => void
* }} props
*/
export function TerminalErrorSurface({ userMessageKey, action, onAction }) {
const messageId = useId();
const actionLabels = Object.freeze({
retry: "다시 시도",
reauth: "로그인",
navigate: "안전한 화면으로 이동",
"reload-once": "한 번 새로고침",
"contact-support": "지원 정보 확인",
});
return (
{errorMessage(userMessageKey)}
{action !== "none" && (
)}
);
}
/**
* @param {{
* state: ReturnType,
* children?: React.ReactNode,
* onAction?: () => void
* }} props
*/
export function AsyncSurface({ state, children, onAction }) {
if (state.base === "initial-loading") return ;
if (state.base === "empty") return ;
if (state.base === "terminal-error" && state.failure) {
return (
);
}
return (
{state.indicator && (
{state.indicator}
)}
{children}
);
}