File size: 1,959 Bytes
5f40163 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | import { create } from "zustand";
import type { ErrorClassification } from "@openhands/typescript-client";
/**
* "connection" errors auto-clear once connectivity recovers; "conversation"
* errors (e.g. a wrong API key) are sticky and clear only on an explicit user
* action (dismiss, retry, new message).
*/
export type ErrorMessageType = "connection" | "conversation";
interface ErrorMessageState {
errorMessage: string | null;
errorType: ErrorMessageType | null;
/**
* Structured error code from a ConversationErrorEvent/ServerErrorEvent (e.g.
* "ACPAuthRequired"), used to render a code-specific header + recovery action.
* null for errors that carry no code (connection errors, plain strings).
*/
errorCode: string | null;
errorClassification: ErrorClassification | null;
}
interface ErrorMessageActions {
setErrorMessage: (
message: string,
type?: ErrorMessageType,
code?: string | null,
classification?: ErrorClassification | null,
) => void;
removeErrorMessage: () => void;
/** Clears the error only when it is a transient connection error. */
clearConnectionError: () => void;
}
type ErrorMessageStore = ErrorMessageState & ErrorMessageActions;
const initialState: ErrorMessageState = {
errorMessage: null,
errorType: null,
errorCode: null,
errorClassification: null,
};
export const useErrorMessageStore = create<ErrorMessageStore>((set) => ({
...initialState,
setErrorMessage: (
message: string,
type: ErrorMessageType = "conversation",
code: string | null = null,
classification: ErrorClassification | null = null,
) =>
set(() => ({
errorMessage: message,
errorType: type,
errorCode: code,
errorClassification: classification,
})),
removeErrorMessage: () => set(() => ({ ...initialState })),
clearConnectionError: () =>
set((state) =>
state.errorType === "connection" ? { ...initialState } : state,
),
}));
|