import React, { useState, useCallback, useRef, useEffect } from 'react'; import { Tabs, Tab, Box, Button, Paper, Typography, } from '@mui/material'; import { Job, Candidate, SkillAssessment } from "types/types"; import { Scrollable } from './Scrollable'; import { useAuth } from 'hooks/AuthContext'; import * as Types from 'types/types'; import { StyledMarkdown } from './StyledMarkdown'; import { Message } from './Message'; import InputIcon from '@mui/icons-material/Input'; import TuneIcon from '@mui/icons-material/Tune'; import ArticleIcon from '@mui/icons-material/Article'; interface ResumeGeneratorProps { job: Job; candidate: Candidate; skills: SkillAssessment[]; onComplete?: (resume: string) => void; } const defaultMessage: Types.ChatMessageStatus = { status: "done", type: "text", sessionId: "", timestamp: new Date(), content: "", activity: 'info' }; const ResumeGenerator: React.FC = (props: ResumeGeneratorProps) => { const { job, candidate, skills, onComplete } = props; const { apiClient, user } = useAuth(); const [resume, setResume] = useState(''); const [prompt, setPrompt] = useState(''); const [systemPrompt, setSystemPrompt] = useState(''); const [generating, setGenerating] = useState(false); const [statusMessage, setStatusMessage] = useState(null); const [tabValue, setTabValue] = useState('resume'); const handleTabChange = (event: React.SyntheticEvent, newValue: string) => { setTabValue(newValue); } // State for editing job description const generateResumeHandlers = { onStatus: (status: Types.ChatMessageStatus) => { setStatusMessage({ ...defaultMessage, content: status.content.toLowerCase() }); }, onStreaming: (chunk: Types.ChatMessageStreaming) =>{ setResume(chunk.content); }, onComplete: () => { setStatusMessage(null); } }; useEffect(() => { if (!job || !candidate || !skills || resume || generating) { return; } const generateResume = async () => { const request : any = await apiClient.generateResume(candidate.id || '', skills, generateResumeHandlers); const result = await request.promise; setSystemPrompt(result.systemPrompt) setPrompt(result.prompt) setResume(result.resume) }; setGenerating(true); generateResume().then(() =>{ setGenerating(false); }); }, [job, candidate, apiClient, resume, skills, generating]); return ( {user?.isAdmin && } label="System" /> } label="Prompt" /> } label="Resume" /> } {statusMessage && } {tabValue === 'system' &&
{systemPrompt}
} {tabValue === 'prompt' &&
{prompt}
} {tabValue === 'resume' && }
) }; export { ResumeGenerator };