import { forwardRef, useEffect, useRef, useState } from "react"; import { Bot, Sparkles, FileText, Wand2, SlidersHorizontal, ListChecks, MessageSquareText, } from "lucide-react"; import { Dialog, DialogContent } from "@/components/ui/dialog"; import { Terminal, AnimatedStep } from "@/components/ui/terminal"; import { TypingAnimation } from "@/components/ui/typing-animation"; import { AnimatedBeam } from "@/components/ui/animated-beam"; import { cn } from "@/lib/utils"; const PROMPT_CREATE_STEPS = [ "Interpretando instruções e contexto...", "Definindo objetivo, público e tom...", "Organizando estrutura do prompt (seções e regras)...", "Especificando formato de saída e restrições...", "Adicionando critérios de qualidade e validações...", "Incluindo exemplos e casos de borda...", "Revisando clareza e consistência...", "Finalizando prompt...", ] as const; const PROMPT_REFINE_STEPS = [ "Lendo o prompt atual...", "Identificando ambiguidades e pontos fracos...", "Removendo redundâncias e ruído...", "Aprimorando instruções e critérios de sucesso...", "Ajustando tom, voz e consistência...", "Fortalecendo formato de saída e validações...", "Adicionando exemplos e casos de borda...", "Consolidando melhorias e finalizando...", ] as const; const STEP_INTERVAL_MS = 1500; export type PromptGeneratingMode = "create" | "refine"; export interface PromptGeneratingScreenProps { mode: PromptGeneratingMode; progress?: number; message?: string; } function visibleLineCount(progress: number, stepCount: number): number { if (progress <= 0) return 1; const phase = (progress / 100) * stepCount; const stepInCycle = Math.floor(phase) % stepCount; return Math.min(stepInCycle + 1, stepCount); } const BeamCircle = forwardRef< HTMLDivElement, { className?: string; children?: React.ReactNode } >(({ className, children }, ref) => (
{children}
)); BeamCircle.displayName = "BeamCircle"; export function PromptGeneratingScreen({ mode, progress, message = "Assim que finalizar, o modal será fechado automaticamente.", }: PromptGeneratingScreenProps) { const steps = mode === "refine" ? PROMPT_REFINE_STEPS : PROMPT_CREATE_STEPS; const stepCount = steps.length; const containerRef = useRef(null); const sparklesRef = useRef(null); const fileRef = useRef(null); const slidersRef = useRef(null); const centerRef = useRef(null); const wandRef = useRef(null); const checklistRef = useRef(null); const chatRef = useRef(null); const [loopStep, setLoopStep] = useState(0); useEffect(() => { if (progress !== undefined) return; const id = setInterval(() => { setLoopStep((s) => (s + 1) % stepCount); }, STEP_INTERVAL_MS); return () => clearInterval(id); }, [progress, stepCount]); const visibleCount = progress !== undefined ? visibleLineCount(progress, stepCount) : loopStep + 1; return (
codex prompt — {mode === "refine" ? "melhorando" : "gerando"}
{`> codex prompt --${mode === "refine" ? "refine" : "create"}`} {steps.slice(0, visibleCount).map((text, i) => (
{i < visibleCount - 1 ? ( ✔ {text} ) : ( {`✔ ${text}`} )}
))}
{message && (

{message}

)}
); }