{"version":3,"sources":["webpack:///./app/react/packages/tasks/utils/getTaskIcon.js","webpack:///./app/react/packages/tasks/components/ResultsModal.js","webpack:///./app/react/packages/tasks/services/finishHomeworkActivity.js","webpack:///./app/react/packages/tasks/components/openEndedQuestions/Review.js","webpack:///./app/react/packages/tasks/components/speaking/Review.js","webpack:///./app/react/packages/tasks/services/putScoreTime.js","webpack:///./app/react/packages/tasks/components/AnswerKeyModal.js","webpack:///./app/react/packages/tasks/propShapes/activity.js","webpack:///./app/react/packages/tasks/components/readWatchListen/ReadWatchListen.js","webpack:///./app/react/packages/tasks/components/dialogue/Bubble.js","webpack:///./app/react/packages/tasks/components/dialogue/Headshot.js","webpack:///./app/react/packages/tasks/components/dialogue/Dialogue.js","webpack:///./app/react/packages/tasks/components/readWatchListen2/StyledHtmlContent.js","webpack:///./app/react/packages/tasks/components/readWatchListen2/ReadWatchListen2.js","webpack:///./app/react/packages/tasks/services/postAttempt.js","webpack:///./app/react/packages/tasks/components/imageMatching/Results.js","webpack:///./app/react/packages/tasks/components/listenAndType/Results.js","webpack:///./app/react/packages/tasks/components/matching/Results.js","webpack:///./app/react/packages/tasks/components/multipleChoice/Results.js","webpack:///./app/react/packages/tasks/components/putInOrder/Results.js","webpack:///./app/react/packages/tasks/components/seeAndSpell/Results.js","webpack:///./app/react/packages/tasks/components/sequencing/Results.js","webpack:///./app/react/packages/tasks/components/trueOrFalse/Results.js","webpack:///./app/react/packages/tasks/components/imageMatching/AnswerKey.js","webpack:///./app/react/packages/tasks/components/listenAndType/AnswerKey.js","webpack:///./app/react/packages/tasks/components/matching/AnswerKey.js","webpack:///./app/react/packages/tasks/components/multipleChoice/AnswerKey.js","webpack:///./app/react/packages/tasks/components/openEndedQuestions/AnswerKey.js","webpack:///./app/react/packages/tasks/components/putInOrder/AnswerKey.js","webpack:///./app/react/packages/tasks/components/seeAndSpell/AnswerKey.js","webpack:///./app/react/packages/tasks/components/sequencing/AnswerKey.js","webpack:///./app/react/packages/tasks/components/speaking/AnswerKey.js","webpack:///./app/react/packages/tasks/components/trueOrFalse/AnswerKey.js","webpack:///./app/react/packages/tasks/components/openEndedQuestions/ResultQuestion.js","webpack:///./app/react/packages/tasks/components/openEndedQuestions/Results.js","webpack:///./app/react/packages/tasks/components/speaking/ResultQuestion.js","webpack:///./app/react/packages/tasks/components/speaking/Results.js","webpack:///./app/react/packages/tasks/components/flashcardSet/FlashcardSet.js","webpack:///./app/react/packages/tasks/components/multipleChoice/MultipleChoice.js","webpack:///./app/react/packages/tasks/components/putInOrder/PutInOrder.js","webpack:///./app/react/packages/tasks/components/seeAndSpell/SeeAndSpell.js","webpack:///./app/react/packages/tasks/components/sequencing/Sequencing.js","webpack:///./app/react/packages/tasks/components/speaking/recorderCards/RequestMicPermissionCard.js","webpack:///./app/react/packages/tasks/components/speaking/recorderCards/RequestBrowserChange.js","webpack:///./app/react/packages/tasks/components/speaking/RecorderProgressWrapper.js","webpack:///./app/react/packages/tasks/components/speaking/RecPlayButton.js","webpack:///./app/react/packages/tasks/components/speaking/RecorderButton.js","webpack:///./app/react/packages/tasks/components/speaking/recorderCards/RecordingAudioCard.js","webpack:///./app/react/packages/tasks/components/speaking/recorderCards/RevisionCard.js","webpack:///./app/react/packages/tasks/services/deleteAttempt.js","webpack:///./app/react/packages/tasks/components/speaking/AudioManager.js","webpack:///./app/react/packages/tasks/components/speaking/Question.js","webpack:///./app/react/packages/tasks/components/speaking/Speaking.js","webpack:///./app/react/packages/tasks/components/listenAndType/WordList.js","webpack:///./app/react/packages/tasks/components/listenAndType/Paragraph.js","webpack:///./app/react/packages/tasks/components/listenAndType/ListenAndType.js","webpack:///./app/react/packages/tasks/components/trueOrFalse/TFButton.js","webpack:///./app/react/packages/tasks/components/trueOrFalse/Statement.js","webpack:///./app/react/packages/tasks/components/trueOrFalse/TrueOrFalse.js","webpack:///./app/react/packages/tasks/components/imageMatching/ImageTile.js","webpack:///./app/react/packages/tasks/components/imageMatching/ImageMatching.js","webpack:///./app/react/packages/tasks/components/matching/Word.js","webpack:///./app/react/packages/tasks/components/matching/Matching.js","webpack:///./app/react/packages/tasks/components/openEndedQuestions/Question.js","webpack:///./app/react/packages/tasks/components/openEndedQuestions/OpenEndedQuestions.js","webpack:///./app/react/packages/tasks/components/AnswerNumber.js","webpack:///./app/react/packages/tasks/components/SuggestedAnswers.js","webpack:///./app/react/packages/tasks/components/putInOrder/CorrectnessIcon.js","webpack:///./app/react/packages/tasks/services/postFeedback.js","webpack:///./app/react/packages/tasks/components/ReferenceTask.js","webpack:///./app/react/packages/tasks/components/ScoredBy.js","webpack:///./app/react/packages/tasks/components/FeedbackSection.js","webpack:///./app/react/packages/tasks/components/utils/RatingSelector.js","webpack:///./app/react/packages/tasks/constants/taskTypes.js","webpack:///./app/react/packages/tasks/components/ReferenceWrapper.js","webpack:///./app/react/packages/tasks/components/putInOrder/animations.js","webpack:///./app/react/packages/tasks/components/putInOrder/SortableList.js","webpack:///./app/react/packages/tasks/propShapes/question.js","webpack:///./app/react/packages/tasks/components/putInOrder/Headshot.js","webpack:///./app/react/packages/tasks/parsers/parseElements.js","webpack:///./app/react/packages/tasks/utils/taskTypeHasResult.js","webpack:///./app/react/packages/tasks/components/putInOrder/Bubble.js","webpack:///./app/react/packages/tasks/components/sequencing/Sentence.js","webpack:///./app/react/packages/tasks/components/resultsPages/openEndedQuestions/ResultQuestion.js","webpack:///./app/react/packages/tasks/components/resultsPages/openEndedQuestions/Results.js","webpack:///./app/react/packages/tasks/components/resultsPages/speaking/ResultQuestion.js","webpack:///./app/react/packages/tasks/components/resultsPages/speaking/Results.js","webpack:///./app/react/packages/tasks/components/ResultsSelector.js","webpack:///./app/react/packages/tasks/components/ReviewModal/AttemptSelector.js","webpack:///./app/react/packages/tasks/components/ReviewModal/TeacherComments.js","webpack:///./app/react/packages/tasks/components/ReviewModal/index.js","webpack:///./app/react/packages/tasks/components/listenAndType/answerWrappers.js","webpack:///./app/react/packages/tasks/context/activity/constants.js","webpack:///./app/react/packages/tasks/context/activity/helpers.js","webpack:///./app/react/packages/tasks/context/activity/index.js","webpack:///./app/react/packages/tasks/utils/getTaskItems.js","webpack:///./app/react/packages/tasks/components/OldResultsSelector.js","webpack:///./app/react/packages/tasks/services/postHomeworkActivity.js","webpack:///./app/react/packages/tasks/components/imageMatching/ResultsImage.js","webpack:///./app/react/packages/tasks/components/listenAndType/renderAnswerParagraphs.js","webpack:///./app/react/packages/tasks/components/putInOrder/getCorrectAnswer.js","webpack:///./app/react/packages/tasks/components/sequencing/getCorrectAnswer.js","webpack:///./app/react/packages/tasks/propShapes/task.js","webpack:///./app/react/packages/tasks/components/matching/Target.js","webpack:///./app/react/packages/tasks/components/matching/getHandleTargetClick.js","webpack:///./app/react/packages/tasks/components/utils/modals/MissedAnswersModal.js","webpack:///./app/react/packages/tasks/components/putInOrder/array.js","webpack:///./app/react/packages/tasks/components/listenAndType/Hint.js","webpack:///./app/react/packages/tasks/components/listenAndType/Blank.js","webpack:///./app/react/packages/tasks/components/ImmersiveReaderContent.js","webpack:///./app/react/packages/tasks/hooks/useImmersiveReader.js","webpack:///./app/react/packages/tasks/services/submitHomeworkActivity.js"],"names":["iconsByTask","dialogue","SpeechBubbles","flashcardSet","FlashcardSetTaskIcon","imageMatching","ImageMatchingCard","listenAndType","Keyboard","matching","MatchingCard","multipleChoice","Options","openEndedQuestions","Pencil","putInOrder","PutInOrder","readWatchListen2","Presentation","readWatchListen","Book","seeAndSpell","Eye","sequencing","NumberedList","speaking","SoloSpeechBubble","trueOrFalse","YesNo","getTaskIcon","taskType","ResultsModal","activity","isOpen","onClose","title","score","scoreBase","scorePercentage","onBackgroundClick","onEscapeKeydown","as","display","mb","pr","unscoredTasks","px","py","bg","parseFloat","borderRadius","fontSize","fontWeight","propTypes","PropTypes","shape","activityShape","isRequired","bool","func","string","finishHomeworkActivity","id","xhr","url","activitiesEndpoint","method","data","homework_activity","finished","AnswerBox","styled","Box","attrs","transition","props","theme","colors","blue300","Review","editAnswer","useActivityContext","activityId","questions","taskItems","m","reset","map","question","index","array","attempt","JSON","parse","sessionStorage","getItem","length","p","textAlign","number","measure","dangerouslySetInnerHTML","__html","renderInlineMarkdown","content","mt","icon","border","onClick","split","i","defaultProps","RenderQuestion","attempts","useState","audioUrl","setAudioUrl","useEffect","existingAttempt","find","attemptable","question_id","audio","alignItems","justifyContent","width","boxShadow","flex","mr","src","showRemainingTime","lineHeight","pos","questionShape","arrayOf","Object","putScoreTime","time","score_time","IMAnswers","lazy","LATAnswers","MatchingAnswers","MTAnswers","OEQAnswers","PIOAnswers","SSAnswers","SeqAnswers","SpkAnswers","TFAnswers","answerKeyComponents","AnswerKeySelector","task","taskable","type","instructions","my","borderColor","component","activityPropShape","display_mode","yumi_class_id","homework_task_id","activityable","allow_reference","subtitle","correct","user_id","attemptable_id","activity_id","object","activityPropShapeV2","score_base","partial_score","percentage","time_display","display_type","active","answer_form","reference_task","version","oneOfType","needs_feedback","has_new_feedback","RWLImage","imageURL","Component","isReference","Image","LightboxImage","maxWidth","maxHeight","mx","alt","ReadWatchListenContent","imagePosition","paragraphNumbering","paragraphs","immersiveReaderText","renderMarkdown","join","position","bottom","right","pl","idx","ReadWatchListen","dispatchActivity","image_position","image_url","paragraph_numbering","isPending","setIsPending","postAttempt","createAttempt","setPosition","results","when","oneOf","Bubble","gray200","media","md","Headshot","name","withName","size","MotionBox","motion","DialogueContent","bubbles","headshots","HeadshotsContainer","containerVariants","hidden","opacity","show","delayChildren","staggerChildren","hsVariants","scale","stiffness","damping","bubbleVariants","y","variants","initial","animate","hs","div","icon_url","b","headshot","ml","Dialogue","referenceTask","pb","delay","taskPropShape","StyledHtmlContent","blue700","black","radii","rounded","space","sm","gray100","fontSizes","shadows","gray700","letterSpacings","condensed","lineHeights","heading","narrow","body","wide","white","lg","sanitizeOptions","ADD_TAGS","ADD_ATTR","immersiveReaderSanitizeOptions","FORBID_TAGS","parseOptions","replace","domNode","attributesToProps","attribs","ReadWatchListenContent2","sanitizedContent","DOMPurify","sanitize","immersiveReaderSanitizedContent","ImmersiveReaderContent","ReadWatchListen2","Results","words","pairs","pair","wordId","isCorrect","word","matched_word","borderBottom","color","renderAnswerParagraphs","blankRenderer","el","getAttemptForElement","response","fragment","definition","weight","SetBold700","selectedOption","answer_id","answers","givenAnswer","correctAnswer","audio_url","top","bubble_ids","getCorrectAnswer","bubbleIndex","bubble","correctPosition","indexOf","answer","variant","pt","Answer","word_id","spell_attempt","sentences","sentence_ids","sentenceIndex","sentence","statements","assertion","AnswerKey","filter","a","suggested_answers","isRe","statement","ResultQuestion","feedback","onFeedbackChange","isTeacher","isArchived","Math","ceil","floor","setPercentage","setAudio","attemptContent","dirty","setDirty","questionContent","scoredDate","setScoredDate","authorName","setAuthorName","getAuthorName","auto_scored","ELLII_BOT_NAME","teacher","firstName","lastName","getUpdatedDate","auto_score_at","manual_score_at","newPercentage","shouldShowScoredByLabel","shouldShowTeacherFeedbackStudentSide","shouldShowScoreAndCommentAreaTeacherSide","AnswerNumber","ScoredBy","author","date","FeedbackSection","RatingSelector","rating","onRatingChange","value","text_content","placeholder","onChange","event","removeAudio","target","disabled","teacherScoreValues","EMPTY_VALUE","label","handleAudioDeletion","compact","SuggestedAnswers","sourceable_id","sourceable_type","isCurrentUser","onFeedbackSent","student","isClassArchived","createFeedbackObjects","grading_item_id","feedbacks","setFeedbacks","error","setError","loading","setLoading","activityHasUnsavedFeedback","setActivityHasUnsavedFeedback","findExistingFeedbackIndex","hasContent","trim","itemRef","useRef","ref","existingIndex","clonedFb","remove_audio","handleFeedback","arr","postFeedback","then","errors","setTimeout","current","scrollIntoView","behavior","undefined","first_name","last_name","attemptAudio","href","backgroundColor","showTotalTime","secondary","FlashcardSet","fc","currentTaskItem","ttsToken","tts_token","ttsURL","tts_url","flashcards","reduce","urls","f","audioUrls","setAudioUrls","fetchAudioUrl","requestTextToSpeech","text","token","WebFont","load","google","families","height","alignSelf","small","currentItem","image","font","MultipleChoice","hideReference","setHideReference","isEmptiesModalOpen","setIsEmptiesModalOpen","closeEmptiesModal","qn","qs","q","responses","setResponses","answersIncomplete","SubmitAnswers","homework_attempt","attemptable_attributes","keys","qid","attemptsResponse","createAttempts","flexDirection","image_alt_text","image_caption","letterSpacing","checked","aid","overflowY","borderLeft","isNewLayout","onSubmit","onCancel","firstEmptyQuestionIndex","entries","DialogContainer","sortableContainer","children","SortableBubble","SortableHandle","sortableHandle","DialogItem","sortableElement","taskBubbles","arrayShuffle","setBubbles","attemptNumber","setAttemptNumber","isModalOpen","setModalOpen","lockedPositions","setLockedPositions","handleSubmit","triesLeft","answerGiven","getScore","handleRetry","window","scrollTo","currentAttempt","lockAxis","helperClass","useWindowAsScrollContainer","onSortEnd","oldIndex","newIndex","state","arrayMove","useDragHandle","SeeAndSpell","w","ws","wid","SortableSentence","Sentence","taskSentences","setSentences","RequestMicPermissionCard","RequestBrowserChange","RecorderProgressBar","RecorderButton","circular","bgHover","RecordButton","actionIcon","recording","seconds","setSeconds","strokeWidth","setStrokeWidth","isMd","useMedia","mediaQueries","progressBarStyle","path","stroke","red500","strokeLinecap","transformOrigin","trail","red100","transform","mounted","recordingTimeout","clearTimeout","RecorderProgressWrapper","maxValue","styles","RecordingAudioCard","status","handleStopRecording","handleStartRecording","recordingTime","recordButtonAction","recorderStatus","RECORDING","RevisionCard","openConfirmationModal","showCurrentTime","deleteAttempt","attempt_Id","AudioManager","questionId","isReferenceLayout","useMediaRecorder","base64Media","startRecording","stopRecording","setStatus","userBrowser","setUserBrowser","userOS","setUserOS","isConfirmationModalOpen","setIsConfirmationModalOpen","isDeleteAudioPending","setIsDeleteAudioPending","setRecordingTime","existingAudioAttempt","deleteAttemptService","IDLE","useElapsingTime","timeLimit","MAX_RECORDING_TIME","handleTimeOver","updateTimeCallback","shouldStartTimer","SAVING","postAttemptService","saveAudioEffectsWrapper","bowserParse","Bowser","getParser","navigator","userAgent","getBrowserName","getOSName","platform","IOS","browser","CHROME","FIREFOX","BLOCKED","ConfirmActionDialog","onConfirm","onOpenChange","Question","imageAltText","caption","imageUrl","isOverflow","setIsOverflow","overflowRef","isQuestionLong","useLayoutEffect","scrollHeight","clientHeight","borderRight","ReferenceWrapper","ReferenceTask","Speaking","TransitionItems","ColumnList","List","WordList","list","modalOpen","Paragraph","paragraph","promptType","wordList","elements","audioURL","imageType","image_type","parsedElements","parseElements","getBlankMode","element","previous_answer","renderBlank","Blank","autoCapitalize","autoComplete","mode","prompt","e","prev","gridColumnGap","gridRowGap","renderText","renderLineBreak","objectOf","ListenAndType","allBlanks","flatMap","blanks","blank","emptiesModalOpen","setEmptiesModalOpen","allBlanksFilled","values","submit","paragraph_element_id","blankId","parseInt","paragraphId","paragraphIndex","MissedAnswersModal","pulse","keyframes","RoundButton","isSelected","css","BigIcon","Icon","TFButton","Statement","onAnswer","selectedValue","setSelectedValue","isStatementLong","statement_id","animationDelay","Button","gray800","displayName","reference_task_id","TrueOrFalse","imageTileSize","ImageButton","button","matched","yellow500","gray300","layout","ImageTile","ImageMatching","images","bank","setBank","matchedId","matches","setMatches","getByParsedId","getMatch","getImage","activeWord","setActiveWord","isIncomplete","handleTargetClick","getHandleTargetClick","setMatch","pairs_attributes","matched_word_id","AnimatePresence","style","exit","flexWrap","Target","isArmed","isMatched","WordButton","getBoxShadowColor","disabledOpacity","Word","IndexCircle","left","Matching","getWord","definitionId","useSessionStorage","contentForAttempt","setContentForAttempt","outline","rows","OpenEndedQuestions","NumberBox","Text","zIndex","AnswerShape","created_at","updated_at","CorrectnessIcon","feedbackUrl","Wrapper","openModal","taskTitle","taskProps","generalTimeFormat","AudioWrapper","FIFTY_PERCENT","flexShrink","iconFontSize","readOnly","teacherName","Root","className","defaultValue","onValueChange","max","step","aria-label","Track","Range","Thumb","indicator","onSelect","taskTypes","taskTypeLabels","standardTasks","readonlyTasks","referenceTasks","teacherMarkableTasks","batchSubmissionTasks","disableStyleTransform","node","_node","styleProxy","Proxy","set","toLowerCase","endsWith","get","Container","_componentDidMount","prototype","componentDidMount","apply","this","_autoScroll","onAutoScroll","args","onSortMove","onSortStart","onSortOver","rest","translateCache","items","nodes","forEach","enableStyleTransform","direction","from","to","pushDirection","helperHeight","offsetHeight","n","sortableInfo","translate","prevIdx","nextIdx","prevNode","prevNodeHeight","margin","abs","animateNodes","_style","setTranslateY","StyledCoverImage","CoverImage","punctuations","isPunctuation","startsWithPunctuation","substring","setTypeAsFragment","setContentAsMarkdown","formatSplitAsFragment","formatSplitAsText","parseTextElement","splitTextElement","lineBreakRegex","createLineBreaks","includes","Boolean","part","flat","acc","taskTypeHasResult","success","danger","AudioRecorder","AUDIO_LOADING_STATUSES","STOPPING","onRecorderStatusChange","Number","feedbackAudio","setFeedbackAudio","updatedRemoveAudio","hasSuggestedAnswers","onAudioRecorded","recordedAudio","onDeleteAudio","onStatusChange","isDisabled","setIsDisabled","disabledStatus","audioTranscription","ResultsSelector","ImageMatchingResults","ListenAndTypeResults","MatchingResults","MultipleChoiceResults","OEQResults","PutInOrderResults","SeeAndSpellResults","SequencingResults","SpkResults","TrueOrFalseResults","ResultComponent","AttemptSelector","lesson","onActivityChange","options","scoreDisplay","isPartialScore","timeDisplay","finishedAt","finished_at","getActivityData","lesson_title","getOptionText","opt","getOptionValue","r","MotionButton","TeacherComments","taskId","isStudent","savedMessage","setSavedMessage","updatingComment","setUpdatingComment","shouldSaveFeedback","setShouldSaveFeedback","comment","setComment","getWithXHR","orderedData","formatted","test","resp","analyticsTrack","borderTop","whiteSpace","RichTextarea","savedContent","newValue","minHeight","Alert","prevState","ease","duration","DialogContent","Dialog","StyledContent","ReviewModal","activities","useQuery","activitiesUrl","suspense","refetchOnWindowFocus","currentActivityId","setCurrentActivityId","activityUrl","currentActivity","refetch","getTaskItems","open","Overlay","StyledTitle","act","OldResultsSelector","params","CorrectWrapper","green700","IncorrectWrapper","reviewAndSubmit","namedPositions","_formatActivity","submitted","fixing","reviewed","_updateAttempt","attemptBody","attemptId","attemptIdx","updatedAttempt","createActivity","payload","flushActivity","setSubmitted","setReviewed","incPosition","decPosition","setScore","scoreFields","activityReducer","_createAttempt","_deleteAttempt","_createAttempts","Error","flatten","_updatePosition","ActivityState","createContext","ActivityDispatch","useContext","dispatch","ActivityProvider","preloadedActivity","getInitialState","activityInitialState","useReducer","activityState","setActivityState","Provider","getFromTaskable","key","IMResults","LTResults","MCResults","PIOResults","SSResults","TFResults","defaultOptions","fixActivityId","postHomeworkActivity","homeworkData","fix_activity_id","broadcastData","task_id","broadcastEndpoint","ResultsImage","renderParagraphs","renderElement","taskShape","TargetBox","hoverBg","hasMatch","adaptive","ensureNonLockedDestination","locked","dest","isOutOfBound","result","slice","elementToRelocate","Hint","pointerEvents","correctStyles","green500","incorrectStyles","red50","Input","input","gray400","blue100","blue500","PromptContent","isSubmitted","StyledBox","blue600","VIMEO_CAPTION_REGEX","getToken","tokenExpiresAt","localStorage","subdomain","Date","now","tokenData","setItem","expires_on","launchReader","uiZIndex","chunks","mimeType","launchAsync","removeItem","useImmersiveReader","delayDuration","tooltipDelayDuration","Trigger","asChild","xmlns","x","viewBox","d","Content","side","Arrow","submitHomeworkActivity"],"mappings":"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","file":"package-tasks.0991b72975e054dd987b.chunk.js","sourcesContent":["import {\n Book,\n Eye,\n FlashcardSetTaskIcon,\n ImageMatchingCard,\n Keyboard,\n MatchingCard,\n NumberedList,\n Options,\n Pencil,\n Presentation,\n PutInOrder,\n SpeechBubbles,\n SoloSpeechBubble,\n YesNo,\n} from '@redriverpress/system'\n\nimport {\n dialogue,\n flashcardSet,\n imageMatching,\n listenAndType,\n matching,\n multipleChoice,\n openEndedQuestions,\n putInOrder,\n readWatchListen,\n readWatchListen2,\n seeAndSpell,\n sequencing,\n speaking,\n trueOrFalse,\n} from '../constants/taskTypes'\n\nconst iconsByTask = {\n [dialogue]: SpeechBubbles,\n [flashcardSet]: FlashcardSetTaskIcon,\n [imageMatching]: ImageMatchingCard,\n [listenAndType]: Keyboard,\n [matching]: MatchingCard,\n [multipleChoice]: Options,\n [openEndedQuestions]: Pencil,\n [putInOrder]: PutInOrder,\n [readWatchListen2]: Presentation,\n [readWatchListen]: Book,\n [seeAndSpell]: Eye,\n [sequencing]: NumberedList,\n [speaking]: SoloSpeechBubble,\n [trueOrFalse]: YesNo,\n}\n\nexport default function getTaskIcon(taskType) {\n return iconsByTask[taskType]\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { Box, Heading, Text } from '@redriverpress/system'\n\nimport { Modal } from 'Common/components/modal'\n\nimport ResultsSelector from './OldResultsSelector'\nimport activityShape from '../propShapes/activity'\nimport { unscoredTasks } from '../constants/taskTypes'\n\nexport default function ResultsModal({ activity, isOpen, onClose, title }) {\n const { score, scoreBase, scorePercentage, taskType } = activity\n\n const renderTitle = () => (\n \n \n {title}\n \n {!R.includes(taskType, unscoredTasks) && (\n \n \n {score}/{scoreBase}\n \n \n )}\n \n )\n\n return (\n \n \n \n )\n}\n\nResultsModal.propTypes = {\n activity: PropTypes.shape(activityShape).isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n title: PropTypes.string.isRequired,\n}\n","import xhr from 'Common/utils/xhr'\nimport { activitiesEndpoint } from 'Endpoints'\n\nexport default function finishHomeworkActivity(id) {\n return xhr({\n url: `${activitiesEndpoint}/${id}`,\n method: 'PUT',\n data: {\n homework_activity: {\n finished: true,\n },\n },\n })\n}\n","/* eslint-disable react/no-array-index-key */\nimport PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\nimport styled from 'styled-components'\n\nimport { Box, Icon, Heading, List, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport AnswerNumber from '../AnswerNumber'\nimport { useActivityContext } from '../../context/activity'\n\nconst AnswerBox = styled(Box).attrs(() => ({\n transition: 'border-color 0.3s ease',\n}))`\n cursor: pointer;\n\n &:hover {\n border: 2px solid ${props => props.theme.colors.blue300};\n }\n`\n\nfunction Review({ editAnswer }) {\n const [{ id: activityId, taskItems: questions }] = useActivityContext()\n\n // const removeSessionStorageQuotes = word => word.substring(1, word.length - 1)\n\n const renderQuestion = (question, index, array) => {\n const attempt =\n JSON.parse(sessionStorage.getItem(`${activityId}-${question.id}`)) || ''\n return (\n \n \n {array.length > 1 && (\n \n \n \n )}\n \n \n \n \n Your answer (tap to edit):\n \n editAnswer(index)}\n >\n {attempt.split('\\n').map((p, i) => (\n \n {p}\n \n ))}\n \n \n \n \n )\n }\n\n return (\n \n \n {questions.map(renderQuestion)}\n \n \n )\n}\n\nReview.defaultProps = {\n editAnswer: null,\n}\n\nReview.propTypes = {\n editAnswer: PropTypes.func,\n}\n\nexport default Review\n","/* eslint-disable react/no-array-index-key */\nimport { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport {\n Audio,\n Box,\n Icon,\n Heading,\n List,\n Text,\n TransparentButton,\n} from '@redriverpress/system'\nimport questionShape from 'Packages/tasks/propShapes/question'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport AnswerNumber from '../AnswerNumber'\nimport { useActivityContext } from '../../context/activity'\n\nconst RenderQuestion = ({ question, index, array, attempts, editAnswer }) => {\n const [audioUrl, setAudioUrl] = useState(null)\n\n useEffect(() => {\n const existingAttempt = attempts.find(attempt => {\n return attempt.attemptable.question_id === question.id\n })\n\n if (existingAttempt) setAudioUrl(existingAttempt.attemptable.audio)\n }, [])\n\n return (\n \n \n {array.length > 1 && (\n \n \n \n )}\n \n \n \n \n Your answer:\n \n \n {audioUrl ? (\n \n \n ) : (\n 'You didn’t record an answer.'\n )}\n \n editAnswer(index)}\n lineHeight='1.9' // This magic number is needed to keep boxes' borders aligned\n >\n \n Edit\n \n \n \n \n \n \n )\n}\n\nfunction Review({ editAnswer }) {\n const [{ taskItems: questions, attempts }] = useActivityContext()\n\n return (\n \n {questions.map((question, pos, array) => (\n \n ))}\n \n )\n}\n\nRenderQuestion.defaultProps = {\n attempts: null,\n}\n\nRenderQuestion.propTypes = {\n question: PropTypes.shape(questionShape).isRequired,\n index: PropTypes.number.isRequired,\n array: PropTypes.arrayOf(PropTypes.shape(questionShape)).isRequired,\n attempts: PropTypes.arrayOf(Object),\n editAnswer: PropTypes.func.isRequired,\n}\n\nReview.defaultProps = {\n editAnswer: null,\n}\n\nReview.propTypes = {\n editAnswer: PropTypes.func,\n}\n\nexport default Review\n","import xhr from 'Common/utils/xhr'\nimport { activitiesEndpoint } from 'Endpoints'\n\nexport default function putScoreTime({ id, time }) {\n return xhr({\n url: `${activitiesEndpoint}/${id}`,\n method: 'PUT',\n data: {\n homework_activity: {\n score_time: time,\n },\n },\n })\n}\n","import PropTypes from 'prop-types'\nimport { lazy } from 'react'\n\nimport { Heading, HR, LoadWithSuspense, Text } from '@redriverpress/system'\n\nimport { Modal } from 'Common/components/modal'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport {\n imageMatching,\n listenAndType,\n matching,\n multipleChoice,\n openEndedQuestions,\n putInOrder,\n seeAndSpell,\n sequencing,\n speaking,\n trueOrFalse,\n} from '../constants/taskTypes'\n\nconst IMAnswers = lazy(() => import('./imageMatching/AnswerKey'))\nconst LATAnswers = lazy(() => import('./listenAndType/AnswerKey'))\nconst MatchingAnswers = lazy(() => import('./matching/AnswerKey'))\nconst MTAnswers = lazy(() => import('./multipleChoice/AnswerKey'))\nconst OEQAnswers = lazy(() => import('./openEndedQuestions/AnswerKey'))\nconst PIOAnswers = lazy(() => import('./putInOrder/AnswerKey'))\nconst SSAnswers = lazy(() => import('./seeAndSpell/AnswerKey'))\nconst SeqAnswers = lazy(() => import('./sequencing/AnswerKey'))\nconst SpkAnswers = lazy(() => import('./speaking/AnswerKey'))\nconst TFAnswers = lazy(() => import('./trueOrFalse/AnswerKey'))\n\nconst answerKeyComponents = {\n [imageMatching]: IMAnswers,\n [listenAndType]: LATAnswers,\n [matching]: MatchingAnswers,\n [multipleChoice]: MTAnswers,\n [openEndedQuestions]: OEQAnswers,\n [putInOrder]: PIOAnswers,\n [seeAndSpell]: SSAnswers,\n [sequencing]: SeqAnswers,\n [speaking]: SpkAnswers,\n [trueOrFalse]: TFAnswers,\n}\n\nexport default function AnswerKeySelector({ task, isOpen, onClose }) {\n const { type: taskType } = task.taskable\n\n return (\n \n \n {task.title}\n \n \n
\n \n
\n )\n}\n\nAnswerKeySelector.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n task: PropTypes.shape({\n taskable: PropTypes.shape({\n type: PropTypes.string.isRequired,\n }).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\n\nconst activityPropShape = {\n id: PropTypes.number.isRequired,\n display_mode: PropTypes.string,\n yumi_class_id: PropTypes.number,\n homework_task_id: PropTypes.number,\n activityable: PropTypes.shape({\n id: PropTypes.number.isRequired,\n allow_reference: PropTypes.bool,\n }),\n task: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.string,\n instructions: PropTypes.string.isRequired,\n taskable: PropTypes.shape({\n id: PropTypes.number.isRequired,\n type: PropTypes.string.isRequired,\n }),\n type: PropTypes.string,\n attempts: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n correct: PropTypes.bool.isRequired,\n user_id: PropTypes.number.isRequired,\n attemptable_id: PropTypes.number.isRequired,\n activity_id: PropTypes.number.isRequired,\n attemptable: PropTypes.object,\n })\n ),\n }),\n}\n\nexport const activityPropShapeV2 = PropTypes.shape({\n id: PropTypes.number.isRequired,\n score_base: PropTypes.number,\n partial_score: PropTypes.bool.isRequired,\n percentage: PropTypes.string.isRequired,\n time: PropTypes.number.isRequired,\n time_display: PropTypes.string.isRequired,\n task: PropTypes.shape({\n id: PropTypes.number,\n type: PropTypes.string,\n display_type: PropTypes.string,\n title: PropTypes.string,\n subtitle: PropTypes.string,\n instructions: PropTypes.string,\n active: PropTypes.bool,\n questions: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n content: PropTypes.string,\n answer_form: PropTypes.string,\n reference_task: PropTypes.shape({\n id: PropTypes.number,\n type: PropTypes.string,\n display_type: PropTypes.string,\n title: PropTypes.string,\n subtitle: PropTypes.string,\n instructions: PropTypes.string,\n active: PropTypes.bool,\n content: PropTypes.string,\n }),\n })\n ),\n }),\n version: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n attempts: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n type: PropTypes.string,\n question_id: PropTypes.number,\n content: PropTypes.string,\n })\n ),\n needs_feedback: PropTypes.bool.isRequired,\n has_new_feedback: PropTypes.bool.isRequired,\n})\n\nexport default activityPropShape\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment, useState } from 'react'\n\nimport {\n Box,\n BlockClicks,\n Button,\n Icon,\n Heading,\n Image,\n List,\n LoadingSpinner,\n TaskAudioConsumer,\n Text,\n} from '@redriverpress/system'\n\nimport LightboxImage from 'Common/components/LightboxImage'\nimport ImmersiveReaderContent from 'Packages/tasks/components/ImmersiveReaderContent'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport { renderMarkdown } from 'Common/utils/markdown'\n\nimport {\n useActivityContext,\n createAttempt,\n setPosition,\n results,\n} from '../../context/activity'\n\nconst RWLImage = ({ imageURL, isReference }) => {\n const Component = isReference ? Image : LightboxImage\n return (\n \n \n \n \n \n )\n}\n\nRWLImage.propTypes = {\n imageURL: PropTypes.string.isRequired,\n isReference: PropTypes.bool.isRequired,\n}\nexport function ReadWatchListenContent({\n imagePosition,\n imageURL,\n isReference,\n paragraphNumbering,\n paragraphs,\n title,\n}) {\n const immersiveReaderText = paragraphNumbering\n ? `
    ${paragraphs\n .map(p => `
  1. ${renderMarkdown(p)}

  2. `)\n .join('')}
`\n : paragraphs.map(p => renderMarkdown(p)).join('')\n\n return (\n \n {immersiveReaderText && (\n \n \n \n )}\n\n {title && (\n \n {title}\n \n )}\n {imageURL && R.equals(imagePosition, 'top') && (\n \n )}\n\n {paragraphNumbering ? (\n \n {paragraphs.map((p, idx) => (\n \n \n {R.inc(idx)}.\n \n \n \n ))}\n \n ) : (\n paragraphs.map(p => (\n \n ))\n )}\n\n {imageURL && R.equals(imagePosition, 'bottom') && (\n \n )}\n \n )\n}\n\nReadWatchListenContent.defaultProps = {\n imagePosition: 'top',\n imageURL: null,\n isReference: false,\n paragraphNumbering: false,\n title: null,\n}\n\nReadWatchListenContent.propTypes = {\n imagePosition: PropTypes.oneOf(['top', 'bottom']),\n imageURL: PropTypes.string,\n isReference: PropTypes.bool,\n paragraphNumbering: PropTypes.bool,\n paragraphs: PropTypes.arrayOf(PropTypes.string).isRequired,\n title: PropTypes.string,\n}\n\nexport default function ReadWatchListen() {\n const [\n { audioUrl, task, ...activity },\n dispatchActivity,\n ] = useActivityContext()\n\n const {\n taskable: {\n image_position: imagePosition,\n image_url: imageURL,\n paragraphs,\n paragraph_numbering: paragraphNumbering,\n title,\n },\n } = task\n\n const [isPending, setIsPending] = useState(false)\n\n async function handleFinished() {\n setIsPending(true)\n const { data } = await postAttempt({ activity_id: activity.id })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n return (\n \n {audioUrl && }\n\n \n\n \n \n \n \n \n \n )\n}\n","import styled from 'styled-components'\n\nimport { Box, media } from '@redriverpress/system'\n\nconst Bubble = styled(Box).attrs(() => ({\n bg: 'gray150',\n borderRadius: 'rounded',\n flex: 1,\n px: [2, null, 3],\n py: [1, null, 2],\n position: 'relative',\n}))`\n &:after {\n content: '';\n position: absolute;\n top: 0.5rem;\n left: -0.5rem;\n width: 0;\n height: 0;\n border-top: 0.5rem solid transparent;\n border-bottom: 0.5rem solid transparent;\n border-right: 0.5rem solid ${props => props.theme.colors.gray200};\n }\n ${media.md`\n &:after {\n top: 1rem;\n }\n `}\n`\n\nexport default Bubble\n","import PropTypes from 'prop-types'\nimport { Fragment } from 'react'\n\nimport { CoverImage, Text } from '@redriverpress/system'\n\nexport default function Headshot({ src, name, withName, size, ...props }) {\n return (\n \n \n {withName && (\n \n {name}\n \n )}\n \n )\n}\n\nHeadshot.defaultProps = {\n withName: false,\n}\n\nHeadshot.propTypes = {\n src: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n withName: PropTypes.bool,\n size: PropTypes.arrayOf(PropTypes.string).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { Fragment, useState } from 'react'\nimport { motion } from 'framer-motion'\n\nimport {\n Box,\n BlockClicks,\n Button,\n Icon,\n LoadingSpinner,\n TaskAudioConsumer,\n Text,\n} from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport taskPropShape from 'Packages/tasks/propShapes/task'\n\nimport Bubble from './Bubble'\nimport Headshot from './Headshot'\nimport {\n useActivityContext,\n createAttempt,\n setPosition,\n results,\n} from '../../context/activity'\n\nconst MotionBox = motion(Box)\n\nexport function DialogueContent({ bubbles, headshots }) {\n const HeadshotsContainer = motion(Box)\n\n const containerVariants = {\n hidden: {\n opacity: 0,\n },\n show: {\n opacity: 1,\n transition: {\n delayChildren: 0.25,\n staggerChildren: 0.125,\n },\n },\n }\n\n const hsVariants = {\n hidden: {\n opacity: 0,\n scale: 0.5,\n },\n show: {\n opacity: 1,\n scale: 1,\n transition: {\n type: 'spring',\n stiffness: 300,\n damping: 100,\n },\n },\n }\n\n const bubbleVariants = {\n hidden: {\n opacity: 0,\n y: '2rem',\n },\n show: {\n opacity: 1,\n y: '0rem',\n transition: {\n type: 'spring',\n stiffness: 300,\n damping: 100,\n },\n },\n }\n\n return (\n \n \n {headshots.map(hs => (\n \n \n \n ))}\n \n\n \n {bubbles.map(b => (\n \n \n \n \n {b.headshot.name}:\n \n \n \n \n ))}\n \n \n )\n}\n\nDialogueContent.propTypes = {\n bubbles: PropTypes.arrayOf(PropTypes.object).isRequired,\n headshots: PropTypes.arrayOf(PropTypes.object).isRequired,\n}\n\nexport default function Dialogue({ referenceTask }) {\n const [{ audioUrl, ...activity }, dispatchActivity] = useActivityContext()\n\n // Use the referenceTask if one is provided, otherwise use the activity's task\n const task = referenceTask || activity.task\n const {\n taskable: { headshots, bubbles },\n } = task\n\n const [isPending, setIsPending] = useState(false)\n\n async function handleFinished() {\n setIsPending(true)\n const { data } = await postAttempt({ activity_id: activity.id })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n return (\n \n \n\n \n\n \n \n \n \n \n \n )\n}\n\nDialogue.defaultProps = {\n referenceTask: null,\n}\n\nDialogue.propTypes = {\n referenceTask: PropTypes.shape(taskPropShape),\n}\n","import styled from 'styled-components'\nimport { media } from '@redriverpress/system'\n\nconst StyledHtmlContent = styled.div`\n /* Hide empty paragraphs */\n p:empty,\n p:blank {\n display: none;\n }\n\n /* prevent writers from underlining text and having it show up as images */\n u {\n text-decoration: none;\n }\n\n /* define bold */\n strong,\n b {\n font-weight: 700;\n }\n\n /* on the off chance the post contains a link */\n a {\n background-image: linear-gradient(\n transparent 50%,\n ${props => props.theme.colors.blue700} 50%\n );\n background-position: 0 95%;\n background-repeat: repeat-x;\n background-size: 2px 2px;\n color: ${props => props.theme.colors.black};\n cursor: pointer;\n text-decoration: none;\n transition: color 0.15s ease-out;\n -webkit-tap-highlight-color: transparent;\n }\n a:hover {\n color: ${props => props.theme.colors.blue700};\n }\n\n /* Make videos responsive (requires use of videoWrapper div) */\n .videoWrapper {\n position: relative;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n border-radius: ${props => props.theme.radii.rounded};\n iframe,\n object,\n embed {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n }\n\n /* Tweet Embeds importants because they do inline styles :( */\n .twitter-tweet {\n margin-top: 0 !important;\n margin-bottom: ${props => props.theme.space[3]} !important;\n ${media.sm`\n margin-bottom: ${props => props.theme.space[4]} !important;\n `}\n }\n\n p .twitter-tweet {\n margin: 0 auto !important;\n }\n\n /* Horizontal Rule */\n hr {\n border: none;\n width: 100%;\n height: 2px;\n color: ${props => props.theme.colors.gray200};\n background-color: ${props => props.theme.colors.gray200};\n text-align: center;\n margin-top: 0;\n }\n\n /* Blockquote */\n blockquote {\n background-color: ${props => props.theme.colors.gray100};\n padding: ${props => props.theme.space[3]} 1.5rem;\n border-radius: ${props => props.theme.radii.rounded};\n margin-top: 0;\n display: inline-block;\n margin-left: 0;\n margin-right: 0;\n font-size: ${props => props.theme.fontSizes[0]};\n ${media.md`\n padding: ${props => props.theme.space[4]};\n `}\n p {\n font-size: ${props => props.theme.fontSizes[2]};\n margin-bottom: ${props => props.theme.space[3]};\n margin-top: 0;\n text-align: left;\n &:last-child {\n margin-bottom: 0;\n }\n ${media.md`\n font-size: ${props => props.theme.fontSizes[3]};\n `}\n }\n p.attribution {\n font-size: ${props => props.theme.fontSizes[0]};\n margin: 0;\n max-width: 100%;\n }\n }\n\n /* Make images responsive */\n img {\n max-width: 100%;\n display: block;\n border-radius: ${props => props.theme.radii.rounded};\n height: auto !important; /* !important because ckeditor always assigns a height to an image and our writers may not remove it */\n }\n img.contrast {\n box-shadow: ${props => props.theme.shadows[1]};\n }\n p.caption {\n margin-top: calc(\n -${props => props.theme.space[3]} - ${props => props.theme.space[2]}\n ); /* butt this up against the previous element (typically image) */\n font-size: ${props => props.theme.fontSizes[0]};\n color: ${props => props.theme.colors.gray700};\n a {\n color: ${props => props.theme.colors.gray700};\n background-image: linear-gradient(\n transparent 50%,\n ${props => props.theme.colors.gray700} 50%\n );\n &:hover {\n color: ${props => props.theme.colors.black};\n background-image: linear-gradient(\n transparent 50%,\n ${props => props.theme.colors.black} 50%\n );\n }\n }\n }\n\n /* Headings */\n /* These are defined as a step down from default, with customizations as per blog */\n h1 {\n font-weight: 600;\n font-size: ${props => props.theme.fontSizes[4]};\n letter-spacing: ${props => props.theme.letterSpacings.condensed};\n line-height: ${props => props.theme.lineHeights.heading};\n margin-top: 0;\n text-rendering: optimizeLegibility;\n text-transform: none;\n ${media.md`\n font-size: ${props => props.theme.fontSizes[5]};\n `}\n }\n h2 {\n font-weight: 600;\n font-size: ${props => props.theme.fontSizes[3]};\n line-height: ${props => props.theme.lineHeights.heading};\n margin-top: 0;\n text-rendering: optimizeLegibility;\n text-transform: none;\n ${media.md`\n font-size: ${props => props.theme.fontSizes[4]};\n letter-spacing: ${props => props.theme.letterSpacings.narrow};\n `}\n }\n h3 {\n font-weight: 600;\n font-size: ${props => props.theme.fontSizes[2]};\n letter-spacing: normal;\n line-height: ${props => props.theme.lineHeights.heading};\n margin-top: 0;\n text-rendering: optimizeLegibility;\n text-transform: none;\n ${media.md`\n font-size: ${props => props.theme.fontSizes[3]};\n `}\n }\n h4,\n h5,\n h6 {\n font-weight: 600;\n font-size: ${props => props.theme.fontSizes[1]};\n letter-spacing: normal;\n line-height: ${props => props.theme.lineHeights.body};\n margin-top: 0;\n text-rendering: optimizeLegibility;\n text-transform: none;\n }\n h4 {\n font-weight: 700;\n }\n h6 {\n font-size: 0.7rem; /* fs-smallCapsOnly */\n text-transform: uppercase;\n letter-spacing: ${props => props.theme.letterSpacings.wide};\n }\n\n /* Reset text colors in case of span overrides... */\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n p:not(.caption),\n li,\n span,\n div {\n background: transparent;\n color: ${props => props.theme.colors.black};\n }\n\n /* In case someone links a heading */\n h1 a,\n h2 a,\n h3 a,\n h4 a,\n h5 a,\n h6 a {\n background-image: linear-gradient(\n transparent 50%,\n ${props => props.theme.colors.black} 50%\n );\n }\n\n /* Element Spacing */\n p,\n ul,\n ol,\n blockquote,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n hr,\n iframe,\n .whiteBox,\n .videoWrapper,\n address,\n div:not([class]),\n table {\n margin-bottom: ${props => props.theme.space[3]};\n ${media.sm`\n margin-bottom: ${props => props.theme.space[4]};\n `}\n }\n .videoWrapper p iframe,\n p iframe,\n p > img,\n table-container table {\n margin-bottom: 0;\n }\n\n /* Straight-up iframes */\n iframe {\n max-width: 100%;\n display: block;\n border-radius: ${props => props.theme.radii.rounded};\n }\n\n /* Lists */\n ul {\n margin-top: 0;\n list-style-position: outside;\n padding-left: ${props => props.theme.space[3]};\n margin-left: ${props => props.theme.space[1]};\n }\n ol {\n margin-top: 0;\n padding-left: calc(\n ${props => props.theme.space[4]} - ${props => props.theme.space[2]}\n );\n }\n li {\n margin-bottom: ${props => props.theme.space[3]};\n &:last-child {\n margin-bottom: 0;\n }\n }\n li {\n ol,\n ul {\n margin-top: ${props => props.theme.space[3]};\n }\n }\n /* safety first: space all lists but if we want overrides, we use this class */\n .squishedList {\n li {\n margin-bottom: 0;\n }\n }\n\n /* Special Lists */\n ul.resources {\n list-style-type: none;\n margin-left: ${props => props.theme.space[3]};\n li {\n text-indent: calc(\n -${props => props.theme.space[4]} - ${props => props.theme.space[1]}\n );\n max-width: 100%;\n margin-left: 0;\n margin-right: 0;\n &:before {\n display: inline-block;\n text-align: center;\n width: ${props => props.theme.space[4]};\n margin-right: ${props => props.theme.space[1]};\n font-family: 'Font Awesome 5 Pro';\n font-weight: 300;\n text-indent: 0;\n }\n &.lesson:before {\n content: '\\f15c';\n }\n &.flashcards:before {\n content: '\\f0e7';\n }\n &.podcast:before {\n content: '\\f130';\n }\n &.youtube-video:before,\n &.video:before {\n content: '\\f03d';\n }\n &.digital:before {\n content: '\\f108';\n }\n &.blog-post:before {\n content: '\\f040';\n }\n &.collection:before,\n &.lesson-section:before {\n content: '\\f49c';\n }\n &.resources:before,\n &.resource:before {\n content: '\\f0ad';\n }\n &.calendar:before {\n content: '\\f073';\n }\n &.external-article:before,\n &.external-link:before {\n content: '\\f08e';\n }\n &.correct:before {\n content: '\\f00c';\n }\n &.positive:before {\n content: '\\f067';\n }\n &.incorrect:before {\n content: '\\f00d';\n }\n &.negative:before {\n content: '\\f068';\n }\n &.question:before {\n content: '\\f128';\n }\n }\n }\n\n .ckeditor-html5-audio {\n margin-bottom: ${props => props.theme.space[4]};\n text-align: left !important;\n audio {\n max-width: 100%;\n }\n }\n\n .whiteBox,\n .noteBox {\n background-color: ${props => props.theme.colors.gray100};\n border-radius: ${props => props.theme.radii.rounded};\n padding: ${props => props.theme.space[3]} 1.5rem;\n ${media.md`\n padding: ${props => props.theme.space[4]};\n `}\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n p,\n ul,\n ol {\n margin-bottom: ${props => props.theme.space[3]};\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-weight: 700;\n }\n & > *:last-child {\n margin-bottom: 0;\n }\n }\n\n /* Tables : in case of emergency */\n table {\n text-align: left;\n background-color: ${props => props.theme.colors.white};\n box-shadow: ${props => props.theme.shadows[1]};\n border-radius: ${props => props.theme.radii.rounded};\n overflow: hidden;\n border-spacing: 0;\n border-collapse: separate;\n\n tr {\n td,\n th {\n border-bottom: 2px solid ${props => props.theme.colors.gray100};\n padding: ${props => props.theme.space[2]};\n ${media.sm`\n padding: ${props => props.theme.space[2]} ${props =>\n props.theme.space[3]};\n `}\n }\n }\n\n tbody:last-child tr:last-child {\n th,\n td {\n border-width: 0;\n }\n }\n\n th,\n td {\n vertical-align: top;\n font-size: 0.75rem; /* just for default :( */\n ${media.sm`\n font-size: ${props => props.theme.fontSizes[0]};\n `}\n ${media.lg`\n font-size: ${props => props.theme.fontSizes[1]};\n `}\n }\n\n thead {\n th {\n font-weight: 700;\n }\n }\n\n tbody {\n th {\n font-weight: 600;\n }\n td {\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: ${props => props.theme.fontSizes[1]};\n line-height: ${props => props.theme.lineHeights.body};\n font-weight: 700;\n letter-spacing: normal;\n text-transform: none;\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n p,\n ol,\n ul {\n font-size: inherit;\n margin-bottom: ${props => props.theme.space[2]};\n margin-top: 0;\n }\n ul,\n ol {\n padding-left: ${props => props.theme.space[3]};\n margin-left: ${props => props.theme.space[1]};\n }\n p,\n li {\n max-width: auto;\n margin-left: 0;\n margin-right: 0;\n }\n & > *:last-child {\n margin-bottom: 0;\n }\n li {\n margin-bottom: ${props => props.theme.space[2]};\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n }\n }\n table.dialogue {\n tbody {\n td:not(:last-child),\n th {\n padding-right: 0;\n }\n }\n }\n`\n\nexport default StyledHtmlContent\n","import DOMPurify from 'dompurify'\nimport PropTypes from 'prop-types'\nimport parse, { attributesToProps } from 'html-react-parser'\nimport { useState } from 'react'\n\nimport {\n Box,\n BlockClicks,\n Button,\n Icon,\n LoadingSpinner,\n Text,\n} from '@redriverpress/system'\n\nimport LightboxImage from 'Common/components/LightboxImage'\nimport ImmersiveReaderContent from 'Packages/tasks/components/ImmersiveReaderContent'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\n\nimport StyledHtmlContent from './StyledHtmlContent'\nimport {\n useActivityContext,\n createAttempt,\n setPosition,\n results,\n} from '../../context/activity'\n\n// Allow iframes and the frameborder attribute;\n// we need these for embedding videos\n// See DOMPurify docs: https://github.com/cure53/DOMPurify#can-i-configure-dompurify\nconst sanitizeOptions = {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['frameborder', 'allowfullscreen', 'allow'],\n}\n\nconst immersiveReaderSanitizeOptions = {\n FORBID_TAGS: ['img', 'iframe'],\n ADD_ATTR: ['frameborder', 'allowfullscreen', 'allow'],\n}\n\n// Replace img tags with the LightboxImage component\nconst parseOptions = {\n replace: domNode => {\n if (domNode.name === 'img') {\n const { src, alt } = attributesToProps(domNode.attribs)\n return \n }\n },\n}\n\nexport function ReadWatchListenContent2({ title, content, isReference }) {\n const sanitizedContent = DOMPurify.sanitize(content, sanitizeOptions)\n const immersiveReaderSanitizedContent = DOMPurify.sanitize(\n content,\n immersiveReaderSanitizeOptions\n )\n return (\n \n {immersiveReaderSanitizedContent.length > 50 && (\n \n \n \n )}\n {/* When an RWL2 is loaded as a reference task, do not enable modal images */}\n {isReference ? (\n \n ) : (\n \n {parse(sanitizedContent, parseOptions)}\n \n )}\n \n )\n}\n\nReadWatchListenContent2.defaultProps = {\n isReference: false,\n title: '',\n}\n\nReadWatchListenContent2.propTypes = {\n content: PropTypes.string.isRequired,\n title: PropTypes.string,\n isReference: PropTypes.bool,\n}\n\nexport default function ReadWatchListen2() {\n const [{ task, ...activity }, dispatchActivity] = useActivityContext()\n\n const {\n taskable: { content },\n } = task\n\n const [isPending, setIsPending] = useState(false)\n\n async function handleFinished() {\n setIsPending(true)\n const { data } = await postAttempt({ activity_id: activity.id })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n return (\n \n \n\n \n \n \n \n \n \n )\n}\n","/* eslint-disable camelcase */\nimport xhr from 'Common/utils/xhr'\nimport { activitiesEndpoint } from 'Endpoints'\n\nexport default function postAttempt({ activity_id, ...data }) {\n return xhr({\n url: `${activitiesEndpoint}/${activity_id}/attempts`,\n method: 'POST',\n data,\n })\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { Box, List, Text } from '@redriverpress/system'\n\nimport ResultsImage from './ResultsImage'\nimport activityPropShape from '../../propShapes/activity'\n\nexport default function Results({ activity }) {\n const {\n attempts: [attempt],\n taskItems: words,\n } = activity\n\n const {\n attemptable: { pairs },\n } = attempt\n\n const getUrlById = wordId => R.find(R.propEq('id', wordId), words).image_url\n\n const renderPair = (pair, index, array) => {\n const isCorrect = R.equals(pair.word.id, pair.matched_word.id)\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n {!isCorrect && (\n \n Correct answer:{' '}\n \n {pair.matched_word.content}\n \n \n )}\n \n \n \n )\n }\n\n return (\n \n {pairs.map(renderPair)}\n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { List, Text } from '@redriverpress/system'\n\nimport activityPropShape from '../../propShapes/activity'\nimport renderAnswerParagraphs from './renderAnswerParagraphs'\nimport { CorrectWrapper, IncorrectWrapper } from './answerWrappers'\n\nexport default function Results({ activity }) {\n const { attempts, taskItems: paragraphs } = activity\n\n const getAttemptForElement = el =>\n R.find(R.pathEq(['attemptable', 'paragraph_element_id'], el.id), attempts)\n\n function renderBlank(el, index) {\n const {\n correct,\n attemptable: { content: response },\n } = getAttemptForElement(el)\n const { fragment } = el\n return correct ? (\n \n {el.content}\n {fragment && fragment}\n \n ) : (\n \n {response}\n \n {el.content}\n \n {fragment && fragment}\n \n )\n }\n\n return (\n \n {renderAnswerParagraphs({ paragraphs, blankRenderer: renderBlank })}\n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { Box, Icon, List, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport activityPropShape from '../../propShapes/activity'\n\nexport default function Results({ activity }) {\n const {\n attempts: [attempt],\n taskItems: words,\n } = activity\n\n const {\n attemptable: { pairs },\n } = attempt\n\n const getDefinitionById = wordId =>\n R.find(R.propEq('id', wordId), words).definition\n\n const renderPair = (pair, index, array) => {\n const isCorrect = R.equals(pair.word.id, pair.matched_word.id)\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n {pair.matched_word.content}\n \n \n \n {!isCorrect && (\n \n Correct answer:{' '}\n \n {pair.word.content}\n \n \n )}\n \n \n \n )\n }\n\n return (\n \n {pairs.map(renderPair)}\n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\nimport styled from 'styled-components'\n\nimport {\n Box,\n Icon,\n Image,\n List,\n SimpleAudio,\n Text,\n} from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport activityPropShape from '../../propShapes/activity'\n\nconst SetBold700 = styled(Box)`\n strong {\n font-weight: 700;\n }\n`\n\nexport default function Results({ activity }) {\n const { attempts, taskItems: questions } = activity\n\n const renderAttempt = (attempt, index, array) => {\n const { correct } = attempt\n const question = R.find(\n R.propEq('id', attempt.attemptable.question_id),\n questions\n )\n\n const selectedOption = R.find(\n R.propEq('id', attempt.attemptable.answer_id),\n question.answers\n )\n\n const givenAnswer = selectedOption?.content || ''\n\n const { content: correctAnswer } = R.find(\n R.propEq('correct', true),\n question.answers\n )\n\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n {question.image_url && !question.audio_url && (\n \n )}\n {question.audio_url && !question.image_url && (\n \n \n \n )}\n {question.content && (\n \n \n \n )}\n \n \n \n \n \n {`${givenAnswer}`}\n \n \n {R.not(correct) && (\n \n \n \n \n \n {`${correctAnswer}`}\n \n \n )}\n \n \n \n )\n }\n\n return (\n \n \n {attempts.map(renderAttempt)}\n \n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { Fragment } from 'react'\nimport R from 'ramda'\n\nimport { List, Box, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Headshot from './Headshot'\nimport Bubble from './Bubble'\nimport CorrectnessIcon from './CorrectnessIcon'\nimport activityPropShape from '../../propShapes/activity'\nimport getCorrectAnswer from './getCorrectAnswer'\n\nexport default function Results({ activity }) {\n const {\n taskItems: bubbles,\n attempts: [attempt],\n task,\n } = activity\n\n const {\n attemptable: { bubble_ids },\n } = attempt\n\n const correctAnswer = R.map(R.prop('id'), getCorrectAnswer(task))\n const bubbleIndex = R.indexBy(R.prop('id'), bubbles)\n\n const givenAnswer = bubble_ids.map((id, index) => ({\n bubble: bubbleIndex[id],\n correct: R.equals(correctAnswer[index], id),\n correctPosition: R.inc(correctAnswer.indexOf(id)),\n }))\n\n return (\n \n \n {givenAnswer.map((answer, index) => (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n \n {answer.bubble.headshot.name}\n \n \n \n {!answer.correct && (\n \n Correct position:{' '}\n \n #{answer.correctPosition}\n \n \n )}\n \n \n \n ))}\n \n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport {\n Box,\n Icon,\n Image,\n List,\n Text,\n SimpleAudio,\n} from '@redriverpress/system'\n\nimport activityPropShape from '../../propShapes/activity'\n\nfunction Answer({ borderColor, index, word, correct, givenAnswer }) {\n const { content: correctAnswer } = word\n\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n {word.audio_url && (\n \n \n \n )}\n\n {word.image_url && (\n \n )}\n\n \n \n \n \n \n {`${givenAnswer}`}\n \n \n {R.not(correct) && (\n \n \n \n \n \n {`${correctAnswer}`}\n \n \n )}\n \n \n \n )\n}\n\nexport default function Results({ activity }) {\n const { attempts, taskItems: words } = activity\n\n const renderAttempt = (attempt, index, array) => {\n const { correct } = attempt\n const word = R.find(R.propEq('id', attempt.attemptable.word_id), words)\n const { spell_attempt: givenAnswer } = attempt.attemptable\n\n return (\n \n )\n }\n\n return (\n \n \n {attempts.map(renderAttempt)}\n \n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n\nAnswer.propTypes = {\n index: PropTypes.number.isRequired,\n borderColor: PropTypes.string,\n word: PropTypes.shape({\n audio_url: PropTypes.string,\n image_url: PropTypes.string,\n content: PropTypes.string.isRequired,\n }).isRequired,\n correct: PropTypes.bool.isRequired,\n givenAnswer: PropTypes.string.isRequired,\n}\n\nAnswer.defaultProps = {\n borderColor: 'gray200',\n}\n","import PropTypes from 'prop-types'\nimport { Fragment } from 'react'\nimport R from 'ramda'\n\nimport { List, Box, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Sentence from './Sentence'\nimport CorrectnessIcon from '../putInOrder/CorrectnessIcon'\nimport activityPropShape from '../../propShapes/activity'\nimport getCorrectAnswer from './getCorrectAnswer'\n\nexport default function Results({ activity }) {\n const {\n taskItems: sentences,\n attempts: [attempt],\n task,\n } = activity\n\n const {\n attemptable: { sentence_ids },\n } = attempt\n\n const correctAnswer = R.map(R.prop('id'), getCorrectAnswer(task))\n const sentenceIndex = R.indexBy(R.prop('id'), sentences)\n\n const givenAnswer = sentence_ids.map((id, index) => ({\n sentence: sentenceIndex[id],\n correct: R.equals(correctAnswer[index], id),\n correctPosition: R.inc(correctAnswer.indexOf(id)),\n }))\n\n return (\n \n \n {givenAnswer.map((answer, index) => (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n \n {!answer.correct && (\n \n Correct position:{' '}\n \n #{answer.correctPosition}\n \n \n )}\n \n \n \n ))}\n \n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { Box, Icon, List, Text } from '@redriverpress/system'\n\nimport activityPropShape from '../../propShapes/activity'\n\nexport default function Results({ activity }) {\n const { attempts, taskItems: statements } = activity\n\n const renderAttempt = (attempt, index, array) => {\n const { correct } = attempt\n const assertion = R.path(['attemptable', 'assertion'], attempt)\n const { content } = R.find(\n R.propEq('id', R.path(['attemptable', 'statement_id'], attempt)),\n statements\n )\n\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n {content}\n \n \n \n \n \n You answered:{' '}\n {`${assertion}`}\n \n \n {R.not(correct) && (\n \n \n \n \n \n Correct answer:{' '}\n \n {`${R.not(assertion)}`}\n \n \n \n )}\n \n \n \n )\n }\n\n return (\n \n \n {attempts.map(renderAttempt)}\n \n \n )\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { Box, List, Text } from '@redriverpress/system'\n\nimport ResultsImage from './ResultsImage'\n\nexport default function AnswerKey({ taskable }) {\n const { words } = taskable\n\n const renderWord = (word, index, array) => {\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n \n )\n }\n\n return (\n \n {words.map(renderWord)}\n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n words: PropTypes.arrayOf(\n PropTypes.shape({\n image_url: PropTypes.string.isRequired,\n content: PropTypes.string.isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { Fragment } from 'react'\n\nimport { List } from '@redriverpress/system'\n\nimport renderAnswerParagraphs from './renderAnswerParagraphs'\nimport { CorrectWrapper } from './answerWrappers'\n\nexport default function AnswerKey({ taskable }) {\n const { paragraphs } = taskable\n\n const renderBlank = (el, index) => {\n const { content, fragment } = el\n return (\n \n {content}\n {fragment && fragment}\n \n )\n }\n\n return (\n \n {renderAnswerParagraphs({ paragraphs, blankRenderer: renderBlank })}\n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n paragraphs: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { Box, Icon, Text, List } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nexport default function AnswerKey({ taskable }) {\n const { words } = taskable\n\n const renderWord = (word, index, array) => {\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n {word.content}\n \n \n \n \n \n \n )\n }\n return (\n \n {words.map(renderWord)}\n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n words: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n definition: PropTypes.string.isRequired,\n id: PropTypes.number.isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\nimport styled from 'styled-components'\n\nimport {\n Box,\n Icon,\n Image,\n List,\n SimpleAudio,\n Text,\n} from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nconst SetBold700 = styled(Box)`\n strong {\n font-weight: 700;\n }\n`\n\nexport default function AnswerKey({ taskable }) {\n const { questions } = taskable\n\n const renderQuestion = (question, index, array) => {\n const answer = question.answers.filter(a => a.correct)[0]\n\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n {question.image_url && !question.audio_url && (\n \n )}\n {question.audio_url && !question.image_url && (\n \n \n \n )}\n {question.content && (\n \n \n \n )}\n \n \n \n \n \n {answer.content}\n \n \n \n \n \n )\n }\n\n return (\n \n \n {questions.map(renderQuestion)}\n \n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n questions: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n answers: PropTypes.arrayOf(\n PropTypes.shape({\n correct: PropTypes.bool.isRequired,\n content: PropTypes.string.isRequired,\n })\n ).isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { Box, List, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport SuggestedAnswers from '../SuggestedAnswers'\n\nexport default function AnswerKey({ taskable }) {\n const { questions } = taskable\n\n const renderQuestion = (question, index, array) => {\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n {!R.isEmpty(question.suggested_answers) && (\n \n )}\n \n \n \n )\n }\n\n return (\n \n \n {questions.map(renderQuestion)}\n \n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n questions: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n id: PropTypes.number.isRequired,\n suggested_answers: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n id: PropTypes.number.isRequired,\n })\n ).isRequired,\n }).isRequired\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { List, Box, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Headshot from './Headshot'\nimport Bubble from './Bubble'\nimport CorrectnessIcon from './CorrectnessIcon'\n\nexport default function AnswerKey({ taskable }) {\n const { bubbles } = taskable\n\n return (\n \n {bubbles.map((bubble, index) => (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n \n {bubble.headshot.name}\n \n \n \n \n \n \n ))}\n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n bubbles: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRe,\n content: PropTypes.string.isRequired,\n headshot: PropTypes.shape({\n icon_url: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n }).isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport {\n Box,\n Icon,\n Image,\n List,\n Text,\n SimpleAudio,\n} from '@redriverpress/system'\n\nfunction Answer({ borderColor, index, word }) {\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n {word.audio_url && (\n \n \n \n )}\n\n {word.image_url && (\n \n )}\n\n \n \n \n \n \n {word.content}\n \n \n \n \n \n )\n}\n\nAnswer.propTypes = {\n index: PropTypes.number.isRequired,\n borderColor: PropTypes.string,\n word: PropTypes.shape({\n audio_url: PropTypes.string,\n image_url: PropTypes.string,\n content: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nAnswer.defaultProps = {\n borderColor: 'gray200',\n}\n\nexport default function AnswerKey({ taskable }) {\n const { words } = taskable\n\n const renderWord = (word, index, array) => {\n return (\n \n )\n }\n\n return (\n \n \n {words.map(renderWord)}\n \n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n words: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { List, Box, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Sentence from './Sentence'\nimport CorrectnessIcon from '../putInOrder/CorrectnessIcon'\n\nexport default function AnswerKey({ taskable }) {\n const { sentences } = taskable\n\n return (\n \n {sentences.map((sentence, index) => (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n \n \n \n \n \n \n ))}\n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n sentences: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { Box, List, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport SuggestedAnswers from '../SuggestedAnswers'\n\nexport default function AnswerKey({ taskable }) {\n const { questions } = taskable\n\n const renderQuestion = (question, index, array) => {\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n \n {!R.isEmpty(question.suggested_answers) && (\n \n )}\n \n \n \n )\n }\n\n return (\n \n {questions.map(renderQuestion)}\n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n questions: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n id: PropTypes.number.isRequired,\n suggested_answers: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n id: PropTypes.number.isRequired,\n })\n ).isRequired,\n }).isRequired\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { Box, Icon, List, Text } from '@redriverpress/system'\n\nexport default function AnswerKey({ taskable }) {\n const { statements } = taskable\n\n const renderStatement = (statement, index, array) => {\n return (\n \n \n \n \n {R.inc(index)}.\n \n \n \n {statement.content}\n \n \n \n \n \n \n {statement.correct ? 'True' : 'False'}\n \n \n \n \n \n \n )\n }\n\n return (\n \n \n {statements.map(renderStatement)}\n \n \n )\n}\n\nAnswerKey.propTypes = {\n taskable: PropTypes.shape({\n statements: PropTypes.arrayOf(\n PropTypes.shape({\n content: PropTypes.string.isRequired,\n id: PropTypes.number.isRequired,\n correct: PropTypes.bool.isRequired,\n })\n ).isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useEffect, useState, Fragment } from 'react'\n\nimport { Audio, Box, Text, Icon, Textarea, Label } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nimport { ELLII_BOT_NAME } from 'Common/constants'\nimport ScoredBy from '../ScoredBy'\nimport FeedbackSection from '../FeedbackSection'\nimport SuggestedAnswers from '../SuggestedAnswers'\nimport AnswerNumber from '../AnswerNumber'\nimport activityPropShape from '../../propShapes/activity'\nimport RatingSelector from '../utils/RatingSelector'\n\nfunction ResultQuestion({\n attempt,\n index,\n question,\n feedback,\n onFeedbackChange,\n isTeacher,\n isArchived,\n}) {\n const [percentage, setPercentage] = useState(\n Math.ceil(Math.floor(parseFloat(feedback?.percentage) * 100))\n )\n\n const [audio, setAudio] = useState(feedback?.audio || null)\n const attemptContent = R.path(['attemptable', 'content'], attempt) || ''\n const [dirty, setDirty] = useState()\n\n const questionContent = renderInlineMarkdown(question.content)\n\n // We're not setting these variables here already,\n // because the values for it aren't available when the component mounts\n const [scoredDate, setScoredDate] = useState('')\n const [authorName, setAuthorName] = useState('')\n\n const getAuthorName = () => {\n if (attempt?.auto_scored) {\n return ELLII_BOT_NAME\n }\n\n return `${feedback?.teacher?.firstName} ${feedback?.teacher?.lastName}`\n }\n\n const getUpdatedDate = () => {\n return attempt?.auto_scored\n ? attempt?.auto_score_at\n : attempt?.manual_score_at\n }\n\n // So we're using these useEffect methods to update the state variables once the values\n // are reachable in the context.\n // Also, in this component we have the ability to submit an update for the feedback, so\n // these two will do the proper value updates\n useEffect(() => {\n const newPercentage = feedback?.percentage\n ? Math.ceil(Math.floor(parseFloat(feedback?.percentage) * 100))\n : 0\n\n if (!feedback?.id) {\n setDirty(false)\n setPercentage(newPercentage)\n return\n }\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n setPercentage(newPercentage)\n }, [feedback])\n\n useEffect(() => {\n if (!attempt) return\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n }, [attempt])\n\n const onChangeScore = value => {\n setPercentage(value)\n setDirty(true)\n onFeedbackChange(attempt.id, parseFloat(value / 100), feedback.text_content)\n }\n\n const onChangeComment = event => {\n setDirty(true)\n const removeAudio = !!feedback?.audio_url && !audio\n onFeedbackChange(\n attempt.id,\n parseFloat(percentage / 100),\n event.target.value,\n removeAudio\n )\n }\n\n const handleAudioDeletion = () => {\n setAudio(null)\n setDirty(true)\n }\n\n // CONDITIONS TO DISPLAY THE COMPONENTS\n const shouldShowScoredByLabel =\n isTeacher && attempt && (feedback?.id || attempt?.auto_scored)\n\n const shouldShowTeacherFeedbackStudentSide =\n attempt &&\n (feedback?.id || attempt.auto_scored) &&\n (!isTeacher || isArchived)\n\n const shouldShowScoreAndCommentAreaTeacherSide =\n isTeacher && !isArchived && attempt\n\n return (\n \n \n {/* Question Header */}\n \n \n \n\n {/* Question content */}\n \n\n {/* Attempt content */}\n {attemptContent && (\n \n {attemptContent.split('\\n').map((p, idx) => (\n \n {p}\n \n ))}\n \n )}\n\n {/* ScoredBy label */}\n {shouldShowScoredByLabel && (\n \n \n \n )}\n\n {/* Teacher feedback - Student side */}\n {shouldShowTeacherFeedbackStudentSide && (\n \n )}\n\n {/* Score and comment area - Teacher side */}\n {shouldShowScoreAndCommentAreaTeacherSide && (\n \n \n \n \n \n \n \n {audio && (\n \n )}\n {dirty && (\n \n )}\n \n )}\n\n {/* Suggested answers */}\n {!R.isEmpty(question.suggested_answers) && (\n \n )}\n \n \n )\n}\n\nResultQuestion.defaultProps = {\n feedback: null,\n attempt: null,\n isArchived: false,\n}\n\nResultQuestion.propTypes = {\n attempt: PropTypes.shape(activityPropShape),\n index: PropTypes.number.isRequired,\n question: PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n suggested_answers: PropTypes.arrayOf({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n }),\n }).isRequired,\n feedback: PropTypes.shape({\n id: PropTypes.number,\n percentage: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n text_content: PropTypes.string,\n sourceable_id: PropTypes.number.isRequired,\n sourceable_type: PropTypes.string.isRequired,\n audio: PropTypes.string,\n audio_url: PropTypes.string,\n teacher: PropTypes.shape({\n isCurrentUser: PropTypes.bool,\n firstName: PropTypes.string,\n lastName: PropTypes.string,\n }),\n }),\n onFeedbackChange: PropTypes.func.isRequired,\n isTeacher: PropTypes.bool.isRequired,\n isArchived: PropTypes.bool,\n}\n\nexport default ResultQuestion\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useState, useRef, useEffect } from 'react'\n\nimport { Box, Icon, List, Button, Loading } from '@redriverpress/system'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nimport ResultQuestion from './ResultQuestion'\nimport activityPropShape from '../../propShapes/activity'\nimport postFeedback from '../../services/postFeedback'\n\nfunction Results({\n activity,\n isTeacher,\n onFeedbackSent,\n student,\n isClassArchived,\n}) {\n const {\n attempts,\n task: {\n taskable: { questions },\n },\n } = activity\n\n const isArchived = () => {\n if (!isTeacher) return\n return student.isArchived || isClassArchived\n }\n\n const createFeedbackObjects = () => {\n return attempts.map(a => {\n return R.mergeLeft(a.feedback, {\n id: null,\n percentage: 0,\n text_content: '',\n sourceable_id: a.id,\n sourceable_type: a.type,\n grading_item_id: a.grading_item_id,\n })\n })\n }\n\n const [feedbacks, setFeedbacks] = useState(createFeedbackObjects())\n const [error, setError] = useState(false)\n const [loading, setLoading] = useState(false)\n const [activityHasUnsavedFeedback, setActivityHasUnsavedFeedback] = useState(\n false\n )\n\n useEffect(() => {\n setFeedbacks(createFeedbackObjects())\n setActivityHasUnsavedFeedback(false)\n }, [attempts])\n\n const findExistingFeedbackIndex = id =>\n R.findIndex(R.propEq('sourceable_id', id))(feedbacks)\n\n const hasContent = feedback =>\n R.not(\n feedback.percentage === teacherScoreValues.EMPTY_VALUE &&\n feedback.text_content.trim() === ''\n )\n\n const filterOutBlank = arr => R.filter(hasContent, arr)\n\n const itemRef = useRef(null)\n\n const handleFeedback = (id, percentage, content, removeAudio = false) => {\n const existingIndex = findExistingFeedbackIndex(id)\n const clonedFb = R.clone(feedbacks)\n clonedFb[existingIndex].percentage = percentage\n clonedFb[existingIndex].text_content = content\n clonedFb[existingIndex].remove_audio = removeAudio\n setActivityHasUnsavedFeedback(true)\n setFeedbacks(clonedFb)\n }\n\n const handleSubmitFeedback = () => {\n setLoading(true)\n setError(false)\n postFeedback({\n feedback: filterOutBlank(feedbacks),\n })\n .then(response => {\n setLoading(false)\n if (response.data.errors) {\n setError(true)\n } else {\n setFeedbacks(response.data)\n setActivityHasUnsavedFeedback(false)\n const scrolly = () =>\n itemRef.current.scrollIntoView({ behavior: 'smooth' })\n setTimeout(scrolly, 300)\n if (onFeedbackSent) onFeedbackSent()\n }\n })\n .catch(() => {\n setLoading(false)\n setError(true)\n })\n }\n\n if (loading) return \n\n return (\n \n {/* this following span is used to scroll to top after submitting feedback */}\n \n \n {questions.map((question, index) => {\n const attempt = attempts.find(\n a => a.attemptable.question_id === question.id\n )\n\n return (\n \n handleFeedback(id, percentage, content)\n }\n />\n )\n })}\n \n {isTeacher && (\n \n {error && (\n \n An error ocurred. Please try saving it again.\n \n )}\n \n Submit Feedback\n \n \n \n )}\n \n )\n}\n\nResults.defaultProps = {\n isTeacher: false,\n onFeedbackSent: undefined,\n student: null,\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n isTeacher: PropTypes.bool,\n onFeedbackSent: PropTypes.func,\n student: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n first_name: PropTypes.string,\n last_name: PropTypes.string,\n isArchived: PropTypes.bool,\n }),\n isClassArchived: PropTypes.bool.isRequired,\n}\n\nexport default Results\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useState, useEffect, Fragment } from 'react'\n\nimport {\n Audio,\n Box,\n Icon,\n Image,\n Link,\n Text,\n Textarea,\n Label,\n} from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nimport { ELLII_BOT_NAME } from 'Common/constants'\nimport ScoredBy from '../ScoredBy'\nimport FeedbackSection from '../FeedbackSection'\nimport SuggestedAnswers from '../SuggestedAnswers'\nimport AnswerNumber from '../AnswerNumber'\nimport activityPropShape from '../../propShapes/activity'\nimport RatingSelector from '../utils/RatingSelector'\n\nfunction ResultQuestion({\n attempt,\n index,\n question,\n feedback,\n onFeedbackChange,\n isTeacher,\n isArchived,\n}) {\n const [percentage, setPercentage] = useState(\n Math.ceil(Math.floor(parseFloat(feedback?.percentage) * 100))\n )\n const [audio, setAudio] = useState(feedback?.audio || null)\n const attemptAudio = R.path(['attemptable', 'audio'], attempt) || ''\n const [dirty, setDirty] = useState()\n\n const questionContent = renderInlineMarkdown(question.content)\n\n // We're not setting these variables here already,\n // because the values for it aren't available when the component mounts\n const [authorName, setAuthorName] = useState('')\n const [scoredDate, setScoredDate] = useState('')\n\n const getAuthorName = () => {\n if (attempt?.auto_scored) {\n return ELLII_BOT_NAME\n }\n\n return `${feedback?.teacher?.firstName} ${feedback?.teacher?.lastName}`\n }\n\n const getUpdatedDate = () => {\n return attempt?.auto_scored\n ? attempt?.auto_score_at\n : attempt?.manual_score_at\n }\n\n // So we're using these useEffect methods to update the state variables once the values\n // are reachable in the context.\n // Also, in this component we have the ability to submit an update for the feedback, so\n // these two will do the proper value updates\n useEffect(() => {\n const newPercentage = feedback?.percentage\n ? Math.ceil(Math.floor(parseFloat(feedback?.percentage) * 100))\n : 0\n\n if (!feedback?.id) {\n setDirty(false)\n setPercentage(newPercentage)\n return\n }\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n setPercentage(newPercentage)\n }, [feedback])\n\n useEffect(() => {\n if (!attempt) return\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n }, [attempt])\n\n const onChangeScore = value => {\n setPercentage(value)\n setDirty(true)\n onFeedbackChange(attempt.id, parseFloat(value / 100), feedback.text_content)\n }\n\n const onChangeComment = event => {\n setDirty(true)\n const removeAudio = !!feedback?.audio_url && !audio\n onFeedbackChange(\n attempt.id,\n parseFloat(percentage / 100),\n event.target.value,\n removeAudio\n )\n }\n\n const handleAudioDeletion = () => {\n setAudio(null)\n setDirty(true)\n }\n\n // CONDITIONS TO DISPLAY THE COMPONENTS\n const shouldShowScoredByLabel =\n isTeacher && attempt && (feedback?.id || attempt?.auto_scored)\n\n const shouldShowTeacherFeedbackStudentSide =\n feedback &&\n (feedback?.id || attempt?.auto_scored) &&\n (!isTeacher || isArchived)\n\n const shouldShowScoreAndCommentAreaTeacherSide =\n isTeacher && !isArchived && attempt\n\n return (\n \n \n {/* Question Header */}\n \n \n \n\n {/* Question content */}\n \n {question.image_url && (\n \n \n \n \n \n \n \n \n )}\n\n {/* Attempt content */}\n {attemptAudio ? (\n \n )}\n\n {/* ScoredBy label */}\n {shouldShowScoredByLabel && (\n \n \n \n )}\n\n {/* Teacher feedback - Student side */}\n {shouldShowTeacherFeedbackStudentSide && (\n \n )}\n\n {/* Score and comment area - Teacher side */}\n {shouldShowScoreAndCommentAreaTeacherSide && (\n \n \n \n \n \n \n \n {audio && (\n \n )}\n {dirty && (\n \n )}\n \n )}\n\n {/* Suggested answers */}\n {!R.isEmpty(question.suggested_answers) && (\n \n )}\n \n \n )\n}\n\nResultQuestion.defaultProps = {\n feedback: null,\n attempt: null,\n isArchived: false,\n}\n\nResultQuestion.propTypes = {\n attempt: PropTypes.shape(activityPropShape),\n index: PropTypes.number.isRequired,\n question: PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n image_url: PropTypes.string.isRequired,\n suggested_answers: PropTypes.arrayOf({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n }),\n }).isRequired,\n feedback: PropTypes.shape({\n id: PropTypes.number,\n percentage: PropTypes.string,\n text_content: PropTypes.string,\n sourceable_id: PropTypes.number.isRequired,\n sourceable_type: PropTypes.string.isRequired,\n audio: PropTypes.string,\n audio_url: PropTypes.string,\n teacher: PropTypes.shape({\n isCurrentUser: PropTypes.bool,\n firstName: PropTypes.string,\n lastName: PropTypes.string,\n }),\n }),\n onFeedbackChange: PropTypes.func.isRequired,\n isTeacher: PropTypes.bool.isRequired,\n isArchived: PropTypes.bool,\n}\n\nexport default ResultQuestion\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useState, useRef, useEffect } from 'react'\n\nimport {\n Box,\n Icon,\n List,\n Button,\n Loading,\n MonoButton,\n} from '@redriverpress/system'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nimport ResultQuestion from './ResultQuestion'\nimport activityPropShape from '../../propShapes/activity'\nimport postFeedback from '../../services/postFeedback'\n\nfunction Results({\n activity,\n isTeacher,\n onFeedbackSent,\n student,\n onClose,\n isClassArchived,\n}) {\n const {\n attempts,\n task: {\n taskable: { questions },\n },\n } = activity\n\n const isArchived = () => {\n if (!isTeacher) return\n return student.isArchived || isClassArchived\n }\n\n const createFeedbackObjects = () => {\n return attempts.map(a => {\n return R.mergeLeft(a.feedback, {\n id: null,\n percentage: 0,\n text_content: '',\n sourceable_id: a.id,\n sourceable_type: a.type,\n })\n })\n }\n\n const [feedbacks, setFeedbacks] = useState(createFeedbackObjects())\n const [error, setError] = useState(false)\n const [loading, setLoading] = useState(false)\n const [activityHasUnsavedFeedback, setActivityHasUnsavedFeedback] = useState(\n false\n )\n\n useEffect(() => {\n setFeedbacks(createFeedbackObjects())\n setActivityHasUnsavedFeedback(false)\n }, [attempts])\n\n const findExistingFeedbackIndex = id =>\n R.findIndex(R.propEq('sourceable_id', id))(feedbacks)\n\n const hasContent = feedback =>\n R.not(\n feedback.percentage === teacherScoreValues.EMPTY_VALUE &&\n feedback.text_content.trim() === ''\n )\n\n const filterOutBlank = arr => R.filter(hasContent, arr)\n\n const itemRef = useRef(null)\n\n const handleFeedback = (id, percentage, content) => {\n const existingIndex = findExistingFeedbackIndex(id)\n const clonedFb = R.clone(feedbacks)\n clonedFb[existingIndex].percentage = percentage\n clonedFb[existingIndex].text_content = content\n setActivityHasUnsavedFeedback(true)\n setFeedbacks(clonedFb)\n }\n\n const handleSubmitFeedback = () => {\n setLoading(true)\n setError(false)\n postFeedback({\n feedback: filterOutBlank(feedbacks),\n })\n .then(response => {\n setLoading(false)\n if (response.data.errors) {\n setError(true)\n } else {\n setFeedbacks(response.data)\n setActivityHasUnsavedFeedback(false)\n const scrolly = () =>\n itemRef.current.scrollIntoView({ behavior: 'smooth' })\n setTimeout(scrolly, 300)\n if (onFeedbackSent) onFeedbackSent()\n }\n })\n .catch(() => {\n setLoading(false)\n setError(true)\n })\n }\n\n if (loading) return \n\n return (\n \n {/* this following span is used to scroll to top after submitting feedback */}\n \n \n {questions.map((question, index) => {\n const attempt = attempts.find(\n a => a.attemptable.question_id === question.id\n )\n\n return (\n \n handleFeedback(id, percentage, content)\n }\n />\n )\n })}\n \n {isTeacher && (\n \n {error && (\n \n An error ocurred. Please try saving it again.\n \n )}\n \n \n \n Exit\n \n \n Submit Feedback\n \n \n \n \n )}\n \n )\n}\n\nResults.defaultProps = {\n isTeacher: false,\n onFeedbackSent: undefined,\n student: null,\n}\n\nResults.propTypes = {\n activity: PropTypes.shape(activityPropShape).isRequired,\n isTeacher: PropTypes.bool,\n onFeedbackSent: PropTypes.func,\n onClose: PropTypes.func.isRequired,\n student: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n first_name: PropTypes.string,\n last_name: PropTypes.string,\n isArchived: PropTypes.bool,\n }),\n isClassArchived: PropTypes.bool.isRequired,\n}\n\nexport default Results\n","import R from 'ramda'\nimport { useEffect, useState } from 'react'\nimport WebFont from 'webfontloader'\n\nimport { Box, SimpleAudio } from '@redriverpress/system'\n\nimport { DisplayFlashcard as Flashcard } from 'Packages/flashcards'\nimport { requestTextToSpeech } from 'Packages/tts'\nimport TransitionItems from 'Common/components/TransitionItems'\n\nimport { useActivityContext } from '../../context/activity'\n\nexport default function FlashcardSet() {\n const [\n {\n currentTaskItem: fc,\n position,\n task: {\n taskable: { tts_token: ttsToken, tts_url: ttsURL },\n },\n taskItems: flashcards,\n },\n ] = useActivityContext()\n\n // Create a state object with a key for every flashcard's id, initialize all to null\n const [audioUrls, setAudioUrls] = useState(() =>\n flashcards.reduce((urls, f) => ({ [f.id]: null, ...urls }), {})\n )\n\n // Fetches the current flashcard's audio URL from the TTS microservice,\n // and sets it in the component state\n const fetchAudioUrl = async () => {\n const { audio_url: audioUrl } = await requestTextToSpeech({\n text: fc.title,\n token: ttsToken,\n url: ttsURL,\n })\n setAudioUrls(urls => R.assoc(fc.id, audioUrl, urls))\n }\n\n useEffect(() => {\n // Fetch the current flashcard's audio URL only if not already set\n R.equals(audioUrls[fc.id], null) && fetchAudioUrl()\n }, [fc])\n\n // Load Quicksand on component mount\n useEffect(() => {\n WebFont.load({\n google: {\n families: ['Open Sans:400,400italic,600,700,800', 'Quicksand:700'],\n },\n })\n }, [])\n\n return (\n \n \n \n \n \n \n \n \n )\n}\n","import R from 'ramda'\nimport { useState } from 'react'\nimport styled from 'styled-components'\n\nimport {\n BlockClicks,\n Box,\n Button,\n Icon,\n Image,\n LoadingSpinner,\n Radio,\n SwitchInput,\n TaskAudio,\n Text,\n TransparentButton,\n theme,\n} from '@redriverpress/system'\n\nimport TransitionItems from 'Common/components/TransitionItems'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport ReferenceTask from '../ReferenceTask'\nimport {\n useActivityContext,\n createAttempts,\n setPosition,\n results,\n} from '../../context/activity'\nimport MissedAnswersModal from '../utils/modals/MissedAnswersModal'\nimport ReferenceWrapper from '../ReferenceWrapper'\n\nconst SetBold700 = styled(Box)`\n strong {\n font-weight: 700;\n }\n`\n\nexport default function MultipleChoice() {\n const [isPending, setIsPending] = useState(false)\n const [hideReference, setHideReference] = useState(false)\n\n const [isEmptiesModalOpen, setIsEmptiesModalOpen] = useState(false)\n const openEmptiesModal = () => setIsEmptiesModalOpen(true)\n const closeEmptiesModal = () => setIsEmptiesModalOpen(false)\n\n const [\n { currentTaskItem: qn, taskItems: questions, id: activityId, position },\n dispatchActivity,\n ] = useActivityContext()\n\n const [responses, setResponses] = useState(() =>\n questions.reduce((qs, q) => R.merge(qs, { [q.id]: null }), {})\n )\n\n const markAnswer = (qid, aid) => setResponses(R.assoc(qid, aid, responses))\n\n const answersIncomplete = R.any(R.isNil, R.values(responses))\n\n async function SubmitAnswers() {\n setIsPending(true)\n const attemptsResponse = await postAttempt({\n activity_id: activityId,\n homework_attempt: {\n attemptable_attributes: Object.keys(responses).map(qid => ({\n question_id: qid,\n answer_id: responses[qid],\n })),\n },\n })\n dispatchActivity(createAttempts(attemptsResponse.data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n function submitFromModal() {\n closeEmptiesModal()\n return SubmitAnswers()\n }\n\n function goToFirstEmpty() {\n // Get the Index of the first blank with no response\n const firstEmptyQuestionIndex = R.findIndex(\n ([, value]) => R.equals(value, null),\n Object.entries(responses)\n )\n\n closeEmptiesModal()\n dispatchActivity(setPosition(firstEmptyQuestionIndex))\n }\n\n const handleSubmit = () => {\n if (answersIncomplete) {\n return openEmptiesModal()\n }\n SubmitAnswers()\n }\n\n return (\n \n \n {/* LEFT SIDE */}\n \n {qn.audio_url && !qn.image_url && (\n \n \n \n )}\n {qn.image_url && !qn.audio_url && (\n <>\n \n {qn.image_caption && (\n \n {qn.image_caption}\n \n )}\n \n )}\n {qn.content && (\n \n \n \n )}\n {qn.answers.map(a => (\n \n markAnswer(qn.id, a.id)}\n />\n \n ))}\n\n \n {R.equals(qn, R.last(questions)) && (\n \n \n \n )}\n \n \n\n {/* Hide Reference Toggle */}\n {qn.reference_task && (\n \n setHideReference(!hideReference)}\n >\n Hide reference\n \n setHideReference(!hideReference)}\n height={['24px', null, '32px']}\n width={['44px', null, '56px']}\n />\n \n )}\n\n {/* RIGHT SIDE */}\n {qn.reference_task && !hideReference && (\n \n {qn.reference_task && (\n \n \n \n )}\n \n )}\n \n \n \n )\n}\n","import { useState } from 'react'\nimport R from 'ramda'\nimport arrayShuffle from 'array-shuffle'\nimport styled from 'styled-components'\n\nimport {\n Box,\n BlockClicks,\n Text,\n Button,\n Icon,\n LoadingSpinner,\n MotionBox,\n} from '@redriverpress/system'\n\nimport { Modal } from 'Common/components/modal'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Headshot from './Headshot'\nimport Bubble from './Bubble'\nimport CorrectnessIcon from './CorrectnessIcon'\nimport getCorrectAnswer from './getCorrectAnswer'\nimport { arrayMove } from './array'\nimport { containerVariants, bubbleVariants, hsVariants } from './animations'\nimport {\n sortableContainer,\n sortableElement,\n sortableHandle,\n} from './SortableList'\nimport {\n useActivityContext,\n createAttempt,\n setPosition,\n results,\n} from '../../context/activity'\n\nconst DialogContainer = sortableContainer(({ children }) => {\n return (\n \n {children}\n \n )\n})\n\nconst SortableBubble = styled(Bubble)`\n user-select: none;\n cursor: ${({ variant }) => variant !== 'success' && 'move'};\n`\n\nconst SortableHandle = sortableHandle(({ bubble, correct }) => {\n return (\n \n {correct && }\n \n {bubble.headshot.name}\n \n \n \n )\n})\n\nconst DialogItem = sortableElement(({ bubble, label, correct }) => {\n return (\n \n \n \n {label}\n \n \n \n \n \n )\n})\n\nconst isCorrect = correctAnswer => (bubble, index) => {\n return correctAnswer[index].id === bubble.id\n}\n\nconst getScore = (answerGiven, correctAnswer) => {\n return answerGiven.filter(isCorrect(correctAnswer)).length\n}\n\nconst triesLeftText = triesLeft => {\n return `${triesLeft} more ${triesLeft === 1 ? 'try' : 'tries'}`\n}\n\nconst maxAttempts = 3\n\nexport default function PutInOrder() {\n const [{ task, id: activityId }, dispatchActivity] = useActivityContext()\n // Shuffle bubbles. The correct order is the one from the definition.\n const [bubbles, setBubbles] = useState(() => {\n const taskBubbles = task.taskable.bubbles\n\n return arrayShuffle(taskBubbles)\n })\n const [isPending, setIsPending] = useState(false)\n const [attemptNumber, setAttemptNumber] = useState(1)\n const [isModalOpen, setModalOpen] = useState(false)\n // Track which position is locked\n const [lockedPositions, setLockedPositions] = useState(() => {\n return task.taskable.bubbles.map(() => false)\n })\n\n const { headshots } = task.taskable\n\n const correctAnswer = getCorrectAnswer(task)\n\n function handleSortEnd({ oldIndex, newIndex }) {\n setBubbles(state => arrayMove(state, oldIndex, newIndex, lockedPositions))\n }\n\n async function handleSubmit() {\n setIsPending(true)\n const { data } = await postAttempt({\n activity_id: activityId,\n homework_attempt: {\n attemptable_attributes: {\n bubble_ids: bubbles.map(bubble => bubble.id),\n },\n },\n })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n const openModal = () => setModalOpen(true)\n const closeModal = () => setModalOpen(false)\n const score = getScore(bubbles, correctAnswer)\n\n function handleFinish() {\n setIsPending(true)\n\n // Submit if the order is correct or max attempt were reached\n if (score === bubbles.length || attemptNumber === maxAttempts) {\n return handleSubmit()\n }\n\n openModal()\n setIsPending(false)\n }\n\n function handleRetry() {\n if (isPending) {\n return\n }\n\n window.scrollTo({ top: 0, behavior: 'smooth' })\n setLockedPositions(bubbles.map(isCorrect(correctAnswer)))\n setAttemptNumber(currentAttempt => currentAttempt + 1)\n closeModal()\n }\n\n return (\n \n \n {headshots.map(headshot => (\n \n \n \n ))}\n \n\n \n {bubbles.map((bubble, index) => (\n \n ))}\n \n\n \n \n \n \n \n\n \n \n \n \n You got {score} out of {bubbles.length} correct!\n {' '}\n You have {triesLeftText(maxAttempts - attemptNumber)}. Do you want\n to keep trying or submit?\n \n \n\n \n \n \n \n \n \n )\n}\n","import R from 'ramda'\nimport { useEffect, useState } from 'react'\n\nimport {\n BlockClicks,\n Box,\n Button,\n Icon,\n Image,\n LoadingSpinner,\n SimpleAudio,\n Text,\n Input,\n} from '@redriverpress/system'\n\nimport TransitionItems from 'Common/components/TransitionItems'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport { requestTextToSpeech } from 'Packages/tts'\n\nimport {\n useActivityContext,\n createAttempts,\n setPosition,\n results,\n} from '../../context/activity'\n\nexport default function SeeAndSpell() {\n const [\n {\n id: activityId,\n currentTaskItem: word,\n position,\n task: {\n taskable: { tts_token: ttsToken, tts_url: ttsURL },\n },\n taskItems: words,\n },\n dispatchActivity,\n ] = useActivityContext()\n\n // Create a state object with a key for every word's id, initialize all to null\n const [audioUrls, setAudioUrls] = useState(() =>\n words.reduce((urls, w) => ({ [w.id]: null, ...urls }), {})\n )\n\n // Fetches the current word's audio URL from the TTS microservice,\n // and sets it in the component state\n const fetchAudioUrl = async () => {\n const { audio_url: audioUrl } = await requestTextToSpeech({\n text: word.content,\n token: ttsToken,\n url: ttsURL,\n })\n setAudioUrls(urls => R.assoc(word.id, audioUrl, urls))\n }\n\n useEffect(() => {\n // Fetch the current word's audio URL only if not already set\n R.equals(audioUrls[word.id], null) && fetchAudioUrl()\n }, [word])\n\n const [isPending, setIsPending] = useState(false)\n\n const [responses, setResponses] = useState(() =>\n words.reduce((ws, w) => R.merge(ws, { [w.id]: '' }), {})\n )\n\n const markAnswer = (wid, value) =>\n setResponses(R.assoc(wid, value, responses))\n\n const answersIncomplete = R.any(\n R.anyPass([R.isNil, R.isEmpty]),\n R.values(responses)\n )\n\n async function handleSubmit() {\n setIsPending(true)\n const { data } = await postAttempt({\n activity_id: activityId,\n homework_attempt: {\n attemptable_attributes: words.map(w => ({\n word_id: w.id,\n content: responses[w.id],\n })),\n },\n })\n dispatchActivity(createAttempts(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n return (\n \n \n \n \n {word.image_url && (\n \n \n \n )}\n markAnswer(word.id, event.target.value)}\n value={responses[word.id]}\n />\n\n \n {R.equals(word, R.last(words)) && (\n \n \n \n )}\n \n \n \n \n )\n}\n","import { useState } from 'react'\nimport R from 'ramda'\nimport arrayShuffle from 'array-shuffle'\nimport styled from 'styled-components'\n\nimport {\n Box,\n BlockClicks,\n Text,\n Button,\n Icon,\n LoadingSpinner,\n MotionBox,\n} from '@redriverpress/system'\n\nimport { Modal } from 'Common/components/modal'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Sentence from './Sentence'\nimport CorrectnessIcon from '../putInOrder/CorrectnessIcon'\nimport getCorrectAnswer from './getCorrectAnswer'\nimport { arrayMove } from '../putInOrder/array'\nimport { containerVariants, bubbleVariants } from '../putInOrder/animations'\nimport {\n sortableContainer,\n sortableElement,\n sortableHandle,\n} from '../putInOrder/SortableList'\nimport {\n useActivityContext,\n createAttempt,\n setPosition,\n results,\n} from '../../context/activity'\n\nconst DialogContainer = sortableContainer(({ children }) => {\n return (\n \n {children}\n \n )\n})\n\nconst SortableSentence = styled(Sentence)`\n user-select: none;\n cursor: ${({ variant }) => variant !== 'success' && 'move'};\n`\n\nconst SortableHandle = sortableHandle(({ sentence, correct }) => {\n return (\n \n {correct && }\n \n \n )\n})\n\nconst DialogItem = sortableElement(({ sentence, label, correct }) => {\n return (\n \n \n \n {label}\n \n \n \n \n )\n})\n\nconst isCorrect = correctAnswer => (sentence, index) => {\n return correctAnswer[index].id === sentence.id\n}\n\nconst getScore = (answerGiven, correctAnswer) => {\n return answerGiven.filter(isCorrect(correctAnswer)).length\n}\n\nconst triesLeftText = triesLeft => {\n return `${triesLeft} more ${triesLeft === 1 ? 'try' : 'tries'}`\n}\n\nconst maxAttempts = 3\n\nexport default function PutInOrder() {\n const [{ task, id: activityId }, dispatchActivity] = useActivityContext()\n // Shuffle sentences. The correct order is the one from the definition.\n const [sentences, setSentences] = useState(() => {\n const taskSentences = task.taskable.sentences\n\n return arrayShuffle(taskSentences)\n })\n const [isPending, setIsPending] = useState(false)\n const [attemptNumber, setAttemptNumber] = useState(1)\n const [isModalOpen, setModalOpen] = useState(false)\n // Track which position is locked\n const [lockedPositions, setLockedPositions] = useState(() => {\n return task.taskable.sentences.map(() => false)\n })\n\n const correctAnswer = getCorrectAnswer(task)\n\n function handleSortEnd({ oldIndex, newIndex }) {\n setSentences(state => arrayMove(state, oldIndex, newIndex, lockedPositions))\n }\n\n async function handleSubmit() {\n setIsPending(true)\n const { data } = await postAttempt({\n activity_id: activityId,\n homework_attempt: {\n attemptable_attributes: {\n sentence_ids: sentences.map(sentence => sentence.id),\n },\n },\n })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n const openModal = () => setModalOpen(true)\n const closeModal = () => setModalOpen(false)\n const score = getScore(sentences, correctAnswer)\n\n function handleFinish() {\n setIsPending(true)\n\n // Submit if the order is correct or max attempt were reached\n if (score === sentences.length || attemptNumber === maxAttempts) {\n return handleSubmit()\n }\n\n openModal()\n setIsPending(false)\n }\n\n function handleRetry() {\n if (isPending) {\n return\n }\n\n window.scrollTo({ top: 0, behavior: 'smooth' })\n setLockedPositions(sentences.map(isCorrect(correctAnswer)))\n setAttemptNumber(currentAttempt => currentAttempt + 1)\n closeModal()\n }\n\n return (\n \n \n {sentences.map((sentence, index) => (\n \n ))}\n \n\n \n \n \n\n \n \n \n \n You got {score} out of {sentences.length} correct!\n {' '}\n You have {triesLeftText(maxAttempts - attemptNumber)}. Do you want\n to keep trying or submit?\n \n \n\n \n \n \n \n \n \n \n \n )\n}\n","import { Fragment } from 'react'\nimport { Icon, Text } from '@redriverpress/system'\n\nexport default function RequestMicPermissionCard() {\n return (\n \n \n \n Please enable microphone permission\n \n \n Click the icon in your browser’s\n address bar, set the correct permission, and then refresh\n this page.\n \n \n )\n}\n","import { Fragment } from 'react'\nimport { Icon, Text } from '@redriverpress/system'\n\nexport default function RequestBrowserChange() {\n return (\n \n \n \n Please switch to Safari\n \n \n This browser doesn’t support the audio recording feature. In order to\n experience the best of our Speaking Task, please switch to Safari.\n \n \n )\n}\n","import styled from 'styled-components'\nimport { Box } from '@redriverpress/system'\n\nconst RecorderProgressBar = styled(Box)`\n /*\n * react-circular-progressbar styles\n * All of the styles in this file are configurable!\n */\n\n .CircularProgressbar {\n /*\n * This fixes an issue where the CircularProgressbar svg has\n * 0 width inside a \"display: flex\" container, and thus not visible.\n */\n width: 100%;\n /*\n * This fixes a centering issue with CircularProgressbarWithChildren:\n * https://github.com/kevinsqi/react-circular-progressbar/issues/94\n */\n vertical-align: middle;\n }\n\n .CircularProgressbar .CircularProgressbar-path {\n stroke: #3e98c7;\n stroke-linecap: round;\n -webkit-transition: stroke-dashoffset 0.5s ease 0s;\n transition: stroke-dashoffset 0.5s ease 0s;\n }\n\n .CircularProgressbar .CircularProgressbar-trail {\n stroke: #d6d6d6;\n /* Used when trail is not full diameter, i.e. when props.circleRatio is set */\n stroke-linecap: round;\n }\n\n .CircularProgressbar .CircularProgressbar-text {\n fill: #3e98c7;\n font-size: 20px;\n dominant-baseline: middle;\n text-anchor: middle;\n }\n\n .CircularProgressbar .CircularProgressbar-background {\n fill: #d6d6d6;\n }\n\n /*\n * Sample background styles. Use these with e.g.:\n *\n * \n */\n .CircularProgressbar.CircularProgressbar-inverted\n .CircularProgressbar-background {\n fill: #3e98c7;\n }\n\n .CircularProgressbar.CircularProgressbar-inverted .CircularProgressbar-text {\n fill: #fff;\n }\n\n .CircularProgressbar.CircularProgressbar-inverted .CircularProgressbar-path {\n stroke: #fff;\n }\n\n .CircularProgressbar.CircularProgressbar-inverted .CircularProgressbar-trail {\n stroke: transparent;\n }\n`\n\nexport default RecorderProgressBar\n","import styled from 'styled-components'\n\nconst RecorderButton = styled('button')`\n background-color: ${props => props.theme.colors[props.bg]};\n border-radius: ${props => props.theme.radii.circular};\n border: none;\n cursor: pointer;\n height: 82%;\n width: 82%;\n transition: background 0.15s ease-in-out;\n z-index: 1;\n\n &:hover {\n background: ${props => props.theme.colors[props.bgHover]};\n }\n\n &:focus {\n outline: none;\n }\n`\n\nexport default RecorderButton\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport { CircularProgressbarWithChildren } from 'react-circular-progressbar'\n\nimport { Box, Icon, theme, mediaQueries } from '@redriverpress/system'\nimport RecorderProgressWrapper from './RecorderProgressWrapper'\nimport ActionButton from './RecPlayButton'\n\nexport default function RecordButton({ onClick, actionIcon, recording }) {\n const [seconds, setSeconds] = useState(0)\n const maxSeconds = 120\n const [strokeWidth, setStrokeWidth] = useState()\n const isMd = useMedia(mediaQueries.md)\n\n const progressBarStyle = {\n // Customize the path, i.e. the \"completed progress\"\n path: {\n // Path color\n stroke: theme.colors.red500,\n // Whether to use rounded or flat corners on the ends - can use 'butt' or 'round'\n strokeLinecap: 'round',\n // Customize transition animation\n transition: 'stroke-dashoffset 0.5s ease 0s',\n // Rotate the path\n // transform: 'rotate(0.25turn)',\n transformOrigin: 'center center',\n },\n // Customize the circle behind the path, i.e. the \"total progress\"\n trail: {\n // Trail color\n stroke: theme.colors.red100,\n // Whether to use rounded or flat corners on the ends - can use 'butt' or 'round'\n strokeLinecap: 'butt',\n // Rotate the trail\n transform: 'rotate(0.25turn)',\n transformOrigin: 'center center',\n },\n }\n\n useEffect(() => {\n let mounted = true\n const recordingTimeout = () =>\n setTimeout(() => {\n if (seconds < maxSeconds && mounted) {\n setSeconds(seconds + 1)\n }\n }, 1000)\n if (recording) {\n recordingTimeout()\n }\n\n return () => {\n mounted = false\n clearTimeout(recordingTimeout)\n }\n }, [seconds, recording])\n\n useEffect(() => {\n setStrokeWidth(isMd ? 5 : 6)\n }, [isMd])\n\n return (\n \n \n \n \n \n \n \n \n \n )\n}\n\nRecordButton.defaultProps = {\n recording: false,\n}\n\nRecordButton.propTypes = {\n actionIcon: PropTypes.string.isRequired,\n onClick: PropTypes.func.isRequired,\n recording: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\n\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\n\nimport { Box, Text } from '@redriverpress/system'\nimport RecordButton from '../RecorderButton'\n\nexport default function RecordingAudioCard({\n status,\n handleStopRecording,\n handleStartRecording,\n recordingTime,\n}) {\n const recordButtonAction =\n status === recorderStatus.RECORDING\n ? handleStopRecording\n : handleStartRecording\n\n return (\n \n \n \n \n {recordingTime}\n \n \n \n )\n}\n\nRecordingAudioCard.propTypes = {\n status: PropTypes.string.isRequired,\n handleStopRecording: PropTypes.func.isRequired,\n handleStartRecording: PropTypes.func.isRequired,\n recordingTime: PropTypes.string.isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport { Audio, FatLoadingSpinner } from '@redriverpress/system'\n\nexport default function RevisionCard({ audioUrl, openConfirmationModal }) {\n return (\n <>\n {audioUrl ? (\n \n ) : (\n \n )}\n \n )\n}\n\nRevisionCard.defaultProps = {\n audioUrl: null,\n}\n\nRevisionCard.propTypes = {\n audioUrl: PropTypes.string,\n openConfirmationModal: PropTypes.func.isRequired,\n}\n","/* eslint-disable camelcase */\nimport xhr from 'Common/utils/xhr'\nimport { activitiesEndpoint } from 'Endpoints'\n\nexport default function deleteAttempt({\n activity_id,\n attempt_Id,\n homework_attempt,\n}) {\n return xhr({\n url: `${activitiesEndpoint}/${activity_id}/attempts/${attempt_Id}`,\n method: 'DELETE',\n homework_attempt,\n })\n}\n","import PropTypes from 'prop-types'\nimport { useEffect, useState } from 'react'\nimport Bowser from 'bowser'\n\nimport { Box } from '@redriverpress/system'\nimport {\n MAX_RECORDING_TIME,\n browser,\n platform,\n recorderStatus,\n} from 'Common/constants/mediaRecorder'\nimport useElapsingTime from 'Common/hooks/useElapsingTime'\nimport useMediaRecorder from 'Common/hooks/useMediaRecorder'\nimport ConfirmActionDialog from 'Common/components/dialogs/ConfirmActionDialog'\n\nimport RequestMicPermissionCard from './recorderCards/RequestMicPermissionCard'\nimport RequestBrowserChange from './recorderCards/RequestBrowserChange'\nimport RecordingAudioCard from './recorderCards/RecordingAudioCard'\nimport RevisionCard from './recorderCards/RevisionCard'\nimport postAttemptService from '../../services/postAttempt'\nimport deleteAttemptService from '../../services/deleteAttempt'\nimport {\n useActivityContext,\n createAttempt,\n deleteAttempt,\n} from '../../context/activity'\n\nexport default function AudioManager({\n activityId,\n questionId,\n isReferenceLayout,\n}) {\n const {\n base64Media,\n startRecording,\n status,\n stopRecording,\n setStatus,\n } = useMediaRecorder({\n audio: true,\n })\n\n const [{ attempts }, dispatchActivity] = useActivityContext()\n\n const [userBrowser, setUserBrowser] = useState(null)\n const [userOS, setUserOS] = useState(null)\n const [isConfirmationModalOpen, setIsConfirmationModalOpen] = useState(false)\n const [isDeleteAudioPending, setIsDeleteAudioPending] = useState(false)\n const [recordingTime, setRecordingTime] = useState('00:00')\n const [audioUrl, setAudioUrl] = useState()\n\n const existingAudioAttempt =\n attempts.length &&\n attempts.find(attempt => attempt.attemptable.question_id === questionId)\n\n function handleStartRecording() {\n startRecording()\n }\n\n function handleStopRecording() {\n stopRecording()\n }\n\n async function handleDeleteAudio() {\n setIsDeleteAudioPending(true)\n await deleteAttemptService({\n homework_attempt: {\n attemptable_attributes: {\n question_id: questionId,\n },\n },\n activity_id: activityId,\n attempt_Id: existingAudioAttempt.id,\n }).then(() => {\n setAudioUrl(null)\n setRecordingTime('00:00')\n setIsDeleteAudioPending(false)\n setIsConfirmationModalOpen(false)\n setStatus(recorderStatus.IDLE)\n dispatchActivity(deleteAttempt(existingAudioAttempt.id))\n })\n }\n\n const isBrowserUnsupported = () => {\n return (\n (userOS === platform.IOS && userBrowser === browser.CHROME) ||\n (userOS === platform.IOS && userBrowser === browser.FIREFOX)\n )\n }\n\n const renderActiveStatusComponent = () => {\n if (\n (status === recorderStatus.IDLE && !audioUrl) ||\n status === recorderStatus.RECORDING\n ) {\n return (\n \n )\n }\n\n if (\n status === recorderStatus.SAVING ||\n (status === recorderStatus.IDLE && !!audioUrl)\n ) {\n return (\n setIsConfirmationModalOpen(true)}\n />\n )\n }\n }\n\n function checkForRecordingPermission() {\n return status === recorderStatus.BLOCKED ? (\n \n ) : (\n renderActiveStatusComponent()\n )\n }\n\n useElapsingTime({\n timeLimit: MAX_RECORDING_TIME,\n handleTimeOver: handleStopRecording,\n updateTimeCallback: setRecordingTime,\n shouldStartTimer: status === recorderStatus.RECORDING,\n })\n\n useEffect(() => {\n const saveAudioEffectsWrapper = async () => {\n if (base64Media) {\n setStatus(recorderStatus.SAVING)\n const { data } = await postAttemptService({\n homework_attempt: {\n attemptable_attributes: {\n audio: base64Media,\n question_id: questionId,\n },\n },\n activity_id: activityId,\n })\n setAudioUrl(data.attemptable.audio)\n setStatus(recorderStatus.IDLE)\n return dispatchActivity(createAttempt(data))\n }\n }\n\n saveAudioEffectsWrapper()\n }, [base64Media])\n\n useEffect(() => {\n const bowserParse = Bowser.getParser(window.navigator.userAgent)\n setUserBrowser(bowserParse.getBrowserName())\n setUserOS(bowserParse.getOSName(true))\n if (existingAudioAttempt)\n setAudioUrl(existingAudioAttempt.attemptable.audio)\n }, [])\n\n return (\n <>\n \n {isBrowserUnsupported() ? (\n \n ) : (\n checkForRecordingPermission()\n )}\n \n setIsConfirmationModalOpen(false)}\n onConfirm={handleDeleteAudio}\n onOpenChange={isOpen => setIsConfirmationModalOpen(isOpen)}\n subtitle='Are you sure you want to delete the recorded answer?'\n title='Delete answer'\n />\n \n )\n}\n\nAudioManager.propTypes = {\n activityId: PropTypes.number.isRequired,\n questionId: PropTypes.number.isRequired,\n}\n","import { useRef, useLayoutEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { Box, Container, TaskAudio, Text, theme } from '@redriverpress/system'\n\nimport questionShape from 'Packages/tasks/propShapes/question'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\nimport LightboxImage from 'Common/components/LightboxImage'\n\nimport AudioManager from './AudioManager'\nimport ReferenceTask from '../ReferenceTask'\nimport ReferenceWrapper from '../ReferenceWrapper'\n\nexport default function Question({ activityId, question }) {\n const {\n audio_url: audioUrl,\n image_alt_text: imageAltText,\n image_caption: caption,\n image_url: imageUrl,\n reference_task: referenceTask,\n } = question\n const [isOverflow, setIsOverflow] = useState(false)\n const overflowRef = useRef()\n const isQuestionLong = question.content.length > 55\n\n useLayoutEffect(() => {\n if (overflowRef.current)\n setIsOverflow(\n overflowRef.current.scrollHeight > overflowRef.current.clientHeight\n )\n }, [overflowRef])\n\n const alignOnTop = () => {\n return referenceTask || (isQuestionLong && imageUrl)\n }\n\n return (\n \n {/* WRAPPER */}\n \n {/* LEFT Side */}\n \n \n \n \n {imageUrl && (\n \n \n\n {caption && (\n \n {caption}\n \n )}\n \n )}\n {audioUrl && (\n \n \n \n )}\n {referenceTask && (\n \n \n \n )}\n \n\n {/* RIGHT Side */}\n \n \n \n )\n}\n\nQuestion.propTypes = {\n activityId: PropTypes.number.isRequired,\n question: PropTypes.shape(questionShape).isRequired,\n}\n","import TransitionItems from 'Common/components/TransitionItems'\n\nimport Question from './Question'\nimport { useActivityContext } from '../../context/activity'\n\nexport default function Speaking() {\n const [\n { currentTaskItem: question, id: activityId, position },\n ] = useActivityContext()\n\n return (\n \n \n \n )\n}\n","import PropTypes from 'prop-types'\nimport { Fragment, useState } from 'react'\nimport styled from 'styled-components'\n\nimport { Button, Icon, List, Text, media } from '@redriverpress/system'\n\nimport { Modal } from 'Common/components/modal'\n\nconst ColumnList = styled(List)`\n ${media.md`\n columns: 2 auto;\n `}\n`\n\nexport default function WordList({ list }) {\n const [modalOpen, setModalOpen] = useState(false)\n\n return (\n \n \n setModalOpen(false)}\n onBackgroundClick={() => setModalOpen(false)}\n onEscapeKeydown={() => setModalOpen(false)}\n title='Word List'\n >\n \n {list.map(word => (\n \n {word}\n \n ))}\n \n \n \n )\n}\n\nWordList.propTypes = {\n list: PropTypes.arrayOf(PropTypes.string).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { Box, Image, TaskAudioConsumer, Text } from '@redriverpress/system'\n\nimport ReferenceTask from '../ReferenceTask'\nimport Blank from './Blank'\nimport WordList from './WordList'\nimport parseElements from '../../parsers/parseElements'\n\nexport default function Paragraph({\n paragraph,\n promptType,\n responses,\n setResponses,\n wordList,\n}) {\n const {\n elements,\n audio_url: audioURL,\n image_type: imageType,\n image_url: imageURL,\n reference_task: referenceTask,\n } = paragraph\n const parsedElements = parseElements(elements)\n\n const getBlankMode = element => {\n if (element.correct) return 'correct'\n if (\n element.correct === false &&\n element.previous_answer === responses[element.id]\n ) {\n return 'fix'\n }\n return 'default'\n }\n\n const renderBlank = (element, idx) => (\n \n {/* eslint-disable react/self-closing-comp */}\n {/* force 1/3em space before each blank if it's not the first element */}\n {idx > 0 && }\n \n {\n setResponses(prev =>\n R.mergeRight(prev, { [element.id]: e.target.value })\n )\n }}\n />\n {element.fragment && element.fragment}\n \n {/* force 1/3em space after each blank */}\n \n {/* eslint-enable */}\n \n )\n\n const renderText = element => (\n \n )\n\n const renderLineBreak = idx => (\n \n
\n
\n )\n\n const getRenderer = (element, idx) =>\n R.cond([\n [R.equals('blank'), () => renderBlank(element, idx)],\n [R.equals('text'), () => renderText(element)],\n [R.equals('lineBreak'), () => renderLineBreak(idx)],\n ])(element.type)\n\n return (\n \n {audioURL && }\n\n {imageType !== 'none' && (\n \n {imageType === 'use_lesson' && (\n \n )}\n {imageType === 'use_uploaded' && (\n \n )}\n \n )}\n\n {(wordList || referenceTask) && (\n \n {wordList && }\n {referenceTask && }\n \n )}\n\n \n \n {parsedElements.map(getRenderer)}\n \n \n \n )\n}\n\nParagraph.defaultProps = {\n promptType: 'none',\n wordList: null,\n}\n\nParagraph.propTypes = {\n paragraph: PropTypes.shape({\n id: PropTypes.number.isRequired,\n elements: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n type: PropTypes.oneOf(['blank', 'text']).isRequired,\n })\n ).isRequired,\n audio_url: PropTypes.string,\n image_url: PropTypes.string.isRequired,\n }).isRequired,\n promptType: PropTypes.oneOf(['definition', 'hint', 'none']),\n responses: PropTypes.objectOf(PropTypes.string).isRequired,\n setResponses: PropTypes.func.isRequired,\n wordList: PropTypes.arrayOf(PropTypes.string),\n}\n","import R from 'ramda'\nimport { useState } from 'react'\n\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport {\n Box,\n BlockClicks,\n Button,\n Icon,\n LoadingSpinner,\n Text,\n} from '@redriverpress/system'\n\nimport TransitionItems from 'Common/components/TransitionItems'\n\nimport Paragraph from './Paragraph'\nimport {\n useActivityContext,\n createAttempts,\n setPosition,\n results,\n} from '../../context/activity'\nimport MissedAnswersModal from '../utils/modals/MissedAnswersModal'\n\nexport default function ListenAndType() {\n const [\n {\n currentTaskItem: paragraph,\n id: activityId,\n position,\n task: {\n taskable: { promptType, wordList },\n },\n taskItems: paragraphs,\n },\n dispatchActivity,\n ] = useActivityContext()\n\n const allBlanks = paragraphs.flatMap(({ elements }) =>\n elements.filter(el => el.type === 'blank')\n )\n\n // `responses` is an object with a key for each blank's id\n // `setResponses` must be called with an updated clone of `responses`\n const [responses, setResponses] = useState(() =>\n allBlanks.reduce(\n (blanks, blank) =>\n R.merge(blanks, { [blank.id]: blank.previous_answer || '' }),\n {}\n )\n )\n\n const [isPending, setIsPending] = useState(false)\n const [emptiesModalOpen, setEmptiesModalOpen] = useState(false)\n const openEmptiesModal = () => setEmptiesModalOpen(true)\n const closeEmptiesModal = () => setEmptiesModalOpen(false)\n\n const allBlanksFilled = R.none(R.equals(''), Object.values(responses))\n\n async function submit() {\n setIsPending(true)\n const { data } = await postAttempt({\n homework_attempt: {\n attemptable_attributes: Object.keys(responses).map(id => ({\n paragraph_element_id: id,\n content: responses[id].trim(),\n })),\n },\n activity_id: activityId,\n })\n dispatchActivity(createAttempts(data))\n setIsPending(false)\n dispatchActivity(setPosition(results))\n }\n\n function submitFromModal() {\n closeEmptiesModal()\n return submit()\n }\n\n async function goToFirstEmpty() {\n // Get the ID of the first blank with no response\n const blankId = R.find(\n ([, value]) => R.equals(value, ''),\n Object.entries(responses)\n )\n\n // Get the ID of the first paragraph that has the blankId in its elements\n const { id: paragraphId } = R.find(\n R.where({\n elements: R.any(R.propEq('id', parseInt(blankId, 10))),\n }),\n paragraphs\n )\n\n // Get the index of that paragraph from `paragraphs`, which will map to the position in the task\n const paragraphIndex = R.findIndex(R.propEq('id', paragraphId), paragraphs)\n\n await closeEmptiesModal()\n dispatchActivity(setPosition(paragraphIndex))\n }\n\n return (\n \n \n\n \n {R.equals(paragraph, R.last(paragraphs)) && (\n \n \n {isPending ? : }\n \n Submit\n \n \n \n )}\n \n \n \n )\n}\n","import PropTypes from 'prop-types'\nimport styled, { css, keyframes } from 'styled-components'\n\nimport { Box, Icon, LoadingSpinner, Text, media } from '@redriverpress/system'\n\nconst pulse = keyframes`\n 0% {\n opacity: 0.75;\n transform: scale(1);\n }\n 100% {\n opacity: 0;\n transform: scale(1.25);\n }\n`\n\nconst RoundButton = styled(Box).attrs(props => ({\n bg: props.bg || 'blue100',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n size: ['5.5rem', '6rem', '7rem'],\n}))`\n cursor: pointer;\n border-radius: 50%;\n font-size: ${props => props.theme.fontSizes[2]};\n font-weight: 600;\n transition: background-color 0.15s ease-out;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n ${media.md`\n font-size: ${props => props.theme.fontSizes[3]};\n `}\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: ${props => props.theme.colors.blue300};\n border-radius: 50%;\n opacity: 0.75;\n transform: scale(1);\n z-index: -1;\n }\n\n ${props =>\n !props.isSelected &&\n css`\n @media (hover: hover) {\n &:hover {\n background: ${props.theme.colors.blue300};\n color: ${props.theme.colors.black};\n }\n }\n &:hover:after {\n animation: 1s ${pulse} forwards 1;\n }\n `}\n`\n\n// Because setting font size bigger throws off button dimensions\nconst BigIcon = styled(Icon)`\n transform: scale(2);\n`\n\nexport default function TFButton({ isCorrect, isPending, isSelected, label }) {\n function computeBg() {\n if (isSelected && isCorrect === true) return 'green500'\n if (isSelected && isCorrect === false) return 'red500'\n if (isSelected === false) return 'gray100'\n return null\n }\n\n function renderLabel() {\n if (isSelected && isCorrect === true)\n return \n if (isSelected && isCorrect === false)\n return \n if (isSelected && isPending) return \n return (\n {label}\n )\n }\n\n return {renderLabel()}\n}\n\nTFButton.defaultProps = {\n isCorrect: null,\n isPending: false,\n isSelected: false,\n}\n\nTFButton.propTypes = {\n isCorrect: PropTypes.bool,\n isPending: PropTypes.bool,\n isSelected: PropTypes.bool,\n label: PropTypes.oneOf(['True', 'False']).isRequired,\n}\n","import { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport R from 'ramda'\nimport styled from 'styled-components'\n\nimport {\n BlockClicks,\n Box,\n Button,\n HiddenInput,\n SwitchInput,\n Text,\n TransparentButton,\n theme,\n} from '@redriverpress/system'\n\nimport ReferenceWrapper from '../ReferenceWrapper'\nimport ReferenceTask from '../ReferenceTask'\nimport TFButton from './TFButton'\n\nconst NextButton = styled(Button)`\n ${props => props.disabled && `background: ${props.theme.colors.gray800};`}\n`\n\nNextButton.displayName = 'NextButton'\n\nexport default function Statement({ attempt, isPending, onAnswer, statement }) {\n const [selectedValue, setSelectedValue] = useState(\n attempt ? attempt.attemptable?.assertion : null\n )\n const isStatementLong = statement.content.length > 55\n const { reference_task: referenceTask } = statement\n const [hideReference, setHideReference] = useState(false)\n\n return (\n \n {/* Left Side */}\n \n \n {statement.content}\n \n\n \n \n \n {\n setSelectedValue(true)\n return onAnswer({\n assertion: true,\n statement_id: statement.id,\n })\n }}\n />\n \n \n\n \n {\n setSelectedValue(false)\n return onAnswer({\n assertion: false,\n statement_id: statement.id,\n })\n }}\n />\n \n \n \n \n \n\n {/* Hide Reference Toggle */}\n {referenceTask && (\n \n setHideReference(!hideReference)}\n >\n Hide reference\n \n setHideReference(!hideReference)}\n height={['24px', null, '32px']}\n width={['44px', null, '56px']}\n />\n \n )}\n\n {/* Right Side */}\n {referenceTask && !hideReference && (\n \n {referenceTask && (\n \n \n \n )}\n \n )}\n \n )\n}\n\nStatement.defaultProps = {\n attempt: null,\n isPending: false,\n}\n\nStatement.propTypes = {\n attempt: PropTypes.shape({\n id: PropTypes.number.isRequired,\n correct: PropTypes.bool.isRequired,\n attemptable: PropTypes.object.isRequired,\n }),\n isPending: PropTypes.bool,\n onAnswer: PropTypes.func.isRequired,\n statement: PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n reference_task_id: PropTypes.number,\n }).isRequired,\n}\n","import R from 'ramda'\nimport { useState } from 'react'\n\nimport TransitionItems from 'Common/components/TransitionItems'\nimport postAttempt from 'Packages/tasks/services/postAttempt'\n\nimport Statement from './Statement'\nimport { useActivityContext, createAttempt } from '../../context/activity'\n\nexport default function TrueOrFalse() {\n const [\n { attempts, currentTaskItem: statement, id: activityId, position },\n dispatchActivity,\n ] = useActivityContext()\n const [isPending, setIsPending] = useState(false)\n\n async function handleAnswer({ assertion, statement_id }) {\n setIsPending(true)\n\n const { data } = await postAttempt({\n homework_attempt: {\n attemptable_attributes: {\n assertion,\n statement_id,\n },\n },\n activity_id: activityId,\n })\n setIsPending(false)\n return dispatchActivity(createAttempt(data))\n }\n\n return (\n \n \n \n )\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { layout } from 'styled-system'\n\nimport { Image } from '@redriverpress/system'\n\nexport const imageTileSize = ['5.125rem', null, null, '7rem']\n\nconst ImageButton = styled.button`\n appearance: none;\n cursor: pointer;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n background: white;\n border: 2px solid\n ${props =>\n props.matched || props.active\n ? props.theme.colors.yellow500\n : props.theme.colors.gray300};\n border-radius: ${props => props.theme.radii.rounded};\n margin: ${props => props.theme.space[1]};\n padding: 0;\n transition: border-color 0.3s ease;\n ${layout};\n\n &:focus {\n outline: none;\n }\n\n img {\n user-select: none;\n -moz-user-select: none;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n }\n`\n\nexport default function ImageTile({ active, matched, src, ...props }) {\n return (\n \n \n \n )\n}\n\nImageTile.defaultProps = {\n active: false,\n matched: false,\n}\n\nImageTile.propTypes = {\n active: PropTypes.bool,\n matched: PropTypes.bool,\n src: PropTypes.string.isRequired,\n}\n","import R from 'ramda'\nimport { useState } from 'react'\nimport arrayShuffle from 'array-shuffle'\nimport { motion, AnimatePresence } from 'framer-motion'\n\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport {\n BlockClicks,\n Button,\n Box,\n Icon,\n LoadingSpinner,\n Text,\n} from '@redriverpress/system'\n\nimport ImageTile, { imageTileSize } from './ImageTile'\nimport Target from '../matching/Target'\nimport getHandleTargetClick from '../matching/getHandleTargetClick'\nimport {\n useActivityContext,\n setPosition,\n createAttempt,\n results,\n} from '../../context/activity'\n\nexport default function ImageMatching() {\n const [\n { taskItems: images, id: activityId },\n dispatchActivity,\n ] = useActivityContext()\n\n // Initialize bank as an array of shuffled word IDs (so order of the bank\n // is different from the order of definitions, which needs to be stable).\n // `setbank` should be called with an updated clone of `bank`.\n const [bank, setBank] = useState(() =>\n arrayShuffle(images).map(({ id }) => `${id}`)\n )\n\n // Create an array from the taskItems, taking the id and content for each,\n // and add a field for the id of the image being matched (initially null)\n const [matches, setMatches] = useState(() =>\n images.map(({ id, content }) => ({ id, content, matchedId: null }))\n )\n\n const getByParsedId = list => id =>\n R.find(R.propEq('id', parseInt(id, 10)), list)\n const getMatch = getByParsedId(matches)\n const getImage = getByParsedId(images)\n\n // Sets the matchedId value of the match object for the given id\n const setMatch = (id, matchedId) =>\n setMatches(\n R.adjust(\n R.findIndex(R.propEq('id', id), matches),\n R.assoc('matchedId', matchedId),\n matches\n )\n )\n\n // clicking an image in the word bank makes it active\n const [activeWord, setActiveWord] = useState(null)\n\n const [isPending, setIsPending] = useState(false)\n\n const isIncomplete = R.any(R.propEq('matchedId', null), matches)\n\n const handleTargetClick = getHandleTargetClick({\n activeWord,\n setActiveWord,\n bank,\n setBank,\n getMatch,\n setMatch,\n })\n\n async function handleFinished() {\n setIsPending(true)\n // NB: The attempts endpoint expects word_id and matched_word_id as integers\n const { data } = await postAttempt({\n activity_id: activityId,\n homework_attempt: {\n attemptable_attributes: {\n pairs_attributes: matches.map(({ id, matchedId }) => ({\n word_id: parseInt(id, 10),\n matched_word_id: parseInt(matchedId, 10),\n })),\n },\n },\n })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n return (\n \n {bank.length > 0 && (\n \n \n {bank.map(id => (\n \n setActiveWord(id)}\n />\n \n ))}\n \n \n )}\n\n \n {matches.map(({ id, content, matchedId }) => (\n \n handleTargetClick(id)}\n size={imageTileSize}\n >\n \n {matchedId && (\n \n \n \n )}\n \n \n \n \n {content}\n \n \n \n ))}\n \n\n \n \n \n \n \n \n )\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport { disabledOpacity, media } from '@redriverpress/system'\n\nconst getBoxShadowColor = props => {\n if (props.active) return props.theme.colors.yellow500\n if (props.matched) return 'transparent'\n return props.theme.colors.gray300\n}\n\nconst WordButton = styled.button`\n appearance: none;\n background: transparent;\n border: none;\n border-radius: ${props => props.theme.radii.rounded};\n box-shadow: inset 0 0 0 2px ${props => getBoxShadowColor(props)};\n cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};\n display: inline-block;\n opacity: ${props => (props.disabled ? disabledOpacity : 1)};\n font-size: {$props => props.theme.fontSizes[0]};\n font-weight: 600;\n line-height: 1.4;\n margin: ${props => props.theme.space[1]};\n padding: ${props => props.theme.space[2]} ${props => props.theme.space[3]};\n text-decoration: none;\n transition: 0.3s ease-out;\n\n &:focus {\n outline: none;\n }\n\n ${media.lg`\n padding: ${props => props.theme.space[3]} ${props => props.theme.space[4]};\n `}\n`\nWordButton.displayName = 'WordButton'\n\nexport default function Word({ active, content, matched, ...props }) {\n return (\n \n {content}\n \n )\n}\n\nWord.defaultProps = {\n active: false,\n matched: false,\n}\n\nWord.propTypes = {\n active: PropTypes.bool,\n content: PropTypes.string.isRequired,\n matched: PropTypes.bool,\n}\n","import R from 'ramda'\nimport { useState } from 'react'\nimport arrayShuffle from 'array-shuffle'\nimport styled from 'styled-components'\nimport { motion, AnimatePresence } from 'framer-motion'\n\nimport postAttempt from 'Packages/tasks/services/postAttempt'\nimport {\n BlockClicks,\n Button,\n Box,\n Columns,\n Col,\n Icon,\n LoadingSpinner,\n Text,\n} from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport Word from './Word'\nimport Target from './Target'\nimport getHandleTargetClick from './getHandleTargetClick'\nimport {\n useActivityContext,\n setPosition,\n createAttempt,\n results,\n} from '../../context/activity'\n\nconst IndexCircle = styled(Box).attrs(() => ({\n as: 'span',\n size: ['2rem', null, '2.5rem'],\n bg: 'white',\n border: '2px solid',\n borderColor: 'yellow500',\n borderRadius: 'circular',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 0,\n fontWeight: 600,\n position: 'absolute',\n left: [0, null, null, '1.25rem'],\n right: [0, null, null, 'unset'],\n top: ['-1rem', null, '-1.25rem', 0],\n bottom: [null, null, null, 0],\n m: 'auto',\n}))``\n\nexport default function Matching() {\n const [\n { taskItems: words, id: activityId },\n dispatchActivity,\n ] = useActivityContext()\n\n // Initialize bank as an array of shuffled word IDs (so order of the bank\n // is different from the order of definitions, which needs to be stable).\n // `setbank` should be called with an updated clone of `bank`.\n const [bank, setBank] = useState(() =>\n arrayShuffle(words).map(({ id }) => id)\n )\n\n // Create an array from the taskItems, taking the id and definition for each word,\n // and add a field for the id of the word being matched (initially null)\n const [matches, setMatches] = useState(() =>\n words.map(({ id, definition }) => ({ id, definition, matchedId: null }))\n )\n\n const getByParsedId = list => id =>\n R.find(R.propEq('id', parseInt(id, 10)), list)\n const getMatch = getByParsedId(matches)\n const getWord = getByParsedId(words)\n\n // Sets the matchedId value of the match object for the given id\n const setMatch = (id, matchedId) =>\n setMatches(\n R.adjust(\n R.findIndex(R.propEq('id', id), matches),\n R.assoc('matchedId', matchedId),\n matches\n )\n )\n\n // clicking a word in the word bank makes it active\n const [activeWord, setActiveWord] = useState(null)\n\n const [isPending, setIsPending] = useState(false)\n\n const isIncomplete = R.any(R.propEq('matchedId', null), matches)\n\n const handleTargetClick = getHandleTargetClick({\n activeWord,\n setActiveWord,\n bank,\n setBank,\n matches,\n getMatch,\n setMatch,\n })\n\n async function handleFinished() {\n setIsPending(true)\n // NB: The attempts endpoint expects word_id and matched_word_id as integers\n const { data } = await postAttempt({\n activity_id: activityId,\n homework_attempt: {\n attemptable_attributes: {\n pairs_attributes: matches.map(({ id, matchedId }) => ({\n word_id: parseInt(id, 10),\n matched_word_id: parseInt(matchedId, 10),\n })),\n },\n },\n })\n dispatchActivity(createAttempt(data))\n setIsPending(false)\n return dispatchActivity(setPosition(results))\n }\n\n return (\n \n {bank.length > 0 && (\n \n \n {bank.map(id => (\n \n setActiveWord(id)}\n css='background: white'\n />\n \n ))}\n \n \n )}\n\n \n {matches.map(({ definition, id: definitionId, matchedId }, idx) => (\n \n {R.inc(idx)}\n\n \n \n handleTargetClick(definitionId)}\n mt={[3, null, null, 0]}\n ml={[0, null, null, 5]}\n height={['4rem', null, null, '5rem']}\n >\n \n {matchedId && (\n \n \n \n )}\n \n \n \n\n \n \n \n \n \n ))}\n \n\n \n \n \n \n \n \n )\n}\n","import { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport R from 'ramda'\nimport styled from 'styled-components'\n\nimport {\n Box,\n Button,\n SwitchInput,\n Text,\n Textarea,\n TransparentButton,\n theme,\n} from '@redriverpress/system'\n\nimport questionShape from 'Packages/tasks/propShapes/question'\nimport useSessionStorage from 'Common/hooks/useSessionStorage'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport ReferenceTask from '../ReferenceTask'\nimport ReferenceWrapper from '../ReferenceWrapper'\n\nconst SaveButton = styled(Button)`\n ${props => props.disabled && `background: ${props.theme.colors.gray800};`}\n`\nSaveButton.displayName = 'SaveButton'\n\nexport default function Question({ activityId, attempt, question }) {\n const { reference_task: referenceTask } = question\n const isQuestionLong = question.content.length > 55\n const [contentForAttempt, setContentForAttempt] = useSessionStorage(\n `${activityId}-${question.id}`,\n R.path(['attemptable', 'content'], attempt) || ''\n )\n const [hideReference, setHideReference] = useState(false)\n\n return (\n \n {/* Left Side */}\n \n \n \n setContentForAttempt(e.target.value)}\n rows={6}\n />\n \n \n\n {/* Hide Reference Toggle */}\n {referenceTask && (\n \n setHideReference(!hideReference)}\n >\n Hide reference\n \n setHideReference(!hideReference)}\n height={['24px', null, '32px']}\n width={['44px', null, '56px']}\n />\n \n )}\n\n {/* Right Side */}\n {referenceTask && !hideReference && (\n \n {referenceTask && (\n \n \n \n )}\n \n )}\n \n )\n}\n\nQuestion.defaultProps = {\n attempt: null,\n}\n\nQuestion.propTypes = {\n activityId: PropTypes.number.isRequired,\n attempt: PropTypes.shape({\n id: PropTypes.number.isRequired,\n correct: PropTypes.bool.isRequired,\n attemptable: PropTypes.object.isRequired,\n }),\n question: PropTypes.shape(questionShape).isRequired,\n}\n","import R from 'ramda'\n\nimport TransitionItems from 'Common/components/TransitionItems'\n\nimport Question from './Question'\nimport { useActivityContext } from '../../context/activity'\n\nexport default function OpenEndedQuestions() {\n const [\n { attempts, currentTaskItem: question, id: activityId, position },\n ] = useActivityContext()\n\n return (\n \n \n \n )\n}\n","import styled from 'styled-components'\nimport PropTypes from 'prop-types'\n\nimport { Text } from '@redriverpress/system'\n\nconst NumberBox = styled(Text).attrs(() => ({\n fontWeight: 700,\n position: 'relative',\n}))`\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0.75rem;\n margin: auto;\n border-top: 2px solid ${props => props.theme.colors.gray200};\n }\n`\n\nexport default function AnswerNumber({ number }) {\n return (\n \n \n {number}\n \n \n )\n}\n\nAnswerNumber.propTypes = {\n number: PropTypes.number.isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport { Box, Icon, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nexport default function SuggestedAnswers({ answers }) {\n return (\n \n \n \n {answers.length === 1 ? 'Answer key' : 'Answer keys'}\n \n {answers.map(answer => (\n \n ))}\n \n )\n}\nconst AnswerShape = PropTypes.shape({\n content: PropTypes.string.isRequired,\n created_at: PropTypes.string,\n id: PropTypes.number,\n question_id: PropTypes.number,\n updated_at: PropTypes.string,\n})\n\nSuggestedAnswers.propTypes = {\n answers: PropTypes.arrayOf(AnswerShape).isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport { Box, Icon } from '@redriverpress/system'\n\nexport default function CorrectnessIcon({ correct }) {\n const color = correct ? 'green500' : 'red500'\n const icon = correct ? 'check' : 'times'\n\n return (\n \n \n \n )\n}\n\nCorrectnessIcon.propTypes = {\n correct: PropTypes.bool.isRequired,\n}\n","import xhr from 'Common/utils/xhr'\nimport { feedbackUrl } from 'Endpoints'\n\nexport default function postFeedback(data) {\n return xhr({\n url: feedbackUrl,\n method: 'POST',\n data,\n })\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment, useState } from 'react'\n\nimport { Box, Button, Icon, TaskAudio } from '@redriverpress/system'\n\nimport { Modal } from 'Common/components/modal'\nimport taskPropShape from 'Packages/tasks/propShapes/task'\n\nimport { DialogueContent } from './dialogue/Dialogue'\nimport { ReadWatchListenContent } from './readWatchListen/ReadWatchListen'\nimport { ReadWatchListenContent2 } from './readWatchListen2/ReadWatchListen2'\nimport {\n dialogue,\n readWatchListen,\n readWatchListen2,\n} from '../constants/taskTypes'\n\nconst Wrapper = ({\n children,\n isNewLayout,\n isModalOpen,\n openModal,\n taskTitle,\n}) =>\n isNewLayout ? (\n <>{children}\n ) : (\n <>\n \n openModal(false)}\n onClose={() => openModal(false)}\n onEscapeKeydown={() => openModal(false)}\n title={taskTitle}\n >\n {children}\n \n \n )\n\nexport default function ReferenceTask({ task, isNewLayout }) {\n const [isModalOpen, setModalOpen] = useState(false)\n const { taskable } = task\n const { audio, audio_url: audioUrl, type: taskType } = taskable\n let taskProps\n\n if (R.equals(dialogue, taskType)) {\n const { bubbles, headshots } = taskable\n taskProps = { bubbles, headshots }\n } else if (R.equals(readWatchListen2, taskType)) {\n const { content } = taskable\n taskProps = { content, isReference: true }\n } else {\n const {\n image_position: imagePosition,\n image_url: imageURL,\n paragraphs,\n paragraph_numbering: paragraphNumbering,\n title,\n } = taskable\n taskProps = {\n imagePosition,\n imageURL,\n paragraphs,\n paragraphNumbering,\n title,\n isReference: true,\n }\n }\n\n const Component = R.cond([\n [R.equals(dialogue), R.always(DialogueContent)],\n [R.equals(readWatchListen), R.always(ReadWatchListenContent)],\n [R.equals(readWatchListen2), R.always(ReadWatchListenContent2)],\n ])(taskType)\n\n return (\n \n setModalOpen(value)}\n taskTitle={task.title}\n >\n {audio && audioUrl && (\n \n \n \n )}\n \n \n \n )\n}\n\nReferenceTask.defaultProps = {\n task: {\n title: 'Reference Task',\n },\n isNewLayout: false,\n}\n\nReferenceTask.propTypes = {\n task: PropTypes.shape(taskPropShape),\n isNewLayout: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\n\nimport { Box, Label } from '@redriverpress/system'\n\nimport { generalTimeFormat } from 'Common/utils/datetime'\n\nexport default function ScoredBy({ author, date }) {\n return (\n \n \n \n )\n}\nScoredBy.defaultProps = {\n date: null,\n}\nScoredBy.propTypes = {\n author: PropTypes.string.isRequired,\n date: PropTypes.string,\n}\n","import PropTypes from 'prop-types'\n\nimport { Audio, Box, Icon, StarsRating, Text } from '@redriverpress/system'\nimport styled from 'styled-components'\n\nimport { ELLII_BOT_NAME } from 'Common/constants'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nconst AudioWrapper = styled(Box).attrs({\n my: 3,\n})`\n & button {\n width: 38px;\n height: 38px;\n\n & > svg {\n width: 0.75rem;\n height: 0.75rem;\n }\n }\n`\n\nexport default function FeedbackSection({ attempt }) {\n const getFeedbackBgColor = value => {\n const floatValue = parseFloat(value)\n return floatValue > teacherScoreValues.FIFTY_PERCENT\n ? 'green50'\n : 'yellow200'\n }\n\n const percentage = Math.floor(parseFloat(attempt.percentage) * 100)\n\n return (\n \n \n \n \n \n \n \n Score: {percentage}%\n \n \n \n \n \n \n {attempt.feedback?.text_content && (\n {attempt.feedback.text_content}\n )}\n {attempt.feedback?.audio && (\n \n \n )}\n \n {attempt.auto_scored\n ? `From ${ELLII_BOT_NAME}`\n : `From ${attempt.feedback?.teacher?.teacherName}`}\n \n \n )\n}\n\nFeedbackSection.propTypes = {\n attempt: PropTypes.shape({\n auto_scored: PropTypes.bool,\n auto_score_at: PropTypes.string,\n manual_score_at: PropTypes.string,\n percentage: PropTypes.string,\n feedback: PropTypes.shape({\n id: PropTypes.number.isRequired,\n percentage: PropTypes.string.isRequired,\n text_content: PropTypes.string.isRequired,\n updated_at: PropTypes.string.isRequired,\n audio: PropTypes.string,\n audio_url: PropTypes.string,\n teacher: PropTypes.shape({\n teacherName: PropTypes.string.isRequired,\n }).isRequired,\n }),\n }).isRequired,\n}\n","import { Box, SliderInput, StarsRating, Text } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nconst MAX_SCORE = 100\n\nexport default function RatingSelector({ rating, onRatingChange }) {\n return (\n \n \n \n Select score: {rating}%\n \n onRatingChange(value[0])}\n max={MAX_SCORE}\n step={1}\n aria-label='Volume'\n >\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nRatingSelector.propTypes = {\n rating: PropTypes.number.isRequired,\n onRatingChange: PropTypes.func.isRequired,\n}\n","import R from 'ramda'\n\nexport const dialogue = 'Dialogue'\nexport const flashcardSet = 'FlashcardSet'\nexport const imageMatching = 'ImageMatching'\nexport const listenAndType = 'ListenAndType'\nexport const matching = 'Matching'\nexport const multipleChoice = 'MultipleChoice'\nexport const openEndedQuestions = 'OpenEndedQuestions'\nexport const putInOrder = 'PutInOrder'\nexport const readWatchListen = 'ReadWatchListen'\nexport const readWatchListen2 = 'ReadWatchListen2'\nexport const seeAndSpell = 'SeeAndSpell'\nexport const sequencing = 'Sequencing'\nexport const speaking = 'Speaking'\nexport const trueOrFalse = 'TrueOrFalse'\n\nconst taskTypes = [\n dialogue,\n flashcardSet,\n imageMatching,\n listenAndType,\n matching,\n multipleChoice,\n openEndedQuestions,\n putInOrder,\n readWatchListen,\n readWatchListen2,\n seeAndSpell,\n sequencing,\n speaking,\n trueOrFalse,\n]\n\nexport default taskTypes\n\n// User-facing task type labels\nexport const taskTypeLabels = {\n [dialogue]: 'Dialogue',\n [flashcardSet]: 'Flashcard Set',\n [imageMatching]: 'Image Match',\n [listenAndType]: 'Type in the Blanks',\n [matching]: 'Matching',\n [multipleChoice]: 'Multiple-Choice',\n [openEndedQuestions]: 'Open-Ended Questions',\n [putInOrder]: 'Put in Order',\n [readWatchListen]: 'Reference',\n [readWatchListen2]: 'Reference',\n [seeAndSpell]: 'See & Spell',\n [sequencing]: 'Sequencing',\n [speaking]: 'Speaking',\n [trueOrFalse]: 'True or False',\n}\n\n// Tasks assignable on the Standard plan\n// (Currently same as referenceTasks, but that could always change)\nexport const standardTasks = [dialogue, readWatchListen, readWatchListen2]\n\n// Plus tasks\nexport const plusTasks = R.without(standardTasks, taskTypes)\n\n// Readonly tasks don't take answers\nexport const readonlyTasks = [\n dialogue,\n flashcardSet,\n readWatchListen,\n readWatchListen2,\n]\n\n// Reference tasks are tasks which can be used\n// as a reference in other tasks\nexport const referenceTasks = [dialogue, readWatchListen, readWatchListen2]\n\n// Teacher markable tasks are tasks which are marked by the teacher\n// (as opposed to automatically being marked by our system)\nexport const teacherMarkableTasks = [openEndedQuestions, speaking]\n\n// Unscored tasks are tasks which are not scored by our system\n// (OEQ can be 'scored' but only by teachers)\nexport const unscoredTasks = [\n dialogue,\n flashcardSet,\n openEndedQuestions,\n readWatchListen,\n readWatchListen2,\n speaking,\n]\n\n// Batch submission tasks use the Review and Submit component to submit\n// their activities (although their attempts may be posted individually,\n// which is a bit misleading in terms of naming, but WELCOME TO OUR TASKS) 😅\nexport const batchSubmissionTasks = [openEndedQuestions, speaking]\n","import styled from 'styled-components'\nimport { Box } from '@redriverpress/system'\n\nconst ReferenceWrapper = styled(Box)`\n ::-webkit-scrollbar {\n width: 0.5em;\n background-color: ${props => props.theme.colors.gray100};\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: ${props => props.theme.colors.gray300};\n }\n\n p {\n font-size: inherit;\n }\n`\n\nexport default ReferenceWrapper\n","export const containerVariants = {\n hidden: {\n opacity: 0,\n },\n show: {\n opacity: 1,\n transition: {\n delayChildren: 0.25,\n staggerChildren: 0.125,\n },\n },\n}\n\nexport const hsVariants = {\n hidden: {\n opacity: 0,\n scale: 0.5,\n },\n show: {\n opacity: 1,\n scale: 1,\n transition: {\n type: 'spring',\n stiffness: 300,\n damping: 100,\n },\n },\n}\n\nexport const bubbleVariants = {\n hidden: {\n opacity: 0,\n y: '2rem',\n },\n show: {\n opacity: 1,\n y: '0rem',\n transition: {\n type: 'spring',\n stiffness: 300,\n damping: 100,\n },\n },\n}\n","/* eslint-disable no-param-reassign */\nimport { useRef } from 'react'\nimport { sortableContainer as Container } from 'react-sortable-hoc'\n\nconst setTranslateY = (node, translate) => {\n const transform = translate ? `translate3d(0, ${translate}px, 0)` : ''\n\n node._style.transform = transform\n}\n\nconst disableStyleTransform = node => {\n node._node = node.node\n\n // Proxy: block calls to set transform property\n const styleProxy = new Proxy(node._node.style, {\n set: (target, name, value) => {\n // ignore transform and any vendor prefixed transform\n if (!name.toLowerCase().endsWith('transform')) {\n target[name] = value\n }\n return true\n },\n })\n\n // Proxy: replace style property with styleProxy (block calls to set transform property)\n node.node = new Proxy(node._node, {\n get: (target, name) => {\n if (name === '_style') {\n return target.style\n }\n if (name === 'style') {\n return styleProxy\n }\n\n return target[name]\n },\n })\n}\n\nconst enableStyleTransform = node => {\n node.node = node._node\n delete node._node\n}\n\nconst animateNodes = (nodes, index, newIndex) => {\n // Nothing to do here until the first sort over\n if (newIndex === undefined) {\n return\n }\n\n // Direction: 1 = DOWN, -1 = UP\n const direction = index < newIndex ? 1 : -1\n\n // Range of nodes that need transformation\n const from = direction > 0 ? index : newIndex\n const to = direction > 0 ? newIndex : index\n const pushDirection = direction * -1\n\n // extra-marigin\n const helperHeight = nodes[index].node.offsetHeight\n\n const lockedPositions = nodes.map(n => n.node.sortableInfo.disabled)\n\n return nodes.map((n, idx) => {\n // skip node being moved\n if (idx === index) {\n return\n }\n\n // Keep nodes out of range on their place (this undo any previous animation)\n if (idx < from || idx > to) {\n return 0\n }\n\n // This contains the math done by the library to move the item\n const translate = { ...n.translate }\n\n if (lockedPositions[idx]) {\n // The item is locked. We should not push it but could be the case that it need to move a little bit down/up.\n // That happens when the item being moved before is higher/lower than the original element.\n // For example: Suppose we found a sequence like this: 1 2L 3L 4'. Where 2 and 3 are locked and 4 is widther than the other elements.\n // In this case 2L and 3L need to be pushed a little bit when 4' goes to 1 position.\n\n // Ensure that we are in the middle of two non-blocked positions\n let prevIdx = idx - direction\n while (\n prevIdx >= 0 &&\n prevIdx < nodes.length &&\n lockedPositions[prevIdx]\n ) {\n prevIdx -= direction\n }\n\n // Lookup for the next non-blocked position. Do not look more than new position\n let nextIdx = idx + direction\n while (from <= nextIdx && nextIdx <= to && lockedPositions[nextIdx]) {\n nextIdx += direction\n }\n\n // Ensure that both nodes exists. If not we don't need to move them\n if (\n nextIdx >= from &&\n nextIdx <= to &&\n prevIdx >= from &&\n prevIdx <= to\n ) {\n return (nodes[nextIdx].node.offsetHeight - helperHeight) * direction\n }\n return 0\n }\n\n // Elements are pushed one position unless that position is locked. Jump to the first non-locked position\n let prevIdx = idx - direction\n while (prevIdx >= 0 && prevIdx < nodes.length && lockedPositions[prevIdx]) {\n const prevNode = nodes[prevIdx]\n const prevNodeHeight = prevNode.node.offsetHeight\n\n const margin = Math.abs(prevNode.translate.y) - helperHeight\n\n translate.y += (margin + prevNodeHeight) * pushDirection\n prevIdx -= direction\n }\n\n return translate.y\n })\n}\n\n/**\n * react-sortable-hoc support disabling an item. That prevent the item from being dragged but do not lock the position\n * (see https://github.com/clauderic/react-sortable-hoc/issues/648).\n *\n * To fix that we turn off the library animation and do a custom implementation.\n * There is no public API to do that. The workaround is based on v1.11.0 code, trying to assume as less as possible.\n *\n * Here are the assumptions:\n * 1) onSortStart, onSortEnd and onSortOver pass `nodes` property (current behaviour but not documented).\n * It's the internal state of the library\n * 2) onSortOver is called after the library has run it's animation.\n * Our animation is based on node.translate which is prop that is set during library animation.\n * 3) onSortMove is called after onSortOver. We are doing the animation on onSortMove and using info extracted after onSortOver.\n * 4) hideSortableGhost prop is true\n * 5) axis prop is 'y'\n * 6) Calling sortableContainer return a class component with onAutoScroll method. Needed to hack for an onAutoScroll callback\n */\nexport const sortableContainer = component => {\n const Wrapper = Container(component)\n\n // HACK: while component is autoScrolling no calls to onSortMove are made. So animation breaks while autoscroll is happening.\n // there are no callbacks for autoscroll. Hack the component to provide one\n const _componentDidMount = Wrapper.prototype.componentDidMount\n Wrapper.prototype.componentDidMount = function componentDidMountWrapper() {\n _componentDidMount.apply(this)\n\n const _autoScroll = this.onAutoScroll\n this.onAutoScroll = (...args) => {\n _autoScroll.apply(this, args)\n\n this.props.onSortMove()\n }\n }\n\n return ({\n children,\n onSortStart,\n onSortEnd,\n onSortOver,\n onSortMove,\n ...rest\n }) => {\n // translation on y-axis to be applied to each node\n const translateCache = useRef()\n const items = useRef()\n\n // Prevent react-sortable-hoc to move list items. We will handle that\n const handleSortStart = event => {\n const { nodes } = event\n\n items.current = nodes\n nodes.forEach(disableStyleTransform)\n\n if (onSortStart) {\n onSortStart(event)\n }\n }\n\n // Cleanup sortStart\n const handleSortEnd = event => {\n const { nodes } = event\n\n nodes.forEach(node => {\n enableStyleTransform(node)\n node.node.style.transform = ''\n })\n items.current = null\n translateCache.current = null\n\n if (onSortEnd) {\n onSortEnd(event)\n }\n }\n\n // Update translation cache\n const handleOnSortOver = event => {\n const { nodes, newIndex, index } = event\n\n translateCache.current = animateNodes(nodes, index, newIndex)\n\n if (onSortOver) {\n onSortOver(event)\n }\n }\n\n // Animate elements\n const handleOnSortMove = () => {\n // Do nothing until the first onSortOver\n if (!translateCache.current || !items.current) {\n return\n }\n\n items.current.forEach((node, index) => {\n setTranslateY(node.node, translateCache.current[index])\n })\n }\n\n return (\n \n {children}\n \n )\n }\n}\n\nexport { sortableElement, sortableHandle } from 'react-sortable-hoc'\n","import PropTypes from 'prop-types'\n\nconst questionShape = {\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n answer_form: PropTypes.string,\n reference_task_id: PropTypes.number,\n image: PropTypes.string,\n image_caption: PropTypes.string,\n image_alt_text: PropTypes.string,\n}\n\nexport default questionShape\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport { Box, CoverImage, Text } from '@redriverpress/system'\n\nconst activeCoverImageShadow = ({ theme }) => {\n return `0 0 0 3px ${theme.colors.white}, 0 0 0 6px ${theme.colors.yellow500};`\n}\n\nconst StyledCoverImage = styled(CoverImage)`\n .drag-helper & {\n box-shadow: ${activeCoverImageShadow};\n }\n`\n\nexport default function Headshot({ src, name, withName, size, ...props }) {\n return (\n \n \n {withName && (\n \n {name}\n \n )}\n \n )\n}\n\nHeadshot.defaultProps = {\n withName: false,\n}\n\nHeadshot.propTypes = {\n src: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n withName: PropTypes.bool,\n size: PropTypes.arrayOf(PropTypes.string).isRequired,\n}\n","import R from 'ramda'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nconst punctuations = ['.', ',', '?', '!', ':', ';', '…']\n\nconst isPunctuation = string => R.includes(string, punctuations)\nconst startsWithPunctuation = string =>\n R.includes(string.substring(0, 1), punctuations)\n\nconst setTypeAsFragment = R.assoc('type', 'fragment')\n\nconst setContentAsMarkdown = R.evolve({\n content: content => renderInlineMarkdown(content),\n})\n\nconst formatSplitAsFragment = R.evolve({\n type: R.always('fragment'),\n content: content => content.substring(0, 1),\n})\n\nconst formatSplitAsText = R.evolve({\n type: R.always('text'),\n content: content => renderInlineMarkdown(content.substring(1)),\n})\n\nconst lineBreakObject = () => ({\n type: 'lineBreak',\n})\n\nconst textObject = content => ({\n type: 'text',\n content,\n})\n// Takes the text element and splits it into `fragment` and `text` segments\nconst splitTextElement = element => [\n formatSplitAsFragment(element),\n formatSplitAsText(element),\n]\n\nconst parseTextElement = element =>\n R.cond([\n [isPunctuation, () => setTypeAsFragment(element)],\n [startsWithPunctuation, () => splitTextElement(element)],\n [R.T, () => setContentAsMarkdown(element)],\n ])(element.content)\n\nconst lineBreakRegex = /(\\r\\n|\\n)/gm\n\nconst createLineBreak = element =>\n // Split content on line breaks, then remove extra line breaks and map objs\n element.content\n .split(lineBreakRegex)\n .filter(Boolean)\n .map(part => (part.includes('\\n') ? lineBreakObject() : textObject(part)))\n\nconst createLineBreaks = elements =>\n elements\n .map(el => (el.content.includes('\\n') ? createLineBreak(el) : el))\n .flat()\n\nexport default function parseElements(elements) {\n return createLineBreaks(elements)\n .map(el => (el.type === 'text' ? parseTextElement(el) : el))\n .flat()\n .reduce((acc, el, idx, src) => {\n // if the current element is a blank and the next element is a fragment\n if (\n el.type === 'blank' &&\n src[R.inc(idx)] &&\n src[R.inc(idx)].type === 'fragment'\n ) {\n // append a new object to the accumulator…\n return R.append(\n // …which is a merger of the blank and the fragment's content, plus a unique ID\n R.merge(el, {\n id: el.id,\n fragment: src[R.inc(idx)].content,\n }),\n acc\n )\n }\n\n // do not include fragments in the accumulator\n if (el.type === 'fragment') return acc\n\n // append all other elements to the accumulator\n return R.append(el, acc)\n }, [])\n}\n","import R from 'ramda'\n\nimport { readonlyTasks } from '../constants/taskTypes'\n\nexport default function taskTypeHasResult(type) {\n return !R.includes(type, readonlyTasks)\n}\n","import styled from 'styled-components'\nimport { variant } from 'styled-system'\n\nimport { Box, media } from '@redriverpress/system'\n\nconst variants = variant({\n variants: {\n success: {\n bg: 'green50',\n borderColor: 'green50',\n },\n danger: {\n bg: 'red50',\n borderColor: 'red50',\n },\n },\n})\n\nconst Bubble = styled(Box).attrs(() => ({\n bg: 'gray150',\n borderColor: 'gray150',\n borderRadius: 'rounded',\n flex: 1,\n px: [2, null, 3],\n py: [1, null, 2],\n position: 'relative',\n}))`\n ${variants}\n\n .drag-helper & {\n background-color: ${({ theme }) => theme.colors.yellow500};\n border-color: ${({ theme }) => theme.colors.yellow500};\n }\n\n &:after {\n content: '';\n position: absolute;\n top: 0.5rem;\n left: -0.5rem;\n width: 0;\n height: 0;\n border-top: 0.5rem solid transparent;\n border-bottom: 0.5rem solid transparent;\n border-right: 0.5rem solid;\n border-right-color: inherit;\n }\n ${media.md`\n &:after {\n top: 1rem;\n }\n `}\n`\n\nexport default Bubble\n","import styled from 'styled-components'\nimport { variant } from 'styled-system'\n\nimport { Box } from '@redriverpress/system'\n\nconst variants = variant({\n variants: {\n success: {\n bg: 'green50',\n borderColor: 'green50',\n },\n danger: {\n bg: 'red50',\n borderColor: 'red50',\n },\n },\n})\n\nconst Bubble = styled(Box).attrs(() => ({\n bg: 'gray150',\n borderColor: 'gray150',\n borderRadius: 'rounded',\n flex: 1,\n px: [2, null, 3],\n py: [1, null, 2],\n position: 'relative',\n}))`\n ${variants}\n\n .drag-helper & {\n background-color: ${({ theme }) => theme.colors.yellow500};\n border-color: ${({ theme }) => theme.colors.yellow500};\n }\n`\n\nexport default Bubble\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useEffect, useState, Fragment, lazy } from 'react'\n\nimport {\n Box,\n Icon,\n Label,\n LoadWithSuspense,\n Text,\n Textarea,\n} from '@redriverpress/system'\n\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\nimport activityPropShape from 'Packages/tasks/propShapes/activity'\nimport { ELLII_BOT_NAME } from 'Common/constants'\nimport AnswerNumber from '../../AnswerNumber'\nimport ScoredBy from '../../ScoredBy'\nimport SuggestedAnswers from '../../SuggestedAnswers'\nimport FeedbackSection from '../../FeedbackSection'\nimport RatingSelector from '../../utils/RatingSelector'\n\nconst AudioRecorder = lazy(() => import('Common/components/AudioRecorder'))\n\nconst AUDIO_LOADING_STATUSES = [\n recorderStatus.RECORDING,\n recorderStatus.STOPPING,\n recorderStatus.SAVING,\n]\n\nfunction ResultQuestion({\n attempt,\n feedback,\n index,\n isArchived,\n isTeacher,\n onFeedbackChange,\n onRecorderStatusChange,\n question,\n}) {\n const [percentage, setPercentage] = useState(\n Math.ceil(Number(feedback?.percentage) * 100)\n )\n const [feedbackAudio, setFeedbackAudio] = useState(feedback?.audio || null)\n const attemptContent = attempt?.content || ''\n const [dirty, setDirty] = useState()\n\n const questionContent = renderInlineMarkdown(question.content)\n\n // We're not setting these variables here already,\n // because the values for it aren't available when the component mounts\n const [scoredDate, setScoredDate] = useState('')\n const [authorName, setAuthorName] = useState('')\n\n const getAuthorName = () => {\n if (attempt?.auto_scored) {\n return ELLII_BOT_NAME\n }\n\n return `${feedback?.teacher?.firstName} ${feedback?.teacher?.lastName}`\n }\n\n const getUpdatedDate = () => {\n return attempt?.auto_scored\n ? attempt?.auto_score_at\n : attempt?.manual_score_at\n }\n\n // So we're using these useEffect methods to update the state variables once the values\n // are reachable in the context.\n // Also, in this component we have the ability to submit an update for the feedback, so\n // these two will do the proper value updates\n useEffect(() => {\n const newPercentage = feedback?.percentage\n ? Math.ceil(Number(feedback?.percentage) * 100)\n : 0\n\n if (!feedback?.id) {\n setDirty(false)\n setPercentage(newPercentage)\n return\n }\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n setPercentage(newPercentage)\n }, [feedback])\n\n useEffect(() => {\n if (attempt) {\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n }\n }, [attempt])\n\n const onChangeScore = value => {\n setPercentage(value)\n setDirty(true)\n onFeedbackChange({\n id: attempt?.id,\n percentage: parseFloat(value / 100),\n content: feedback.text_content,\n removeAudio: false,\n feedbackAudio,\n })\n }\n\n const onChangeComment = event => {\n setDirty(true)\n\n onFeedbackChange({\n id: attempt?.id,\n percentage: parseFloat(percentage / 100),\n content: event.target.value,\n removeAudio: false,\n feedbackAudio,\n })\n }\n\n const handleRecordedAudio = recordedAudio => {\n setFeedbackAudio(recordedAudio)\n setDirty(true)\n }\n\n const handleAudioDeletion = () => {\n setFeedbackAudio(null)\n setDirty(true)\n }\n\n const handleStatusChange = status => {\n onRecorderStatusChange(AUDIO_LOADING_STATUSES.includes(status))\n }\n\n useEffect(() => {\n if (feedbackAudio) {\n const updatedRemoveAudio = !feedbackAudio\n onFeedbackChange({\n id: attempt?.id,\n percentage: parseFloat(percentage / 100),\n content: feedback?.text_content,\n removeAudio: updatedRemoveAudio,\n feedbackAudio,\n })\n }\n }, [feedbackAudio])\n\n // CONDITIONS TO DISPLAY THE COMPONENTS\n const shouldShowScoredByLabel =\n isTeacher && attempt && (feedback?.id || attempt?.auto_scored)\n\n const shouldShowTeacherFeedbackStudentSide =\n attempt &&\n (feedback?.id || attempt?.auto_scored) &&\n (!isTeacher || isArchived)\n\n const shouldShowScoreAndCommentAreaTeacherSide =\n isTeacher && !isArchived && attempt\n\n const hasSuggestedAnswers =\n !!question.suggested_answers && question.suggested_answers?.length > 0\n\n return (\n \n \n {/* Question Header */}\n \n \n \n\n {/* Question content */}\n \n\n {/* Attempt content */}\n \n \n Student’s answer\n \n {attemptContent ? (\n \n {attemptContent.split('\\n').map((p, idx) => (\n \n {p}\n \n ))}\n \n ) : (\n \n \n \n {isTeacher ? 'The student' : 'You'} did not answer\n this question.\n \n \n )}\n \n\n {/* Suggested answers */}\n {hasSuggestedAnswers && (\n \n )}\n\n {/* ScoredBy label */}\n {shouldShowScoredByLabel && (\n \n \n \n )}\n\n {/* Teacher feedback - Student side */}\n {shouldShowTeacherFeedbackStudentSide && (\n \n )}\n\n {/* Score and comment area - Teacher side */}\n {shouldShowScoreAndCommentAreaTeacherSide && (\n \n \n \n \n \n \n \n \n \n \n \n \n {dirty && (\n \n )}\n \n )}\n \n \n )\n}\n\nResultQuestion.defaultProps = {\n feedback: null,\n attempt: null,\n isArchived: false,\n}\n\nResultQuestion.propTypes = {\n attempt: PropTypes.shape(activityPropShape),\n index: PropTypes.number.isRequired,\n question: PropTypes.shape({\n id: PropTypes.number,\n content: PropTypes.string,\n image_url: PropTypes.string,\n suggested_answers: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n content: PropTypes.string,\n })\n ),\n }).isRequired,\n feedback: PropTypes.shape({\n id: PropTypes.number,\n percentage: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n text_content: PropTypes.string,\n sourceable_id: PropTypes.number,\n sourceable_type: PropTypes.string,\n audio: PropTypes.string,\n audio_url: PropTypes.string,\n teacher: PropTypes.shape({\n isCurrentUser: PropTypes.bool,\n firstName: PropTypes.string,\n lastName: PropTypes.string,\n }),\n }),\n onFeedbackChange: PropTypes.func.isRequired,\n isTeacher: PropTypes.bool.isRequired,\n isArchived: PropTypes.bool,\n onRecorderStatusChange: PropTypes.func.isRequired,\n}\n\nexport default ResultQuestion\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useState, useRef, useEffect } from 'react'\n\nimport { Box, Icon, List, Button, Loading } from '@redriverpress/system'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nimport postFeedback from 'Packages/tasks/services/postFeedback'\nimport ResultQuestion from './ResultQuestion'\n\nfunction Results({\n attempts,\n questions,\n isTeacher,\n onFeedbackSent,\n student,\n isClassArchived,\n}) {\n const isArchived = () => {\n if (!isTeacher) return\n return student.isArchived || isClassArchived\n }\n\n const createFeedbackObjects = () =>\n attempts.map(a =>\n R.mergeLeft(a.feedback, {\n id: null,\n percentage: a.percentage,\n text_content: '',\n sourceable_id: a.id,\n sourceable_type: a.type,\n grading_item_id: a.grading_item_id,\n })\n )\n\n const [feedbacks, setFeedbacks] = useState(createFeedbackObjects())\n const [error, setError] = useState(false)\n const [loading, setLoading] = useState(false)\n const [activityHasUnsavedFeedback, setActivityHasUnsavedFeedback] = useState(\n false\n )\n const [isDisabled, setIsDisabled] = useState(false)\n\n useEffect(() => {\n setFeedbacks(createFeedbackObjects())\n setActivityHasUnsavedFeedback(false)\n }, [attempts])\n\n const findExistingFeedbackIndex = id =>\n R.findIndex(R.propEq('sourceable_id', id))(feedbacks)\n\n const hasContent = feedback =>\n R.not(\n feedback.percentage === teacherScoreValues.EMPTY_VALUE &&\n feedback.text_content.trim() === ''\n )\n\n const filterOutBlank = arr => R.filter(hasContent, arr)\n\n const itemRef = useRef(null)\n\n const handleFeedback = ({\n id,\n percentage,\n content,\n feedbackAudio,\n removeAudio,\n }) => {\n const existingIndex = findExistingFeedbackIndex(id)\n const clonedFb = R.clone(feedbacks)\n if (clonedFb.length === 0) return\n\n clonedFb[existingIndex].percentage = percentage\n clonedFb[existingIndex].text_content = content\n clonedFb[existingIndex].audio = feedbackAudio\n clonedFb[existingIndex].remove_audio = removeAudio\n setActivityHasUnsavedFeedback(true)\n setFeedbacks(clonedFb)\n }\n\n const handleSubmitFeedback = () => {\n setLoading(true)\n setError(false)\n postFeedback({\n feedback: filterOutBlank(feedbacks),\n })\n .then(response => {\n setLoading(false)\n if (response.data.errors) {\n setError(true)\n } else {\n setFeedbacks(response.data)\n setActivityHasUnsavedFeedback(false)\n const scrolly = () =>\n itemRef.current.scrollIntoView({ behavior: 'smooth' })\n setTimeout(scrolly, 300)\n if (onFeedbackSent) onFeedbackSent()\n }\n })\n .catch(() => {\n setLoading(false)\n setError(true)\n })\n }\n\n if (loading) return \n\n return (\n \n {/* this following span is used to scroll to top after submitting feedback */}\n \n \n {questions.map((question, index) => {\n const attempt = attempts.find(a => a.question_id === question.id)\n\n return (\n \n handleFeedback({\n id,\n percentage,\n content,\n feedbackAudio,\n removeAudio,\n })\n }\n onRecorderStatusChange={disabledStatus =>\n setIsDisabled(disabledStatus)\n }\n />\n )\n })}\n \n {isTeacher && (\n \n {error && (\n \n An error ocurred. Please try saving it again.\n \n )}\n \n Submit Feedback\n \n \n \n )}\n \n )\n}\n\nResults.defaultProps = {\n isTeacher: false,\n onFeedbackSent: undefined,\n student: null,\n}\n\nResults.propTypes = {\n attempts: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n correct: PropTypes.bool,\n user_id: PropTypes.number,\n attemptable_id: PropTypes.number,\n activity_id: PropTypes.number,\n attemptable: PropTypes.object,\n })\n ).isRequired,\n questions: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n content: PropTypes.string,\n answer_form: PropTypes.string,\n audio_url: PropTypes.string,\n image_url: PropTypes.string,\n image_caption: PropTypes.string,\n image_alt_text: PropTypes.string,\n })\n ).isRequired,\n isTeacher: PropTypes.bool,\n onFeedbackSent: PropTypes.func,\n student: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n first_name: PropTypes.string,\n last_name: PropTypes.string,\n isArchived: PropTypes.bool,\n }),\n isClassArchived: PropTypes.bool.isRequired,\n}\n\nexport default Results\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useState, useEffect, lazy } from 'react'\n\nimport {\n Audio,\n Box,\n Icon,\n Image,\n Label,\n Link,\n LoadWithSuspense,\n Text,\n Textarea,\n} from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\n\nimport { ELLII_BOT_NAME } from 'Common/constants'\nimport ScoredBy from '../../ScoredBy'\nimport FeedbackSection from '../../FeedbackSection'\nimport SuggestedAnswers from '../../SuggestedAnswers'\nimport AnswerNumber from '../../AnswerNumber'\nimport activityPropShape from '../../../propShapes/activity'\nimport RatingSelector from '../../utils/RatingSelector'\n\nconst AudioRecorder = lazy(() => import('Common/components/AudioRecorder'))\n\nconst AUDIO_LOADING_STATUSES = [\n recorderStatus.RECORDING,\n recorderStatus.STOPPING,\n recorderStatus.SAVING,\n]\n\nfunction ResultQuestion({\n attempt,\n feedback,\n index,\n isArchived,\n isTeacher,\n onFeedbackChange,\n onRecorderStatusChange,\n question,\n}) {\n const [percentage, setPercentage] = useState(\n Math.ceil(Math.floor(parseFloat(feedback?.percentage) * 100))\n )\n\n const [feedbackAudio, setFeedbackAudio] = useState(feedback?.audio || null)\n const attemptAudio = attempt?.audio || ''\n const audioTranscription = attempt?.content\n const [dirty, setDirty] = useState()\n\n const questionContent = renderInlineMarkdown(question.content)\n\n // We're not setting these variables here already,\n // because the values for it aren't available when the component mounts\n const [authorName, setAuthorName] = useState('')\n const [scoredDate, setScoredDate] = useState('')\n\n const getAuthorName = () => {\n if (attempt?.auto_scored) {\n return ELLII_BOT_NAME\n }\n return `${feedback?.teacher?.firstName} ${feedback?.teacher?.lastName}`\n }\n\n const getUpdatedDate = () => {\n return attempt?.auto_scored\n ? attempt?.auto_score_at\n : attempt?.manual_score_at\n }\n\n // So we're using these useEffect methods to update the state variables once the values\n // are reachable in the context.\n // Also, in this component we have the ability to submit an update for the feedback, so\n // these two will do the proper value updates\n useEffect(() => {\n const newPercentage = feedback?.percentage\n ? Math.ceil(Math.floor(parseFloat(feedback?.percentage) * 100))\n : 0\n\n if (!feedback?.id) {\n setDirty(false)\n setPercentage(newPercentage)\n return\n }\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n setPercentage(newPercentage)\n }, [feedback])\n\n useEffect(() => {\n if (!attempt) return\n setAuthorName(getAuthorName())\n setScoredDate(getUpdatedDate())\n }, [attempt])\n\n const onChangeScore = value => {\n setPercentage(value)\n setDirty(true)\n onFeedbackChange({\n id: attempt?.id,\n percentage: parseFloat(value / 100),\n content: feedback.text_content,\n removeAudio: false,\n feedbackAudio,\n })\n }\n\n const onChangeComment = event => {\n setDirty(true)\n\n onFeedbackChange({\n id: attempt?.id,\n percentage: parseFloat(percentage / 100),\n content: event.target.value,\n removeAudio: false,\n feedbackAudio,\n })\n }\n\n const handleRecordedAudio = recordedAudio => {\n setFeedbackAudio(recordedAudio)\n setDirty(true)\n }\n\n const handleAudioDeletion = () => {\n setFeedbackAudio(null)\n setDirty(true)\n }\n\n const handleStatusChange = status => {\n onRecorderStatusChange(AUDIO_LOADING_STATUSES.includes(status))\n }\n\n useEffect(() => {\n if (feedbackAudio) {\n const updatedRemoveAudio = !feedbackAudio\n onFeedbackChange({\n id: attempt?.id,\n percentage: parseFloat(percentage / 100),\n content: feedback?.text_content,\n removeAudio: updatedRemoveAudio,\n feedbackAudio,\n })\n }\n }, [feedbackAudio])\n\n // CONDITIONS TO DISPLAY THE COMPONENTS\n const shouldShowScoredByLabel =\n isTeacher && attempt && (feedback?.id || attempt?.auto_scored)\n\n const shouldShowTeacherFeedbackStudentSide =\n feedback &&\n (feedback?.id || attempt?.auto_scored) &&\n (!isTeacher || isArchived)\n\n const shouldShowScoreAndCommentAreaTeacherSide =\n isTeacher && !isArchived && attempt\n\n const hasSuggestedAnswers =\n !!question.suggested_answers && question.suggested_answers?.length > 0\n\n return (\n \n \n {/* Question Header */}\n \n \n \n\n {/* Question content */}\n \n {question.image_url && (\n \n \n \n \n \n \n \n \n )}\n\n {/* Attempt content */}\n \n \n Student’s answer\n \n {attemptAudio ? (\n \n )}\n {audioTranscription && (\n \n \n Transcription\n \n \n {audioTranscription}\n \n \n )}\n \n\n {/* ScoredBy label */}\n {shouldShowScoredByLabel && (\n \n \n \n )}\n\n {/* Teacher feedback - Student side */}\n {shouldShowTeacherFeedbackStudentSide && (\n \n )}\n\n {/* Suggested answers */}\n {hasSuggestedAnswers && (\n \n )}\n\n {/* Score and comment area - Teacher side */}\n {shouldShowScoreAndCommentAreaTeacherSide && (\n <>\n \n \n \n \n \n \n \n \n \n \n \n {dirty && (\n \n )}\n \n )}\n \n \n )\n}\n\nResultQuestion.defaultProps = {\n feedback: null,\n attempt: null,\n isArchived: false,\n}\n\nResultQuestion.propTypes = {\n attempt: PropTypes.shape(activityPropShape),\n index: PropTypes.number.isRequired,\n question: PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n image_url: PropTypes.string.isRequired,\n suggested_answers: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n content: PropTypes.string.isRequired,\n })\n ),\n }).isRequired,\n feedback: PropTypes.shape({\n id: PropTypes.number,\n percentage: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n text_content: PropTypes.string,\n sourceable_id: PropTypes.number,\n sourceable_type: PropTypes.string,\n audio: PropTypes.string,\n audio_url: PropTypes.string,\n teacher: PropTypes.shape({\n isCurrentUser: PropTypes.bool,\n firstName: PropTypes.string,\n lastName: PropTypes.string,\n }),\n }),\n onFeedbackChange: PropTypes.func.isRequired,\n isTeacher: PropTypes.bool.isRequired,\n isArchived: PropTypes.bool,\n onRecorderStatusChange: PropTypes.func.isRequired,\n}\n\nexport default ResultQuestion\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { useState, useRef, useEffect } from 'react'\n\nimport {\n Box,\n Icon,\n List,\n Button,\n Loading,\n MonoButton,\n} from '@redriverpress/system'\nimport { teacherScoreValues } from 'Packages/assignments/constants/teacherScores'\n\nimport postFeedback from 'Packages/tasks/services/postFeedback'\nimport ResultQuestion from './ResultQuestion'\n\nfunction Results({\n attempts,\n questions,\n isTeacher,\n onFeedbackSent,\n student,\n onClose,\n isClassArchived,\n}) {\n const isArchived = () => {\n if (!isTeacher) return\n return student.isArchived || isClassArchived\n }\n\n const createFeedbackObjects = () => {\n return attempts.map(a => {\n return R.mergeLeft(a.feedback, {\n id: null,\n percentage: a.percentage,\n text_content: '',\n sourceable_id: a.id,\n sourceable_type: a.type,\n grading_item_id: a.grading_item_id,\n })\n })\n }\n\n const [feedbacks, setFeedbacks] = useState(createFeedbackObjects())\n const [error, setError] = useState(false)\n const [loading, setLoading] = useState(false)\n const [activityHasUnsavedFeedback, setActivityHasUnsavedFeedback] = useState(\n false\n )\n const [isDisabled, setIsDisabled] = useState(false)\n\n useEffect(() => {\n setFeedbacks(createFeedbackObjects())\n setActivityHasUnsavedFeedback(false)\n }, [attempts])\n\n const findExistingFeedbackIndex = id =>\n R.findIndex(R.propEq('sourceable_id', id))(feedbacks)\n\n const hasContent = feedback =>\n R.not(\n feedback.percentage === teacherScoreValues.EMPTY_VALUE &&\n feedback.text_content.trim() === ''\n )\n\n const filterOutBlank = arr => R.filter(hasContent, arr)\n\n const itemRef = useRef(null)\n\n const handleFeedback = ({\n id,\n percentage,\n content,\n feedbackAudio,\n removeAudio,\n }) => {\n const existingIndex = findExistingFeedbackIndex(id)\n const clonedFb = R.clone(feedbacks)\n if (clonedFb.length === 0) return\n\n clonedFb[existingIndex].percentage = percentage\n clonedFb[existingIndex].text_content = content\n clonedFb[existingIndex].audio = feedbackAudio\n clonedFb[existingIndex].remove_audio = removeAudio\n setActivityHasUnsavedFeedback(true)\n setFeedbacks(clonedFb)\n }\n\n const handleSubmitFeedback = () => {\n setLoading(true)\n setError(false)\n postFeedback({\n feedback: filterOutBlank(feedbacks),\n })\n .then(response => {\n setLoading(false)\n if (response.data.errors) {\n setError(true)\n } else {\n setFeedbacks(response.data)\n setActivityHasUnsavedFeedback(false)\n const scrolly = () =>\n itemRef.current.scrollIntoView({ behavior: 'smooth' })\n setTimeout(scrolly, 300)\n if (onFeedbackSent) onFeedbackSent()\n }\n })\n .catch(() => {\n setLoading(false)\n setError(true)\n })\n }\n\n if (loading) return \n\n return (\n \n {/* this following span is used to scroll to top after submitting feedback */}\n \n \n {questions.map((question, index) => {\n const attempt = attempts.find(a => a.question_id === question.id)\n\n return (\n \n handleFeedback({\n id,\n percentage,\n content,\n feedbackAudio,\n removeAudio,\n })\n }\n onRecorderStatusChange={disabledStatus =>\n setIsDisabled(disabledStatus)\n }\n />\n )\n })}\n \n {isTeacher && (\n \n {error && (\n \n An error ocurred. Please try saving it again.\n \n )}\n \n \n \n Exit\n \n \n Submit Feedback\n \n \n \n \n )}\n \n )\n}\n\nResults.defaultProps = {\n isTeacher: false,\n onFeedbackSent: undefined,\n student: null,\n}\n\nResults.propTypes = {\n attempts: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n user_id: PropTypes.number,\n attemptable_id: PropTypes.number,\n activity_id: PropTypes.number,\n attemptable: PropTypes.object,\n })\n ).isRequired,\n questions: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n content: PropTypes.string,\n answers: PropTypes.array,\n audio_url: PropTypes.string,\n image_url: PropTypes.string,\n image_caption: PropTypes.string,\n image_alt_text: PropTypes.string,\n })\n ).isRequired,\n isTeacher: PropTypes.bool,\n onFeedbackSent: PropTypes.func,\n onClose: PropTypes.func.isRequired,\n student: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n first_name: PropTypes.string,\n last_name: PropTypes.string,\n isArchived: PropTypes.bool,\n }),\n isClassArchived: PropTypes.bool.isRequired,\n}\n\nexport default Results\n","import R from 'ramda'\n\nimport {\n ImageMatchingResults,\n MatchingResults,\n ListenAndTypeResults,\n MultipleChoiceResults,\n PutInOrderResults,\n SeeAndSpellResults,\n SequencingResults,\n TrueOrFalseResults,\n} from '@redriverpress/system'\n\nimport {\n imageMatching,\n listenAndType,\n matching,\n multipleChoice,\n openEndedQuestions,\n putInOrder,\n seeAndSpell,\n sequencing,\n speaking,\n trueOrFalse,\n} from '../constants/taskTypes'\n\n/**\n * These components were not added to the @redriversystem because they are not necessary in the NextJs,\n * since there's no auto scoring for the OEQ and Speaking Task.\n */\n\nimport OEQResults from './resultsPages/openEndedQuestions/Results'\n\nimport SpkResults from './resultsPages/speaking/Results'\nimport { activityPropShapeV2 } from '../propShapes/activity'\n\nexport default function ResultsSelector({ activity, ...props }) {\n const { taskType } = activity\n const getResultsData = () =>\n R.cond([\n [\n R.equals(imageMatching),\n R.always({\n component: ImageMatchingResults,\n data: {\n answers: activity.answers,\n images: activity.task.images,\n },\n }),\n ],\n [\n R.equals(listenAndType),\n R.always({\n component: ListenAndTypeResults,\n data: {\n answers: activity.answers,\n paragraphs: activity.task.paragraphs,\n },\n }),\n ],\n [\n R.equals(matching),\n R.always({\n component: MatchingResults,\n data: {\n answers: activity.answers,\n words: activity.task.words,\n },\n }),\n ],\n [\n R.equals(multipleChoice),\n R.always({\n component: MultipleChoiceResults,\n data: {\n answers: activity.answers,\n },\n }),\n ],\n [\n R.equals(openEndedQuestions),\n R.always({\n component: OEQResults,\n data: {\n attempts: activity.attempts,\n questions: activity.task.questions,\n },\n }),\n ],\n [\n R.equals(putInOrder),\n R.always({\n component: PutInOrderResults,\n data: {\n answers: activity.answers,\n bubbles: activity.task.bubbles,\n },\n }),\n ],\n [\n R.equals(seeAndSpell),\n R.always({\n component: SeeAndSpellResults,\n data: {\n answers: activity.answers,\n images: activity.task.images,\n },\n }),\n ],\n [\n R.equals(sequencing),\n R.always({\n component: SequencingResults,\n data: {\n answers: activity.answers,\n sentences: activity.task.sentences,\n },\n }),\n ],\n\n [\n R.equals(speaking),\n R.always({\n component: SpkResults,\n data: {\n attempts: activity.attempts,\n questions: activity.task.questions,\n },\n }),\n ],\n [\n R.equals(trueOrFalse),\n R.always({\n component: TrueOrFalseResults,\n data: {\n answers: activity.answers,\n statements: activity.task.statements,\n },\n }),\n ],\n [R.T, () => null],\n ])(taskType)\n\n const { component: ResultComponent, data } = getResultsData(taskType)\n\n return \n}\n\nResultsSelector.propTypes = {\n activity: activityPropShapeV2.isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\n\nimport { Box, Text, Select } from '@redriverpress/system'\nimport { generalTimeFormat } from 'Common/utils/datetime'\nimport { PartialScoreWarning } from 'Packages/assignments'\n\nimport * as taskTypes from '../../constants/taskTypes'\nimport activityShape from '../../propShapes/activity'\n\nexport default function AttemptSelector({\n activity,\n isTeacher,\n student,\n lesson,\n onActivityChange,\n options,\n}) {\n const getActivityData = () => {\n if (activity.version === 2) {\n const isReadOnly = taskTypes.readonlyTasks.includes(activity.taskType)\n\n const scoreDisplay = isReadOnly\n ? 'n/a'\n : `${Math.ceil(Number(activity.percentage) * 100)}%`\n\n return {\n taskType: activity.taskType,\n scoreDisplay,\n isPartialScore: activity.partial_score,\n timeDisplay: activity.time_display,\n finishedAt: activity.finished_at,\n taskTitle: activity.task.title,\n }\n }\n\n return {\n ...activity,\n finishedAt: activity.finished_at,\n taskTitle: activity.task.title,\n }\n }\n\n const {\n taskType,\n scoreDisplay,\n isPartialScore,\n timeDisplay,\n finishedAt,\n taskTitle,\n } = getActivityData()\n\n return (\n <>\n \n \n {lesson && (\n \n {lesson.lesson_title || lesson.title}, {taskTitle}\n \n )}\n {student && (\n \n {student.name || `${student.firstName} ${student.lastName}`}\n \n )}\n \n {options && options.length > 1 && (\n \n {\n return `Attempt #${index + 1}`\n }}\n getOptionValue={opt => opt.id}\n value={activity}\n label='Select Attempt'\n icon='file-check'\n onChange={r => {\n onActivityChange(r)\n }}\n />\n \n )}\n \n \n Score\n \n {scoreDisplay}\n {isPartialScore && }\n \n \n \n Time\n {timeDisplay}\n \n \n Completed\n {generalTimeFormat(finishedAt, 'MMM D, YYYY')}\n \n \n \n \n )\n}\n\nAttemptSelector.defaultProps = {\n options: null,\n student: null,\n}\n\nAttemptSelector.propTypes = {\n activity: PropTypes.shape(activityShape).isRequired,\n isTeacher: PropTypes.bool.isRequired,\n student: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n first_name: PropTypes.string,\n last_name: PropTypes.string,\n isArchived: PropTypes.bool,\n }),\n lesson: PropTypes.shape({\n id: PropTypes.number.isRequired,\n lesson_title: PropTypes.string,\n title: PropTypes.string,\n }).isRequired,\n onActivityChange: PropTypes.func.isRequired,\n options: PropTypes.arrayOf(PropTypes.object),\n}\n","import PropTypes from 'prop-types'\nimport { useState, useEffect } from 'react'\nimport R from 'ramda'\nimport { motion } from 'framer-motion'\n\nimport { Box, Text, Button, Icon, LoadingSpinner } from '@redriverpress/system'\nimport RichTextarea from 'Common/components/RichTextarea'\nimport Alert from 'Common/components/alert/Alert'\nimport getWithXHR from 'Common/utils/getWithXHR'\nimport analyticsTrack from 'Common/utils/analytics'\n\nimport { feedbackUrl } from 'Endpoints'\n\nimport postFeedback from '../../services/postFeedback'\n\nconst MotionButton = motion(Button)\nexport default function TeacherComments({\n taskId,\n isStudent,\n onFeedbackSent,\n student,\n isClassArchived,\n}) {\n const [loading, setLoading] = useState(false)\n const [savedMessage, setSavedMessage] = useState(null)\n const [error, setError] = useState(false)\n\n const [updatingComment, setUpdatingComment] = useState(null)\n const [shouldSaveFeedback, setShouldSaveFeedback] = useState(false)\n\n const [comment, setComment] = useState({\n id: null,\n text_content: '',\n sourceable_id: taskId,\n sourceable_type: 'Homework::Task',\n percentage: null,\n })\n\n useEffect(() => {\n // had to go for this approach to do api calls instead of swr because of cache issues\n getWithXHR(`${feedbackUrl}?by_homework_task=${taskId}`).then(data => {\n if (data.length) {\n const orderedData = R.sort(R.ascend(R.prop('id')), data)\n setComment(orderedData[0])\n }\n })\n }, [])\n\n const saveFeedback = () => {\n // This checks if the content saved for feedback has any\n // formatted style from the rich text formatter. We're using\n // this for tracking purposes.\n const regex = /<\\/?(strong|span|em|u|li|ul)\\s*\\/?>/gm\n const formatted = regex.test(updatingComment)\n\n setLoading(true)\n setError(false)\n\n postFeedback({ feedback: [comment] })\n .then(resp => {\n analyticsTrack('Saved Feedback', { formatted })\n setLoading(false)\n if (resp.data.errors) {\n setError(true)\n } else {\n setComment(resp.data[0])\n setSavedMessage('Comments Saved')\n setTimeout(() => setSavedMessage(null), 2000)\n if (onFeedbackSent) onFeedbackSent()\n }\n })\n .catch(() => {\n setError(true)\n setLoading(false)\n })\n }\n\n // This step is needed in order to avoid unwanted re-renders, while\n // the user is selecting styles from the RichTextarea component.\n // If 'text_content' is set in the onChange call, it will cause\n // the Editor instance within RichTextArea to reload, and it\n // interrupts the styling flow for the user, since any character\n // will lose selection focus. The typing cursor will be placed\n // at the end of the textarea. So, the payload to be saved should\n // be set only when the user clicks the 'Save' button.\n const prepareCommentToBeSaved = () => {\n setComment(prevState => ({ ...prevState, text_content: updatingComment }))\n setShouldSaveFeedback(true)\n }\n\n useEffect(() => {\n shouldSaveFeedback && saveFeedback()\n }, [shouldSaveFeedback])\n\n if (isStudent && (!comment || !comment.text_content)) return null\n\n const getButtonContent = () => {\n if (loading)\n return (\n <>\n Saving...\n \n \n )\n\n if (savedMessage)\n return (\n <>\n {savedMessage}\n \n \n )\n\n return (\n <>\n Save Comments\n \n \n )\n }\n\n return (\n \n {isStudent ? (\n \n \n \n Teacher's Comments\n \n \n \n \n \n ) : (\n <>\n \n {\n setUpdatingComment(newValue)\n }}\n minHeight='16rem'\n />\n \n \n {error && (\n \n \n An error ocurred. Please try saving it again.\n \n \n )}\n \n {getButtonContent()}\n \n \n \n )}\n \n )\n}\n\nTeacherComments.defaultProps = {\n isStudent: false,\n onFeedbackSent: undefined,\n student: null,\n isClassArchived: false,\n}\n\nTeacherComments.propTypes = {\n taskId: PropTypes.number.isRequired,\n isStudent: PropTypes.bool,\n onFeedbackSent: PropTypes.func,\n student: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n first_name: PropTypes.string,\n last_name: PropTypes.string,\n isArchived: PropTypes.bool,\n }),\n isClassArchived: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport R from 'ramda'\nimport { useQuery } from 'react-query'\n\nimport styled from 'styled-components'\nimport { Dialog, Heading, media } from '@redriverpress/system'\n\nimport getWithXHR from 'Common/utils/getWithXHR'\nimport { activitiesUrl, activityUrl } from 'Endpoints'\n\nimport * as taskTypes from '../../constants/taskTypes'\nimport ResultsSelector from '../ResultsSelector'\nimport getTaskItems from '../../utils/getTaskItems'\nimport OldResultsSelector from '../OldResultsSelector'\nimport AttemptSelector from './AttemptSelector'\nimport TeacherComments from './TeacherComments'\n\nconst DialogContent = styled(Dialog.StyledContent)`\n max-height: 90vh;\n ${media.md`\n margin-top: ${props => props.theme.space[4]};\n padding-left: ${props => props.theme.space[4]};\n padding-right: ${props => props.theme.space[4]};\n max-width: 80ch;\n `}\n`\n\nexport default function ReviewModal({\n taskId,\n isOpen,\n onClose,\n title,\n isStudent,\n onFeedbackSent,\n isClassArchived,\n ...props\n}) {\n // this loads the options for the attempt selector\n const { data: activities } = useQuery(\n ['activities', taskId],\n () => getWithXHR(activitiesUrl(taskId)),\n {\n suspense: true,\n refetchOnWindowFocus: false,\n }\n )\n\n const [currentActivityId, setCurrentActivityId] = useState(activities[0].id)\n\n const { data: currentActivity, refetch } = useQuery(\n ['currentActivity', currentActivityId],\n async () => getWithXHR(activityUrl(currentActivityId)),\n {\n suspense: true,\n refetchOnWindowFocus: false,\n }\n )\n\n const getActivity = version => {\n if (version === 1) {\n return {\n ...currentActivity,\n taskItems: getTaskItems(currentActivity),\n taskType: currentActivity.task.taskable.type,\n }\n }\n\n return {\n ...currentActivity,\n taskType: currentActivity.task.type,\n }\n }\n\n const activity = getActivity(currentActivity.version)\n\n return (\n \n \n \n \n \n {title}\n \n \n setCurrentActivityId(act.id)}\n {...props}\n />\n {currentActivity.version === 1 ? (\n {\n refetch()\n onFeedbackSent(params)\n }}\n onClose={onClose}\n isClassArchived={isClassArchived}\n {...props}\n />\n ) : (\n {\n refetch()\n onFeedbackSent(params)\n }}\n onClose={onClose}\n isClassArchived={isClassArchived}\n {...props}\n />\n )}\n\n {!R.includes(activity.taskType, taskTypes.teacherMarkableTasks) && (\n \n )}\n \n \n )\n}\n\nReviewModal.defaultProps = {\n isStudent: false,\n onFeedbackSent: undefined,\n isClassArchived: false,\n}\n\nReviewModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n title: PropTypes.string.isRequired,\n taskId: PropTypes.number.isRequired,\n isStudent: PropTypes.bool,\n onFeedbackSent: PropTypes.func,\n isClassArchived: PropTypes.bool,\n}\n","import styled from 'styled-components'\n\nimport { Box } from '@redriverpress/system'\n\nexport const CorrectWrapper = styled(Box).attrs(() => ({\n as: 'span',\n bg: 'green50',\n display: 'inline-block',\n px: 2,\n borderRadius: 'rounded',\n}))`\n &:after {\n content: '\\f00c';\n font-family: 'Font Awesome 5 Pro';\n color: ${props => props.theme.colors.green700};\n display: inline-block;\n margin-left: ${props => props.theme.space[2]};\n }\n`\n\nexport const IncorrectWrapper = styled(Box).attrs(() => ({\n as: 'span',\n bg: 'red50',\n display: 'inline-block',\n px: 2,\n mr: 2,\n borderRadius: 'rounded',\n}))`\n &:after {\n content: '\\f00d';\n font-family: 'Font Awesome 5 Pro';\n color: ${props => props.theme.colors.red500};\n display: inline-block;\n margin-left: ${props => props.theme.space[2]};\n }\n // blank was submitted empty:\n &:empty:after {\n margin-left: ${props => props.theme.space[5]};\n }\n`\n","// POSITIONS\nexport const instructions = 'instructions'\nexport const results = 'results'\nexport const reviewAndSubmit = 'reviewAndSubmit'\nexport const namedPositions = [instructions, results, reviewAndSubmit]\n","import R from 'ramda'\n\nimport getTaskItems from 'Packages/tasks/utils/getTaskItems'\nimport { batchSubmissionTasks } from 'Packages/tasks/constants/taskTypes'\n\nimport {\n instructions,\n results,\n reviewAndSubmit,\n namedPositions,\n} from './constants'\n\n// REDUCER HELPER FUNCTIONS\n// Only used internally to the activity reducer\n\n// Initialize position based on a bunch of logic wheeeeee\nexport const _initializePosition = ({\n attempts,\n taskType,\n taskItems,\n submitted,\n}) => {\n // Batch submission tasks need to resume on:\n // - results, if submitted; or,\n // - reviewAndSubmit if all questions answered but activity not submitted; or,\n // - most recent unattempted question, if any\n if (batchSubmissionTasks.includes(taskType)) {\n if (submitted) return results\n if (R.equals(attempts.length, taskItems.length)) return reviewAndSubmit\n return attempts.length\n }\n if (R.equals(attempts.length, taskItems.length)) return results\n // This basically only applies to T/F tasks, as aside from OEQ & Speaking it's the\n // only task where we submit attempts before the completion of the activity.\n return attempts.length\n}\n\n// Include defaults for position and reviewed, and\n// lift some nested properties up for ease of access, including task items by task type\nexport const _formatActivity = activity =>\n R.mergeRight(activity, {\n audioUrl: R.path(['task', 'taskable', 'audio_url'], activity) || null,\n get currentTaskItem() {\n return this.taskItems[this.position] || this.taskItems[0]\n },\n get position() {\n if (activity.activityable?.fixing) return 0\n if (R.equals(activity.attempts.length, 0)) return instructions\n return _initializePosition({\n attempts: activity.attempts,\n taskType: this.taskType,\n taskItems: this.taskItems,\n submitted: activity.submitted,\n })\n },\n reviewed: false,\n taskType: R.path(['task', 'taskable', 'type'], activity),\n taskItems: getTaskItems(activity),\n })\n\nexport const _createAttempt = (state, attempt) =>\n R.mergeRight(state, { attempts: R.append(attempt, state.attempts) })\n\n// For activities where all attempts are submitted at once, e.g. Multiple Choice\nexport const _createAttempts = (state, attempts) => {\n return R.mergeRight(state, { attempts })\n}\n\nexport const _deleteAttempt = (state, attemptId) => {\n return R.mergeRight(state, {\n attempts: R.filter(a => a.id !== attemptId, state.attempts),\n })\n}\n\nexport const _updateAttempt = (state, attempt) => {\n const { id, ...attemptBody } = attempt\n const attemptId = R.propEq('id', id)\n const attemptIdx = R.findIndex(attemptId, state.attempts)\n const updatedAttempt = R.mergeRight(R.find(attemptId, state.attempts), {\n id,\n ...attemptBody,\n })\n // Ramda won't return original list if idx passed to R.update is < 0\n // Instead, it treats negative indexes as inverse indexes, which is not native to JS\n // Details: https://github.com/ramda/ramda/issues/2804\n return attemptIdx < 0\n ? state\n : R.mergeRight(state, {\n attempts: R.update(attemptIdx, updatedAttempt, state.attempts),\n })\n}\n\nexport const _updatePosition = (state, payload) => {\n if (typeof payload === 'number') {\n if (payload > state.taskItems.length)\n throw new Error('Requested position exceeds number of task items')\n return R.mergeRight(state, {\n position: payload,\n currentTaskItem: state.taskItems[payload],\n })\n }\n if (R.contains(payload, namedPositions))\n return R.mergeRight(state, { position: payload })\n throw new Error(`\n Invalid position requested: ${payload}.\n Must be an integer or one of the named positions: ${namedPositions.flatten()}\n `)\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { createContext, useContext, useReducer } from 'react'\n\nimport getInitialState from 'Common/utils/getInitialState'\n\nimport { instructions, results, reviewAndSubmit } from './constants'\nimport {\n _formatActivity,\n _createAttempt,\n _deleteAttempt,\n _createAttempts,\n _updateAttempt,\n _updatePosition,\n} from './helpers'\n\n/*\n *\n * ACTION CREATORS\n * These get passed to dispatch(), e.g. dispatchActivity(createActivity(foo))\n *\n */\nconst createActivity = activity => ({\n type: 'create activity',\n payload: activity,\n})\nconst flushActivity = () => ({ type: 'flush activity' })\nconst createAttempt = attempt => ({ type: 'create attempt', payload: attempt })\nconst createAttempts = attempts => ({\n type: 'create attempts',\n payload: attempts,\n})\nconst deleteAttempt = attempt => ({ type: 'delete attempt', payload: attempt })\nconst updateAttempt = attempt => ({ type: 'update attempt', payload: attempt })\nconst setSubmitted = bool => ({ type: 'submitted', payload: bool })\nconst setCurrentTaskItem = item => ({\n type: 'current task item',\n payload: item,\n})\nconst setReviewed = bool => ({ type: 'reviewed', payload: bool })\nconst incPosition = () => ({ type: 'increment position' })\nconst decPosition = () => ({ type: 'decrement position' })\nconst setPosition = pos => ({ type: 'set position', payload: pos })\nconst setScore = scoreFields => ({ type: 'set score', payload: scoreFields })\n\n/*\n *\n * THE REDUCER\n * Takes the current activity state (`state`),\n * and an action with `type` and `payload` props.\n *\n */\nconst activityReducer = (state, { type, payload }) =>\n R.cond([\n [R.equals('create activity'), () => _formatActivity(payload)],\n [R.equals('flush activity'), () => R.empty(state)],\n [R.equals('create attempt'), () => _createAttempt(state, payload)],\n [R.equals('delete attempt'), () => _deleteAttempt(state, payload)],\n [R.equals('create attempts'), () => _createAttempts(state, payload)],\n [R.equals('update attempt'), () => _updateAttempt(state, payload)],\n [R.equals('submitted'), () => R.assoc('submitted', payload, state)],\n [R.equals('reviewed'), () => R.assoc('reviewed', payload, state)],\n [R.equals('set position'), () => _updatePosition(state, payload)],\n [\n R.equals('current task item'),\n () => R.assoc('currentTaskItem', payload, state),\n ],\n [\n R.equals('increment position'),\n () =>\n R.mergeRight(state, {\n position: R.inc(state.position),\n currentTaskItem: state.taskItems[R.inc(state.position)],\n }),\n ],\n [\n R.equals('decrement position'),\n () =>\n R.mergeRight(state, {\n position: R.dec(state.position),\n currentTaskItem: state.taskItems[R.dec(state.position)],\n }),\n ],\n [\n R.equals('set score'),\n () =>\n R.mergeRight(state, {\n score: payload.score,\n scoreBase: payload.scoreBase,\n scorePercentage: payload.scorePercentage,\n }),\n ],\n [\n R.T,\n () => {\n throw new Error(`Unhandled action type: ${type}`)\n },\n ],\n ])(type)\n\n// CONTEXT OBJECTS\nconst ActivityState = createContext()\nconst ActivityDispatch = createContext()\n\nActivityState.displayName = 'ActivityState'\nActivityDispatch.displayName = 'ActivityDispatch'\n\n/*\n *\n * CUSTOM HOOK\n *\n */\nfunction useActivityContext() {\n const state = useContext(ActivityState)\n const dispatch = useContext(ActivityDispatch)\n if (state === undefined || dispatch === undefined) {\n throw new Error(\n 'useActivityContext must be used within an ActivityProvider'\n )\n }\n return [state, dispatch]\n}\n\n/*\n *\n * CONTEXT PROVIDER\n *\n */\nfunction ActivityProvider({ children }) {\n const { activity: preloadedActivity } = getInitialState()\n // Only format a preloaded activity if it's not empty\n const activityInitialState =\n !preloadedActivity || R.isEmpty(preloadedActivity)\n ? {}\n : _formatActivity(preloadedActivity)\n const [activityState, setActivityState] = useReducer(\n activityReducer,\n activityInitialState\n )\n return (\n \n \n {children}\n \n \n )\n}\n\nActivityProvider.propTypes = {\n children: PropTypes.node.isRequired,\n}\n\n// Exports for this file + others for convenience\nexport {\n ActivityProvider,\n useActivityContext,\n createActivity,\n flushActivity,\n createAttempt,\n createAttempts,\n deleteAttempt,\n updateAttempt,\n setSubmitted,\n setCurrentTaskItem,\n setReviewed,\n incPosition,\n decPosition,\n setPosition,\n setScore,\n instructions,\n results,\n reviewAndSubmit,\n}\n","import R from 'ramda'\n\nimport {\n dialogue,\n flashcardSet,\n imageMatching,\n listenAndType,\n matching,\n multipleChoice,\n openEndedQuestions,\n readWatchListen,\n readWatchListen2,\n putInOrder,\n seeAndSpell,\n sequencing,\n speaking,\n trueOrFalse,\n} from '../constants/taskTypes'\n\nexport default function getTaskItems(activity) {\n const getFromTaskable = key => R.path(['task', 'taskable', key], activity)\n return R.cond([\n [R.equals(dialogue), () => getFromTaskable('bubbles')],\n [R.equals(flashcardSet), () => getFromTaskable('flashcards')],\n [R.equals(imageMatching), () => getFromTaskable('words')],\n [\n R.equals(listenAndType),\n () => R.path(['activityable', 'paragraphs'], activity),\n ],\n [R.equals(matching), () => getFromTaskable('words')],\n [R.equals(multipleChoice), () => getFromTaskable('questions')],\n [R.equals(openEndedQuestions), () => getFromTaskable('questions')],\n [R.equals(putInOrder), () => getFromTaskable('bubbles')],\n [R.equals(readWatchListen), () => getFromTaskable('paragraphs')],\n [R.equals(readWatchListen2), () => [getFromTaskable('content')]],\n [R.equals(seeAndSpell), () => getFromTaskable('words')],\n [R.equals(sequencing), () => getFromTaskable('sentences')],\n [R.equals(speaking), () => getFromTaskable('questions')],\n [R.equals(trueOrFalse), () => getFromTaskable('statements')],\n [R.T, () => null],\n ])(getFromTaskable('type'))\n}\n","import R from 'ramda'\nimport { lazy } from 'react'\n\nimport { LoadWithSuspense } from '@redriverpress/system'\n\nimport {\n imageMatching,\n listenAndType,\n matching,\n multipleChoice,\n openEndedQuestions,\n putInOrder,\n seeAndSpell,\n sequencing,\n speaking,\n trueOrFalse,\n} from '../constants/taskTypes'\nimport activityPropShape from '../propShapes/activity'\n\nconst IMResults = lazy(() => import('./imageMatching/Results'))\nconst LTResults = lazy(() => import('./listenAndType/Results'))\nconst MatchingResults = lazy(() => import('./matching/Results'))\nconst MCResults = lazy(() => import('./multipleChoice/Results'))\nconst OEQResults = lazy(() => import('./openEndedQuestions/Results'))\nconst PIOResults = lazy(() => import('./putInOrder/Results'))\nconst SSResults = lazy(() => import('./seeAndSpell/Results'))\nconst SequencingResults = lazy(() => import('./sequencing/Results'))\nconst SpkResults = lazy(() => import('./speaking/Results'))\nconst TFResults = lazy(() => import('./trueOrFalse/Results'))\n\n/**\n * As we added a version:2 for the new activities, in order to support the version one,\n * this Selector will keep using the results for each Task Type.\n */\nexport default function OldResultsSelector({ activity, ...props }) {\n const { taskType } = activity\n const getResultsComponent = () =>\n R.cond([\n [R.equals(imageMatching), R.always(IMResults)],\n [R.equals(listenAndType), R.always(LTResults)],\n [R.equals(matching), R.always(MatchingResults)],\n [R.equals(multipleChoice), R.always(MCResults)],\n [R.equals(openEndedQuestions), R.always(OEQResults)],\n [R.equals(putInOrder), R.always(PIOResults)],\n [R.equals(seeAndSpell), R.always(SSResults)],\n [R.equals(sequencing), R.always(SequencingResults)],\n [R.equals(speaking), R.always(SpkResults)],\n [R.equals(trueOrFalse), R.always(TFResults)],\n [R.T, () => null],\n ])(taskType)\n\n return (\n \n )\n}\n\nOldResultsSelector.propTypes = {\n activity: activityPropShape.isRequired,\n}\n","import xhr from 'Common/utils/xhr'\nimport { activitiesEndpoint, broadcastEndpoint } from 'Endpoints'\n\nconst defaultOptions = {\n fixActivityId: null,\n student: true,\n}\n\nexport default function postHomeworkActivity(\n id,\n { fixActivityId, student } = defaultOptions\n) {\n const homeworkData = {\n homework_activity: {\n sourceable_type: 'Homework::Task',\n sourceable_id: id,\n },\n fix_activity_id: fixActivityId,\n }\n\n const broadcastData = {\n task_id: id,\n fix_activity_id: fixActivityId,\n }\n\n return xhr({\n url: student ? activitiesEndpoint : broadcastEndpoint,\n method: 'POST',\n data: student ? homeworkData : broadcastData,\n })\n}\n","import PropTypes from 'prop-types'\n\nimport { Box, Icon, Image, Text } from '@redriverpress/system'\n\nexport default function ResultsImage({ src, content, correct }) {\n return (\n \n \n \n \n \n \n \n {content}\n \n \n \n )\n}\n\nResultsImage.propTypes = {\n content: PropTypes.string.isRequired,\n correct: PropTypes.bool.isRequired,\n src: PropTypes.string.isRequired,\n}\n","import R from 'ramda'\nimport { Fragment } from 'react'\n\nimport { Box, TaskAudio, Text } from '@redriverpress/system'\n\nimport parseElements from '../../parsers/parseElements'\n\nexport default function renderParagraphs({ paragraphs, blankRenderer }) {\n const renderText = (el, index) => (\n \n \n \n )\n\n const renderLineBreak = (el, index) => (\n \n
\n
\n )\n\n function renderElement(el, index) {\n switch (el.type) {\n case 'text':\n return renderText(el, index)\n case 'blank':\n return blankRenderer(el, index)\n case 'lineBreak':\n return renderLineBreak(el, index)\n default:\n break\n }\n return true\n }\n\n return paragraphs.map((paragraph, index, array) => (\n \n \n \n {array.length > 1 && (\n \n {R.inc(index)}.\n \n )}\n \n {parseElements(paragraph.elements).map(renderElement)}\n {paragraph.audio_url && (\n \n \n \n )}\n \n \n \n \n ))\n}\n","export default function getCorrectAnswer(task) {\n return task.taskable.bubbles\n}\n","export default function getCorrectAnswer(task) {\n return task.taskable.sentences\n}\n","import PropTypes from 'prop-types'\n\nconst taskShape = {\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.string,\n instructions: PropTypes.string.isRequired,\n}\n\nexport default taskShape\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport { Box } from '@redriverpress/system'\n\n// Target: a component that holds a matched word for a given definition\n// Props explanation:\n// - `isArmed`: true when a word from the word bank has been selected\n// - `isMatched`: true when a word has been matched to the target\n\nconst TargetBox = styled(Box).attrs(() => ({\n borderRadius: 'rounded',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 0.3s ease',\n}))`\n cursor: ${props =>\n props.isArmed || props.isMatched ? 'pointer' : 'default'};\n pointer-events: ${props =>\n props.isArmed || props.isMatched ? 'auto' : 'none'};\n &:hover {\n background: ${props =>\n props.isArmed || props.isMatched\n ? props.theme.colors[props.hoverBg]\n : props.theme.colors[props.bg]};\n }\n /* The placeholder '?' is rendered as a pseudoelement; it is set to\n be transparent once a word has been matched to a Target */\n &:after {\n content: '\\f128';\n font-family: 'Font Awesome 5 Pro';\n font-weight: 700;\n color: white;\n transition: color 0.3s ease;\n position: absolute;\n }\n ${props => props.isMatched && `&:after { color: transparent; }`}\n`\nTargetBox.displayName = 'TargetBox'\n\nexport default function Target({ children, isArmed, isMatched, ...props }) {\n return (\n \n {children}\n \n )\n}\n\nTarget.defaultProps = {\n children: null,\n isArmed: false,\n isMatched: false,\n}\n\nTarget.propTypes = {\n children: PropTypes.node,\n isArmed: PropTypes.bool,\n isMatched: PropTypes.bool,\n}\n","import R from 'ramda'\n\n/**\n * getHandleTargetClick provides a way to standardize logic for Matching and ImageMatching tasks.\n * Pass in a configuration object as specified, and set the returned function to fire on your\n * Target's onClick handler with the current definitionId\n * @param {object} config\n * @param {array} config.activeWord - the value of the activeWord's state hook\n * @param {function} config.setActiveWord - the updater function for the activeWord's state hook\n * @param {array} config.bank - the value of the bank's state hook\n * @param {function} config.setBank - the updater function for the bank's state hook\n * @param {object} config.getMatch - function that will return the match object for the given id\n * @param {function} config.setMatch - function that will update the given id's `matchedId` value\n * @returns {function} the function to send on the Target's onclick event\n */\nexport default function getHandleTargetClick({\n activeWord,\n setActiveWord,\n bank,\n setBank,\n getMatch,\n setMatch,\n}) {\n const hasMatch = id => !R.propEq('matchedId', null, getMatch(id))\n\n return function handleTargetClick(definitionId) {\n // Clicking on an empty target,\n // with a word from the wordBank selected\n // (Drop the word from the word bank into the empty target)\n if (!hasMatch(definitionId) && activeWord) {\n setMatch(definitionId, activeWord)\n setBank(R.without([activeWord], bank))\n return setActiveWord(null)\n }\n\n // Clicking on a target with a matched word,\n // no word from wordBank selected\n // (Return the target's matched word to the word bank)\n if (hasMatch(definitionId) && !activeWord) {\n setBank(R.append(getMatch(definitionId).matchedId, bank))\n return setMatch(definitionId, null)\n }\n\n // Clicking on a target with a matched word,\n // with a word from the wordBank selected\n // (Swap the word from the word bank with the matched word in the target)\n if (hasMatch(definitionId) && activeWord) {\n setBank(\n R.append(\n getMatch(definitionId).matchedId,\n R.without([activeWord], bank)\n )\n )\n setMatch(definitionId, activeWord)\n return setActiveWord(null)\n }\n\n return null\n }\n}\n","import PropTypes from 'prop-types'\n\nimport { Modal } from 'Common/components/modal'\n\nimport { Box, Button, Icon, Text } from '@redriverpress/system'\n\nexport default function MissedAnswersModal({\n isOpen,\n onBackgroundClick,\n onClose,\n onEscapeKeydown,\n onSubmit,\n onCancel,\n}) {\n return (\n \n \n You missed some answers. Would you like to submit anyway?\n \n \n \n \n \n \n )\n}\n\nMissedAnswersModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n onEscapeKeydown: PropTypes.func.isRequired,\n onBackgroundClick: PropTypes.func.isRequired,\n}\n","function ensureNonLockedDestination(from, to, locked) {\n const step = from < to ? -1 : 1\n\n let dest = to\n while (dest !== from && locked[dest]) {\n dest += step\n }\n\n return dest\n}\n\nfunction isOutOfBound(array, index) {\n return index < 0 || index >= array.length\n}\n\n/**\n * Move one element of an array to a position, push other elements.\n * You can specify positions that should not be pushed using the locked argument.\n *\n * Example:\n *\n * arrayMove([1, 2, 3, 4], 0, 2) = [2, 3, 1, 4]\n * arrayMove([1, 2, 3, 4], 0, 2, [false, true]) = [3, 2, 1, 4]\n *\n * @param {*} array - array to work with\n * @param {*} from - position of the element being moved\n * @param {*} to - destination\n * @param {*} locked - boolean array. If a position has a truthy value then that position will not change\n */\nexport function arrayMove(array, from, to, locked = []) {\n // validate arguments\n if (isOutOfBound(array, from) || isOutOfBound(array, to)) {\n return array\n }\n\n // if 'to' is locked, we should use the last non locked position\n // (move one step back to 'from' until we found a non-locked position)\n const dest = ensureNonLockedDestination(from, to, locked)\n\n // skio if no change is required or if from is locked\n if (from === dest || locked[from]) {\n return array\n }\n\n // clone input\n const result = array.slice()\n\n // Put element in the final destination\n result[dest] = array[from]\n\n // Now we need to push elements one position starting from 'to' upto 'from'.\n // Element at 'to' must be placed at 'to - 1', 'to - 1' at 'to - 2' and so one until we reach 'from' position.\n // We should also care about locked positions. For example, if 'to - 1' is locked and 'to - 2' is not then 'to'\n // should be placed at 'to - 2'. After that we need to find the new place for the element that was at 'to - 2'.\n // Summarizing: we move one step at a time, starting from 'to' keeping track of the last 'pushed' element.\n\n // Step direction\n const step = from < dest ? 1 : -1\n // Position that should be moved in this iteration\n let elementToRelocate = dest\n for (let current = dest; current !== from; current -= step) {\n const prev = current - step\n // Previous is locked, do not change it\n if (locked[prev]) {\n result[prev] = array[prev]\n } else {\n // If it's not locked then override\n result[prev] = array[elementToRelocate]\n // Now we need to find a new place for the element in the prev position\n elementToRelocate = prev\n }\n }\n\n return result\n}\n\nexport default arrayMove\n","import PropTypes from 'prop-types'\n\nimport { Box, Text } from '@redriverpress/system'\n\nexport default function Hint({ content }) {\n return (\n \n \n {content}\n \n \n )\n}\n\nHint.propTypes = {\n content: PropTypes.string.isRequired,\n}\n","import PropTypes from 'prop-types'\nimport styled, { css } from 'styled-components'\n\nimport { Box, media, Text } from '@redriverpress/system'\n\nimport Definition from 'Common/components/ClickableTooltip'\nimport Hint from './Hint'\n\nconst correctStyles = css`\n border-bottom: 2px solid ${props => props.theme.colors.green500};\n pointer-events: none;\n`\n\nconst incorrectStyles = css`\n background: ${props => props.theme.colors.red50};\n border-bottom: 2px solid ${props => props.theme.colors.red500};\n`\n\nconst Input = styled.input`\n appearance: none;\n background: transparent;\n border: none;\n border-radius: 0;\n border-bottom: 2px solid ${props => props.theme.colors.gray400};\n border-top: 2px solid transparent;\n line-height: 1;\n width: 12ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n text-align: center;\n transition: background 0.3s ease-in-out, border-color 0.15s ease-in-out;\n\n ${media.md`\n width: 20ch;\n `}\n\n &:focus {\n background: ${props => props.theme.colors.blue100};\n border-bottom: 2px solid ${props => props.theme.colors.blue500};\n border-top: 2px solid ${props => props.theme.colors.white};\n outline: none;\n }\n\n ${props => props.mode === 'correct' && correctStyles}\n ${props => props.mode === 'fix' && incorrectStyles}\n ${props => props.mode === 'example' && `pointer-events: none;`}\n`\nInput.displayName = 'LATInput'\n\nconst PromptContent = content => (\n \n \n Definition:\n \n {content}\n \n)\n\nexport default function Blank({\n isCorrect,\n isSubmitted,\n prompt,\n promptType,\n ...props\n}) {\n return (\n \n \n {promptType === 'definition' && (\n } />\n )}\n {promptType === 'hint' && }\n \n )\n}\n\nBlank.defaultProps = {\n mode: 'default',\n prompt: null,\n promptType: 'none',\n}\n\nBlank.propTypes = {\n mode: PropTypes.oneOf(['correct', 'default', 'example', 'fix']),\n prompt: PropTypes.string,\n promptType: PropTypes.oneOf(['definition', 'hint', 'none']),\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport {\n Box,\n LoadingSpinner,\n Svg,\n TransparentButton,\n Tooltip,\n tooltipDelayDuration,\n} from '@redriverpress/system'\n\nimport useImmersiveReader from '../hooks/useImmersiveReader'\n\nconst StyledBox = styled(Box)`\n background: ${props => props.theme.colors.gray200};\n\n &:hover {\n background: ${props => props.theme.colors.blue600};\n color: ${props => props.theme.colors.white};\n & svg {\n fill: ${props => props.theme.colors.white};\n }\n }\n`\n\nconst VIMEO_CAPTION_REGEX = /

