* feat: add language selection chore: update tests so we have less error message test: update test * test: update tests * chore: remove duplicate translation * chore: lint for console * chore: remove comments * chore: make sure the affect url frame refresh after the language selection change * chore: add whole_course_translation and language to courseware meta (#1305) * feat: Add feedback widget UI mock Add unit tests Fix snapshot Clean Sequence component logEvent calls Clean unit test Put feedback widget behind whole course translation flag Fix useFeedbackWidget test * chore: add src and dest translation * feat: first iteration of plugin translation chore: update plugin instruction * feat: Connect FeedbackWidget with backend services (#1325) Connect FeedbackWidget with backend services Move feedback widget to unit translation plugin * feat: Add authentication to WCT feedback endpoints (#1329) * chore: add fetch config and move feedback widget for the plugin chore: rewrite and test the api request chore: rebase chore: update translation feedback chore: test chore: add more tests * chore: rebase * chore: update requested change * chore: update package * chore: upgrade frontend-lib-special-exams and frontend-lib-learning-assistant * chore: update tests * chore: remove unneeded package * chore: update example config * chore: add source-map-loader * fix: feedback widget render error after submit feedback (#1335) * fix: feedback widget render error after submit feedback * fix: widget logic --------- Co-authored-by: Rodrigo Martin <rodrigom_94@hotmail.com>
101 lines
2.7 KiB
JavaScript
101 lines
2.7 KiB
JavaScript
import React, { useContext, useEffect } from 'react';
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { AppContext } from '@edx/frontend-platform/react';
|
|
import { IconButton, Icon, ProductTour } from '@openedx/paragon';
|
|
import { Language } from '@openedx/paragon/icons';
|
|
import { useDispatch } from 'react-redux';
|
|
import { stringifyUrl } from 'query-string';
|
|
|
|
import { registerOverrideMethod } from '@src/generic/plugin-store';
|
|
|
|
import TranslationModal from './TranslationModal';
|
|
import useTranslationTour from './useTranslationTour';
|
|
import useSelectLanguage from './useSelectLanguage';
|
|
import FeedbackWidget from '../feedback-widget';
|
|
|
|
const TranslationSelection = ({
|
|
id, courseId, language, availableLanguages, unitId,
|
|
}) => {
|
|
const {
|
|
authenticatedUser: { userId },
|
|
} = useContext(AppContext);
|
|
const dispatch = useDispatch();
|
|
const {
|
|
translationTour, isOpen, open, close,
|
|
} = useTranslationTour();
|
|
|
|
const { selectedLanguage, setSelectedLanguage } = useSelectLanguage({
|
|
courseId,
|
|
language,
|
|
});
|
|
|
|
useEffect(() => {
|
|
dispatch(
|
|
registerOverrideMethod({
|
|
pluginName: id,
|
|
methodName: 'getIFrameUrl',
|
|
method: (iframeUrl) => {
|
|
const finalUrl = stringifyUrl({
|
|
url: iframeUrl,
|
|
query: {
|
|
...(language
|
|
&& selectedLanguage
|
|
&& language !== selectedLanguage && {
|
|
src_lang: language,
|
|
dest_lang: selectedLanguage,
|
|
}),
|
|
},
|
|
});
|
|
return finalUrl;
|
|
},
|
|
}),
|
|
);
|
|
}, [language, selectedLanguage]);
|
|
|
|
return (
|
|
<>
|
|
<ProductTour tours={[translationTour]} />
|
|
<IconButton
|
|
src={Language}
|
|
iconAs={Icon}
|
|
alt="change-language"
|
|
onClick={open}
|
|
variant="primary"
|
|
className="mr-2 mb-2 float-right"
|
|
id="translation-selection-button"
|
|
/>
|
|
<TranslationModal
|
|
isOpen={isOpen}
|
|
close={close}
|
|
courseId={courseId}
|
|
selectedLanguage={selectedLanguage}
|
|
setSelectedLanguage={setSelectedLanguage}
|
|
availableLanguages={availableLanguages}
|
|
id={id}
|
|
/>
|
|
<FeedbackWidget
|
|
courseId={courseId}
|
|
translationLanguage={selectedLanguage}
|
|
unitId={unitId}
|
|
userId={userId}
|
|
/>
|
|
</>
|
|
);
|
|
};
|
|
|
|
TranslationSelection.propTypes = {
|
|
id: PropTypes.string.isRequired,
|
|
courseId: PropTypes.string.isRequired,
|
|
unitId: PropTypes.string.isRequired,
|
|
language: PropTypes.string.isRequired,
|
|
availableLanguages: PropTypes.arrayOf(PropTypes.shape({
|
|
code: PropTypes.string.isRequired,
|
|
label: PropTypes.string.isRequired,
|
|
})).isRequired,
|
|
};
|
|
|
|
TranslationSelection.defaultProps = {};
|
|
|
|
export default TranslationSelection;
|