* 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>
63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
import { useCallback } from 'react';
|
|
|
|
import { useIntl } from '@edx/frontend-platform/i18n';
|
|
import { useToggle } from '@openedx/paragon';
|
|
import { StrictDict, useKeyedState } from '@edx/react-unit-test-utils';
|
|
|
|
import messages from './messages';
|
|
|
|
const hasSeenTranslationTourKey = 'hasSeenTranslationTour';
|
|
|
|
export const stateKeys = StrictDict({
|
|
showTranslationTour: 'showTranslationTour',
|
|
});
|
|
|
|
const useTranslationTour = () => {
|
|
const { formatMessage } = useIntl();
|
|
|
|
const [isTourEnabled, setIsTourEnabled] = useKeyedState(
|
|
stateKeys.showTranslationTour,
|
|
global.localStorage.getItem(hasSeenTranslationTourKey) !== 'true',
|
|
);
|
|
const [isOpen, open, close] = useToggle(false);
|
|
|
|
const endTour = useCallback(() => {
|
|
global.localStorage.setItem(hasSeenTranslationTourKey, 'true');
|
|
setIsTourEnabled(false);
|
|
}, [isTourEnabled, setIsTourEnabled]);
|
|
|
|
const tryIt = useCallback(() => {
|
|
endTour();
|
|
open();
|
|
}, [endTour, open]);
|
|
|
|
const translationTour = isTourEnabled
|
|
? {
|
|
tourId: 'translation',
|
|
enabled: isTourEnabled,
|
|
onDismiss: endTour,
|
|
onEnd: tryIt,
|
|
checkpoints: [
|
|
{
|
|
title: formatMessage(messages.translationTourModalTitle),
|
|
body: formatMessage(messages.translationTourModalBody),
|
|
placement: 'bottom',
|
|
target: '#translation-selection-button',
|
|
showDismissButton: true,
|
|
endButtonText: formatMessage(messages.tryItButtonText),
|
|
dismissButtonText: formatMessage(messages.dismissButtonText),
|
|
},
|
|
],
|
|
}
|
|
: {};
|
|
|
|
return {
|
|
translationTour,
|
|
isOpen,
|
|
open,
|
|
close,
|
|
};
|
|
};
|
|
|
|
export default useTranslationTour;
|