diff --git a/frontend/src/Modal/index.tsx b/frontend/src/Modal/index.tsx new file mode 100644 index 00000000..bed32181 --- /dev/null +++ b/frontend/src/Modal/index.tsx @@ -0,0 +1,47 @@ +import * as React from 'react'; + +interface ModalProps { + handleSubmit: () => void; + isCancellable: boolean; + handleCancel?: () => void; + render: () => JSX.Element; + modalState: string; + isError: boolean; + errorMessage?: string; +} +const Modal = (props: ModalProps) => { + return ( +
+ {props.render()} +
+
+ + {props.isCancellable && ( + + )} +
+ {props.isError && ( +

+ {props.errorMessage} +

+ )} +
+
+ ); +}; + +export default Modal; diff --git a/frontend/src/preferences/APIKeyModal.tsx b/frontend/src/preferences/APIKeyModal.tsx index d068aa42..e8f9f224 100644 --- a/frontend/src/preferences/APIKeyModal.tsx +++ b/frontend/src/preferences/APIKeyModal.tsx @@ -3,6 +3,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { ActiveState } from '../models/misc'; import { selectApiKey, setApiKey } from './preferenceSlice'; import { useOutsideAlerter } from './../hooks'; +import Modal from '../Modal'; export default function APIKeyModal({ modalState, @@ -49,53 +50,35 @@ export default function APIKeyModal({ } return ( -
-
-

OpenAI API Key

-

- 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. -

- setKey(e.target.value)} - /> -
-
- - {isCancellable && ( - - )} -
- {isError && ( -

- Please enter a valid API key + { + return ( +

+

OpenAI API Key

+

+ 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.

- )} -
-
-
+ setKey(e.target.value)} + /> + + ); + }} + /> ); } diff --git a/frontend/src/preferences/SelectDocsModal.tsx b/frontend/src/preferences/SelectDocsModal.tsx index c4764878..c514ab86 100644 --- a/frontend/src/preferences/SelectDocsModal.tsx +++ b/frontend/src/preferences/SelectDocsModal.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { ActiveState } from '../models/misc'; +import Modal from '../Modal'; import { setSelectedDocs, setSourceDocs, @@ -50,85 +51,67 @@ export default function APIKeyModal({ requestDocs(); }, []); - return ( -
-
-

Select Source Documentation

-

- Please select the library of documentation that you would like to use - with our app. -

-
-
setIsDocsListOpen(!isDocsListOpen)} - > - {!localSelectedDocs ? ( -

Select

- ) : ( -

- {localSelectedDocs.name} {localSelectedDocs.version} -

- )} -
- {isDocsListOpen && ( -
- {docs ? ( - docs.map((doc, index) => { - if (doc.model) { - return ( -
{ - setLocalSelectedDocs(doc); - setIsDocsListOpen(false); - }} - className="h-10 w-full cursor-pointer border-x-2 border-b-2 hover:bg-gray-100" - > -

- {doc.name} {doc.version} -

-
- ); - } - }) - ) : ( -
-

No default documentation.

+ { + return ( +
+

Select Source Documentation

+

+ Please select the library of documentation that you would like to + use with our app. +

+
+
setIsDocsListOpen(!isDocsListOpen)} + > + {!localSelectedDocs ? ( +

Select

+ ) : ( +

+ {localSelectedDocs.name} {localSelectedDocs.version} +

+ )} +
+ {isDocsListOpen && ( +
+ {docs ? ( + docs.map((doc, index) => { + if (doc.model) { + return ( +
{ + setLocalSelectedDocs(doc); + setIsDocsListOpen(false); + }} + className="h-10 w-full cursor-pointer border-x-2 border-b-2 hover:bg-gray-100" + > +

+ {doc.name} {doc.version} +

+
+ ); + } + }) + ) : ( +
+

No default documentation.

+
+ )}
)}
- )} -
-
- {isCancellable && ( - - )} - - {isError && ( -

- Please select source documentation. -

- )} -
-
-
+ + ); + }} + /> ); }