| import { useEffect, useState } from 'react'; | |
| import { useDispatch, useSelector } from 'react-redux'; | |
| import { ActiveState } from '../models/misc'; | |
| import Modal from '../Modal'; | |
| import { | |
| setSelectedDocs, | |
| setSourceDocs, | |
| selectSourceDocs, | |
| selectSelectedDocs, | |
| } from './preferenceSlice'; | |
| import { getDocs, Doc } from './preferenceApi'; | |
| export default function APIKeyModal({ | |
| modalState, | |
| setModalState, | |
| isCancellable = true, | |
| }: { | |
| modalState: ActiveState; | |
| setModalState: (val: ActiveState) => void; | |
| isCancellable?: boolean; | |
| }) { | |
| const dispatch = useDispatch(); | |
| const docs = useSelector(selectSourceDocs); | |
| const selectedDoc = useSelector(selectSelectedDocs); | |
| const [localSelectedDocs, setLocalSelectedDocs] = useState<Doc | null>( | |
| selectedDoc, | |
| ); | |
| const [isDocsListOpen, setIsDocsListOpen] = useState(false); | |
| const [isError, setIsError] = useState(false); | |
| function handleSubmit() { | |
| if (!localSelectedDocs) { | |
| setIsError(true); | |
| } else { | |
| dispatch(setSelectedDocs(localSelectedDocs)); | |
| setModalState('INACTIVE'); | |
| setIsError(false); | |
| } | |
| } | |
| function handleCancel() { | |
| setIsError(false); | |
| setModalState('INACTIVE'); | |
| } | |
| useEffect(() => { | |
| async function requestDocs() { | |
| const data = await getDocs(); | |
| dispatch(setSourceDocs(data)); | |
| } | |
| requestDocs(); | |
| }, []); | |
| return ( | |
| <Modal | |
| handleSubmit={handleSubmit} | |
| isCancellable={isCancellable} | |
| handleCancel={handleCancel} | |
| modalState={modalState} | |
| errorMessage="Please select Source Documentation" | |
| isError={isError} | |
| render={() => { | |
| return ( | |
| <article 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">Select Source Documentation</p> | |
| <p className="text-lg leading-5 text-gray-500"> | |
| Please select the library of documentation that you would like to | |
| use with our app. | |
| </p> | |
| <div className="relative"> | |
| <div | |
| className="h-10 w-full cursor-pointer border-b-2" | |
| onClick={() => setIsDocsListOpen(!isDocsListOpen)} | |
| > | |
| {!localSelectedDocs ? ( | |
| <p className="py-3 text-gray-500">Select</p> | |
| ) : ( | |
| <p className="py-3"> | |
| {localSelectedDocs.name} {localSelectedDocs.version} | |
| </p> | |
| )} | |
| </div> | |
| {isDocsListOpen && ( | |
| <div className="absolute top-10 left-0 max-h-52 w-full overflow-y-scroll bg-white"> | |
| {docs ? ( | |
| docs.map((doc, index) => { | |
| if (doc.model) { | |
| return ( | |
| <div | |
| key={index} | |
| onClick={() => { | |
| setLocalSelectedDocs(doc); | |
| setIsDocsListOpen(false); | |
| }} | |
| className="h-10 w-full cursor-pointer border-x-2 border-b-2 hover:bg-gray-100" | |
| > | |
| <p className="ml-5 py-3"> | |
| {doc.name} {doc.version} | |
| </p> | |
| </div> | |
| ); | |
| } | |
| }) | |
| ) : ( | |
| <div className="h-10 w-full cursor-pointer border-x-2 border-b-2 hover:bg-gray-100"> | |
| <p className="ml-5 py-3">No default documentation.</p> | |
| </div> | |
| )} | |
| </div> | |
| )} | |
| </div> | |
| </article> | |
| ); | |
| }} | |
| /> | |
| ); | |
| } | |