Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 35x 1x 34x 1x 33x 1x 32x 18x 14x 35x 1x 14x 1x 1x 18x | export type TutorQuestionVisualState =
| "idle"
| "generating"
| "waiting"
| "evaluating"
| "error";
export type TutorQuestionVisualAnimation = Exclude<TutorQuestionVisualState, "idle">;
export interface TutorQuestionVisualInput {
readonly tutorReady: boolean;
readonly question: unknown;
readonly isLoading: boolean;
readonly error: string | null;
}
export interface TutorQuestionVisualTreatment {
readonly state: TutorQuestionVisualState;
readonly label: string;
readonly status: "bright" | "error";
readonly animation?: TutorQuestionVisualAnimation;
}
/** Derives the Tutor header treatment from existing state without changing Tutor behavior. */
export function getTutorQuestionVisualState({
tutorReady,
question,
isLoading,
error,
}: TutorQuestionVisualInput): TutorQuestionVisualTreatment {
let state: TutorQuestionVisualState;
if (error) {
state = "error";
} else if (isLoading && question === null) {
state = "generating";
} else if (isLoading) {
state = "evaluating";
} else if (question === null) {
state = "idle";
} else {
state = "waiting";
}
switch (state) {
case "generating":
return {
state,
label: "Tutor is generating a question",
status: "bright",
animation: state,
};
case "waiting":
return {
state,
label: "Tutor is waiting for your answer",
status: "bright",
animation: state,
};
case "evaluating":
return {
state,
label: "Tutor is evaluating your answer",
status: "bright",
animation: state,
};
case "error":
return {
state,
label: "Tutor error",
status: "error",
animation: state,
};
case "idle":
return {
state,
label: tutorReady ? "Tutor ready" : "Tutor not ready",
status: "bright",
};
}
}
|