| import { useRef, useState } from 'react'; |
| import { useDispatch, useSelector } from 'react-redux'; |
| import { ActiveState } from '../models/misc'; |
| import { selectApiKey, setApiKey } from './preferenceSlice'; |
| import { useMediaQuery, useOutsideAlerter } from './../hooks'; |
| import Modal from '../Modal'; |
|
|
| export default function APIKeyModal({ |
| modalState, |
| setModalState, |
| isCancellable = true, |
| }: { |
| modalState: ActiveState; |
| setModalState: (val: ActiveState) => void; |
| isCancellable?: boolean; |
| }) { |
| const dispatch = useDispatch(); |
| const apiKey = useSelector(selectApiKey); |
| const [key, setKey] = useState(apiKey); |
| const [isError, setIsError] = useState(false); |
| const modalRef = useRef(null); |
| const { isMobile } = useMediaQuery(); |
|
|
| useOutsideAlerter( |
| modalRef, |
| () => { |
| if (isMobile && modalState === 'ACTIVE') { |
| setModalState('INACTIVE'); |
| } |
| }, |
| [modalState], |
| ); |
|
|
| function handleSubmit() { |
| if (key.length <= 1) { |
| setIsError(true); |
| } else { |
| dispatch(setApiKey(key)); |
| setModalState('INACTIVE'); |
| setIsError(false); |
| } |
| } |
|
|
| function handleCancel() { |
| setKey(apiKey); |
| setIsError(false); |
| setModalState('INACTIVE'); |
| } |
|
|
| return ( |
| <Modal |
| handleCancel={handleCancel} |
| isError={isError} |
| modalState={modalState} |
| isCancellable={isCancellable} |
| handleSubmit={handleSubmit} |
| render={() => { |
| return ( |
| <article |
| ref={modalRef} |
| className="mx-auto mt-24 flex w-[90vw] max-w-lg flex-col gap-4 rounded-t-lg bg-white p-6 shadow-lg" |
| > |
| <p className="text-xl text-jet">OpenAI API Key</p> |
| <p className="text-md leading-6 text-gray-500"> |
| Before you can start using DocsGPT we need you to provide an API |
| key for llm. Currently, we support only OpenAI but soon many more. |
| You can find it here. |
| </p> |
| <input |
| type="text" |
| className="h-10 w-full border-b-2 border-jet focus:outline-none" |
| value={key} |
| maxLength={100} |
| placeholder="API Key" |
| onChange={(e) => setKey(e.target.value)} |
| /> |
| </article> |
| ); |
| }} |
| /> |
| ); |
| } |
|
|