{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/react/media/video/services/getVideo.js","webpack:///./app/react/media/video/components/skeletons/VideoPlayerSkeleton.js","webpack:///./app/react/media/video/components/TeacherDiscretion.js","webpack:///./app/react/media/video/constants/VideoPropType.js","webpack:///./app/react/media/video/components/LessonCard.js","webpack:///./app/react/media/video/components/AddVideoToClassButton.js","webpack:///./app/react/media/video/components/VideoInfo.js","webpack:///./app/react/media/video/components/skeletons/UpNextSkeleton.js","webpack:///./app/react/media/video/components/UpcomingVideo.js","webpack:///./app/react/media/video/components/WatchNextSection.js","webpack:///./app/react/media/video/VideoPage.js","webpack:///./app/react/media/video/App.js","webpack:///./app/react/jsPacks/video.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","getVideo","videoParam","xhr","url","getVideoUrl","method","VideosSkeleton","height","maxHeight","width","borderRadius","motionVariants","open","opacity","overflow","closed","TeacherDiscretion","discretionText","props","useState","isInfoOpen","setIsInfoOpen","textAlign","type","compact","onClick","display","alignItems","justifyContent","px","icon","pr","fontWeight","mx","variants","animate","initial","pt","defaultProps","propTypes","PropTypes","string","videoShape","id","number","title","subtitle","slug","description","image","vimeoVideoId","position","discretion","bool","levels","clbLevels","cefrLevels","eldLevels","audiences","grades","tags","arrayOf","shape","taggings_count","category","genre","LessonShape","lesson_section_id","lesson_section_title","level_display","teacher_discretion","path","thumbnail_url","VideoDataShape","playlist","lessons","LessonCard","lesson","as","href","bg","flex","mb","boxShadow","src","size","pl","fontSize","color","isRequired","AddVideoToClassButton","video","isDialogOpen","setIsDialogOpen","small","style","whiteSpace","AddToClassDialog","onOpenChange","isOpen","onCancel","onSave","content","contentType","CONTENT_TYPES","VideoInfo","date","categoryTitle","onSaveToFolder","flexDirection","lineHeight","mt","ml","measure","displayName","func","placeholders","Array","map","_","index","UpNextSkeleton","ph","Thumbnail","styled","Box","attrs","ThumbOverlay","UpcomingVideoItem","minHeight","UpcomingVideo","thumbnailUrl","videoSlug","subheading","routes","reset","mr","className","alt","WatchNextSection","showSkeleton","sanitizeOptions","ADD_TAGS","ADD_ATTR","parseOptions","replace","domNode","attributesToProps","attribs","LightboxImage","VideoPage","useUserAccess","userIsLoading","userHasAccess","userLoggedIn","userData","isAccessDialogOpen","setIsAccessDialogOpen","useParams","videoData","setVideoData","moveItemModalOpen","setMoveItemModalOpen","addToast","useToast","sanitizedContent","DOMPurify","sanitize","getLevelsByType","levelPreference","useEffect","then","res","errors","action","location","reload","py","pb","Breadcrumbs","label","to","external","parse","gridTemplateColumns","gridColumnGap","gridRowGap","VideoAccessDialog","goBackToGallery","item","fileable","onClose","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","document","addEventListener","mountPoint","getElementById","ReactDOM","render"],"mappings":"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","file":"video.34194fbb5b7fe5201dc6.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\"video\": 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([1543,\"vendor\",\"package-common\",\"ellii\",\"react\",\"package-flashcards\",\"package-folders\",\"course~flashcardSets~folders~media~teacher/planner~video\",\"course~flashcardSets~folders~media~siteFolderModal~video\",\"media~video\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import xhr from 'Common/utils/xhr'\nimport { getVideoUrl } from '../../endpoints'\n\nconst getVideo = videoParam => {\n  return xhr({\n    url: getVideoUrl(videoParam),\n    method: 'GET',\n  })\n}\n\nexport default getVideo\n","import { Loading, Skeleton } from '@redriverpress/system'\n\nexport default function VideosSkeleton() {\n  return (\n    <>\n      <Skeleton\n        height='30vw'\n        maxHeight='22.5rem'\n        width='100%'\n        borderRadius='rounded'\n      />\n      <Loading height='20vh' />\n    </>\n  )\n}\n","import { useState } from 'react'\nimport PropTypes from 'prop-types'\n\nimport {\n  Box,\n  Icon,\n  Label,\n  MotionBox,\n  TransparentButton,\n  Text,\n} from '@redriverpress/system'\n\nconst motionVariants = {\n  open: {\n    height: 'auto',\n    opacity: 1,\n    overflow: 'visible',\n  },\n  closed: {\n    height: 0,\n    opacity: 0,\n    overflow: 'hidden',\n  },\n}\n\nexport default function TeacherDiscretion({ discretionText, ...props }) {\n  const [isInfoOpen, setIsInfoOpen] = useState(false)\n\n  return (\n    <Label\n      width={discretionText && '100%'}\n      textAlign='left'\n      type='warning'\n      compact={!!discretionText}\n      {...props}\n    >\n      {discretionText ? (\n        <>\n          <TransparentButton\n            width={1}\n            onClick={() => setIsInfoOpen(!isInfoOpen)}\n            display='flex'\n            alignItems='center'\n            justifyContent='space-between'\n            px={0}\n          >\n            <Box display='flex' justifyContent='center' alignItems='center'>\n              <Icon icon='exclamation-triangle' pr={2} />\n              <Text fontWeight='600'>Teacher discretion</Text>\n            </Box>\n            <Icon icon={isInfoOpen ? 'chevron-up' : 'chevron-down'} />\n          </TransparentButton>\n          <MotionBox\n            mx={-1}\n            px={1}\n            variants={motionVariants}\n            animate={isInfoOpen ? 'open' : 'closed'}\n            initial={false}\n          >\n            <Box fontWeight='400' pt={3}>\n              {discretionText}\n            </Box>\n          </MotionBox>\n        </>\n      ) : (\n        <Box display='flex' justifyContent='center' alignItems='center'>\n          <Icon icon='exclamation-triangle' pr={2} />\n          <Text fontWeight='600'>Teacher discretion</Text>\n        </Box>\n      )}\n    </Label>\n  )\n}\n\nTeacherDiscretion.defaultProps = {\n  discretionText: null,\n}\n\nTeacherDiscretion.propTypes = {\n  discretionText: PropTypes.string,\n}\n","import PropTypes from 'prop-types'\n\nconst videoShape = {\n  id: PropTypes.number,\n  title: PropTypes.string,\n  subtitle: PropTypes.string,\n  slug: PropTypes.string,\n  description: PropTypes.string,\n  image: PropTypes.string,\n  vimeoVideoId: PropTypes.number,\n  position: PropTypes.number,\n  discretion: PropTypes.bool,\n  discretionText: PropTypes.string,\n  levels: PropTypes.string,\n  clbLevels: PropTypes.string,\n  cefrLevels: PropTypes.string,\n  eldLevels: PropTypes.string,\n  audiences: PropTypes.string,\n  grades: PropTypes.string,\n  tags: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.number,\n      name: PropTypes.string,\n      taggings_count: PropTypes.number,\n    })\n  ),\n  category: PropTypes.shape({\n    id: PropTypes.number,\n    title: PropTypes.string,\n    slug: PropTypes.string,\n  }),\n  genre: PropTypes.shape({\n    id: PropTypes.number,\n    title: PropTypes.string,\n    slug: PropTypes.string,\n  }),\n}\n\nexport const LessonShape = {\n  id: PropTypes.number,\n  type: PropTypes.string,\n  title: PropTypes.string,\n  lesson_section_id: PropTypes.number,\n  lesson_section_title: PropTypes.string,\n  level_display: PropTypes.string,\n  teacher_discretion: PropTypes.bool,\n  path: PropTypes.string,\n  thumbnail_url: PropTypes.string,\n}\n\nexport const VideoDataShape = {\n  ...videoShape,\n  playlist: PropTypes.arrayOf(PropTypes.shape(videoShape)),\n  lessons: PropTypes.arrayOf(PropTypes.shape(LessonShape)),\n}\n","import PropTypes from 'prop-types'\n\nimport {\n  Box,\n  CoverImage,\n  Icon,\n  Heading,\n  Label,\n  Text,\n  TransparentButton,\n} from '@redriverpress/system'\n\nimport { LessonShape } from '../constants/VideoPropType'\n\nexport default function LessonCard({ lesson }) {\n  return (\n    <TransparentButton\n      as='a'\n      href={`/routes/lesson/${lesson.id}`}\n      p={[2, null, 3]}\n      bg='white'\n      display='flex'\n      alignItems='top'\n      flex='1 0 100%' // match height row\n      mb={2}\n      borderRadius='rounded'\n      boxShadow={2}\n    >\n      <CoverImage src={lesson.thumbnail_url} size={['3rem', null, '5rem']} />\n      <Box flex='1' pl={[2, null, 3]} fontSize={0}>\n        {lesson.teacher_discretion && (\n          <Label compact type='warning' mb={1}>\n            <Icon icon='exclamation-triangle' pr={2} />\n            Teacher Discretion\n          </Label>\n        )}\n        <Text color='gray700' fontWeight={600} mb={1}>\n          Lesson\n        </Text>\n        <Heading as='h5' mb={1} pr={4}>\n          {lesson.title}\n        </Heading>\n        <Text mb={2}>{lesson.lesson_section_title}</Text>\n        <Box display='flex' alignItems='center'>\n          <Icon icon='lightbulb' pr={2} />\n          {lesson.level_display}\n        </Box>\n      </Box>\n    </TransparentButton>\n  )\n}\n\nLessonCard.propTypes = {\n  lesson: PropTypes.shape(LessonShape).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport { Button, Box, Icon } from '@redriverpress/system'\n\nimport AddToClassDialog from 'Common/components/dialogs/AddToClassDialog'\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\n\nimport { VideoDataShape } from '../constants/VideoPropType'\n\nexport default function AddVideoToClassButton({ video }) {\n  const [isDialogOpen, setIsDialogOpen] = useState(false)\n\n  return (\n    <>\n      <Button onClick={() => setIsDialogOpen(true)} small>\n        <Box\n          display='flex'\n          alignItems='center'\n          style={{ whiteSpace: 'nowrap' }}\n        >\n          <Icon icon='plus' pr={2} />\n          Add to class\n        </Box>\n      </Button>\n\n      <AddToClassDialog\n        open={isDialogOpen}\n        onOpenChange={isOpen => setIsDialogOpen(isOpen)}\n        onCancel={() => setIsDialogOpen(false)}\n        onSave={() => setIsDialogOpen(false)}\n        content={video}\n        contentType={CONTENT_TYPES.video}\n      />\n    </>\n  )\n}\n\nAddVideoToClassButton.propTypes = {\n  video: PropTypes.shape(VideoDataShape).isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport {\n  Box,\n  Heading,\n  TransparentButton,\n  Icon,\n  Text,\n} from '@redriverpress/system'\nimport AddVideoToClassButton from './AddVideoToClassButton'\n\nexport default function VideoInfo({\n  id,\n  title,\n  subtitle,\n  date,\n  // levels,\n  description,\n  categoryTitle,\n  onSaveToFolder,\n}) {\n  return (\n    <>\n      <Box\n        display='flex'\n        justifyContent={[null, null, 'space-between']}\n        flexDirection={['column', null, 'row']}\n      >\n        <Box>\n          <Heading\n            as='h1'\n            fontSize={[2, null, 4]}\n            lineHeight='heading'\n            fontWeight='600'\n            mb={0}\n          >\n            {title}\n          </Heading>\n\n          <Text\n            mt={2}\n            mb={[2, null, 0]}\n            fontSize={[1, null, 2]}\n            fontWeight='600'\n          >\n            {categoryTitle}\n          </Text>\n\n          {/* Optional sub-heading */}\n          {subtitle && (\n            <Box fontSize={1} mt={2} display='flex' alignItems='center'>\n              <Text>{subtitle}</Text>\n            </Box>\n          )}\n          {/* Optional sub-heading */}\n          {date && (\n            <Box fontSize={1} mt={2} display='flex' alignItems='center'>\n              <Text>{date}</Text>\n            </Box>\n          )}\n        </Box>\n        <Box display='flex' alignItems='center'>\n          <Box mt={[3, null, 0]}>\n            <AddVideoToClassButton video={{ id, title }} />\n          </Box>\n\n          {/* Save video to folder Button */}\n          <TransparentButton\n            ml={2}\n            bg='white'\n            size='2.25rem'\n            borderRadius='small'\n            title='Save video to folder'\n            onClick={onSaveToFolder}\n            boxShadow={3}\n          >\n            <Icon icon='folder-open' />\n          </TransparentButton>\n        </Box>\n      </Box>\n\n      {/* {levels && <Text mt={2}>{levels}</Text>} */}\n\n      {description && (\n        <Text mt={2} measure>\n          {description}\n        </Text>\n      )}\n    </>\n  )\n}\n\nVideoInfo.displayName = 'VideoInfo'\n\nVideoInfo.defaultProps = {\n  subtitle: null,\n}\n\nVideoInfo.propTypes = {\n  id: PropTypes.number.isRequired,\n  title: PropTypes.string.isRequired,\n  categoryTitle: PropTypes.string.isRequired,\n  description: PropTypes.string,\n  levels: PropTypes.string,\n  subtitle: PropTypes.string,\n  onSaveToFolder: PropTypes.func.isRequired,\n}\n","import { Skeleton } from '@redriverpress/system'\n\nconst placeholders = [...new Array(8)].map((_, index) => ({ key: index }))\n\nexport default function UpNextSkeleton() {\n  return placeholders.map(ph => (\n    <Skeleton\n      key={ph.key}\n      height='70px'\n      width='100%'\n      mb={3}\n      borderRadius='small'\n    />\n  ))\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport { Box, Play, Text, Link } from '@redriverpress/system'\nimport { routes } from '../../constants'\n\nconst Thumbnail = styled(Box).attrs({\n  width: '80px',\n  height: '52px',\n  borderRadius: 'small',\n})`\n  background-image: url(${props => props.src});\n  background-image: url(${props => props.src});\n  background-size: cover;\n  background-position: center;\n`\n\nconst ThumbOverlay = styled(Box).attrs({\n  width: '80px',\n  height: '52px',\n  borderRadius: 'small',\n  bg: 'black',\n})`\n  position: absolute;\n  opacity: 0.3;\n`\n\nconst UpcomingVideoItem = styled(Box).attrs({\n  display: 'flex',\n  alignItems: 'flex-start',\n  minHeight: '70px',\n  borderRadius: 'small',\n  p: 2,\n  bg: 'white',\n})`\n  &:hover {\n    .overlay,\n    .playIcon {\n      transition: opacity 0.1s;\n      opacity: 0;\n    }\n  }\n`\n\nexport default function UpcomingVideo({\n  thumbnailUrl,\n  title,\n  videoSlug,\n  subheading,\n}) {\n  return (\n    <Link mb={3} href={`${routes.video}/${videoSlug}`} reset>\n      <UpcomingVideoItem>\n        <Box mr={2} display='flex' alignItems='center' justifyContent='center'>\n          <ThumbOverlay className='overlay' />\n          <Play\n            className='playIcon'\n            position='absolute'\n            color='white'\n            size='20px'\n          />\n          <Thumbnail src={thumbnailUrl} alt={title} />\n        </Box>\n        <Box display='flex' flexDirection='column'>\n          <Text fontSize={0} fontWeight='600' textAlign='left'>\n            {title}\n          </Text>\n          {\n            <Text m={0} fontSize={0} textAlign='left'>\n              {subheading}\n            </Text>\n          }\n        </Box>\n      </UpcomingVideoItem>\n    </Link>\n  )\n}\n\nUpcomingVideo.defaultProps = {\n  thumbnailUrl: null,\n  subheading: null,\n}\n\nUpcomingVideo.propTypes = {\n  thumbnailUrl: PropTypes.string,\n  title: PropTypes.string.isRequired,\n  videoSlug: PropTypes.string.isRequired,\n  subheading: PropTypes.string,\n}\n","import PropTypes from 'prop-types'\nimport { Box, Heading } from '@redriverpress/system'\n\nimport { VideoDataShape } from '../constants/VideoPropType'\n\nimport UpNextSkeleton from './skeletons/UpNextSkeleton'\nimport UpcomingVideo from './UpcomingVideo'\n\nexport default function WatchNextSection({ playlist, showSkeleton, ...props }) {\n  return (\n    <Box display='flex' flexDirection='column' {...props}>\n      <Heading as='h3' mb={3} fontSize={[2, null, 4, 3]} fontWeight='600'>\n        More like this\n      </Heading>\n      {showSkeleton ? (\n        <UpNextSkeleton />\n      ) : (\n        playlist.map(data => (\n          <UpcomingVideo\n            key={data.id}\n            videoSlug={data.slug}\n            thumbnailUrl={data.image}\n            title={data.title}\n            subheading={data.subtitle}\n          />\n        ))\n      )}\n    </Box>\n  )\n}\n\nWatchNextSection.displayName = 'WatchNextSection'\n\nWatchNextSection.defaultProps = {\n  playlist: [],\n}\n\nWatchNextSection.propTypes = {\n  showSkeleton: PropTypes.bool.isRequired,\n  playlist: VideoDataShape.playlist,\n}\n","import { useEffect, useState } from 'react'\nimport { useParams } from 'react-router-dom'\nimport parse, { attributesToProps } from 'html-react-parser'\n\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\nimport { MoveItemModal } from 'Packages/folders'\nimport LightboxImage from 'Common/components/LightboxImage'\nimport Breadcrumbs from 'Common/components/Breadcrumbs'\nimport {\n  Box,\n  Col,\n  Columns,\n  Container,\n  Icon,\n  Heading,\n  MonoButton,\n  useToast,\n} from '@redriverpress/system'\nimport DOMPurify from 'dompurify'\n\nimport getLevelsByType from 'Common/utils/getLevelsByType'\nimport useUserAccess from 'Common/hooks/useUserAccess'\n\nimport VideoAccessDialog from '../common/components/VideoAccessDialog'\nimport getVideo from './services/getVideo'\n\nimport VideoPlayerSkeleton from './components/skeletons/VideoPlayerSkeleton'\nimport TeacherDiscretion from './components/TeacherDiscretion'\nimport LessonCard from './components/LessonCard'\nimport VideoInfo from './components/VideoInfo'\nimport WatchNextSection from './components/WatchNextSection'\n\n// Allow iframes and the frameborder attribute;\n// we need these for embedding videos\n// See DOMPurify docs: https://github.com/cure53/DOMPurify#can-i-configure-dompurify\nconst sanitizeOptions = {\n  ADD_TAGS: ['iframe'],\n  ADD_ATTR: ['frameborder', 'allowfullscreen', 'allow'],\n}\n\n// Replace img tags with the LightboxImage component\nconst parseOptions = {\n  replace: domNode => {\n    if (domNode.name === 'img') {\n      const { src, alt } = attributesToProps(domNode.attribs)\n      return <LightboxImage src={src} alt={alt} />\n    }\n  },\n}\n\nexport default function VideoPage() {\n  const {\n    userIsLoading,\n    userHasAccess,\n    userLoggedIn,\n    userData,\n  } = useUserAccess()\n  const [isAccessDialogOpen, setIsAccessDialogOpen] = useState(false)\n  const { videoParam } = useParams()\n  const [videoData, setVideoData] = useState(null)\n  const [moveItemModalOpen, setMoveItemModalOpen] = useState(false)\n\n  const { addToast } = useToast()\n\n  const goBackToGallery = (isOpen = false) => {\n    if (!isOpen) window.location.href = '/media/videos'\n  }\n\n  const content = `<div class='videoWrapper'><iframe title='video-iframe' allow='autoplay;fullscreen' allowfullscreen='' frameborder='0' height='360' src='https://player.vimeo.com/video/${videoData?.vimeoVideoId}' width='640'></iframe></div>`\n\n  const sanitizedContent = DOMPurify.sanitize(content, sanitizeOptions)\n\n  const levels = getLevelsByType(userData?.levelPreference, videoData)\n  useEffect(() => {\n    if (!userIsLoading) {\n      if (userLoggedIn && userHasAccess) {\n        getVideo(videoParam).then(\n          res => {\n            setVideoData(res.data)\n          },\n          errors => {\n            addToast({\n              id: errors,\n              content: 'Something went wrong',\n              type: 'warning',\n              action: (\n                <MonoButton\n                  small\n                  mr={-2}\n                  onClick={() => window.location.reload()}\n                >\n                  <Icon icon='redo' pr={2} />\n                  Retry\n                </MonoButton>\n              ),\n            })\n          }\n        )\n      } else {\n        setIsAccessDialogOpen(true)\n      }\n    }\n  }, [userIsLoading])\n\n  return (\n    <>\n      <Box py={[3, null, null, 4]} pb={[4, null, null, 5]} bg='gray100'>\n        <Container>\n          <Columns>\n            {/* Video Column */}\n            <Col width={[1, null, null, 8 / 12]}>\n              {videoData ? (\n                <>\n                  <Breadcrumbs\n                    routes={[\n                      {\n                        label: 'Videos',\n                        to: '/media/videos',\n                        external: true,\n                      },\n                      {\n                        label: videoData.genre.title,\n                        to: `/media/videos/${videoData.genre.slug}`,\n                        external: true,\n                      },\n                      {\n                        label: videoData.title,\n                        to: '',\n                        external: true,\n                      },\n                    ]}\n                  />\n\n                  {/* Video Player */}\n                  <Box mb={4}>{parse(sanitizedContent, parseOptions)}</Box>\n\n                  <VideoInfo\n                    id={videoData.id}\n                    title={videoData.title}\n                    subtitle={videoData.subtitle}\n                    date={videoData.date}\n                    levels={levels}\n                    description={videoData.description}\n                    categoryTitle={videoData.category.title}\n                    onSaveToFolder={() => setMoveItemModalOpen(true)}\n                  />\n                </>\n              ) : (\n                <VideoPlayerSkeleton />\n              )}\n\n              {/* Dicretion box */}\n              {videoData?.discretion && (\n                <TeacherDiscretion\n                  mt={3}\n                  p={3}\n                  discretionText={videoData.discretionText}\n                />\n              )}\n\n              {/* Found In section */}\n              {videoData?.lessons.length > 0 && (\n                <Box mt={3}>\n                  <Heading\n                    as='h1'\n                    fontSize={[2, null, 4]}\n                    lineHeight='heading'\n                    fontWeight='600'\n                    mb={3}\n                  >\n                    Found in\n                  </Heading>\n\n                  <Box\n                    display='grid'\n                    gridTemplateColumns={['1fr', null, 'repeat(2, 1fr)']}\n                    gridColumnGap={3}\n                    gridRowGap={3}\n                    mb={4}\n                  >\n                    {videoData.lessons.map(lesson => (\n                      <LessonCard key={lesson.id} lesson={lesson} />\n                    ))}\n                  </Box>\n                </Box>\n              )}\n            </Col>\n\n            {/* Watch Next Column */}\n            <Col width={[1, null, null, 4 / 12]}>\n              <WatchNextSection\n                ml={[0, null, null, 3]}\n                mt={[4, null, null, 0]}\n                playlist={videoData?.playlist}\n                showSkeleton={!videoData}\n              />\n            </Col>\n          </Columns>\n        </Container>\n      </Box>\n\n      {/* Get Access Modal */}\n      <VideoAccessDialog\n        open={isAccessDialogOpen}\n        onOpenChange={isOpen => goBackToGallery(isOpen)}\n        userLoggedIn={userLoggedIn}\n      />\n\n      {/* Save to folder modal */}\n\n      {!!videoData && (\n        <MoveItemModal\n          isOpen={moveItemModalOpen}\n          item={{\n            fileable: {\n              id: videoData?.id,\n              type: CONTENT_TYPES.video,\n            },\n          }}\n          onClose={reload => {\n            setMoveItemModalOpen(false)\n            reload && window.location.reload()\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'\nimport { ModalFoldersProvider } from 'Packages/folders'\n\nimport { Loading, Toaster } from '@redriverpress/system'\n\nimport ElliiThemeProvider from 'Common/components/ElliiThemeProvider'\nimport { TWENTY_FOUR_HOURS_IN_MS } from 'Common/utils/datetime'\n\nimport VideoPage from './VideoPage'\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    <Router basename='/video'>\n      <QueryClientProvider client={queryClient}>\n        <ModalFoldersProvider fallback={<Loading />}>\n          <QueryParamProvider ReactRouterRoute={Route}>\n            <ElliiThemeProvider>\n              <Toaster>\n                <Route path='/:videoParam'>\n                  <VideoPage />\n                </Route>\n              </Toaster>\n            </ElliiThemeProvider>\n          </QueryParamProvider>\n        </ModalFoldersProvider>\n      </QueryClientProvider>\n    </Router>\n  )\n}\n","import ReactDOM from 'react-dom'\n\nimport App from '../media/video/App'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  const mountPoint = document.getElementById('root')\n\n  ReactDOM.render(<App />, mountPoint)\n})\n"],"sourceRoot":""}