import React, { useState, useEffect } from 'react'; import { Key } from 'lucide-react'; /** * ApiKeySelector 컴포넌트의 props 정의 * @interface ApiKeySelectorProps * @property {(key?: string) => void} onKeySelected - API 키가 성공적으로 선택되거나 입력되었을 때 호출될 콜백 함수. (선택된 키를 인자로 받을 수 있음) * @property {string | null} [initialError] - 초기 에러 메시지 (선택 사항) */ interface ApiKeySelectorProps { onKeySelected: (key?: string) => void; initialError?: string | null; } /** * API 키 선택 및 입력 컴포넌트 * Gemini 및 Veo 모델 사용을 위해 Google Cloud Project의 API 키를 설정하도록 안내하고, * AI Studio 환경 또는 수동 입력 방식을 제공합니다. */ const ApiKeySelector: React.FC = ({ onKeySelected, initialError }) => { const [loading, setLoading] = useState(false); // 로딩 상태 관리 const [error, setError] = useState(initialError || null); // 에러 메시지 관리 const [manualKey, setManualKey] = useState(''); // 수동으로 입력된 API 키 const [isAiStudio, setIsAiStudio] = useState(false); // 현재 환경이 Google AI Studio인지 여부 /** * 환경 체크 및 초기 API 키 확인 * 컴포넌트 마운트 시 Google AI Studio 환경인지 확인하고, 이미 API 키가 선택되어 있는지 검사합니다. */ const checkKey = async () => { try { // window 객체에 aistudio 속성이 있는지 확인하여 AI Studio 환경을 감지합니다. if ((window as any).aistudio) { setIsAiStudio(true); // AI Studio에서 이미 API 키가 선택되어 있는지 확인합니다. const hasKey = await (window as any).aistudio.hasSelectedApiKey(); if (hasKey && !initialError) { // 키가 이미 선택되어 있고 초기 에러가 없으면 onKeySelected 콜백을 호출하여 앱 시작 onKeySelected(); } } } catch (e) { console.error("API 키 확인 중 오류 발생:", e); // 오류가 발생해도 isAiStudio 상태는 유지 } }; // 컴포넌트가 처음 렌더링될 때 한 번만 checkKey 함수 실행 useEffect(() => { checkKey(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** * AI Studio에서 API 키 선택 핸들러 * AI Studio의 `openSelectKey()` 함수를 호출하여 API 키 선택 UI를 띄웁니다. */ const handleSelectKey = async () => { setLoading(true); // 로딩 상태 시작 setError(null); // 기존 에러 메시지 초기화 try { if((window as any).aistudio) { await (window as any).aistudio.openSelectKey(); // AI Studio 키 선택 대화 상자 열기 onKeySelected(); // 키 선택 성공 시 콜백 호출 } } catch (e: any) { console.error("API 키 선택 중 오류 발생:", e); // 특정 에러 메시지에 따라 사용자에게 더 명확한 안내 제공 if (e.message && e.message.includes("Requested entity was not found")) { setError("유효하지 않은 프로젝트/키가 선택되었습니다. 다시 시도해주세요."); } else { setError("API 키 선택에 실패했습니다. 다시 시도해주세요."); } } finally { setLoading(false); // 로딩 상태 종료 } }; /** * 수동 API 키 입력 폼 제출 핸들러 * 사용자가 직접 입력한 API 키를 검증하고 콜백 함수를 호출합니다. */ const handleManualSubmit = (e: React.FormEvent) => { e.preventDefault(); // 폼 기본 제출 동작 방지 if(!manualKey.trim()) { setError("유효한 API 키를 입력해주세요."); // 빈 값일 경우 에러 메시지 return; } onKeySelected(manualKey.trim()); // 유효한 키가 입력되면 콜백 호출 }; return (

API 키 필요

Veo 및 Gemini로 고품질 뮤직 비디오를 생성하려면, 결제 가능한 Google Cloud 프로젝트의 API 키를 선택해주세요.

{error && (
{error}
)} {isAiStudio ? ( // AI Studio 환경일 경우 API 키 선택 버튼 제공 ) : ( // 일반 브라우저 환경일 경우 수동 API 키 입력 폼 제공
setManualKey(e.target.value)} placeholder="Gemini API 키 입력" className="w-full p-3 rounded-xl bg-white/10 border border-white/20 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-purple-500" />
)}
결제 문서 보기
); }; export default ApiKeySelector;