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: add support for a technical support URL in the LTI-based provider download instructions #127

Merged
merged 1 commit into from
Dec 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/data/__snapshots__/redux.test.jsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ Object {
"provider_name": "",
"provider_tech_support_email": "",
"provider_tech_support_phone": "",
"provider_tech_support_url": "",
},
"timeIsOver": false,
},
Expand Down Expand Up @@ -129,6 +130,7 @@ Object {
"provider_name": "",
"provider_tech_support_email": "",
"provider_tech_support_phone": "",
"provider_tech_support_url": "",
},
"timeIsOver": false,
},
Expand All @@ -148,6 +150,7 @@ Object {
"provider_name": "",
"provider_tech_support_email": "",
"provider_tech_support_phone": "",
"provider_tech_support_url": "",
}
`;

Expand Down Expand Up @@ -302,6 +305,7 @@ Object {
"provider_name": "",
"provider_tech_support_email": "",
"provider_tech_support_phone": "",
"provider_tech_support_url": "",
},
"timeIsOver": false,
},
Expand Down Expand Up @@ -370,6 +374,7 @@ Object {
"provider_name": "",
"provider_tech_support_email": "",
"provider_tech_support_phone": "",
"provider_tech_support_url": "",
},
"timeIsOver": false,
},
Expand Down
1 change: 1 addition & 0 deletions src/data/slice.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const examSlice = createSlice({
},
provider_tech_support_email: '',
provider_tech_support_phone: '',
provider_tech_support_url: '',
provider_name: '',
learner_notification_from_email: '',
integration_specific_email: '',
Expand Down
42 changes: 41 additions & 1 deletion src/instructions/Instructions.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -723,7 +723,7 @@ describe('SequenceExamWrapper', () => {
expect(screen.getByText('You have submitted this proctored exam for review')).toBeInTheDocument();
});

it('Shows correct download instructions for LTI provider if attempt status is created', () => {
it('Shows correct download instructions for LTI provider if attempt status is created, with support email and phone', () => {
store.getState = () => ({
examState: Factory.build('examState', {
activeAttempt: {},
Expand Down Expand Up @@ -760,6 +760,46 @@ describe('SequenceExamWrapper', () => {
expect(screen.getByText('Start Exam')).toBeInTheDocument();
});

it('Shows correct download instructions for LTI provider if attempt status is created with support URL', () => {
store.getState = () => ({
examState: Factory.build('examState', {
activeAttempt: {},
proctoringSettings: Factory.build('proctoringSettings', {
provider_name: 'LTI Provider',
provider_tech_support_email: '[email protected]',
provider_tech_support_phone: '+123456789',
provider_tech_support_url: 'www.example.com',
}),
exam: Factory.build('exam', {
is_proctored: true,
type: ExamType.PROCTORED,
attempt: Factory.build('attempt', {
attempt_status: ExamStatus.CREATED,
}),
}),
}),
});

render(
<ExamStateProvider>
<Instructions>
<div>Sequence</div>
</Instructions>
</ExamStateProvider>,
{ store },
);

expect(screen.getByText(
'If you have issues relating to proctoring, you can contact LTI Provider technical support by visiting',
{ exact: false },
)).toBeInTheDocument();
expect(screen.getByRole('link', { name: 'www.example.com in a new tab' })).toHaveAttribute('href', 'www.example.com');

expect(screen.getByText('Set up and start your proctored exam.')).toBeInTheDocument();
expect(screen.getByText('Start System Check')).toBeInTheDocument();
expect(screen.getByText('Start Exam')).toBeInTheDocument();
});

it('Hides support contact info on download instructions for LTI provider if not provided', () => {
store.getState = () => ({
examState: Factory.build('examState', {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,70 @@
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import { Hyperlink } from '@edx/paragon';

const LtiProviderExamInstructions = ({
providerName, supportEmail, supportPhone,
}) => (
<>
<p>
<FormattedMessage
id="exam.DownloadSoftwareProctoredExamInstructions.text1"
defaultMessage={'Note: As part of the proctored exam setup, you '
+ 'will be asked to verify your identity. Before you begin, make '
+ 'sure you are on a computer with a webcam, and that you have a '
+ 'valid form of photo identification such as a driver’s license or passport.'}
/>
</p>
{supportEmail && supportPhone && (
<p>
providerName, supportEmail, supportPhone, supportURL,
}) => {
const supportURLHyperlink = (chunks) => (
<Hyperlink destination={chunks} target="_blank">
{chunks}
</Hyperlink>
);

const getSupportText = () => {
// We assume that an LTI-based provider will either have a supportURL or a supportEmail and supportPhone.
// In the unlikely event a provider has all three, we prioritize the supportURL.
if (supportURL) {
return (
<FormattedMessage
id="exam.DownloadSoftwareProctoredExamInstructions.supportText"
id="exam.DownloadSoftwareProctoredExamInstructions.LTI.supportText.URL"
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I noticed that there is a FormattedMessage in RestProviderInstructions.jsx with the same original ID (exam.DownloadSoftwareProctoredExamInstructions.supportText). Does anyone know if that would cause a conflict with this original string? I added LTI to differentiate, but I'm not sure if the strings end up namespaced by component or something.

Copy link
Contributor

Choose a reason for hiding this comment

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

also not sure but differentiating them seems wise

defaultMessage={'If you have issues relating to proctoring, you can contact '
+ '{providerName} technical support by emailing {supportEmail} or by calling {supportPhone}.'}
+ '{providerName} technical support by visiting <a>{supportURL}</a>.'}
values={{
providerName,
supportURL,
a: supportURLHyperlink,
}}
/>
);
}
if (supportEmail && supportPhone) {
return (
<FormattedMessage
id="exam.DownloadSoftwareProctoredExamInstructions.LTI.supportText.EmailPhone"
defaultMessage={'If you have issues relating to proctoring, you can contact '
+ '{providerName} technical support by emailing {supportEmail} or by calling {supportPhone}.'}
values={{
providerName,
supportEmail,
supportPhone,
}}
/>
</p>
)}
</>
);
);
}
return null;
};

return (
<p>
{getSupportText()}
</p>
);
};

LtiProviderExamInstructions.propTypes = {
providerName: PropTypes.string,
supportEmail: PropTypes.string,
supportPhone: PropTypes.string,
supportURL: PropTypes.string,
};

LtiProviderExamInstructions.defaultProps = {
providerName: '',
supportEmail: '',
supportPhone: '',
supportURL: '',
};

export default LtiProviderExamInstructions;
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const DownloadSoftwareProctoredExamInstructions = ({ intl, skipProctoredExam })
provider_name: providerName,
provider_tech_support_email: supportEmail,
provider_tech_support_phone: supportPhone,
provider_tech_support_url: supportURL,
exam_proctoring_backend: proctoringBackend,
} = proctoringSettings;
const examHasLtiProvider = !useLegacyAttemptApi;
Expand Down Expand Up @@ -81,6 +82,7 @@ const DownloadSoftwareProctoredExamInstructions = ({ intl, skipProctoredExam })
providerName={providerName}
supportEmail={supportEmail}
supportPhone={supportPhone}
supportURL={supportURL}
/>
);
}
Expand Down
Loading