asnannp's picture
deploy: sync backend to Space root (learn-lesson HF cache fix)
65d68f5
Raw History Blame Contribute Delete
9.04 kB
import {
BookOpen,
Home,
LineChart,
MessageSquareText,
UserRound,
} from "lucide-react";
import type { LucideIcon } from "lucide-react";
export type MissionStepId = "lesson" | "notes" | "quiz" | "feedback" | "next";
export type MobileScreenId = "today" | "lesson" | "notes" | "quiz" | "feedback" | "weakAreas" | "next";
export type SourceRef = {
file_name: string;
book?: string;
printed_page?: number;
pdf_page?: number;
};
export type SessionNavItem = {
label: string;
href: string;
icon: LucideIcon;
active?: boolean;
};
export type MissionStep = {
id: MissionStepId;
label: string;
};
export type NoteCardData = {
id: number;
title: string;
body: string;
tag?: string;
tone?: "default" | "warning";
source_refs?: SourceRef[];
};
export type QuizOptionData = {
key: "A" | "B" | "C" | "D";
text: string;
};
export type TuitionQuizData = {
id?: string;
mode?: "choice" | "review";
questionNumber: number;
totalQuestions: number;
question: string;
source?: string;
options: QuizOptionData[];
correctOption: QuizOptionData["key"];
answerOutline?: string;
keywords?: string[];
questionType?: string;
marks?: number;
source_refs?: SourceRef[];
};
export type TuitionFeedbackData = {
why: string;
conceptTested: string;
mistake: string;
toRevise: string;
source?: string;
source_refs?: SourceRef[];
};
export type WeakAreaData = {
label: string;
accuracy?: number;
status: "Weak" | "Average" | "Review";
studentAnswer?: string;
correctAnswer?: string;
source_refs?: SourceRef[];
};
export type FlashcardData = {
front: string;
back: string;
type: string;
status: string;
marks?: number;
source_refs: SourceRef[];
};
export type AnswerCorrectionRuleData = {
id: string;
applies_to: string[];
rule: string;
keyword_map?: Record<string, string[]>;
source_refs: SourceRef[];
};
export type TuitionSessionData = {
student: {
name: string;
initials: string;
streak: string;
};
brand: {
name: string;
tagline: string;
};
classLabel: string;
board?: string;
subject?: string;
chapterLabel: string;
chapterShortTitle: string;
chapterSubtitle: string;
missionLabel: string;
missionGoal: string;
missionId?: string;
chapterId?: string;
missionTitle?: string;
nextMissionTitle?: string;
sessionProgress: number;
estimatedTime: string;
video: {
currentTime: string;
duration: string;
speed: string;
progress: number;
};
lessonTakeaway: string;
lessonBoard: {
title: string;
subtitle: string;
points: string[];
source_refs?: SourceRef[];
};
formulaText: string;
missionSteps: readonly MissionStep[];
notes: NoteCardData[];
quiz: TuitionQuizData;
feedback: TuitionFeedbackData;
checklist: string[];
doubtTeacher: {
question: string;
answer: string;
};
weakAreas: WeakAreaData[];
flashcards: FlashcardData[];
nextStep: {
completedTitle: string;
completedSubtitle: string;
tomorrowPlan: string[];
};
answerCorrectionRules: AnswerCorrectionRuleData[];
source_refs: SourceRef[];
formulas?: unknown[];
derivations?: unknown[];
numericalPatterns?: unknown[];
visualLessonFrames?: unknown[];
};
export const missionSteps = [
{ id: "lesson", label: "Watch Lesson" },
{ id: "notes", label: "Key Notes" },
{ id: "quiz", label: "Quiz" },
{ id: "feedback", label: "Feedback" },
{ id: "next", label: "Next Step" },
] as const satisfies readonly MissionStep[];
export const missionStageOrder = missionSteps.map((step) => step.id) satisfies MissionStepId[];
export const mobileMissionFlow = ["today", "lesson", "notes", "quiz", "feedback", "weakAreas", "next"] as const satisfies readonly MobileScreenId[];
export const noteTabs = ["Key Notes", "Formula Sheet", "Board Answer"] as const;
export const missionNextActions: Record<MissionStepId, string> = {
lesson: "Watch the source-backed lesson",
notes: "Read the 5 key notes",
quiz: "Answer the mission quiz",
feedback: "Review the answer rule",
next: "Save weak areas and continue",
};
export const tuitionSession: TuitionSessionData = {
student: {
name: "Asnan",
initials: "AS",
streak: "",
},
brand: {
name: "DocDoe",
tagline: "Today's Tuition",
},
classLabel: "+2 Physics",
chapterLabel: "Chapter 1: Electric Charges and Fields",
chapterShortTitle: "Chapter 1",
chapterSubtitle: "Electric Charges and Fields",
missionLabel: "Today's Chapter Mission",
missionGoal: "Understand Coulomb's Law, finish one quiz, fix weak points.",
sessionProgress: 65,
estimatedTime: "~45 mins",
video: {
currentTime: "12:18",
duration: "28:40",
speed: "1.0x",
progress: 43,
},
lessonTakeaway:
"Force \u221d q\u2081q\u2082 and Force \u221d 1/r\u00b2. Doubling distance \u2192 force becomes 1/4th.",
lessonBoard: {
title: "Coulomb's Law",
subtitle: "Electric Charges and Fields",
points: [
"Force is directly proportional to the product of charges.",
"Force is inversely proportional to the square of distance.",
"Force acts along the line joining two point charges.",
],
source_refs: [],
},
formulaText: "F = k |q1 q2| / r\u00b2",
missionSteps,
notes: [
{
id: 1,
title: "Law statement",
body: "Force between two point charges is directly proportional to the product of charges.",
tag: "NCERT 1.1",
},
{
id: 2,
title: "Formula",
body: "F = k |q\u2081q\u2082| / r\u00b2, where k = 9 \u00d7 10\u2079 N m\u00b2/C\u00b2.",
tag: "Board formula",
},
{
id: 3,
title: "Meaning of r\u00b2",
body: "When distance doubles, force becomes one-fourth. This is the inverse square relation.",
tag: "PYQ 2024",
},
{
id: 4,
title: "Direction of force",
body: "Force acts along the straight line joining the two point charges.",
tag: "NCERT 1.2",
},
{
id: 5,
title: "Common exam mistake",
body: "Using r instead of r\u00b2 is the #1 error in board exams.",
tag: "Exam alert",
tone: "warning",
},
] satisfies NoteCardData[],
quiz: {
questionNumber: 1,
totalQuestions: 5,
question:
"According to Coulomb's law, what happens to the electrostatic force between two point charges if the distance between them is doubled?",
source: "PYQ 2024",
options: [
{ key: "A", text: "It becomes half" },
{ key: "B", text: "It becomes one-fourth" },
{ key: "C", text: "It becomes four times" },
{ key: "D", text: "It remains the same" },
] satisfies QuizOptionData[],
correctOption: "B" as const,
},
feedback: {
why: "F is proportional to 1/r\u00b2. If r becomes 2r, (2r)\u00b2 = 4r\u00b2, making the force 1/4th.",
conceptTested: "Inverse square dependence of Coulomb's Law",
mistake: "You chose 1/r instead of 1/r\u00b2. This is the most common board exam error.",
toRevise: "Mathematical interpretation of inverse square laws.",
source: "NCERT Ch.1, Ex. 1.1",
},
checklist: [
"Learn today's concept",
"Read the key notes",
"Pass the checkpoints",
"Fix weak areas",
"Save revision",
],
doubtTeacher: {
question: "Why does the force act strictly along the line joining them?",
answer:
"Because electrostatic force is a central force. By symmetry, the only unique direction between two point charges is the straight line connecting them.",
},
weakAreas: [
{ label: "Inverse square law", accuracy: 30, status: "Weak", studentAnswer: "half", correctAnswer: "one-fourth" },
{ label: "Units & dimensions", accuracy: 60, status: "Average" },
{ label: "Direction of force", accuracy: 70, status: "Average" },
] satisfies WeakAreaData[],
flashcards: [],
nextStep: {
completedTitle: "Great job, Asnan!",
completedSubtitle: "You've completed today's mission.",
tomorrowPlan: ["Revise: Inverse square law", "Learn: Gauss's Theorem"],
},
answerCorrectionRules: [],
source_refs: [],
formulas: [],
derivations: [],
numericalPatterns: [],
visualLessonFrames: [],
};
/** Minimal global rail — Progress holds weekly plan, weak areas, revision, practice. */
export const sessionNavItems: SessionNavItem[] = [
{ label: "Today", href: "/tuition", icon: Home, active: true },
{ label: "Learn Anything", href: "/learn-anything", icon: BookOpen },
{ label: "Study Chat", href: "/study-chat", icon: MessageSquareText },
{ label: "Progress", href: "/progress", icon: LineChart },
{ label: "Profile", href: "/settings", icon: UserRound },
];
export const mobileBottomNavItems: SessionNavItem[] = [
{ label: "Today", href: "/tuition", icon: Home, active: true },
{ label: "Learn", href: "/learn-anything", icon: BookOpen },
{ label: "Chat", href: "/study-chat", icon: MessageSquareText },
{ label: "Progress", href: "/progress", icon: LineChart },
{ label: "Profile", href: "/settings", icon: UserRound },
];