import React, { useEffect } from 'react' import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent, } from 'src/services/analytics/index.js' import type { TeleportRemoteResponse } from 'src/utils/conversationRecovery.js' import type { CodeSession } from 'src/utils/teleport/api.js' import { type TeleportSource, useTeleportResume, } from '../hooks/useTeleportResume.js' import { Box, Text } from '@anthropic/ink' import { useKeybinding } from '../keybindings/useKeybinding.js' import { ResumeTask } from './ResumeTask.js' import { Spinner } from './Spinner.js' interface TeleportResumeWrapperProps { onComplete: (result: TeleportRemoteResponse) => void onCancel: () => void onError?: (error: string, formattedMessage?: string) => void isEmbedded?: boolean source: TeleportSource } /** * Wrapper component that manages the full teleport resume flow, * including session selection, loading state, and error handling */ export function TeleportResumeWrapper({ onComplete, onCancel, onError, isEmbedded = false, source, }: TeleportResumeWrapperProps): React.ReactNode { const { resumeSession, isResuming, error, selectedSession } = useTeleportResume(source) // Log when teleport flow starts (for funnel tracking) useEffect(() => { logEvent('tengu_teleport_started', { source: source as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, }) }, [source]) const handleSelect = async (session: CodeSession) => { const result = await resumeSession(session) if (result) { onComplete(result) } else if (error) { // If there's an error handler provided, use it if (onError) { onError(error.message, error.formattedMessage) } // Otherwise the error will be displayed in the UI } } const handleCancel = () => { logEvent('tengu_teleport_cancelled', {}) onCancel() } // Allow Esc to dismiss the error state useKeybinding('app:interrupt', handleCancel, { context: 'Global', isActive: !!error && !onError, }) // Show loading spinner when resuming if (isResuming && selectedSession) { return ( Resuming session… Loading "{selectedSession.title}"… ) } // Show error if there was a problem resuming if (error && !onError) { return ( Failed to resume session {error.message} Press Esc to cancel ) } return ( ) }