{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/react/media/common/components/MediaHeader.js","webpack:///./app/react/media/flashcards/components/FlashcardsGrid.js","webpack:///./app/react/media/flashcards/components/AccessDialog.js","webpack:///./app/react/media/flashcards/constants/flashcardPropShape.js","webpack:///./app/react/media/flashcards/hooks/useSelection.js","webpack:///./app/react/media/flashcards/components/Flashcard.js","webpack:///./app/react/media/flashcards/services/getGenres.js","webpack:///./app/react/media/flashcards/hooks/useGenres.js","webpack:///./app/react/media/flashcards/components/Genre/GenreHeader.js","webpack:///./app/react/media/flashcards/services/getRandomFlashcards.js","webpack:///./app/react/media/flashcards/services/getFlashcard.js","webpack:///./app/react/media/videos/services/getRandomVideos.js","webpack:///./app/react/media/contexts/index.js","webpack:///./app/react/media/flashcards/components/Genre/AllFlashcardsGenre.js","webpack:///./app/react/media/common/components/CategoryChip.js","webpack:///./app/react/media/flashcards/services/getCategory.js","webpack:///./app/react/media/flashcards/hooks/useCategory.js","webpack:///./app/react/media/flashcards/services/getGenre.js","webpack:///./app/react/media/flashcards/hooks/useGenre.js","webpack:///./app/react/media/flashcards/components/Genre/CategoryHeader.js","webpack:///./app/react/media/flashcards/components/skeletons/FlashcardsSkeleton.js","webpack:///./app/react/media/flashcards/constants/routes.js","webpack:///./app/react/media/flashcards/components/Genre/Genre.js","webpack:///./app/react/media/common/components/NavModalTrigger.js","webpack:///./app/react/media/common/components/defaultCommon.js","webpack:///./app/react/media/flashcards/components/Genres/GenreCategoriesDefault.js","webpack:///./app/react/media/common/components/GenreImage.js","webpack:///./app/react/media/flashcards/components/Genres/GenresDefault.js","webpack:///./app/react/media/common/components/GenresSidebarSkeleton.js","webpack:///./app/react/media/flashcards/components/Genres/GenresSidebar.js","webpack:///./app/react/media/flashcards/components/Genres/Genres.js","webpack:///./app/react/media/flashcards/components/FlashcardsSearchResults.js","webpack:///./app/react/media/flashcards/components/SelectionManager/SelectionDrawer.js","webpack:///./app/react/media/flashcards/components/SelectionManager/SelectionManager.js","webpack:///./app/react/media/flashcards/Index.js","webpack:///./app/react/media/videos/services/getVideoGenre.js","webpack:///./app/react/media/videos/hooks/useVideoGenre.js","webpack:///./app/react/media/videos/services/getVideoGenres.js","webpack:///./app/react/media/videos/hooks/useVideoGenres.js","webpack:///./app/react/media/videos/components/Genres/VideoGenreCategoriesDefault.js","webpack:///./app/react/media/videos/constants/routes.js","webpack:///./app/react/media/videos/components/Genres/VideoGenresDefaultSidebar.js","webpack:///./app/react/media/videos/components/Genres/VideoGenresMdSidebar.js","webpack:///./app/react/media/videos/components/Genres/Genres.js","webpack:///./app/react/media/videos/components/Genre/GenreHeader.js","webpack:///./app/react/media/videos/constants/videoPropShape.js","webpack:///./app/react/media/videos/components/VideoCard.js","webpack:///./app/react/media/videos/components/VideosGrid.js","webpack:///./app/react/media/videos/components/Genre/AllVideosGenre.js","webpack:///./app/react/media/videos/services/getVideoCategory.js","webpack:///./app/react/media/videos/hooks/useVideoCategory.js","webpack:///./app/react/media/videos/components/skeletons/VideosSkeleton.js","webpack:///./app/react/media/videos/components/Genre/CategoryHeader.js","webpack:///./app/react/media/videos/components/Genre/Genre.js","webpack:///./app/react/media/videos/components/VideoHit.js","webpack:///./app/react/media/videos/components/VideosSearchResults.js","webpack:///./app/react/media/videos/Index.js","webpack:///./app/react/media/flashcards/components/FlashcardsSearchConfig.js","webpack:///./app/react/media/videos/components/VideosSearchConfig.js","webpack:///./app/react/media/Routes.js","webpack:///./app/react/media/App.js","webpack:///./app/react/jsPacks/media.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","e","Promise","resolve","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","MediaHeader","tabs","to","pathname","routes","flashcards","label","videos","pt","as","mb","measure","PillTabs","FlashcardsGrid","children","display","gridTemplateColumns","gridGap","propTypes","PropTypes","node","isRequired","AccessDialog","onOpenChange","open","Root","Overlay","StyledContent","StyledTitle","my","justifyContent","secondary","mr","href","icon","pr","textAlign","fontWeight","color","func","bool","category","shape","id","number","title","string","slug","genre","image","imageGrayscale","thumbnail","useSelectionBaseHook","createLocalStorageStateHook","useSelection","selection","setSelection","clearSelection","addToSelection","Array","isArray","Error","selectionData","map","userTitle","current","removeFromSelection","flashcardIds","editSelectionUserTitle","findIndex","fc","Content","styled","Dialog","theme","colors","gray100","media","md","props","radii","rounded","lg","SelectButton","button","isSelected","circular","space","white","blue500","FCButton","TransparentButton","black","shadows","Flashcard","flashcard","showCategory","userHasAccess","useQueryParam","NumberParam","flashcardParam","setFlashcardParam","dialogIsOpen","ttsData","useTextToSpeech","enabled","useState","accessDialogOpen","setAccessDialogOpen","saveDialogOpen","setSaveDialogOpen","handleSelectButton","undefined","bg","borderRadius","position","Trigger","asChild","px","pb","width","aria-label","src","alt","size","fontSize","onClick","Portal","Close","top","right","alignItems","mx","height","flexDirection","audio_url","small","Title","flex","mt","SaveToSetsDialog","onClose","defaultProps","flashcardPropShape","getGenres","getWithXHR","useGenres","useQuery","isLoading","genres","genreSlug","useParams","activeGenre","find","g","activeGenreIndex","previousGenre","nextGenre","GenreHeader","flashcardsCount","toLocaleString","Link","url","getRandomFlashcards","exclude","toString","getFlashcard","flashcardId","getRandomVideos","page","limit","xhr","getRandomVideosUrl","method","MediaGalleryState","createContext","MediaGalleryDispatch","useMediaGallery","state","useContext","dispatch","MediaGalleryProvider","userAccess","useUserAccess","fetchedFlashcards","setFetchedFlashcards","fetchedVideos","setFetchedVideos","fetchedIds","setFetchedIds","totalPages","setTotalPages","setPage","fetchRandomFlashcards","randomFlashcards","concat","flashcardIDs","includes","fetchRandomVideos","randomVideos","headers","Number","useEffect","currentPage","Provider","type","AllFlashcards","fetchMedia","fetchPending","setFetchPending","handleFetch","disabled","loading","displayName","CategoryChip","NavLink","gray600","fontSizes","blue700","getCategory","categoryId","useCategory","getGenre","genreId","useGenre","categorySlug","activeCategory","flashcardCategories","CategorySelectionButton","attrs","py","CategoryHeader","userLoggedIn","selectedIds","categoryIds","selectionHasSomeCategoryFlashcards","some","selectionHasAllCategoryFlashcards","every","addToClassModalOpen","setAddToClassModalOpen","moveItemModalOpen","setMoveItemModalOpen","description","dangerouslySetInnerHTML","__html","renderInlineMarkdown","ml","boxShadow","AddToClassDialog","onCancel","contentType","CONTENT_TYPES","flashcardCategory","getLegacyURL","selectedClass","content","isOpen","item","fileable","reload","location","FCSkeleton","Skeleton","placeholders","_","index","FlashcardsSkeleton","ph","GENRE_AND_CATEGORY_PATH","GENRE_PATH","ALL_FLASHCARDS_PATH","Genre","isMd","useMedia","mediaQueries","isLoadingGenre","genreAmount","setGenreAmount","chunkedGenreFlashcards","sectionRef","useRef","navHeight","document","querySelector","offsetHeight","scrollTo","offsetTop","left","behavior","ref","path","exact","flexWrap","cat","borderColor","amount","pl","Button","gray400","NavModalTrigger","forwardRef","GenreLink","TitleBar","Box","zIndex","GenreCategoriesDefault","useLocation","isLoadingGenres","dialogOpen","setDialogOpen","isActive","match","search","data-active-genre-icon","GenreImage","flexShrink","GenresDefault","GenreSkeleton","GenresSidebarSkeleton","GenresSidebar","Genres","FlashcardHit","hit","serializedFlashcard","categoryTitle","category_title","image_url","image_grayscale_url","thumbnail_url","FlashcardSearchResults","searchState","searchResults","nbHits","query","hitComponent","hitsWrapper","hitComponentProps","connectStateResults","DrawerTop","previewTileSize","DrawerPreview","columns","RemoveIconOverlay","RemoveIconWrapper","background","PreviewFlashcardButton","DrawerContents","maxHeight","overflow","SelectionDrawer","onSaveAction","onPrintAction","deleteAllAction","drawerOpen","setDrawerOpen","isLg","previewLimit","previewSelection","createPortal","AnimatePresence","initial","opacity","y","animate","exit","bottom","x","borderTop","onRemove","onRename","onReorder","oldIndex","newIndex","arrayMove","body","ClearSelectionButton","red900","SelectionManagerDefault","saveSelectionDialogOpen","setSaveSelectionDialogOpen","manageDialogOpen","setManageDialogOpen","printDialogOpen","setPrintDialogOpen","clearSelectionDialogOpen","setClearSelectionDialogOpen","ClearSelectionNode","style","pointerEvents","message","Boolean","action","primaryActionLabel","onPrimaryAction","onPrint","onSaved","Flashcards","userIsLoading","usePathnameTracking","placeholder","withCancelButton","getVideoGenre","getVideoGenreUrl","useVideoGenre","videoCategories","getVideoGenres","getVideoGenresUrl","useVideoGenres","VideoGenreCategoriesDefault","ALL_VIDEOS_PATH","videosCount","GenreHeaderSkeleton","CardContent","Wrapper","video","isUserAllowed","openInfoModal","reset","VideoCard","objectFit","subtitle","VideosGrid","videoPropShape","AllVideosGenre","isAccessDialogOpen","setIsAccessDialogOpen","VideoAccessDialog","getVideoCategoryUrl","useVideoCategory","VideosSkeleton","chunkedGenreVideos","VideoCardHit","serializedVideo","VideosSearchResults","Videos","searchClient","algoliaSearch","process","flashcardsIndex","createURL","qs","stringify","urlToSearchState","parse","searchStateToUrl","FlashcardsSearchConfig","history","useHistory","setSearchState","setStateId","InstantSearch","indexName","onSearchStateChange","updatedSearchState","clearTimeout","setTimeout","videosIndex","VideosSearchConfig","Routes","queryClient","QueryClient","defaultOptions","queries","refetchOnWindowFocus","refetchOnMount","refetchOnReconnect","retry","staleTime","TWENTY_FOUR_HOURS_IN_MS","App","WebFont","load","google","families","basename","QueryClientProvider","client","fallback","ReactRouterRoute","Route","ElliiThemeProvider","addEventListener","mountPoint","getElementById","ReactDOM","render"],"mappings":"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","file":"media.4e6c84360f95e4d11981.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"media\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// The chunk loading function for additional chunks\n \t// Since all referenced chunks are already included\n \t// in this file, this function is empty here.\n \t__webpack_require__.e = function requireEnsure() {\n \t\treturn Promise.resolve();\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"//d3uk5h2fsqai9v.cloudfront.net/js-packs/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([1515,\"vendor\",\"package-common\",\"ellii\",\"react\",\"package-flashcards\",\"package-track\",\"package-tts\",\"package-folders\",\"package-search\",\"course~flashcardSets~folders~media~teacher/planner~video\",\"flashcardSets~folders~homeworkTasks~lessonTasks~media~student/flashcards\",\"course~flashcardSets~folders~media~siteFolderModal~video\",\"flashcardSets~folders~homeworkTasks~lessonTasks~media\",\"media~video\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { Box, Container, Heading, Text } from '@redriverpress/system'\n\nimport PillTabs from 'Common/components/PillTabs'\n\nimport { routes } from '../../constants'\n\nexport default function MediaHeader() {\n const tabs = [\n {\n to: (location => ({ ...location, pathname: routes.flashcards }))(),\n label: 'Flashcards',\n },\n {\n to: (location => ({ ...location, pathname: routes.videos }))(),\n label: 'Videos',\n },\n ]\n\n return (\n <>\n \n \n Media Gallery\n \n \n Visuals are essential for language learning. Tab between thousands of\n flashcards and videos to use in your classes.\n \n \n \n \n \n \n )\n}\n","import PropTypes from 'prop-types'\n\nimport { Box } from '@redriverpress/system'\n\nexport default function FlashcardsGrid({ children }) {\n return (\n \n {children}\n \n )\n}\n\nFlashcardsGrid.propTypes = {\n children: PropTypes.node.isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport {\n Box,\n Icon,\n Dialog,\n Heading,\n Text,\n Button,\n Link,\n} from '@redriverpress/system'\n\nexport default function AccessDialog({ onOpenChange, open }) {\n return (\n \n \n \n \n \n Subscribe for Full Access\n \n \n \n To save, customize, print, and share flashcards, please purchase\n a subscription.\n \n \n \n \n \n \n \n Learn about Flashcards\n \n \n \n \n )\n}\n\nAccessDialog.propTypes = {\n onOpenChange: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n}\n","import PropTypes from 'prop-types'\n\nexport default {\n category: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired,\n }).isRequired,\n genre: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired,\n }).isRequired,\n id: PropTypes.number.isRequired,\n image: PropTypes.string.isRequired,\n imageGrayscale: PropTypes.string.isRequired,\n thumbnail: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n}\n","import R from 'ramda'\nimport { createLocalStorageStateHook } from 'use-local-storage-state'\n\nconst useSelectionBaseHook = createLocalStorageStateHook(\n 'elliiFlashcardSelection',\n []\n)\n\nexport default function useSelection() {\n const [selection, setSelection] = useSelectionBaseHook()\n\n const addToSelection = flashcards => {\n if (!Array.isArray(flashcards))\n throw new Error(\n 'addToSelection requires an array of at least 1 flashcard'\n )\n\n // 1. Destructure required properties for selection state\n // 2. Initialize the selection with a default userTitle\n const selectionData = flashcards.map(\n ({ id, image, imageGrayscale, thumbnail, title }) => ({\n id,\n image,\n imageGrayscale,\n thumbnail,\n title,\n userTitle: title,\n })\n )\n\n setSelection(current =>\n // 1. Filter out any already selected flashcards from the flashcards that were passed in\n // (required for selecting whole category, if FC from category was individually selected previously)\n // 2. Prepend the filtered flashcards array to the existing selection array\n // 3. Flatten the result and set it as the new selection\n R.flatten(R.prepend(R.without(current, selectionData), current))\n )\n }\n\n const removeFromSelection = flashcardIds => {\n if (!Array.isArray(flashcardIds))\n throw new Error(\n 'removeFromSelection requires an array of at least 1 flashcard ID'\n )\n\n return setSelection(current =>\n R.without(\n flashcardIds.map(id => R.find(R.propEq('id', id), current)),\n current\n )\n )\n }\n\n const clearSelection = () => setSelection([])\n\n const editSelectionUserTitle = ({ id, value }) =>\n setSelection(current =>\n R.adjust(\n current.findIndex(fc => fc.id === id),\n R.assoc('userTitle', value),\n current\n )\n )\n\n return {\n selection,\n setSelection, // only used for applying a new order to the selection, not meant for general use!\n clearSelection,\n addToSelection,\n removeFromSelection,\n editSelectionUserTitle,\n }\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport styled from 'styled-components'\nimport { Link as RouteLink } from 'react-router-dom'\nimport { useQueryParam, NumberParam } from 'use-query-params'\nimport { useState } from 'react'\n\nimport {\n Box,\n Button,\n Columns,\n Col,\n Dialog,\n Icon,\n Heading,\n Image,\n Link,\n SimpleAudio,\n Text,\n TransparentButton,\n media,\n theme,\n} from '@redriverpress/system'\n\nimport { useTextToSpeech } from 'Packages/tts'\n\nimport AccessDialog from './AccessDialog'\nimport SaveToSetsDialog from '../../../packages/flashcards/save/SaveToSetsDialog'\nimport flashcardPropShape from '../constants/flashcardPropShape'\nimport useSelection from '../hooks/useSelection'\n\nconst Content = styled(Dialog.Content)`\n position: fixed;\n inset: 0;\n overflow-y: scroll;\n background: ${theme.colors.gray100};\n -webkit-overflow-scrolling: touch;\n z-index: 6;\n\n ${media.md`\n inset: unset;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 2rem;\n width: 60vw;\n max-width: 25rem;\n border-radius: ${props => props.theme.radii.rounded};\n `}\n\n ${media.lg`\n padding: 1rem;\n width: 75vw;\n max-width: 60rem;\n `}\n`\n\nconst SelectButton = styled.button`\n appearance: none;\n background: ${props =>\n props.theme.colors[props.isSelected ? 'blue500' : 'gray150']};\n border-radius: ${props => props.theme.radii.circular};\n color: ${props => props.theme.colors[props.isSelected ? 'white' : 'black']};\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 40px;\n width: 40px;\n padding: 0; // reset browser defaults\n position: absolute;\n bottom: ${props => props.theme.space[2]};\n\n &:hover,\n &:focus-visible {\n background: ${props =>\n props.theme.colors[props.isSelected ? 'blue700' : 'blue500']};\n color: ${props => props.theme.colors.white};\n }\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n box-shadow: 0 0 0 2px ${props =>\n props.theme.colors.white}, 0 0 0 4px ${props =>\n props.theme.colors.blue500};\n }\n\n &:after {\n font-family: 'Font Awesome 5 Pro';\n font-weight: 300;\n color: ${props => props.theme.colors[props.isSelected ? 'white' : 'black']};\n content: '${props => (props.isSelected ? '\\f00c' : '\\f067')}';\n display: block;\n z-index: 1;\n }\n\n &:hover:after,\n &:focus-visible:after {\n color: ${props => props.theme.colors.white};\n }\n`\n\nconst FCButton = styled(TransparentButton)`\n border-radius: ${props => props.theme.radii.rounded};\n color: ${props => props.theme.colors.black};\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n\n &:after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: ${props => props.theme.radii.rounded};\n box-shadow: ${props => props.theme.shadows[3]};\n opacity: 0;\n transition: 0.15s ease-in;\n }\n\n &:hover:after,\n &:focus:after {\n opacity: 1;\n }\n`\n\nexport default function Flashcard({ flashcard, showCategory, userHasAccess }) {\n const { selection, addToSelection, removeFromSelection } = useSelection()\n\n const isSelected = R.any(R.propEq('id', flashcard.id), selection)\n\n const [flashcardParam, setFlashcardParam] = useQueryParam(\n 'flashcard',\n NumberParam\n )\n\n const dialogIsOpen = flashcardParam === flashcard.id\n\n // Don't fire the TTS request until the details modal has been opened\n const { data: ttsData } = useTextToSpeech(flashcard.title, {\n enabled: dialogIsOpen,\n })\n\n const [accessDialogOpen, setAccessDialogOpen] = useState(false)\n const [saveDialogOpen, setSaveDialogOpen] = useState(false)\n\n const handleSelectButton = () =>\n isSelected\n ? removeFromSelection([flashcard.id])\n : addToSelection([flashcard])\n\n return (\n setFlashcardParam(open ? flashcard.id : undefined)}\n >\n \n \n \n \n \n {flashcard.title}\n \n {showCategory && (\n {flashcard.category.title}\n )}\n \n \n \n userHasAccess ? handleSelectButton() : setAccessDialogOpen(true)\n }\n />\n \n\n {!userHasAccess && (\n setAccessDialogOpen(open)}\n />\n )}\n\n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n {flashcard.genre.title}\n \n \n \n \n \n {flashcard.category.title}\n \n \n \n \n \n \n \n \n \n {flashcard.title}\n \n \n \n {userHasAccess ? (\n \n \n \n {isSelected ? 'Deselect' : 'Select'}\n \n setSaveDialogOpen(true)}\n >\n \n Save to Set\n \n \n ) : (\n <>\n \n To save, customize, print, and share flashcards, please\n purchase a subscription.\n \n \n \n \n \n \n \n Learn about Flashcards\n \n \n \n )}\n \n \n \n {userHasAccess && (\n setSaveDialogOpen(false)}\n onOpenChange={open => setSaveDialogOpen(open)}\n />\n )}\n \n \n \n )\n}\n\nFlashcard.defaultProps = {\n showCategory: false,\n userHasAccess: false,\n}\n\nFlashcard.propTypes = {\n showCategory: PropTypes.bool,\n flashcard: PropTypes.shape(flashcardPropShape).isRequired,\n userHasAccess: PropTypes.bool,\n}\n","import getWithXHR from 'Common/utils/getWithXHR'\n\nconst url = '/api/v1/flashcard_genres'\n\nconst getGenres = () => getWithXHR(url)\n\nexport default getGenres\n","import { useParams } from 'react-router-dom'\nimport { useQuery } from 'react-query'\n\nimport getGenres from '../services/getGenres'\n\nexport default function useGenres() {\n const { isLoading, data: genres } = useQuery('flashcard_genres', getGenres)\n\n const { genreSlug } = useParams()\n\n const activeGenre = genres?.find(g => g.slug === genreSlug) || genres?.[0]\n\n const activeGenreIndex = genres?.findIndex(g => g === activeGenre)\n\n const previousGenre =\n genres?.[activeGenreIndex - 1] || genres?.[genres?.length - 1]\n const nextGenre = genres?.[activeGenreIndex + 1] || genres?.[0]\n\n return {\n isLoading,\n genres,\n activeGenre,\n previousGenre,\n nextGenre,\n }\n}\n","import { Link } from 'react-router-dom'\n\nimport {\n Box,\n Columns,\n Col,\n Heading,\n IconButton,\n Skeleton,\n Text,\n} from '@redriverpress/system'\n\nimport useGenres from '../../hooks/useGenres'\n\nexport default function GenreHeader() {\n const { activeGenre, previousGenre, nextGenre } = useGenres()\n\n return !activeGenre ? (\n \n {/* Heading */}\n \n {/* Flashcards count */}\n \n \n ) : (\n \n \n \n {activeGenre.title}\n \n \n {activeGenre.flashcardsCount.toLocaleString()} ESL flashcards\n \n \n \n \n \n \n \n )\n}\n","import getWithXHR from 'Common/utils/getWithXHR'\n\nconst url = '/api/v1/flashcards'\n\n/**\n *\n * @param {object} [config={}]\n * @param {number[]} config.exclude - array of flashcard IDs to exclude from the random selection\n * @returns {object[]} flashcards - an array of 40 random flashcards\n */\nconst getRandomFlashcards = ({ exclude = [] } = {}) =>\n getWithXHR(`${url}?exclude=${exclude.toString()}`)\n\nexport default getRandomFlashcards\n","import getWithXHR from 'Common/utils/getWithXHR'\n\nconst url = '/api/v1/flashcards'\n\n/**\n *\n * @param {number} flashcardId - flashcard ID\n * @returns {object} flashcard\n */\nconst getFlashcard = flashcardId => getWithXHR(`${url}/${flashcardId}`)\n\nexport default getFlashcard\n","import xhr from 'Common/utils/xhr'\nimport { getRandomVideosUrl } from '../../endpoints'\n\n/**\n *\n * @param {object} [config={}]\n * @param {number} config.page\n * @param {number} config.limit default 12\n * @returns {object[]} videos - an array of {config.limit} random videos\n */\nconst getRandomVideos = ({ page = 1, limit = 12 } = {}) =>\n xhr({\n url: getRandomVideosUrl({ page, limit }),\n method: 'get',\n })\n\nexport default getRandomVideos\n","import PropTypes from 'prop-types'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { NumberParam, useQueryParam } from 'use-query-params'\n\nimport useUserAccess from 'Common/hooks/useUserAccess'\nimport getRandomFlashcards from '../flashcards/services/getRandomFlashcards'\nimport getFlashcard from '../flashcards/services/getFlashcard'\nimport getRandomVideos from '../videos/services/getRandomVideos'\n\n// Context objects\nconst MediaGalleryState = createContext()\nconst MediaGalleryDispatch = createContext()\n\nMediaGalleryState.displayName = 'MediaGalleryState'\nMediaGalleryDispatch.displayName = 'MediaGalleryDispatch'\n\n// Context hook\nfunction useMediaGallery() {\n const state = useContext(MediaGalleryState)\n const dispatch = useContext(MediaGalleryDispatch)\n\n if (state === undefined || dispatch === undefined) {\n throw new Error(\n 'useMediaGallery must be used within a MediaGalleryProvider'\n )\n }\n\n return [state, dispatch]\n}\n\nfunction MediaGalleryProvider({ children }) {\n const userAccess = useUserAccess()\n const [fetchedFlashcards, setFetchedFlashcards] = useState([])\n const [fetchedVideos, setFetchedVideos] = useState([])\n const [fetchedIds, setFetchedIds] = useState([])\n const [totalPages, setTotalPages] = useState(0)\n const [page, setPage] = useState(0)\n\n const [flashcardId] = useQueryParam('flashcard', NumberParam)\n\n const fetchRandomFlashcards = async () => {\n const randomFlashcards = await getRandomFlashcards({\n exclude: fetchedIds,\n })\n\n const flashcards = fetchedFlashcards.concat(randomFlashcards)\n const flashcardIDs = fetchedIds.concat(randomFlashcards.map(fc => fc.id))\n if (\n flashcardId &&\n fetchedFlashcards.length === 0 &&\n !flashcardIDs.includes(flashcardId)\n ) {\n const flashcard = await getFlashcard(flashcardId)\n\n setFetchedFlashcards(flashcards.concat(flashcard))\n return setFetchedIds(flashcardIDs.concat(flashcard.id))\n }\n setFetchedFlashcards(flashcards)\n setFetchedIds(flashcardIDs)\n }\n\n const fetchRandomVideos = async () => {\n const { data: randomVideos, headers } = await getRandomVideos({\n page: page + 1,\n })\n setFetchedVideos(current => current.concat(randomVideos))\n setPage(Number(headers['x-page']))\n setTotalPages(Number(headers['x-total-pages']))\n }\n\n const fetchMedia = type => {\n if (type === 'flashcards') {\n return fetchRandomFlashcards()\n }\n return fetchRandomVideos()\n }\n\n useEffect(() => {\n // Initial fetch on component mount\n !fetchedFlashcards.length && fetchRandomFlashcards()\n !fetchedVideos.length && fetchRandomVideos()\n }, [])\n\n const state = {\n randomFlashcards: fetchedFlashcards,\n randomVideos: {\n data: fetchedVideos,\n currentPage: page,\n totalPages,\n },\n userAccess,\n }\n\n return (\n \n \n {children}\n \n \n )\n}\n\nMediaGalleryProvider.propTypes = {\n children: PropTypes.node.isRequired,\n}\n\nexport { MediaGalleryProvider, useMediaGallery }\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\n\nimport { Box, LoadingButton, LoadingPlane } from '@redriverpress/system'\n\nimport FlashcardsGrid from '../FlashcardsGrid'\nimport Flashcard from '../Flashcard'\nimport GenreHeader from './GenreHeader'\nimport useGenres from '../../hooks/useGenres'\nimport { useMediaGallery } from '../../../contexts'\n\nexport default function AllFlashcards({ userHasAccess }) {\n const [{ randomFlashcards }, fetchMedia] = useMediaGallery()\n\n const [fetchPending, setFetchPending] = useState(false)\n\n const handleFetch = async () => {\n setFetchPending(true)\n await fetchMedia('flashcards')\n setFetchPending(false)\n }\n\n const { genres } = useGenres()\n\n if (genres && randomFlashcards.length > 0) {\n return (\n <>\n \n \n {randomFlashcards.map(fc => (\n \n ))}\n \n \n \n View More\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n\nAllFlashcards.propTypes = {\n userHasAccess: PropTypes.bool.isRequired,\n}\n","import styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nconst CategoryChip = styled(NavLink)`\n background: ${props => props.theme.colors.white};\n border: 1px solid ${props => props.theme.colors.gray600};\n border-radius: 2rem;\n color: ${props => props.theme.colors.black};\n font-size: ${props => props.theme.fontSizes[0]};\n padding: ${props => props.theme.space[1]} ${props => props.theme.space[2]};\n position: relative;\n margin: ${props => props.theme.space[1]};\n text-decoration: none;\n\n &:hover {\n color: ${props => props.theme.colors.blue700};\n }\n\n &:focus {\n outline: none;\n }\n\n &:after {\n content: '';\n position: absolute;\n inset: -3px; // 2px gap + 1px to clear border\n border-radius: 2rem;\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n opacity: 0;\n }\n\n &:focus:after {\n opacity: 1;\n }\n\n &.active {\n border-color: transparent;\n background: ${props => props.theme.colors.blue500};\n color: white;\n }\n\n &.active:hover {\n color: white;\n }\n`\n\nCategoryChip.displayName = 'CategoryChip'\n\nexport default CategoryChip\n","import getWithXHR from 'Common/utils/getWithXHR'\n\nconst url = '/api/v1/flashcard_categories'\n\nconst getCategory = categoryId => getWithXHR(`${url}/${categoryId}`)\n\nexport default getCategory\n","import { useQuery } from 'react-query'\n\nimport getCategory from '../services/getCategory'\n\nexport default function useCategory(categoryId) {\n const { isLoading, data: category } = useQuery(\n ['flashcards_category', categoryId],\n () => getCategory(categoryId),\n {\n enabled: !!categoryId,\n }\n )\n\n return {\n isLoading,\n category,\n }\n}\n","import getWithXHR from 'Common/utils/getWithXHR'\n\nconst url = '/api/v1/flashcard_genres'\n\nconst getGenre = genreId => getWithXHR(`${url}/${genreId}`)\n\nexport default getGenre\n","import { useParams } from 'react-router-dom'\nimport { useQuery } from 'react-query'\n\nimport getGenre from '../services/getGenre'\n\nexport default function useGenre(genreId) {\n const { categorySlug } = useParams()\n\n const { isLoading, data: genre } = useQuery(\n ['flashcards_genre', genreId],\n () => getGenre(genreId),\n {\n enabled: !!genreId,\n }\n )\n\n const activeCategory =\n genre?.flashcardCategories?.find(c => c.slug === categorySlug) ||\n genre?.flashcardCategories?.[0]\n\n return {\n isLoading,\n genre,\n activeCategory,\n }\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { useState } from 'react'\n\nimport {\n Box,\n Button,\n Icon,\n Heading,\n Skeleton,\n Text,\n TransparentButton,\n} from '@redriverpress/system'\n\nimport { MoveItemModal } from 'Packages/folders'\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport AddToClassDialog from 'Common/components/dialogs/AddToClassDialog'\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\n\nimport AccessDialog from '../AccessDialog'\nimport useCategory from '../../hooks/useCategory'\nimport useGenre from '../../hooks/useGenre'\nimport useGenres from '../../hooks/useGenres'\nimport useSelection from '../../hooks/useSelection'\n\nconst CategorySelectionButton = styled(TransparentButton).attrs(props => ({\n borderRadius: props.theme.radii.rounded,\n fontWeight: 600,\n px: 2,\n py: 1,\n}))`\n &:not([disabled]):hover {\n color: ${props => props.theme.colors.blue700};\n }\n\n &:focus {\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n`\n\nexport default function CategoryHeader({ userHasAccess, userLoggedIn }) {\n const { activeGenre } = useGenres()\n const { activeCategory } = useGenre(activeGenre?.id)\n const { isLoading, category } = useCategory(activeCategory?.id)\n const { selection, addToSelection, removeFromSelection } = useSelection()\n\n const selectedIds = selection.map(fc => fc.id)\n const categoryIds = category ? category.flashcards.map(fc => fc.id) : [] // category may not be immediately available\n\n // Check if there are ANY of the category's flashcards in the current selection\n const selectionHasSomeCategoryFlashcards =\n selection && selectedIds.some(id => categoryIds.includes(id))\n\n // Check if ALL of the category's flashcards are in the selection\n const selectionHasAllCategoryFlashcards =\n selection && categoryIds.every(id => selectedIds.includes(id))\n\n const [accessDialogOpen, setAccessDialogOpen] = useState(false)\n const [addToClassModalOpen, setAddToClassModalOpen] = useState(false)\n const [moveItemModalOpen, setMoveItemModalOpen] = useState(false)\n\n return isLoading || !category ? (\n \n {/* Title */}\n \n \n \n {/* Flashcard count */}\n \n \n \n {/* Description */}\n \n \n \n \n \n ) : (\n <>\n \n \n {category.title}\n \n \n {category.flashcardsCount.toLocaleString()} flashcard\n {category.flashcardsCount !== 1 && 's'}\n \n {category.description && (\n \n )}\n \n setAccessDialogOpen(true)}\n >\n \n Launch Slideshow\n \n \n userHasAccess\n ? setAddToClassModalOpen(true)\n : setAccessDialogOpen(true)\n }\n >\n \n Add to class\n \n\n {/* Save to folder Button */}\n {userLoggedIn && (\n setMoveItemModalOpen(true)}\n boxShadow={3}\n >\n \n \n )}\n \n \n \n userHasAccess\n ? removeFromSelection(categoryIds)\n : setAccessDialogOpen(true)\n }\n >\n \n Deselect All\n \n \n userHasAccess\n ? addToSelection(category.flashcards)\n : setAccessDialogOpen(true)\n }\n >\n \n Select All\n \n \n \n {!userHasAccess && (\n setAccessDialogOpen(open)}\n />\n )}\n setAddToClassModalOpen(false)}\n onCancel={() => setAddToClassModalOpen(false)}\n contentType={CONTENT_TYPES.flashcardCategory}\n getLegacyURL={selectedClass =>\n `/flashcard_sets/category/share/${category.id}/${selectedClass.id}`\n }\n content={category}\n />\n {!isLoading && !!category && (\n {\n setMoveItemModalOpen(false)\n reload && window.location.reload()\n }}\n />\n )}\n \n )\n}\n\nCategoryHeader.defaultProps = {\n userLoggedIn: false,\n}\n\nCategoryHeader.propTypes = {\n userHasAccess: PropTypes.bool.isRequired,\n userLoggedIn: PropTypes.bool,\n}\n","import styled from 'styled-components'\n\nimport { Skeleton } from '@redriverpress/system'\n\nimport FlashcardsGrid from '../FlashcardsGrid'\n\nconst FCSkeleton = styled(Skeleton).attrs({\n height: '12rem',\n width: '100%',\n borderRadius: 'rounded',\n})``\n\nconst placeholders = [...new Array(24)].map((_, index) => ({ key: index }))\n\nexport default function FlashcardsSkeleton() {\n return (\n \n {placeholders.map(ph => (\n \n ))}\n \n )\n}\n","export const GENRE_AND_CATEGORY_PATH = '/flashcards/:genreSlug/:categorySlug'\nexport const GENRE_PATH = '/flashcards/:genreSlug'\nexport const ALL_FLASHCARDS_PATH = '/flashcards'\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Route, Switch, useParams } from 'react-router-dom'\nimport { useEffect, useRef, useState } from 'react'\nimport { useMedia } from 'use-media'\n\nimport { Box, Button, Icon, HR, mediaQueries } from '@redriverpress/system'\n\nimport CategoryChip from '../../../common/components/CategoryChip'\nimport CategoryHeader from './CategoryHeader'\nimport Flashcard from '../Flashcard'\nimport FlashcardsGrid from '../FlashcardsGrid'\nimport FlashcardsSkeleton from '../skeletons/FlashcardsSkeleton'\nimport GenreHeader from './GenreHeader'\nimport useCategory from '../../hooks/useCategory'\nimport useGenre from '../../hooks/useGenre'\nimport useGenres from '../../hooks/useGenres'\nimport { GENRE_AND_CATEGORY_PATH, GENRE_PATH } from '../../constants/routes'\n\nconst genreChunk = 36\n\nexport default function Genre({ userHasAccess, userLoggedIn }) {\n const isMd = useMedia(mediaQueries.md)\n const { genreSlug } = useParams()\n const { activeGenre } = useGenres()\n const { isLoading: isLoadingGenre, genre, activeCategory } = useGenre(\n activeGenre?.id\n )\n const { category } = useCategory(activeCategory?.id)\n\n // Some genres contain hundreds of flashcards; categories are usually < 100.\n // When showing all flashcards in a genre, only show 36 flashcards at a time,\n // to prevent performance slowdowns from React having to deal with hundreds of\n // flashcards (and their modals) all at once.\n const [genreAmount, setGenreAmount] = useState(genreChunk)\n\n const incrementGenreAmount = () =>\n setGenreAmount(amount => amount + genreChunk)\n\n const chunkedGenreFlashcards = genre?.flashcards\n ? R.take(genreAmount, genre?.flashcards)\n : []\n\n const sectionRef = useRef()\n\n const scrollToSectionRef = () => {\n const navHeight = document.querySelector('[data-esll-navbar').offsetHeight\n\n // Scroll to top of genre when switching genres\n window.scrollTo({\n top: sectionRef?.current?.offsetTop - navHeight,\n left: 0,\n behavior: 'smooth',\n })\n }\n\n useEffect(() => {\n isMd && scrollToSectionRef()\n\n // Reset genreAmount when switching genres\n setGenreAmount(genreChunk)\n }, [genreSlug])\n\n return (\n \n {/* On default: genre header should only render when a category isn't selected. */}\n {/* On md+: genre header should always be rendered. */}\n {/* This is managed by leveraging the `exact` prop of the Route with the state of the media query. */}\n \n \n \n\n {isLoadingGenre || !genre ? (\n \n ) : (\n \n {isMd && (\n <>\n \n {genre.flashcardCategories.map(cat => (\n \n {cat.title} ({cat.flashcardsCount})\n \n ))}\n \n
\n \n )}\n\n \n \n \n {category && (\n \n {category.flashcards.map(fc => (\n \n ))}\n \n )}\n \n\n \n \n {chunkedGenreFlashcards.map(fc => (\n \n ))}\n \n\n {genreAmount < genre?.flashcards?.length && (\n \n \n \n )}\n \n \n
\n )}\n \n )\n}\n\nGenre.propTypes = {\n userHasAccess: PropTypes.bool.isRequired,\n userLoggedIn: PropTypes.bool.isRequired,\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { forwardRef } from 'react'\n\nimport { Text, Icon } from '@redriverpress/system'\n\nconst Button = styled.button`\n appearance: none;\n background: ${props => props.theme.colors.white};\n border: 1px solid ${props => props.theme.colors.gray400};\n border-radius: ${props => props.theme.radii.rounded};\n color: ${props => props.theme.colors.black};\n cursor: pointer;\n display: flex;\n align-items: center;\n padding: ${props => props.theme.space[3]};\n width: 100%;\n\n &:focus {\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n`\n\n// When using a component with Dialog.Trigger `asChild`,\n// that component needs to be able to forward a ref\nconst NavModalTrigger = forwardRef(({ label, ...props }, ref) => (\n \n))\n\nNavModalTrigger.displayName = 'NavModalTrigger'\n\nNavModalTrigger.propTypes = {\n label: PropTypes.string.isRequired,\n}\n\nexport default NavModalTrigger\n","import styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Dialog } from '@redriverpress/system'\n\nexport const Content = styled(Dialog.Content)`\n background: ${props => props.theme.colors.white};\n position: fixed;\n inset: 0;\n overflow-y: scroll;\n -webkit-overflow-scrolling: touch;\n z-index: 6;\n`\n\nexport const GenreLink = styled(NavLink)`\n display: flex;\n align-items: flex-start;\n background: transparent;\n text-decoration: none;\n /* px & mx to create negative space for box shadow focus ring */\n padding: 0.5rem 0.5rem;\n margin: 0 -0.5rem;\n position: relative;\n\n &:hover {\n color: currentColor; /* override default link style */\n }\n\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n border-radius: ${props => props.theme.radii.rounded};\n }\n\n &.active {\n font-weight: 600;\n }\n\n [data-active-genre-icon] {\n opacity: 0;\n }\n\n &.active [data-active-genre-icon] {\n opacity: 1;\n }\n`\n\nexport const TitleBar = styled(Box).attrs({\n bg: 'gray100',\n display: 'flex',\n alignItems: 'center',\n py: 3,\n pl: 3,\n pr: 2,\n boxShadow: 2,\n position: 'fixed',\n top: '0',\n left: '0',\n right: '0',\n zIndex: '1',\n})``\n","import { useLocation } from 'react-router-dom'\nimport { useEffect, useState } from 'react'\n\nimport { Box, Dialog, Icon, Heading, LoadingPlane } from '@redriverpress/system'\n\nimport NavModalTrigger from '../../../common/components/NavModalTrigger'\nimport useGenre from '../../hooks/useGenre'\nimport useGenres from '../../hooks/useGenres'\n\nimport {\n Content,\n GenreLink,\n TitleBar,\n} from '../../../common/components/defaultCommon'\n\nexport default function GenreCategoriesDefault() {\n const { pathname } = useLocation()\n\n const { isLoading: isLoadingGenres, activeGenre } = useGenres()\n\n const { isLoading: isLoadingGenre, genre, activeCategory } = useGenre(\n activeGenre?.id\n )\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n useEffect(() => {\n // Close Categories dialog when location path changes (result of selecting a Category)\n dialogOpen && setDialogOpen(false)\n }, [pathname])\n\n return isLoadingGenres || isLoadingGenre ? (\n \n \n \n ) : (\n \n setDialogOpen(isOpen)}\n >\n \n \n \n\n \n \n \n \n \n \n \n \n )\n}\n","import styled from 'styled-components'\n\nimport { Box } from '@redriverpress/system'\n\nconst GenreImage = styled(Box).attrs({\n mr: [3, null, 2, 3],\n size: ['2rem', null, null, '3rem'],\n borderRadius: 'circular',\n flexShrink: 0,\n})`\n background-image: url(${props => props.src});\n background-size: cover;\n`\n\nGenreImage.displayName = 'GenreImage'\n\nexport default GenreImage\n","import { Route, useLocation } from 'react-router-dom'\nimport { useEffect, useState } from 'react'\n\nimport { Box, Dialog, Icon, Heading, LoadingPlane } from '@redriverpress/system'\n\nimport NavModalTrigger from '../../../common/components/NavModalTrigger'\nimport useGenres from '../../hooks/useGenres'\nimport GenreCategoriesDefault from './GenreCategoriesDefault'\nimport GenreImage from '../../../common/components/GenreImage'\nimport { GENRE_AND_CATEGORY_PATH, GENRE_PATH } from '../../constants/routes'\n\nimport {\n Content,\n GenreLink,\n TitleBar,\n} from '../../../common/components/defaultCommon'\n\nexport default function GenresDefault() {\n const { isLoading, genres, activeGenre } = useGenres()\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const { pathname } = useLocation()\n\n useEffect(() => {\n // Close Genres dialog when location path changes (result of selecting a GenreLink)\n dialogOpen && setDialogOpen(false)\n }, [pathname])\n\n return isLoading ? (\n \n \n \n ) : (\n \n setDialogOpen(isOpen)}\n >\n \n \n \n \n \n\n \n \n\n \n \n \n \n \n\n \n \n \n \n )\n}\n","import styled from 'styled-components'\n\nimport { Box, Skeleton } from '@redriverpress/system'\n\nconst GenreSkeleton = styled(Skeleton).attrs({\n width: 1,\n height: [null, null, '3.5rem', '5rem'],\n mb: 2,\n})``\n\nconst placeholders = [...new Array(12)].map((_, index) => ({ key: index }))\n\nexport default function GenresSidebarSkeleton() {\n return (\n \n {placeholders.map(ph => (\n \n ))}\n \n )\n}\n","import styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Text, media } from '@redriverpress/system'\n\nimport GenreImage from '../../../common/components/GenreImage'\nimport GenresSidebarSkeleton from '../../../common/components/GenresSidebarSkeleton'\nimport useGenres from '../../hooks/useGenres'\n\nconst GenreLink = styled(NavLink)`\n background: white;\n border-radius: ${props => props.theme.radii.rounded};\n display: flex;\n font-size: ${props => props.theme.fontSizes[0]};\n padding: ${props => props.theme.space[2]};\n margin-bottom: ${props => props.theme.space[2]};\n text-decoration: none; /* override default link style */\n\n ${media.lg`\n font-size: ${props => props.theme.fontSizes[1]};\n padding: ${props => props.theme.space[3]};\n `}\n\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n\n &.active {\n background: linear-gradient(\n to left,\n ${props => props.theme.colors.blue500} 0 0.5rem,\n white 0.5rem 100%\n );\n }\n`\n\nexport default function GenresSidebar() {\n const { isLoading, genres } = useGenres()\n\n return isLoading ? (\n \n ) : (\n \n {genres.map(genre => (\n !!match && location.search === ''}\n >\n \n \n \n {genre.title}\n \n
\n \n {genre.flashcardsCount.toLocaleString()} ESL flashcards\n \n
\n \n ))}\n
\n )\n}\n","import useMedia from 'use-media'\n\nimport { mediaQueries } from '@redriverpress/system'\n\nimport GenresDefault from './GenresDefault'\nimport GenresSidebar from './GenresSidebar'\n\nexport default function Genres() {\n const isMd = useMedia(mediaQueries.md)\n\n return isMd ? : \n}\n","import PropTypes from 'prop-types'\nimport { connectStateResults } from 'react-instantsearch-dom'\n\nimport { Box, Heading, Text } from '@redriverpress/system'\nimport { InfiniteHits } from 'Packages/search'\n\nimport Flashcard from './Flashcard'\nimport FlashcardsGrid from './FlashcardsGrid'\n\nconst FlashcardHit = ({ hit, userHasAccess }) => {\n // Injecting `userHasAccess` to InfiniteHits' hitComponent was causing a memory overload,\n // therefore we're getting `userHasAccess` via the hook for search result flashcards instead.\n // (In other places where the Flashcard component is used, it's easier to just pass this prop down.)\n\n const serializedFlashcard = {\n ...hit,\n categoryTitle: hit.category_title,\n image: hit.image_url,\n imageGrayscale: hit.image_grayscale_url,\n thumbnail: hit.thumbnail_url,\n }\n\n return (\n \n )\n}\n\nFlashcardHit.propTypes = {\n hit: PropTypes.shape({\n category_title: PropTypes.string.isRequired,\n image_url: PropTypes.string.isRequired,\n image_grayscale_url: PropTypes.string.isRequired,\n thumbnail_url: PropTypes.string.isRequired,\n }).isRequired,\n userHasAccess: PropTypes.bool.isRequired,\n}\n\nfunction FlashcardSearchResults({ searchState, searchResults, userHasAccess }) {\n const nbHits = searchResults && searchResults.nbHits\n const { query } = searchState\n\n return (\n \n {searchResults && (\n \n \n Search results\n \n \n {nbHits?.toLocaleString()} match{nbHits !== 1 && 'es'} for{' '}\n \n {query}\n \n \n \n )}\n \n \n )\n}\n\nFlashcardSearchResults.defaultProps = {\n searchResults: null,\n}\n\nFlashcardSearchResults.propTypes = {\n searchState: PropTypes.shape({\n query: PropTypes.string,\n }).isRequired,\n searchResults: PropTypes.shape({\n nbHits: PropTypes.number,\n }),\n userHasAccess: PropTypes.bool.isRequired,\n}\n\nexport default connectStateResults(FlashcardSearchResults)\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport styled from 'styled-components'\nimport { AnimatePresence } from 'framer-motion'\nimport { arrayMove } from '@dnd-kit/sortable'\nimport { createPortal } from 'react-dom'\nimport { useMedia } from 'use-media'\nimport { useEffect, useState } from 'react'\n\nimport {\n Box,\n Container,\n Heading,\n Image,\n Icon,\n HR,\n MonoButton,\n MotionBox,\n Text,\n mediaQueries,\n} from '@redriverpress/system'\n\nimport { ManageFlashcards } from 'Packages/flashcards'\n\nimport useSelection from '../../hooks/useSelection'\n\nconst DrawerTop = styled(Box).attrs({\n bg: 'black',\n color: 'white',\n display: 'flex',\n alignItems: 'baseline',\n py: 2,\n px: 3,\n boxShadow: 4,\n})`\n border-top-left-radius: ${props => props.theme.radii.rounded};\n border-top-right-radius: ${props => props.theme.radii.rounded};\n`\n\nconst previewTileSize = '4rem'\n\nconst DrawerPreview = styled(Box).attrs(props => ({\n bg: 'black',\n color: 'white',\n display: 'grid',\n gridTemplateColumns: `repeat(${props.columns}, ${previewTileSize})`,\n justifyContent: 'space-between',\n p: 3,\n boxShadow: 4,\n}))`\n border-bottom-left-radius: ${props => props.theme.radii.rounded};\n border-bottom-right-radius: ${props => props.theme.radii.rounded};\n`\n\nconst RemoveIconOverlay = styled(Box).attrs({\n bg: 'rgba(0,0,0,0.5)',\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n})`\n inset: 0;\n transition: 0.25s ease;\n`\n\nconst RemoveIconWrapper = styled(Box).attrs({\n size: '2rem',\n background: 'white',\n borderRadius: 'circular',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n})`\n transition: 0.15s ease-in;\n`\n\nconst PreviewFlashcardButton = styled.button`\n appearance: none;\n border: none;\n border-radius: ${props => props.theme.radii.rounded};\n background: ${props => props.theme.colors.white};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n width: ${previewTileSize};\n height: ${previewTileSize};\n position: relative;\n\n ${RemoveIconOverlay} {\n opacity: 0;\n }\n\n ${RemoveIconWrapper} {\n transform: scale(0.666);\n }\n\n &:hover ${RemoveIconOverlay}, &:focus ${RemoveIconOverlay} {\n opacity: 1;\n }\n\n &:hover ${RemoveIconWrapper}, &:focus ${RemoveIconWrapper} {\n transform: scale(1);\n }\n`\n\nconst DrawerContents = styled(Box).attrs({\n boxShadow: 4,\n maxHeight: '66vh',\n overflow: 'scroll',\n})`\n border-bottom-left-radius: ${props => props.theme.radii.rounded};\n border-bottom-right-radius: ${props => props.theme.radii.rounded};\n -webkit-overflow-scrolling: touch;\n`\n\nexport default function SelectionDrawer({\n onSaveAction,\n onPrintAction,\n deleteAllAction,\n}) {\n const {\n selection,\n removeFromSelection,\n editSelectionUserTitle,\n setSelection,\n } = useSelection()\n\n const [drawerOpen, setDrawerOpen] = useState(false)\n\n const isLg = useMedia(mediaQueries.lg)\n\n const previewLimit = isLg ? 11 : 6\n const previewSelection = R.take(previewLimit, selection)\n\n useEffect(() => {\n // Close the drawer if the selection is cleared, so that it doesn't reopen\n // immediately when a new selection is made\n selection.length === 0 && setDrawerOpen(false)\n }, [selection])\n\n return createPortal(\n \n {selection.length && (\n \n \n \n \n \n Unsaved Selection\n \n {isLg && (\n \n {selection.length} flashcard{selection.length !== 1 && 's'}\n \n )}\n \n \n \n Save to Set…\n \n \n \n Print…\n \n setDrawerOpen(x => !x)}>\n \n Manage\n \n \n \n \n\n
\n\n {drawerOpen ? (\n \n removeFromSelection([id])}\n onRename={editSelectionUserTitle}\n onReorder={({ flashcards, oldIndex, newIndex }) =>\n setSelection(arrayMove(flashcards, oldIndex, newIndex))\n }\n />\n \n ) : (\n \n {previewSelection.map(fc => (\n \n removeFromSelection([fc.id])}\n >\n \n \n \n \n \n \n \n \n ))}\n {selection.length > previewSelection.length && (\n \n +{selection.length - previewSelection.length}\n
\n more\n
\n )}\n \n )}\n \n
\n \n )}\n
,\n document.body\n )\n}\n\nSelectionDrawer.propTypes = {\n onPrintAction: PropTypes.func.isRequired,\n onSaveAction: PropTypes.func.isRequired,\n}\n","import styled from 'styled-components'\nimport { arrayMove } from '@dnd-kit/sortable'\nimport { useMedia } from 'use-media'\nimport { useState } from 'react'\n\nimport {\n Box,\n Button,\n ContextualActionBar,\n Dialog,\n Icon,\n MoreOptions,\n Text,\n TransparentButton,\n mediaQueries,\n} from '@redriverpress/system'\n\nimport {\n ManageFlashcardsDialog,\n PrintFlashcardsDialog,\n SaveFlashcardsToSetDialog,\n} from 'Packages/flashcards'\n\nimport SelectionDrawer from './SelectionDrawer'\nimport useSelection from '../../hooks/useSelection'\n\nconst ClearSelectionButton = styled(TransparentButton).attrs({\n borderRadius: 'rounded',\n color: 'red900',\n fontSize: 0,\n})`\n &:focus {\n box-shadow: 0 0 0 2px ${props => props.theme.colors.red900};\n }\n`\n\nexport default function SelectionManagerDefault() {\n const isMd = useMedia(mediaQueries.md)\n\n const {\n selection,\n setSelection,\n editSelectionUserTitle,\n removeFromSelection,\n clearSelection,\n } = useSelection()\n\n const [saveSelectionDialogOpen, setSaveSelectionDialogOpen] = useState(false)\n const [manageDialogOpen, setManageDialogOpen] = useState(false)\n const [printDialogOpen, setPrintDialogOpen] = useState(false)\n const [clearSelectionDialogOpen, setClearSelectionDialogOpen] = useState(\n false\n )\n\n const handleClearSelection = () => {\n clearSelection()\n setClearSelectionDialogOpen(false)\n setManageDialogOpen(false)\n }\n\n const ClearSelectionNode = (\n setClearSelectionDialogOpen(open)}\n >\n \n \n \n \n \n Clear Selection\n \n \n \n \n \n \n \n \n \n \n Are you sure you want to clear your selection?\n \n \n \n setClearSelectionDialogOpen(false)}\n >\n \n No, Keep\n \n \n \n \n \n \n \n )\n\n return (\n <>\n {isMd ? (\n setSaveSelectionDialogOpen(true)}\n onPrintAction={() => setPrintDialogOpen(true)}\n deleteAllAction={ClearSelectionNode}\n />\n ) : (\n <>\n \n \n {`${selection.length} ${\n selection.length === 1 ? 'flashcard' : 'flashcards'\n }`}\n {' '}\n selected\n \n }\n isOpen={Boolean(selection.length) && !manageDialogOpen}\n action={\n \n setSaveSelectionDialogOpen(true)}\n />\n setPrintDialogOpen(true)}\n />\n setManageDialogOpen(true)}\n />\n \n }\n />\n\n setManageDialogOpen(open)}\n onClose={() => setManageDialogOpen(false)}\n deleteAllAction={ClearSelectionNode}\n flashcards={selection}\n onRemove={id => removeFromSelection([id])}\n onRename={editSelectionUserTitle}\n onReorder={({ flashcards, oldIndex, newIndex }) =>\n setSelection(arrayMove(flashcards, oldIndex, newIndex))\n }\n title='Unsaved selection'\n primaryActionLabel={\n <>\n \n Save to Set\n \n }\n onPrimaryAction={() => setSaveSelectionDialogOpen(true)}\n onPrint={() => {}}\n />\n \n )}\n\n setSaveSelectionDialogOpen(false)}\n onSaved={clearSelection}\n onOpenChange={open => setSaveSelectionDialogOpen(open)}\n open={saveSelectionDialogOpen}\n />\n\n setPrintDialogOpen(open)}\n />\n \n )\n}\n","import PropTypes from 'prop-types'\nimport { Route, Switch, useLocation } from 'react-router-dom'\nimport { connectStateResults } from 'react-instantsearch-dom'\n\nimport {\n Box,\n Columns,\n Col,\n Container,\n LoadingPlane,\n} from '@redriverpress/system'\nimport { SearchBox } from 'Packages/search'\nimport { usePathnameTracking } from 'Packages/track'\n\nimport AllFlashcardsGenre from './components/Genre/AllFlashcardsGenre'\nimport Genre from './components/Genre/Genre'\nimport Genres from './components/Genres/Genres'\nimport Results from './components/FlashcardsSearchResults'\nimport SelectionManager from './components/SelectionManager/SelectionManager'\n\nimport {\n ALL_FLASHCARDS_PATH,\n GENRE_AND_CATEGORY_PATH,\n GENRE_PATH,\n} from './constants/routes'\nimport { useMediaGallery } from '../contexts'\n\nfunction Flashcards({ searchState }) {\n const [\n {\n userAccess: { userIsLoading, userHasAccess, userLoggedIn },\n },\n ] = useMediaGallery()\n const { search } = useLocation()\n usePathnameTracking()\n\n return (\n <>\n {/* \n */}\n \n \n \n \n \n {userIsLoading ? (\n \n \n \n ) : (\n \n \n \n \n \n \n \n {/* Results shown only when search state AND query param are set. */}\n {/* This is to prevent excessive rerenders in between either of these being updated. */}\n {search.includes('query=') && searchState.query ? (\n \n ) : (\n \n \n \n \n \n \n \n \n )}\n \n \n )}\n \n {userHasAccess && }\n \n \n )\n}\n\nFlashcards.propTypes = {\n searchState: PropTypes.shape({\n query: PropTypes.string,\n }).isRequired,\n}\n\nexport default connectStateResults(Flashcards)\n","import getWithXHR from 'Common/utils/getWithXHR'\nimport { getVideoGenreUrl } from '../../endpoints'\n\nconst getVideoGenre = genreId => getWithXHR(getVideoGenreUrl(genreId))\n\nexport default getVideoGenre\n","import { useParams } from 'react-router-dom'\nimport { useQuery } from 'react-query'\n\nimport getVideoGenre from '../services/getVideoGenre'\n\nexport default function useVideoGenre(genreId) {\n const { categorySlug } = useParams()\n\n const { isLoading, data: genre } = useQuery(\n ['video_genre', genreId],\n () => getVideoGenre(genreId),\n {\n enabled: !!genreId,\n }\n )\n\n const activeCategory =\n genre?.videoCategories?.find(c => c.slug === categorySlug) ||\n genre?.videoCategories?.[0]\n\n return {\n isLoading,\n genre,\n activeCategory,\n }\n}\n","import getWithXHR from 'Common/utils/getWithXHR'\nimport { getVideoGenresUrl } from '../../endpoints'\n\nconst getVideoGenres = () => getWithXHR(getVideoGenresUrl)\n\nexport default getVideoGenres\n","import { useParams } from 'react-router-dom'\nimport { useQuery } from 'react-query'\n\nimport getVideoGenres from '../services/getVideoGenres'\n\nexport default function useVideoGenres() {\n const { isLoading, data: genres } = useQuery('video_genres', getVideoGenres)\n\n const { genreSlug } = useParams()\n\n const activeGenre = genres?.find(g => g.slug === genreSlug) || genres?.[0]\n\n const activeGenreIndex = genres?.findIndex(g => g === activeGenre)\n\n const previousGenre =\n genres?.[activeGenreIndex - 1] || genres?.[genres?.length - 1]\n const nextGenre = genres?.[activeGenreIndex + 1] || genres?.[0]\n\n return {\n isLoading,\n genres,\n activeGenre,\n previousGenre,\n nextGenre,\n }\n}\n","import { useLocation } from 'react-router-dom'\nimport { useEffect, useState } from 'react'\n\nimport { Box, Dialog, Icon, Heading, LoadingPlane } from '@redriverpress/system'\n\nimport NavModalTrigger from '../../../common/components/NavModalTrigger'\nimport useGenre from '../../hooks/useVideoGenre'\nimport useGenres from '../../hooks/useVideoGenres'\n\nimport {\n Content,\n GenreLink,\n TitleBar,\n} from '../../../common/components/defaultCommon'\n\nexport default function VideoGenreCategoriesDefault() {\n const { pathname } = useLocation()\n\n const { isLoading: isLoadingGenres, activeGenre } = useGenres()\n\n const { isLoading: isLoadingGenre, genre, activeCategory } = useGenre(\n activeGenre?.id\n )\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n useEffect(() => {\n // Close Categories dialog when location path changes (result of selecting a Category)\n dialogOpen && setDialogOpen(false)\n }, [pathname])\n\n return isLoadingGenres || isLoadingGenre ? (\n \n \n \n ) : (\n \n setDialogOpen(isOpen)}\n >\n \n \n \n\n \n \n \n \n \n \n \n \n )\n}\n","export const GENRE_AND_CATEGORY_PATH = '/videos/:genreSlug/:categorySlug'\nexport const GENRE_PATH = '/videos/:genreSlug'\nexport const ALL_VIDEOS_PATH = '/videos'\n","import { Route, useLocation } from 'react-router-dom'\nimport { useEffect, useState } from 'react'\n\nimport { Box, Dialog, Icon, Heading, LoadingPlane } from '@redriverpress/system'\n\nimport VideoGenreCategoriesDefault from './VideoGenreCategoriesDefault'\nimport NavModalTrigger from '../../../common/components/NavModalTrigger'\nimport useGenres from '../../hooks/useVideoGenres'\n\nimport {\n Content,\n GenreLink,\n TitleBar,\n} from '../../../common/components/defaultCommon'\nimport { GENRE_AND_CATEGORY_PATH, GENRE_PATH } from '../../constants/routes'\n\nexport default function GenresDefault() {\n const { isLoading, genres, activeGenre } = useGenres()\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const { pathname } = useLocation()\n\n useEffect(() => {\n // Close Genres dialog when location path changes (result of selecting a GenreLink)\n dialogOpen && setDialogOpen(false)\n }, [pathname])\n\n return isLoading ? (\n \n \n \n ) : (\n \n setDialogOpen(isOpen)}\n >\n \n \n \n \n \n\n \n \n\n \n \n \n \n \n\n \n \n \n \n )\n}\n","import styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Text, media } from '@redriverpress/system'\n\nimport GenresSidebarSkeleton from '../../../common/components/GenresSidebarSkeleton'\nimport useGenres from '../../hooks/useVideoGenres'\n\nconst GenreLink = styled(NavLink)`\n background: white;\n border-radius: ${props => props.theme.radii.rounded};\n display: flex;\n font-size: ${props => props.theme.fontSizes[0]};\n padding: ${props => props.theme.space[2]};\n margin-bottom: ${props => props.theme.space[2]};\n text-decoration: none; /* override default link style */\n\n ${media.lg`\n font-size: ${props => props.theme.fontSizes[1]};\n padding: ${props => props.theme.space[3]};\n `}\n\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n\n &.active {\n background: linear-gradient(\n to left,\n ${props => props.theme.colors.blue500} 0 0.5rem,\n white 0.5rem 100%\n );\n }\n`\n\nexport default function GenresSidebar() {\n const { isLoading, genres } = useGenres()\n\n return isLoading ? (\n \n ) : (\n \n {genres.map(genre => (\n !!match && location.search === ''}\n >\n \n \n {genre.title}\n \n
\n \n {genre.videosCount.toLocaleString()} ESL videos\n \n
\n \n ))}\n
\n )\n}\n","import useMedia from 'use-media'\n\nimport { mediaQueries } from '@redriverpress/system'\n\nimport VideoGenresDefaultSidebar from './VideoGenresDefaultSidebar'\nimport VideoGenresMdSidebar from './VideoGenresMdSidebar'\n\nexport default function Genres() {\n const isMd = useMedia(mediaQueries.md)\n\n return isMd ? : \n}\n","import { Link } from 'react-router-dom'\n\nimport {\n Box,\n Columns,\n Col,\n Heading,\n IconButton,\n Skeleton,\n Text,\n} from '@redriverpress/system'\nimport useVideoGenres from '../../hooks/useVideoGenres'\n\nconst GenreHeaderSkeleton = () => (\n \n {/* Heading */}\n \n {/* Videos count */}\n \n \n)\n\nexport default function GenreHeader() {\n const { activeGenre, previousGenre, nextGenre } = useVideoGenres()\n\n if (activeGenre) {\n return (\n \n \n \n {activeGenre.title}\n \n {`${activeGenre.videosCount.toLocaleString()} ESL videos`}\n \n \n \n \n \n \n )\n }\n return \n}\n","import PropTypes from 'prop-types'\n\nexport default {\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n image: PropTypes.string.isRequired,\n category: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired,\n }).isRequired,\n genre: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired,\n }).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport {\n Box,\n Heading,\n Image,\n Link,\n Text,\n TransparentButton,\n} from '@redriverpress/system'\nimport videoPropShape from '../constants/videoPropShape'\nimport { routes } from '../../constants'\n\nconst CardContent = styled(Box).attrs({\n borderRadius: 'small',\n color: 'black',\n p: 0,\n width: 1,\n height: '100%',\n bg: 'white',\n})`\n cursor: pointer;\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n\n &:after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: ${props => props.theme.radii.rounded};\n box-shadow: ${props => props.theme.shadows[3]};\n opacity: 0;\n transition: 0.15s ease-in;\n }\n\n &:hover:after,\n &:focus:after {\n opacity: 1;\n }\n`\n\n// This component should render a Link or a Div according to the user access status:\n// They must be logged in and have a paid subscription.\nconst Wrapper = ({ video, isUserAllowed, openInfoModal, children }) =>\n isUserAllowed ? (\n \n {children}\n \n ) : (\n \n {children}\n \n )\n\nWrapper.propTypes = {\n video: PropTypes.shape(videoPropShape).isRequired,\n isUserAllowed: PropTypes.bool.isRequired,\n openInfoModal: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n}\n\nexport default function VideoCard({\n video,\n isUserAllowed,\n openInfoModal,\n showCategory,\n}) {\n return (\n \n \n \n \n \n \n {video.title}\n \n {showCategory && video?.category?.title && (\n {video?.category?.title}\n )}\n {video.subtitle && (\n \n {video.subtitle}\n \n )}\n \n \n \n \n )\n}\n\nVideoCard.defaultProps = {\n showCategory: false,\n}\n\nVideoCard.propTypes = {\n video: PropTypes.shape(videoPropShape).isRequired,\n isUserAllowed: PropTypes.bool.isRequired,\n openInfoModal: PropTypes.func.isRequired,\n showCategory: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\n\nimport { Box } from '@redriverpress/system'\n\nexport default function VideosGrid({ children }) {\n return (\n \n {children}\n \n )\n}\n\nVideosGrid.propTypes = {\n children: PropTypes.node.isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\n\nimport { Box, LoadingButton, LoadingPlane } from '@redriverpress/system'\n\nimport GenreHeader from './GenreHeader'\n\nimport { useMediaGallery } from '../../../contexts'\n\nimport useVideoGenres from '../../hooks/useVideoGenres'\n\nimport VideoCard from '../VideoCard'\nimport VideosGrid from '../VideosGrid'\nimport VideoAccessDialog from '../../../common/components/VideoAccessDialog'\n\nexport default function AllVideosGenre({ userLoggedIn, userHasAccess }) {\n const [{ randomVideos }, fetchMedia] = useMediaGallery()\n const { data: videos, currentPage, totalPages } = randomVideos\n const [fetchPending, setFetchPending] = useState(false)\n const [isAccessDialogOpen, setIsAccessDialogOpen] = useState(false)\n\n const handleFetch = async () => {\n setFetchPending(true)\n await fetchMedia('videos')\n setFetchPending(false)\n }\n\n const { genres } = useVideoGenres()\n\n if (genres && videos.length > 0) {\n return (\n <>\n \n \n {videos.map(video => (\n setIsAccessDialogOpen(true)}\n />\n ))}\n \n {currentPage !== totalPages && (\n \n \n View More\n \n \n )}\n setIsAccessDialogOpen(open)}\n userLoggedIn={userLoggedIn}\n />\n \n )\n }\n return (\n \n \n \n )\n}\n\nAllVideosGenre.propTypes = {\n userLoggedIn: PropTypes.bool.isRequired,\n userHasAccess: PropTypes.bool.isRequired,\n}\n","import getWithXHR from 'Common/utils/getWithXHR'\nimport { getVideoCategoryUrl } from '../../endpoints'\n\nconst getCategory = categoryId => getWithXHR(getVideoCategoryUrl(categoryId))\n\nexport default getCategory\n","import { useQuery } from 'react-query'\n\nimport getCategory from '../services/getVideoCategory'\n\nexport default function useVideoCategory(categoryId) {\n const { isLoading, data: category } = useQuery(\n ['video_category', categoryId],\n () => getCategory(categoryId),\n {\n enabled: !!categoryId,\n }\n )\n\n return {\n isLoading,\n category,\n }\n}\n","import { Skeleton } from '@redriverpress/system'\n\nimport VideosGrid from '../VideosGrid'\n\nconst placeholders = [...new Array(24)].map((_, index) => ({ key: index }))\n\nexport default function VideosSkeleton() {\n return (\n \n {placeholders.map(ph => (\n \n ))}\n \n )\n}\n","import { Box, Heading, Skeleton, Text } from '@redriverpress/system'\n\nimport { renderInlineMarkdown } from 'Common/utils/markdown'\n\nimport useVideoCategory from '../../hooks/useVideoCategory'\nimport useVideoGenre from '../../hooks/useVideoGenre'\nimport useVideoGenres from '../../hooks/useVideoGenres'\n\nexport default function CategoryHeader() {\n const { activeGenre } = useVideoGenres()\n const { activeCategory } = useVideoGenre(activeGenre?.id)\n const { isLoading, category } = useVideoCategory(activeCategory?.id)\n\n return isLoading || !category ? (\n \n \n {/* Title */}\n \n \n \n {/* Video count */}\n \n \n \n \n {/* Description */}\n \n \n \n \n \n ) : (\n \n \n \n {category.title}\n \n \n {category.videosCount.toLocaleString()} video\n {category.videosCount !== 1 && 's'}\n \n \n {category.description && (\n \n )}\n \n )\n}\n","import R from 'ramda'\nimport { Route, Switch, useParams } from 'react-router-dom'\nimport { useEffect, useState } from 'react'\nimport { useMedia } from 'use-media'\n\nimport { Box, Button, Icon, HR, mediaQueries } from '@redriverpress/system'\n\nimport CategoryChip from '../../../common/components/CategoryChip'\n\nimport useVideoGenre from '../../hooks/useVideoGenre'\nimport useVideoGenres from '../../hooks/useVideoGenres'\nimport useVideoCategory from '../../hooks/useVideoCategory'\nimport GenreHeader from './GenreHeader'\nimport VideosSkeleton from '../skeletons/VideosSkeleton'\nimport VideosGrid from '../VideosGrid'\nimport VideoCard from '../VideoCard'\nimport CategoryHeader from './CategoryHeader'\nimport { GENRE_AND_CATEGORY_PATH, GENRE_PATH } from '../../constants/routes'\nimport VideoAccessDialog from '../../../common/components/VideoAccessDialog'\n\nconst GENRE_CHUNK = 36\n\nexport default function Genre({ userLoggedIn, userHasAccess }) {\n const isMd = useMedia(mediaQueries.md)\n const { genreSlug } = useParams()\n const { activeGenre } = useVideoGenres()\n const { isLoading: isLoadingGenre, genre, activeCategory } = useVideoGenre(\n activeGenre?.id\n )\n const { category } = useVideoCategory(activeCategory?.id)\n const [isAccessDialogOpen, setIsAccessDialogOpen] = useState(false)\n\n /**\n * Some genres might contain hundreds of videos; categories are usually < 100.\n * When showing all videos in a genre, only show 36 videos at a time,\n * to prevent performance slowdowns from React having to deal with hundreds of\n * videos (and their modals) all at once.\n */\n const [genreAmount, setGenreAmount] = useState(GENRE_CHUNK)\n\n const incrementGenreAmount = () =>\n setGenreAmount(amount => amount + GENRE_CHUNK)\n\n const chunkedGenreVideos = genre?.videos\n ? R.take(genreAmount, genre?.videos)\n : []\n\n useEffect(() => {\n // Reset genreAmount when switching genres\n setGenreAmount(GENRE_CHUNK)\n }, [genreSlug])\n\n return (\n <>\n \n \n \n \n {isLoadingGenre || !genre ? (\n \n ) : (\n \n {isMd && (\n <>\n \n {genre.videoCategories.map(cat => (\n \n {cat.title} ({cat.videosCount})\n \n ))}\n \n
\n \n )}\n \n \n \n {category && (\n \n {category.videos.map(video => (\n setIsAccessDialogOpen(true)}\n />\n ))}\n \n )}\n \n\n \n \n {chunkedGenreVideos.map(video => (\n setIsAccessDialogOpen(true)}\n />\n ))}\n \n\n {genreAmount < genre?.videos?.length && (\n \n \n \n )}\n \n \n
\n )}\n \n setIsAccessDialogOpen(open)}\n userLoggedIn={userLoggedIn}\n />\n \n )\n}\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\n\nimport VideoAccessDialog from '../../common/components/VideoAccessDialog'\nimport VideoCard from './VideoCard'\n\nexport default function VideoCardHit({ hit, userHasAccess, userLoggedIn }) {\n const [isAccessDialogOpen, setIsAccessDialogOpen] = useState(false)\n\n const serializedVideo = {\n ...hit,\n title: hit.title,\n image: hit.image_url,\n subtitle: hit.subtitle,\n category: hit.category,\n genre: hit.genre,\n }\n\n return (\n <>\n setIsAccessDialogOpen(true)}\n showCategory\n />\n\n setIsAccessDialogOpen(open)}\n userLoggedIn={userLoggedIn}\n />\n \n )\n}\n\nVideoCardHit.propTypes = {\n hit: PropTypes.shape({\n category_title: PropTypes.string.isRequired,\n image_url: PropTypes.string.isRequired,\n image_grayscale_url: PropTypes.string.isRequired,\n thumbnail_url: PropTypes.string.isRequired,\n }).isRequired,\n userHasAccess: PropTypes.bool.isRequired,\n openInfoModal: PropTypes.func.isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { connectStateResults } from 'react-instantsearch-dom'\nimport { Box, Heading, Text } from '@redriverpress/system'\n\nimport { InfiniteHits } from 'Packages/search'\n\nimport VideosGrid from './VideosGrid'\nimport VideoCardHit from './VideoHit'\n\nfunction VideosSearchResults({\n searchState,\n searchResults,\n userHasAccess,\n userLoggedIn,\n}) {\n const nbHits = searchResults && searchResults.nbHits\n const { query } = searchState\n\n return (\n \n {searchResults && (\n \n \n Search results\n \n \n {nbHits?.toLocaleString()} match{nbHits !== 1 && 'es'} for{' '}\n \n {query}\n \n \n \n )}\n \n \n )\n}\n\nVideosSearchResults.defaultProps = {\n searchResults: null,\n}\n\nVideosSearchResults.propTypes = {\n searchState: PropTypes.shape({\n query: PropTypes.string,\n }).isRequired,\n searchResults: PropTypes.shape({\n nbHits: PropTypes.number,\n }),\n userHasAccess: PropTypes.bool.isRequired,\n userLoggedIn: PropTypes.bool.isRequired,\n}\n\nexport default connectStateResults(VideosSearchResults)\n","import PropTypes from 'prop-types'\nimport { Route, Switch, useLocation } from 'react-router-dom'\nimport { connectStateResults } from 'react-instantsearch-dom'\n\nimport {\n Box,\n Col,\n Columns,\n Container,\n LoadingPlane,\n} from '@redriverpress/system'\nimport { SearchBox } from 'Packages/search'\n\nimport Genres from './components/Genres/Genres'\nimport AllVideosGenre from './components/Genre/AllVideosGenre'\nimport Genre from './components/Genre/Genre'\nimport {\n ALL_VIDEOS_PATH,\n GENRE_AND_CATEGORY_PATH,\n GENRE_PATH,\n} from './constants/routes'\nimport Results from './components/VideosSearchResults'\nimport { useMediaGallery } from '../contexts'\n\nconst Videos = ({ searchState }) => {\n const { search } = useLocation()\n\n const [\n {\n userAccess: { userIsLoading, userHasAccess, userLoggedIn },\n },\n ] = useMediaGallery()\n\n return (\n \n \n \n \n \n {userIsLoading ? (\n \n \n \n ) : (\n \n {/* Video Genres Sidebar */}\n \n \n \n \n \n {/* Video main section */}\n \n {/* Results shown only when search state AND query param are set. */}\n {/* This is to prevent excessive rerenders in between either of these being updated. */}\n {search.includes('query=') && searchState.query ? (\n \n ) : (\n \n \n \n \n \n \n \n \n )}\n \n \n )}\n \n \n )\n}\n\nVideos.propTypes = {\n searchState: PropTypes.shape({\n query: PropTypes.string,\n }).isRequired,\n}\n\nexport default connectStateResults(Videos)\n","import algoliaSearch from 'algoliasearch/lite'\nimport qs from 'qs'\nimport PropTypes from 'prop-types'\nimport { InstantSearch } from 'react-instantsearch-dom'\nimport { useEffect, useRef, useState } from 'react'\nimport { useLocation, useHistory } from 'react-router-dom'\n\nconst searchClient = algoliaSearch(\n process.env.ALGOLIA_APPLICATION_ID,\n process.env.ALGOLIA_SEARCH_ONLY_KEY\n)\n\nconst algoliaEnv = process.env.ALGOLIA_ENV\nconst flashcardsIndex = `Flashcards_${algoliaEnv}`\n\n// Omit `page` from search state\nconst createURL = ({ page, ...searchState }) => `?${qs.stringify(searchState)}`\n\n// https://www.algolia.com/doc/guides/building-search-ui/going-further/routing-urls/react/\nconst urlToSearchState = location => qs.parse(location.search.slice(1))\nconst searchStateToUrl = searchState =>\n searchState ? createURL(searchState) : ''\n\nconst searchDebounce = 400\n\nexport default function FlashcardsSearchConfig({ children }) {\n const history = useHistory()\n const location = useLocation()\n\n const [searchState, setSearchState] = useState(urlToSearchState(location))\n const setStateId = useRef()\n\n const onSearchStateChange = updatedSearchState => {\n clearTimeout(setStateId.current)\n\n setStateId.current = setTimeout(() => {\n // Set the query params with the search term, if any; otherwise, clear the query params\n history.push({\n search: updatedSearchState.query\n ? searchStateToUrl(updatedSearchState)\n : null,\n })\n }, searchDebounce)\n\n return setSearchState(updatedSearchState)\n }\n\n // Sync the search state on location changes.\n // This handles clearing the search state when clicking away from results,\n // as well as syncing the search state when browser back/forward buttons are used.\n useEffect(() => {\n setSearchState(urlToSearchState(location))\n }, [location])\n\n return (\n \n {children}\n \n )\n}\n\nFlashcardsSearchConfig.propTypes = {\n children: PropTypes.node.isRequired,\n}\n","import algoliaSearch from 'algoliasearch/lite'\nimport qs from 'qs'\nimport PropTypes from 'prop-types'\nimport { InstantSearch } from 'react-instantsearch-dom'\nimport { useEffect, useRef, useState } from 'react'\nimport { useLocation, useHistory } from 'react-router-dom'\n\nconst searchClient = algoliaSearch(\n process.env.ALGOLIA_APPLICATION_ID,\n process.env.ALGOLIA_SEARCH_ONLY_KEY\n)\n\nconst algoliaEnv = process.env.ALGOLIA_ENV\nconst videosIndex = `videos_${algoliaEnv}`\n\n// Omit `page` from search state\nconst createURL = ({ page, ...searchState }) => `?${qs.stringify(searchState)}`\n\n// https://www.algolia.com/doc/guides/building-search-ui/going-further/routing-urls/react/\nconst urlToSearchState = location => qs.parse(location.search.slice(1))\nconst searchStateToUrl = searchState =>\n searchState ? createURL(searchState) : ''\n\nconst searchDebounce = 400\n\nexport default function VideosSearchConfig({ children }) {\n const history = useHistory()\n const location = useLocation()\n\n const [searchState, setSearchState] = useState(urlToSearchState(location))\n const setStateId = useRef()\n\n const onSearchStateChange = updatedSearchState => {\n clearTimeout(setStateId.current)\n\n setStateId.current = setTimeout(() => {\n // Set the query params with the search term, if any; otherwise, clear the query params\n history.push({\n search: updatedSearchState.query\n ? searchStateToUrl(updatedSearchState)\n : null,\n })\n }, searchDebounce)\n\n return setSearchState(updatedSearchState)\n }\n\n // Sync the search state on location changes.\n // This handles clearing the search state when clicking away from results,\n // as well as syncing the search state when browser back/forward buttons are used.\n useEffect(() => {\n setSearchState(urlToSearchState(location))\n }, [location])\n\n return (\n \n {children}\n \n )\n}\n\nVideosSearchConfig.propTypes = {\n children: PropTypes.node.isRequired,\n}\n","import { Route, Switch } from 'react-router-dom'\n\nimport { usePathnameTracking } from 'Packages/track'\n\nimport Flashcards from './flashcards/Index'\nimport Videos from './videos/Index'\nimport FlashcardsSearchConfig from './flashcards/components/FlashcardsSearchConfig'\nimport VideosSearchConfig from './videos/components/VideosSearchConfig'\n\nimport { routes } from './constants'\n\nexport default function Routes() {\n usePathnameTracking()\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","import WebFont from 'webfontloader'\nimport { BrowserRouter as Router, Route } from 'react-router-dom'\nimport { QueryClient, QueryClientProvider } from 'react-query'\nimport { QueryParamProvider } from 'use-query-params'\n\nimport { Loading, Toaster } from '@redriverpress/system'\nimport { AsyncModalFoldersProvider } from 'Packages/folders'\n\nimport ElliiThemeProvider from 'Common/components/ElliiThemeProvider'\nimport { TWENTY_FOUR_HOURS_IN_MS } from 'Common/utils/datetime'\n\nimport MediaHeader from './common/components/MediaHeader'\nimport Routes from './Routes'\nimport { MediaGalleryProvider } from './contexts'\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: false,\n staleTime: TWENTY_FOUR_HOURS_IN_MS,\n },\n },\n})\n\nexport default function App() {\n WebFont.load({\n google: {\n families: ['Open Sans:400,400italic,600,700,800', 'Quicksand:700'],\n },\n })\n\n return (\n \n \n }>\n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","import ReactDOM from 'react-dom'\n\nimport App from '../media/App'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const mountPoint = document.getElementById('root')\n\n ReactDOM.render(, mountPoint)\n})\n"],"sourceRoot":""}