All files / client/src/lib tutor-visual-state.ts

100% Statements 15/15
100% Branches 17/17
100% Functions 1/1
100% Lines 15/15

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",
      };
  }
}