DocDoeAI / src /components /study-chat /constants.ts
asnannp's picture
deploy: sync backend to Space root (learn-lesson HF cache fix)
65d68f5
Raw History Blame Contribute Delete
6.64 kB
import type { ElementType } from "react";
import {
BookOpen,
ClipboardList,
FileQuestion,
FileText,
Folder,
GraduationCap,
Layers3,
Link as LinkIcon,
Mic,
Moon,
Upload,
Video,
} from "lucide-react";
import type { StudyIntent } from "@/lib/study-intents";
import type { UploadMenuAction } from "./types";
export type PrimaryStudyAction = {
label: string;
intent: StudyIntent;
prompt: string;
icon: ElementType;
};
export type UploadMenuItem = {
label: string;
description: string;
icon: ElementType;
action: UploadMenuAction;
enabled: boolean;
};
export const primaryChips: PrimaryStudyAction[] = [
{
label: "Teach chapter",
intent: "teach_topic",
prompt:
"Teach the most important chapter from {context}. Start from basics, then give scoring keywords, examples, common mistakes, and one practice question.",
icon: BookOpen,
},
{
label: "Analyze uploaded PYQ",
intent: "analyze_pyq",
prompt:
"Analyze repeated questions and paper signals from {context}. Base every pattern only on the papers I have uploaded, and if there is not enough evidence yet, say exactly what is missing.",
icon: GraduationCap,
},
{
label: "Make quiz",
intent: "generate_quiz",
prompt:
"Make an exam-focused quiz from {context}. Include answers, traps, and what each question helps me score.",
icon: FileQuestion,
},
{
label: "Flashcards",
intent: "generate_flashcards",
prompt:
"Make high-yield flashcards from {context}. Focus on definitions, formulas, diagrams, and common mistakes.",
icon: Layers3,
},
{
label: "Study video",
intent: "create_video_plan",
prompt:
"Create a 10-minute exam-focused study video plan from {context}. Break it into scenes, narration, on-screen text, and revision keywords.",
icon: Video,
},
{
label: "Last night revision",
intent: "create_revision_plan",
prompt:
"I have one night left. Make a last-night revision plan for {context}. Tell me what to study, skim, skip, and self-test. If the topic is missing, ask me one friendly question first.",
icon: Moon,
},
{
label: "Study plan",
intent: "continue_learning",
prompt:
"Build my study plan for {context}. Rank what scores, what to do first, weak areas, quick wins, and the next best action. If I did not give a topic yet, ask the smallest useful question.",
icon: ClipboardList,
},
];
export const loadingMessages: Partial<Record<StudyIntent, string>> = {
teach_topic: "Retrieving concepts and shaping an exam-focused explanation...",
explain_source: "Searching your source and building a grounded answer...",
generate_notes: "Extracting scoring points, traps, and revision hooks from your material...",
generate_quiz: "Building practice questions with traps and mark-wise explanations...",
generate_flashcards: "Creating active-recall cards with memory hooks...",
generate_exam_answer: "Structuring mark-wise board answers and underline keywords...",
create_revision_plan: "Ranking what to study, skim, and self-test before the exam...",
create_video_plan: "Planning scenes, narration beats, and revision moments...",
render_video: "Preparing a render-ready lesson plan from your material...",
continue_learning: "Building a study path ranked by scoring impact...",
analyze_pyq: "Fetching verified previous-year papers and pattern signals...",
summarize_source: "Summarizing retrieved chunks from your selected source...",
};
/**
* Ordered "thinking" beats per intent — shown one at a time while the answer
* is generating, so the wait reads like real work (StudyFetch's staged
* loader) instead of one frozen spinner line. The last beat lingers until the
* response actually lands. Falls back to loadingMessages for any intent not
* listed here.
*/
export const loadingStages: Partial<Record<StudyIntent, string[]>> = {
teach_topic: ["Reading your topic", "Pulling the core concepts", "Structuring the lesson", "Writing clear examples"],
explain_source: ["Opening your source", "Finding the relevant passages", "Grounding the answer", "Writing it plainly"],
generate_notes: ["Reading the material", "Extracting scoring points", "Marking traps and keywords", "Laying out the notes"],
generate_quiz: ["Reading the topic", "Choosing what to test", "Writing questions and traps", "Adding mark-wise answers"],
generate_flashcards: ["Reading the topic", "Picking the key ideas", "Writing fronts and backs", "Adding memory hooks"],
generate_exam_answer: ["Reading the question", "Planning the mark scheme", "Writing the board answer", "Underlining keywords"],
create_revision_plan: ["Checking time left", "Ranking by scoring impact", "Sequencing study and skim", "Adding self-test checkpoints"],
create_video_plan: ["Reading the topic", "Blocking out scenes", "Writing narration beats", "Placing revision moments"],
render_video: ["Reading your material", "Planning the lesson", "Preparing the render", "Finalizing scenes"],
continue_learning: ["Reading your context", "Ranking by scoring impact", "Choosing the next move", "Writing the path"],
analyze_pyq: ["Fetching verified papers", "Scanning for patterns", "Weighing repeated topics", "Summarizing honest signals"],
summarize_source: ["Opening your source", "Reading the chunks", "Distilling the core", "Writing the summary"],
predict_questions: ["Reading available papers", "Weighing question styles", "Avoiding false certainty", "Writing likely patterns"],
show_formulas: ["Reading the chapter", "Collecting the formulas", "Noting when to use each", "Laying them out"],
simplify_answer: ["Reading what's confusing", "Finding a simpler angle", "Rewriting in plain words"],
};
export const uploadMenuItems: UploadMenuItem[] = [
{ label: "Upload material", description: "Selectable-text PDF or TXT", icon: Upload, action: "material", enabled: true },
{ label: "Question paper", description: "Selectable-text PDF for the PYQ pipeline", icon: FileQuestion, action: "paper", enabled: true },
{ label: "Syllabus", description: "Paste syllabus text", icon: BookOpen, action: "syllabus", enabled: true },
{ label: "Paste link", description: "Save a link source", icon: LinkIcon, action: "link", enabled: true },
{ label: "Add text", description: "Paste syllabus or notes", icon: FileText, action: "text", enabled: true },
{ label: "Record audio", description: "Coming soon", icon: Mic, action: "audio", enabled: false },
{ label: "Import document", description: "Coming soon", icon: Folder, action: "import", enabled: false },
];