Spaces:
Configuration error
Configuration error
'use client'; | |
import Card from '@/components/card/Card'; | |
import { | |
Accordion, | |
AccordionItem, | |
AccordionButton, | |
AccordionPanel, | |
AccordionIcon, | |
Box, | |
Button, | |
Flex, | |
Icon, | |
Input, | |
Link, | |
ListItem, | |
UnorderedList, | |
Modal, | |
ModalBody, | |
ModalCloseButton, | |
ModalContent, | |
ModalHeader, | |
ModalOverlay, | |
Text, | |
useColorModeValue, | |
useDisclosure, | |
useToast, | |
} from '@chakra-ui/react'; | |
import { useState } from 'react'; | |
import { MdLock } from 'react-icons/md'; | |
function APIModal(props: { setApiKey: any; sidebar?: boolean }) { | |
const { setApiKey, sidebar } = props; | |
const { isOpen, onOpen, onClose } = useDisclosure(); | |
const [inputCode, setInputCode] = useState<string>(''); | |
const textColor = useColorModeValue('navy.700', 'white'); | |
const grayColor = useColorModeValue('gray.500', 'gray.500'); | |
const inputBorder = useColorModeValue('gray.200', 'whiteAlpha.200'); | |
const inputColor = useColorModeValue('navy.700', 'white'); | |
const link = useColorModeValue('brand.500', 'white'); | |
const navbarIcon = useColorModeValue('gray.500', 'white'); | |
const toast = useToast(); | |
const handleChange = (Event: any) => { | |
setInputCode(Event.target.value); | |
}; | |
const handleApiKeyChange = (value: string) => { | |
setApiKey(value); | |
localStorage.setItem('apiKey', value); | |
}; | |
return ( | |
<> | |
{sidebar ? ( | |
<Button | |
onClick={onOpen} | |
display="flex" | |
variant="api" | |
fontSize={'sm'} | |
fontWeight="600" | |
borderRadius={'45px'} | |
mt="8px" | |
minH="40px" | |
> | |
Set API Key | |
</Button> | |
) : ( | |
<Button | |
onClick={onOpen} | |
minW="max-content !important" | |
p="0px" | |
me="10px" | |
_hover={{ bg: 'none' }} | |
_focus={{ bg: 'none' }} | |
_selected={{ bg: 'none' }} | |
bg="none !important" | |
> | |
<Icon w="18px" h="18px" as={MdLock} color={navbarIcon} /> | |
</Button> | |
)} | |
<Modal blockScrollOnMount={false} isOpen={isOpen} onClose={onClose}> | |
<ModalOverlay /> | |
<ModalContent bg="none" boxShadow="none"> | |
<Card textAlign={'center'}> | |
<ModalHeader | |
fontSize="22px" | |
fontWeight={'700'} | |
mx="auto" | |
textAlign={'center'} | |
color={textColor} | |
> | |
Enter your OpenAI API Key | |
</ModalHeader> | |
<ModalCloseButton _focus={{ boxShadow: 'none' }} /> | |
<ModalBody p="0px"> | |
<Text | |
color={grayColor} | |
fontWeight="500" | |
fontSize="md" | |
lineHeight="28px" | |
mb="22px" | |
> | |
You need an OpenAI API Key to use Horizon AI Template's | |
features. Your API Key is stored locally on your browser and | |
never sent anywhere else. | |
</Text> | |
<Flex mb="20px"> | |
<Input | |
h="100%" | |
border="1px solid" | |
borderColor={inputBorder} | |
borderRadius="45px" | |
p="15px 20px" | |
me="10px" | |
fontSize="sm" | |
fontWeight="500" | |
_focus={{ borderColor: 'none' }} | |
_placeholder={{ color: 'gray.500' }} | |
color={inputColor} | |
placeholder="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | |
onChange={handleChange} | |
value={inputCode} | |
/> | |
<Button | |
variant="chakraLinear" | |
py="20px" | |
px="16px" | |
fontSize="sm" | |
borderRadius="45px" | |
ms="auto" | |
mb={{ base: '20px', md: '0px' }} | |
w={{ base: '300px', md: '180px' }} | |
h="54px" | |
onClick={() => { | |
inputCode?.includes('sk-') | |
? handleApiKeyChange(inputCode) | |
: null; | |
if (inputCode) | |
toast({ | |
title: inputCode?.includes('sk-') | |
? `Success! You have successfully added your API key!` | |
: !inputCode?.includes('sk-') | |
? `Invalid API key. Please make sure your API key is still working properly.` | |
: 'Please add your API key!', | |
position: 'top', | |
status: inputCode?.includes('sk-') | |
? 'success' | |
: !inputCode?.includes('sk-') | |
? `error` | |
: !inputCode | |
? 'warning' | |
: 'error', | |
isClosable: true, | |
}); | |
}} | |
> | |
Save API Key | |
</Button> | |
</Flex> | |
<Link | |
color={link} | |
fontSize="sm" | |
href="https://platform.openai.com/account/api-keys" | |
textDecoration="underline !important" | |
fontWeight="600" | |
> | |
Get your API key from Open AI Dashboard | |
</Link> | |
<Accordion allowToggle w="100%" my="16px"> | |
<AccordionItem border="none"> | |
<AccordionButton | |
borderBottom="0px solid" | |
maxW="max-content" | |
mx="auto" | |
_hover={{ border: '0px solid', bg: 'none' }} | |
_focus={{ border: '0px solid', bg: 'none' }} | |
> | |
<Box flex="1" textAlign="left"> | |
<Text | |
color={textColor} | |
fontWeight="700" | |
fontSize={{ sm: 'md', lg: 'md' }} | |
> | |
Your API Key is not working? | |
</Text> | |
</Box> | |
<AccordionIcon color={textColor} /> | |
</AccordionButton> | |
<AccordionPanel p="18px 0px 10px 0px"> | |
<UnorderedList p="5px"> | |
<ListItem | |
mb="26px" | |
color={grayColor} | |
fontSize=",d" | |
fontWeight="500" | |
> | |
Make sure you have an{' '} | |
<Link | |
textDecoration="underline" | |
fontSize=",d" | |
href="https://platform.openai.com/account/" | |
fontWeight="500" | |
color={grayColor} | |
> | |
OpenAI account | |
</Link>{' '} | |
and a valid API key to use ChatGPT. We don't sell API | |
keys. | |
</ListItem> | |
<ListItem | |
color={grayColor} | |
fontSize="md" | |
lineHeight="28px" | |
fontWeight="500" | |
> | |
Make sure you have your billing info added in{' '} | |
<Link | |
textDecoration="underline" | |
fontSize="md" | |
lineHeight="28px" | |
href="https://platform.openai.com/account/billing/overview" | |
fontWeight="500" | |
color={grayColor} | |
> | |
OpenAI Billing | |
</Link>{' '} | |
page. Without billing info, your API key will not work. | |
</ListItem> | |
</UnorderedList> | |
</AccordionPanel> | |
</AccordionItem> | |
</Accordion> | |
<Text | |
color={grayColor} | |
fontWeight="500" | |
fontSize="sm" | |
mb="42px" | |
mx="30px" | |
> | |
*The app will connect to OpenAI API server to check if your API | |
Key is working properly. | |
</Text> | |
</ModalBody> | |
</Card> | |
</ModalContent> | |
</Modal> | |
</> | |
); | |
} | |
export default APIModal; | |