|
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> |
|
); |
|
}} |
|
/> |
|
); |
|
} |
|
|