import React, { useEffect, useRef } from 'react'; import { BLACK_CIRCLE, BULLET_OPERATOR } from '../constants/figures.js'; import { Box, Text } from '@anthropic/ink'; import type { SkillUpdate } from '../utils/hooks/skillImprovement.js'; import { normalizeFullWidthDigits } from '../utils/stringUtils.js'; import { isValidResponseInput } from './FeedbackSurvey/FeedbackSurveyView.js'; import type { FeedbackSurveyResponse } from './FeedbackSurvey/utils.js'; type Props = { isOpen: boolean; skillName: string; updates: SkillUpdate[]; handleSelect: (selected: FeedbackSurveyResponse) => void; inputValue: string; setInputValue: (value: string) => void; }; export function SkillImprovementSurvey({ isOpen, skillName, updates, handleSelect, inputValue, setInputValue, }: Props): React.ReactNode { if (!isOpen) { return null; } // Hide the survey if the user is typing anything other than a survey response if (inputValue && !isValidResponseInput(inputValue)) { return null; } return ( ); } type ViewProps = { skillName: string; updates: SkillUpdate[]; onSelect: (option: FeedbackSurveyResponse) => void; inputValue: string; setInputValue: (value: string) => void; }; // Only 1 (apply) and 0 (dismiss) are valid for this survey const VALID_INPUTS = ['0', '1'] as const; function isValidInput(input: string): boolean { return (VALID_INPUTS as readonly string[]).includes(input); } function SkillImprovementSurveyView({ skillName, updates, onSelect, inputValue, setInputValue, }: ViewProps): React.ReactNode { const initialInputValue = useRef(inputValue); useEffect(() => { if (inputValue !== initialInputValue.current) { const lastChar = normalizeFullWidthDigits(inputValue.slice(-1)); if (isValidInput(lastChar)) { setInputValue(inputValue.slice(0, -1)); // Map: 1 = "good" (apply), 0 = "dismissed" onSelect(lastChar === '1' ? 'good' : 'dismissed'); } } }, [inputValue, onSelect, setInputValue]); return ( {BLACK_CIRCLE} Skill improvement suggested for "{skillName}" {updates.map((u, i) => ( {BULLET_OPERATOR} {u.change} ))} 1: Apply 0: Dismiss ); }