{"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","PageHeader","title","description","mb","mt","PillTabs","FlashcardsGrid","children","display","gridTemplateColumns","gridGap","propTypes","PropTypes","node","isRequired","AccessDialog","onOpenChange","open","Root","Overlay","StyledContent","StyledTitle","as","my","justifyContent","secondary","mr","href","icon","pr","textAlign","fontWeight","color","func","bool","category","shape","id","number","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","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","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.38544ceac18d18cb3db3.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([1521,\"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 } from '@redriverpress/system'\n\nimport PillTabs from 'Common/components/PillTabs'\nimport PageHeader from 'Common/components/PageHeader'\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 \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 { ModalFoldersProvider } 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":""}