import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { PERSONA_PROMPT_LOW_CONFIDENCE_COPY } from '../lib/personaPromptBuildCopy' import { PERSONA_PROMPT_BUILD_COMPLETE, PERSONA_PROMPT_BUILD_END, PERSONA_PROMPT_BUILD_ERROR, PERSONA_PROMPT_BUILD_START, type PersonaPromptBuildCompleteDetail, } from '../lib/personaPromptBuildEvents' /** * Global UI for persona prompt build: bottom banner while running, modal when done (any route). */ export function PersonaPromptBuildHost() { const navigate = useNavigate() const [banner, setBanner] = useState(false) const [modal, setModal] = useState(null) const [errorMsg, setErrorMsg] = useState(null) useEffect(() => { const onStart = () => { setErrorMsg(null) setBanner(true) } const onEnd = () => setBanner(false) const onComplete = (e: Event) => { setBanner(false) const d = (e as CustomEvent).detail if (d?.personaId) setModal(d) } const onError = (e: Event) => { setBanner(false) const m = (e as CustomEvent<{ message?: string }>).detail?.message setErrorMsg(m || 'Could not build persona prompt.') } window.addEventListener(PERSONA_PROMPT_BUILD_START, onStart) window.addEventListener(PERSONA_PROMPT_BUILD_END, onEnd) window.addEventListener(PERSONA_PROMPT_BUILD_COMPLETE, onComplete) window.addEventListener(PERSONA_PROMPT_BUILD_ERROR, onError) return () => { window.removeEventListener(PERSONA_PROMPT_BUILD_START, onStart) window.removeEventListener(PERSONA_PROMPT_BUILD_END, onEnd) window.removeEventListener(PERSONA_PROMPT_BUILD_COMPLETE, onComplete) window.removeEventListener(PERSONA_PROMPT_BUILD_ERROR, onError) } }, []) const goExperiment = () => { if (!modal) return const id = modal.personaId setModal(null) navigate(`/experiment?persona=${encodeURIComponent(id)}`) } return ( <> {banner && (
Building, feel free to do other things while you wait
)} {errorMsg && (

Build failed

{errorMsg}

)} {modal && (

Persona prompt ready

Finished building {modal.personaName}. Would you like to see it?

Opens Persona Prompt Testing (Experiment with Personas workshop) with this persona loaded.

{modal.confidence === 'low' && (

{modal.qualityMessage?.trim() || PERSONA_PROMPT_LOW_CONFIDENCE_COPY}

)}
)} ) }