Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Fetches chat history when loading Xpert #64

Merged
merged 9 commits into from
Nov 13, 2024
14 changes: 12 additions & 2 deletions src/data/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,15 @@ async function fetchLearningAssistantEnabled(courseId) {
return data;
}

export default fetchChatResponse;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no need for mixing default and named exports on these type of modules.

export { fetchLearningAssistantEnabled };
async function fetchLearningAssistantMessageHistory(courseId) {
const url = new URL(`${getConfig().CHAT_RESPONSE_URL}/${courseId}/history`);

const { data } = await getAuthenticatedHttpClient().get(url.href);
return data;
}

export {
fetchChatResponse,
fetchLearningAssistantEnabled,
fetchLearningAssistantMessageHistory,
};
30 changes: 29 additions & 1 deletion src/data/thunks.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { sendTrackEvent } from '@edx/frontend-platform/analytics';
import { getAuthenticatedUser } from '@edx/frontend-platform/auth';

import trackChatBotMessageOptimizely from '../utils/optimizelyExperiment';
import fetchChatResponse, { fetchLearningAssistantEnabled } from './api';
import { fetchChatResponse, fetchLearningAssistantMessageHistory, fetchLearningAssistantEnabled } from './api';
import {
setCurrentMessage,
clearCurrentMessage,
Expand Down Expand Up @@ -81,6 +81,34 @@ export function clearMessages() {
};
}

export function getLearningAssistantMessageHistory(courseId) {
return async (dispatch) => {
dispatch(resetApiError());
dispatch(setApiIsLoading(true));

try {
const rawMessageList = await fetchLearningAssistantMessageHistory(courseId);

if (rawMessageList.length) {
const messageList = rawMessageList
.map(({ timestamp, ...msg }) => ({
...msg,
timestamp: new Date(timestamp), // Parse ISO time to Date()
}));

dispatch(setMessageList({ messageList }));

// If it has chat history, then we assume the user already aknowledged.
rijuma marked this conversation as resolved.
Show resolved Hide resolved
dispatch(setDisclosureAcknowledged(true));
}
} catch (e) {
dispatch(setApiError());
}

dispatch(setApiIsLoading(false));
};
}

export function updateCurrentMessage(content) {
return (dispatch) => {
dispatch(setCurrentMessage({ currentMessage: content }));
Expand Down
2 changes: 2 additions & 0 deletions src/hooks/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/* eslint-disable import/prefer-default-export */
export { useMessageHistory } from './message-history';
15 changes: 15 additions & 0 deletions src/hooks/message-history.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/* eslint-disable import/prefer-default-export */
import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { getLearningAssistantMessageHistory } from '../data/thunks';

export const useMessageHistory = (courseId) => {
const dispatch = useDispatch();
const { isEnabled } = useSelector(state => state.learningAssistant);

useEffect(() => {
if (!courseId || !isEnabled) { return; }

dispatch(getLearningAssistantMessageHistory(courseId));
}, [dispatch, isEnabled, courseId]);
};
2 changes: 2 additions & 0 deletions src/widgets/Xpert.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import { updateSidebarIsOpen, getIsEnabled } from '../data/thunks';
import ToggleXpert from '../components/ToggleXpertButton';
import Sidebar from '../components/Sidebar';
import { ExperimentsProvider } from '../experiments';
import { useMessageHistory } from '../hooks';

const Xpert = ({ courseId, contentToolsEnabled, unitId }) => {
const dispatch = useDispatch();
useMessageHistory(courseId);

const {
isEnabled,
Expand Down
Loading