@clickview/lite 0.48.0-rc.2 → 0.48.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1197-52bedf8583-lite.chunk.js → 1197-bc02ba8644-lite.chunk.js} +2 -2
- package/dist/scripts/1197-bc02ba8644-lite.chunk.js.map +1 -0
- package/dist/scripts/{1285-e93a3f21ba-lite.chunk.js → 1285-746158eef6-lite.chunk.js} +2 -2
- package/dist/scripts/{1285-e93a3f21ba-lite.chunk.js.map → 1285-746158eef6-lite.chunk.js.map} +1 -1
- package/dist/scripts/1628-3104bf944c-lite.chunk.js +2 -0
- package/dist/scripts/1628-3104bf944c-lite.chunk.js.map +1 -0
- package/dist/scripts/{170-f48bfc1128-lite.chunk.js → 170-bf0dd6b8ae-lite.chunk.js} +3 -3
- package/dist/scripts/170-bf0dd6b8ae-lite.chunk.js.map +1 -0
- package/dist/scripts/227-c82ab0d861-lite.chunk.js +2 -0
- package/dist/scripts/227-c82ab0d861-lite.chunk.js.map +1 -0
- package/dist/scripts/{2469-c504f7a87d-lite.chunk.js → 2469-34d8afaeb3-lite.chunk.js} +2 -2
- package/dist/scripts/{2469-c504f7a87d-lite.chunk.js.map → 2469-34d8afaeb3-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2679-6c0646cc30-lite.chunk.js → 2679-269830f57c-lite.chunk.js} +2 -2
- package/dist/scripts/2679-269830f57c-lite.chunk.js.map +1 -0
- package/dist/scripts/{2734-a792d5393b-lite.chunk.js → 2734-9533718178-lite.chunk.js} +2 -2
- package/dist/scripts/2734-9533718178-lite.chunk.js.map +1 -0
- package/dist/scripts/{2851-e79b075ea9-lite.chunk.js → 2851-c0655d1a1d-lite.chunk.js} +2 -2
- package/dist/scripts/2851-c0655d1a1d-lite.chunk.js.map +1 -0
- package/dist/scripts/{3157-327cefda57-lite.chunk.js → 3157-730ff8b0ce-lite.chunk.js} +2 -2
- package/dist/scripts/3157-730ff8b0ce-lite.chunk.js.map +1 -0
- package/dist/scripts/{3158-7cff145fc4-lite.chunk.js → 3158-fbc814c471-lite.chunk.js} +2 -2
- package/dist/scripts/3158-fbc814c471-lite.chunk.js.map +1 -0
- package/dist/scripts/{5442-eecab1d715-lite.chunk.js → 5442-2326dc9418-lite.chunk.js} +2 -2
- package/dist/scripts/{5442-eecab1d715-lite.chunk.js.map → 5442-2326dc9418-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5591-a4850980ea-lite.chunk.js → 5591-90c4fa0949-lite.chunk.js} +2 -2
- package/dist/scripts/5591-90c4fa0949-lite.chunk.js.map +1 -0
- package/dist/scripts/{5940-3ddc297b7a-lite.chunk.js → 5940-634de60f9b-lite.chunk.js} +2 -2
- package/dist/scripts/5940-634de60f9b-lite.chunk.js.map +1 -0
- package/dist/scripts/{6274-7d4c6ba241-lite.chunk.js → 6274-473fcd2e63-lite.chunk.js} +2 -2
- package/dist/scripts/{6274-7d4c6ba241-lite.chunk.js.map → 6274-473fcd2e63-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7172-2d87ce76a3-lite.chunk.js → 7172-960e49b199-lite.chunk.js} +2 -2
- package/dist/scripts/7172-960e49b199-lite.chunk.js.map +1 -0
- package/dist/scripts/7180-79ada17b34-lite.chunk.js +2 -0
- package/dist/scripts/7180-79ada17b34-lite.chunk.js.map +1 -0
- package/dist/scripts/{7301-44362a7b42-lite.chunk.js → 7301-50cf0faef7-lite.chunk.js} +2 -2
- package/dist/scripts/{7301-44362a7b42-lite.chunk.js.map → 7301-50cf0faef7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7915-afd2304b08-lite.chunk.js → 7915-44db39c137-lite.chunk.js} +2 -2
- package/dist/scripts/7915-44db39c137-lite.chunk.js.map +1 -0
- package/dist/scripts/{8025-d7a573aca0-lite.chunk.js → 8025-24e45dc3b7-lite.chunk.js} +2 -2
- package/dist/scripts/8025-24e45dc3b7-lite.chunk.js.map +1 -0
- package/dist/scripts/{8258-6c86ad1fa4-lite.chunk.js → 8258-02d619de75-lite.chunk.js} +2 -2
- package/dist/scripts/{8258-6c86ad1fa4-lite.chunk.js.map → 8258-02d619de75-lite.chunk.js.map} +1 -1
- package/dist/scripts/8906-0821b0babe-lite.chunk.js +3 -0
- package/dist/scripts/8906-0821b0babe-lite.chunk.js.map +1 -0
- package/dist/scripts/{9212-d73ddd1ae6-lite.chunk.js → 9212-445b6499cb-lite.chunk.js} +2 -2
- package/dist/scripts/9212-445b6499cb-lite.chunk.js.map +1 -0
- package/dist/scripts/{9557-580fd7d743-lite.chunk.js → 9557-1ba0323e44-lite.chunk.js} +2 -2
- package/dist/scripts/{9557-580fd7d743-lite.chunk.js.map → 9557-1ba0323e44-lite.chunk.js.map} +1 -1
- package/dist/scripts/bundle-058c7cee3f.min.js +3 -0
- package/dist/scripts/bundle-058c7cee3f.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1197-52bedf8583-lite.chunk.js.map +0 -1
- package/dist/scripts/1628-58b55d05b5-lite.chunk.js +0 -2
- package/dist/scripts/1628-58b55d05b5-lite.chunk.js.map +0 -1
- package/dist/scripts/170-f48bfc1128-lite.chunk.js.map +0 -1
- package/dist/scripts/227-fb7b36b41a-lite.chunk.js +0 -2
- package/dist/scripts/227-fb7b36b41a-lite.chunk.js.map +0 -1
- package/dist/scripts/2679-6c0646cc30-lite.chunk.js.map +0 -1
- package/dist/scripts/2734-a792d5393b-lite.chunk.js.map +0 -1
- package/dist/scripts/2851-e79b075ea9-lite.chunk.js.map +0 -1
- package/dist/scripts/3157-327cefda57-lite.chunk.js.map +0 -1
- package/dist/scripts/3158-7cff145fc4-lite.chunk.js.map +0 -1
- package/dist/scripts/5591-a4850980ea-lite.chunk.js.map +0 -1
- package/dist/scripts/5940-3ddc297b7a-lite.chunk.js.map +0 -1
- package/dist/scripts/7172-2d87ce76a3-lite.chunk.js.map +0 -1
- package/dist/scripts/7180-b29d70e9d8-lite.chunk.js +0 -2
- package/dist/scripts/7180-b29d70e9d8-lite.chunk.js.map +0 -1
- package/dist/scripts/7915-afd2304b08-lite.chunk.js.map +0 -1
- package/dist/scripts/8025-d7a573aca0-lite.chunk.js.map +0 -1
- package/dist/scripts/8906-49532e8ec3-lite.chunk.js +0 -3
- package/dist/scripts/8906-49532e8ec3-lite.chunk.js.map +0 -1
- package/dist/scripts/9212-d73ddd1ae6-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-0fbdccea0d.min.js +0 -3
- package/dist/scripts/bundle-0fbdccea0d.min.js.map +0 -1
- /package/dist/scripts/{170-f48bfc1128-lite.chunk.js.LICENSE.txt → 170-bf0dd6b8ae-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8906-49532e8ec3-lite.chunk.js.LICENSE.txt → 8906-0821b0babe-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-0fbdccea0d.min.js.LICENSE.txt → bundle-058c7cee3f.min.js.LICENSE.txt} +0 -0
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1197-52bedf8583-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/coming-soon-tag.scss","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/ComingSoonTag.tsx","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/generic-calendar-date.scss","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/GenericCalendarDate.tsx","file:///app/packages/libs/common/src/react/utils/PortalHelper.ts","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/video-sort-select/VideoSortSelect.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"tag\":\"XRj8d\",\"tooltip\":\"X6mLk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './coming-soon-tag.scss';\n\nconst namespace = 'specialEventCalendar.comingSoonTag';\n\ninterface ComingSoonProps {\n className?: string;\n onlyIcon?: boolean;\n}\n\nexport function ComingSoonTag(props: ComingSoonProps): JSX.Element {\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'tooltip')} spanHackClassName={`d-block ${styles.tooltip}`} spanHack>\n <div className={`d-flex text-dark align-items-center ${styles.tag} ${props.className}`}>\n <SvgContainer svgName={cvSvgLibrary.Timer} />\n {!props.onlyIcon && LanguageService.getPhrase(namespace, 'comingSoon')}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateItem\":\"I3SBm\",\"label\":\"PRORs\",\"body\":\"RfiM_\",\"bodyDay\":\"ZOVny\",\"bodyRange\":\"vYhXN\",\"bodyMonth\":\"mYslO\",\"month\":\"EPkkQ\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './generic-calendar-date.scss';\n\nexport interface GenericCalendarDateProps {\n label?: string;\n body: {\n type: 'month' | 'range' | 'day';\n text: string;\n };\n month?: string;\n getAppLink?: () => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n className?: string;\n theme?: CalendarTheme;\n}\n\nexport function GenericCalendarDate(props: GenericCalendarDateProps): JSX.Element {\n function getBodyClass(): string {\n switch (props.body.type) {\n case 'range':\n return styles.bodyRange;\n case 'day':\n return styles.bodyDay;\n case 'month':\n return styles.bodyMonth;\n }\n }\n\n return (\n <AppLink\n appLink={props.getAppLink?.()}\n className={`text-decoration-none text-center bg-white text-dark border border-3 ${props.theme?.border} rounded-3 d-block fw-semibold ${props.className}`}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n >\n <div className={`position-relative ${styles.dateItem}`}>\n <div className={`${props.theme?.background} py-1 ${styles.label} d-flex align-items-center justify-content-center`}>\n {props.label ? props.label : <> </>}\n </div>\n <div className={`${getBodyClass()} ${styles.body} my-2`}>\n {props.body.text}\n </div>\n <div className={`mb-0 ${styles.month}`}>\n {props.month}\n </div>\n </div>\n </AppLink>\n );\n}","import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={DateHelper.format(specialEvent.startDate, 'MMMM')}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3`}>\n {props.logo?.url &&\n <LazyImage src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Small })} />}\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Small })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { VideoSortType } from 'libs/shared/enums/VideoSortType';\n\nconst namespace = 'shared.videoSortSelect';\n\ntype SortTypes = {[sort: string]: { name: string }};\n\nconst getSortTypes: () => SortTypes = FunctionHelper.memoize(() => {\n return {\n [VideoSortType.RecentlyAdded]: {\n name: LanguageService.getPhrase(namespace, 'recentlyAdded')\n },\n [VideoSortType.AtoZ]: {\n name: LanguageService.getPhrase(namespace, 'atoz')\n },\n [VideoSortType.ZtoA]: {\n name: LanguageService.getPhrase(namespace, 'ztoa')\n },\n [VideoSortType.Newest]: {\n name: LanguageService.getPhrase(namespace, 'newest')\n },\n [VideoSortType.Oldest]: {\n name: LanguageService.getPhrase(namespace, 'oldest')\n },\n [VideoSortType.Series]: {\n name: LanguageService.getPhrase(namespace, 'series')\n }\n };\n});\n\ninterface VideoSortSelectProps {\n type: VideoSortType;\n getSortAppLink: (sort: string) => Core.AppLink;\n variant?: ButtonProps['variant'];\n sortTypes?: SortTypes;\n analyticsOptions: AnalyticsOptions;\n}\n\nVideoSortSelect.defaultProps = {\n variant: 'light'\n};\n\nexport function VideoSortSelect(props: VideoSortSelectProps): JSX.Element {\n const sortTypes = props.sortTypes || getSortTypes();\n\n return (\n <div className='dropdown'>\n <a className={`btn btn-${props.variant} ms-2 dropdown-toggle`} type='button' id='sort-select' data-bs-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>\n {sortTypes[props.type].name}\n </a>\n <div className='dropdown-menu dropdown-menu-end' aria-labelledby='sort-select'>\n {Object.keys(sortTypes).map(k => {\n let className = 'dropdown-item';\n\n if (k === props.type)\n className += ' active';\n\n return (\n <AppLink\n key={k}\n className={className}\n appLink={props.getSortAppLink(k)}\n analyticsData={{\n sort: sortTypes[k].name\n }}\n analyticsOptions={props.analyticsOptions}\n >\n {sortTypes[k].name}\n </AppLink>\n );\n })}\n </div>\n </div>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation } = usePresentation({ redirectOnError: true });\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!activePresentation &&\n AudienceRequests.presentationAudiences(activePresentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.data?.isAuthenticated)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => [\n ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\n\n Flight.useBasicFetchAll(request);\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["namespace","ComingSoonTag","props","Tooltip","title","LanguageService","spanHackClassName","spanHack","className","SvgContainer","svgName","onlyIcon","GenericCalendarDate","AppLink","appLink","getAppLink","theme","border","analyticsData","analyticsOptions","background","label","body","type","getBodyClass","text","month","PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","BackButton","textShadow","backToName","color","extraClasses","backPhrase","colorClass","textShadowClass","size","S","defaultProps","RATIO","width","height","getSizeClass","heading","length","BannerHeader","banner","imageCdnUrl","actions","sortComponent","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","style","backgroundImage","DetailsComponent","detailsComponent","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","calendarTheme","Text","phrase","LazyImage","src","Actions","actionsDropdownClassName","container","prevProps","nextProps","PartialBannerHeader","BreadcrumbItem","breadcrumb","name","active","withBackIcon","Breadcrumbs","breadcrumbs","isMobile","map","b","idx","key","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","InfiniteScrollFooter","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","Spinner","as","animation","role","onClick","PartialVideoList","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","getSortTypes","VideoSortSelect","sortTypes","variant","id","Object","keys","k","getSortAppLink","sort","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","isArray","useEffect","forEach","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","opts","Math","max","floor","random","usePresentationAudiences","activePresentation","redirectOnError","useVideoMixin","videos","currentUser","hydratedVideos","Set","videoIds","filter","Boolean","v","data","setRequest","isAuthenticated","unhydratedVideos","current","has","push","add","r","flightNamespace","bsPrefix","Component","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1628],{21628:(e,t,a)=>{a.r(t),a.d(t,{RemoveVideoFromPlaylistView:()=>w});var r=a(32735),n=a(70680),i=a(50242),l=a(23481),o=a(20354),s=a(49985),c=a(65858),d=a(9111),u=a(13876),p=a(83345),m=a(5112),y=a(69883),v=a(79612);function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=new Array(t);a<t;a++)r[a]=e[a];return r}var h="playlists.removeVideoFromPlaylist",b=l.T.encloseNamespace(h);function w(e){var t,a,l,w=(0,n.I0)(),g=(0,y.Z)(),P=(a=r.useState(!1),l=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,l,o=[],s=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;s=!1}else for(;!(s=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);s=!0);}catch(e){c=!0,n=e}finally{try{if(!s&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(c)throw n}}return o}}(a,l)||function(e,t){if(e){if("string"==typeof e)return f(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?f(e,t):void 0}}(a,l)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),C=P[0],I=P[1],k=o.a.useBasicFetch(m.C.getPlaylist(e.playlistId)),E=o.a.useBasicFetch(m.C.getVideoCandidate(e.videoId)),S=E.statusCode===i.o.Forbidden,x=!!E.data&&b("title",{name:E.data.name});(0,v.M)({title:x});var A=!!k.data&&!!E.hasCompleted;return r.createElement(d.G,{title:b("heading"),closePopup:e.closePopup,showLoadingSpinner:!A},A&&r.createElement("div",{className:"remove-video-container"},r.createElement("div",{className:"remove-video-body"},r.createElement("p",null,r.createElement(p.x,{namespace:h,phrase:S?"warningPrivate":"warning",options:{video:null===(t=E.data)||void 0===t?void 0:t.name,playlist:k.data.name}}))),r.createElement(u.u,null,r.createElement(u.u.Cancel,{onClick:e.closePopup}),r.createElement(u.u.Submit,{variant:"danger",text:b("confirm"),onClick:function(){I(!0),o.a.fetch(w,m.C.removePlaylistVideo(e.playlistId,e.videoId,e.typeId,(function(){var t=S?b("successPrivate",{playlist:k.data.name,escapeText:!0}):b("success",{video:E.data.name,playlist:k.data.name,escapeText:!0});g.success(t),s.k.logUserAction({id:e.videoId,playlistId:e.playlistId},s.k.mergeOptions(e.analyticsOptions,{actionType:c.Vw.Dissociate,entity:c.py.Video,workflowPhase:c.eu.Complete,descriptor:c.iF.Playlist})),e.closePopup()}),(function(){var t=S?b("errorPrivate",{playlist:k.data.name,escapeText:!0}):b("error",{video:E.data.name,playlist:k.data.name,escapeText:!0});g.error(t),e.closePopup()})))},showSpinner:C}))))}}}]);
|
|
2
|
-
//# sourceMappingURL=1628-58b55d05b5-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1628-58b55d05b5-lite.chunk.js","mappings":"gaAmBA,IAAMA,EAAY,oCACZC,EAAY,qBAAiCD,GAU7C,SAAUE,EAA4BC,G,UACpCC,GAAW,UACXC,GAAS,SAE0D,G,EAArB,YAAe,G,EAAM,E,k5BAAjEC,EAAiB,KAAEC,EAAoB,KAEzCC,EAAW,kBAA+B,gBAA6BL,EAAMM,aAC7EC,EAAQ,kBAA4B,sBAAmCP,EAAMQ,UAE7EC,EAAiBF,EAAMG,aAAe,cAEtCC,IAAUJ,EAAMK,MAAQd,EAAU,QAAS,CAAEe,KAAMN,EAAMK,KAAKC,QACpE,OAAmB,CAAEF,MAAAA,IAErB,IAsCMG,IAAeT,EAASO,QAAUL,EAAMQ,aAE9C,OACE,gBAAC,IAAK,CAACJ,MAAOb,EAAU,WAAYkB,WAAYhB,EAAMgB,WAAYC,oBAAqBH,GACpFA,GACC,uBAAKI,UAAU,0BACb,uBAAKA,UAAU,qBACb,yBACE,gBAAC,IAAI,CACHrB,UAAWA,EACXsB,OAAQV,EAAiB,iBAAmB,UAC5CW,QAAS,CAAEb,MAAiB,QAAV,EAAAA,EAAMK,YAAI,eAAEC,KAAMR,SAAUA,EAASO,KAAKC,UAIlE,gBAAC,IAAY,KACX,gBAAC,WAAmB,CAACQ,QAASrB,EAAMgB,aACpC,gBAAC,WAAmB,CAACM,QAAQ,SAASC,KAAMzB,EAAU,WAAYuB,QAvDxD,WAClBjB,GAAqB,GA+BrB,UACEH,EACA,wBAAqCD,EAAMM,WAAYN,EAAMQ,QAASR,EAAMwB,QA/B5D,WAChB,IAAMC,EAAehB,EACjBX,EAAU,iBAAkB,CAAEO,SAAUA,EAASO,KAAKC,KAAMa,YAAY,IACxE5B,EAAU,UAAW,CAAES,MAAOA,EAAMK,KAAKC,KAAMR,SAAUA,EAASO,KAAKC,KAAMa,YAAY,IAE7FxB,EAAOyB,QAAQF,GAEf,kBACE,CAAEG,GAAI5B,EAAMQ,QAASF,WAAYN,EAAMM,YACvC,iBAA6BN,EAAM6B,iBAAkB,CACnDC,WAAY,gBACZC,OAAQ,WACRC,cAAe,cACfC,WAAY,iBAIhBjC,EAAMgB,YACR,IAEgB,WACd,IAAMkB,EAAazB,EACfX,EAAU,eAAgB,CAAEO,SAAUA,EAASO,KAAKC,KAAMa,YAAY,IACtE5B,EAAU,QAAS,CAAES,MAAOA,EAAMK,KAAKC,KAAMR,SAAUA,EAASO,KAAKC,KAAMa,YAAY,IAE3FxB,EAAOiC,MAAMD,GACblC,EAAMgB,YACR,IAMF,EAmBkGoB,YAAajC,MAMjH,C","sources":["file:///app/packages/projects/lite/src/apps/playlists/views/remove-video-from-playlist/RemoveVideoFromPlaylistView.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Playlist, PropsWithAnalyticsOptions, PropsWithPopupViewProps, Video } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.removeVideoFromPlaylist';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RemoveVideoFromPlaylistViewProps {\n videoId: string;\n playlistId: string;\n typeId: MasterType;\n}\n\ntype PropTypes = PropsWithAnalyticsOptions<PropsWithPopupViewProps<RemoveVideoFromPlaylistViewProps>>;\n\nexport function RemoveVideoFromPlaylistView(props: PropTypes): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const playlist = Flight.useBasicFetch<Playlist>(PlaylistRequests.getPlaylist(props.playlistId));\n const video = Flight.useBasicFetch<Video>(PlaylistRequests.getVideoCandidate(props.videoId));\n\n const videoIsPrivate = video.statusCode === HttpStatus.Forbidden;\n\n const title = !!video.data && getPhrase('title', { name: video.data.name });\n useSetPageMetadata({ title });\n\n const removeVideo = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n const successAlert = videoIsPrivate\n ? getPhrase('successPrivate', { playlist: playlist.data.name, escapeText: true })\n : getPhrase('success', { video: video.data.name, playlist: playlist.data.name, escapeText: true });\n\n alerts.success(successAlert);\n\n AnalyticsHelper.logUserAction(\n { id: props.videoId, playlistId: props.playlistId },\n AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n actionType: UserAction.Dissociate,\n entity: EntityType.Video,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: AssocDescriptor.Playlist\n })\n );\n\n props.closePopup();\n };\n\n const onError = () => {\n const errorAlert = videoIsPrivate\n ? getPhrase('errorPrivate', { playlist: playlist.data.name, escapeText: true })\n : getPhrase('error', { video: video.data.name, playlist: playlist.data.name, escapeText: true });\n\n alerts.error(errorAlert);\n props.closePopup();\n };\n\n Flight.fetch(\n dispatch,\n PlaylistRequests.removePlaylistVideo(props.playlistId, props.videoId, props.typeId, onSuccess, onError)\n );\n };\n\n const dataLoaded = !!playlist.data && !!video.hasCompleted;\n\n return (\n <Popup title={getPhrase('heading')} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded}>\n {dataLoaded &&\n <div className='remove-video-container'>\n <div className='remove-video-body'>\n <p>\n <Text\n namespace={namespace}\n phrase={videoIsPrivate ? 'warningPrivate' : 'warning'}\n options={{ video: video.data?.name, playlist: playlist.data.name }}\n />\n </p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit variant='danger' text={getPhrase('confirm')} onClick={removeVideo} showSpinner={showButtonSpinner} />\n </PopupButtons>\n </div>\n }\n </Popup>\n );\n}"],"names":["namespace","getPhrase","RemoveVideoFromPlaylistView","props","dispatch","alerts","showButtonSpinner","setShowButtonSpinner","playlist","playlistId","video","videoId","videoIsPrivate","statusCode","title","data","name","dataLoaded","hasCompleted","closePopup","showLoadingSpinner","className","phrase","options","onClick","variant","text","typeId","successAlert","escapeText","success","id","analyticsOptions","actionType","entity","workflowPhase","descriptor","errorAlert","error","showSpinner"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/170-f48bfc1128-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/caret/Caret.tsx","file:///app/packages/libs/shared/src/components/caret/caret.scss","file:///app/packages/libs/shared/src/components/drag-drop-move/DragDropMoveContext.tsx","file:///app/packages/libs/shared/src/components/library-folder/library-folder.scss","file:///app/packages/libs/shared/src/components/library-folder/LibraryFolder.tsx","file:///app/packages/libs/shared/src/components/folder-list/FolderList.tsx","file:///app/packages/libs/shared/src/components/folder-list/partial-loading/partial-folder-list.scss","file:///app/packages/libs/shared/src/components/folder-list/partial-loading/PartialFolderList.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/video-list/video-list-actions/VideoListActions.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseGetCollectionItems.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/libs/shared/src/hooks/usePrevious.ts","file:///app/packages/libs/shared/src/utils/TreeHelper.ts","file:///app/packages/projects/lite/src/apps/libraries/hooks/UseFetchAllChildFolders.ts","file:///app/packages/projects/lite/src/apps/my-videos/flight-requests/MyVideosRequests.ts","file:///app/packages/projects/lite/src/apps/my-videos/hooks/useDragDropMove.ts","file:///app/packages/projects/lite/src/apps/my-videos/hooks/useUploadItems.ts","file:///app/packages/projects/lite/src/apps/upload/hooks/useGetUploadingItems.ts","file:///app/packages/projects/lite/src/apps/my-videos/utils/getFolderActions.tsx","file:///app/packages/libs/shared/src/utils/AnalyticsTypeHelper.ts","file:///app/packages/projects/lite/src/apps/my-videos/views/my-videos/MyVideosViewUtils.ts","file:///app/packages/projects/lite/src/apps/my-videos/hooks/useHasExchange.ts","file:///app/packages/projects/lite/src/apps/my-videos/views/my-videos/empty-state/MyVideosEmptyState.tsx","file:///app/packages/projects/lite/src/apps/upload/components/uploading-item/UploadingItem.tsx","file:///app/packages/projects/lite/src/shared/components/drag-drop-overlay/drag-drop-overlay.scss","file:///app/packages/projects/lite/src/shared/components/drag-drop-overlay/DragDropOverlay.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/node_modules/react-bootstrap/esm/ProgressBar.js","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["import React from 'react';\n\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './caret.scss';\n\ntype CaretDirection = 'left' | 'right' | 'up' | 'down';\n\n\nconst getDirectionClass = (direction: CaretDirection) => {\n switch (direction) {\n case 'up':\n return styles.up;\n case 'down':\n return styles.down;\n case 'right':\n return styles.right;\n case 'left':\n return styles.left;\n }\n};\n\ninterface CaretProps {\n direction?: CaretDirection;\n className?: string;\n}\n\nCaret.defaultProps = {\n direction: 'right'\n};\n\nexport function Caret(props: CaretProps): JSX.Element {\n return (\n <SvgContainer\n svgName={cvSvgLibrary.Caret}\n className={`${getDirectionClass(props.direction)} svg-container d-inline-block ${props.className}`}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"up\":\"JAT0R\",\"down\":\"ld41u\",\"left\":\"jZTRR\",\"right\":\"HHkPe\"};","import React from 'react';\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors } from '@dnd-kit/core';\nimport { snapCenterToCursor } from '@dnd-kit/modifiers';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Folder } from 'libs/shared/interfaces';\n\ninterface DragDropMoveContextProps extends React.PropsWithChildren {\n handleDragStart?: (event: DragStartEvent) => void;\n handleDragEnd?: (event: DragEndEvent, source: Folder) => void;\n source?: Folder;\n dragOverlayComponent: (active: string | string[] | HashObject | HashObject[]) => JSX.Element\n}\n\nexport function DragDropMoveContext(props: DragDropMoveContextProps) {\n const [ activeDragData, setActiveDragData ] = React.useState<string | string[] | HashObject | HashObject[]>(null);\n const { dragOverlayComponent: DragOverlayComponent } = props;\n \n function handleDragEnd(event: DragEndEvent) {\n setActiveDragData(null);\n\n props.handleDragEnd(event, props.source);\n }\n \n function handleDragStart(event: DragStartEvent) {\n setActiveDragData(event.active.data.current);\n props.handleDragStart?.(event);\n }\n \n const mouseSensor = useSensor(PointerSensor, {\n activationConstraint: {\n distance: 10\n }\n });\n \n const sensors = useSensors(mouseSensor);\n \n return (\n <DndContext\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n sensors={sensors}\n collisionDetection={pointerWithin}\n >\n {props.children}\n\n <DragOverlay dropAnimation={null} modifiers={[snapCenterToCursor]} zIndex={1050}>\n {activeDragData ? (\n <DragOverlayComponent activeDragData={activeDragData} />\n ) : null}\n </DragOverlay>\n </DndContext>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"actions\":\"cN3nB\",\"actionsContainer\":\"xM37V\",\"dropStyle\":\"kvCLS\",\"dragStyle\":\"md9Na\"};","import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\n\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DragDropMoveWrapper } from 'libs/shared/components/drag-drop-move/DragDropMoveWrapper';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { Folder } from 'libs/shared/interfaces';\n\nimport styles from './library-folder.scss';\n\ninterface LibraryFolderProps {\n folder: Folder;\n drag?: boolean;\n drop?: boolean;\n getAppLink: (f: Folder) => Core.AppLink;\n getFolderActions?: (f: Folder) => ActionOptions[];\n}\n\nexport function LibraryFolder(props: LibraryFolderProps): JSX.Element {\n const thumbnailUrl = props.folder.thumbnail\n ? UrlHelper.urlBuilder(props.folder.thumbnail.url, { size: ImageSize.Small })\n : null;\n\n const actions = props.getFolderActions?.(props.folder);\n\n return (\n <DragDropMoveWrapper\n draggable={props.drag && { id: props.folder.id, data: props.folder }}\n droppable={props.drop && { id: props.folder.id, data: props.folder }}\n dropStye={styles.dropStyle}\n dragStyle={styles.dragStyle}\n >\n <div className='position-relative'>\n <AppLink\n className='rounded-3 d-block text-decoration-none'\n appLink={props.getAppLink(props.folder)}\n title={props.folder.name}\n >\n <BaseImage\n data={thumbnailUrl}\n imageType={ImageType.Thumbnails}\n imageClassName='rounded-top-lg'\n >\n <ImageFallback\n name={props.folder.name}\n type={ImageFallbackType.Folder}\n extraClasses='rounded-top-lg'\n />\n </BaseImage>\n <h3 className='bg-white border-start border-end border-bottom rounded-bottom-lg font-size-normal fw-semibold mb-0 p-2'>\n <span className='text-truncate d-block'>{props.folder.name}</span>\n </h3>\n </AppLink>\n {actions?.length &&\n <Actions\n actions={actions}\n className={styles.actionsContainer}\n actionsDropdownClassName={styles.actions}\n // Intentionally setting to the default SVG size\n dropdownToggleSvgSize={null}\n />\n }\n </div>\n </DragDropMoveWrapper>\n );\n}","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { LibraryFolder } from 'libs/shared/components/library-folder/LibraryFolder';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Folder } from 'libs/shared/interfaces';\n\nconst namespace = 'libraries.folderList';\n\nconst EXPANDED_FOLDERS_KEY = 'has:expanded:library:folders';\n\nfunction useGetFolderLimit(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl || breakpoints.xl || breakpoints.lg)\n return 6;\n\n if (breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface FolderListProps {\n folders: Folder[];\n getAppLink: (folder: Folder) => Core.AppLink;\n expandFolders?: boolean;\n showHeading?: boolean;\n getFolderActions?: (f: Folder) => ActionOptions[];\n drag?: boolean;\n drop?: boolean;\n extraButtons?: JSX.Element;\n}\n\nFolderList.defaultProps = {\n showHeading: true\n};\n\nexport function FolderList(props: FolderListProps): JSX.Element {\n const [ _hasExpandedFolders, setHasExpandedFolders ] = React.useState(\n LocalStorageHelper.get(EXPANDED_FOLDERS_KEY) || false\n );\n\n const hasExpandedFolders = props.expandFolders || _hasExpandedFolders;\n\n const folderLimit = useGetFolderLimit();\n\n function onToggleFolderView(): void {\n setHasExpandedFolders(!hasExpandedFolders);\n LocalStorageHelper.set(EXPANDED_FOLDERS_KEY, !hasExpandedFolders);\n }\n\n const displayableFolders = hasExpandedFolders ? props.folders : props.folders.slice(0, folderLimit);\n\n const canToggleCollapsedView = props.folders.length > folderLimit && !props.expandFolders;\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n {props.showHeading &&\n <DivButton\n className={`d-inline-flex align-items-center mb-2 px-2 ${!canToggleCollapsedView ? 'cursor-default' : ''}`}\n onClick={onToggleFolderView}\n >\n {canToggleCollapsedView && (\n <Caret direction={hasExpandedFolders ? 'down' : 'right'} />\n )}\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase='folders' options={{ count: props.folders.length }} />\n </h2>\n </DivButton>\n }\n\n {!!(!hasExpandedFolders && canToggleCollapsedView) && (\n <div className='d-flex justify-content-end justify-self-end px-2'>\n <DivButton onClick={onToggleFolderView} className='text-dark hover-text-underline d-inline-block'>\n <Text namespace={namespace} phrase='seeAll' options={{ count: props.folders.length }} />\n </DivButton>\n </div>\n )}\n {!!(hasExpandedFolders && canToggleCollapsedView) && (\n <div className='d-flex justify-content-end justify-self-end px-2'>\n <DivButton onClick={onToggleFolderView} className='text-dark hover-text-underline d-inline-block'>\n <Text namespace={namespace} phrase='seeLess' />\n </DivButton>\n </div>\n )}\n\n {props.extraButtons ? props.extraButtons : <></>}\n </div>\n\n <div className='row mx-1'>\n {displayableFolders.map(f => (\n <div key={f.id} className='col-4 col-md-3 col-lg-2 px-1 pb-3'>\n <LibraryFolder\n folder={f}\n getAppLink={props.getAppLink}\n getFolderActions={props.getFolderActions}\n drag={props.drag}\n drop={props.drop}\n />\n </div>\n ))}\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialFolderHeading\":\"dhbsL\",\"partialFolderThumbnail\":\"CI9vk\",\"partialFolderName\":\"l0Nll\"};","import React from 'react';\n\nimport styles from './partial-folder-list.scss';\n\nconst PartialFolder = () => (\n <div className='col-4 col-md-3 col-lg-2 px-1 pb-3'>\n <div className={`${styles.partialFolderThumbnail} partial-loading-background rounded-top-lg`} />\n <div className={`${styles.partialFolderName} partial-loading-background border-bottom rounded-bottom-lg font-size-normal mb-0 p-2`}>\n \n </div>\n </div>\n);\n\nexport function PartialFolderList({ count = 3 }: { count?: number; }): JSX.Element {\n return (\n <>\n <div className={`${styles.partialFolderHeading} h4 mb-2 partial-loading-background`}> </div>\n <div className='row mx-n1'>\n {Array(count).fill(null).map((_, i) => <PartialFolder key={i} />)}\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\n\nconst namespace = 'shared.videoListActions';\n\ninterface VideoListActionsProps {\n allowBulkAction?: boolean;\n allowFilter?: boolean;\n checkboxHelper?: BulkCheckboxManager;\n getVideosBulkAction?: (selected: string[]) => ActionOptions[]\n getAppLink: () => Core.AppLink;\n typeFilter: SearchIndices[];\n locationContext?: LocationContext;\n isVideosLoading?: boolean;\n}\n\nexport function VideoListActions(props: VideoListActionsProps) {\n const { checkboxHelper: CheckboxHelper } = props;\n\n const [ actions, setActions ] = React.useState<ActionOptions[]>([]);\n\n function getVideosBulkActions() {\n setActions(props.getVideosBulkAction?.(CheckboxHelper.getSelected()));\n }\n\n function handleVideoAction(action: ActionOptions) {\n Core.AppLinkHelper.trigger(action.appLink);\n\n AnalyticsHelper.logUserAction(action.analyticsData, action.analyticsOptions);\n }\n\n return (\n <>\n <div className='d-flex align-items-center mb-3'>\n {props.allowBulkAction && (\n <>\n <Checkbox\n id='my-videos'\n name='my-videos'\n className='me-0 me-md-2'\n checked={CheckboxHelper.bulkChecked}\n onChange={CheckboxHelper.onToggleBulk}\n indeterminate={CheckboxHelper.hasSomeSelections()}\n />\n <div className='btn-group drop-right px-2 ps-sm-0 ps-md-2'>\n <DivButton\n onClick={getVideosBulkActions}\n className={`btn btn-outline-dark dropdown-toggle ${CheckboxHelper.hasSomeSelections() ? '' : 'disabled'}`}\n id='my-videos-action'\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n >\n <Text namespace={namespace} phrase='options' />\n </DivButton>\n <div\n className='dropdown-menu dropdown-menu-end dropdown-menu-right'\n aria-labelledby='my-videos-action'\n >\n {actions.length && (\n actions.map(action => {\n return (\n <DivButton\n key={action.label as string}\n className={`dropdown-item ${action.className}`}\n onClick={() => handleVideoAction(action)}\n >\n {action.label as string}\n </DivButton>\n );\n })\n )}\n </div>\n </div>\n </>\n )}\n {props.allowFilter && (\n <div className='border-start'>\n <TypeButton type='video' typeFilter={props.typeFilter} appLink={props.getAppLink()} />\n <TypeButton type='interactive' typeFilter={props.typeFilter} appLink={props.getAppLink()} />\n <TypeButton type='clip' typeFilter={props.typeFilter} appLink={props.getAppLink()} />\n </div>\n )}\n </div>\n </>\n );\n}\n\ninterface TypeButtonProps {\n type: SearchIndices;\n typeFilter: SearchIndices[];\n appLink: Core.AppLink;\n}\n\nfunction TypeButton(props: TypeButtonProps): JSX.Element {\n const selected = props.typeFilter.includes(props.type);\n\n const currentAppLink = props.appLink;\n const currentParams = currentAppLink.params as HashObject;\n\n let newType: SearchIndices[];\n\n if (selected)\n newType = props.typeFilter.filter(t => t !== props.type);\n else\n newType = [ ...props.typeFilter, props.type ];\n\n const newAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n type: newType\n }\n };\n\n function getTypePhrase(): string {\n if (props.type === 'video') return 'videos';\n if (props.type === 'clip') return 'clips';\n if (props.type === 'interactive') return 'interactives';\n }\n\n return (\n <AppLink\n className={`ms-2 btn ${selected ? 'btn-dark' : 'btn-outline-dark'}`}\n appLink={newAppLink}\n >\n <Text namespace={namespace} phrase={getTypePhrase()} />\n </AppLink>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\n/**\n * Hook used to listen to updates on a Backbone Collection\n * and trigger a re-render.\n */\nexport function useGetCollectionItems<T>(\n getCollection: () => Core.Collection,\n onRemove?: () => void,\n dependencies: React.DependencyList = []\n): T[] {\n const [ , setUpdate ] = React.useState(false);\n\n React.useEffect(() => {\n const collection = getCollection();\n\n if (!collection)\n return;\n\n collection.off('add remove change');\n collection.on('add remove change', () => {\n setUpdate(s => !s);\n });\n if (onRemove)\n collection.on('remove', onRemove);\n return () => { collection.off('add remove change'); };\n }, dependencies);\n\n return getCollection()?.toJSON();\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BaseObject, MasterNestedObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nfunction _find<T extends BaseTree<BaseObject>>(\n node: T,\n id: string | number,\n parents: T[]\n): [ T | null, T[] ] {\n if (TextHelper.isEqual(node.id, id))\n return [ node, parents ];\n\n const children = node.children;\n\n if (!children || !children.length)\n return [ null, null ];\n\n for (let i = 0; i < children.length; i++) {\n const [ child, foundParents ] = _find(children[i] as T, id, [ ...parents, node ]);\n\n if (child)\n return [ child, foundParents ];\n }\n\n return [ null, null ];\n}\n\nexport const DEFAULT_MAX_DEPTH = 7;\n\nexport const TreeHelper = {\n find<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T | null {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [child] = _find(tree.children[j] as T, id, []);\n \n if (child)\n return child;\n }\n },\n\n getPath<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T[] {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [ , path ] = _find(tree.children[j] as T, id, []);\n \n if (path?.length)\n return path;\n }\n },\n\n getParent<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T {\n const path = TreeHelper.getPath(tree, id);\n\n if (!path?.length)\n return null;\n\n return path[path.length - 1];\n },\n\n convertNestedObjectToTree<T extends BaseObject>(nestedObject: MasterNestedObject<T>): BaseTree<T> {\n const node: BaseTree<T> = {\n ...nestedObject.data,\n children: nestedObject.children\n };\n\n if (node.children?.length)\n node.children = node.children.map(TreeHelper.convertNestedObjectToTree);\n\n return node;\n },\n\n findDepth<T extends MasterNestedObject<BaseObject>>(nodes: T[], targetId: string, currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return 0;\n }\n\n let depth = 0;\n\n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return currentDepth;\n }\n\n const childDepth = TreeHelper.findDepth(node.children, targetId, currentDepth + 1);\n\n if (childDepth > 0) {\n depth = childDepth;\n break;\n }\n }\n\n return depth;\n },\n\n findMaxChildDepth<T extends BaseObject>(nodes: MasterNestedObject<T>[], currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return currentDepth;\n }\n \n let deepestLevel = currentDepth;\n \n for (const node of nodes) {\n const childLevel = TreeHelper.findMaxChildDepth(node.children, currentDepth + 1);\n deepestLevel = Math.max(deepestLevel, childLevel);\n }\n \n return deepestLevel;\n },\n\n findTargetNode<T extends BaseObject>(nodes: MasterNestedObject<T>[], targetId: string): MasterNestedObject<T> | null {\n if (!nodes || nodes.length === 0) {\n return null;\n }\n \n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return node;\n }\n \n const result = TreeHelper.findTargetNode(node.children, targetId);\n if (result !== null) {\n return result;\n }\n }\n \n return null;\n },\n\n isMaxDepth<T extends MasterNestedObject<BaseObject>>(\n nodes: T[],\n sourceId: string,\n targetId: string,\n maxDepth: number = DEFAULT_MAX_DEPTH\n ): boolean {\n const sourceTree = TreeHelper.findTargetNode(nodes, sourceId);\n const maxChildDepth = TreeHelper.findMaxChildDepth(sourceTree.children);\n const targetDepth = TreeHelper.findDepth(nodes, targetId);\n \n return maxChildDepth + targetDepth >= maxDepth;\n },\n\n flatten<T>(\n tree: BaseTree<T>\n ): T[] {\n if (!tree)\n return [];\n\n const nodes: T[] = [];\n\n function pushNode(node: BaseTree<T>): void {\n nodes.push(ObjectHelper.omit(node, ['children']));\n node.children.forEach(pushNode);\n }\n\n tree.children.forEach(pushNode);\n\n return nodes;\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { SelectAllPagesResult, useSelectAllPages } from 'libs/shared/hooks/UseSelectAllPages';\nimport { Folder } from 'libs/shared/interfaces';\n\nexport function useFetchAllChildFolders(parentId?: string): SelectAllPagesResult<Folder> {\n const fetch = Flight.useGetFetch();\n\n function getRequest(cursor?: string): Flight.Request {\n return LibraryRequests.childFolders(parentId, cursor);\n }\n \n function fetchNext(cursor?: string): void {\n fetch(getRequest(cursor));\n }\n\n useFetchAll(!!parentId && getRequest, !!parentId && fetchNext);\n\n return (useSelectAllPages<Folder>(!!parentId && ((cursor?: string) => getRequest(cursor).key)));\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\n\nimport { AddFolderRequest } from 'apps/my-videos/interfaces/requests/AddFolderRequest';\nimport { AddToExchangeRequest } from 'apps/my-videos/interfaces/requests/AddToExchangeRequest';\nimport { MoveFolderRequest } from 'apps/my-videos/interfaces/requests/MoveFolderRequest';\nimport { MoveVideoRequest } from 'apps/my-videos/interfaces/requests/MoveVideoRequest';\n\nexport const MyVideosRequests = {\n videos(id: string, cursor?: string, typeFilter?: SearchIndices | SearchIndices[]): Flight.Request {\n const { VIDEO_COLLECTION, CLIP_COLLECTION, INTERACTIVE } = SharedWithStatements;\n\n const videoQuery = `videos[${VIDEO_COLLECTION}]{libraries.typeid:${MasterType.WorkspaceCollection}}`;\n const clipQuery = `clips[${CLIP_COLLECTION}]{status:${CurationStatus.Published}}`;\n const interactiveQuery = `interactives[${INTERACTIVE}]{status:[${CurationStatus.Published},${CurationStatus.Draft}]}`;\n\n const query = [];\n if (typeFilter?.length) {\n if (typeFilter.includes('video'))\n query.push(videoQuery);\n if (typeFilter.includes('clip'))\n query.push(clipQuery);\n if (typeFilter.includes('interactive'))\n query.push(interactiveQuery);\n } else {\n query.push(videoQuery, clipQuery, interactiveQuery);\n }\n\n const params: HashObject = {\n query: `(${query.join('|')}){orderbydesc:timestamp}`,\n permissionFilterOption: PermissionFilterOption.StripMetadata\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}/members`, params),\n key: `my:videos:${id}:${cursor}${typeFilter ? `:${Array.isArray(typeFilter) ? typeFilter.join(':') : typeFilter}` : ''}`\n };\n },\n\n workspaceWithCategories(): Flight.Request {\n return {\n // TODO: Need to stop using domain\n url: UrlHelper.urlBuilder('/api/domain/v2/me/libraries', {\n type: ['workspace'],\n maxCategoryDepth: 6\n }),\n key: 'workspace:folders',\n normalize: false\n };\n },\n\n exchangeWithCategories(): Flight.Request {\n return {\n // TODO: Need to stop using domain\n url: UrlHelper.urlBuilder('/api/domain/v2/me/libraries', {\n type: ['exchange'],\n maxCategoryDepth: 5\n }),\n key: 'exchange:folders',\n normalize: false\n };\n },\n\n addFolder(data: AddFolderRequest): Flight.Request {\n // TODO: Need to stop using domain\n let url = `/api/domain/v2/collections/${data.collectionId}/categories`;\n\n if (data.parentCategoryId)\n url = UrlHelper.urlBuilder(url, { parentCategoryId: data.parentCategoryId });\n\n return {\n url,\n key: 'add:folder',\n type: HttpVerbs.POST,\n data: { name: data.name },\n invalidationKeys: [ 'workspace', 'folder' ]\n };\n },\n\n deleteFolder(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}`,\n key: 'delete:folder',\n type: HttpVerbs.DELETE,\n invalidationKeys: [ 'workspace', 'folder' ]\n };\n },\n\n moveFolder(data: MoveFolderRequest): Flight.Request {\n return {\n // TODO: Need to stop using domain\n url: '/api/domain/v2/objects/move',\n key: 'move:folder',\n type: HttpVerbs.POST,\n data: {\n assocType: 'has',\n newCollectionId: data.newFolderId,\n oldCollectionId: data.oldFolderId,\n objectIds: [data.moveFolderId]\n },\n invalidationKeys: [ 'workspace', 'folder' ]\n };\n },\n\n updateFolder(id: string, name: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}`,\n key: 'rename:folder',\n type: HttpVerbs.PUT,\n data: { name },\n invalidationKeys: [ 'workspace', 'folder' ]\n };\n },\n\n videoFolders(videoId: string, libraryId: string): Flight.Request {\n return {\n // TODO: Need to stop using domain\n url: `/api/domain/v2/objects/${videoId}/categories?query=libraries{id:${libraryId}}`,\n key: `video:folders:${videoId}`\n };\n },\n\n moveVideo(request: MoveVideoRequest): Flight.Request {\n const data: HashObject = {\n newCollectionId: request.newFolderId,\n oldCollectionId: request.oldFolderId,\n objectIds: request.videoId\n };\n\n return {\n url: '/api/domain/v3/objects/move',\n key: `move:folder:${data.objectIds.join(',')}`,\n type: HttpVerbs.POST,\n data,\n invalidationKeys: ['video']\n };\n },\n\n addToExchange(data: AddToExchangeRequest): Flight.Request {\n return {\n url: '{gateway}/v1/users/me/videos/exchange',\n key: 'add:to:exchange',\n type: HttpVerbs.POST,\n data\n };\n }\n};","\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { AlertType } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { BaseTree, Folder, Library, LibraryTree, VideoTypes } from 'libs/shared/interfaces';\nimport { DEFAULT_MAX_DEPTH, TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MyVideosRequests } from 'apps/my-videos/flight-requests/MyVideosRequests';\n\nconst namespace = 'myVideos.hooks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useDragDropMove() {\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n const categoriesRequest = MyVideosRequests.workspaceWithCategories();\n const workspaceFolders = Flight.useGetResponse<LibraryTree[]>(categoriesRequest.key);\n\n async function handleDragEnd(event: DragEndEvent, source: Folder) {\n const dragged = event.active?.data.current;\n const destination = event.over?.data.current;\n\n if (!destination || dragged.id === destination.id) return;\n \n if (dragged.typeId === MasterType.Category) {\n moveFolders(dragged, destination);\n return;\n }\n\n moveVideos(dragged, destination, source);\n }\n\n async function moveFolders(dragged: Folder, destination: Folder) {\n let folders = workspaceFolders.data;\n\n if (workspaceFolders.shouldFetch)\n folders = await fetchAsync(categoriesRequest);\n\n if (TreeHelper.isMaxDepth(folders, dragged.id, destination.id)) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MAX_FOLDER_DEPTH,\n args: [DEFAULT_MAX_DEPTH]\n });\n return;\n }\n\n const rootBranches: BaseTree<Library> = {\n children: folders.map(TreeHelper.convertNestedObjectToTree)\n };\n\n const parent = TreeHelper.getParent(rootBranches, dragged.id);\n\n try {\n await fetchAsync(MyVideosRequests.moveFolder({\n moveFolderId: dragged.id,\n newFolderId: destination.id,\n oldFolderId: parent?.id\n }));\n alerts.success({\n type: AlertType.Success,\n heading: getPhrase('moveFolderSuccessHeading'),\n message: getPhrase('moveFolderSuccess', { folder: dragged.name, toFolder: destination.name, escapeText: true }),\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ destination.id, destination.name ]\n },\n appLinkText: getPhrase('goToFolder', { folder: destination.name, escapeText: true }),\n appLinkClassName: 'text-blue'\n });\n } catch {\n alerts.error(getPhrase('error'));\n }\n }\n\n async function moveVideos(dragged: VideoTypes | string[], destination: Folder, source: Folder) {\n try {\n await fetchAsync(MyVideosRequests.moveVideo({\n newFolderId: destination.id,\n oldFolderId: source.id,\n videoId: Array.isArray(dragged) ? dragged : [dragged.id]\n }));\n if (Array.isArray(dragged)) {\n alerts.success({\n type: AlertType.Success,\n heading: getPhrase('moveVideosSucccessHeading'),\n message: getPhrase(\n 'moveVideosSuccess',\n { count: dragged.length, fromFolder: source.name, toFolder: destination.name, escapeText: true }\n ),\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ destination.id, destination.name ]\n },\n appLinkText: getPhrase('goToFolder', { folder: destination.name, escapeText: true }),\n appLinkClassName: 'text-blue'\n });\n } else {\n alerts.success(\n {\n type: AlertType.Success,\n heading: getPhrase('moveVideoSucccessHeading'),\n message: getPhrase('moveVideoSuccess', { video: dragged.name, fromFolder: source.name, toFolder: destination.name, escapeText: true }),\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ destination.id, destination.name ]\n },\n appLinkText: getPhrase('goToFolder', { folder: destination.name, escapeText: true }),\n appLinkClassName: 'text-blue'\n }\n );\n }\n } catch {\n alerts.error(getPhrase('error'));\n }\n }\n\n return {\n handleDragEnd\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useInstanceSafe } from 'libs/common/react/hooks/UseInstance';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { Services } from 'shared/constants/Services';\n\nimport { useGetUploadingItems } from 'apps/upload/hooks/useGetUploadingItems';\nimport { CombinedUploadStatus } from 'apps/upload/services/CombinedUploadsStatus';\nimport { CombinedUpload, CombineUploadsService } from 'apps/upload/services/CombineUploadsService';\n\ninterface UseDisplayUploadsOptions {\n onRemove: () => void;\n categoryId?: number;\n}\n\nexport function useUploadItems(options: UseDisplayUploadsOptions) {\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const canUpload = hasPermissions(PermissionName.UploadVideo);\n\n /**\n * Get reference to the combined service even though useGetUploadingItems does it too\n * so that we can provide the callbacks\n */\n const combinedUploadService = useInstanceSafe<CombineUploadsService>(\n canUpload &&\n Services.CombineUploads\n );\n\n /**\n * Only allow callback to fetch if all required user data is loaded\n */\n let uploadingVideos = useGetUploadingItems(canUpload, () => {\n currentUser.data && options.onRemove();\n }, [currentUser.data]);\n\n uploadingVideos = uploadingVideos?.filter(video => {\n if (!options.categoryId)\n return !video.categoryId;\n\n return video.categoryId === options.categoryId;\n });\n\n /**\n * Using React.useCallback because this component will render\n * every time a chunk is loaded and every time the pending items\n * is fetched\n */\n const onClickDelete = React.useCallback((item: CombinedUpload) => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.UPLOAD,\n action: Actions.Upload.CANCEL_UPLOAD,\n args: [item.id],\n params: {\n name: item.name,\n status: item.status\n }\n });\n }, []);\n\n const onClickAlternate = React.useCallback((item: CombinedUpload) => {\n switch (item.status) {\n case CombinedUploadStatus.Errored:\n combinedUploadService.retryItem(item);\n return;\n case CombinedUploadStatus.Processing:\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.EDIT_VIDEO,\n args: [item.videoId]\n });\n return;\n case CombinedUploadStatus.Uploading:\n combinedUploadService.editUpload(item);\n break;\n default:\n // This should never happen\n }\n }, []);\n\n const processingIds = uploadingVideos?.reduce((prev: any, current) => {\n prev[current.videoId] = true;\n return prev;\n }, {});\n\n return {\n uploadingVideos,\n onClickAlternate,\n onClickDelete,\n processingIds\n };\n}","import React from 'react';\n\nimport { useInstanceSafe } from 'libs/common/react/hooks/UseInstance';\n\nimport { useGetCollectionItems } from 'libs/shared/hooks/UseGetCollectionItems';\n\nimport { CombinedUpload, CombineUploadsService } from '../services/CombineUploadsService';\n\nexport function useGetUploadingItems(\n canUpload: boolean,\n onRemove: () => void,\n dependencies: React.DependencyList\n): CombinedUpload[] {\n const combineUploadsService = useInstanceSafe<CombineUploadsService>(canUpload && 'combine:uploads:service');\n\n const getCollection = () => canUpload ? combineUploadsService?.getCollection() : null;\n\n return useGetCollectionItems(getCollection, onRemove, dependencies);\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Folder } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'myVideos.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * This is a hook, just to make modifying this function to fetch data easier in the future.\n * It also adheres to the paradigm we have with all our video actions - Sha\n */\nexport function useGetFolderActions(): (location: 'folder' | 'page', folder: Folder) => ActionOptions[] {\n return (location, folder) => {\n const analyticsData = { id: folder.id, name: folder.name };\n const analyticsOptions = {\n entity: EntityType.Folder,\n location: location === 'folder' ? LocationContext.SubFolderList : LocationContext.MyVideos,\n workflowPhase: WorkflowPhase.Start\n };\n\n return [\n {\n label: getPhrase('addSubfolder'),\n button: location === 'page',\n className: location === 'page' ? 'btn btn-outline-dark me-2' : undefined,\n svgName: location === 'page' ? cvSvgLibrary.Plus : undefined,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.ADD_FOLDER,\n args: [folder.id]\n },\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Create\n }\n },\n {\n label: getPhrase('moveFolder'),\n button: false,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MOVE_FOLDER,\n args: [folder.id]\n },\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Move\n }\n },\n {\n label: getPhrase('renameFolder'),\n button: false,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.RENAME_FOLDER,\n args: [folder.id]\n },\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Rename\n }\n },\n {\n label: getPhrase('removeFolder'),\n className: 'text-danger',\n button: false,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.DELETE_FOLDER,\n args: [folder.id]\n },\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Delete\n }\n }\n ];\n };\n}","import { EntityType } from 'libs/analytics/interfaces';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nexport const AnalyticsTypeHelper = {\n mapTypeId(typeId: MasterType): EntityType {\n switch (typeId) {\n case MasterType.Video:\n return EntityType.Video;\n case MasterType.Clip:\n return EntityType.Clip;\n case MasterType.Interactive:\n return EntityType.Interactive;\n default:\n return null;\n }\n }\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AddToExchangeDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { AnalyticsTypeHelper } from 'libs/shared/utils/AnalyticsTypeHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\n\nimport { useHasExchange } from 'apps/my-videos/hooks/useHasExchange';\n\nconst namespace = 'default.myVideos';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getMovePhrase(video: VideoTypes): string {\n if (VideoHelper.isInteractive(video))\n return getPhrase('moveInteractive');\n\n if (VideoHelper.isClip(video))\n return getPhrase('moveClip');\n\n return getPhrase('moveVideo');\n}\n\nexport function useMyVideosViewBulkActions(\n libraryId: string,\n categoryId: string\n): (videoIds: string[]) => ActionOptions[] {\n return (videoIds: string[]) => {\n return [{\n label: getPhrase('moveVideo'),\n button: false,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MOVE_VIDEO,\n params: { ids: videoIds }\n },\n analyticsData: {\n ids: videoIds\n },\n analyticsOptions: {\n entity: EntityType.Video,\n actionType: UserAction.Move,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start\n }\n }, {\n label: getPhrase('delete'),\n button: false,\n appLink: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.DELETE_VIDEO,\n params: { ids: videoIds, libraryId, categoryId }\n },\n className: 'btn btn-link text-danger',\n analyticsOptions: {\n entity: EntityType.Video,\n actionType: UserAction.Delete,\n location: LocationContext.VideoList,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData: { ids: videoIds }\n }];\n };\n}\n\nexport function useMyVideosViewActions() {\n const { myVideosFolders } = useSettings(null);\n const hasExchange = useHasExchange();\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const getVideoActions = (video: VideoTypes, options?: VideoActionsOptions) => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n\n /**\n * Where a user has a video they can no longer be access, we will allow them to remove it.\n */\n if (!canConsume) {\n return [{\n label: getPhrase('delete'),\n button: false,\n svgName: cvSvgLibrary.Delete,\n appLink: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.DELETE_VIDEO,\n params: { ids: [video.id]}\n },\n className: 'btn btn-link text-danger',\n analyticsOptions: {\n entity: EntityType.Video,\n actionType: UserAction.Delete,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData: {\n id: video.id\n }\n }];\n }\n\n const actions = videoActions.getVideoActions(video, options);\n\n if (myVideosFolders) {\n actions.push({\n order: 67,\n label: getMovePhrase(video),\n svgName: cvSvgLibrary.Move,\n button: false,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MOVE_VIDEO,\n params: { ids: [video.id]}\n },\n analyticsData: {\n id: video.id\n },\n analyticsOptions: {\n entity: AnalyticsTypeHelper.mapTypeId(video.typeId),\n actionType: UserAction.Move,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start\n },\n group: 'edit'\n });\n\n if (VideoHelper.isVideo(video) && hasExchange) {\n actions.push({\n order: 63,\n label: getPhrase('contribute'),\n svgName: cvSvgLibrary.Upload,\n button: false,\n appLink: {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.ADD_TO_EXCHANGE,\n args: [video.id]\n },\n analyticsData: {\n id: video.id\n },\n analyticsOptions: {\n entity: AnalyticsTypeHelper.mapTypeId(video.typeId),\n actionType: UserAction.Create,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start,\n descriptor: AddToExchangeDescriptor.AddToExchange\n },\n group: 'add'\n });\n }\n }\n\n return actions;\n };\n\n return {\n ...videoActions,\n getVideoActions\n };\n}","import { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nexport function useHasExchange(): boolean {\n const { hasProduct } = useProducts();\n const { exchangeTvProductOption } = useSettings(null);\n const { hasPermissions } = usePermissions();\n\n if (!hasProduct(ProductId.Exchange))\n return false;\n\n if (exchangeTvProductOption !== 'exchange' && exchangeTvProductOption !== 'exchange_and_tv')\n return false;\n\n if (!hasPermissions(PermissionName.Exchange))\n return false;\n\n return true;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'default.myVideosEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function MyVideosEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.MY_VIDEOS} altText={getPhrase('info')} />\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function MyVideosPublicEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.MY_VIDEOS_PUBLIC} altText={getPhrase('publicInfo')} />\n <EmptyState.Heading><Text phrase='publicHeading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='publicInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'publicCta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.MyVideoLanding,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import * as React from 'react';\nimport { Col, ProgressBar, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { CombinedUploadStatus } from 'apps/upload/services/CombinedUploadsStatus';\nimport { CombinedUpload } from 'apps/upload/services/CombineUploadsService';\n\nconst namespace = 'upload.uploadingItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getClassName(status: CombinedUploadStatus): string {\n switch (status) {\n case CombinedUploadStatus.Uploading:\n return 'text-success';\n case CombinedUploadStatus.Processing:\n return 'text-info';\n case CombinedUploadStatus.Errored:\n return 'text-danger';\n }\n}\n\nfunction getVariant(status: CombinedUploadStatus): 'success' | 'info' | 'danger' {\n switch (status) {\n case CombinedUploadStatus.Uploading:\n return 'success';\n case CombinedUploadStatus.Processing:\n return 'info';\n case CombinedUploadStatus.Errored:\n return 'danger';\n }\n}\n\nfunction getProgressText(status: CombinedUploadStatus, progress: number): string | JSX.Element {\n const rounded = Math.round(progress) || 0;\n\n switch (status) {\n case CombinedUploadStatus.Uploading:\n return `${getPhrase('uploading')} ${rounded}%`;\n\n case CombinedUploadStatus.Processing:\n if (rounded === 0)\n return <em>{getPhrase('waitingToBeProcessed')}</em>;\n return <em>{getPhrase('processing')} {rounded}%</em>;\n\n case CombinedUploadStatus.Errored:\n return getPhrase('error');\n }\n}\n\ninterface UploadingItemProps {\n item: CombinedUpload;\n allowBulkAction?: boolean;\n onClickDelete: (item: CombinedUpload) => void;\n onClickAlternate: (item: CombinedUpload) => void;\n}\n\nexport function UploadingItem(props: UploadingItemProps): JSX.Element {\n const { status, progress, name } = props.item;\n\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n /**\n * We're using React.useCallback here because this view\n * will get re-rendered many times by it's parent during\n * an upload\n */\n const onClickAlternate = React.useCallback(() => {\n props.onClickAlternate(props.item);\n }, [props.item.status]);\n\n const onClickDelete = React.useCallback(() => {\n props.onClickDelete(props.item);\n }, []);\n\n let appLink: Core.AppLink = null;\n if (props.item.video?.status === CurationStatus.Published) {\n appLink = {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.item.videoId, TextHelper.slugify(props.item.video.name) ]\n };\n }\n \n return (\n <div className='d-flex flex-row'>\n {props.allowBulkAction && <div className='form-check pe-2 mx-2' />}\n <Row className={`${isSmall ? '' : 'py-2'} g-0 flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <AppLink appLink={appLink}>\n <BaseImage\n data={props.item.thumbnailUrl ?? ''}\n imageType={ImageType.Thumbnails}\n imageOptions={{ size: ImageSize.Medium }}\n >\n <ImageFallback type={ImageFallbackType.Video} />\n </BaseImage>\n </AppLink>\n </div>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <AppLink appLink={appLink}>\n <h5 className='m-0 pb-1'>{name}</h5>\n </AppLink>\n <span className={getClassName(status)}>{getProgressText(status, progress)}</span>\n <div className='d-flex'>\n <ProgressBar className='flex-grow-1 align-self-center' variant={getVariant(status)} now={progress} />\n <SvgContainer\n className='svg-container cursor-pointer ms-2'\n svgName={status === CombinedUploadStatus.Errored ? cvSvgLibrary.Retry : cvSvgLibrary.Edit}\n onClick={onClickAlternate}\n />\n <SvgContainer\n className='svg-container cursor-pointer ms-2'\n svgName={cvSvgLibrary.Delete}\n onClick={onClickDelete}\n />\n </div>\n </Col>\n </Row>\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"dragOverlay\":\"ry0mg\",\"dragThumbnail\":\"soAvD\"};","import React from 'react';\n\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Folder, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './drag-drop-overlay.scss';\n\nconst namespace = 'shared.dragDropOverlay';\n\ninterface DragDropMoveOverlayProps {\n activeDragData: Folder | VideoTypes | string[];\n}\n\nexport function DragDropOverlay(props: DragDropMoveOverlayProps) {\n const { activeDragData } = props;\n\n return (\n <div className={`${styles.dragOverlay} position-relative`}>\n <div className='position-absolute top-0 start-50 ms-n2 bg-white shadow p-2 rounded-3 font-size-md mw-100'>\n {Array.isArray(activeDragData) ? (\n <div className='d-flex fw-semibold'>\n <div className='me-1'>\n <SvgContainer svgName={cvSvgLibrary.Video} />\n </div>\n <Text namespace={namespace} phrase='bulkVideos' options={{ length: activeDragData.length }} />\n </div>\n ) : (\n <div className='d-flex'>\n {activeDragData.typeId === MasterType.Category ? (\n <div className='me-1'>\n <SvgContainer svgName={cvSvgLibrary.Folder} />\n </div>\n ) : (\n <LazyImage\n src={VideoHelper.getThumbnail(activeDragData)?.url}\n alt={activeDragData.name}\n className={`${styles.dragThumbnail} partial-loading-background rounded me-2`}\n />\n )}\n <span className='fw-semibold text-truncate'>{activeDragData.name}</span>\n </div>\n )}\n </div>\n </div>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation } = usePresentation({ redirectOnError: true });\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!activePresentation &&\n AudienceRequests.presentationAudiences(activePresentation.id)\n );\n\n return audiences;\n};","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { cloneElement } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { map } from './ElementChildren';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst ROUND_PRECISION = 1000;\n\n/**\n * Validate that children, if any, are instances of `ProgressBar`.\n */\nfunction onlyProgressBar(props, propName, componentName) {\n const children = props[propName];\n if (!children) {\n return null;\n }\n let error = null;\n React.Children.forEach(children, child => {\n if (error) {\n return;\n }\n\n /**\n * Compare types in a way that works with libraries that patch and proxy\n * components like react-hot-loader.\n *\n * see https://github.com/gaearon/react-hot-loader#checking-element-types\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n const element = /*#__PURE__*/_jsx(ProgressBar, {});\n if (child.type === element.type) return;\n const childType = child.type;\n const childIdentifier = /*#__PURE__*/React.isValidElement(child) ? childType.displayName || childType.name || childType : child;\n error = new Error(`Children of ${componentName} can contain only ProgressBar ` + `components. Found ${childIdentifier}.`);\n });\n return error;\n}\nfunction getPercentage(now, min, max) {\n const percentage = (now - min) / (max - min) * 100;\n return Math.round(percentage * ROUND_PRECISION) / ROUND_PRECISION;\n}\nfunction renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n className,\n style,\n variant,\n bsPrefix,\n ...props\n}, ref) {\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...props,\n role: \"progressbar\",\n className: classNames(className, `${bsPrefix}-bar`, {\n [`bg-${variant}`]: variant,\n [`${bsPrefix}-bar-animated`]: animated,\n [`${bsPrefix}-bar-striped`]: animated || striped\n }),\n style: {\n width: `${getPercentage(now, min, max)}%`,\n ...style\n },\n \"aria-valuenow\": now,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n children: visuallyHidden ? /*#__PURE__*/_jsx(\"span\", {\n className: \"visually-hidden\",\n children: label\n }) : label\n });\n}\nconst ProgressBar = /*#__PURE__*/React.forwardRef(({\n isChild = false,\n ...rest\n}, ref) => {\n const props = {\n min: 0,\n max: 100,\n animated: false,\n visuallyHidden: false,\n striped: false,\n ...rest\n };\n props.bsPrefix = useBootstrapPrefix(props.bsPrefix, 'progress');\n if (isChild) {\n return renderProgressBar(props, ref);\n }\n const {\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant,\n className,\n children,\n ...wrapperProps\n } = props;\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...wrapperProps,\n className: classNames(className, bsPrefix),\n children: children ? map(children, child => /*#__PURE__*/cloneElement(child, {\n isChild: true\n })) : renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant\n }, ref)\n });\n});\nProgressBar.displayName = 'ProgressBar';\nexport default ProgressBar;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["getDirectionClass","direction","Caret","props","SvgContainer","svgName","className","defaultProps","DragDropMoveContext","activeDragData","setActiveDragData","DragOverlayComponent","dragOverlayComponent","mouseSensor","activationConstraint","distance","sensors","onDragEnd","event","handleDragEnd","source","onDragStart","active","data","current","handleDragStart","collisionDetection","children","dropAnimation","modifiers","zIndex","LibraryFolder","thumbnailUrl","folder","thumbnail","UrlHelper","url","size","actions","getFolderActions","DragDropMoveWrapper","draggable","drag","id","droppable","drop","dropStye","dragStyle","AppLink","appLink","getAppLink","title","name","BaseImage","imageType","imageClassName","ImageFallback","type","extraClasses","length","Actions","actionsDropdownClassName","dropdownToggleSvgSize","namespace","EXPANDED_FOLDERS_KEY","FolderList","breakpoints","LocalStorageHelper","_hasExpandedFolders","setHasExpandedFolders","hasExpandedFolders","expandFolders","folderLimit","useBreakpoints","xxl","xl","lg","md","onToggleFolderView","displayableFolders","folders","slice","canToggleCollapsedView","showHeading","DivButton","onClick","Text","phrase","options","count","extraButtons","map","f","key","PartialFolder","PartialFolderList","Array","fill","_","i","PartialVideoList","numVideos","allowBulkActions","PartialVideoItem","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","VideoListActions","CheckboxHelper","checkboxHelper","setActions","allowBulkAction","checked","bulkChecked","onChange","onToggleBulk","indeterminate","hasSomeSelections","getVideosBulkAction","getSelected","action","label","analyticsData","analyticsOptions","handleVideoAction","allowFilter","TypeButton","typeFilter","newType","selected","includes","currentAppLink","currentParams","params","filter","t","newAppLink","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","useGetCollectionItems","getCollection","onRemove","dependencies","setUpdate","collection","off","on","s","toJSON","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","isArray","useEffect","forEach","useBulkCheckboxManager","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","clear","isChecked","item","toString","get","isBulkChecked","every","setSelected","ids","set","preselectedIds","setValue","onToggleItem","nextItemState","from","keys","deselectAll","find","getSelectedCount","getMap","usePrevious","value","ref","_find","node","parents","child","foundParents","DEFAULT_MAX_DEPTH","TreeHelper","tree","j","getPath","path","getParent","convertNestedObjectToTree","nestedObject","findDepth","nodes","targetId","currentDepth","depth","childDepth","findMaxChildDepth","deepestLevel","childLevel","Math","max","findTargetNode","result","isMaxDepth","sourceId","maxDepth","sourceTree","flatten","pushNode","push","useFetchAllChildFolders","parentId","fetch","getRequest","cursor","MyVideosRequests","videos","VIDEO_COLLECTION","CLIP_COLLECTION","INTERACTIVE","videoQuery","clipQuery","interactiveQuery","query","permissionFilterOption","workspaceWithCategories","maxCategoryDepth","normalize","exchangeWithCategories","addFolder","collectionId","parentCategoryId","invalidationKeys","deleteFolder","moveFolder","assocType","newCollectionId","newFolderId","oldCollectionId","oldFolderId","objectIds","moveFolderId","updateFolder","videoFolders","videoId","libraryId","moveVideo","request","addToExchange","getPhrase","useDragDropMove","alerts","fetchAsync","categoriesRequest","workspaceFolders","moveFolders","dragged","destination","shouldFetch","application","args","rootBranches","parent","success","heading","message","toFolder","escapeText","appLinkText","appLinkClassName","error","moveVideos","fromFolder","video","over","typeId","useUploadItems","hasPermissions","usePermissions","currentUser","UserRequests","canUpload","PermissionName","combinedUploadService","Services","uploadingVideos","combineUploadsService","useGetUploadingItems","categoryId","onClickDelete","onClickAlternate","retryItem","editUpload","processingIds","reduce","prev","useGetFolderActions","location","entity","workflowPhase","button","undefined","actionType","AnalyticsTypeHelper","mapTypeId","MasterType","LanguageService","getMovePhrase","VideoHelper","useMyVideosViewBulkActions","videoIds","useMyVideosViewActions","hasProduct","exchangeTvProductOption","myVideosFolders","useSettings","hasExchange","ProductId","videoActions","useVideoActions","getVideoActions","canConsume","order","group","descriptor","AddToExchange","MyVideosEmptyState","src","altText","MyVideosPublicEmptyState","text","SignUp","getClassName","getVariant","UploadingItem","progress","imageOptions","rounded","round","getProgressText","variant","now","DragDropOverlay","LazyImage","alt","usePresentationAudiences","activePresentation","redirectOnError","ROUND_PRECISION","getPercentage","min","percentage","renderProgressBar","visuallyHidden","striped","animated","style","bsPrefix","role","width","ProgressBar","isChild","rest","wrapperProps","cloneElement","displayName","as","Component","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[227],{49927:(e,t,n)=>{n.d(t,{u:()=>o});var r=n(57900),a=n(70064),l=function(e){return"recent:playlists:added:to:".concat(e)},o={getRecentlyAddedTo:function(e){return a.V.getRecentItem(l(e),r.SG)},addRecentlyAddedTo:function(e,t){return a.V.addRecentItem(l(e),r.SG,t)},removeRecentlyAddedTo:function(e,t){a.V.removeRecentItem(l(e),t,r.SG)}}},50227:(e,t,n)=>{n.r(t),n.d(t,{DeletePlaylistView:()=>P});var r=n(32735),a=n(70680),l=n(23481),o=n(81886),c=n(20354),i=n(49985),u=n(65858),s=n(49927),d=n(9111),p=n(13876),m=n(83345),y=n(5112),f=n(31949),v=n(69883),h=n(79612);function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var w="playlists.deletePlaylist",b=l.T.encloseNamespace(w);function P(e){var t,n,l=(0,a.I0)(),P=(0,v.Z)(),S=(t=r.useState(!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,o,c=[],i=!0,u=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);i=!0);}catch(e){u=!0,a=e}finally{try{if(!i&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return c}}(t,n)||function(e,t){if(e){if("string"==typeof e)return g(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?g(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),k=S[0],A=S[1],E=c.a.useBasicFetch(y.C.getPlaylist(e.playlistId)),I=c.a.useBasicFetch(f.N.currentUser()),T=E.data&&b("title",{name:E.data.name});(0,h.M)({title:T});var C=!!E.data&&!!I.data;return r.createElement(m.D.Provider,{value:w},r.createElement(d.G,{title:b("heading"),closePopup:e.closePopup,showLoadingSpinner:!C},C&&r.createElement(r.Fragment,null,r.createElement("p",null,r.createElement(m.x,{phrase:"warning",options:{name:E.data.name}})),r.createElement("p",null,r.createElement(m.x,{phrase:"videoNote"})),r.createElement(p.u,null,r.createElement(p.u.Cancel,{onClick:e.closePopup}),r.createElement(p.u.Submit,{variant:"danger",onClick:function(){A(!0),c.a.fetch(l,y.C.deletePlaylist(e.playlistId,(function(){s.u.removeRecentlyAddedTo(I.data.id,e.playlistId),P.success(b("success",{name:E.data.name,escapeText:!0})),i.k.logUserAction({id:e.playlistId},i.k.mergeOptions(e.analyticsOptions,{actionType:u.Vw.Delete,entity:u.py.Playlist,workflowPhase:u.eu.Complete})),e.closePopup(),e.routeToOnDelete&&o.Q.C$.trigger(e.routeToOnDelete)}),(function(){P.error(b("error",{name:E.data.name,escapeText:!0})),e.closePopup()})))},text:b("confirm"),showSpinner:k})))))}}}]);
|
|
2
|
-
//# sourceMappingURL=227-fb7b36b41a-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/227-fb7b36b41a-lite.chunk.js","mappings":"6JAIMA,EAAc,SAACC,GAAc,0CAAkCA,EAAM,EAO9DC,EAAuB,CAIlCC,mBAAkB,SAACF,GACjB,OAAO,kBAA+BD,EAAYC,GAAS,KAC7D,EAEAG,mBAAkB,SAACH,EAAgBI,GACjC,OAAO,kBAA+BL,EAAYC,GAAS,KAAoBI,EACjF,EAEAC,sBAAqB,SAACL,EAAgBM,GACpC,qBAAkCP,EAAYC,GAASM,EAAI,KAC7D,E,4UCLF,IAAMC,EAAY,2BACZC,EAAY,qBAAiCD,GAS7C,SAAUE,EAAmBC,GACjC,I,IAAMC,GAAW,UACXC,GAAS,SAE0D,G,EAArB,YAAe,G,EAAM,E,k5BAAjEC,EAAiB,KAAEC,EAAoB,KAEzCC,EAAW,kBAA+B,gBAA6BL,EAAMM,aAC7EC,EAAc,kBAAkC,mBAEhDC,EAAQH,EAASI,MAAQX,EAAU,QAAS,CAAEY,KAAML,EAASI,KAAKC,QACxE,OAAmB,CAAEF,MAAAA,IAErB,IA4BMG,IAAaN,EAASI,QAAUF,EAAYE,KAElD,OACE,gBAAC,aAAiC,CAACG,MAAOf,GACxC,gBAAC,IAAK,CAACW,MAAOV,EAAU,WAAYe,WAAYb,EAAMa,WAAYC,oBAAqBH,GACpFA,GACC,gCACE,yBACE,gBAAC,IAAI,CAACI,OAAO,UAAUrB,QAAS,CAAEgB,KAAML,EAASI,KAAKC,SAExD,yBAAG,gBAAC,IAAI,CAACK,OAAO,eAEhB,gBAAC,IAAY,KACX,gBAAC,WAAmB,CAACC,QAAShB,EAAMa,aACpC,gBAAC,WAAmB,CAACI,QAAQ,SAASD,QA1C3B,WACrBZ,GAAqB,GAwBrB,UAAaH,EAAU,mBAAgCD,EAAMM,YAtB3C,WAChB,0BAA2CC,EAAYE,KAAKb,GAAII,EAAMM,YAEtEJ,EAAOgB,QAAQpB,EAAU,UAAW,CAAEY,KAAML,EAASI,KAAKC,KAAMS,YAAY,KAE5E,kBAA8B,CAAEvB,GAAII,EAAMM,YAAc,iBAA6BN,EAAMoB,iBAAkB,CAC3GC,WAAY,YACZC,OAAQ,cACRC,cAAe,iBAGjBvB,EAAMa,aAEFb,EAAMwB,iBACR,eAA2BxB,EAAMwB,gBACrC,IAEgB,WACdtB,EAAOuB,MAAM3B,EAAU,QAAS,CAAEY,KAAML,EAASI,KAAKC,KAAMS,YAAY,KACxEnB,EAAMa,YACR,IAGF,EAgB2Ea,KAAM5B,EAAU,WAAY6B,YAAaxB,OAOtH,C","sources":["file:///app/packages/libs/shared/src/apps/playlists/utils/RecentPlaylistHelper.ts","file:///app/packages/projects/lite/src/apps/playlists/views/delete-playlist/DeletePlaylistView.tsx"],"sourcesContent":["import { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { RecentItemHelper } from 'libs/shared/utils/RecentItemHelper';\n\nconst getCacheKey = (userId: string) => `recent:playlists:added:to:${userId}`;\n\ninterface AddRecentPlaylistsOptions {\n id: string;\n limit?: number;\n}\n\nexport const RecentPlaylistHelper = {\n /**\n * Get a list of ids of playlists recently added to.\n */\n getRecentlyAddedTo(userId: string): string[] {\n return RecentItemHelper.getRecentItem(getCacheKey(userId), LocalStorageHelper);\n },\n\n addRecentlyAddedTo(userId: string, options: AddRecentPlaylistsOptions): string[] {\n return RecentItemHelper.addRecentItem(getCacheKey(userId), LocalStorageHelper, options);\n },\n\n removeRecentlyAddedTo(userId: string, id: string): void {\n RecentItemHelper.removeRecentItem(getCacheKey(userId), id, LocalStorageHelper);\n }\n};","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { RecentPlaylistHelper } from 'libs/shared/apps/playlists/utils/RecentPlaylistHelper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, Playlist, PropsWithAnalyticsOptions, PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.deletePlaylist';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface DeletePlaylistViewProps {\n playlistId: string;\n routeToOnDelete?: Core.AppLink;\n}\n\ntype PropTypes = PropsWithAnalyticsOptions<PropsWithPopupViewProps<DeletePlaylistViewProps>>;\n\nexport function DeletePlaylistView(props: PropTypes): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const playlist = Flight.useBasicFetch<Playlist>(PlaylistRequests.getPlaylist(props.playlistId));\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const title = playlist.data && getPhrase('title', { name: playlist.data.name });\n useSetPageMetadata({ title });\n\n const deletePlaylist = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n RecentPlaylistHelper.removeRecentlyAddedTo(currentUser.data.id, props.playlistId);\n\n alerts.success(getPhrase('success', { name: playlist.data.name, escapeText: true }));\n\n AnalyticsHelper.logUserAction({ id: props.playlistId }, AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n actionType: UserAction.Delete,\n entity: EntityType.Playlist,\n workflowPhase: WorkflowPhase.Complete\n }));\n\n props.closePopup();\n\n if (props.routeToOnDelete)\n Core.AppLinkHelper.trigger(props.routeToOnDelete);\n };\n\n const onError = () => {\n alerts.error(getPhrase('error', { name: playlist.data.name, escapeText: true }));\n props.closePopup();\n };\n\n Flight.fetch(dispatch, PlaylistRequests.deletePlaylist(props.playlistId, onSuccess, onError));\n };\n\n const isLoaded = !!playlist.data && !!currentUser.data;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup title={getPhrase('heading')} closePopup={props.closePopup} showLoadingSpinner={!isLoaded}>\n {isLoaded &&\n <>\n <p>\n <Text phrase='warning' options={{ name: playlist.data.name }} />\n </p>\n <p><Text phrase='videoNote' /></p>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit variant='danger' onClick={deletePlaylist} text={getPhrase('confirm')} showSpinner={showButtonSpinner} />\n </PopupButtons>\n </>\n }\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}"],"names":["getCacheKey","userId","RecentPlaylistHelper","getRecentlyAddedTo","addRecentlyAddedTo","options","removeRecentlyAddedTo","id","namespace","getPhrase","DeletePlaylistView","props","dispatch","alerts","showButtonSpinner","setShowButtonSpinner","playlist","playlistId","currentUser","title","data","name","isLoaded","value","closePopup","showLoadingSpinner","phrase","onClick","variant","success","escapeText","analyticsOptions","actionType","entity","workflowPhase","routeToOnDelete","error","text","showSpinner"],"sourceRoot":""}
|