Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/components/admin/cliproxy-instance-logs-panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,14 @@ export function CliproxyInstanceLogsPanel({ instance }: CliproxyInstanceLogsPane
data: result,
isLoading,
isError,
error,
refetch,
isFetching,
} = useCliproxyInstanceLogs(instance.id, { limit: CLIPROXY_LOGS_DEFAULT_LIMIT });
const [keyword, setKeyword] = useState("");

const errorMessage = error instanceof Error ? error.message : null;

const filtered = useMemo(() => {
const lines = result?.lines ?? [];
if (!keyword.trim()) return lines;
Expand Down Expand Up @@ -79,9 +82,12 @@ export function CliproxyInstanceLogsPanel({ instance }: CliproxyInstanceLogsPane
<Skeleton className="h-6 w-full" />
</div>
) : isError ? (
<p className="py-8 text-center type-body-medium text-destructive">
{t("logsLoadFailed")}
</p>
<div className="space-y-2 py-8 text-center">
<p className="type-body-medium text-destructive">{t("logsLoadFailed")}</p>
{errorMessage ? (
<p className="break-words type-body-small text-muted-foreground">{errorMessage}</p>
) : null}
</div>
) : !result || result.lines.length === 0 ? (
<p className="py-8 text-center type-body-medium text-muted-foreground">
{t("logsEmpty")}
Expand Down
21 changes: 20 additions & 1 deletion tests/components/cliproxy-instance-logs-panel.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ describe("CliproxyInstanceLogsPanel", () => {
expect(screen.getByText("logsTitle")).toBeInTheDocument();
});

it("加载失败展示错误", () => {
it("加载失败展示错误标题", () => {
useCliproxyInstanceLogsMock.mockReturnValue({
data: undefined,
isError: true,
Expand All @@ -64,6 +64,25 @@ describe("CliproxyInstanceLogsPanel", () => {
expect(screen.getByText("logsLoadFailed")).toBeInTheDocument();
});

it("加载失败时把后端透传的具体原因(如 logging to file disabled)也展示出来", () => {
useCliproxyInstanceLogsMock.mockReturnValue({
data: undefined,
isError: true,
error: new Error(
"CLIProxyAPI 管理 API 调用失败:CLIProxyAPI 管理 API 返回异常状态码 400:logging to file disabled"
),
refetch: vi.fn(),
isFetching: false,
});
render(<CliproxyInstanceLogsPanel instance={instance} />);
expect(screen.getByText("logsLoadFailed")).toBeInTheDocument();
expect(
screen.getByText(
"CLIProxyAPI 管理 API 调用失败:CLIProxyAPI 管理 API 返回异常状态码 400:logging to file disabled"
)
).toBeInTheDocument();
});

it("空日志展示提示", () => {
useCliproxyInstanceLogsMock.mockReturnValue({
data: logsResult([]),
Expand Down
Loading