{"version":3,"sources":["webpack:///./app/react/packages/common/utils/analytics.js","webpack:///./app/react/packages/common/hooks/usePrevious.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/useIncludedMediaQuery.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/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/CountBadge.js","webpack:///./app/react/packages/common/components/TransitionItems.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/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/Tabs.js","webpack:///./app/react/packages/common/components/LightboxImage.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/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/mediaRecorder.js","webpack:///./app/react/packages/common/components/alert/Alert.js","webpack:///./app/react/packages/common/components/ResultsYumi.js"],"names":["analyticsTrack","event","payload","analytics","track","usePrevious","value","ref","useRef","useEffect","current","useDidMountEffect","func","deps","didMount","SubscribeNowDialog","subtitle","open","onOpenChange","Root","Portal","Overlay","StyledContent","onPointerDownOutside","e","preventDefault","StyledTitle","as","mb","display","flexDirection","justifyContent","secondary","href","window","location","small","mr","icon","pr","propTypes","PropTypes","string","isRequired","bool","PillWrapper","styled","Box","attrs","bg","border","borderColor","borderRadius","boxShadow","width","media","md","props","theme","colors","white","blue100","Pill","NavLink","black","fontSizes","sm","blue500","TabsPropType","arrayOf","shape","to","oneOfType","object","exact","label","node","PillTabs","tabs","map","tab","className","isActive","style","flex","py","JSON","stringify","getTabKey","rawBreakpoints","lg","xl","useIncludedMediaQuery","query","useState","mediaQuery","setMediaQuery","debounceGetBreakpoint","useDebounce","windowSize","innerWidth","addEventListener","removeEventListener","maxBreakpoint","exactBreakpoint","StyledInput","input","inputStyles","DateTimePicker","placeholder","closeOnSelect","includeTime","disabled","error","onChange","isValidDate","onOpen","onClose","onReset","handleReset","state","inputValue","renderInput","inputProps","position","pt","pl","inputIconWidth","pb","readOnly","Boolean","top","bottom","right","p","onClick","data","setTimeout","closeCalendar","toDate","dateFormat","timeFormat","date","defaultProps","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","oneOf","subscribed_to_newsletter","commit","INITIAL_VALUES","INITIAL_ERRORS","CreateFreeAccountDialog","pollId","pollTopic","recaptcha","useRecaptcha","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","message","my","color","hover","AutoScrollAlert","fallback","initialValues","initialErrors","validate","validationSchema","onSubmit","isValid","submitForm","setFieldValue","Field","name","ml","sanitizeError","type","SelectField","options","code","getOptionText","getOptionValue","CheckboxField","fontSize","target","labelPadding","size","textAlign","number","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","fn","timeout","cleanUpOnUnmount","debounce","clearTimeout","invoke","args","RouteShape","external","LinkWrapper","route","Breadcrumbs","routes","trimmedRoutes","penultimateRoute","lastRoute","px","CLASS_VERSION","legacy","kanban","Recorder","status","recordingTime","maxSeconds","seconds","setSeconds","recording","recorderStatus","RECORDING","mounted","recordingTimeout","alignItems","maxValue","RequestMicPermissionDialog","onConfirm","fontWeight","mt","weight","Player","src","showCurrentTime","showRemainingTime","children","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","Object","keys","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","animate","rotate","mediaQueries","k","sitekey","Promise","resolve","CountBadge","flexShrink","TabCountBadge","gray150","MotionBox","TransitionItems","animateInitial","currentItem","getKey","prevPosition","getDirection","distance","variants","enter","dir","opacity","x","centre","exit","transition","ease","exitBeforeEnter","custom","initial","id","ToggleControlOuter","active","height","larger","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","useUserAccess","useQuery","getCurrentUser","refetchOnWindowFocus","staleTime","userIsLoading","isLoading","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","Tab","activeClassName","gray700","blue700","Tabs","gridAutoFlow","gridGap","MotionImage","Image","LightboxImage","isLightboxOpen","setIsLightboxOpen","isZoomed","setIsZoomed","constraintsRef","imageRef","viewportHeight","use100vh","onEscapeKeydown","drag","dragConstraints","dragElastic","dragMomentum","maxWidth","maxHeight","naturalWidth","naturalHeight","y","trackAddcontentToClass","contentId","contentTitle","destinationColumn","destinationClassId","analyticsData","eventName","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","compact","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","onBackgroundClick","alignSelf","FloatingActionModal","actionContent","fadeIn","keyframes","ModalBackground","div","getLevelsByType","levelData","cefrLevels","clbLevels","eldLevels","nrsLevels","length","FontSizeExtension","Extension","create","addOptions","types","addGlobalAttributes","this","attributes","default","parseHTML","element","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","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","ReactDateTimeStyle","createGlobalStyle","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","enabled","stop","clearBlobUrl","previewStream","MediaStream","getVideoTracks","unMuteAudio","ErrorWrapper","StyledExtraContent","Agreement","hideOutline","ProgressBarWrapper","ActionButton","circular","bgHover","TYPES","colorsSchemeByType","background","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","steps","activeIdx","findIndex","step","idx","stepIdProp","stepPropShape","MAX_RECORDING_TIME","STOPPING","SAVING","platform","ANDROID","IOS","MAC","WIN","browser","CHROME","EDGE","FIREFOX","SAFARI","warning","success","boldTypes","Alert","forwardRef","iconColor","bold","bgs","happy","neutral","sad","ResultsYumi","mood","scale","delay","originY","times","blink"],"mappings":"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","file":"package-common.8b15f7782bf5725c184b.chunk.js","sourcesContent":["/* 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","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","/* 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","// 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 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 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 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 { 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 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 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 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 Modal from 'styled-react-modal'\nimport PropTypes from 'prop-types'\nimport { motion } from 'framer-motion'\nimport { use100vh } from 'react-div-100vh'\nimport { useRef, useState } from 'react'\n\nimport { Box, Icon, Image, TransparentButton } from '@redriverpress/system'\n\nconst MotionImage = motion(Image)\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, ...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 return (\n <>\n setIsLightboxOpen(true)}\n p={0}\n style={{\n cursor: 'zoom-in',\n }}\n >\n \n \n setIsLightboxOpen(false)}\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\nLightboxImage.propTypes = {\n alt: PropTypes.string.isRequired,\n src: PropTypes.string.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.saved\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.teaching)\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","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","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'\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 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":""}