← back to Dear Bubbe Nextjs
components/InputModeSelector.tsx
73 lines
'use client'
import { useState, useEffect } from 'react'
export type InputMode = 'talk' | 'text' | 'both'
interface InputModeSelectorProps {
mode: InputMode
onModeChange: (mode: InputMode) => void
className?: string
}
export default function InputModeSelector({ mode, onModeChange, className = '' }: InputModeSelectorProps) {
const [isChanging, setIsChanging] = useState(false)
const handleModeChange = (newMode: InputMode) => {
if (newMode === mode) return
setIsChanging(true)
onModeChange(newMode)
// Reset animation
setTimeout(() => setIsChanging(false), 300)
}
return (
<div className={`input-mode-selector ${className}`}>
<div className="mode-selector-container">
<button
onClick={() => handleModeChange('talk')}
className={`mode-button ${mode === 'talk' ? 'active' : ''} ${isChanging ? 'changing' : ''}`}
aria-label="Talk only mode"
title="Voice only - no text input"
>
<span className="mode-icon">🎤</span>
<span className="mode-label">Talk</span>
</button>
<button
onClick={() => handleModeChange('text')}
className={`mode-button ${mode === 'text' ? 'active' : ''} ${isChanging ? 'changing' : ''}`}
aria-label="Text only mode"
title="Text only - no voice input"
>
<span className="mode-icon">⌨️</span>
<span className="mode-label">Text</span>
</button>
<button
onClick={() => handleModeChange('both')}
className={`mode-button ${mode === 'both' ? 'active' : ''} ${isChanging ? 'changing' : ''}`}
aria-label="Talk and Text mode"
title="Both voice and text input"
>
<span className="mode-icon">🎤⌨️</span>
<span className="mode-label">Both</span>
</button>
</div>
<div className="mode-description">
{mode === 'talk' && (
<p className="mode-desc-text">🎤 Voice Only - Just talk to Bubbe!</p>
)}
{mode === 'text' && (
<p className="mode-desc-text">⌨️ Text Only - Type your messages</p>
)}
{mode === 'both' && (
<p className="mode-desc-text">🎤⌨️ Talk & Text - Choose how to chat</p>
)}
</div>
</div>
)
}