mirror of
https://github.com/prdlk/cv.git
synced 2026-08-02 17:31:41 +00:00
init(app): Setup client package for web api specific logic
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
import { useCallback, useState } from "react";
|
||||
import type { ChatMessage, JobExtract, ResumePlan } from "../shared/types";
|
||||
import { Home } from "./screens/Home";
|
||||
import { PdfScreen } from "./screens/Pdf";
|
||||
import { Workspace } from "./screens/Workspace";
|
||||
|
||||
export interface GeneratedResume {
|
||||
plan: ResumePlan;
|
||||
source: "ai" | "fallback";
|
||||
note?: string;
|
||||
latex: string;
|
||||
pdfUrl: string;
|
||||
}
|
||||
|
||||
type Stage =
|
||||
| { name: "home" }
|
||||
| { name: "workspace"; jd: JobExtract }
|
||||
| { name: "pdf"; jd: JobExtract; result: GeneratedResume };
|
||||
|
||||
export function App() {
|
||||
const [stage, setStage] = useState<Stage>({ name: "home" });
|
||||
const [chat, setChat] = useState<ChatMessage[]>([]);
|
||||
|
||||
const openWorkspace = useCallback((jd: JobExtract) => {
|
||||
setChat([]);
|
||||
setStage({ name: "workspace", jd });
|
||||
}, []);
|
||||
|
||||
if (stage.name === "home") return <Home onExtracted={openWorkspace} />;
|
||||
|
||||
if (stage.name === "workspace") {
|
||||
return (
|
||||
<Workspace
|
||||
jd={stage.jd}
|
||||
messages={chat}
|
||||
onMessagesChange={setChat}
|
||||
onBack={() => setStage({ name: "home" })}
|
||||
onGenerated={(result) => setStage({ name: "pdf", jd: stage.jd, result })}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<PdfScreen
|
||||
result={stage.result}
|
||||
onBack={() => setStage({ name: "workspace", jd: stage.jd })}
|
||||
onRecompiled={(result) => setStage({ name: "pdf", jd: stage.jd, result })}
|
||||
/>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user