-
- {/* Copyright */}
-
- {t.copyright}
- |
- {t.builtBy}
-
-
- {/* Links */}
-
-
-
-
-
-
-
-
- GitHub
-
-
-
- X
-
-
+
+ {t.footerInfo}
diff --git a/src/components/modals/ApiKeyModal.tsx b/src/components/modals/ApiKeyModal.tsx
index f080e13..b9afca1 100644
--- a/src/components/modals/ApiKeyModal.tsx
+++ b/src/components/modals/ApiKeyModal.tsx
@@ -1,6 +1,5 @@
import React, { useState, useEffect } from 'react';
-import { Key, X, ExternalLink, ShieldCheck, Save, Eye, EyeOff, Zap, Copy, Check } from 'lucide-react';
-import wechatQr from '../../assets/wechat.png';
+import { Key, X, ExternalLink, ShieldCheck, Save, Eye, EyeOff, CheckCircle } from 'lucide-react';
import { QuotaInfo } from '../../types';
import { TRANSLATIONS } from '../../i18n/translations';
@@ -16,9 +15,8 @@ export const ApiKeyModal: React.FC
= ({ isOpen, onClose, onSav
const [showKey, setShowKey] = useState(false);
const [verifying, setVerifying] = useState(false);
const [error, setError] = useState('');
- const [copied, setCopied] = useState(false);
- const [showQr, setShowQr] = useState(false);
-
+ const [saved, setSaved] = useState(false);
+ const [hasSavedKey, setHasSavedKey] = useState(false);
// Dictionary
const t = TRANSLATIONS[lang];
@@ -27,18 +25,20 @@ export const ApiKeyModal: React.FC = ({ isOpen, onClose, onSav
if (isOpen) {
const savedKey = localStorage.getItem('gemini_api_key_local');
const savedCode = localStorage.getItem('gemini_access_code');
- if (savedKey) setApiKey(savedKey);
- else if (savedCode) setApiKey(savedCode);
+ if (savedKey) {
+ setApiKey(savedKey);
+ setHasSavedKey(true);
+ } else if (savedCode) {
+ setApiKey(savedCode);
+ setHasSavedKey(true);
+ } else {
+ setHasSavedKey(false);
+ }
setError('');
+ setSaved(false);
}
}, [isOpen]);
- const copyWechat = () => {
- navigator.clipboard.writeText('JaffryD');
- setCopied(true);
- setTimeout(() => setCopied(false), 2000);
- };
-
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
const value = apiKey.trim();
@@ -54,7 +54,9 @@ export const ApiKeyModal: React.FC = ({ isOpen, onClose, onSav
localStorage.setItem('gemini_api_key_local', value);
localStorage.removeItem('gemini_access_code');
onSave(value);
- onClose();
+ setSaved(true);
+ setHasSavedKey(true);
+ setTimeout(() => onClose(), 1200);
} else {
// It's likely an Access Code (Proxy Mode) -> Verify with Server
const res = await fetch('/api/verify-code', {
@@ -68,8 +70,10 @@ export const ApiKeyModal: React.FC = ({ isOpen, onClose, onSav
if (data.valid) {
localStorage.setItem('gemini_access_code', value);
localStorage.removeItem('gemini_api_key_local');
- onSave(value, data.quota); // Pass initial quota info back
- onClose();
+ onSave(value, data.quota);
+ setSaved(true);
+ setHasSavedKey(true);
+ setTimeout(() => onClose(), 1200);
} else {
setError(data.error || t.invalidCode);
}
@@ -131,16 +135,28 @@ export const ApiKeyModal: React.FC = ({ isOpen, onClose, onSav
{error &&