{"version":3,"sources":["webpack:///./app/react/packages/common/components/alert/Alert.js","webpack:///./app/react/packages/common/hooks/usePrevious.js","webpack:///./app/react/packages/common/utils/analytics.js","webpack:///./app/react/packages/common/hooks/useDidMountEffect.js","webpack:///./app/react/packages/common/components/dialogs/SubscribeNowDialog.js","webpack:///./app/react/packages/common/components/PillTabs.js","webpack:///./app/react/packages/common/hooks/useEventListener.js","webpack:///./app/react/packages/common/components/DateTimePicker.js","webpack:///./app/react/packages/common/services/signUp.js","webpack:///./app/react/packages/common/components/dialogs/CreateFreeAccountDialog.js","webpack:///./app/react/packages/common/constants/redirect.js","webpack:///./app/react/packages/common/components/GuidedTour/driverStyle.js","webpack:///./app/react/packages/common/components/GuidedTour/TourButton.js","webpack:///./app/react/packages/common/services/tasks.js","webpack:///./app/react/packages/common/components/dialogs/StudentReferenceTaskDialog.js","webpack:///./app/react/packages/common/components/alert/AutoScrollAlert.js","webpack:///./app/react/packages/common/services/country.js","webpack:///./app/react/packages/common/constants/levels.js","webpack:///./app/react/packages/common/hooks/useDebounce.js","webpack:///./app/react/packages/common/components/Breadcrumbs.js","webpack:///./app/react/packages/common/constants/classVersion.js","webpack:///./app/react/packages/common/components/AudioRecorder/Recorder.js","webpack:///./app/react/packages/common/components/dialogs/RequestMicPermissionDialog.js","webpack:///./app/react/packages/common/components/AudioRecorder/Player.js","webpack:///./app/react/packages/common/hooks/useAudioPlayer.js","webpack:///./app/react/packages/common/components/AudioRecorder/index.js","webpack:///./app/react/packages/common/constants/regularExpressions.js","webpack:///./app/react/packages/common/utils/formik.js","webpack:///./app/react/packages/common/components/forms/CheckboxField.js","webpack:///./app/react/packages/common/constants/index.js","webpack:///./app/react/packages/common/components/forms/SelectField.js","webpack:///./app/react/packages/common/utils/xhr.js","webpack:///./app/react/packages/common/components/forms/InputPassword.js","webpack:///./app/react/packages/common/components/AdaptiveTabs.js","webpack:///./app/react/packages/common/hooks/useRecaptcha.js","webpack:///./app/react/packages/common/components/TransitionItems.js","webpack:///./app/react/packages/common/components/PageHeader.js","webpack:///./app/react/packages/common/components/Toggle.js","webpack:///./app/react/packages/common/utils/sort.js","webpack:///./app/react/packages/common/components/cards/CardCoverImageFallback.js","webpack:///./app/react/packages/common/components/cards/CardCoverImage.js","webpack:///./app/react/packages/common/components/LightboxImage.js","webpack:///./app/react/packages/common/hooks/useUserAccess.js","webpack:///./app/react/packages/common/constants/country.js","webpack:///./app/react/packages/common/components/forms/FieldGroup.js","webpack:///./app/react/packages/common/utils/datetime.js","webpack:///./app/react/packages/common/components/CountBadge.js","webpack:///./app/react/packages/common/components/Tabs.js","webpack:///./app/react/packages/common/components/dialogs/AddToClassDialog/trackAddContentToClass.js","webpack:///./app/react/packages/common/components/dialogs/AddToClassDialog/index.js","webpack:///./app/react/packages/common/hooks/useSessionStorage.js","webpack:///./app/react/packages/common/components/forms/RadioField.js","webpack:///./app/react/packages/common/services/planner.js","webpack:///./app/react/packages/common/services/location.js","webpack:///./app/react/packages/common/components/cards/ContentCard.js","webpack:///./app/react/packages/common/components/dialogs/ConfirmActionDialog.js","webpack:///./app/react/packages/common/components/modal/Modal.js","webpack:///./app/react/packages/common/components/modal/FloatingActionModal.js","webpack:///./app/react/packages/common/components/modal/ModalBackground.js","webpack:///./app/react/packages/common/utils/getLevelsByType.js","webpack:///./app/react/packages/common/components/RichTextarea/FontSizeCustomExtension.js","webpack:///./app/react/packages/common/components/RichTextarea/RichTextareaComponents.js","webpack:///./app/react/packages/common/components/RichTextarea/TextAlignmentButton.js","webpack:///./app/react/packages/common/components/RichTextarea/MarkingGroup.js","webpack:///./app/react/packages/common/components/RichTextarea/ListGroup.js","webpack:///./app/react/packages/common/components/RichTextarea/FontFamilySelector.js","webpack:///./app/react/packages/common/components/RichTextarea/FontSizeSelector.js","webpack:///./app/react/packages/common/components/RichTextarea/ColorSelector.js","webpack:///./app/react/packages/common/components/RichTextarea/index.js","webpack:///./app/react/packages/common/utils/getInitialState.js","webpack:///./app/react/packages/common/components/ApplicationGrid.js","webpack:///./app/react/packages/common/components/TutorialVideo.js","webpack:///./app/react/packages/common/constants/contentTypes.js","webpack:///./app/react/packages/common/components/viewModeToggle/BaseToggleButton.js","webpack:///./app/react/packages/common/components/viewModeToggle/ListButton.js","webpack:///./app/react/packages/common/components/viewModeToggle/CompactButton.js","webpack:///./app/react/packages/common/components/ElliiThemeProvider.js","webpack:///./app/react/packages/common/constants/search.js","webpack:///./app/react/packages/common/utils/object.js","webpack:///./app/react/packages/common/components/forms/Hint.js","webpack:///./app/react/packages/common/components/forms/Field.js","webpack:///./app/react/packages/common/utils/markdown.js","webpack:///./app/react/packages/common/utils/scrollToElement.js","webpack:///./app/react/packages/common/components/AppLoading.js","webpack:///./app/react/packages/common/components/ClickableTooltip.js","webpack:///./app/react/packages/common/hooks/useIncludedMediaQuery.js","webpack:///./app/react/packages/common/style/ReactDateTimeStyle.js","webpack:///./app/react/packages/common/hooks/useElapsingTime.js","webpack:///./app/react/packages/common/hooks/useMediaRecorder.js","webpack:///./app/react/packages/common/components/forms/ErrorWrapper.js","webpack:///./app/react/packages/common/components/forms/AgreementField.js","webpack:///./app/react/packages/common/components/AudioRecorder/ProgressBarWrapper.js","webpack:///./app/react/packages/common/components/AudioRecorder/RecPlayButton.js","webpack:///./app/react/packages/common/utils/getWithXHR.js","webpack:///./app/react/packages/common/components/Stepper/Divider.js","webpack:///./app/react/packages/common/components/Stepper/StepCircle.js","webpack:///./app/react/packages/common/components/Stepper/Stepper.js","webpack:///./app/react/packages/common/constants/brand.js","webpack:///./app/react/packages/common/constants/mediaRecorder.js","webpack:///./app/react/packages/common/components/ResultsYumi.js"],"names":["types","error","background","warning","message","success","boldTypes","Alert","forwardRef","ref","icon","children","type","iconColor","bold","props","bg","p","fontSize","borderRadius","display","alignItems","color","mr","propTypes","PropTypes","oneOfType","string","bool","node","isRequired","oneOf","Object","keys","defaultProps","usePrevious","value","useRef","useEffect","current","analyticsTrack","event","payload","analytics","track","useDidMountEffect","func","deps","didMount","SubscribeNowDialog","subtitle","open","onOpenChange","Root","Portal","Overlay","StyledContent","onPointerDownOutside","e","preventDefault","StyledTitle","as","mb","flexDirection","justifyContent","secondary","href","window","location","small","pr","PillWrapper","styled","Box","attrs","border","borderColor","boxShadow","width","media","md","theme","colors","white","blue100","Pill","NavLink","black","fontSizes","sm","blue500","TabsPropType","arrayOf","shape","to","object","exact","label","PillTabs","tabs","map","tab","className","isActive","style","flex","py","JSON","stringify","getTabKey","useEventListener","eventName","listener","observableArray","listenerRef","addEventListener","removeEventListener","StyledInput","input","inputStyles","DateTimePicker","placeholder","closeOnSelect","includeTime","disabled","onChange","isValidDate","onOpen","onClose","onReset","handleReset","state","inputValue","renderInput","inputProps","position","pt","pl","inputIconWidth","pb","readOnly","Boolean","top","bottom","right","onClick","data","setTimeout","closeCalendar","toDate","dateFormat","timeFormat","date","instanceOf","Date","xhr","url","method","response","redirectTo","headers","Error","fieldErrors","errors","signUp","SCHEMA","Yup","first_name","required","last_name","email","password","school_name","country","terms","subscribed_to_newsletter","commit","INITIAL_VALUES","INITIAL_ERRORS","CreateFreeAccountDialog","pollId","pollTopic","recaptcha","useRecaptcha","useState","remoteErrors","setRemoteErrors","alert","setAlert","isPending","setIsPending","countries","getCountryOptions","emptyName","validateRemoteErrors","validateFieldErrors","handleSubmit","formValues","setFieldError","context","variation","interactive_set_id","interactive_set_topic","user","executeAsync","recaptchaToken","then","isOpen","signupSuccess","err","errorFields","formatErrors","forEach","field","errMsg","my","hover","AutoScrollAlert","fallback","initialValues","initialErrors","validate","validationSchema","onSubmit","isValid","submitForm","setFieldValue","Field","name","ml","sanitizeError","SelectField","options","code","getOptionText","getOptionValue","CheckboxField","target","labelPadding","size","textAlign","number","DriverStyle","createGlobalStyle","TourButton","steps","driverRef","cleanUp","destroy","driver","showProgress","animate","drive","px","fontWeight","element","popover","disableActiveInteraction","onDeselected","onHighlightStarted","onHighlighted","getTask","taskId","ReferenceTaskDialog","referenceTaskId","openPortal","useQuery","enabled","referenceTask","isLoading","PortalComponent","Dialog","Fragment","Close","mt","StudentReferenceTask","task","isNewLayout","scrollToElement","any","getState","property","getInitialState","getList","getCountries","getPriorityCountries","getProvinces","getCountryEmptyValue","stateLabel","CANADA","emptyStateLabel","getProvinceEmptyValue","countryOptions","c","key","provinceOptions","getProvinceOptions","provinces","buildOptions","list","emptyLabel","Array","isArray","getCountryCurrency","EUROPE_COUNTRIES","includes","COUNTRY_CURRENCY","getBrowserCountry","Intl","DateTimeFormat","timezonesCountry","timezone","resolvedOptions","timeZone","cefr","clb","eld","nrs","levels","useDebounce","fn","timeout","cleanUpOnUnmount","debounce","clearTimeout","invoke","args","RouteShape","external","LinkWrapper","route","Breadcrumbs","routes","trimmedRoutes","penultimateRoute","lastRoute","CLASS_VERSION","legacy","kanban","Recorder","status","recordingTime","maxSeconds","seconds","setSeconds","recording","recorderStatus","RECORDING","mounted","recordingTimeout","maxValue","RequestMicPermissionDialog","onConfirm","weight","Player","src","showCurrentTime","showRemainingTime","onDelete","audioProps","audioNode","isPlaying","setIsPlaying","currentTime","setCurrentTime","currentMinutes","Math","floor","currentSeconds","duration","remainingTime","remainingMinutes","remainingSeconds","progress","canPlayThrough","setCanPlayThrough","checkIfIOS","minutes","togglePlay","pause","play","setTime","time","handleScrub","useAudioPlayer","isWaiting","setIsWaiting","onCanPlayThrough","onPlaying","onTimeUpdate","parseInt","onWaiting","onEnded","preload","kind","cloneElement","RecPlayButton","lazy","AudioRecorder","audio","onAudioRecorded","onDeleteAudio","shouldConfirmToDelete","onStatusChange","useMediaRecorder","base64Media","startRecording","stopRecording","setStatus","isConfirmationDialogOpen","setIsConfirmationDialogOpen","isRequestPermissionDialogOpen","setIsRequestPermissionDialogOpen","isDeleteAudioPending","setIsDeleteAudioPending","setRecordingTime","handleDeleteResponse","IDLE","useElapsingTime","timeLimit","handleTimeOver","updateTimeCallback","shouldStartTimer","handleAudioDeletion","component","BLOCKED","handleStartRecording","ConfirmActionDialog","title","REGULAR_EXPRESSIONS","username","invitationCode","onlyOneAlphanumeric","reduce","filter","upperCaseFirst","join","Checkbox","CheckboxControl","ELLII_BOT_NAME","GOOGLE_SSO_URL","RECAPTCHA_V3_SITE_KEY","process","SelectControl","formik","useFormikContext","getValue","handleChange","useCallback","option","cancelToken","params","axios","document","querySelector","getAttribute","ShowPasswordToggle","checked","role","aria-checked","aria-label","InputPassword","showPassword","setShowPassword","iconRight","inputType","v","MotionIcon","motion","Icon","MenuItem","TransparentButton","withConfig","shouldForwardProp","NavLinkItem","asChild","displayName","Dropdown","DropdownChevron","pathname","useLocation","setOpen","navBarHeight","setNavBarHeight","tabsWithoutSearch","t","String","split","currentTab","navbarElement","offsetHeight","o","zIndex","align","sideOffset","AdaptiveTabs","tabsBreakpoint","useMedia","DefaultChevron","rotate","mediaQueries","lg","k","sitekey","Promise","resolve","MotionBox","TransitionItems","animateInitial","currentItem","getKey","prevPosition","getDirection","distance","variants","enter","dir","opacity","x","centre","exit","transition","ease","exitBeforeEnter","custom","initial","id","CompactDescription","description","delayDuration","Trigger","Content","side","Arrow","maxWidth","PageHeader","measure","compact","ToggleControlOuter","active","height","larger","flexShrink","ToggleControlIndicator","translateBy","stiffness","damping","mass","ToggleControlStatus","Text","m","Label","hideLabel","css","Toggle","labelLeft","showStatusLabel","isLg","cursor","aria-labelledby","ascByName","descByName","CONTENT_TYPE_STYLES","CONTENT_TYPES","flashcardCategory","backgroundColor","flashcardSet","lesson","course","video","CoverImageFallback","contentType","iconFontSize","array","STYLES","imageSize","imageMinWidth","large","CardCoverImage","alt","styles","minWidth","MotionImage","Image","StyledDialogContent","LightboxImage","isLightboxOpen","setIsLightboxOpen","isZoomed","setIsZoomed","constraintsRef","imageRef","viewportHeight","use100vh","lineHeight","drag","dragConstraints","dragElastic","dragMomentum","maxHeight","naturalWidth","naturalHeight","y","useUserAccess","getCurrentUser","refetchOnWindowFocus","staleTime","userIsLoading","refetchUser","refetch","userLoggedIn","userHasAccess","access","userId","userData","CA","AU","UK","GB","BR","IN","MX","JP","ZA","CZ","DK","HU","NO","NZ","PL","SG","SE","CH","HK","REQUIRE_CREDIT_CARD_STATE_COUNTRIES","StyledFieldGroup","rowDirectionStartingAt","rowDirectionBreakpoint","space","FieldGroup","getFormattedDate","dateTime","format","parsed","dayjs","getFormattedDateTime","getTimeTo","datetime","extend","relativeTime","isTomorrow","getTimeFromNow","withoutSuffix","from","getDateDifference","date1","date2","unit","diff","isDate","isBetweenPlugin","before","comparer","isBefore","sameDayAs","isSame","inThePast","isAfter","after","between","included","isBetween","parseUTC","utc","local","formatSeconds","totalHours","totalSeconds","totalMinutes","toString","padStart","generalTimeFormat","setInitialTime","minute","second","set","getCurrentTime","hour","setDateUnit","add","manipulateDatetimeTo","period","subtract","startOf","endOf","resetUTC","TWENTY_FOUR_HOURS_IN_MS","ONE_HOUR_IN_MS","ONE_MINUTE_IN_MS","CountBadge","TabCountBadge","gray150","Tab","activeClassName","gray700","blue700","Tabs","gridAutoFlow","gridGap","trackAddcontentToClass","contentId","contentTitle","destinationColumn","destinationClassId","analyticsData","getAnalyticsData","PLANNER_SECTIONS","saved","prepping","teaching","taught","CONTENT_ID_KEY","ALLOWS_DEFAULT_ASSIGNMENT","COURSE_TYPE_WARNING","COURSE_TYPES","SYLLABUS_SECTIONS_LIST","SYLLABUS_SECTIONS","AddToClassDialog","content","courseType","onCancel","onError","onSave","legacyURL","getLegacyURL","classVersion","CONTENT_CLASS_VERSIONS","fetchedClasses","getTeacherClasses","version","includeDefault","addToast","useToast","selectedClass","setSelectedClass","selectedSection","setSelectedSection","setIsLoading","duplicatedContent","setDuplicatedContent","shouldCheckForDuplication","checkForDuplicatedContent","getClassesContainingContent","classesIds","handleSelectClass","resetState","handleCancelDialog","handleToast","action","classId","handleAddToClass","trackAddContentToClass","yumi_class_id","teaching_state_cd","addLessonToClass","onlyKanban","reset","section","adaptive","useSessionStorage","initialValue","item","sessionStorage","getItem","parse","storedValue","setStoredValue","setValue","valueToStore","Function","setItem","RadioField","Radio","RadioControl","withCredentials","res","invitationDefaultClass","queryParam","isBulk","pinFolderToClass","updateQuerystringParams","URLSearchParams","history","replaceState","search","entries","getQueryStringValue","get","useLocationStore","selector","s","previusStateRef","previusState","currentState","updates","ContentCard","isLink","level","path","image","isCourseType","undefined","CONTENT_LABELS","COURSE_TYPE_LABELS","confirmLabel","confirmIcon","cancelLabel","cancelIcon","StyledModal","_Modal","radii","rounded","layout","TitleBox","Modal","allowScroll","onEscapeKeydown","onBackgroundClick","alignSelf","FloatingActionModal","actionContent","fadeIn","keyframes","ModalBackground","div","getLevelsByType","levelData","cefrLevels","clbLevels","eldLevels","nrsLevels","length","FontSizeExtension","Extension","create","addOptions","addGlobalAttributes","this","attributes","default","parseHTML","replace","renderHTML","addCommands","setFontSize","chain","setMark","run","unsetFontSize","removeEmptyTextStyle","RichButtonGroup","RichButton","Button","blue200","RichDropdownButton","RichDropdownOptionsWrapper","RichDropdownOption","RichColorDropdownHover","TextAlignment","editor","currentAlignmentOption","setCurrentAlignmentOption","textAlignmentOptions","clickEvent","focus","setTextAlign","MAX_INDEX","mx","nextAlignmentOption","richIconWidth","objectOf","MarkingGroup","markOptions","toggleBold","toggleItalic","toggleUnderline","btn","ListGroup","toggleBulletList","toggleOrderedList","FontFamilySelector","isMd","dropDownIsOpen","setDropdownIsOpen","currentFontOption","setCurrentFontOption","selectedFont","setSelectedFont","fontOptions","setFontFamily","on","pointedText","getAttributes","fontFamily","off","fontOption","nextFontOption","sizesMap","FontSizeSelector","currentSizeOption","setCurrentSizeOption","selectedSize","setSelectedSize","sizeOptions","sizeOption","nextSizeOption","ColorSelector","currentColorOption","setCurrentColorOption","selectedColor","setSelectedColor","colorOptions","setColor","green900","red900","yellow900","blue900","activeColor","colorOption","nextColorOption","StyledEditor","EditorContent","borderTop","lineHeights","body","minHeight","gray300","xl","StyledMenuBar","MobileScrollOverlay","degree","RichMenuBar","left","RichTextarea","rows","wrapperProps","savedContent","maxLength","useEditor","extensions","Bold","BulletList","CharacterCount","configure","limit","Color","Document","FontFamily","HardBreak","History","Italic","ListItem","OrderedList","Paragraph","Placeholder","TextAlign","TextStyle","Underline","injectCSS","WebFont","load","google","families","getHTML","isEmpty","isFocused","commands","setContent","setEditable","limitIconHeight","getElementById","innerHTML","ApplicationGrid","Div100vh","sanitizeOptions","ADD_TAGS","ADD_ATTR","parseOptions","domNode","attributesToProps","attribs","TutorialVideo","videoId","propVideoId","setPropVideoId","sanitizedContent","DOMPurify","sanitize","margin","post","CONTENT_COUNT_COPY","singular","plural","pack","COURSE_TYPE_ICONS","CONTENT_TYPES_URL","BaseToggleButton","button","ListButton","CompactButton","ElliiThemeProvider","ORIGIN","collections","mapKeys","obj","acc","StyledHint","Hint","text","setIsOpen","Popover","onClickOutside","positions","containerStyle","overflow","padding","popoverRect","childRect","arrowSize","arrowColor","gray900","dropShadows","letterSpacing","onMouseEnter","onMouseLeave","onTouchStart","onTouchEnd","onTouchCancel","StyledError","SanitizedText","dangerouslySetInnerHTML","__html","useField","meta","touched","hint","hideError","rest","fieldProps","Component","Input","errorMessage","mdWithHtml","MarkdownIt","html","renderMarkdown","render","renderInlineMarkdown","renderInline","getNavbarDimensions","header","getBoundingClientRect","behavior","paddingTop","headerHeight","newY","offsetTop","scroll","Loading","yellow400","ContentBody","ClickableTootip","prev","rawBreakpoints","useIncludedMediaQuery","query","mediaQuery","setMediaQuery","debounceGetBreakpoint","windowSize","innerWidth","maxBreakpoint","exactBreakpoint","ReactDateTimeStyle","timeLimitUnit","elapsedTime","initialTime","stopTimer","clearInterval","startTimer","setInterval","onStop","mediaObject","mediaRecorder","mediaStream","setError","shouldUsePolyfill","setShouldUsePolyfill","isAudioMuted","setIsAudioMuted","mediaBlobUrl","setMediaBlobUrl","setBase64Media","mediaTypes","mediaOptions","mimeType","getMediaStream","mediaConstraints","navigator","mediaDevices","getUserMedia","stream","recorderError","NOT_ALLOWED","PolyfillAudioRecorder","encoder","mpegEncoder","MediaRecorder","checkConstraints","mediaType","supportedMediaConstraints","getSupportedConstraints","unSupportedConstraints","constraint","onRecordingStop","blob","Blob","URL","createObjectURL","reader","FileReader","onloadend","encodedBlob","result","newEncodedBlob","readAsDataURL","STOPPED","onRecordingActive","push","getTracks","some","readyState","RECORDER_ERROR","ondataavailable","onstop","onerror","start","muteAudio","mute","getAudioTracks","audioTrack","stop","clearBlobUrl","previewStream","MediaStream","getVideoTracks","unMuteAudio","ErrorWrapper","StyledExtraContent","Agreement","hideOutline","ProgressBarWrapper","ActionButton","circular","bgHover","TYPES","colorsSchemeByType","green500","backgroundHover","green700","trail","green100","red500","red700","red100","getProgressBarStyle","stroke","strokeLinecap","transformOrigin","transform","progressBarStyles","strokeWidth","progressbarTypes","getWithXHR","resp","lineStyles","done","Divider","variant","SIZE","variantStyles","borderStyle","borderWidth","StepCircle","stepVariants","Stepper","activeIdx","findIndex","step","idx","stepIdProp","stepPropShape","SELF_STUDY_PRODUCT_TITLE","MAX_RECORDING_TIME","STOPPING","SAVING","platform","ANDROID","IOS","MAC","WIN","browser","CHROME","EDGE","FIREFOX","SAFARI","bgs","happy","neutral","sad","ResultsYumi","mood","scale","delay","originY","times","blink"],"mappings":"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","file":"package-common.e244ab6cf1a24d583842.chunk.js","sourcesContent":["import PropTypes from 'prop-types'\nimport { forwardRef } from 'react'\n\nimport { Box, Icon } from '@redriverpress/system'\n\nconst types = {\n error: {\n background: 'red50',\n },\n warning: {\n background: 'yellow200',\n },\n message: {\n background: 'blue50',\n },\n success: {\n background: 'green50',\n },\n}\n\nconst boldTypes = {\n error: {\n background: 'red100',\n },\n warning: {\n background: 'yellow400',\n },\n message: {\n background: 'blue100',\n },\n success: {\n background: 'green100',\n },\n}\n\nconst Alert = forwardRef(\n ({ icon, children, type, iconColor, bold, ...props }, ref) => {\n const bg = bold ? boldTypes[type].background : types[type].background\n return (\n \n {icon && (\n \n \n \n )}\n {children}\n \n )\n }\n)\n\nAlert.propTypes = {\n icon: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n iconColor: PropTypes.string,\n children: PropTypes.node.isRequired,\n type: PropTypes.oneOf(Object.keys(types)),\n bold: PropTypes.bool,\n}\n\nAlert.defaultProps = {\n icon: 'exclamation-triangle',\n iconColor: 'black',\n type: 'error',\n}\n\nexport default Alert\n","import { useEffect, useRef } from 'react'\n\n// Sourced from https://usehooks.com/usePrevious/\n\nexport default function usePrevious(value) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = useRef()\n\n // Store current value in ref\n useEffect(() => {\n ref.current = value\n }, [value]) // Only re-run if value changes\n\n // Return previous value (happens before update in useEffect above)\n return ref.current\n}\n","/* global analytics */\n\n/**\n * Wrapper for analytics.track method: Tracks an specific event.\n * @param {string} event\n * @param {object} payload\n * @returns\n */\nconst analyticsTrack = (event, payload) => analytics.track(event, payload)\n\nexport default analyticsTrack\n","/* This hook behaves similarly to useEffect, except that it\nexecutes the function passed in only after the component first\nrender. Its usage is the same as the useEffect hook. */\n\nimport { useEffect, useRef } from 'react'\n\nconst useDidMountEffect = (func, deps) => {\n const didMount = useRef(false)\n\n useEffect(() => {\n if (didMount.current) func()\n else didMount.current = true\n }, deps)\n}\n\nexport default useDidMountEffect\n","import PropTypes from 'prop-types'\nimport { Box, Button, Dialog, Heading, Icon, Text } from '@redriverpress/system'\n\nexport default function SubscribeNowDialog({ subtitle, open, onOpenChange }) {\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n Subscribe Now\n \n \n {subtitle && {subtitle}}\n \n \n \n \n \n \n \n )\n}\n\nSubscribeNowDialog.propTypes = {\n subtitle: PropTypes.string.isRequired,\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Container, media } from '@redriverpress/system'\n\nconst PillWrapper = styled(Box).attrs(() => ({\n as: 'nav',\n display: 'inline-flex',\n justifyContent: 'center',\n bg: 'white',\n border: 'solid 2px',\n borderColor: 'blue500',\n borderRadius: '2rem',\n boxShadow: 3,\n width: 1,\n}))`\n pointer-events: none;\n &:hover {\n ${media.md`\n @media (pointer: none), (pointer: coarse) {\n background-color: ${props => props.theme.colors.white};\n }\n background-color: ${props => props.theme.colors.blue100};\n `}\n }\n`\n\nconst Pill = styled(NavLink)`\n pointer-events: auto;\n background-image: none;\n\n &:nth-child(odd) {\n margin-right: 3px;\n }\n &:nth-child(even) {\n margin-left: 3px;\n }\n\n .pill {\n background-color: ${props => props.theme.colors.white};\n color: ${props => props.theme.colors.black};\n font-size: ${props => props.theme.fontSizes[3]};\n font-weight: '600';\n border-radius: 2rem;\n\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:hover {\n background-color: ${props => props.theme.colors.blue100};\n color: ${props => props.theme.colors.black};\n }\n\n ${media.sm`\n font-size: ${props => props.theme.fontSizes[1]};\n `}\n }\n\n &.active {\n pointer-events: none;\n }\n\n &.active > .pill {\n background-color: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n }\n\n :focus {\n outline: none;\n }\n :focus-visible {\n box-shadow: 0px 0px 0px 2px #5774fc, 0px 0px 0px 4px #fff,\n 0px 0px 0px 6px #5774fc;\n background: ${props => props.theme.colors.blue500};\n }\n`\n\n// Some tabs use objects for their `to`\n// and some use React nodes for their `label`,\n// so generating a key without relying on the index gets interesting…\nexport const getTabKey = tab => {\n if (typeof tab.to === 'string') return tab.to\n if (typeof tab.label === 'string') return tab.label\n return JSON.stringify(tab.to)\n}\n\nexport const TabsPropType = PropTypes.arrayOf(\n PropTypes.shape({\n // Expects a React Router location prop, see:\n // https://reactrouter.com/web/api/NavLink\n to: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.object,\n PropTypes.string,\n ]).isRequired,\n exact: PropTypes.bool,\n // Prefer string labels where possible; if you need to pass a node,\n // ensure the wrapping component is a React Fragment in order to preserve\n // the effects of the grid layout on the grid container's immediate children.\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n // currently only showing on $sm and $md\n icon: PropTypes.string,\n })\n)\n\nexport default function PillTabs({ tabs }) {\n return (\n \n \n {tabs.map(tab => (\n (isActive ? 'active' : 'inactive')}\n key={getTabKey(tab)}\n style={{ flex: 1 }}\n >\n \n {tab.label}\n \n \n ))}\n \n \n )\n}\n\nPillTabs.propTypes = {\n tabs: TabsPropType.isRequired,\n}\n","import { useEffect } from 'react'\n\nexport default function useEventListener(\n eventName,\n listener,\n observableArray = [],\n ref = null\n) {\n useEffect(() => {\n const listenerRef = ref?.current ?? window\n listenerRef.addEventListener(eventName, listener)\n\n return () => {\n listenerRef.removeEventListener(eventName, listener)\n }\n }, observableArray)\n}\n","import PropTypes from 'prop-types'\nimport { useRef } from 'react'\nimport R from 'ramda'\nimport styled from 'styled-components'\nimport Datetime from 'react-datetime'\n\nimport {\n Box,\n Icon,\n TransparentButton,\n InputWrapper,\n inputIconWidth,\n inputStyles,\n} from '@redriverpress/system'\n\nconst StyledInput = styled.input`\n ${inputStyles}\n line-height: 1.4;\n background: transparent;\n cursor: pointer;\n`\n\nexport default function DateTimePicker({\n value,\n placeholder,\n closeOnSelect,\n includeTime,\n disabled,\n error,\n icon,\n label,\n onChange,\n isValidDate,\n onOpen,\n onClose,\n onReset,\n ...props\n}) {\n const ref = useRef(null)\n\n // https://github.com/arqex/react-datetime/issues/760#issuecomment-794381081\n const handleReset = () => {\n ref.current.state.inputValue = ''\n onReset()\n }\n\n return (\n \n {\n return (\n \n \n {value && onReset && (\n \n \n \n )}\n \n )\n }}\n ref={ref}\n onChange={data => {\n // workaround because library's closeonselect isn't working\n if (closeOnSelect) {\n setTimeout(ref.current.closeCalendar, 1)\n onClose()\n }\n onChange(data.toDate())\n }}\n value={value}\n dateFormat={`MMM D, YYYY${includeTime ? ',' : ''}`}\n timeFormat={includeTime && '[at] h:mm a'}\n isValidDate={date => isValidDate(date.toDate())}\n onOpen={onOpen}\n onClose={onClose}\n />\n \n )\n}\n\nDateTimePicker.defaultProps = {\n value: null,\n disabled: false,\n error: false,\n icon: 'calendar-alt',\n label: null,\n placeholder: 'Please select…',\n closeOnSelect: true,\n includeTime: false,\n isValidDate: R.T,\n onOpen: () => ({}),\n onClose: () => ({}),\n onReset: null,\n}\n\nDateTimePicker.propTypes = {\n value: PropTypes.instanceOf(Date),\n disabled: PropTypes.bool,\n error: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.node,\n PropTypes.bool,\n ]),\n icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n label: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n isValidDate: PropTypes.func,\n placeholder: PropTypes.string,\n closeOnSelect: PropTypes.bool,\n includeTime: PropTypes.bool,\n onOpen: PropTypes.func,\n onClose: PropTypes.func,\n onReset: PropTypes.func,\n}\n","import xhr from 'Common/utils/xhr'\n\nasync function signUp(data) {\n try {\n const response = await xhr({\n url: '/sign_up.json',\n method: 'POST',\n data,\n })\n\n return { redirectTo: response.headers.location }\n } catch (e) {\n const error = new Error()\n error.fieldErrors = e.response?.data?.errors || {}\n\n throw error\n }\n}\n\nexport default signUp\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport { Formik, Form } from 'formik'\nimport * as Yup from 'yup'\nimport ReCAPTCHA from 'react-google-recaptcha'\nimport { prop } from 'ramda'\n\nimport {\n Box,\n Button,\n Dialog,\n Heading,\n Icon,\n Link,\n LoadingOverlay,\n Text,\n} from '@redriverpress/system'\n\nimport { validateFieldErrors, formatErrors } from 'Common/utils/formik'\nimport AutoScrollAlert from 'Common/components/alert/AutoScrollAlert'\nimport Field from 'Common/components/forms/Field'\nimport CheckboxField from 'Common/components/forms/CheckboxField'\nimport SelectField from 'Common/components/forms/SelectField'\nimport { getCountryOptions } from 'Common/services/country'\nimport signUp from 'Common/services/signUp'\n\nimport { PRICING_PATH } from 'Common/constants/redirect'\nimport useRecaptcha from 'Common/hooks/useRecaptcha'\n\nconst SCHEMA = Yup.object({\n first_name: Yup.string().required('Please enter your first name'),\n last_name: Yup.string().required('Please enter your last name'),\n email: Yup.string()\n .email('Please enter a valid email')\n .required('Please enter a valid email'),\n password: Yup.string().required('Please enter your password'),\n school_name: Yup.string(),\n country: Yup.string().required('Please select your country'),\n terms: Yup.boolean().oneOf([true], \"You must agree to Ellii's\\xa0terms\"),\n subscribed_to_newsletter: Yup.boolean(),\n commit: Yup.string(),\n})\n\nconst INITIAL_VALUES = {\n first_name: '',\n last_name: '',\n email: '',\n password: '',\n school_name: '',\n country: '',\n terms: false,\n subscribed_to_newsletter: true,\n commit: '',\n}\n\n// Use the default values as errors. If value is falsy then the field has an error.\nconst INITIAL_ERRORS = INITIAL_VALUES\n\nexport default function CreateFreeAccountDialog({\n pollId,\n pollTopic,\n open,\n onOpenChange,\n}) {\n const recaptcha = useRecaptcha()\n const [remoteErrors, setRemoteErrors] = useState([])\n const [alert, setAlert] = useState()\n const [isPending, setIsPending] = useState(false)\n\n const countries = getCountryOptions({ emptyName: 'Select...' })\n\n const validateRemoteErrors = validateFieldErrors(remoteErrors)\n\n const handleSubmit = async (formValues, { setFieldError }) => {\n setIsPending(true)\n\n const context = {\n variation: 'free-polls',\n interactive_set_id: pollId,\n interactive_set_topic: pollTopic,\n }\n const { commit, ...user } = formValues\n const recaptchaToken = await recaptcha.executeAsync()\n\n await signUp({ user, commit, recaptchaToken, context })\n .then(() => {\n setIsPending(false)\n onOpenChange({ isOpen: false, signupSuccess: true })\n })\n .catch(err => {\n // Each key is a form field. Each value is an array of messages\n const fieldErrors = err.fieldErrors || []\n\n setAlert(err)\n\n const errorFields = formatErrors(fieldErrors, formValues)\n\n // Store errors. This will be used to validate fields on onChange/onBlur\n setRemoteErrors(errorFields)\n\n // Render errors right now\n errorFields.forEach(({ field, message: errMsg }) => {\n setFieldError(field, errMsg)\n })\n setIsPending(false)\n })\n }\n\n return (\n \n \n \n {\n e.preventDefault()\n }}\n >\n \n \n Sign Up\n \n \n\n {isPending && }\n\n \n Ellii Polls are a free feature. You can access\n Ellii Polls by creating an account or{' '}\n \n logging in\n \n . You will need a paid subscription to enjoy all other\n Ellii materials. To view our pricing plans,{' '}\n \n click here\n \n .\n \n\n {alert && (\n \n )}\n\n \n {({ isValid, submitForm, setFieldValue }) => (\n \n )}\n \n \n \n Have an account?{' '}\n \n Log in\n \n \n \n \n \n \n )\n}\n\nCreateFreeAccountDialog.propTypes = {\n pollId: PropTypes.number.isRequired,\n pollTopic: PropTypes.string.isRequired,\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const PRICING_PATH = '/pricing'\n","import { createGlobalStyle } from 'styled-components'\n\nconst DriverStyle = createGlobalStyle`\n .driver-active .driver-overlay,\n .driver-active * {\n pointer-events: none;\n }\n .driver-active .driver-active-element,\n .driver-active .driver-active-element *,\n .driver-popover,\n .driver-popover * {\n pointer-events: auto;\n }\n @keyframes animate-fade-in {\n 0% {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n .driver-fade .driver-overlay {\n animation: animate-fade-in 0.2s ease-in-out;\n }\n .driver-fade .driver-popover {\n animation: animate-fade-in 0.2s;\n }\n .driver-popover {\n all: unset;\n box-sizing: border-box;\n color: #2d2d2d;\n margin: 0;\n padding: 15px;\n border-radius: 5px;\n min-width: 250px;\n max-width: 300px;\n box-shadow: 0 1px 10px #0006;\n z-index: 1000000000;\n position: fixed;\n top: 0;\n right: 0;\n background-color: #fff;\n }\n .driver-popover * {\n font-family: Helvetica Neue, Inter, ui-sans-serif, \"Apple Color Emoji\", Helvetica, Arial, sans-serif;\n }\n .driver-popover-title {\n font: 19px / normal sans-serif;\n font-weight: 700;\n display: block;\n position: relative;\n line-height: 1.5;\n zoom: 1;\n margin: 0;\n }\n .driver-popover-close-btn {\n all: unset;\n position: absolute;\n top: 0;\n right: 0;\n width: 32px;\n height: 28px;\n cursor: pointer;\n font-size: 18px;\n font-weight: 500;\n color: #d2d2d2;\n z-index: 1;\n text-align: center;\n transition: color;\n transition-duration: 0.2s;\n }\n .driver-popover-close-btn:hover,\n .driver-popover-close-btn:focus {\n color: #2d2d2d;\n }\n .driver-popover-title[style*=\"block\"] + .driver-popover-description {\n margin-top: 5px;\n }\n .driver-popover-description {\n margin-bottom: 0;\n font: 14px / normal sans-serif;\n line-height: 1.5;\n font-weight: 400;\n zoom: 1;\n }\n .driver-popover-footer {\n margin-top: 15px;\n text-align: right;\n zoom: 1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .driver-popover-progress-text {\n font-size: 13px;\n font-weight: 400;\n color: #727272;\n zoom: 1;\n }\n .driver-popover-footer button {\n all: unset;\n display: inline-block;\n box-sizing: border-box;\n padding: 3px 7px;\n text-decoration: none;\n text-shadow: 1px 1px 0 #fff;\n background-color: #fff;\n color: #2d2d2d;\n font: 12px / normal sans-serif;\n cursor: pointer;\n outline: 0;\n zoom: 1;\n line-height: 1.3;\n border: 1px solid #ccc;\n border-radius: 3px;\n }\n .driver-popover-footer .driver-popover-btn-disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n :not(body):has(> .driver-active-element) {\n overflow: hidden !important;\n }\n .driver-no-interaction,\n .driver-no-interaction * {\n pointer-events: none !important;\n }\n .driver-popover-footer button:hover,\n .driver-popover-footer button:focus {\n background-color: #f7f7f7;\n }\n .driver-popover-navigation-btns {\n display: flex;\n flex-grow: 1;\n justify-content: flex-end;\n }\n .driver-popover-navigation-btns button + button {\n margin-left: 4px;\n }\n .driver-popover-arrow {\n content: \"\";\n position: absolute;\n border: 5px solid #fff;\n }\n .driver-popover-arrow-side-over {\n display: none;\n }\n .driver-popover-arrow-side-left {\n left: 100%;\n border-right-color: transparent;\n border-bottom-color: transparent;\n border-top-color: transparent;\n }\n .driver-popover-arrow-side-right {\n right: 100%;\n border-left-color: transparent;\n border-bottom-color: transparent;\n border-top-color: transparent;\n }\n .driver-popover-arrow-side-top {\n top: 100%;\n border-right-color: transparent;\n border-bottom-color: transparent;\n border-left-color: transparent;\n }\n .driver-popover-arrow-side-bottom {\n bottom: 100%;\n border-left-color: transparent;\n border-top-color: transparent;\n border-right-color: transparent;\n }\n .driver-popover-arrow-side-center {\n display: none;\n }\n .driver-popover-arrow-side-left.driver-popover-arrow-align-start,\n .driver-popover-arrow-side-right.driver-popover-arrow-align-start {\n top: 15px;\n }\n .driver-popover-arrow-side-top.driver-popover-arrow-align-start,\n .driver-popover-arrow-side-bottom.driver-popover-arrow-align-start {\n left: 15px;\n }\n .driver-popover-arrow-align-end.driver-popover-arrow-side-left,\n .driver-popover-arrow-align-end.driver-popover-arrow-side-right {\n bottom: 15px;\n }\n .driver-popover-arrow-side-top.driver-popover-arrow-align-end,\n .driver-popover-arrow-side-bottom.driver-popover-arrow-align-end {\n right: 15px;\n }\n .driver-popover-arrow-side-left.driver-popover-arrow-align-center,\n .driver-popover-arrow-side-right.driver-popover-arrow-align-center {\n top: 50%;\n margin-top: -5px;\n }\n .driver-popover-arrow-side-top.driver-popover-arrow-align-center,\n .driver-popover-arrow-side-bottom.driver-popover-arrow-align-center {\n left: 50%;\n margin-left: -5px;\n }\n .driver-popover-arrow-none {\n display: none;\n }\n\n /* Class assigned to popover wrapper */\n .driver-popover {\n border-radius: 8px !important;\n }\n\n.driver-popover-prev-btn {\n background: #5774fc !important;\n color: white !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n appearance: none !important;\n border: none !important;\n border-radius: 4px !important;\n display: inline-block !important;\n cursor: pointer !important;\n opacity: 1 !important;\n font-weight: 600 !important;\n line-height: 1.4 !important;\n -webkit-text-decoration: none !important;\n text-decoration: none !important;\n text-shadow: none !important;\n}\n\n.driver-popover-next-btn {\n background: #5774fc !important;\n color: white !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n appearance: none !important;\n border: none !important;\n border-radius: 4px !important;\n display: inline-block !important;\n cursor: pointer !important;\n opacity: 1 !important;\n font-weight: 600 !important;\n line-height: 1.4 !important;\n -webkit-text-decoration: none !important;\n text-decoration: none !important;\n text-shadow: none !important;\n}\n`\n\nexport default DriverStyle\n","import { Box, Text, Icon, TransparentButton } from '@redriverpress/system'\nimport { driver } from 'driver.js'\nimport { useEffect, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport DriverStyle from './driverStyle'\n\nexport default function TourButton({ steps }) {\n const driverRef = useRef(null)\n const cleanUp = () => {\n if (driverRef.current) {\n driverRef.current.destroy()\n }\n }\n useEffect(() => {\n cleanUp()\n\n driverRef.current = driver({\n showProgress: true,\n animate: true,\n steps,\n })\n return () => {\n cleanUp()\n }\n }, [steps])\n\n return (\n {\n if (driverRef.current) {\n driverRef.current.drive()\n }\n }}\n px={0}\n >\n \n \n \n \n Guided Tour\n \n \n \n )\n}\n\nTourButton.propTypes = {\n steps: PropTypes.arrayOf(\n PropTypes.shape({\n element: PropTypes.oneOfType([PropTypes.node, PropTypes.string])\n .isRequired,\n popover: PropTypes.object,\n disableActiveInteraction: PropTypes.bool,\n onDeselected: PropTypes.func,\n onHighlightStarted: PropTypes.func,\n onHighlighted: PropTypes.func,\n })\n ).isRequired,\n}\n","import xhr from 'Common/utils/xhr'\n\nconst getTask = async taskId => {\n const { data } = await xhr({\n url: `/api/v1/tasks/${taskId}`,\n })\n\n return data\n}\n\nexport default getTask\n","import { Box, Dialog, FatLoadingSpinner, Heading } from '@redriverpress/system'\nimport StudentReferenceTask from 'Packages/tasks/components/StudentReferenceTask'\nimport PropTypes from 'prop-types'\nimport { Fragment } from 'react'\nimport { useQuery } from 'react-query'\nimport getTask from 'Common/services/tasks'\n\nexport default function ReferenceTaskDialog({\n isOpen,\n onOpenChange,\n referenceTaskId,\n openPortal,\n}) {\n const { data: referenceTask, isLoading } = useQuery(\n ['reference_task', referenceTaskId],\n () => getTask(referenceTaskId),\n {\n enabled: isOpen,\n }\n )\n\n const PortalComponent = openPortal ? Dialog.Portal : Fragment\n\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n \n\n \n \n Reference\n \n \n \n \n {isLoading && (\n \n \n \n )}\n {referenceTask && (\n \n )}\n \n \n \n \n \n )\n}\n\nReferenceTaskDialog.defaultProps = {\n openPortal: true,\n}\n\nReferenceTaskDialog.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n referenceTaskId: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n .isRequired,\n openPortal: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\nimport { useEffect, useRef } from 'react'\n\nimport Alert from './Alert'\nimport scrollToElement from '../../utils/scrollToElement'\n\n// TODO This component needs a refactor — fallback prop is doin me a confuse\nfunction AutoScrollAlert({ alert, fallback, ...props }) {\n const ref = useRef()\n\n useEffect(() => {\n if (alert) {\n scrollToElement(ref.current)\n }\n }, [alert])\n\n return (\n \n {alert.message || fallback}\n \n )\n}\n\nAutoScrollAlert.propTypes = {\n alert: PropTypes.shape({\n message: PropTypes.string,\n }).isRequired,\n fallback: PropTypes.any.isRequired, // eslint-disable-line react/forbid-prop-types\n}\n\nexport default AutoScrollAlert\n","import R from 'ramda'\n\nimport {\n CANADA,\n COUNTRY_CURRENCY,\n EUROPE_COUNTRIES,\n} from '../constants/country'\nimport getInitialState from '../utils/getInitialState'\n\nlet state = null\nfunction getState(property) {\n if (state === null) {\n state = getInitialState() || {}\n }\n\n return state[property]\n}\n\nfunction getList(type) {\n const countries = getState('countries') || {}\n\n return countries[type] || []\n}\n\nfunction getCountries() {\n return getList('all')\n}\n\nfunction getPriorityCountries() {\n return getList('priority')\n}\n\nfunction getCountrySeparator() {\n return { code: '---------------', name: '---------------', disabled: true }\n}\n\nfunction getProvinces() {\n return getState('provinces') || []\n}\n\nfunction getCountryEmptyValue({ name = 'Select your country' } = {}) {\n return { code: '', name }\n}\n\nexport function stateLabel(country) {\n if (country === CANADA) {\n return 'Province'\n }\n\n return 'State'\n}\n\nfunction emptyStateLabel(country) {\n return `Select your ${stateLabel(country)}`\n}\n\nfunction getProvinceEmptyValue({ name = 'Select your province' }) {\n return { code: '', name }\n}\n\nlet countryOptions = null\nexport function getCountryOptions({ emptyName } = {}) {\n if (countryOptions === null) {\n countryOptions = [\n getCountryEmptyValue({ name: emptyName }),\n ...getPriorityCountries().map(c => ({ ...c, key: `priority-${c.code}` })),\n getCountrySeparator(),\n ...getCountries(),\n ]\n }\n\n return countryOptions\n}\n\nlet provinceOptions = null\nexport function getProvinceOptions({ emptyName } = {}) {\n if (provinceOptions === null) {\n const provinces = getProvinces()\n\n // Helper to build the final result\n const buildOptions = (list, emptyLabel) => [\n getProvinceEmptyValue({ name: emptyName || emptyLabel }),\n ...list,\n ]\n\n // It's an array? Build an array\n if (Array.isArray(provinces)) {\n provinceOptions = buildOptions(provinces)\n } else {\n // It's an object? Build an object indexed by country code\n provinceOptions = R.mapObjIndexed(\n (value, country) => buildOptions(value, emptyStateLabel(country)),\n provinces\n )\n }\n }\n\n return provinceOptions\n}\n\nexport function getCountryCurrency(country) {\n if (EUROPE_COUNTRIES.includes(country)) {\n return 'EUR'\n }\n\n return COUNTRY_CURRENCY[country] || 'USD'\n}\n\nexport function getBrowserCountry({ fallback = 'US' } = {}) {\n if (\n typeof Intl !== 'object' ||\n typeof Intl.DateTimeFormat !== 'function' ||\n window.timezonesCountry == null\n ) {\n return fallback\n }\n\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n return window.timezonesCountry[timezone] || fallback\n}\n","export const none = 'none'\nexport const cefr = 'cefr'\nexport const clb = 'clb'\nexport const eld = 'eld'\nexport const nrs = 'nrs'\n\nexport const levels = {\n [none]: [\n { label: 'Pre Beg', value: 'Pre Beg' },\n { label: 'Beg', value: 'Beg' },\n { label: 'Low Int', value: 'Low Int' },\n { label: 'Int', value: 'Int' },\n { label: 'High Int', value: 'High Int' },\n { label: 'Adv', value: 'Adv' },\n ],\n [clb]: [\n { label: 'Pre Beg (Pre CLB)', value: 'Pre Beg' },\n { label: 'Beg (CLB 1–2)', value: 'Beg' },\n { label: 'Low Int (CLB 3–4)', value: 'Low Int' },\n { label: 'Int (CLB 5–6)', value: 'Int' },\n { label: 'High Int (CLB 7–9)', value: 'High Int' },\n { label: 'Adv (CLB 10–12)', value: 'Adv' },\n ],\n [cefr]: [\n { label: 'Pre Beg (A0)', value: 'Pre Beg' },\n { label: 'Beg (A1)', value: 'Beg' },\n { label: 'Low Int (A2)', value: 'Low Int' },\n { label: 'Int (B1–B2)', value: 'Int' },\n { label: 'High Int (B2–C1)', value: 'High Int' },\n { label: 'Adv (C1–C2)', value: 'Adv' },\n ],\n [eld]: [\n { label: 'Pre Beg (Pre ELD)', value: 'Pre Beg' },\n { label: 'Beg (ELD 1)', value: 'Beg' },\n { label: 'Low Int (ELD 2)', value: 'Low Int' },\n { label: 'Int (ELD 3-4)', value: 'Int' },\n { label: 'High Int (ELD 5)', value: 'High Int' },\n { label: 'Adv (ELD 6)', value: 'Adv' },\n ],\n [nrs]: [\n { label: 'Pre Beg (NRS 1)', value: 'Pre Beg' },\n { label: 'Beg (NRS 2)', value: 'Beg' },\n { label: 'Low Int (NRS 3)', value: 'Low Int' },\n { label: 'Int (NRS 4-5)', value: 'Int' },\n { label: 'High Int (NRS 5-6)', value: 'High Int' },\n { label: 'Adv (NRS 6+)', value: 'Adv' },\n ],\n}\n","import { useRef, useEffect } from 'react'\n/**\n * useDebounce hook\n * @param {function} fn - function that will be executed after timeout milliseconds, unless it is invoked again\n * @param {number} timeout - delay in milliseconds to execute the fn\n * @param {boolean} cleanUpOnUnmount - allows to clean the timeout when the component is unmounted\n * @returns {function} - function that will execute fn after delay, or refresh execution delay if is in delay timeframe\n */\nexport default function useDebounce(fn, timeout, cleanUpOnUnmount = false) {\n const debounce = useRef(null)\n // more info on the use of useRef here: https://stackoverflow.com/questions/53090432/react-hooks-right-way-to-clear-timeouts-and-intervals\n\n // necessary to clear memory leak if the component is unmounted before the execution of this debounce\n useEffect(() => {\n if (cleanUpOnUnmount) {\n return () => clearTimeout(debounce.current)\n }\n }, [])\n\n const invoke = (...args) => {\n // if it's about to run, then clear the timeout so it's refreshed\n if (debounce.current) clearTimeout(debounce.current)\n debounce.current = setTimeout(() => fn(...args), timeout)\n }\n\n return invoke\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Link } from 'react-router-dom'\n\nimport { Box, Icon, Text, Link as A, Container } from '@redriverpress/system'\n\nconst RouteShape = PropTypes.shape({\n label: PropTypes.string.isRequired,\n to: PropTypes.string.isRequired,\n external: PropTypes.bool,\n})\n\nconst LinkWrapper = ({ route }) => {\n if (route.external)\n return (\n \n {route.label}\n \n )\n return {route.label}\n}\n\nLinkWrapper.propTypes = { route: RouteShape.isRequired }\n\nexport default function Breadcrumbs({ routes, ...props }) {\n const trimmedRoutes = R.dropLast(2, routes)\n const penultimateRoute = R.last(R.init(routes))\n const lastRoute = R.last(routes)\n\n return (\n \n {trimmedRoutes.map(route => (\n \n \n \n \n ))}\n \n \n \n \n \n \n \n {lastRoute.label}\n \n \n )\n}\n\nBreadcrumbs.propTypes = {\n routes: PropTypes.arrayOf(RouteShape).isRequired,\n}\n","const CLASS_VERSION = {\n legacy: 1,\n kanban: 2,\n}\n\nexport default CLASS_VERSION\n","import { Box, Text } from '@redriverpress/system'\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\nimport PropTypes from 'prop-types'\nimport { useEffect, useState } from 'react'\n\nimport RecPlayButton from './RecPlayButton'\n\nexport default function Recorder({\n status,\n recordingTime,\n onClick,\n maxSeconds,\n small,\n}) {\n const [seconds, setSeconds] = useState(0)\n\n const recording = status === recorderStatus.RECORDING\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 return (\n \n \n {recordingTime ? (\n \n {recordingTime}\n \n ) : null}\n \n )\n}\nRecorder.defaultProps = {\n maxSeconds: 120,\n small: false,\n recordingTime: null,\n}\n\nRecorder.propTypes = {\n status: PropTypes.string.isRequired,\n onClick: PropTypes.func.isRequired,\n recordingTime: PropTypes.string,\n maxSeconds: PropTypes.number,\n small: PropTypes.bool,\n}\n","import { Box, Button, Dialog, Heading, Icon, Text } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nexport default function RequestMicPermissionDialog({\n isOpen,\n onConfirm,\n onOpenChange,\n}) {\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n Please enable microphone permission\n \n \n\n <>\n \n \n Please enable microphone permission\n \n \n Click the icon in your\n browser's address bar, set the correct permission, and then\n refresh this page.\n \n \n \n \n >\n \n \n \n )\n}\n\nRequestMicPermissionDialog.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onConfirm: PropTypes.func.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n}\n","import {\n Box,\n FatLoadingSpinner,\n Icon,\n TransparentButton,\n} from '@redriverpress/system'\nimport useAudioPlayer from 'Common/hooks/useAudioPlayer'\nimport PropTypes from 'prop-types'\nimport { cloneElement, useState } from 'react'\n\nimport RecPlayButton from './RecPlayButton'\n\nexport default function Player({\n src,\n showCurrentTime,\n showRemainingTime,\n children,\n onDelete,\n small,\n}) {\n const audioProps = useAudioPlayer()\n const {\n audioNode,\n canPlayThrough,\n currentTime,\n duration,\n isPlaying,\n remainingTime,\n togglePlay,\n setCurrentTime,\n setCanPlayThrough,\n setIsPlaying,\n } = audioProps\n\n const [isWaiting, setIsWaiting] = useState(false)\n\n const { minutes: remainingMinutes, seconds: remainingSeconds } = remainingTime\n\n const { minutes: currentMinutes, seconds: currentSeconds } = currentTime\n\n return (\n <>\n {/* Audio Blob */}\n \n\n {children ? (\n cloneElement(children, audioProps)\n ) : (\n \n \n {canPlayThrough && !isWaiting ? (\n \n ) : (\n \n )}\n \n {/* Current Time */}\n {showCurrentTime && (\n \n {currentMinutes < 10 ? `0${currentMinutes}` : currentMinutes}:\n {currentSeconds < 10 ? `0${currentSeconds}` : currentSeconds}\n \n )}\n {showRemainingTime && (\n \n {remainingMinutes < 10\n ? `0${remainingMinutes}`\n : remainingMinutes}\n :\n {remainingSeconds < 10\n ? `0${remainingSeconds}`\n : remainingSeconds}\n \n )}\n {onDelete && (\n \n \n \n )}\n \n )}\n >\n )\n}\n\nPlayer.defaultProps = {\n small: false,\n showCurrentTime: false,\n showRemainingTime: false,\n children: null,\n}\n\nPlayer.propTypes = {\n src: PropTypes.string.isRequired,\n onDelete: PropTypes.func,\n children: PropTypes.node,\n showCurrentTime: PropTypes.bool,\n showRemainingTime: PropTypes.bool,\n small: PropTypes.bool,\n}\n","import { checkIfIOS } from '@redriverpress/system'\nimport { useEffect, useRef, useState } from 'react'\n\nexport default function useAudioPlayer() {\n const audioNode = useRef(null)\n\n // NB: `isPlaying` is not a direct reflection of the audio element's play/pause state.\n // We use it to evaluate whether the user has explicitly set the audio to play or pause.\n // Hence, this state value is not updated during the playing/pausing done in the range input's event handlers.\n // We do, however, set this explicitly to false on the audio element's onEnded event.\n const [isPlaying, setIsPlaying] = useState(false)\n\n // NB: setCurrentTime is not used to set the audio element's actual `currentTime` attribute.\n // We use currentTime to store the value dispatched on the audio element's ontimeupdate event.\n // Hence, we set the audio's currentTime directly within the range input's onChange handler; this in turn\n // causes the audio element's ontimeupdate to fire, which in turn updates our currentTime state value.\n const [currentTime, setCurrentTime] = useState(0)\n\n const currentMinutes = Math.floor((currentTime / 60) % 60)\n const currentSeconds = Math.floor(currentTime % 60)\n\n const fallbackDuration = 60 * 2\n\n const duration = audioNode.current\n ? Math.floor(audioNode.current.duration) || fallbackDuration\n : 0\n\n const remainingTime = duration - currentTime\n const remainingMinutes = Math.floor((remainingTime / 60) % 60)\n const remainingSeconds = Math.floor(remainingTime % 60)\n\n const progress = audioNode.current ? (currentTime / duration) * 100 : 0\n\n // canplaythrough does not fire on iOS because iOS does not preload HTML audio; the user must invoke\n // the audio download manually by hitting the play button :(\n const [canPlayThrough, setCanPlayThrough] = useState(false)\n\n // canPlayThrough needs to be set on the client, as checkIfIOS requires the navigator interface\n useEffect(() => {\n setCanPlayThrough(checkIfIOS())\n }, [])\n\n const togglePlay = () => {\n if (isPlaying) {\n setIsPlaying(false)\n return audioNode.current.pause()\n }\n setIsPlaying(true)\n return audioNode.current.play()\n }\n\n const setTime = time => {\n audioNode.current.currentTime = time\n }\n\n const handleScrub = () => {\n isPlaying && audioNode.current.play()\n }\n\n return {\n audioNode,\n canPlayThrough,\n currentTime: {\n value: currentTime,\n minutes: currentMinutes,\n seconds: currentSeconds,\n },\n duration,\n isPlaying,\n progress,\n remainingTime: {\n value: remainingTime,\n minutes: remainingMinutes,\n seconds: remainingSeconds,\n },\n togglePlay,\n setTime,\n handleScrub,\n setCurrentTime,\n setCanPlayThrough,\n setIsPlaying,\n }\n}\n","import { useEffect, useState, lazy } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { Box, LoadWithSuspense } from '@redriverpress/system'\n\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\nimport useElapsingTime from 'Common/hooks/useElapsingTime'\nimport useMediaRecorder from 'Common/hooks/useMediaRecorder'\nimport RequestMicPermissionDialog from 'Common/components/dialogs/RequestMicPermissionDialog'\nimport ConfirmActionDialog from 'Common/components/dialogs/ConfirmActionDialog'\n\nimport Player from './Player'\n\nconst Recorder = lazy(() => import('./Recorder'))\n\nconst MAX_RECORDING_TIME = 2\nexport default function AudioRecorder({\n audio,\n onAudioRecorded,\n onDeleteAudio,\n shouldConfirmToDelete,\n onStatusChange,\n small,\n}) {\n const {\n base64Media,\n startRecording,\n status,\n stopRecording,\n setStatus,\n } = useMediaRecorder({\n audio: true,\n })\n\n const [isConfirmationDialogOpen, setIsConfirmationDialogOpen] = useState(\n false\n )\n const [\n isRequestPermissionDialogOpen,\n setIsRequestPermissionDialogOpen,\n ] = useState(false)\n\n const [isDeleteAudioPending, setIsDeleteAudioPending] = useState(false)\n const [recordingTime, setRecordingTime] = useState('00:00')\n\n const handleDeleteResponse = () => {\n setIsConfirmationDialogOpen(false)\n setRecordingTime('00:00')\n setIsDeleteAudioPending(false)\n onDeleteAudio()\n setStatus(recorderStatus.IDLE)\n }\n\n const handleStartRecording = () => {\n if (status === recorderStatus.BLOCKED) {\n return setIsRequestPermissionDialogOpen(true)\n }\n startRecording()\n }\n\n const handleAudioDeletion = () => {\n if (shouldConfirmToDelete) {\n return setIsConfirmationDialogOpen(true)\n }\n\n handleDeleteResponse()\n }\n\n const handleClick = () => {\n if (status === recorderStatus.RECORDING) {\n stopRecording()\n return\n }\n\n handleStartRecording()\n }\n\n useElapsingTime({\n timeLimit: MAX_RECORDING_TIME,\n handleTimeOver: stopRecording,\n updateTimeCallback: setRecordingTime,\n shouldStartTimer: status === recorderStatus.RECORDING,\n })\n\n useEffect(() => {\n const saveAudioEffectsWrapper = () => {\n if (base64Media) {\n onAudioRecorded(base64Media)\n setStatus(recorderStatus.IDLE)\n }\n }\n\n saveAudioEffectsWrapper()\n }, [base64Media])\n\n useEffect(() => {\n onStatusChange(status)\n }, [status])\n\n return (\n <>\n \n {audio ? (\n handleAudioDeletion(true)}\n showCurrentTime={false}\n showRemainingTime\n small={small}\n />\n ) : (\n \n )}\n \n\n setIsConfirmationDialogOpen(false)}\n isPending={isDeleteAudioPending}\n onConfirm={handleDeleteResponse}\n onOpenChange={isOpen => setIsConfirmationDialogOpen(isOpen)}\n subtitle='Are you sure you want to delete the recorded answer?'\n title='Delete answer'\n />\n\n setIsRequestPermissionDialogOpen(false)}\n onOpenChange={isOpen => setIsRequestPermissionDialogOpen(isOpen)}\n />\n >\n )\n}\n\nAudioRecorder.defaultProps = {\n small: false,\n shouldConfirmToDelete: false,\n audio: null,\n}\n\nAudioRecorder.propTypes = {\n audio: PropTypes.string,\n onAudioRecorded: PropTypes.func.isRequired,\n onDeleteAudio: PropTypes.func.isRequired,\n shouldConfirmToDelete: PropTypes.bool,\n onStatusChange: PropTypes.func.isRequired,\n small: PropTypes.bool,\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const REGULAR_EXPRESSIONS = {\n // no unicodes from u2460-24FF, no numbers and no special chars\n name: /^[^\\u2460-\\u24FF^0-9`!@#$%^&*+_=]+$/,\n // a-Z, numbers, hyphen and underscore\n username: /^[a-zA-Z0-9-_]+$/,\n invitationCode: /^[a-zA-Z0-9]+$/,\n onlyOneAlphanumeric: /^([a-zA-Z0-9]{1})$/,\n}\n","import { upperCaseFirst } from 'text-case'\nimport { any, propEq, reject, complement, both } from 'ramda'\n\n/**\n * Build a formik error object based on known field-errors.\n *\n * Each fieldError should be an object with 3 properties:\n * - Field: the field name that the error belongs to\n * - Value: the value that the field had when the error ocurred\n * - Message: error message to be shown to the user\n * @param {[FieldError]} errors\n */\nexport const validateFieldErrors = errors => formValues => {\n return errors.reduce((err, { field, value, message }) => {\n if (value === formValues[field]) {\n // eslint-disable-next-line no-param-reassign\n err[field] = message\n }\n\n return err\n }, {})\n}\n\n// For each field with an error, store the field name and it's value.\n// This will be used to validate fields on onChange/onBlur\nexport const formatErrors = (errors, formValues) => {\n return Object.keys(errors)\n .filter(field => field in formValues)\n .map(field => {\n return {\n field,\n value: formValues[field],\n message: errors[field].map(upperCaseFirst).join('. '),\n }\n })\n}\n\n/**\n * Remove all errors of dependent fields when a field changes\n *\n * Let's say that year field changes and month is a depentned field.\n * This function will remove all month errors when year changes.\n *\n * @param {*} dependencies - object where each key is a field name and each value is a dependent field name\n * @param {*} change - object that describe a change. It has two properties: name and value\n * @returns Function that receives an array of errors and returns new array of errors\n */\nexport const resetDependantFieldErrors = (dependencies, change) => errors => {\n const { name, value } = change\n const dependentField = dependencies[name]\n\n if (!dependentField) {\n return errors\n }\n\n const isDependentFieldError = propEq('field', dependentField)\n const fieldValueChanged = both(\n propEq('field', name),\n complement(propEq('value', value))\n )\n\n // Keep remoteErrors reference unchagned to avoid extra renderings\n if (any(fieldValueChanged, errors) && any(isDependentFieldError, errors)) {\n return reject(isDependentFieldError, errors)\n }\n\n return errors\n}\n\nexport default validateFieldErrors\n","import PropTypes from 'prop-types'\n\nimport { Checkbox, CheckboxControl } from '@redriverpress/system'\n\nimport Field from './Field'\n\n/**\n * Wrapper around field to avoid repeat a lot of properties when\n * we show a checkbox on a form\n */\nexport default function CheckboxField({ label, ...props }) {\n const component = label ? Checkbox : CheckboxControl\n return \n}\n\nCheckboxField.defaultProps = {\n label: null,\n}\n\nCheckboxField.propTypes = {\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n}\n","export const ELLII_BOT_NAME = 'Ellii Bot'\n\nexport const GOOGLE_SSO_URL = '/omniauth/google_oauth2'\n\nexport const { RECAPTCHA_V3_SITE_KEY } = process.env\n","/* eslint-disable react/prop-types */\nimport { useCallback } from 'react'\nimport R from 'ramda'\nimport { useFormikContext } from 'formik'\n\nimport { Select } from '@redriverpress/system'\n\nimport Field from './Field'\n\n/**\n * Formik's default onChange expects an Event not just the value. Workaround that.\n * Also forms store option's value as form value.\n *\n * Take sign-up for example. It shows a country select. When the user choose a country\n * formik track the country code (option.value).\n */\nfunction SelectControl({ onChange, ...props }) {\n const formik = useFormikContext()\n\n const { getOptionValue, name } = props\n\n const getValue = getOptionValue || R.identity\n\n const handleChange = useCallback(\n option => {\n const value = option ? getValue(option) : ''\n\n const event = { target: { name, value } }\n\n // Let formik know that the field changed\n formik.handleChange(event)\n // Now call onChange prop only if it's a user provided callback (formik injects onChange by default)\n if (onChange !== formik.handleChange) {\n onChange(event)\n }\n },\n [name, onChange, getValue, formik.handleChange]\n )\n\n return \n}\n\nexport default function SelectField(props) {\n return \n}\n","import axios from 'axios'\n\nexport { CancelToken, isCancel } from 'axios'\n\n/**\n * This method must be moved to a common folder on the project or move to a common folder,\n * if we decided to use a monorepo\n * @param String url\n * @param String method\n * @param Object data\n * @param Object params\n * @param Object headers (optional)\n * @returns {Promise}\n */\nexport default function xhr({\n url,\n method,\n data,\n headers = {},\n cancelToken,\n params,\n}) {\n return axios(url, {\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': document\n .querySelector('meta[name=\"csrf-token\"]')\n .getAttribute('content'),\n ...headers,\n },\n method,\n data,\n params,\n cancelToken,\n })\n}\n","import { useState } from 'react'\n\nimport {\n Box,\n Icon,\n Input,\n inputIconWidth,\n TransparentButton,\n} from '@redriverpress/system'\n\nfunction ShowPasswordToggle({ checked, onClick, ...props }) {\n return (\n \n \n \n )\n}\n\n/** Input password with a toggle to reveal password */\nexport default function InputPassword(props) {\n const [showPassword, setShowPassword] = useState(false)\n\n const { type, error, iconRight } = props\n\n const inputType = showPassword ? 'text' : type\n\n return (\n \n \n\n setShowPassword(v => !v)}\n />\n \n )\n}\n","/**\n * AdaptiveTabs renders 'tabs' in a custom dropdown menu from\n * default to lg, and in horizontal tabs from lg and up.\n */\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport PropTypes from 'prop-types'\nimport R from 'ramda'\nimport styled from 'styled-components'\nimport useMedia from 'use-media'\nimport { NavLink, useLocation } from 'react-router-dom'\nimport { motion } from 'framer-motion'\nimport { useEffect, useState } from 'react'\n\nimport {\n Box,\n Icon,\n TransparentButton,\n Container,\n mediaQueries,\n shouldForwardProp,\n} from '@redriverpress/system'\n\nimport Tabs, { getTabKey, TabsPropType } from './Tabs'\n\nconst MotionIcon = motion(Icon)\n\n// Duplicated from @redriverpress/system because it made more sense than exporting this from there\nconst MenuItem = styled(TransparentButton)\n .withConfig({ shouldForwardProp })\n .attrs(props => ({\n borderRadius: 'rounded',\n color: 'black',\n display: 'block',\n fontSize: 0,\n fontWeight: 600,\n py: 2,\n px: ['0.75rem', null, 3], // 0.75rem on mobile so items in full width menus line up w/ site container\n textAlign: 'left',\n width: 1,\n as: props.as || (props.href ? 'a' : 'button'),\n }))`\n transition: unset; /* Override link global style */\n\n /* Radix manages focus programatically, so it's triggered on hover as well */\n &:focus {\n background: ${props =>\n props.disabled ? 'transparent' : props.theme.colors.blue500};\n color: ${props =>\n props.disabled ? 'currentColor' : props.theme.colors.white};\n outline: none;\n }\n`\n\nMenuItem.displayName = 'DropdownMenu.Item'\n\nfunction NavLinkItem({ disabled, to, icon, label }) {\n return (\n \n \n \n )\n}\n\nNavLinkItem.defaultProps = {\n disabled: false,\n icon: null,\n}\n\nNavLinkItem.propTypes = {\n disabled: PropTypes.bool,\n to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,\n icon: PropTypes.string,\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n}\n\nNavLinkItem.displayName = 'DropdownMenu.NavLink'\n\nconst Dropdown = ({ tabs, DropdownChevron }) => {\n const { pathname } = useLocation()\n const [isOpen, setOpen] = useState(false)\n const [navBarHeight, setNavBarHeight] = useState(0)\n\n const tabsWithoutSearch = tabs.map(t => ({\n ...t,\n to: R.is(String, t.to) ? t.to.split('?')[0] : t.to,\n }))\n const currentTab =\n // Simple `to` prop\n R.find(R.propEq('to', pathname), tabsWithoutSearch) ||\n // Object `to` prop\n R.find(R.pathEq(['to', 'pathname'], pathname), tabsWithoutSearch)\n\n useEffect(() => {\n // Close menu when path changes\n setOpen(false)\n }, [pathname])\n\n useEffect(() => {\n const navbarElement = document.querySelector('[data-esll-navbar]')\n setNavBarHeight(navbarElement.offsetHeight)\n }, [])\n\n return (\n setOpen(o)}>\n \n \n {/* 'active' className set in case tab labels use the NavLink .active class for styling */}\n \n {currentTab?.icon && (\n \n \n \n )}\n {currentTab?.label}\n \n \n \n \n \n \n {tabs.map(tab => (\n \n ))}\n \n \n \n )\n}\n\nDropdown.propTypes = {\n tabs: TabsPropType.isRequired,\n DropdownChevron: PropTypes.func.isRequired,\n}\n\nexport default function AdaptiveTabs({\n tabs,\n DropdownChevron,\n tabsBreakpoint,\n}) {\n const isTabsBreakpoint = useMedia(tabsBreakpoint)\n\n return isTabsBreakpoint ? (\n \n ) : (\n \n )\n}\n\nexport const DefaultChevron = ({ isOpen, ...props }) => (\n \n)\nDefaultChevron.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n}\n\nAdaptiveTabs.defaultProps = {\n tabsBreakpoint: mediaQueries.lg,\n DropdownChevron: DefaultChevron,\n}\n\nAdaptiveTabs.propTypes = {\n tabs: TabsPropType.isRequired,\n tabsBreakpoint: PropTypes.oneOf(\n Object.keys(mediaQueries).map(k => mediaQueries[k])\n ),\n DropdownChevron: PropTypes.func,\n}\n","import { useRef } from 'react'\nimport { RECAPTCHA_V3_SITE_KEY } from 'Common/constants'\n\nfunction useRecaptcha() {\n const ref = useRef()\n\n return {\n props: { ref, sitekey: RECAPTCHA_V3_SITE_KEY },\n executeAsync: () => ref.current?.executeAsync() ?? Promise.resolve(''),\n }\n}\n\nexport default useRecaptcha\n","import PropTypes from 'prop-types'\nimport { motion, AnimatePresence } from 'framer-motion'\n\nimport { Box } from '@redriverpress/system'\n\nimport usePrevious from '../hooks/usePrevious'\n\nconst MotionBox = motion(Box)\nMotionBox.displayName = 'MotionBox'\n\nexport default function TransitionItems({\n animateInitial,\n children,\n currentItem,\n getKey,\n position,\n}) {\n const prevPosition = usePrevious(position)\n\n function getDirection() {\n // If new position is a decrement (e.g. 2 -> 1)\n if (prevPosition > position) return 'prev'\n\n // New position is an increment\n return 'next'\n }\n\n const distance = '4rem'\n\n // `direction` needs to be passed into variants' enter/exit methods via\n // AnimatePresence AND MotionBox `custom` prop so that the value can be\n // updated *before* the actual enter/exit animation is computed.\n // https://www.framer.com/api/motion/animate-presence/#animatepresenceprops.custom\n const variants = {\n enter: dir => ({\n opacity: 0,\n x: dir === 'next' ? distance : `-${distance}`,\n }),\n centre: { opacity: 1, x: '0rem' },\n exit: dir => ({\n opacity: 0,\n x: dir === 'next' ? `-${distance}` : distance,\n }),\n transition: {\n type: 'tween',\n duration: 0.3,\n ease: 'easeInOut',\n },\n }\n\n return (\n \n {currentItem && (\n \n {children}\n \n )}\n \n )\n}\n\nTransitionItems.defaultProps = {\n animateInitial: true,\n getKey: x => `${x.id}`,\n currentItem: null,\n}\n\nTransitionItems.propTypes = {\n animateInitial: PropTypes.bool,\n children: PropTypes.node.isRequired,\n currentItem: PropTypes.shape({ id: PropTypes.number.isRequired }),\n getKey: PropTypes.func,\n position: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n .isRequired,\n}\n","import { Box, Heading, Icon, Text, Tooltip } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nconst CompactDescription = ({ description }) => {\n return (\n \n \n \n \n \n \n \n \n \n \n {description}\n \n \n \n \n )\n}\n\nCompactDescription.propTypes = {\n description: PropTypes.string.isRequired,\n}\n\nexport default function PageHeader({ title, description, measure, compact }) {\n return (\n \n \n \n {title}\n \n {description && compact ? (\n \n ) : null}\n \n {description && !compact ? (\n {description}\n ) : null}\n \n )\n}\n\nPageHeader.defaultProps = {\n description: null,\n compact: false,\n measure: true,\n}\n\nPageHeader.propTypes = {\n title: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,\n description: PropTypes.oneOfType([PropTypes.node, PropTypes.string]),\n compact: PropTypes.bool,\n measure: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\nimport styled, { css } from 'styled-components'\nimport useMedia from 'use-media'\n\nimport {\n Box,\n MotionBox,\n Text,\n HiddenInput,\n mediaQueries,\n} from '@redriverpress/system'\n\nconst ToggleControlOuter = styled(Box).attrs(props => ({\n bg: props.active ? 'blue700' : 'gray700',\n transition: 'background 0.125s linear',\n display: 'flex',\n alignItems: 'center',\n height: '2rem',\n width: props.larger ? '5rem' : ['4rem', null, null, '5rem'],\n borderRadius: '1rem',\n position: 'relative',\n px: 2,\n flexShrink: 0,\n}))`\n user-select: none;\n`\n\nconst ToggleControlIndicator = styled(MotionBox).attrs(props => ({\n size: '1.25rem',\n borderRadius: 'circular',\n bg: 'white',\n position: 'absolute',\n animate: {\n x: props.active ? props.translateBy : 0,\n },\n initial: false,\n transition: {\n type: 'spring',\n stiffness: 500,\n damping: 40,\n mass: 0.5,\n },\n}))``\n\nconst ToggleControlStatus = styled(Text).attrs({\n color: 'white',\n fontWeight: '600',\n fontSize: ['12px', 0],\n m: 0,\n})`\n text-transform: uppercase;\n transition: opacity 0.125s linear;\n`\n\nconst Label = styled(Text).attrs({\n as: 'span',\n display: 'inline-block',\n fontSize: [0, null, null, 1],\n fontWeight: 600,\n id: 'toggleLabel',\n})`\n ${({ hideLabel }) =>\n hideLabel &&\n css`\n position: absolute;\n height: 1px;\n width: 1px;\n overflow: hidden;\n clip: rect(1px, 1px, 1px, 1px);\n `}\n`\nexport default function Toggle({\n label,\n hideLabel,\n active,\n onChange,\n larger,\n labelLeft,\n showStatusLabel,\n ...props\n}) {\n const isLg = useMedia(mediaQueries.lg)\n\n return (\n \n \n {labelLeft && (\n \n )}\n \n \n {showStatusLabel && (\n \n \n On\n \n \n Off\n \n \n )}\n \n {!labelLeft && (\n \n )}\n \n )\n}\n\nToggle.defaultProps = {\n hideLabel: false,\n larger: false,\n labelLeft: false,\n showStatusLabel: true,\n}\n\nToggle.propTypes = {\n active: PropTypes.bool.isRequired,\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n hideLabel: PropTypes.bool,\n larger: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n labelLeft: PropTypes.bool,\n showStatusLabel: PropTypes.bool,\n}\n","import R from 'ramda'\n\nexport const ascByName = R.ascend(\n R.compose(\n R.toLower,\n R.prop('name')\n )\n)\nexport const descByName = R.descend(\n R.compose(\n R.toLower,\n R.prop('name')\n )\n)\n","import PropTypes from 'prop-types'\nimport { Box, Icon } from '@redriverpress/system'\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\n\n// TODO: define the icon and bg for Lesson and Lesson packs\nconst CONTENT_TYPE_STYLES = {\n [CONTENT_TYPES.flashcardCategory]: {\n backgroundColor: 'yellow500',\n icon: 'bolt',\n },\n [CONTENT_TYPES.flashcardSet]: {\n backgroundColor: 'yellow500',\n icon: 'bolt',\n },\n [CONTENT_TYPES.lesson]: {\n backgroundColor: 'gray300',\n icon: 'file-alt',\n },\n [CONTENT_TYPES.course]: {\n backgroundColor: 'gray300',\n icon: 'backpack',\n },\n [CONTENT_TYPES.video]: {\n backgroundColor: 'blue300',\n icon: 'camera-movie',\n },\n}\n\nexport default function CoverImageFallback({\n contentType,\n iconFontSize,\n ...props\n}) {\n return (\n \n \n \n )\n}\n\nCoverImageFallback.defaultProps = {\n iconFontSize: 1,\n}\n\nCoverImageFallback.propTypes = {\n iconFontSize: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n contentType: PropTypes.oneOf([\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.video,\n ]).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { CoverImage } from '@redriverpress/system'\n\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\n\nimport CoverImageFallback from './CardCoverImageFallback'\n\nconst STYLES = {\n small: {\n imageSize: '2.25rem',\n imageMinWidth: '2.25rem',\n iconFontSize: 1,\n },\n large: {\n imageSize: '6rem',\n imageMinWidth: '6rem',\n iconFontSize: 5,\n },\n}\n\nexport default function CardCoverImage({\n alt,\n contentType,\n height,\n iconFontSize,\n large,\n size,\n src,\n width,\n borderRadius,\n ...props\n}) {\n const styles = large ? STYLES.large : STYLES.small\n\n if (src) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nCardCoverImage.defaultProps = {\n large: false,\n src: null,\n alt: null,\n size: null,\n iconFontSize: null,\n width: null,\n height: null,\n borderRadius: 'circular',\n}\n\nCardCoverImage.propTypes = {\n large: PropTypes.bool,\n src: PropTypes.string,\n alt: PropTypes.string,\n size: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n width: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n height: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n iconFontSize: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n borderRadius: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n contentType: PropTypes.oneOf([\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.video,\n ]).isRequired,\n}\n","import {\n Box,\n Dialog,\n Icon,\n Image,\n TransparentButton,\n} from '@redriverpress/system'\nimport { motion } from 'framer-motion'\nimport PropTypes from 'prop-types'\nimport { Fragment, useRef, useState } from 'react'\nimport { use100vh } from 'react-div-100vh'\nimport styled from 'styled-components'\n\nconst MotionImage = motion(Image)\n\nconst StyledDialogContent = styled(Dialog.StyledContent)`\n background: transparent;\n width: 100%;\n max-width: 100% !important;\n height: 100%;\n max-height: 100% !important;\n overflow-y: unset;\n bottom: 0;\n margin: 0;\n`\n\n// Renders an image in a TransparentButton.\n// When the button is clicked, opens the image in a full-screen modal,\n// with the image taking up max 95vw and 95vh.\n// Zoom in/out and close controls are rendered in the top right corner.\n// Clicking the Zoom In button activates the `drag` prop on the zoomed-in image,\n// allowing to be dragged (to pan around the zoomed image).\n// The zoomed-in image is constrained to its parent's dimensions,\n// so that it can't be dragged beyond this area.\nexport default function LightboxImage({ alt, src, openPortal, ...props }) {\n const [isLightboxOpen, setIsLightboxOpen] = useState(false)\n const [isZoomed, setIsZoomed] = useState(false)\n\n // The ref for the element that the image should not be able to be dragged beyond\n const constraintsRef = useRef(null)\n\n // Ref for the image in the lightbox; used to obtain the image's natural width and height.\n const imageRef = useRef(null)\n\n // Get the available viewport height (using just '100vh' doesn't account for\n // Safari's bottom UI bar on iOS)\n const viewportHeight = use100vh()\n\n const PortalComponent = openPortal ? Dialog.Portal : Fragment\n\n return (\n <>\n setIsLightboxOpen(true)}\n p={0}\n lineHeight='normal'\n style={{\n cursor: 'zoom-in',\n }}\n >\n \n \n setIsLightboxOpen(open)}\n >\n \n \n {\n e.preventDefault()\n setIsLightboxOpen(false)\n }}\n >\n \n \n setIsZoomed(true)}\n disabled={isZoomed}\n >\n \n \n\n setIsZoomed(false)}\n disabled={!isZoomed}\n >\n \n \n\n {\n setIsLightboxOpen(false)\n setIsZoomed(false)\n }}\n >\n \n \n \n\n \n \n \n \n \n >\n )\n}\n\nLightboxImage.defaultProps = {\n openPortal: true,\n}\n\nLightboxImage.propTypes = {\n alt: PropTypes.string.isRequired,\n src: PropTypes.string.isRequired,\n openPortal: PropTypes.bool,\n}\n","import R from 'ramda'\nimport { useQuery } from 'react-query'\n\nimport getCurrentUser from 'Packages/flashcards/services/getCurrentUser'\n\nconst TWO_HOURS_IN_MS = 1000 * 60 * 60 * 2\n\nexport default function useUserAccess() {\n const {\n data: user,\n isLoading: userIsLoading,\n refetch: refetchUser,\n } = useQuery('user', getCurrentUser, {\n refetchOnWindowFocus: false,\n staleTime: TWO_HOURS_IN_MS,\n })\n\n const userLoggedIn = !!user\n\n const userHasAccess = R.any(Boolean, [\n user?.id !== null && user?.access === 'Plus',\n user?.id !== null && user?.access === 'Lite',\n ])\n\n return {\n userIsLoading,\n userHasAccess,\n userLoggedIn,\n userId: user?.id,\n userData: user,\n refetchUser,\n }\n}\n","export const CANADA = 'CA'\nexport const UNITED_STATES = 'US'\n\nexport const EUROPE_COUNTRIES = [\n 'NL',\n 'LU',\n 'SM',\n 'MK',\n 'UA',\n 'FO',\n 'GI',\n 'IS',\n 'EE',\n 'LT',\n 'RS',\n 'AD',\n 'BE',\n 'PT',\n 'IM',\n 'SK',\n 'HR',\n 'IT',\n 'FI',\n 'VA',\n 'RU',\n 'MT',\n 'DE',\n 'SJ',\n 'SI',\n 'AX',\n 'RO',\n 'BG',\n 'JE',\n 'AT',\n 'MC',\n 'FR',\n 'AL',\n 'LI',\n 'MD',\n 'IE',\n 'ES',\n 'BA',\n 'GR',\n 'GG',\n 'BY',\n 'LV',\n 'ME',\n]\n\nexport const COUNTRY_CURRENCY = {\n CA: 'CAD',\n AU: 'AUD',\n UK: 'GBP',\n GB: 'GBP',\n BR: 'BRL',\n IN: 'INR',\n MX: 'MXN',\n JP: 'JPY',\n ZA: 'ZAR',\n CZ: 'CZK',\n DK: 'DKK',\n HU: 'HUF',\n NO: 'NOK',\n NZ: 'NZD',\n PL: 'PLN',\n SG: 'SGD',\n SE: 'SEK',\n CH: 'CHF',\n HK: 'HKD',\n}\n\nexport const REQUIRE_CREDIT_CARD_STATE_COUNTRIES = [CANADA, UNITED_STATES]\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport { Box, media } from '@redriverpress/system'\n\n/**\n * Let us write css rule that will only be activate from rowDirectionStartingAt breakpoint and up.\n * For example: if rowDirectionStartingAt == 'md', writing\n *\n * ${rowDirectionBreakpoint`\n * ....styles\n * `}\n *\n * is equivalent to write\n *\n * ${media.md`\n * ....styles\n * `}\n */\nconst rowDirectionBreakpoint = (...styles) => ({ rowDirectionStartingAt }) => {\n return media[rowDirectionStartingAt](...styles)\n}\n\nconst StyledFieldGroup = styled(Box)`\n ${rowDirectionBreakpoint`\n display: flex;\n align-items: flex-start;\n\n > * {\n flex: 1 1 0;\n padding-left: ${({ theme }) => theme.space[2]};\n padding-right: ${({ theme }) => theme.space[2]};\n\n &:first-child {\n padding-left: 0;\n }\n\n &:last-child {\n padding-right: 0;\n }\n }\n `}\n`\n\n/**\n * This component is a container for a group of fields.\n * Each field on the group starts on an individual row (mobile size).\n * Then when the breakpoint (props.rowDirectionStartingAt) is reached they are shown all in one row.\n *\n * Also this component deals with padding within fields.\n */\nexport default function FieldGroup({ children, ...props }) {\n return {children}\n}\n\nFieldGroup.propTypes = {\n children: PropTypes.node.isRequired,\n rowDirectionStartingAt: PropTypes.oneOf(['sm', 'md', 'lg', 'xl']),\n}\n\nFieldGroup.defaultProps = {\n rowDirectionStartingAt: 'md',\n}\n","import dayjs from 'dayjs'\nimport isBetweenPlugin from 'dayjs/plugin/isBetween'\nimport isTomorrow from 'dayjs/plugin/isTomorrow'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport utc from 'dayjs/plugin/utc'\n\nexport function getFormattedDate(dateTime, format = null) {\n const parsed = dayjs(dateTime)\n const date = format ? parsed.format(format) : parsed.format('MMM D, YYYY')\n return `${date}`\n}\n\n/**\n * @name getFormattedDateTime\n * @description returns Date time formatted\n * @param {object} datetime\n * @returns {string} Ex. May 26, 2021 at 11:03 am\n */\nexport function getFormattedDateTime(dateTime) {\n const parsed = dayjs(dateTime)\n const date = parsed.format('MMM D, YYYY')\n const time = parsed.format('h:mm a')\n return `${date}, at ${time}`\n}\n\n/**\n * @name getTimeTo\n * @description Given datetime returns from now to datetime\n * @param {object} datetime\n * @returns {string}\n */\nexport function getTimeTo(datetime) {\n dayjs.extend(relativeTime)\n dayjs.extend(isTomorrow)\n\n return dayjs(datetime).isTomorrow() ? 'tomorrow' : dayjs().to(datetime)\n}\n\n/**\n * @name getTimeFromNow\n * @description Given datetime returns relative time from datetime\n * @param {object} datetime\n * @param {bool} withoutSuffix\n * @returns {string}\n */\nexport function getTimeFromNow(datetime, withoutSuffix) {\n dayjs.extend(relativeTime)\n return dayjs().from(datetime, withoutSuffix)\n}\n\n/**\n * @name getDateDifference\n * @description returns the difference between two dates based on the unit\n * @param {object} date1\n * @param {object} date2\n * @param {string} unit\n * @returns {string}\n */\nexport function getDateDifference(date1, date2, unit) {\n return dayjs(date1).diff(dayjs(date2), unit)\n}\n\n/**\n * @name isDate\n * @description function to compare date with date\n * @param {object} dateTime\n * @returns {object}\n */\nexport function isDate(datetime) {\n dayjs.extend(isBetweenPlugin)\n return {\n before: comparer => dayjs(datetime).isBefore(comparer),\n sameDayAs: comparer => dayjs(datetime).isSame(comparer, 'day'),\n inThePast: () => dayjs().isAfter(datetime),\n after: comparer => dayjs(datetime).isAfter(comparer),\n between: (from, to, included = false) =>\n dayjs(datetime).isBetween(from, to, null, included && '[]'),\n }\n}\n\n/**\n * @name parseUTC\n * @description parse datetime to UTC timezone\n * @param {object} dateTime\n * @returns {string}\n */\nexport function parseUTC(datetime) {\n dayjs.extend(utc)\n return dayjs(datetime)\n .utc()\n .local()\n .toDate()\n}\n\n/**\n * @name Format Seconds\n * @description Given X amount of seconds, returns the formatted time as HH:mm:ss\n * @param {number} seconds\n */\nexport function formatSeconds(seconds) {\n const totalHours = Math.floor(seconds / (60 * 60))\n let totalSeconds = seconds - totalHours * 60 * 60\n\n const totalMinutes = Math.floor(totalSeconds / 60)\n totalSeconds -= totalMinutes * 60\n\n return `${totalHours\n .toString()\n .padStart(2, '0')}:${totalMinutes\n .toString()\n .padStart(2, '0')}:${totalSeconds.toString().padStart(2, '0')}`\n}\n\n/**\n * @name generalFormat\n * @description Format a date object according to the string passed in\n * @param {object} dateTime\n * @param {string} dateFormat\n * @returns {string}\n */\nexport function generalTimeFormat(dateTime, dateFormat) {\n if (typeof dateTime === 'string') {\n return dayjs(dateTime).format(dateFormat)\n }\n return dateTime.format(dateFormat)\n}\n\n/**\n * @name setInitialTime\n * @description Set minutes, and seconds values of a date object instance\n * @param {number} minute\n * @param {number} second\n * @returns {object}\n */\nexport function setInitialTime({ minute, second }) {\n return dayjs()\n .set('minute', minute)\n .set('second', second)\n}\n\n/**\n * @name getCurrentTime\n * @description return the current value of a time unit key from DayJS object\n * @param {object} dateTime\n * @param {string} unit\n * @returns {number}\n */\nexport function getCurrentTime({ dateTime, unit }) {\n const result = {\n hour: dateTime.hour(),\n minute: dateTime.minute(),\n second: dateTime.second(),\n }\n return result[unit]\n}\n\n/**\n * @name setDateUnit\n * @description Takes a date, applies a {unit} add and returns it\n * @param {Date} date -- date to transform\n * @param {string} unit -- possible values: year, month, day, hour, minute, seconds\n * @param {number} value -- the number to add to the unit. Can also use negative number\n * @returns {dayjs date}\n */\nexport function setDateUnit(date, unit, value) {\n return dayjs(date)\n .add(value, unit)\n .toDate()\n}\n\n/**\n * @name manipulateDatetimeTo\n * @description return an object with options to manipulate the given datetime\n * @param {object} datetime\n * @param {string} unit\n * @param {string} period\n * @returns {object}\n */\nexport function manipulateDatetimeTo(datetime) {\n return {\n add: (unit, period) => dayjs(datetime).add(unit, period),\n subtract: (unit, period) => dayjs(datetime).subtract(unit, period),\n startOf: period => dayjs(datetime).startOf(period),\n endOf: period => dayjs(datetime).endOf(period),\n }\n}\n\nexport function resetUTC(dateTime) {\n dayjs.extend(utc)\n return dayjs(dateTime).utc(false)\n}\n\n// This was added because we had may places using the same value, if we need for variants than this one\n// we can discuss a better solution\nexport const TWENTY_FOUR_HOURS_IN_MS = 1000 * 60 * 60 * 24\nexport const ONE_HOUR_IN_MS = 60 * 60 * 1000\nexport const ONE_MINUTE_IN_MS = 60 * 1000\n","import styled from 'styled-components'\n\nimport { Box } from '@redriverpress/system'\n\n// A small badge designed to show the number of items contained in a thing\nexport const CountBadge = styled(Box).attrs({\n display: 'inline-flex',\n alignItems: 'center',\n ml: 2,\n px: 2,\n bg: 'gray150',\n color: 'gray900',\n fontSize: '0.75rem',\n fontWeight: 600,\n flexShrink: 0,\n borderRadius: '1rem',\n})``\n\n// A version of the CountBadge to be used in ActiveTabs tabs,\n// where the counter shows the number of things in that tab.\n// .active class added by React Router NavLink in AdaptiveTabs.\nexport const TabCountBadge = styled(Box).attrs({\n display: 'inline-block',\n ml: 2,\n px: 2,\n bg: 'transparent',\n color: 'gray900',\n fontSize: '0.75rem',\n fontWeight: 600,\n border: '1px solid',\n borderColor: 'gray300',\n borderRadius: '1rem',\n})`\n .active & {\n background: ${props => props.theme.colors.gray150};\n border-color: transparent;\n }\n`\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Container } from '@redriverpress/system'\n\nconst Tab = styled(NavLink).attrs(() => ({\n activeClassName: 'active',\n}))`\n align-items: center;\n background: transparent;\n border-bottom: 4px solid transparent;\n color: ${props => props.theme.colors.gray700};\n display: inline-flex;\n font-weight: 600;\n padding: ${props => props.theme.space[3]} 0;\n position: relative;\n\n &.active {\n border-bottom: 4px solid ${props => props.theme.colors.blue700};\n color: ${props => props.theme.colors.black};\n }\n`\nTab.displayName = 'Tab'\n\n// Some tabs use objects for their `to`\n// and some use React nodes for their `label`,\n// so generating a key without relying on the index gets interesting…\nexport const getTabKey = tab => {\n if (typeof tab.to === 'string') return tab.to\n if (typeof tab.label === 'string') return tab.label\n return JSON.stringify(tab.to)\n}\n\nexport const TabsPropType = PropTypes.arrayOf(\n PropTypes.shape({\n // Expects a React Router location prop, see:\n // https://reactrouter.com/web/api/NavLink\n to: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.object,\n PropTypes.string,\n ]).isRequired,\n exact: PropTypes.bool,\n // Prefer string labels where possible; if you need to pass a node,\n // ensure the wrapping component is a React Fragment in order to preserve\n // the effects of the grid layout on the grid container's immediate children.\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n // currently only showing on $sm and $md\n icon: PropTypes.string,\n })\n)\n\nexport default function Tabs({ tabs }) {\n return (\n \n \n {tabs.map(tab => (\n \n {tab.label}\n \n ))}\n \n \n )\n}\n\nTabs.propTypes = {\n tabs: TabsPropType.isRequired,\n}\n","import analyticsTrack from 'Common/utils/analytics'\n\nconst getAnalyticsData = ({ contentType, contentId, contentTitle }) => {\n return {\n eventName: 'Added content to kanban',\n contentId,\n contentTitle,\n contentType,\n }\n}\n\nexport default function trackAddcontentToClass({\n contentType,\n contentId,\n contentTitle,\n destinationColumn,\n destinationClassId,\n}) {\n const analyticsData = getAnalyticsData({\n contentType,\n contentId,\n contentTitle,\n })\n\n const { eventName } = analyticsData\n\n delete analyticsData.eventName\n\n analyticsTrack(eventName, {\n destinationColumn,\n destinationClassId,\n ...analyticsData,\n })\n}\n","import {\n Box,\n Button,\n Dialog,\n Heading,\n Icon,\n Label,\n Select,\n Text,\n useToast,\n TransparentButton,\n LoadingSpinner,\n} from '@redriverpress/system'\nimport PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport { useQuery } from 'react-query'\n\nimport {\n getTeacherClasses,\n addLessonToClass,\n getClassesContainingContent,\n} from 'Common/services/planner'\nimport CLASS_VERSION from 'Common/constants/classVersion'\n\nimport {\n CONTENT_CLASS_VERSIONS,\n CONTENT_TYPES,\n COURSE_TYPES,\n} from '../../../constants/contentTypes'\nimport trackAddContentToClass from './trackAddContentToClass'\nimport { SYLLABUS_SECTIONS } from '../../../../../teacher/planner/common/constants'\n\nconst PLANNER_SECTIONS = {\n saved: 0,\n prepping: 1,\n teaching: 2,\n taught: 3,\n}\nconst CONTENT_ID_KEY = {\n [CONTENT_TYPES.flashcardSet]: 'flashcard_set_id',\n [CONTENT_TYPES.flashcardCategory]: 'flashcard_category_id',\n [CONTENT_TYPES.video]: 'video_id',\n [CONTENT_TYPES.course]: 'course_id',\n [CONTENT_TYPES.lesson]: 'lesson_id',\n}\n\nconst ALLOWS_DEFAULT_ASSIGNMENT = {\n [CONTENT_TYPES.lesson]: true,\n [CONTENT_TYPES.video]: true,\n [CONTENT_TYPES.flashcardSet]: false,\n [CONTENT_TYPES.flashcardCategory]: false,\n [CONTENT_TYPES.course]: true,\n}\n\nconst COURSE_TYPE_WARNING = {\n [COURSE_TYPES.course]:\n 'Only the first item will be visible to students by default.',\n}\n\nconst SYLLABUS_SECTIONS_LIST = [\n SYLLABUS_SECTIONS.saved,\n SYLLABUS_SECTIONS.prepping,\n SYLLABUS_SECTIONS.teaching,\n]\n\nexport default function AddToClassDialog({\n content,\n contentType,\n courseType,\n onCancel,\n onError,\n onSave,\n onOpenChange,\n open,\n legacyURL,\n getLegacyURL,\n}) {\n const classVersion = CONTENT_CLASS_VERSIONS[contentType]\n\n const { data: fetchedClasses } = useQuery('kanban-classes', () =>\n getTeacherClasses({\n version: classVersion,\n includeDefault: ALLOWS_DEFAULT_ASSIGNMENT[contentType],\n })\n )\n\n const { addToast } = useToast()\n const [selectedClass, setSelectedClass] = useState(null)\n const [selectedSection, setSelectedSection] = useState(\n SYLLABUS_SECTIONS.prepping\n )\n const [isLoading, setIsLoading] = useState(false)\n const [duplicatedContent, setDuplicatedContent] = useState(null)\n\n const { id: contentId, title: contentTitle } = content\n\n const shouldCheckForDuplication = option =>\n option.version === CLASS_VERSION.kanban\n\n const checkForDuplicatedContent = async option => {\n const { classesIds } = await getClassesContainingContent(\n [CONTENT_ID_KEY[contentType]],\n contentId\n )\n\n return classesIds.includes(option.id)\n }\n\n const handleSelectClass = async option => {\n if (shouldCheckForDuplication(option)) {\n const isDuplicated = await checkForDuplicatedContent(option)\n if (isDuplicated) {\n return setDuplicatedContent(option)\n }\n }\n\n setDuplicatedContent(null)\n setSelectedClass(option)\n }\n\n const resetState = () => {\n setSelectedClass(null)\n setDuplicatedContent(null)\n setSelectedSection(SYLLABUS_SECTIONS.prepping)\n }\n\n const handleCancelDialog = () => {\n resetState()\n onCancel()\n onOpenChange(false)\n }\n\n const handleOpenChange = () => {\n resetState()\n onOpenChange(false)\n }\n\n const handleToast = data => {\n if (data.error) {\n return addToast({\n id: 'error-lesson-planner',\n content: 'Something went wrong. Please try again.',\n type: 'warning',\n timeout: 5000,\n })\n }\n\n return addToast({\n id: 'added-lesson-planner',\n content: 'Successfully added to class',\n type: 'success',\n timeout: 20000,\n action: (\n \n \n View Class\n \n ),\n })\n }\n\n const handleAddToClass = () => {\n setIsLoading(true)\n\n trackAddContentToClass({\n contentType,\n contentId,\n contentTitle,\n destinationColumn: selectedSection.id,\n destinationClassId: selectedClass.id,\n })\n\n const data = {\n yumi_class_id: selectedClass.id,\n teaching_state_cd: PLANNER_SECTIONS[selectedSection.id],\n [CONTENT_ID_KEY[contentType]]: contentId,\n }\n addLessonToClass({ data })\n .then(() => {\n resetState()\n setIsLoading(false)\n handleToast({ classId: selectedClass.id })\n onSave({ classId: selectedClass.id })\n onOpenChange(false)\n })\n .catch(error => {\n resetState()\n setIsLoading(false)\n handleToast({ error })\n onError()\n })\n }\n\n const onlyKanban = classVersion === CLASS_VERSION.kanban\n\n return (\n \n \n \n {\n e.preventDefault()\n resetState()\n onOpenChange(false)\n }}\n >\n \n \n Add to…\n \n \n \n {duplicatedContent ? (\n \n \n \n {contentTitle} has already been added to{' '}\n {duplicatedContent.name}. Please select\n another class.\n \n \n ) : (\n <>\n \n Please select which class you would like to add{' '}\n {contentTitle} to.\n \n {onlyKanban && (\n \n )}\n {COURSE_TYPE_WARNING[courseType] && (\n \n )}\n >\n )}\n \n {/* SELECT CLASS */}\n {fetchedClasses && (\n \n \n )}\n\n {!duplicatedContent && selectedClass && (\n <>\n {/* SELECT SYLLABUS SECTION */}\n {selectedClass?.version === CLASS_VERSION.kanban && (\n \n \n )}\n {onlyKanban ? (\n \n \n \n \n ) : (\n <>\n \n \n \n\n \n \n >\n )}\n >\n )}\n \n \n \n )\n}\n\nAddToClassDialog.defaultProps = {\n legacyURL: null,\n courseType: null,\n getLegacyURL: () => {},\n onError: () => {},\n onCancel: () => {},\n onSave: () => {},\n}\n\nAddToClassDialog.propTypes = {\n content: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n }).isRequired,\n contentType: PropTypes.oneOf([\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.video,\n ]).isRequired,\n courseType: PropTypes.oneOf(Object.keys(COURSE_TYPES)),\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n onCancel: PropTypes.func,\n onSave: PropTypes.func,\n onError: PropTypes.func,\n legacyURL: PropTypes.string,\n getLegacyURL: PropTypes.func,\n}\n","import { useState } from 'react'\n\n// Adapted from https://usehooks.com/useLocalStorage/\n\n// Note that initialValue is _not_ saved to session storage — it is an\n// optional parameter that you can pass when you need to apply some initial\n// value that will be subsequently changed. See implementation in\n// tasks/openEndedQuestions/Question.js TextArea, where the provided\n// initialValue is a value from Context; when the TextArea input is\n// changed, _that_ value is written to session storage. You can think of\n// initialValue as an optional starting point for data that will eventually\n// be written to session storage, but do not rely on it to be persistent\n// all on its own. -CP\nexport default function useSessionStorage(key, initialValue = '') {\n // Use lazy initial state by passing function to useState;\n // it is only called on the initial component render\n const [storedValue, setStoredValue] = useState(() => {\n const item = sessionStorage.getItem(key)\n return item ? JSON.parse(item) : initialValue\n })\n\n // We need to return a wrapped version of setStoredValue\n // which writes the value to store into session storage\n function setValue(value) {\n const valueToStore = value instanceof Function ? value(storedValue) : value\n setStoredValue(valueToStore)\n sessionStorage.setItem(key, JSON.stringify(valueToStore))\n }\n\n return [storedValue, setValue]\n}\n","import PropTypes from 'prop-types'\n\nimport { Radio, RadioControl } from '@redriverpress/system'\n\nimport Field from './Field'\n\nexport default function RadioField({ label, as, ...props }) {\n const component = as || (label ? Radio : RadioControl)\n return \n}\n\nRadioField.defaultProps = {\n label: null,\n as: null,\n}\n\nRadioField.propTypes = {\n label: PropTypes.string,\n as: PropTypes.func,\n}\n","import xhr from 'Common/utils/xhr'\n\nexport const getTeacherClasses = async ({\n version = null,\n includeDefault = true,\n} = {}) => {\n const res = await xhr({\n url: `/api/v3/teachers/classes${version ? `?version=${version}` : ''}`,\n method: 'GET',\n withCredentials: true,\n })\n\n if (!includeDefault) return res.data.filter(c => !c.invitationDefaultClass)\n return res.data\n}\n\nexport const getClassesContainingContent = async (queryParam, id) => {\n const res = await xhr({\n url: `/api/v3/class_contents/check_content?${queryParam}=${id}`,\n method: 'GET',\n withCredentials: true,\n })\n\n return res.data\n}\n\nexport const addLessonToClass = async ({ data, isBulk }) => {\n const res = await xhr({\n url: `/api/v3/class_contents${isBulk ? '/bulk_create' : ''}`,\n method: 'POST',\n data,\n })\n\n return res.data\n}\n\nexport const pinFolderToClass = ({ data }) => {\n return xhr({\n url: '/api/v1/class_folders',\n method: 'POST',\n data,\n })\n}\n","import { useRef } from 'react'\n\nexport function updateQuerystringParams(object) {\n if (window.URLSearchParams && window.history?.replaceState) {\n const params = new URLSearchParams(window.location.search)\n\n Object.entries(object).forEach(([key, value]) => {\n if (value == null) {\n params.delete(key)\n } else {\n params.set(key, value)\n }\n })\n\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}?${params.toString()}`\n )\n }\n}\n\n// Update the URL if browser supports it\nexport function updateQuerystringParam(key, value) {\n updateQuerystringParams({ key, value })\n}\n\nexport function getQueryStringValue(key) {\n // Bail out if browser doesn't support URLSearchParams\n if (!window.URLSearchParams) {\n return undefined\n }\n\n const params = new URLSearchParams(window.location.search)\n\n return params.get(key)\n}\n\n// Hook to update the URL when the state changes\nexport function useLocationStore(state, selector = s => s) {\n const previusStateRef = useRef(null)\n\n const { current: previusState } = previusStateRef\n const currentState = selector(state)\n\n // We always have to track current state, even when there is no previous state\n previusStateRef.current = currentState\n\n // No previous state, bail out. We don't want to update the URL with the initial state\n if (previusState === null) {\n return null\n }\n\n const updates = {}\n Object.entries(currentState).forEach(([key, value]) => {\n if (value !== previusState[key]) {\n updates[key] = value\n }\n })\n\n updateQuerystringParams(updates)\n}\n","import PropTypes from 'prop-types'\nimport { Box, Icon, Text, TransparentButton } from '@redriverpress/system'\nimport {\n CONTENT_TYPES,\n CONTENT_LABELS,\n COURSE_TYPE_LABELS,\n} from 'Common/constants/contentTypes'\n\nimport CardCoverImage from './CardCoverImage'\n\nexport default function ContentCard({\n isLink,\n level,\n onClick,\n path,\n image,\n title,\n type,\n courseType,\n ...props\n}) {\n const isCourseType = type === CONTENT_TYPES.course\n\n return (\n \n \n\n \n \n {isCourseType ? COURSE_TYPE_LABELS[courseType] : CONTENT_LABELS[type]}\n \n \n {title}\n \n {level && (\n \n \n {level}\n \n )}\n \n \n )\n}\n\nContentCard.defaultProps = {\n onClick: null,\n path: null,\n isLink: false,\n level: null,\n image: null,\n courseType: null,\n}\n\nContentCard.propTypes = {\n isLink: PropTypes.bool,\n level: PropTypes.string,\n onClick: PropTypes.func,\n path: PropTypes.string,\n image: PropTypes.string,\n title: PropTypes.string.isRequired,\n courseType: PropTypes.oneOf(Object.keys(COURSE_TYPE_LABELS)),\n type: PropTypes.oneOf([\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.video,\n ]).isRequired,\n}\n","import {\n Box,\n Button,\n Dialog,\n Heading,\n Icon,\n Loading,\n Text,\n} from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nexport default function ConfirmActionDialog({\n isOpen,\n title,\n subtitle,\n onClose,\n isPending,\n onConfirm,\n onOpenChange,\n confirmLabel,\n confirmIcon,\n cancelLabel,\n cancelIcon,\n}) {\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n {title}\n \n \n {isPending ? (\n \n \n \n ) : (\n <>\n {subtitle}\n \n \n \n \n >\n )}\n \n \n \n )\n}\n\nConfirmActionDialog.defaultProps = {\n subtitle: 'Are you sure?',\n confirmLabel: 'Yes',\n confirmIcon: 'check',\n cancelLabel: 'cancel',\n cancelIcon: 'times',\n}\n\nConfirmActionDialog.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n onClose: PropTypes.func.isRequired,\n isPending: PropTypes.bool.isRequired,\n onConfirm: PropTypes.func.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n confirmLabel: PropTypes.string,\n confirmIcon: PropTypes.string,\n cancelLabel: PropTypes.string,\n cancelIcon: PropTypes.string,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport _Modal from 'styled-react-modal'\nimport styled from 'styled-components'\nimport { layout } from 'styled-system'\n\nimport { Box, Heading, IconButton, media } from '@redriverpress/system'\n\nexport const StyledModal = _Modal.styled`\n background: ${props => props.theme.colors.white};\n border-radius: ${props => props.theme.radii.rounded};\n box-shadow: 0 3px 18px rgba(0,0,0,0.333);\n display: block;\n margin: ${props => props.theme.space[3]};\n position: relative;\n max-height: 80vh;\n overflow: scroll;\n -webkit-overflow-scrolling: touch;\n ${media.md`\n margin: ${props => props.theme.space[4]} auto;\n max-width: 60ch;\n `}\n ${layout}\n`\n\nStyledModal.displayName = 'StyledModal'\n\nconst TitleBox = styled(Box)`\n border-top-left-radius: ${props => props.theme.radii.rounded};\n border-top-right-radius: ${props => props.theme.radii.rounded};\n`\n\nexport default function Modal({ children, title, isOpen, onClose, ...props }) {\n return (\n \n {title && (\n \n \n {R.is(String, title) ? (\n \n {title}\n \n ) : (\n title\n )}\n \n \n \n \n \n )}\n {children}\n \n )\n}\n\nModal.defaultProps = {\n title: null,\n}\n\nModal.propTypes = {\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool.isRequired,\n title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n onClose: PropTypes.func.isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport { Box } from '@redriverpress/system'\nimport { StyledModal } from './Modal'\n\nexport default function FloatingActionModal({\n children,\n isOpen,\n onClose,\n actionContent,\n ...props\n}) {\n return (\n \n \n {children}\n \n theme.radii.rounded};\n border-bottom-right-radius: ${({ theme }) => theme.radii.rounded};\n `}\n >\n {actionContent}\n \n \n )\n}\n\nFloatingActionModal.propTypes = {\n actionContent: PropTypes.node.isRequired,\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n}\n","import styled, { keyframes } from 'styled-components'\n\nconst fadeIn = keyframes`\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n`\n\nconst ModalBackground = styled.div`\n animation: ${fadeIn} 0.3s ease-out;\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 6;\n`\n\nexport default ModalBackground\n","import { clb, eld, cefr, nrs } from 'Common/constants/levels'\n\nconst getLevelsByType = (type, levelData) => {\n const { cefrLevels, clbLevels, eldLevels, nrsLevels, levels } =\n levelData || {}\n\n if (type === eld && eldLevels?.length) {\n return eldLevels\n }\n\n if (type === clb && clbLevels?.length) {\n return clbLevels\n }\n\n if (type === cefr && cefrLevels?.length) {\n return cefrLevels\n }\n\n if (type === nrs && nrsLevels?.length) {\n return nrsLevels\n }\n\n return levels\n}\n\nexport default getLevelsByType\n","import { Extension } from '@tiptap/react'\n\n/**\n * FontSize - Custom Extension\n * editor.commands.setFontSize(e.target.value) :set the font-size.\n */\n\nexport const FontSizeExtension = Extension.create({\n name: 'fontSize',\n addOptions() {\n return {\n types: ['textStyle'],\n }\n },\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: element => element.style.fontSize.replace(/['\"]+/g, ''),\n renderHTML: attributes => {\n if (!attributes.fontSize) {\n return {}\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n }\n },\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n setFontSize: fontSize => ({ chain }) => {\n return chain()\n .setMark('textStyle', { fontSize: `${fontSize}` })\n .run()\n },\n unsetFontSize: () => ({ chain }) => {\n return chain()\n .setMark('textStyle', { fontSize: null })\n .removeEmptyTextStyle()\n .run()\n },\n }\n },\n})\n\nexport default FontSizeExtension\n","import styled from 'styled-components'\n\nimport { Box, Button, TransparentButton } from '@redriverpress/system'\n\nexport const RichButtonGroup = styled(Box)`\n display: flex;\n button {\n &:not(:first-child),\n &:not(:last-child) {\n border-right: none;\n border-radius: 0;\n }\n\n &:last-child {\n border: 2px solid ${props => props.theme.colors.black};\n }\n\n &:first-child {\n border-radius: 4px 0 0 4px;\n }\n &:last-child {\n border-radius: 0 4px 4px 0;\n }\n }\n`\n\nexport const RichButton = styled(Button).attrs({\n px: '0.6rem',\n py: '0.2rem',\n fontSize: '0.6rem',\n})`\n box-shadow: none;\n border: 2px solid ${props => props.theme.colors.black};\n\n &:hover {\n box-shadow: none;\n background-color: ${props => props.theme.colors.blue200};\n }\n\n &:focus {\n box-shadow: unset;\n border: 2px solid ${props => props.theme.colors.blue700};\n }\n`\n\nexport const RichDropdownButton = styled(RichButton)`\n display: flex;\n align-items: center;\n`\n\nexport const RichDropdownOptionsWrapper = styled(Box).attrs({\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 'rounded',\n p: 1,\n bg: 'white',\n mt: 1,\n boxShadow: 1,\n})``\n\nexport const RichDropdownOption = styled(TransparentButton)`\n text-align: left;\n font-size: 0.8rem;\n &:hover {\n background-color: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n }\n`\n\nexport const RichColorDropdownHover = styled(Box)`\n background-color: transparent;\n border: solid 1px ${props => props.borderColor};\n width: 20px;\n height: 20px;\n position: absolute;\n padding: 12px;\n border-radius: 50%;\n z-index: 1;\n opacity: 0;\n\n &:hover {\n opacity: 1;\n }\n`\n","import { useState } from 'react'\nimport { PropTypes } from 'prop-types'\n\nimport { Icon } from '@redriverpress/system'\n\nimport { RichButton } from './RichTextareaComponents'\nimport { richIconWidth } from './index'\n\nexport default function TextAlignment({ editor }) {\n const [currentAlignmentOption, setCurrentAlignmentOption] = useState(0)\n\n const textAlignmentOptions = [\n {\n icon: 'align-left',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .setTextAlign('left')\n .run(),\n active: editor.isActive('align-left'),\n },\n {\n icon: 'align-center',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .setTextAlign('center')\n .run(),\n active: editor.isActive('align-center'),\n },\n {\n icon: 'align-right',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .setTextAlign('right')\n .run(),\n active: editor.isActive('align-right'),\n },\n ]\n\n const MAX_INDEX = textAlignmentOptions.length - 1\n\n // This method is sequentially switching the options listed in the textAlignmentOptions.\n const switchAlignment = () => {\n const nextAlignmentOption =\n currentAlignmentOption === MAX_INDEX ? 0 : currentAlignmentOption + 1\n setCurrentAlignmentOption(nextAlignmentOption)\n textAlignmentOptions[nextAlignmentOption].clickEvent()\n }\n\n return (\n \n \n \n )\n}\n\nTextAlignment.defaultProps = {\n editor: null,\n}\n\nTextAlignment.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import PropTypes from 'prop-types'\n\nimport { Icon } from '@redriverpress/system'\n\nimport { RichButton, RichButtonGroup } from './RichTextareaComponents'\nimport { richIconWidth } from './index'\n\nexport default function MarkingGroup({ editor }) {\n const markOptions = [\n {\n icon: 'bold',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleBold()\n .run(),\n active: editor.isActive('bold'),\n },\n {\n icon: 'italic',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleItalic()\n .run(),\n active: editor.isActive('italic'),\n },\n {\n icon: 'underline',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleUnderline()\n .run(),\n active: editor.isActive('underline'),\n },\n ]\n\n return (\n \n {markOptions.map(btn => (\n btn.clickEvent()}\n secondary={!btn.active}\n small\n >\n \n \n ))}\n \n )\n}\n\nMarkingGroup.defaultProps = {\n editor: null,\n}\n\nMarkingGroup.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import PropTypes from 'prop-types'\n\nimport { Icon } from '@redriverpress/system'\n\nimport { RichButton, RichButtonGroup } from './RichTextareaComponents'\nimport { richIconWidth } from './index'\n\nexport default function ListGroup({ editor }) {\n const markOptions = [\n {\n icon: 'list',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleBulletList()\n .run(),\n active: editor.isActive('bulletList'),\n },\n {\n icon: 'list-ol',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleOrderedList()\n .run(),\n active: editor.isActive('orderedList'),\n },\n ]\n\n return (\n \n {markOptions.map(btn => (\n \n \n \n ))}\n \n )\n}\n\nListGroup.defaultProps = {\n editor: null,\n}\n\nListGroup.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { Text, mediaQueries, Icon } from '@redriverpress/system'\nimport {\n RichButton,\n RichDropdownButton,\n RichDropdownOptionsWrapper,\n RichDropdownOption,\n} from './RichTextareaComponents'\n\nexport default function FontFamilySelector({ editor }) {\n const isMd = useMedia(mediaQueries.md)\n const [dropDownIsOpen, setDropdownIsOpen] = useState(false)\n const [currentFontOption, setCurrentFontOption] = useState(0)\n const [selectedFont, setSelectedFont] = useState('Open Sans')\n\n const fontOptions = [\n {\n label: 'Comic Neue',\n clickEvent: () => {\n setSelectedFont('Comic Neue')\n editor\n .chain()\n .focus()\n .setFontFamily('Comic Neue')\n .run()\n },\n },\n {\n label: 'Noto Serif',\n clickEvent: () => {\n setSelectedFont('Noto Serif')\n editor\n .chain()\n .focus()\n .setFontFamily('Noto Serif')\n .run()\n },\n },\n {\n label: 'Open Sans',\n clickEvent: () => {\n setSelectedFont('Open Sans')\n editor\n .chain()\n .focus()\n .setFontFamily('Open Sans')\n .run()\n },\n },\n ]\n\n const MAX_INDEX = fontOptions.length - 1\n\n // This method is sequentially switching the options listed in the fontOptions.\n // That's because on mobile breakpoint, we needed to replace the dropdown\n // by a switch button, so that it solved some scrolling issues.\n const switchFont = () => {\n const nextFontOption =\n currentFontOption === MAX_INDEX ? 0 : currentFontOption + 1\n setCurrentFontOption(nextFontOption)\n fontOptions[nextFontOption].clickEvent()\n }\n\n useEffect(() => {\n editor.on('selectionUpdate', () => {\n const pointedText = editor.getAttributes('textStyle').fontFamily\n !!pointedText && setSelectedFont(pointedText)\n })\n\n return () => {\n editor.off('selectionUpdate')\n }\n }, [editor])\n\n return isMd ? (\n setDropdownIsOpen(o)}>\n \n \n \n {selectedFont}\n \n \n \n \n \n \n {fontOptions.map(fontOption => (\n {\n fontOption.clickEvent()\n }}\n key={fontOption.label}\n >\n {fontOption.label}\n \n ))}\n \n \n \n ) : (\n {\n switchFont()\n }}\n minWidth='90px'\n small\n secondary\n >\n {selectedFont}\n \n )\n}\n\nFontFamilySelector.defaultProps = {\n editor: null,\n}\n\nFontFamilySelector.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { Text, Icon, mediaQueries, theme } from '@redriverpress/system'\nimport {\n RichButton,\n RichDropdownButton,\n RichDropdownOptionsWrapper,\n RichDropdownOption,\n} from './RichTextareaComponents'\n\nconst sizesMap = {\n [theme.fontSizes[0]]: 'Default',\n [theme.fontSizes[2]]: 'Medium',\n [theme.fontSizes[4]]: 'Large',\n}\nexport default function FontSizeSelector({ editor }) {\n const isMd = useMedia(mediaQueries.md)\n const [dropDownIsOpen, setDropdownIsOpen] = useState(false)\n const [currentSizeOption, setCurrentSizeOption] = useState(0)\n const [selectedSize, setSelectedSize] = useState(sizesMap[theme.fontSizes[0]])\n\n const sizeOptions = [\n {\n label: 'Default',\n clickEvent: () => {\n setSelectedSize('Default')\n editor\n .chain()\n .focus()\n .setFontSize(theme.fontSizes[0])\n .run()\n },\n },\n {\n label: 'Medium',\n clickEvent: () => {\n setSelectedSize('Medium')\n editor\n .chain()\n .focus()\n .setFontSize(theme.fontSizes[2])\n .run()\n },\n },\n {\n label: 'Large',\n clickEvent: () => {\n setSelectedSize('Large')\n editor\n .chain()\n .focus()\n .setFontSize(theme.fontSizes[4])\n .run()\n },\n },\n ]\n\n const MAX_INDEX = sizeOptions.length - 1\n\n // This method is sequentially switching the options listed in the sizeOptions.\n // That's because on mobile breakpoint, we needed to replace the dropdown\n // by a switch button, so that it solved some scrolling issues.\n const switchSize = () => {\n const nextSizeOption =\n currentSizeOption === MAX_INDEX ? 0 : currentSizeOption + 1\n setCurrentSizeOption(nextSizeOption)\n sizeOptions[nextSizeOption].clickEvent()\n }\n\n useEffect(() => {\n editor.on('selectionUpdate', () => {\n const pointedText = editor.getAttributes('textStyle').fontSize\n !!pointedText && setSelectedSize(sizesMap[pointedText])\n })\n\n return () => {\n editor.off('selectionUpdate')\n }\n }, [editor])\n\n return isMd ? (\n setDropdownIsOpen(o)}>\n \n \n \n {selectedSize}\n \n \n \n \n \n \n {sizeOptions.map(sizeOption => (\n \n {sizeOption.label}\n \n ))}\n \n \n \n ) : (\n \n {selectedSize}\n \n )\n}\n\nFontSizeSelector.defaultProps = {\n editor: null,\n}\n\nFontSizeSelector.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport {\n Box,\n mediaQueries,\n TransparentButton,\n theme,\n} from '@redriverpress/system'\nimport {\n RichButton,\n RichDropdownButton,\n RichDropdownOptionsWrapper,\n RichColorDropdownHover,\n} from './RichTextareaComponents'\n\nexport default function ColorSelector({ editor }) {\n const isMd = useMedia(mediaQueries.md)\n const [currentColorOption, setCurrentColorOption] = useState(0)\n const [selectedColor, setSelectedColor] = useState(theme.colors.black)\n\n const colorOptions = [\n {\n label: theme.colors.black,\n clickEvent: () => {\n setSelectedColor(theme.colors.black)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.black)\n .run()\n },\n },\n {\n label: theme.colors.green900,\n clickEvent: () => {\n setSelectedColor(theme.colors.green900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.green900)\n .run()\n },\n },\n {\n label: theme.colors.red900,\n clickEvent: () => {\n setSelectedColor(theme.colors.red900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.red900)\n .run()\n },\n },\n {\n label: theme.colors.yellow900,\n clickEvent: () => {\n setSelectedColor(theme.colors.yellow900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.yellow900)\n .run()\n },\n },\n {\n label: theme.colors.blue900,\n clickEvent: () => {\n setSelectedColor(theme.colors.blue900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.blue900)\n .run()\n },\n },\n ]\n\n const MAX_INDEX = colorOptions.length - 1\n\n // This method is sequentially switching the options listed in the colorOptions.\n // That's because on mobile breakpoint, we needed to replace the dropdown\n // by a switch button, so that it solved some scrolling issues.\n const switchColor = () => {\n const nextColorOption =\n currentColorOption === MAX_INDEX ? 0 : currentColorOption + 1\n setCurrentColorOption(nextColorOption)\n colorOptions[nextColorOption].clickEvent()\n }\n\n useEffect(() => {\n editor.on('selectionUpdate', () => {\n const activeColor = editor.getAttributes('textStyle').color\n !!activeColor && setSelectedColor(activeColor)\n })\n\n return () => {\n editor.off('selectionUpdate')\n }\n }, [editor])\n\n return isMd ? (\n \n \n \n \n \n \n \n \n {colorOptions.map(colorOption => (\n \n \n \n \n ))}\n \n \n \n ) : (\n \n \n \n )\n}\n\nColorSelector.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ).isRequired,\n}\n","import WebFont from 'webfontloader'\nimport { useEffect } from 'react'\nimport PropTypes from 'prop-types'\n\nimport styled from 'styled-components'\nimport { border, layout } from 'styled-system'\nimport { useMedia } from 'use-media'\n\nimport {\n Box,\n InputWrapper,\n inputIconWidth,\n inputStyles,\n media,\n mediaQueries,\n shouldForwardProp,\n} from '@redriverpress/system'\n\nimport Bold from '@tiptap/extension-bold'\nimport BulletList from '@tiptap/extension-bullet-list'\nimport CharacterCount from '@tiptap/extension-character-count'\nimport Document from '@tiptap/extension-document'\nimport FontFamily from '@tiptap/extension-font-family'\nimport HardBreak from '@tiptap/extension-hard-break'\nimport History from '@tiptap/extension-history'\nimport Italic from '@tiptap/extension-italic'\nimport ListItem from '@tiptap/extension-list-item'\nimport OrderedList from '@tiptap/extension-ordered-list'\nimport Paragraph from '@tiptap/extension-paragraph'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport Text from '@tiptap/extension-text'\nimport TextAlign from '@tiptap/extension-text-align'\nimport TextStyle from '@tiptap/extension-text-style'\nimport Underline from '@tiptap/extension-underline'\nimport { Color } from '@tiptap/extension-color'\nimport { EditorContent, useEditor } from '@tiptap/react'\n\nimport { FontSizeExtension } from './FontSizeCustomExtension'\n\nimport TextAlignment from './TextAlignmentButton'\nimport TextMarkingGroup from './MarkingGroup'\nimport ListItemsGroup from './ListGroup'\nimport FontFamilySelector from './FontFamilySelector'\nimport FontSizeOptions from './FontSizeSelector'\nimport ColorSelectorOptions from './ColorSelector'\n\nexport const richIconWidth = '0.8rem'\n\n// Initial editor style\n// According to tiptap documentation, all the editor component\n// styles can be modified using the ProseMirror class.\nconst StyledEditor = styled(EditorContent)\n .withConfig({ shouldForwardProp })\n .attrs(props => ({\n borderTop: props.label\n ? '1.5rem solid transparent'\n : '0.5rem solid transparent',\n py: 3,\n }))`\n .ProseMirror {\n ${inputStyles}\n ${border}\n ${layout}\n\n font-size: ${props => props.theme.fontSizes[0]};\n > * + * {\n margin-top: 0.5em;\n }\n\n white-space: pre-wrap;\n line-height: ${props => props.theme.lineHeights.body};\n min-height: ${props => props.minHeight || props.theme.space[5]};\n padding-top: 0 !important;\n resize: vertical;\n background: ${props =>\n props.readOnly ? 'transparent' : props.theme.colors.white};\n\n outline: none;\n box-shadow: ${props => props.readOnly && 'none'};\n &:focus {\n box-shadow: ${props => props.readOnly && 'none'};\n }\n\n ul,\n ol {\n padding: 0 1rem;\n list-style-position: unset;\n }\n\n // Placeholder configuration\n p.is-editor-empty:first-child::after {\n color: ${props => props.theme.colors.gray300};\n content: '${props => props.placeholder}';\n float: left;\n height: 0;\n margin-top: -22px;\n white-space: pre-wrap;\n pointer-events: none;\n\n ${media.xl`\n margin-top: -25px;\n `}\n }\n`\n\nconst StyledMenuBar = styled(Box).attrs({\n mb: 2,\n display: 'flex',\n})`\n overflow-x: auto;\n -ms-overflow-style: none; /* Edge */\n scrollbar-height: none; /* Firefox */\n\n ::-webkit-scrollbar {\n display: none; /* Chrome, Safari, and Opera */\n }\n`\n\nconst MobileScrollOverlay = styled(Box).attrs({\n width: '45px',\n height: '40px',\n position: 'absolute',\n})`\n background: linear-gradient(\n ${props => props.degree}deg,\n rgba(255, 255, 255, 0) 0%,\n rgba(249, 249, 249, 1) 30%,\n rgba(249, 249, 249, 1) 100%\n );\n`\n\nconst RichMenuBar = ({ editor }) => {\n const isMd = useMedia(mediaQueries.md)\n\n return (\n \n {!isMd && }\n \n \n \n \n \n \n \n \n {!isMd && }\n \n )\n}\n\nRichMenuBar.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ).isRequired,\n}\n\nexport default function RichTextarea({\n disabled,\n error,\n icon,\n label,\n rows,\n wrapperProps,\n onChange,\n savedContent,\n placeholder,\n maxLength,\n readOnly,\n ...props\n}) {\n const editor = useEditor({\n extensions: [\n Bold,\n BulletList,\n CharacterCount.configure({\n limit: maxLength,\n }),\n Color,\n Document,\n FontFamily,\n FontSizeExtension,\n HardBreak,\n History,\n Italic,\n ListItem,\n OrderedList,\n Paragraph,\n Text,\n Placeholder,\n TextAlign.configure({\n types: ['paragraph'],\n }),\n TextStyle,\n Underline,\n ],\n injectCSS: false,\n })\n\n useEffect(() => {\n WebFont.load({\n google: {\n families: [\n 'Comic Neue:400,400italic,700,700italic',\n 'Noto Serif:400,400italic,700,700italic',\n 'Open Sans:400,400italic,700,700italic',\n ],\n },\n })\n }, [])\n\n useEffect(() => {\n if (editor) {\n editor.on('update', () => {\n let value = editor.getHTML()\n if (editor.isEmpty) value = null\n onChange(value)\n })\n }\n\n return () => {\n editor && editor.off('update')\n }\n }, [editor])\n\n useEffect(() => {\n if (editor && !editor?.isFocused && !!savedContent) {\n editor.commands.setContent(savedContent)\n }\n\n if (editor && readOnly) {\n editor.setEditable(false)\n editor.commands.setContent(savedContent)\n }\n }, [savedContent, editor])\n\n return editor && readOnly ? (\n \n ) : (\n editor && (\n <>\n \n \n \n \n >\n )\n )\n}\n\nRichTextarea.defaultProps = {\n maxLength: null,\n readOnly: false,\n onChange: () => {},\n}\n\nRichTextarea.propTypes = {\n disabled: PropTypes.bool.isRequired,\n error: PropTypes.string.isRequired,\n icon: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n rows: PropTypes.number.isRequired,\n onChange: PropTypes.func,\n savedContent: PropTypes.string.isRequired,\n placeholder: PropTypes.string.isRequired,\n maxLength: PropTypes.number,\n readOnly: PropTypes.bool,\n}\n","const getInitialState = () =>\n JSON.parse(document.getElementById('initialState').innerHTML)\n\nexport default getInitialState\n","import Div100vh from 'react-div-100vh'\nimport styled from 'styled-components'\n\n// ApplicationGrid sets the vertical layout for:\n// - title bar\n// - TaskWrapper\nconst ApplicationGrid = styled(Div100vh)`\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n height: 100rvh; /* rvh unit is specific to Div100vh component */\n width: 100vw;\n overflow: hidden;\n`\n\nApplicationGrid.displayName = 'ApplicationGrid'\n\nexport default ApplicationGrid\n","import PropTypes from 'prop-types'\nimport { useState, useEffect } from 'react'\nimport { Box, Icon, TransparentButton } from '@redriverpress/system'\nimport DOMPurify from 'dompurify'\nimport parse, { attributesToProps } from 'html-react-parser'\nimport LightboxImage from 'Common/components/LightboxImage'\nimport styled from 'styled-components'\n\nconst sanitizeOptions = {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['frameborder', 'allowfullscreen', 'allow'],\n}\n\nconst Overlay = styled(Box)`\n background: rgba(0, 0, 0, 0.5);\n position: fixed;\n inset: 0;\n z-index: ${props => props.zIndex};\n`\n\nconst parseOptions = {\n replace: domNode => {\n if (domNode.name === 'img') {\n const { src, alt } = attributesToProps(domNode.attribs)\n return \n }\n },\n}\n\nexport default function TutorialVideo({\n open,\n onOpenChange,\n videoId,\n ...props\n}) {\n const [propVideoId, setPropVideoId] = useState(null)\n\n const content = ``\n const sanitizedContent = DOMPurify.sanitize(content, sanitizeOptions)\n\n useEffect(() => {\n open ? setPropVideoId(videoId) : setPropVideoId(null)\n }, [open])\n\n return (\n <>\n \n onOpenChange(false)}\n bg='white'\n borderRadius='circular'\n size={3}\n display='flex'\n justifyContent='center'\n alignItems='center'\n position='fixed'\n right={10}\n top={10}\n zIndex={1}\n >\n \n \n {propVideoId && parse(sanitizedContent, parseOptions)}\n \n onOpenChange(false)}\n />\n >\n )\n}\n\nTutorialVideo.propTypes = {\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n videoId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n}\n","import CLASS_VERSION from 'Common/constants/classVersion'\n\n// Be aware that theses names match the BE way of creating the content types (content.class.name)\nexport const CONTENT_TYPES = {\n course: 'Course',\n flashcardCategory: 'FlashcardCategory',\n flashcardSet: 'FlashcardSet',\n lesson: 'Lesson',\n post: 'Post',\n video: 'Video',\n}\n\n// Resource types that are only available for kanban classes\nexport const CONTENT_CLASS_VERSIONS = {\n [CONTENT_TYPES.video]: CLASS_VERSION.kanban,\n [CONTENT_TYPES.course]: CLASS_VERSION.kanban,\n}\n\nexport const CONTENT_LABELS = {\n [CONTENT_TYPES.flashcardCategory]: 'Flashcard Category',\n [CONTENT_TYPES.flashcardSet]: 'Flashcard Set',\n [CONTENT_TYPES.lesson]: 'Lesson',\n [CONTENT_TYPES.course]: 'Study Pack',\n [CONTENT_TYPES.video]: 'Video',\n [CONTENT_TYPES.post]: 'Blog',\n}\n\nexport const CONTENT_COUNT_COPY = {\n [CONTENT_TYPES.course]: {\n singular: 'Lesson',\n plural: 'Lessons',\n },\n [CONTENT_TYPES.flashcardCategory]: {\n singular: 'Flashcard',\n plural: 'Flashcards',\n },\n [CONTENT_TYPES.flashcardSet]: {\n singular: 'Flashcard',\n plural: 'Flashcards',\n },\n}\n\nexport const COURSE_TYPES = {\n pack: 'pack',\n course: 'course',\n}\n\nexport const COURSE_TYPE_LABELS = {\n [COURSE_TYPES.course]: 'Course',\n [COURSE_TYPES.pack]: 'Study Pack',\n}\n\nexport const COURSE_TYPE_ICONS = {\n [COURSE_TYPES.pack]: 'backpack',\n [COURSE_TYPES.course]: 'graduation-cap',\n}\n\nexport const CONTENT_TYPES_URL = {\n [CONTENT_TYPES.lesson]: `/routes/lesson/`,\n [CONTENT_TYPES.video]: `/routes/video/`,\n [CONTENT_TYPES.flashcardCategory]: `/routes/flashcard_category/`,\n [CONTENT_TYPES.flashcardSet]: `/flashcard_player/?flashcard_set= `,\n}\n","import styled from 'styled-components'\n\nconst BaseToggleButton = styled.button`\n appearance: none;\n background-color: ${props =>\n props.theme.colors[props.disabled ? 'blue700' : 'white']};\n border: 1px solid ${props => props.theme.colors.blue700};\n color: ${props => props.theme.colors[props.disabled ? 'white' : 'blue700']};\n cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};\n opacity: 1 !important; // Override Bootstrap styles inherited from the layout >__>\n padding: ${props => props.theme.space[3]};\n transition: 0.15s background-color linear;\n\n &:not([disabled]):hover {\n background-color: ${props => props.theme.colors.blue100};\n }\n\n &:focus {\n outline: none;\n box-shadow: 0 0 0 1px ${props => props.theme.colors.white},\n 0 0 0 3px ${props => props.theme.colors.blue700};\n }\n`\n\nexport default BaseToggleButton\n","import styled from 'styled-components'\n\nimport BaseToggleButton from './BaseToggleButton'\n\nconst ListButton = styled(BaseToggleButton).attrs({\n 'aria-label': 'Switch to list view',\n title: 'List view',\n})`\n border-top-left-radius: ${props => props.theme.radii.rounded};\n border-bottom-left-radius: ${props => props.theme.radii.rounded};\n`\n\nexport default ListButton\n","import styled from 'styled-components'\n\nimport BaseToggleButton from './BaseToggleButton'\n\nconst CompactButton = styled(BaseToggleButton).attrs({\n 'aria-label': 'Switch to compact view',\n title: 'Compact view',\n})`\n border-top-right-radius: ${props => props.theme.radii.rounded};\n border-bottom-right-radius: ${props => props.theme.radii.rounded};\n`\nexport default CompactButton\n","import '@fortawesome/fontawesome-pro/js/light'\nimport '@fortawesome/fontawesome-pro/js/regular'\nimport '@fortawesome/fontawesome-pro/js/solid'\nimport '@fortawesome/fontawesome-pro/js/brands'\nimport '@fortawesome/fontawesome-pro/js/fontawesome'\n\nimport PropTypes from 'prop-types'\nimport { GlobalStyle, theme } from '@redriverpress/system'\nimport { ThemeProvider } from 'styled-components'\n\nexport default function ElliiThemeProvider({ children }) {\n return (\n \n \n {children}\n \n )\n}\n\nElliiThemeProvider.propTypes = {\n children: PropTypes.node.isRequired,\n}\n","const ORIGIN = { collections: 'collections' }\nexport default ORIGIN\n","/* eslint-disable import/prefer-default-export */\n\nexport function mapKeys(obj, fn) {\n if (obj == null) {\n return obj\n }\n\n return Object.keys(obj).reduce((acc, key) => {\n const newKey = fn(key)\n\n acc[newKey] = obj[key]\n\n return acc\n }, {})\n}\n","import { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { Popover, ArrowContainer } from 'react-tiny-popover'\n\nimport { Box, Icon, theme } from '@redriverpress/system'\n\nconst StyledHint = styled(Icon).attrs(() => ({\n color: 'black',\n p: 1,\n}))`\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n cursor: pointer;\n`\n\nfunction Hint({ text }) {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n setIsOpen(false)}\n positions={['top', 'bottom']}\n align='end'\n containerStyle={{ overflow: 'visible', zIndex: 3 }}\n padding={2}\n content={({ position, popoverRect, childRect }) => (\n \n \n {text}\n \n \n )}\n >\n setIsOpen(true)}\n onMouseLeave={() => setIsOpen(false)}\n onTouchStart={() => setIsOpen(true)}\n onTouchEnd={() => setIsOpen(false)}\n onTouchCancel={() => setIsOpen(false)}\n />\n \n )\n}\n\nHint.propTypes = {\n text: PropTypes.string.isRequired,\n}\n\nexport default Hint\n","/* eslint-disable react/prop-types */\nimport { useField } from 'formik'\nimport styled from 'styled-components'\n\nimport { Box, Input } from '@redriverpress/system'\n\nimport Hint from './Hint'\n\n/** Sign-up 'email has been already used' remote error includes a link to sign-in. Apply some styles to it */\nconst StyledError = styled(Box)`\n display: inherit;\n\n a {\n color: ${({ theme }) => theme.colors.black};\n\n &:hover,\n &:focus {\n color: ${props => props.theme.colors.blue500};\n }\n }\n }\n`\n\nfunction SanitizedText({ sanitize, children, ...props }) {\n if (sanitize) {\n return {children}\n }\n\n return (\n \n )\n}\n\nexport default function Field(props) {\n const [field, meta] = useField(props)\n\n const { touched, error } = meta\n const { hint, hideError, ...rest } = props\n const { mb, mr, width, as, display, sanitizeError, ...fieldProps } = rest\n\n const Component = as || Input\n\n let errorMessage = false\n if (touched && error && !hideError) {\n errorMessage = (\n {error}\n )\n }\n\n return (\n \n }\n {...field}\n {...fieldProps}\n />\n \n )\n}\n\nField.defaultProps = {\n width: 1,\n mb: 3,\n mr: null,\n sanitizeError: true,\n hideError: false,\n display: 'inline-block',\n}\n","import DOMPurify from 'dompurify'\nimport MarkdownIt from 'markdown-it'\n\nconst mdWithHtml = new MarkdownIt({ html: true }) // MarkdownIt disables HTML by default\n\nexport function renderMarkdown(content) {\n return DOMPurify.sanitize(mdWithHtml.render(content))\n}\n\nexport function renderInlineMarkdown(content) {\n return DOMPurify.sanitize(mdWithHtml.renderInline(content))\n}\n","const getNavbarDimensions = () => {\n const header = document.querySelector('[data-esll-navbar]')\n\n return header?.getBoundingClientRect() || { height: 0, width: 0 }\n}\n\nexport default function scrollToElement(\n element,\n { behavior = 'smooth', paddingTop = 20 } = {}\n) {\n if (!element) {\n return\n }\n\n const headerHeight = getNavbarDimensions().height\n const newY = element.offsetTop - headerHeight - paddingTop\n\n try {\n window.scroll({\n left: 0,\n top: newY,\n behavior,\n })\n } catch {\n // just a fallback for older browsers\n window.scroll(0, newY)\n }\n}\n","import Div100vh from 'react-div-100vh'\nimport { LoadingPlane } from '@redriverpress/system'\n\nexport default function Loading() {\n return (\n \n \n \n )\n}\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport styled from 'styled-components'\nimport { Popover, ArrowContainer } from 'react-tiny-popover'\n\nimport { Box, Icon, theme } from '@redriverpress/system'\n\n/* This component should likely be made into a common component for popovers,\n * with the ability to pass in both a button and popover content. I'll do that\n * when I have time, which will be after TESOL 2020 (maybe ha ha). If you need\n * a popover/tooltip component, please talk to me before duplicating this one.\n * Thanks!\n * -Cole\n */\n\nconst Button = styled.button`\n appearance: none;\n background: transparent;\n border: none;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n line-height: 1;\n height: 2.5rem;\n width: 2.5rem;\n\n &:hover,\n &:focus {\n outline: none;\n\n & ${Box} {\n background: ${props => props.theme.colors.yellow400};\n }\n }\n`\nButton.displayName = 'TooltipButton'\n\nfunction ContentBody({ content }) {\n return (\n \n {content}\n \n )\n}\n\nContentBody.propTypes = {\n content: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,\n}\n\nfunction ClickableTootip({ content, icon }) {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n setIsOpen(false)}\n positions={['bottom', 'top']}\n align='end'\n containerStyle={{ overflow: 'visible', zIndex: 3 }}\n padding={0}\n content={({ position, popoverRect, childRect }) => (\n \n \n \n )}\n >\n \n \n )\n}\n\nClickableTootip.propTypes = {\n content: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,\n icon: PropTypes.string.isRequired,\n}\n\nexport default ClickableTootip\n","// This hook runs a listener that verifies the screen size and returns 2 values:\n// maxBreakpoint => returns true if it's AT OR BELOW the variable passed in\n// exactBreakpoint => returns true if it's AT the exact variable passed in\n// The `query` variable passed in should be the value that represents\n// the exact breakpoint min size. It's retrieved from the `rawBreakpoints` object.\n\nimport { useEffect, useState } from 'react'\nimport { rawBreakpoints } from '@redriverpress/system'\n\nimport useDebounce from 'Common/hooks/useDebounce'\n\nconst defaultPixel = 16\nconst { sm, md, lg, xl } = rawBreakpoints\n\nexport default function useIncludedMediaQuery(query = null) {\n const [mediaQuery, setMediaQuery] = useState(null)\n\n const debounceGetBreakpoint = useDebounce(\n () => {\n const windowSize = window?.innerWidth / defaultPixel || null\n if (windowSize < sm) {\n setMediaQuery(sm)\n return\n }\n if (windowSize < md) {\n setMediaQuery(sm)\n return\n }\n if (windowSize < lg) {\n setMediaQuery(md)\n return\n }\n if (windowSize < xl) {\n setMediaQuery(lg)\n return\n }\n if (windowSize >= xl) {\n setMediaQuery(xl)\n }\n },\n 300,\n true\n )\n\n useEffect(() => {\n if (window) {\n window.addEventListener('resize', debounceGetBreakpoint)\n debounceGetBreakpoint()\n\n return () => window.removeEventListener('resize', debounceGetBreakpoint)\n }\n }, [window])\n\n const maxBreakpoint = query ? mediaQuery <= query : mediaQuery\n const exactBreakpoint = query ? mediaQuery === query : mediaQuery\n\n return { maxBreakpoint, exactBreakpoint }\n}\n","import { createGlobalStyle } from 'styled-components'\n\nimport { media } from '@redriverpress/system'\n\n/* eslint-disable max-len */\nconst ReactDateTimeStyle = createGlobalStyle`\n .rdt {\n position: relative;\n }\n\n /* Calendar */\n .rdtPicker {\n left: 5%;\n top: 0;\n width: 90%;\n display: none;\n position: fixed;\n padding: ${props => props.theme.space[3]} ${props => props.theme.space[2]};\n margin-top: 1px;\n z-index: 99999 !important;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n border: 2px solid ${props => props.theme.colors.blue500};\n border-radius: ${props => props.theme.radii.rounded};\n }\n ${media.md`\n .rdtPicker {\n position: absolute;\n left: auto;\n top: auto;\n width: auto;\n }\n `}\n .rdtOpen .rdtPicker {\n display: block !important;\n }\n .rdtStatic .rdtPicker {\n box-shadow: none;\n position: static;\n }\n\n .rdtPicker .rdtTimeToggle {\n text-align: center;\n font-size: 0;\n }\n\n .rdtPicker .rdtTimeToggle:before {\n font-family: \"Font Awesome 5 Pro\";\n content: \"\\f017\";\n font-size: ${props => props.theme.fontSizes[1]};\n }\n .rdtPicker .rdtTimeToggle:after {\n content: \" Pick Time\";\n font-size: ${props => props.theme.fontSizes[1]};\n }\n\n .rdtPicker table {\n width: 100%;\n margin: 0;\n }\n .rdtPicker td,\n .rdtPicker th {\n text-align: center;\n padding: ${props => props.theme.space[1]} ${props => props.theme.space[2]};\n border-radius: ${props => props.theme.radii.rounded};\n line-height: 28px;\n }\n .rdtPicker td {\n cursor: pointer;\n }\n .rdtPicker td.rdtDay:hover,\n .rdtPicker td.rdtHour:hover,\n .rdtPicker td.rdtMinute:hover,\n .rdtPicker td.rdtSecond:hover,\n .rdtPicker .rdtTimeToggle:hover {\n background: ${props => props.theme.colors.blue100};\n cursor: pointer;\n }\n .rdtPicker td.rdtOld,\n .rdtPicker td.rdtNew {\n color: #999999;\n }\n\n /* Showing a different style on Today */\n .rdtPicker td.rdtToday {\n position: relative;\n }\n .rdtPicker td.rdtToday:before {\n content: '';\n display: inline-block;\n border-left: 7px solid transparent;\n border-bottom: 7px solid #428bca;\n border-top-color: rgba(0, 0, 0, 0.2);\n position: absolute;\n bottom: 4px;\n right: 4px;\n }\n\n /* Selected Date */\n .rdtPicker td.rdtActive,\n .rdtPicker td.rdtActive:hover {\n background-color: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n text-shadow: none !important;\n font-weight: 700;\n border-radius: ${props => props.theme.radii.rounded};\n }\n .rdtPicker td.rdtActive.rdtToday:before {\n border-bottom-color: #fff;\n }\n .rdtPicker td.rdtDisabled,\n .rdtPicker td.rdtDisabled:hover {\n background: none;\n color: #999999;\n cursor: not-allowed;\n }\n\n .rdtPicker td span.rdtOld {\n color: #999999;\n }\n .rdtPicker td span.rdtDisabled,\n .rdtPicker td span.rdtDisabled:hover {\n background: none;\n color: #999999;\n cursor: not-allowed;\n }\n .rdtPicker th {\n border-bottom: 1px solid #f9f9f9;\n border-radius: ${props => props.theme.radii.rounded};\n }\n\n /* Header for the day of the week */\n .rdtPicker .dow {\n width: 14.2857%;\n border-bottom: none;\n cursor: default;\n font-size: 12px;\n }\n /* Header showing the Month */\n .rdtPicker th.rdtSwitch {\n width: 100px;\n font-size: ${props => props.theme.fontSizes[3]};\n font-weight: 300;\n padding: ${props => props.theme.space[2]};\n }\n .rdtPicker th.rdtNext,\n .rdtPicker th.rdtPrev {\n font-size: 21px;\n vertical-align: middle;\n }\n\n .rdtPrev span,\n .rdtNext span {\n display: block;\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Chrome/Safari/Opera */\n -khtml-user-select: none; /* Konqueror */\n -moz-user-select: none; /* Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none;\n }\n\n /* Disabled Days */\n .rdtPicker th.rdtDisabled,\n .rdtPicker th.rdtDisabled:hover {\n background: none;\n color: #999999;\n cursor: not-allowed;\n }\n .rdtPicker thead tr:first-child th {\n cursor: pointer;\n }\n .rdtPicker thead tr:first-child th:hover {\n background: ${props => props.theme.colors.blue100};\n }\n\n .rdtPicker tfoot {\n border-top: 1px solid #f9f9f9;\n }\n\n .rdtPicker button {\n border: none;\n background: none;\n cursor: pointer;\n }\n .rdtPicker button:hover {\n background-color: ${props => props.theme.colors.blue100};\n }\n\n .rdtPicker thead button {\n width: 100%;\n height: 100%;\n }\n\n /* Month or Year pickers */\n td.rdtMonth,\n td.rdtYear {\n padding: ${props => props.theme.space[3]};\n font-size: ${props => props.theme.fontSizes[0]};\n cursor: pointer;\n }\n td.rdtMonth:hover,\n td.rdtYear:hover {\n background: ${props => props.theme.colors.blue100};\n }\n\n /* From here, all the 'counters' are for picking the time */\n .rdtCounters {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .rdtCounterSeparator {\n padding: ${props => props.theme.space[3]};\n }\n\n .rdtCounter .rdtBtn {\n padding: ${props => props.theme.space[3]};\n cursor: pointer;\n display: block;\n\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Chrome/Safari/Opera */\n -khtml-user-select: none; /* Konqueror */\n -moz-user-select: none; /* Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none;\n }\n .rdtCounter .rdtBtn:hover {\n background: ${props => props.theme.colors.blue100};\n }\n .rdtCounter .rdtCount {\n font-size: ${props => props.theme.fontSizes[4]};\n padding: ${props => props.theme.space[3]};\n font-weight: 300;\n }\n\n ${media.md`\n .rdtCounter .rdtCount {\n font-size: ${props => props.theme.fontSizes[5]};\n padding: ${props => props.theme.space[4]};\n }\n `}\n\n .rdtMilli {\n vertical-align: middle;\n padding-left: 8px;\n width: 48px;\n }\n\n .rdtMilli input {\n width: 100%;\n font-size: 1.2em;\n margin-top: 37px;\n }\n\n .rdtTime td {\n cursor: default;\n }\n\n /* The mode switch at the top of the time picker */\n .rdtTime .rdtSwitch {\n cursor: pointer;\n\n &:hover {\n background: ${props => props.theme.colors.blue100};\n }\n }\n\n`\n/* eslint-enable */\n\nexport default ReactDateTimeStyle\n","import { useEffect, useRef } from 'react'\n\nimport {\n generalTimeFormat,\n getCurrentTime,\n setInitialTime,\n} from 'Common/utils/datetime'\n\nexport default function useElapsingTime({\n timeLimit = null,\n timeLimitUnit = 'minute',\n handleTimeOver,\n updateTimeCallback,\n shouldStartTimer = null,\n} = {}) {\n const elapsedTime = useRef(null)\n const initialTime = useRef(setInitialTime({ minute: 0, second: 0 }))\n\n const stopTimer = () => {\n clearInterval(elapsedTime.current)\n }\n\n const startTimer = () => {\n let time = initialTime.current\n\n elapsedTime.current = window.setInterval(() => {\n time = time.add(1, 'seconds')\n\n if (\n timeLimit &&\n timeLimit === getCurrentTime({ dateTime: time, unit: timeLimitUnit })\n ) {\n stopTimer()\n handleTimeOver()\n }\n\n updateTimeCallback(generalTimeFormat(time, 'mm:ss'))\n }, 1000)\n }\n\n // this is an alternative approach to the auxiliary methods\n // startTimer and stopTimer, in case you need to pass in a flag\n // instead of calling the methods.\n useEffect(() => {\n shouldStartTimer ? startTimer() : stopTimer()\n }, [shouldStartTimer])\n\n return {\n startTimer,\n stopTimer,\n }\n}\n","// Adapted from https://github.com/0x006F/react-media-recorder\n\n// This hook supports media capture from browser, using the\n// MediaRecorder API (https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder)\n// This hook is ready to handle both audio and video\n// On Safari, this should work in versions earlier than 14.0.2 thanks to the audio-recorder-polyfill\n// Chrome/iOS doesn't support this feature\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport R from 'ramda'\nimport PolyfillAudioRecorder from 'audio-recorder-polyfill'\nimport mpegEncoder from 'audio-recorder-polyfill/mpeg-encoder'\n\nimport { recorderError, recorderStatus } from 'Common/constants/mediaRecorder'\n\nexport default function useMediaRecorder({\n audio = true,\n onStop = () => null,\n video = false,\n} = {}) {\n const mediaObject = useRef([])\n const mediaRecorder = useRef(null)\n const mediaStream = useRef(null)\n\n const [status, setStatus] = useState('idle')\n const [error, setError] = useState(null)\n const [shouldUsePolyfill, setShouldUsePolyfill] = useState(false)\n const [isAudioMuted, setIsAudioMuted] = useState(false)\n const [mediaBlobUrl, setMediaBlobUrl] = useState(null)\n const [base64Media, setBase64Media] = useState(null)\n\n // mediaTypes is used as options passed in to\n // the new mediaRecorder object and the new Blob object,\n // when the media is being captured\n\n const mediaTypes = {\n video: 'video/mp4',\n audio: 'audio/mpeg',\n }\n\n const mediaOptions = {\n mimeType: video ? mediaTypes.video : mediaTypes.audio,\n }\n\n const getMediaStream = useCallback(async () => {\n setStatus(recorderStatus.IDLE)\n const mediaConstraints = {\n audio: typeof audio === 'boolean' ? !!audio : audio,\n video: typeof video === 'boolean' ? !!video : video,\n }\n\n try {\n const stream = await window.navigator.mediaDevices.getUserMedia(\n mediaConstraints\n )\n\n mediaStream.current = stream\n setStatus(recorderStatus.IDLE)\n } catch (e) {\n e.name === 'NotAllowedError'\n ? setError(recorderError.NOT_ALLOWED)\n : setError(e.name)\n setStatus(recorderStatus.BLOCKED)\n }\n }, [audio, video])\n\n // This sets the polyfill to be used in all browsers. At first, it was being used only\n // for Safari. Howver we noticed incompatibility between audio file recorded by different\n // browsers during audio execution. The polyfill comes in handy since it has an audio\n // encoder, which allows us to unify the audio format for all browsers.\n useEffect(() => {\n PolyfillAudioRecorder.encoder = mpegEncoder\n window.MediaRecorder = PolyfillAudioRecorder\n setShouldUsePolyfill(true)\n }, [])\n\n useEffect(() => {\n const checkConstraints = mediaType => {\n const supportedMediaConstraints = navigator.mediaDevices.getSupportedConstraints()\n const unSupportedConstraints = Object.keys(mediaType).filter(\n constraint => !supportedMediaConstraints[constraint]\n )\n\n if (unSupportedConstraints.length > 0) {\n throw new Error(\n `Constraints not supported: '${unSupportedConstraints.join(\n ','\n )}'. Please check them out.`\n )\n }\n }\n\n if (typeof audio === 'object') {\n checkConstraints(audio)\n }\n if (typeof video === 'object') {\n checkConstraints(video)\n }\n }, [audio, video])\n\n // Media Recorder Handlers\n\n const onRecordingStop = () => {\n const blob = new Blob(mediaObject.current, mediaOptions)\n const url = URL.createObjectURL(blob)\n\n // Converting the blob to Base64 so that we can POST\n // via `postAttempt` to the backend and upload it to AWS\n\n const reader = new FileReader()\n reader.onloadend = () => {\n const encodedBlob = reader.result\n\n // This workaround forces the data description on base64 strings\n // due sometimes it returns empty or containing the wrong info\n const newEncodedBlob = R.replace(\n /(data:;|data:application\\/octet-stream;)/,\n `data:${video ? mediaTypes.video : mediaTypes.audio};`,\n encodedBlob\n )\n setBase64Media(newEncodedBlob)\n }\n reader.readAsDataURL(blob)\n\n setStatus(recorderStatus.STOPPED)\n setMediaBlobUrl(url)\n onStop({ url, blob }) // base64Media will return as null if not set\n }\n\n const onRecordingActive = ({ data }) => {\n mediaObject.current.push(data)\n }\n\n const startRecording = async () => {\n setError(null)\n if (!mediaStream.current) {\n await getMediaStream()\n }\n if (mediaStream.current) {\n const hasStreamEnded = mediaStream.current\n .getTracks()\n .some(track => track.readyState === 'ended')\n if (hasStreamEnded) {\n await getMediaStream()\n }\n mediaRecorder.current = new MediaRecorder(\n mediaStream.current,\n mediaOptions\n )\n\n // The polyfill we're using has its own way to handle events,\n // and they're not the same as the ones emitted by the\n // mediaRecorder API. For this reason we need to create event\n // listeners in order to listen the polyfill events.\n if (shouldUsePolyfill) {\n mediaRecorder.current.addEventListener('dataavailable', event =>\n onRecordingActive(event)\n )\n mediaRecorder.current.addEventListener('stop', event =>\n onRecordingStop(event)\n )\n mediaRecorder.current.addEventListener('error', () => {\n setError(recorderError.RECORDER_ERROR)\n setStatus(recorderStatus.IDLE)\n })\n } else {\n mediaRecorder.current.ondataavailable = onRecordingActive\n mediaRecorder.current.onstop = onRecordingStop\n mediaRecorder.current.onerror = () => {\n setError(recorderError.RECORDER_ERROR)\n setStatus(recorderStatus.IDLE)\n }\n }\n\n mediaRecorder.current.start()\n setStatus(recorderStatus.RECORDING)\n }\n }\n\n const muteAudio = mute => {\n setIsAudioMuted(mute)\n if (!mediaStream.current) return\n\n mediaStream.current.getAudioTracks().forEach(audioTrack => {\n const track = audioTrack\n track.enabled = !mute\n return track\n })\n }\n\n const stopRecording = () => {\n if (mediaRecorder.current?.state !== 'inactive') {\n setStatus(recorderStatus.STOPPED)\n\n mediaRecorder.current.stop()\n\n mediaStream.current &&\n mediaStream.current.getTracks().forEach(track => track.stop())\n\n mediaObject.current = []\n }\n }\n\n return {\n base64Media,\n clearBlobUrl: () => setMediaBlobUrl(null),\n error,\n isAudioMuted,\n mediaBlobUrl,\n muteAudio: () => muteAudio(true),\n previewStream: mediaStream.current\n ? new MediaStream(mediaStream.current.getVideoTracks())\n : null,\n startRecording,\n status,\n stopRecording,\n unMuteAudio: () => muteAudio(false),\n setStatus,\n }\n}\n","import PropTypes from 'prop-types'\n\nimport { Box } from '@redriverpress/system'\n\nfunction ErrorWrapper({ children }) {\n return (\n \n {children}\n \n )\n}\n\nErrorWrapper.propTypes = {\n children: PropTypes.node.isRequired,\n}\n\nexport default ErrorWrapper\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { useField } from 'formik'\n\nimport { Box, Text } from '@redriverpress/system'\n\nimport CheckboxField from './CheckboxField'\nimport ErrorWrapper from './ErrorWrapper'\n\nconst StyledExtraContent = styled(Text).attrs(() => ({\n as: 'span',\n}))`\n display: block;\n cursor: default;\n /* aligns content with the label text above: width of checkbox + side padding */\n padding-left: calc(24px + ${props => props.theme.space[2]});\n`\n\n/**\n * Checkbox with boolean value. The main difference with\n * CheckboxField component is that it's displayed on\n * a box with background color and that it show error\n * messages (outside the box with bg).\n */\nfunction Agreement({ label, children, mb, bg, hideOutline, ...props }) {\n const fieldContext = useField(props)\n\n const { touched, error } = fieldContext[1]\n\n return (\n \n \n \n {children}\n \n {touched && error && {error}}\n \n )\n}\n\nAgreement.defaultProps = {\n label: null,\n children: null,\n}\n\nAgreement.propTypes = {\n bg: PropTypes.string,\n children: PropTypes.node,\n id: PropTypes.string,\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n mb: PropTypes.oneOfType([PropTypes.number, PropTypes.array]),\n name: PropTypes.string.isRequired,\n hideOutline: PropTypes.bool,\n}\n\nAgreement.defaultProps = {\n id: '',\n mb: 3,\n bg: 'blue100',\n hideOutline: true,\n}\n\nexport default Agreement\n","import { Box } from '@redriverpress/system'\nimport styled from 'styled-components'\n\nconst ProgressBarWrapper = 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 ProgressBarWrapper\n","import { Box, Icon, theme, TransparentButton } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\nimport { CircularProgressbarWithChildren } from 'react-circular-progressbar'\nimport styled from 'styled-components'\n\nimport ProgressBarWrapper from './ProgressBarWrapper'\n\nexport const ActionButton = styled(TransparentButton)`\n background-color: ${props => props.theme.colors[props.bg] || props.bg};\n border-radius: ${props => props.theme.radii.circular};\n border: none;\n cursor: pointer;\n transition: background 0.15s ease-in-out;\n z-index: 1;\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n\n &:hover {\n background: ${props => props.theme.colors[props.bgHover] || props.bgHover};\n }\n\n &:focus {\n outline: none;\n }\n`\n\nconst TYPES = {\n RECORDER: 'recorder',\n PLAYER: 'player',\n}\n\nconst colorsSchemeByType = {\n [TYPES.PLAYER]: {\n background: theme.colors.green500,\n backgroundHover: theme.colors.green700,\n path: theme.colors.green500,\n trail: theme.colors.green100,\n },\n [TYPES.RECORDER]: {\n background: theme.colors.red500,\n backgroundHover: theme.colors.red700,\n path: theme.colors.red500,\n trail: theme.colors.red100,\n },\n}\n\nconst getProgressBarStyle = colors => ({\n // Customize the path, i.e. the \"completed progress\"\n path: {\n // Path color\n stroke: colors.path,\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: colors.trail,\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\nexport default function RecPlayButton({\n type,\n small,\n value,\n maxValue,\n onClick,\n children,\n icon,\n progressBarStyles,\n}) {\n const colors = colorsSchemeByType[type]\n\n return (\n \n \n \n \n {children || (\n \n )}\n \n \n \n \n )\n}\n\nRecPlayButton.displayName = 'RecPlayButton'\n\nconst progressbarTypes = {\n stroke: PropTypes.string,\n strokeLinecap: PropTypes.string,\n transition: PropTypes.string,\n transform: PropTypes.string,\n transformOrigin: PropTypes.string,\n}\n\nRecPlayButton.defaultProps = {\n type: TYPES.RECORDER,\n icon: 'microphone',\n value: 1,\n maxValue: 1,\n children: null,\n small: false,\n progressBarStyles: null,\n}\n\nRecPlayButton.propTypes = {\n type: PropTypes.oneOf([TYPES.PLAYER, TYPES.RECORDER]),\n value: PropTypes.number,\n maxValue: PropTypes.number,\n onClick: PropTypes.func.isRequired,\n children: PropTypes.node,\n icon: PropTypes.string,\n small: PropTypes.bool,\n progressBarStyles: PropTypes.shape({\n path: progressbarTypes,\n trail: progressbarTypes,\n }),\n}\n","import xhr from './xhr'\n\nexport default function getWithXHR(url) {\n return xhr({ url, method: 'get' }).then(resp => resp.data)\n}\n","import PropTypes from 'prop-types'\nimport { Box } from '@redriverpress/system'\n\nconst lineStyles = {\n done: {\n backgroundColor: 'blue500',\n },\n}\n\nexport default function Divider({ variant }) {\n return (\n \n \n \n \n )\n}\n\nDivider.defaultProps = {\n variant: 'default',\n}\n\nDivider.propTypes = {\n variant: PropTypes.oneOf(['default', 'done', 'active']),\n}\n","import PropTypes from 'prop-types'\nimport { Box } from '@redriverpress/system'\n\nconst SIZE = '2rem'\n\nconst variantStyles = {\n done: {\n backgroundColor: 'blue500',\n color: 'white',\n },\n active: {\n borderColor: 'blue500',\n borderStyle: 'solid',\n borderWidth: 2,\n color: 'blue500',\n },\n}\n\nexport default function StepCircle({ variant, label }) {\n return (\n \n {label}\n \n )\n}\n\nStepCircle.defaultProps = {\n variant: 'default',\n}\n\nStepCircle.propTypes = {\n variant: PropTypes.oneOf(['default', 'done', 'active']),\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n}\n","import { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { Box } from '@redriverpress/system'\n\nimport Divider from './Divider'\nimport StepCircle from './StepCircle'\n\nconst stepVariants = {\n default: {\n display: ['none', null, 'inline-flex'],\n },\n done: {\n display: ['none', null, 'inline-flex'],\n },\n}\n\nexport default function Stepper({ steps, active }) {\n const activeIdx = steps.findIndex(step => step.id === active)\n\n return (\n \n {steps.map((step, idx) => {\n let variant = 'default'\n if (activeIdx >= idx) {\n variant = activeIdx > idx ? 'done' : 'active'\n }\n\n return (\n \n \n \n {step.label}\n \n {idx < steps.length - 1 && }\n \n )\n })}\n \n )\n}\n\nexport const stepIdProp = PropTypes.string\n\nconst stepPropShape = {\n id: stepIdProp.isRequired,\n label: PropTypes.string.isRequired,\n url: PropTypes.string,\n}\n\nStepper.propTypes = {\n steps: PropTypes.arrayOf(PropTypes.shape(stepPropShape)).isRequired,\n active: stepIdProp.isRequired,\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const SELF_STUDY_PRODUCT_TITLE = 'Ellii Solo'\n","export const MAX_RECORDING_TIME = 2\n\nexport const recorderError = {\n RECORDER_ERROR: 'Error on Recorder',\n NOT_ALLOWED: 'Request is not allowed by the user agent',\n}\n\nexport const recorderStatus = {\n IDLE: 'idle',\n BLOCKED: 'blocked',\n RECORDING: 'recording',\n STOPPING: 'stopping',\n STOPPED: 'stopped',\n SAVING: 'saving',\n}\n\nexport const platform = {\n ANDROID: 'android',\n IOS: 'ios',\n MAC: 'macos',\n WIN: 'windows',\n}\n\nexport const browser = {\n CHROME: 'Chrome',\n EDGE: 'Microsoft Edge',\n FIREFOX: 'Firefox',\n SAFARI: 'Safari',\n}\n","import PropTypes from 'prop-types'\n\nimport { MotionBox, YumiBasic } from '@redriverpress/system'\n\n// Use of position: relative and z-index: 1 fixes a known rendering bug\n// in Safari when using overflow: hidden on elements with border-radius\n// appled to them. Neat!\n\nconst bgs = {\n happy: 'green100',\n neutral: 'blue400',\n sad: 'yellow400',\n}\n\nexport default function ResultsYumi({ mood, ...props }) {\n return (\n \n \n \n \n \n )\n}\n\nResultsYumi.defaultProps = {\n mood: 'happy',\n}\n\nResultsYumi.propTypes = {\n mood: PropTypes.oneOf(['happy', 'neutral', 'sad']),\n}\n"],"sourceRoot":""}