Skip to content

Commit

Permalink
Add markdown to history
Browse files Browse the repository at this point in the history
  • Loading branch information
ruscoder committed Dec 17, 2023
1 parent 31a4ecf commit 0645f45
Show file tree
Hide file tree
Showing 6 changed files with 696 additions and 21 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.2.0",
"react-hook-form": "^7.45.1",
"react-markdown": "^9.0.1",
"react-phone-input-2": "^2.15.1",
"react-router-dom": "^6.14.1",
"react-select": "^5.7.3",
Expand Down
25 changes: 17 additions & 8 deletions src/containers/QuestionnaireBuilder/PromptForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { DeleteOutlined } from '@ant-design/icons';
import { t } from '@lingui/macro';
import { Button, Form, Input, Timeline } from 'antd';
import { FormProps } from 'antd/lib/form';
import Markdown from 'react-markdown';

import s from './QuestionnaireBuilder.module.scss';
import { QuestionnaireFromFileButton } from './QuestionnaireFromPdfButton';
Expand Down Expand Up @@ -38,7 +39,9 @@ export function PromptForm(props: Props) {
const [promptForm] = Form.useForm<PromptFormInterface>();
const disabled = isLoading;

const items = Object.keys(editHistory).map((prompt, index) => {
const hasHistory = Object.keys(editHistory).length > 0;

const items = Object.entries(editHistory).map(([prompt, { inputType }], index) => {
return {
color: isLoading ? 'gray' : prompt === selectedPrompt ? 'green' : 'blue',
children: (
Expand All @@ -49,9 +52,15 @@ export function PromptForm(props: Props) {
className={s.singlePromptContainer}
style={disabled ? { pointerEvents: 'none' } : {}}
>
<pre key={`${prompt} - ${index}`} className={s.prompt}>
{prompt}
</pre>
{inputType === 'markdown' ? (
<Markdown key={`${prompt} - ${index}`} className={s.markdown}>
{prompt}
</Markdown>
) : (
<pre key={`${prompt} - ${index}`} className={s.prompt}>
{prompt}
</pre>
)}
</div>
<div>
<Button
Expand Down Expand Up @@ -83,9 +92,9 @@ export function PromptForm(props: Props) {
<Form.Item
name="prompt"
label={
!items.length
? t`Describe requirements to a questionnaire or upload file`
: t`Describe what to adjust in the questionnsaire`
hasHistory
? t`Describe what to adjust in the questionnaire`
: t`Describe requirements to a questionnaire or upload file`
}
>
<TextArea rows={5} disabled={disabled} />
Expand All @@ -94,7 +103,7 @@ export function PromptForm(props: Props) {
<Form.Item>
<Button htmlType="submit" disabled={disabled}>{t`Submit`}</Button>
</Form.Item>
<QuestionnaireFromFileButton onUploadFile={onUploadFile} disabled={disabled || items.length > 0} />
<QuestionnaireFromFileButton onUploadFile={onUploadFile} disabled={disabled || hasHistory} />
</div>
<div className={s.prompts}>
<Timeline items={items} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,23 @@
.prompt {
padding: 4px 0;
font-size: 14px;
line-height: 16px;
line-height: 20x;
}

.markdown {
padding: 4px 0;
line-height: 20px;
font-size: 14px;

* {
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 14px;
line-height: 20px;
}

p {
margin-bottom: 0;
}
}

.container {
Expand Down Expand Up @@ -43,4 +59,4 @@
.submitButtons {
display: flex;
justify-content: space-between;
}
}
24 changes: 17 additions & 7 deletions src/containers/QuestionnaireBuilder/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,19 @@ function cleanUpQuestionnaire(questionnaire: FHIRQuestionnaire) {

return { ...questionnaire, item: cleanUpItems(questionnaire.item) };
}
interface HistoryItem {
questionnaire: FHIRQuestionnaire;
inputType: 'markdown' | 'text';
input: string;
}

export function useQuestionnaireBuilder() {
const navigate = useNavigate();
const params = useParams();
const [response, setResponse] = useState<RemoteData<FHIRQuestionnaire>>(notAsked);
const [updateResponse, setUpdateResponse] = useState<RemoteData<FHIRQuestionnaire>>(notAsked);
const [error, setError] = useState<string | undefined>();
const [editHistory, setEditHistory] = useState({});
const [editHistory, setEditHistory] = useState<Record<string, HistoryItem>>({});
const [selectedPrompt, setSelectedPrompt] = useState<string | undefined>(undefined);

useEffect(() => {
Expand Down Expand Up @@ -95,7 +100,10 @@ export function useQuestionnaireBuilder() {
if (isSuccess(saveResponse)) {
const newQuestionnaire = saveResponse.data;
setResponse(success(newQuestionnaire));
setEditHistory({ ...{ [prompt]: newQuestionnaire }, ...editHistory });
setEditHistory({
...{ [prompt]: { questionnaire: newQuestionnaire, inputType: 'text', input: prompt } },
...editHistory,
});
setSelectedPrompt(prompt);
}

Expand All @@ -117,20 +125,22 @@ export function useQuestionnaireBuilder() {
setError(undefined);
const saveResponse = await generateQuestionnaireFromFile(file, JSON.stringify(initialQuestionnaire));

setUpdateResponse(saveResponse);
if (isSuccess(saveResponse)) {
const newQuestionnaire = saveResponse.data.questionnaire;
const markdown = saveResponse.data.markdown;
setUpdateResponse(success(saveResponse.data.questionnaire));
setResponse(success(newQuestionnaire));
setEditHistory({ ...{ [markdown]: newQuestionnaire } });
setEditHistory({
[markdown]: { questionnaire: newQuestionnaire, input: markdown, inputType: 'markdown' },
});
setSelectedPrompt(markdown);
}

if (isFailure(saveResponse)) {
setError(
saveResponse.error?.message || 'Something went wrong please try again or reupload the file',
);
setResponse(success(response.data));
setUpdateResponse(saveResponse);
}
}
},
Expand Down Expand Up @@ -191,7 +201,7 @@ export function useQuestionnaireBuilder() {

const onPromptSelect = useCallback(
(prompt: string) => {
setResponse(success(editHistory[prompt]));
setResponse(success(editHistory[prompt]!.questionnaire));
setSelectedPrompt(prompt);
},
[editHistory],
Expand All @@ -204,7 +214,7 @@ export function useQuestionnaireBuilder() {
setEditHistory(currentPrompts);
const activePrompt = Object.keys(currentPrompts)[0]!;
onPromptSelect(activePrompt);
setResponse(success(editHistory[activePrompt]));
setResponse(success(editHistory[activePrompt]!.questionnaire));
},
[editHistory, onPromptSelect],
);
Expand Down
5 changes: 3 additions & 2 deletions src/services/questionnaire-builder.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Questionnaire } from 'fhir/r4b';
import { service } from 'fhir-react';

import config from 'shared/src/config';
Expand All @@ -7,7 +8,7 @@ import { getToken } from './auth';
export async function generateQuestionnaire(prompt: string, questionnaire?: string) {
const appToken = getToken();

return await service<any>({
return await service<Questionnaire>({
baseURL: config.aiQuestionnaireBuilderUrl,
url: `/questionnaire`,
method: 'POST',
Expand All @@ -26,7 +27,7 @@ export async function generateQuestionnaireFromFile(file: File, questionnaire?:
}
const appToken = getToken();

return await service<any>({
return await service<{ questionnaire: Questionnaire; markdown: string }>({
baseURL: config.aiQuestionnaireBuilderUrl,
url: `/questionnaire-from-file`,
method: 'POST',
Expand Down
Loading

0 comments on commit 0645f45

Please sign in to comment.