| 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>(apiKey || '') |
| const message = useBackendState.use.message() |
|
|
| |
| useEffect(() => { |
| const timer = setTimeout(() => setTempApiKey(apiKey || ''), 0) |
| return () => clearTimeout(timer) |
| }, [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 |
|
|