| import { useState, useCallback, useEffect } from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| import { | |
| AlertDialog, | |
| AlertDialogContent, | |
| AlertDialogDescription, | |
| AlertDialogHeader, | |
| AlertDialogTitle | |
| } from '@/components/ui/AlertDialog' | |
| import Button from '@/components/ui/Button' | |
| import Input from '@/components/ui/Input' | |
| import { useSettingsStore } from '@/stores/settings' | |
| import { useBackendState } from '@/stores/state' | |
| import { InvalidApiKeyError, RequireApiKeError } from '@/api/lightrag' | |
| interface ApiKeyAlertProps { | |
| open: boolean; | |
| onOpenChange: (open: boolean) => void; | |
| } | |
| const ApiKeyAlert = ({ open: opened, onOpenChange: setOpened }: ApiKeyAlertProps) => { | |
| const { t } = useTranslation() | |
| const apiKey = useSettingsStore.use.apiKey() | |
| const [tempApiKey, setTempApiKey] = useState<string>('') | |
| const message = useBackendState.use.message() | |
| useEffect(() => { | |
| setTempApiKey(apiKey || '') | |
| }, [apiKey, opened]) | |
| useEffect(() => { | |
| if (message) { | |
| if (message.includes(InvalidApiKeyError) || message.includes(RequireApiKeError)) { | |
| setOpened(true) | |
| } | |
| } | |
| }, [message, setOpened]) | |
| const setApiKey = useCallback(() => { | |
| useSettingsStore.setState({ apiKey: tempApiKey || null }) | |
| setOpened(false) | |
| }, [tempApiKey, setOpened]) | |
| const handleTempApiKeyChange = useCallback( | |
| (e: React.ChangeEvent<HTMLInputElement>) => { | |
| setTempApiKey(e.target.value) | |
| }, | |
| [setTempApiKey] | |
| ) | |
| return ( | |
| <AlertDialog open={opened} onOpenChange={setOpened}> | |
| <AlertDialogContent> | |
| <AlertDialogHeader> | |
| <AlertDialogTitle>{t('apiKeyAlert.title')}</AlertDialogTitle> | |
| <AlertDialogDescription> | |
| {t('apiKeyAlert.description')} | |
| </AlertDialogDescription> | |
| </AlertDialogHeader> | |
| <div className="flex flex-col gap-4"> | |
| <form className="flex gap-2" onSubmit={(e) => e.preventDefault()}> | |
| <Input | |
| type="password" | |
| value={tempApiKey} | |
| onChange={handleTempApiKeyChange} | |
| placeholder={t('apiKeyAlert.placeholder')} | |
| className="max-h-full w-full min-w-0" | |
| autoComplete="off" | |
| /> | |
| <Button onClick={setApiKey} variant="outline" size="sm"> | |
| {t('apiKeyAlert.save')} | |
| </Button> | |
| </form> | |
| {message && ( | |
| <div className="text-sm text-red-500"> | |
| {message} | |
| </div> | |
| )} | |
| </div> | |
| </AlertDialogContent> | |
| </AlertDialog> | |
| ) | |
| } | |
| export default ApiKeyAlert | |