(.*?)<\\/p>/g\n\nexport default function ImmersiveReaderContent({ title, content }) {\n const { launchReader, loading } = useImmersiveReader()\n\n return (\n \n \n \n launchReader({\n title,\n content: content.replace(VIMEO_CAPTION_REGEX, ''),\n })\n }\n >\n \n {loading ? (\n \n ) : (\n \n \n \n \n \n \n \n \n )}\n \n \n \n \n \n Immersive Reader\n \n \n )\n}\n\nImmersiveReaderContent.defaultProps = {\n title: '',\n}\n\nImmersiveReaderContent.propTypes = {\n title: PropTypes.string,\n content: PropTypes.string.isRequired,\n}\n","import { launchAsync } from '@microsoft/immersive-reader-sdk'\nimport { useState } from 'react'\n\nimport xhr from 'Common/utils/xhr'\n\nexport default function useImmersiveReader() {\n const [loading, setLoading] = useState(false)\n\n const saveToken = tokenData => {\n localStorage.setItem('immersive-reader-token', tokenData.token)\n localStorage.setItem('immersive-reader-subdomain', tokenData.subdomain)\n localStorage.setItem('immersive-reader-expires-at', tokenData.expires_on)\n }\n\n const getToken = async () => {\n const tokenExpiresAt = localStorage.getItem('immersive-reader-expires-at')\n const token = localStorage.getItem('immersive-reader-token')\n const subdomain = localStorage.getItem('immersive-reader-subdomain')\n\n // Checking if there's any info missing for the request and if the token has expired\n // following the logic in https://docs.microsoft.com/en-us/azure/applied-ai-services/immersive-reader/how-to-cache-token\n if (\n !tokenExpiresAt ||\n !subdomain ||\n !token ||\n Date.now() / 1000 > tokenExpiresAt // check if current time in seconds is greater than the token expiration time\n ) {\n const { data } = await xhr({\n url: '/api/v1/immersive_reader_token',\n method: 'GET',\n })\n\n saveToken(data)\n\n return data\n }\n\n return {\n token: localStorage.getItem('immersive-reader-token'),\n subdomain: localStorage.getItem('immersive-reader-subdomain'),\n }\n }\n\n const launchReader = async ({ title, content }) => {\n setLoading(true)\n const { token, subdomain } = await getToken()\n\n const options = { uiZIndex: 6 }\n const data = {\n title,\n chunks: [\n {\n content,\n mimeType: 'text/html',\n },\n ],\n }\n\n launchAsync(token, subdomain, data, options)\n .then(() => setLoading(false))\n .catch(() => {\n setLoading(false)\n localStorage.removeItem('immersive-reader-token')\n localStorage.removeItem('immersive-reader-subdomain')\n localStorage.removeItem('immersive-reader-expires-at')\n })\n }\n\n return { launchReader, loading }\n}\n","import xhr from 'Common/utils/xhr'\nimport { activitiesEndpoint } from 'Endpoints'\n\nexport default function submitHomeworkActivity(id) {\n return xhr({\n url: `${activitiesEndpoint}/${id}`,\n method: 'PUT',\n data: {\n homework_activity: {\n submitted: true,\n },\n },\n })\n}\n"],"sourceRoot":""}