import React, { useState } from 'react'; import { Key, Lock, Terminal, AlertCircle, ArrowRight, Save, RefreshCw } from 'lucide-react'; interface AuthScreenProps { onAuthenticate: (apiKey: string, remember?: boolean) => void; rememberCredentials: boolean; onRememberChange: (remember: boolean) => void; } export const AuthScreen: React.FC = ({ onAuthenticate, rememberCredentials, onRememberChange }) => { const [apiKey, setApiKey] = useState(''); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); // Check if there are saved credentials to clear (domain-scoped or old format) const hasSavedCredentials = (() => { for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key?.startsWith('ably.web-cli.signedConfig.') || key?.startsWith('ably.web-cli.apiKey')) { return true; } } return false; })(); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setIsLoading(true); try { if (!apiKey.trim()) { setError('API Key is required to connect to Ably'); return; } // Basic validation for API key format if (!apiKey.includes(':')) { setError('API Key should be in the format: app_name.key_name:key_secret'); return; } await onAuthenticate(apiKey.trim(), rememberCredentials); } catch (error) { console.error('[AuthScreen] Authentication failed:', error); setError(error instanceof Error ? error.message : 'Authentication failed'); } finally { setIsLoading(false); } }; const handleClearSavedCredentials = () => { // Clear all domain-scoped signed config keys const keysToRemove: string[] = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key?.startsWith('ably.web-cli.signedConfig.') || key?.startsWith('ably.web-cli.signature.') || key?.startsWith('ably.web-cli.rememberCredentials.') || key?.startsWith('ably.web-cli.apiKey') || key?.startsWith('ably.web-cli.accessToken')) { keysToRemove.push(key); } } // Remove all identified keys keysToRemove.forEach(key => localStorage.removeItem(key)); setError(''); // Force a refresh to show the change window.location.reload(); }; return (

Ably Web CLI Terminal

Enter your credentials to start a terminal session

{ setApiKey(e.target.value); setError(''); // Clear error when user types }} placeholder="your_app.key_name:key_secret" className="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-md text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all" autoFocus />

You can find your API key in the Ably dashboard under your app settings

{error && (
{error}
)}
onRememberChange(e.target.checked)} className="w-4 h-4 text-blue-600 bg-gray-800 border-gray-700 rounded focus:ring-blue-500" />

Don't have an Ably account?{' '} Sign up for free

{hasSavedCredentials && (

)}
); };