| | import { X, Bug } from 'lucide-react'; |
| | import { useState, useEffect } from 'react'; |
| |
|
| | const ErrorModal = ({ |
| | showErrorModal, |
| | closeErrorModal, |
| | customApiKey, |
| | setCustomApiKey, |
| | handleApiKeySubmit, |
| | // Add debug toggle prop with default value |
| | debugMode = false, |
| | setDebugMode = () => {} |
| | }) => { |
| | const [localApiKey, setLocalApiKey] = useState(customApiKey); |
| | |
| | |
| | useEffect(() => { |
| | setLocalApiKey(customApiKey); |
| | }, [customApiKey]); |
| | |
| | const handleSubmit = (e) => { |
| | e.preventDefault(); |
| | handleApiKeySubmit(localApiKey); |
| | }; |
| |
|
| | return ( |
| | <> |
| | {showErrorModal && ( |
| | <div className="fixed inset-0 bg-black/30 flex items-center justify-center z-50 overflow-y-auto modalBackdrop" |
| | onClick={(e) => { |
| | if (e.target.classList.contains('modalBackdrop')) { |
| | closeErrorModal(); |
| | } |
| | }} |
| | onKeyDown={(e) => { |
| | if (e.key === 'Escape') { |
| | closeErrorModal(); |
| | } |
| | }} |
| | > |
| | <dialog |
| | open |
| | className="bg-white p-6 rounded-xl shadow-medium max-w-md w-full mx-4 my-8 relative" |
| | aria-labelledby="error-modal-title" |
| | > |
| | <div className="flex flex-col gap-4"> |
| | <div className="flex items-center justify-between"> |
| | <h2 id="error-modal-title" className="text-xl font-medium text-gray-800">This space is super popular</h2> |
| | <div className="flex items-center gap-2"> |
| | {/* Debug toggle button - only visible in development */} |
| | {process.env.NODE_ENV === 'development' && ( |
| | <div className="relative group"> |
| | <button |
| | type="button" |
| | onClick={() => setDebugMode(!debugMode)} |
| | className={`flex items-center justify-center p-1.5 rounded transition-colors ${ |
| | debugMode |
| | ? 'bg-blue-500 text-white hover:bg-blue-600' |
| | : 'bg-gray-100 text-gray-500 hover:bg-gray-200' |
| | }`} |
| | aria-label={debugMode ? "Debug mode on" : "Debug mode off"} |
| | > |
| | <Bug className="w-4 h-4" /> |
| | <span className="ml-1 text-xs font-medium">{debugMode ? "ON" : "OFF"}</span> |
| | </button> |
| | |
| | {/* Tooltip */} |
| | <div className="absolute left-1/2 bottom-full mb-2 -translate-x-1/2 hidden group-hover:block w-48 p-2 bg-gray-800 text-xs text-white rounded shadow-lg z-10"> |
| | <p className="text-center"> |
| | Debug Mode: {debugMode ? "ON" : "OFF"} |
| | </p> |
| | <p className="mt-1"> |
| | When enabled, this modal will automatically appear on page load for development purposes. |
| | </p> |
| | <div className="w-2 h-2 bg-gray-800 absolute left-1/2 -bottom-1 -ml-1 rotate-45" /> |
| | </div> |
| | </div> |
| | )} |
| | <button |
| | type="button" |
| | onClick={closeErrorModal} |
| | className="text-gray-500 hover:text-gray-700" |
| | aria-label="Close" |
| | > |
| | <X className="w-5 h-5" /> |
| | </button> |
| | </div> |
| | </div> |
| | |
| | <div className="text-gray-600"> |
| | <p className="mb-2"> |
| | Our free API key is currently at capacity. To continue: |
| | </p> |
| | <ol className="list-decimal pl-5 space-y-2 mb-0"> |
| | <li>Get your own API key at <a href="https://ai.dev/app/apikey" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:text-blue-800 underline">ai.dev/app/apikey</a></li> |
| | <li>Enter it below</li> |
| | </ol> |
| | </div> |
| | |
| | <form onSubmit={handleSubmit} className="space-y-3"> |
| | <div> |
| | <label |
| | htmlFor="apiKey" |
| | className="block text-sm font-medium text-gray-700 mb-1" |
| | > |
| | Your Gemini API Key |
| | </label> |
| | <input |
| | id="apiKey" |
| | type="text" |
| | placeholder="Enter your Gemini API key" |
| | value={localApiKey} |
| | onChange={(e) => setLocalApiKey(e.target.value)} |
| | className="w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" |
| | /> |
| | </div> |
| | <div className="flex justify-end gap-3 pt-2"> |
| | <button |
| | type="button" |
| | onClick={closeErrorModal} |
| | className="px-4 py-2 border border-gray-200 text-gray-600 rounded-lg hover:bg-gray-50 hover:border-gray-300 transition-colors text-sm font-medium" |
| | > |
| | Cancel |
| | </button> |
| | <button |
| | type="submit" |
| | disabled={!localApiKey.trim()} |
| | className="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 disabled:opacity-50 transition-colors text-sm font-medium" |
| | > |
| | Save API Key |
| | </button> |
| | </div> |
| | </form> |
| | </div> |
| | </dialog> |
| | </div> |
| | )} |
| | </> |
| | ); |
| | }; |
| |
|
| | export default ErrorModal; |