{"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 \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 \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 \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":""}