@clickview/lite 0.104.0-rc.2 → 0.104.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/.vite/manifest.json +510 -510
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{BiUOH1CR.chunk.js → 2p_6pVn6.chunk.js} +2 -2
- package/dist/scripts/{BiUOH1CR.chunk.js.map → 2p_6pVn6.chunk.js.map} +1 -1
- package/dist/scripts/B1hsuVfV2.chunk.js +2 -0
- package/dist/scripts/{BwBWuxjr2.chunk.js.map → B1hsuVfV2.chunk.js.map} +1 -1
- package/dist/scripts/{Df6x5Ekm2.chunk.js → B6GfukUn2.chunk.js} +2 -2
- package/dist/scripts/{Df6x5Ekm2.chunk.js.map → B6GfukUn2.chunk.js.map} +1 -1
- package/dist/scripts/BILyzh0I.chunk.js +1 -0
- package/dist/scripts/{D_uAdX7E2.chunk.js → BTm7hIyP2.chunk.js} +2 -2
- package/dist/scripts/{D_uAdX7E2.chunk.js.map → BTm7hIyP2.chunk.js.map} +1 -1
- package/dist/scripts/{DFlO2qoz2.chunk.js → Bf9r1ZoF2.chunk.js} +2 -2
- package/dist/scripts/{DFlO2qoz2.chunk.js.map → Bf9r1ZoF2.chunk.js.map} +1 -1
- package/dist/scripts/{BgPye7Nd2.chunk.js → C46OeU6w2.chunk.js} +2 -2
- package/dist/scripts/{BgPye7Nd2.chunk.js.map → C46OeU6w2.chunk.js.map} +1 -1
- package/dist/scripts/{C62uevy9.chunk.js → C4OV7pr-.chunk.js} +2 -2
- package/dist/scripts/{C62uevy9.chunk.js.map → C4OV7pr-.chunk.js.map} +1 -1
- package/dist/scripts/{EKwCaE3J2.chunk.js → CNPKh2z72.chunk.js} +2 -2
- package/dist/scripts/{EKwCaE3J2.chunk.js.map → CNPKh2z72.chunk.js.map} +1 -1
- package/dist/scripts/{-7qiRMLt.chunk.js → CW1i-QHv.chunk.js} +2 -2
- package/dist/scripts/{-7qiRMLt.chunk.js.map → CW1i-QHv.chunk.js.map} +1 -1
- package/dist/scripts/{GolowYbA.chunk.js → Cl2FZEIX.chunk.js} +2 -2
- package/dist/scripts/{GolowYbA.chunk.js.map → Cl2FZEIX.chunk.js.map} +1 -1
- package/dist/scripts/{CVL6bQWp.chunk.js → CpzveYo2.chunk.js} +2 -2
- package/dist/scripts/{CVL6bQWp.chunk.js.map → CpzveYo2.chunk.js.map} +1 -1
- package/dist/scripts/{By9Vb8Wn.chunk.js → DFFq-sgD.chunk.js} +2 -2
- package/dist/scripts/{By9Vb8Wn.chunk.js.map → DFFq-sgD.chunk.js.map} +1 -1
- package/dist/scripts/{DICsRDM42.chunk.js → DH_0KtTK2.chunk.js} +2 -2
- package/dist/scripts/{DICsRDM42.chunk.js.map → DH_0KtTK2.chunk.js.map} +1 -1
- package/dist/scripts/{z8IWZ1V1.chunk.js → Ta3cqTAC.chunk.js} +2 -2
- package/dist/scripts/{z8IWZ1V1.chunk.js.map → Ta3cqTAC.chunk.js.map} +1 -1
- package/dist/scripts/{C8tDgg1l2.chunk.js → VJQU9c4G2.chunk.js} +2 -2
- package/dist/scripts/{C8tDgg1l2.chunk.js.map → VJQU9c4G2.chunk.js.map} +1 -1
- package/dist/scripts/{app-CuKrDFuc.js → app-LEZ4B6dG.js} +4 -4
- package/dist/scripts/{app-CuKrDFuc.js.map → app-LEZ4B6dG.js.map} +1 -1
- package/dist/scripts/{uSXjtjlJ.chunk.js → ft2cSH-j.chunk.js} +2 -2
- package/dist/scripts/{uSXjtjlJ.chunk.js.map → ft2cSH-j.chunk.js.map} +1 -1
- package/dist/scripts/jAtAipGN.chunk.js +2 -0
- package/dist/scripts/{CpsbRDII.chunk.js.map → jAtAipGN.chunk.js.map} +1 -1
- package/dist/scripts/{DhdM2yGm.chunk.js → qRLSbnEr.chunk.js} +2 -2
- package/dist/scripts/{DhdM2yGm.chunk.js.map → qRLSbnEr.chunk.js.map} +1 -1
- package/dist/scripts/{CXKdMqPJ.chunk.js → qT_Twe2q.chunk.js} +2 -2
- package/dist/scripts/{CXKdMqPJ.chunk.js.map → qT_Twe2q.chunk.js.map} +1 -1
- package/dist/scripts/{B-k4BlVQ2.chunk.js → x2GB1P6E2.chunk.js} +3 -3
- package/dist/scripts/{B-k4BlVQ2.chunk.js.map → x2GB1P6E2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/BwBWuxjr2.chunk.js +0 -2
- package/dist/scripts/CCBk_ENs.chunk.js +0 -1
- package/dist/scripts/CpsbRDII.chunk.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DFlO2qoz2.chunk.js","names":[],"sources":["../../src/shared/components/play-page/ArchivedBanner.tsx","../../src/shared/components/related-videos/RelatedVideos.tsx","../../../../libs/shared/src/components/play-page/interactives-widget/InteractiveWidgetItem.tsx","../../src/shared/components/citations/citation-generator.module.scss","../../src/shared/components/citations/EditableCitationField.tsx","../../src/shared/components/citations/CitationStyles.tsx","../../src/shared/components/citations/CitationHelpers.tsx","../../src/shared/components/citations/CitationWidget.tsx","../../src/shared/components/play-page/RestrictionBanner.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ArchiveSvg } from 'libs/shared/images/svg/objects/ArchiveSvg';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center'>\n <SvgContainer\n svg={ArchiveSvg}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, PresentationAudience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.relatedVideos';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RelatedVideosProps {\n presentationSlug: string | null;\n currentVideo: VideoTypes;\n relatedVideos: RelatedVideosHash;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({\n location: VideoActionsLocation.VideoItem,\n presentationSlug: props.presentationSlug\n });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <section\n id={PlayPageAnchor.RelatedVideos}\n className='play-page-section'\n ref={el => {\n (el && props.headingRef?.current\n && !!props.relatedVideos.videos?.length)\n && props.headingRef.current.set(PlayPageAnchor.RelatedVideos, el);\n }}\n >\n <VideoActionsContext.Provider value={videoActions}>\n <WidgetHeader name={canAutoplay ? getPhrase('upNext') : getPhrase('relatedVideos')} />\n \n {props.relatedVideos.hasCompleted ? (\n <VideoList\n videos={props.relatedVideos.videos}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={props.commonVideoProps}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore && (\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n )}\n </VideoActionsContext.Provider>\n </section>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { InteractiveMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { getTotalInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.interactiveWidgetItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n questionsAppLink: Core.AppLink;\n showOwner?: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = getTotalInteractions(interactive);\n\n return (\n <div className='flex-shrink-0 px-1 col-6 col-sm-4'>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n hideDuration={false}\n commonVideoProps={props.commonVideoProps}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n />\n </div>\n\n <AppLink\n appLink={questionsAppLink}\n className='cursor-pointer hover-text-underline'\n ariaLabel={`${getPhrase('previewQuestions', { count: questionsNumber, smartCount: questionsNumber })} ${getPhrase('ariaPreview', { name: interactive.name })}`}\n >\n {questionsNumber ?\n (\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n ) : (\n // handling a rare case: add a fallback phrase if we don't get the question number\n <Text namespace={namespace} phrase='previewQuestionsFallback' />\n )}\n </AppLink>\n </div>\n );\n});\n",":local {\n .citationButton {\n border-radius: $border-radius-sm 0 $border-radius-sm 0;\n }\n\n .citationText {\n word-break: break-word;\n }\n\n .editableFieldContainer {\n border-bottom: 1px dashed;\n cursor: pointer;\n }\n\n .editableField {\n border-radius: $border-radius-sm;\n outline: none;\n }\n\n .editableFieldEmpty {\n color: $text-muted;\n font-style: italic;\n }\n\n .editableFieldIconEmpty {\n color: $text-muted;\n }\n\n .editableFieldInput {\n border: 1px solid $blue;\n border-radius: $border-radius-sm;\n background-color: $input-focus-bg;\n box-shadow: $input-focus-box-shadow;\n outline: none;\n\n &::placeholder {\n color: $text-muted;\n font-style: italic;\n }\n }\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { EditSvg } from 'libs/shared/images/svg/actions/EditSvg';\n\nimport styles from './citation-generator.module.scss';\n\nexport interface EditableCitationFieldRef {\n focus: () => void;\n}\n\nexport interface EditableCitationFieldProps {\n value: string;\n placeholder: string;\n tooltipText: string;\n inputSize?: number;\n onChange: (value: string) => void;\n}\n\nexport const EditableCitationField = React.forwardRef<EditableCitationFieldRef, EditableCitationFieldProps>((\n props,\n ref\n) => {\n const { value, placeholder, tooltipText, onChange } = props;\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [ isEditing, setIsEditing ] = React.useState(false);\n\n React.useImperativeHandle(ref, () => ({\n focus: () => setIsEditing(true)\n }));\n\n if (isEditing) {\n return (\n <input\n ref={inputRef}\n type='text'\n size={props.inputSize}\n className={styles.editableFieldInput}\n value={value}\n placeholder={placeholder}\n autoFocus\n spellCheck={false}\n onChange={e => onChange(e.target.value)}\n onBlur={() => setIsEditing(false)}\n onKeyDown={e => e.key === 'Enter' && inputRef.current?.blur()}\n />\n );\n }\n\n return (\n <Tooltip title={tooltipText} placement='top' spanHack spanHackClassName='d-inline'>\n <div className='d-inline-block'>\n <div className={`d-flex flex-row ${styles.editableFieldContainer}`} onClick={() => setIsEditing(true)}>\n <span\n className={`${styles.editableField} ${!value ? styles.editableFieldEmpty : ''}`}\n onKeyDown={e => e.key === 'Enter' && setIsEditing(true)}\n role='button'\n tabIndex={0}\n >\n {value || placeholder}\n </span>\n <SvgContainer\n svg={EditSvg}\n size={SvgContainerSize.Small}\n className={`svg-container ${!value ? styles.editableFieldIconEmpty : ''}`}\n />\n </div>\n </div>\n </Tooltip>\n );\n});\n","import React from 'react';\n\nimport { EditableCitationField, EditableCitationFieldProps, EditableCitationFieldRef } from './EditableCitationField';\n\nexport interface EditablePlaceholder extends EditableCitationFieldProps {\n fieldRef: React.RefObject<EditableCitationFieldRef>;\n}\n\ninterface AuthorProps {\n author: string;\n placeholder?: EditablePlaceholder;\n suffix: string;\n}\n\nfunction Author({ author, placeholder, suffix }: AuthorProps): JSX.Element {\n if (placeholder) {\n return (\n <>\n <EditableCitationField\n ref={placeholder.fieldRef}\n value={placeholder.value}\n placeholder={placeholder.placeholder}\n inputSize={placeholder.inputSize}\n tooltipText={placeholder.tooltipText}\n onChange={placeholder.onChange}\n />\n {suffix}\n </>\n );\n }\n return <>{author ? `${author}${suffix}` : ''}</>;\n}\n\ninterface YearProps {\n year: number;\n placeholder?: EditablePlaceholder;\n}\n\nfunction Year({ year, placeholder }: YearProps): JSX.Element {\n if (placeholder) {\n return (\n <EditableCitationField\n ref={placeholder.fieldRef}\n value={placeholder.value}\n placeholder={placeholder.placeholder}\n inputSize={placeholder.inputSize}\n tooltipText={placeholder.tooltipText}\n onChange={placeholder.onChange}\n />\n );\n }\n return <>{year}</>;\n}\n\nexport interface SeriesInfo {\n seriesName: string;\n seasonNumber: number;\n episodeNumber: number;\n}\n\ninterface CitationComponentProps {\n name: string;\n url: string;\n viewedOn: string;\n author: string;\n publisher: string;\n productionYear: number;\n authorPlaceholder?: EditablePlaceholder;\n yearPlaceholder?: EditablePlaceholder;\n seriesInfo?: SeriesInfo;\n}\n\nexport function APA6Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, author, publisher, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). {name}\n {' '}(Season {seriesInfo.seasonNumber}, Episode {seriesInfo.episodeNumber}) [TV series episode].\n {' '}In <em>{seriesInfo.seriesName}</em>. {publisher}. Retrieved from {url}\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). <em>{name}</em> [Motion picture].\n {' '}{publisher}. Retrieved from {url}\n </span>\n );\n}\n\nexport function APA7Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, author, publisher, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). {name}\n {' '}(Season {seriesInfo.seasonNumber}, Episode {seriesInfo.episodeNumber}) [TV series episode].\n {' '}In <em>{seriesInfo.seriesName}</em>. {publisher}. {url}\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). <em>{name}</em> [Film]. {publisher}. {url}\n </span>\n );\n}\n\nexport function HarvardCitation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). '{name}',\n {' '}<em>{seriesInfo.seriesName}</em>, Season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber} [video].\n {' '}ClickView. Available at: {url} (Accessed: {viewedOn}).\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). <em>{name}</em> [video].\n {' '}ClickView. Available at: {url} (Accessed: {viewedOn}).\n </span>\n );\n}\n\nexport function HarvardAUCitation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n <Year year={productionYear} placeholder={yearPlaceholder} />, '{name}',\n {' '}<em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}, video, ClickView, viewed {viewedOn}, {url}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n <Year year={productionYear} placeholder={yearPlaceholder} />, <em>{name}</em>, video, ClickView,\n {' '}viewed {viewedOn}, {url}.\n </span>\n );\n}\n\nexport function MLA8Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n \"{name}.\" <em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}, ClickView,\n {' '}<Year year={productionYear} placeholder={yearPlaceholder} />, {url}. Accessed {viewedOn}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n <em>{name}</em>. ClickView, <Year year={productionYear} placeholder={yearPlaceholder} />, {url}.\n {' '}Accessed {viewedOn}.\n </span>\n );\n}\n\nexport function MLA9Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n \"{name}.\" <em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}, ClickView,\n {' '}<Year year={productionYear} placeholder={yearPlaceholder} />, {url}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n <em>{name}</em>. ClickView, <Year year={productionYear} placeholder={yearPlaceholder} />, {url}.\n </span>\n );\n}\n\nexport function ChicagoCitation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n \"{name}.\" <em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}. ClickView,\n {' '}<Year year={productionYear} placeholder={yearPlaceholder} />. {url}. Accessed {viewedOn}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n <em>{name}</em>. ClickView, <Year year={productionYear} placeholder={yearPlaceholder} />. {url}.\n {' '}Accessed {viewedOn}.\n </span>\n );\n}\n","import React from 'react';\n\nimport { Video } from 'libs/shared/interfaces';\n\nimport { CitationStyleId } from 'shared/enums/CitationStyleId';\n\nimport { SUPPORTED_CITATION_STYLES } from './CitationStyleDropdown';\nimport {\n APA6Citation,\n APA7Citation,\n ChicagoCitation,\n EditablePlaceholder,\n HarvardAUCitation,\n HarvardCitation,\n MLA8Citation,\n MLA9Citation,\n SeriesInfo\n} from './CitationStyles';\n\ntype PeopleRolesMap = Map<string, string[]>;\n\ninterface GetCitationStylesOptions {\n name: string;\n creatorPeople: PeopleRolesMap;\n creatorCompanies: string[];\n productionYear: number;\n url: string;\n authorPlaceholder?: EditablePlaceholder;\n yearPlaceholder?: EditablePlaceholder;\n seriesInfo?: SeriesInfo;\n}\n\nexport interface CitationStyle {\n id: CitationStyleId;\n name: string;\n component: JSX.Element;\n}\n\nexport const CitationHelpers = {\n hasAuthorData(peopleRoles: PeopleRolesMap, companies: string[]): boolean {\n return peopleRoles.size > 0 || companies.length > 0;\n },\n\n processCompanies(video: Video): string[] {\n let companies: string[] = [];\n\n if (video?.productionCompanies?.data?.length) {\n companies = video.productionCompanies.data.map(pc => pc.name ?? '');\n } else if (video?.distributors?.data?.length) {\n companies = video.distributors.data.map(d => d.name ?? '');\n } else if (video?.channel?.name) {\n companies = [video.channel.name];\n }\n\n return companies.filter(c => c.trim());\n },\n\n joinWithAmpersand(items: string[]): string {\n if (items.length === 0) return '';\n if (items.length === 1) return items[0];\n if (items.length === 2) return `${items[0]}, & ${items[1]}`;\n\n // 3 or more: comma-separated with \", &\" before the last one\n const allButLast = items.slice(0, -1).join(', ');\n const last = items[items.length - 1];\n return `${allButLast}, & ${last}`;\n },\n\n processSeriesInfo(video: Video): SeriesInfo | undefined {\n if (!video.series?.name) return undefined;\n if (!video.season?.number) return undefined;\n if (!video.episodeNumber) return undefined;\n\n return {\n seriesName: video.series.name,\n seasonNumber: video.season.number,\n episodeNumber: video.episodeNumber\n };\n },\n\n processAuthors(video: Video): PeopleRolesMap {\n const peopleRoles = new Map<string, string[]>();\n\n (video?.directors?.data ?? []).forEach(d => {\n if (d?.name) {\n const roles = peopleRoles.get(d.name) || [];\n roles.push('Director');\n peopleRoles.set(d.name, roles);\n }\n });\n\n (video?.producers?.data ?? []).forEach(p => {\n if (p?.name) {\n const roles = peopleRoles.get(p.name) || [];\n roles.push('Producer');\n peopleRoles.set(p.name, roles);\n }\n });\n\n return peopleRoles;\n },\n\n formatAuthorsDefault(peopleRoles: PeopleRolesMap, creatorCompanies: string[]): string {\n const people = Array.from(peopleRoles.entries()).map(([ name, roles ]) =>\n `${name} (${roles.join(' & ')})`);\n\n return people.length > 0 ? people.join(', ') :\n creatorCompanies.length > 0 ? creatorCompanies[0] : '';\n },\n\n formatPublisher(peopleRoles: PeopleRolesMap, creatorCompanies: string[]): string {\n // Production company when we have human authors and a distinct non-ClickView company,\n // otherwise fall back to \"ClickView\" (avoids listing the same company as both author and publisher).\n const hasPeople = peopleRoles.size > 0;\n const nonClickView = creatorCompanies.filter(c => c !== 'ClickView');\n\n if (hasPeople && nonClickView.length > 0)\n return nonClickView.join(', ');\n\n return 'ClickView';\n },\n\n formatAuthorsAPA7(peopleRoles: PeopleRolesMap, creatorCompanies: string[]): string {\n // APA 7 use `Last name, Initials` format for people\n function formatName(name: string, roles: string[]) {\n const nameParts = name.trim().split(/\\s+/);\n const roleString = roles.join(' & ');\n\n if (nameParts.length === 0) return '';\n if (nameParts.length === 1) return `${nameParts[0]} (${roleString})`;\n\n const lastName = nameParts[nameParts.length - 1];\n const firstNames = nameParts.slice(0, -1);\n const initials = firstNames.map(n => `${n.charAt(0)}.`).join(' ');\n\n return `${lastName}, ${initials} (${roleString})`;\n }\n\n const formattedAuthors = Array.from(peopleRoles.entries()).map(([ name, roles ]) => formatName(name, roles));\n\n if (formattedAuthors.length > 0) {\n return `${CitationHelpers.joinWithAmpersand(formattedAuthors)}.`;\n }\n\n // Fallback to companies if no people authors\n if (creatorCompanies.length === 0) return '';\n\n const formattedCompanies = CitationHelpers.joinWithAmpersand(creatorCompanies);\n return formattedCompanies ? `${formattedCompanies}.` : '';\n },\n\n getCitationStyles(options: GetCitationStylesOptions): CitationStyle[] {\n const {\n name,\n creatorPeople,\n creatorCompanies,\n productionYear,\n url,\n authorPlaceholder,\n yearPlaceholder,\n seriesInfo\n } = options;\n\n const defaultAuthor = CitationHelpers.formatAuthorsDefault(creatorPeople, creatorCompanies);\n const apa7Author = CitationHelpers.formatAuthorsAPA7(creatorPeople, creatorCompanies);\n const publisher = CitationHelpers.formatPublisher(creatorPeople, creatorCompanies);\n\n const today = new Date();\n const viewedOn = `${today.getDate()} ${today.toLocaleString('default', { month: 'long' })} ${today.getFullYear()}`;\n\n const commonProps = {\n name,\n url,\n viewedOn,\n publisher,\n productionYear,\n authorPlaceholder,\n yearPlaceholder,\n seriesInfo\n };\n\n const components: Record<CitationStyleId, JSX.Element> = {\n [CitationStyleId.APA6]: <APA6Citation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.APA7]: <APA7Citation {...commonProps} author={apa7Author} />,\n [CitationStyleId.Harvard]: <HarvardCitation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.HarvardAU]: <HarvardAUCitation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.MLA8]: <MLA8Citation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.MLA9]: <MLA9Citation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.Chicago]: <ChicagoCitation {...commonProps} author={defaultAuthor} />\n };\n\n return SUPPORTED_CITATION_STYLES.map(style => ({\n ...style,\n component: components[style.id]\n }));\n }\n};\n","import React from 'react';\n\nimport { LocationUtils } from 'libs/common/backbone/core/LocationUtils';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useCopyToClipboard } from 'libs/shared/hooks/useCopyToClipboard';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Video, VideoTypes } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { CitationStyleId } from 'shared/enums/CitationStyleId';\nimport { usePreferredCitationStyle } from 'shared/hooks/usePreferredCitationStyle';\nimport { generatePublicUrl } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { CitationHelpers, CitationStyle } from './CitationHelpers';\nimport { CitationStyleDropdown } from './CitationStyleDropdown';\nimport { EditableCitationFieldRef } from './EditableCitationField';\n\nimport styles from './citation-generator.module.scss';\n\nconst namespace = 'shared.citations';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype CitationWidgetProps = {\n parentVideo?: Video,\n media: VideoTypes,\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>,\n contentRegion: ContentRegion,\n shareId: string,\n presentationSlug: string | null\n};\n\nexport function CitationWidget(props: CitationWidgetProps): JSX.Element {\n const { headingRef, contentRegion } = props;\n\n const { copyToClipboard } = useCopyToClipboard();\n const { preferredStyleId, setPreferredStyleId } = usePreferredCitationStyle();\n const { hasPermissions } = usePermissions();\n const ref = React.useRef<HTMLDivElement>(null);\n const authorFieldRef = React.useRef<EditableCitationFieldRef>(null);\n const yearFieldRef = React.useRef<EditableCitationFieldRef>(null);\n\n const canManageSettings = hasPermissions(PermissionName.ManageCustomerSettings);\n\n // if the video is a clip or interactive, use the parent video\n // so we have a reliable source of video data\n const video = VideoHelper.isVideo(props.media) ? props.media : props.parentVideo;\n\n const url = props.shareId ?\n LocationUtils.GetCurrentUrl() :\n generatePublicUrl(contentRegion, VideoAppLinkHelper.getAppLink(video, {}, props.presentationSlug));\n\n // State for user-entered values when metadata is missing\n const [ customAuthor, setCustomAuthor ] = React.useState<string>('');\n const [ customYear, setCustomYear ] = React.useState<string>('');\n\n // Check if author data is missing and placeholder is needed\n const processedAuthors = CitationHelpers.processAuthors(video);\n const processedCompanies = CitationHelpers.processCompanies(video);\n const processedSeriesInfo = CitationHelpers.processSeriesInfo(video);\n const needsAuthorPlaceholder = !CitationHelpers.hasAuthorData(processedAuthors, processedCompanies);\n const needsYearPlaceholder = !video.productionYear;\n\n const citationStyles = React.useMemo(() => {\n return CitationHelpers.getCitationStyles({\n // make sure we use the clip, interactive or video title here\n name: props.media.name,\n creatorPeople: processedAuthors,\n creatorCompanies: processedCompanies,\n seriesInfo: processedSeriesInfo,\n productionYear: video.productionYear,\n url: url,\n authorPlaceholder: needsAuthorPlaceholder ? {\n value: customAuthor,\n placeholder: getPhrase('authorPlaceholder'),\n tooltipText: getPhrase('authorTooltip'),\n inputSize: 12,\n onChange: setCustomAuthor,\n fieldRef: authorFieldRef\n } : undefined,\n yearPlaceholder: needsYearPlaceholder ? {\n value: customYear,\n placeholder: getPhrase('yearPlaceholder'),\n tooltipText: getPhrase('yearTooltip'),\n inputSize: 6,\n onChange: setCustomYear,\n fieldRef: yearFieldRef\n } : undefined\n });\n }, [\n props.media,\n props.parentVideo,\n video.id,\n customAuthor,\n customYear,\n needsAuthorPlaceholder,\n needsYearPlaceholder,\n processedSeriesInfo?.seriesName,\n processedSeriesInfo?.seasonNumber,\n processedSeriesInfo?.episodeNumber\n ]);\n\n const initialStyle = citationStyles.find(s => s.id === preferredStyleId) ?? citationStyles[0];\n const [ selectedStyle, setSelectedStyle ] = React.useState<CitationStyle>(initialStyle);\n const [ copied, setCopied ] = React.useState(false);\n\n const onClickCopy = () => {\n copyToClipboard(ref.current?.innerText);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const onChangeStyle = (styleId: CitationStyleId) => {\n const style = citationStyles.find(s => s.id === styleId);\n if (style) {\n setSelectedStyle(style);\n setPreferredStyleId(styleId);\n }\n };\n\n // Keep selectedStyle in sync when citationStyles regenerate (e.g., when `customAuthor` changes)\n React.useEffect(() => {\n const updatedStyle = citationStyles.find(s => s.id === selectedStyle.id);\n if (updatedStyle)\n setSelectedStyle(updatedStyle);\n }, [citationStyles]);\n\n return (\n <section\n id={PlayPageAnchor.ReferenceVideo}\n className='play-page-section'\n ref={el => {\n (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.ReferenceVideo, el);\n }}\n >\n <h2 className='h4 mb-2'>{getPhrase('title')}</h2>\n <p>{getPhrase('description')} \"<strong>{video.name}</strong>\".</p>\n <div className='form-group'>\n <CitationStyleDropdown value={selectedStyle.id} onChange={onChangeStyle} />\n {canManageSettings && (\n <AppLink\n className='text-info d-block mt-2 text-end'\n appLink={{ application: AppChannels.SETTINGS, action: Actions.Settings.CITATION_STYLE }}\n >\n {getPhrase('configureCitationSettings')}\n </AppLink>\n )}\n </div>\n <div className='bg-light-orange rounded-1 border px-3 pb-0 position-relative'>\n <div ref={ref} className='pt-3 text-wrap pb-4'>{selectedStyle.component}</div>\n <button\n className={`${styles.citationButton} border-top border-start bg-white position-absolute bottom-0 end-0 d-inline-block py-1 px-2`}\n onClick={onClickCopy}\n >\n {copied ? getPhrase('copyToClipboardSuccess') : getPhrase('copyToClipboard')}\n </button>\n </div>\n </section>\n );\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svg={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Bf9r1ZoF2.chunk.js","names":[],"sources":["../../src/shared/components/play-page/ArchivedBanner.tsx","../../src/shared/components/related-videos/RelatedVideos.tsx","../../../../libs/shared/src/components/play-page/interactives-widget/InteractiveWidgetItem.tsx","../../src/shared/components/citations/citation-generator.module.scss","../../src/shared/components/citations/EditableCitationField.tsx","../../src/shared/components/citations/CitationStyles.tsx","../../src/shared/components/citations/CitationHelpers.tsx","../../src/shared/components/citations/CitationWidget.tsx","../../src/shared/components/play-page/RestrictionBanner.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ArchiveSvg } from 'libs/shared/images/svg/objects/ArchiveSvg';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center'>\n <SvgContainer\n svg={ArchiveSvg}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, PresentationAudience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.relatedVideos';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RelatedVideosProps {\n presentationSlug: string | null;\n currentVideo: VideoTypes;\n relatedVideos: RelatedVideosHash;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({\n location: VideoActionsLocation.VideoItem,\n presentationSlug: props.presentationSlug\n });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <section\n id={PlayPageAnchor.RelatedVideos}\n className='play-page-section'\n ref={el => {\n (el && props.headingRef?.current\n && !!props.relatedVideos.videos?.length)\n && props.headingRef.current.set(PlayPageAnchor.RelatedVideos, el);\n }}\n >\n <VideoActionsContext.Provider value={videoActions}>\n <WidgetHeader name={canAutoplay ? getPhrase('upNext') : getPhrase('relatedVideos')} />\n \n {props.relatedVideos.hasCompleted ? (\n <VideoList\n videos={props.relatedVideos.videos}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={props.commonVideoProps}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore && (\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n )}\n </VideoActionsContext.Provider>\n </section>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { InteractiveMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { getTotalInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.interactiveWidgetItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n questionsAppLink: Core.AppLink;\n showOwner?: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = getTotalInteractions(interactive);\n\n return (\n <div className='flex-shrink-0 px-1 col-6 col-sm-4'>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n hideDuration={false}\n commonVideoProps={props.commonVideoProps}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n />\n </div>\n\n <AppLink\n appLink={questionsAppLink}\n className='cursor-pointer hover-text-underline'\n ariaLabel={`${getPhrase('previewQuestions', { count: questionsNumber, smartCount: questionsNumber })} ${getPhrase('ariaPreview', { name: interactive.name })}`}\n >\n {questionsNumber ?\n (\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n ) : (\n // handling a rare case: add a fallback phrase if we don't get the question number\n <Text namespace={namespace} phrase='previewQuestionsFallback' />\n )}\n </AppLink>\n </div>\n );\n});\n",":local {\n .citationButton {\n border-radius: $border-radius-sm 0 $border-radius-sm 0;\n }\n\n .citationText {\n word-break: break-word;\n }\n\n .editableFieldContainer {\n border-bottom: 1px dashed;\n cursor: pointer;\n }\n\n .editableField {\n border-radius: $border-radius-sm;\n outline: none;\n }\n\n .editableFieldEmpty {\n color: $text-muted;\n font-style: italic;\n }\n\n .editableFieldIconEmpty {\n color: $text-muted;\n }\n\n .editableFieldInput {\n border: 1px solid $blue;\n border-radius: $border-radius-sm;\n background-color: $input-focus-bg;\n box-shadow: $input-focus-box-shadow;\n outline: none;\n\n &::placeholder {\n color: $text-muted;\n font-style: italic;\n }\n }\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { EditSvg } from 'libs/shared/images/svg/actions/EditSvg';\n\nimport styles from './citation-generator.module.scss';\n\nexport interface EditableCitationFieldRef {\n focus: () => void;\n}\n\nexport interface EditableCitationFieldProps {\n value: string;\n placeholder: string;\n tooltipText: string;\n inputSize?: number;\n onChange: (value: string) => void;\n}\n\nexport const EditableCitationField = React.forwardRef<EditableCitationFieldRef, EditableCitationFieldProps>((\n props,\n ref\n) => {\n const { value, placeholder, tooltipText, onChange } = props;\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [ isEditing, setIsEditing ] = React.useState(false);\n\n React.useImperativeHandle(ref, () => ({\n focus: () => setIsEditing(true)\n }));\n\n if (isEditing) {\n return (\n <input\n ref={inputRef}\n type='text'\n size={props.inputSize}\n className={styles.editableFieldInput}\n value={value}\n placeholder={placeholder}\n autoFocus\n spellCheck={false}\n onChange={e => onChange(e.target.value)}\n onBlur={() => setIsEditing(false)}\n onKeyDown={e => e.key === 'Enter' && inputRef.current?.blur()}\n />\n );\n }\n\n return (\n <Tooltip title={tooltipText} placement='top' spanHack spanHackClassName='d-inline'>\n <div className='d-inline-block'>\n <div className={`d-flex flex-row ${styles.editableFieldContainer}`} onClick={() => setIsEditing(true)}>\n <span\n className={`${styles.editableField} ${!value ? styles.editableFieldEmpty : ''}`}\n onKeyDown={e => e.key === 'Enter' && setIsEditing(true)}\n role='button'\n tabIndex={0}\n >\n {value || placeholder}\n </span>\n <SvgContainer\n svg={EditSvg}\n size={SvgContainerSize.Small}\n className={`svg-container ${!value ? styles.editableFieldIconEmpty : ''}`}\n />\n </div>\n </div>\n </Tooltip>\n );\n});\n","import React from 'react';\n\nimport { EditableCitationField, EditableCitationFieldProps, EditableCitationFieldRef } from './EditableCitationField';\n\nexport interface EditablePlaceholder extends EditableCitationFieldProps {\n fieldRef: React.RefObject<EditableCitationFieldRef>;\n}\n\ninterface AuthorProps {\n author: string;\n placeholder?: EditablePlaceholder;\n suffix: string;\n}\n\nfunction Author({ author, placeholder, suffix }: AuthorProps): JSX.Element {\n if (placeholder) {\n return (\n <>\n <EditableCitationField\n ref={placeholder.fieldRef}\n value={placeholder.value}\n placeholder={placeholder.placeholder}\n inputSize={placeholder.inputSize}\n tooltipText={placeholder.tooltipText}\n onChange={placeholder.onChange}\n />\n {suffix}\n </>\n );\n }\n return <>{author ? `${author}${suffix}` : ''}</>;\n}\n\ninterface YearProps {\n year: number;\n placeholder?: EditablePlaceholder;\n}\n\nfunction Year({ year, placeholder }: YearProps): JSX.Element {\n if (placeholder) {\n return (\n <EditableCitationField\n ref={placeholder.fieldRef}\n value={placeholder.value}\n placeholder={placeholder.placeholder}\n inputSize={placeholder.inputSize}\n tooltipText={placeholder.tooltipText}\n onChange={placeholder.onChange}\n />\n );\n }\n return <>{year}</>;\n}\n\nexport interface SeriesInfo {\n seriesName: string;\n seasonNumber: number;\n episodeNumber: number;\n}\n\ninterface CitationComponentProps {\n name: string;\n url: string;\n viewedOn: string;\n author: string;\n publisher: string;\n productionYear: number;\n authorPlaceholder?: EditablePlaceholder;\n yearPlaceholder?: EditablePlaceholder;\n seriesInfo?: SeriesInfo;\n}\n\nexport function APA6Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, author, publisher, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). {name}\n {' '}(Season {seriesInfo.seasonNumber}, Episode {seriesInfo.episodeNumber}) [TV series episode].\n {' '}In <em>{seriesInfo.seriesName}</em>. {publisher}. Retrieved from {url}\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). <em>{name}</em> [Motion picture].\n {' '}{publisher}. Retrieved from {url}\n </span>\n );\n}\n\nexport function APA7Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, author, publisher, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). {name}\n {' '}(Season {seriesInfo.seasonNumber}, Episode {seriesInfo.episodeNumber}) [TV series episode].\n {' '}In <em>{seriesInfo.seriesName}</em>. {publisher}. {url}\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). <em>{name}</em> [Film]. {publisher}. {url}\n </span>\n );\n}\n\nexport function HarvardCitation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). '{name}',\n {' '}<em>{seriesInfo.seriesName}</em>, Season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber} [video].\n {' '}ClickView. Available at: {url} (Accessed: {viewedOn}).\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n (<Year year={productionYear} placeholder={yearPlaceholder} />). <em>{name}</em> [video].\n {' '}ClickView. Available at: {url} (Accessed: {viewedOn}).\n </span>\n );\n}\n\nexport function HarvardAUCitation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n <Year year={productionYear} placeholder={yearPlaceholder} />, '{name}',\n {' '}<em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}, video, ClickView, viewed {viewedOn}, {url}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix=' ' />\n <Year year={productionYear} placeholder={yearPlaceholder} />, <em>{name}</em>, video, ClickView,\n {' '}viewed {viewedOn}, {url}.\n </span>\n );\n}\n\nexport function MLA8Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n \"{name}.\" <em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}, ClickView,\n {' '}<Year year={productionYear} placeholder={yearPlaceholder} />, {url}. Accessed {viewedOn}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n <em>{name}</em>. ClickView, <Year year={productionYear} placeholder={yearPlaceholder} />, {url}.\n {' '}Accessed {viewedOn}.\n </span>\n );\n}\n\nexport function MLA9Citation(props: CitationComponentProps): JSX.Element {\n const { name, url, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n \"{name}.\" <em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}, ClickView,\n {' '}<Year year={productionYear} placeholder={yearPlaceholder} />, {url}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n <em>{name}</em>. ClickView, <Year year={productionYear} placeholder={yearPlaceholder} />, {url}.\n </span>\n );\n}\n\nexport function ChicagoCitation(props: CitationComponentProps): JSX.Element {\n const { name, url, viewedOn, author, productionYear, authorPlaceholder, yearPlaceholder, seriesInfo } = props;\n\n if (seriesInfo) {\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n \"{name}.\" <em>{seriesInfo.seriesName}</em>, season {seriesInfo.seasonNumber},\n {' '}episode {seriesInfo.episodeNumber}. ClickView,\n {' '}<Year year={productionYear} placeholder={yearPlaceholder} />. {url}. Accessed {viewedOn}.\n </span>\n );\n }\n\n return (\n <span>\n <Author author={author} placeholder={authorPlaceholder} suffix='. ' />\n <em>{name}</em>. ClickView, <Year year={productionYear} placeholder={yearPlaceholder} />. {url}.\n {' '}Accessed {viewedOn}.\n </span>\n );\n}\n","import React from 'react';\n\nimport { Video } from 'libs/shared/interfaces';\n\nimport { CitationStyleId } from 'shared/enums/CitationStyleId';\n\nimport { SUPPORTED_CITATION_STYLES } from './CitationStyleDropdown';\nimport {\n APA6Citation,\n APA7Citation,\n ChicagoCitation,\n EditablePlaceholder,\n HarvardAUCitation,\n HarvardCitation,\n MLA8Citation,\n MLA9Citation,\n SeriesInfo\n} from './CitationStyles';\n\ntype PeopleRolesMap = Map<string, string[]>;\n\ninterface GetCitationStylesOptions {\n name: string;\n creatorPeople: PeopleRolesMap;\n creatorCompanies: string[];\n productionYear: number;\n url: string;\n authorPlaceholder?: EditablePlaceholder;\n yearPlaceholder?: EditablePlaceholder;\n seriesInfo?: SeriesInfo;\n}\n\nexport interface CitationStyle {\n id: CitationStyleId;\n name: string;\n component: JSX.Element;\n}\n\nexport const CitationHelpers = {\n hasAuthorData(peopleRoles: PeopleRolesMap, companies: string[]): boolean {\n return peopleRoles.size > 0 || companies.length > 0;\n },\n\n processCompanies(video: Video): string[] {\n let companies: string[] = [];\n\n if (video?.productionCompanies?.data?.length) {\n companies = video.productionCompanies.data.map(pc => pc.name ?? '');\n } else if (video?.distributors?.data?.length) {\n companies = video.distributors.data.map(d => d.name ?? '');\n } else if (video?.channel?.name) {\n companies = [video.channel.name];\n }\n\n return companies.filter(c => c.trim());\n },\n\n joinWithAmpersand(items: string[]): string {\n if (items.length === 0) return '';\n if (items.length === 1) return items[0];\n if (items.length === 2) return `${items[0]}, & ${items[1]}`;\n\n // 3 or more: comma-separated with \", &\" before the last one\n const allButLast = items.slice(0, -1).join(', ');\n const last = items[items.length - 1];\n return `${allButLast}, & ${last}`;\n },\n\n processSeriesInfo(video: Video): SeriesInfo | undefined {\n if (!video.series?.name) return undefined;\n if (!video.season?.number) return undefined;\n if (!video.episodeNumber) return undefined;\n\n return {\n seriesName: video.series.name,\n seasonNumber: video.season.number,\n episodeNumber: video.episodeNumber\n };\n },\n\n processAuthors(video: Video): PeopleRolesMap {\n const peopleRoles = new Map<string, string[]>();\n\n (video?.directors?.data ?? []).forEach(d => {\n if (d?.name) {\n const roles = peopleRoles.get(d.name) || [];\n roles.push('Director');\n peopleRoles.set(d.name, roles);\n }\n });\n\n (video?.producers?.data ?? []).forEach(p => {\n if (p?.name) {\n const roles = peopleRoles.get(p.name) || [];\n roles.push('Producer');\n peopleRoles.set(p.name, roles);\n }\n });\n\n return peopleRoles;\n },\n\n formatAuthorsDefault(peopleRoles: PeopleRolesMap, creatorCompanies: string[]): string {\n const people = Array.from(peopleRoles.entries()).map(([ name, roles ]) =>\n `${name} (${roles.join(' & ')})`);\n\n return people.length > 0 ? people.join(', ') :\n creatorCompanies.length > 0 ? creatorCompanies[0] : '';\n },\n\n formatPublisher(peopleRoles: PeopleRolesMap, creatorCompanies: string[]): string {\n // Production company when we have human authors and a distinct non-ClickView company,\n // otherwise fall back to \"ClickView\" (avoids listing the same company as both author and publisher).\n const hasPeople = peopleRoles.size > 0;\n const nonClickView = creatorCompanies.filter(c => c !== 'ClickView');\n\n if (hasPeople && nonClickView.length > 0)\n return nonClickView.join(', ');\n\n return 'ClickView';\n },\n\n formatAuthorsAPA7(peopleRoles: PeopleRolesMap, creatorCompanies: string[]): string {\n // APA 7 use `Last name, Initials` format for people\n function formatName(name: string, roles: string[]) {\n const nameParts = name.trim().split(/\\s+/);\n const roleString = roles.join(' & ');\n\n if (nameParts.length === 0) return '';\n if (nameParts.length === 1) return `${nameParts[0]} (${roleString})`;\n\n const lastName = nameParts[nameParts.length - 1];\n const firstNames = nameParts.slice(0, -1);\n const initials = firstNames.map(n => `${n.charAt(0)}.`).join(' ');\n\n return `${lastName}, ${initials} (${roleString})`;\n }\n\n const formattedAuthors = Array.from(peopleRoles.entries()).map(([ name, roles ]) => formatName(name, roles));\n\n if (formattedAuthors.length > 0) {\n return `${CitationHelpers.joinWithAmpersand(formattedAuthors)}.`;\n }\n\n // Fallback to companies if no people authors\n if (creatorCompanies.length === 0) return '';\n\n const formattedCompanies = CitationHelpers.joinWithAmpersand(creatorCompanies);\n return formattedCompanies ? `${formattedCompanies}.` : '';\n },\n\n getCitationStyles(options: GetCitationStylesOptions): CitationStyle[] {\n const {\n name,\n creatorPeople,\n creatorCompanies,\n productionYear,\n url,\n authorPlaceholder,\n yearPlaceholder,\n seriesInfo\n } = options;\n\n const defaultAuthor = CitationHelpers.formatAuthorsDefault(creatorPeople, creatorCompanies);\n const apa7Author = CitationHelpers.formatAuthorsAPA7(creatorPeople, creatorCompanies);\n const publisher = CitationHelpers.formatPublisher(creatorPeople, creatorCompanies);\n\n const today = new Date();\n const viewedOn = `${today.getDate()} ${today.toLocaleString('default', { month: 'long' })} ${today.getFullYear()}`;\n\n const commonProps = {\n name,\n url,\n viewedOn,\n publisher,\n productionYear,\n authorPlaceholder,\n yearPlaceholder,\n seriesInfo\n };\n\n const components: Record<CitationStyleId, JSX.Element> = {\n [CitationStyleId.APA6]: <APA6Citation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.APA7]: <APA7Citation {...commonProps} author={apa7Author} />,\n [CitationStyleId.Harvard]: <HarvardCitation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.HarvardAU]: <HarvardAUCitation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.MLA8]: <MLA8Citation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.MLA9]: <MLA9Citation {...commonProps} author={defaultAuthor} />,\n [CitationStyleId.Chicago]: <ChicagoCitation {...commonProps} author={defaultAuthor} />\n };\n\n return SUPPORTED_CITATION_STYLES.map(style => ({\n ...style,\n component: components[style.id]\n }));\n }\n};\n","import React from 'react';\n\nimport { LocationUtils } from 'libs/common/backbone/core/LocationUtils';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useCopyToClipboard } from 'libs/shared/hooks/useCopyToClipboard';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Video, VideoTypes } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { CitationStyleId } from 'shared/enums/CitationStyleId';\nimport { usePreferredCitationStyle } from 'shared/hooks/usePreferredCitationStyle';\nimport { generatePublicUrl } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { CitationHelpers, CitationStyle } from './CitationHelpers';\nimport { CitationStyleDropdown } from './CitationStyleDropdown';\nimport { EditableCitationFieldRef } from './EditableCitationField';\n\nimport styles from './citation-generator.module.scss';\n\nconst namespace = 'shared.citations';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype CitationWidgetProps = {\n parentVideo?: Video,\n media: VideoTypes,\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>,\n contentRegion: ContentRegion,\n shareId: string,\n presentationSlug: string | null\n};\n\nexport function CitationWidget(props: CitationWidgetProps): JSX.Element {\n const { headingRef, contentRegion } = props;\n\n const { copyToClipboard } = useCopyToClipboard();\n const { preferredStyleId, setPreferredStyleId } = usePreferredCitationStyle();\n const { hasPermissions } = usePermissions();\n const ref = React.useRef<HTMLDivElement>(null);\n const authorFieldRef = React.useRef<EditableCitationFieldRef>(null);\n const yearFieldRef = React.useRef<EditableCitationFieldRef>(null);\n\n const canManageSettings = hasPermissions(PermissionName.ManageCustomerSettings);\n\n // if the video is a clip or interactive, use the parent video\n // so we have a reliable source of video data\n const video = VideoHelper.isVideo(props.media) ? props.media : props.parentVideo;\n\n const url = props.shareId ?\n LocationUtils.GetCurrentUrl() :\n generatePublicUrl(contentRegion, VideoAppLinkHelper.getAppLink(video, {}, props.presentationSlug));\n\n // State for user-entered values when metadata is missing\n const [ customAuthor, setCustomAuthor ] = React.useState<string>('');\n const [ customYear, setCustomYear ] = React.useState<string>('');\n\n // Check if author data is missing and placeholder is needed\n const processedAuthors = CitationHelpers.processAuthors(video);\n const processedCompanies = CitationHelpers.processCompanies(video);\n const processedSeriesInfo = CitationHelpers.processSeriesInfo(video);\n const needsAuthorPlaceholder = !CitationHelpers.hasAuthorData(processedAuthors, processedCompanies);\n const needsYearPlaceholder = !video.productionYear;\n\n const citationStyles = React.useMemo(() => {\n return CitationHelpers.getCitationStyles({\n // make sure we use the clip, interactive or video title here\n name: props.media.name,\n creatorPeople: processedAuthors,\n creatorCompanies: processedCompanies,\n seriesInfo: processedSeriesInfo,\n productionYear: video.productionYear,\n url: url,\n authorPlaceholder: needsAuthorPlaceholder ? {\n value: customAuthor,\n placeholder: getPhrase('authorPlaceholder'),\n tooltipText: getPhrase('authorTooltip'),\n inputSize: 12,\n onChange: setCustomAuthor,\n fieldRef: authorFieldRef\n } : undefined,\n yearPlaceholder: needsYearPlaceholder ? {\n value: customYear,\n placeholder: getPhrase('yearPlaceholder'),\n tooltipText: getPhrase('yearTooltip'),\n inputSize: 6,\n onChange: setCustomYear,\n fieldRef: yearFieldRef\n } : undefined\n });\n }, [\n props.media,\n props.parentVideo,\n video.id,\n customAuthor,\n customYear,\n needsAuthorPlaceholder,\n needsYearPlaceholder,\n processedSeriesInfo?.seriesName,\n processedSeriesInfo?.seasonNumber,\n processedSeriesInfo?.episodeNumber\n ]);\n\n const initialStyle = citationStyles.find(s => s.id === preferredStyleId) ?? citationStyles[0];\n const [ selectedStyle, setSelectedStyle ] = React.useState<CitationStyle>(initialStyle);\n const [ copied, setCopied ] = React.useState(false);\n\n const onClickCopy = () => {\n copyToClipboard(ref.current?.innerText);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const onChangeStyle = (styleId: CitationStyleId) => {\n const style = citationStyles.find(s => s.id === styleId);\n if (style) {\n setSelectedStyle(style);\n setPreferredStyleId(styleId);\n }\n };\n\n // Keep selectedStyle in sync when citationStyles regenerate (e.g., when `customAuthor` changes)\n React.useEffect(() => {\n const updatedStyle = citationStyles.find(s => s.id === selectedStyle.id);\n if (updatedStyle)\n setSelectedStyle(updatedStyle);\n }, [citationStyles]);\n\n return (\n <section\n id={PlayPageAnchor.ReferenceVideo}\n className='play-page-section'\n ref={el => {\n (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.ReferenceVideo, el);\n }}\n >\n <h2 className='h4 mb-2'>{getPhrase('title')}</h2>\n <p>{getPhrase('description')} \"<strong>{video.name}</strong>\".</p>\n <div className='form-group'>\n <CitationStyleDropdown value={selectedStyle.id} onChange={onChangeStyle} />\n {canManageSettings && (\n <AppLink\n className='text-info d-block mt-2 text-end'\n appLink={{ application: AppChannels.SETTINGS, action: Actions.Settings.CITATION_STYLE }}\n >\n {getPhrase('configureCitationSettings')}\n </AppLink>\n )}\n </div>\n <div className='bg-light-orange rounded-1 border px-3 pb-0 position-relative text-break'>\n <div ref={ref} className='pt-3 text-wrap pb-4'>{selectedStyle.component}</div>\n <button\n className={`${styles.citationButton} border-top border-start bg-white position-absolute bottom-0 end-0 d-inline-block py-1 px-2`}\n onClick={onClickCopy}\n >\n {copied ? getPhrase('copyToClipboardSuccess') : getPhrase('copyToClipboard')}\n </button>\n </div>\n </section>\n );\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svg={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./snXCXfT6.chunk.js";import{_ as n,y as r}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as i}from"./B785hxeE.chunk.js";import{t as a}from"./CQyJ7YGa.chunk.js";import{t as o}from"./C2w0pmFW.chunk.js";import{t as s}from"./wrLrTezN.chunk.js";import{t as c}from"./BXTI9cmX.chunk.js";import{u as l}from"./BX0wDJmp.chunk.js";import{t as u}from"./C1SLt-ar.chunk.js";import{U as d,l as f,o as p,y as m,z as h}from"./NlCAcBdo.chunk.js";import{i as g,n as _,r as v,t as y}from"./Cr6TXzQQ2.chunk.js";import{n as b,t as x}from"./CmcCVXi32.chunk.js";import{t as ee}from"./DGmmTRu72.chunk.js";import{t as S}from"./DZX1tZ-D2.chunk.js";import{t as C}from"./CqrjHjAN.chunk.js";import{t as w}from"./eoAypzU3.chunk.js";import{t as T}from"./XIE88U01.chunk.js";import{t as te}from"./7-GJWRH82.chunk.js";import{t as E}from"./BJZXCSV9.chunk.js";import{n as D,t as O}from"./C6-aC3vu.chunk.js";import{t as k}from"./B3gsVN-_.chunk.js";import{t as A}from"./B_-pJtOI2.chunk.js";import{n as j}from"./CpFtf-tI2.chunk.js";import{t as M}from"./CCdnFnNP.chunk.js";import{t as N}from"./De16zmhB.chunk.js";import{t as ne}from"./DewCxv4i.chunk.js";import{t as re}from"./B8gP8YoA.chunk.js";import{t as ie}from"./IgoS6DLn2.chunk.js";import{t as P}from"./tmS8JSuZ.chunk.js";import{t as F}from"./DzgAvoez.chunk.js";import{t as I}from"./BnuuRu_J2.chunk.js";import{t as L}from"./DDiorDZl.chunk.js";import{t as R}from"./CY_30Xdt.chunk.js";import{o as z}from"./CpgHBpMp.chunk.js";import{n as B,t as V}from"./By1soXyj.chunk.js";import{t as H}from"./CC5Dr9aG.chunk.js";import{r as U}from"./yk6K0dmz2.chunk.js";import{n as W,t as G}from"./CvtZ8ZFA2.chunk.js";import{t as K}from"./BCqRKj1E2.chunk.js";import{t as q}from"./C8aOMmXJ2.chunk.js";import{t as J}from"./8JGe5Ug_2.chunk.js";import{t as ae}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./snXCXfT6.chunk.js";import{_ as n,y as r}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as i}from"./B785hxeE.chunk.js";import{t as a}from"./CQyJ7YGa.chunk.js";import{t as o}from"./C2w0pmFW.chunk.js";import{t as s}from"./wrLrTezN.chunk.js";import{t as c}from"./BXTI9cmX.chunk.js";import{u as l}from"./BX0wDJmp.chunk.js";import{t as u}from"./C1SLt-ar.chunk.js";import{U as d,l as f,o as p,y as m,z as h}from"./NlCAcBdo.chunk.js";import{i as g,n as _,r as v,t as y}from"./Cr6TXzQQ2.chunk.js";import{n as b,t as x}from"./CmcCVXi32.chunk.js";import{t as ee}from"./DGmmTRu72.chunk.js";import{t as S}from"./DZX1tZ-D2.chunk.js";import{t as C}from"./CqrjHjAN.chunk.js";import{t as w}from"./eoAypzU3.chunk.js";import{t as T}from"./XIE88U01.chunk.js";import{t as te}from"./7-GJWRH82.chunk.js";import{t as E}from"./BJZXCSV9.chunk.js";import{n as D,t as O}from"./C6-aC3vu.chunk.js";import{t as k}from"./B3gsVN-_.chunk.js";import{t as A}from"./B_-pJtOI2.chunk.js";import{n as j}from"./CpFtf-tI2.chunk.js";import{t as M}from"./CCdnFnNP.chunk.js";import{t as N}from"./De16zmhB.chunk.js";import{t as ne}from"./DewCxv4i.chunk.js";import{t as re}from"./B8gP8YoA.chunk.js";import{t as ie}from"./IgoS6DLn2.chunk.js";import{t as P}from"./tmS8JSuZ.chunk.js";import{t as F}from"./DzgAvoez.chunk.js";import{t as I}from"./BnuuRu_J2.chunk.js";import{t as L}from"./DDiorDZl.chunk.js";import{t as R}from"./CY_30Xdt.chunk.js";import{o as z}from"./CpgHBpMp.chunk.js";import{n as B,t as V}from"./By1soXyj.chunk.js";import{t as H}from"./CC5Dr9aG.chunk.js";import{r as U}from"./yk6K0dmz2.chunk.js";import{n as W,t as G}from"./CvtZ8ZFA2.chunk.js";import{t as K}from"./BCqRKj1E2.chunk.js";import{t as q}from"./C8aOMmXJ2.chunk.js";import{t as J}from"./8JGe5Ug_2.chunk.js";import{t as ae}from"./B1hsuVfV2.chunk.js";var oe=e(o()),Y=s();function se(e){let n=L.getPartnerLinkByType(e.partnerProfile?.links,`website`,L.makeUTMs({slug:e.partnerProfile._slug.value})),r=S.getHostname(n)??n;return(0,Y.jsx)(`div`,{className:`mt-3`,children:(0,Y.jsx)(q,{children:()=>(0,Y.jsxs)(`p`,{className:`mb-0`,children:[n&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`a`,{href:n,target:`_blank`,rel:`noopener noreferrer`,className:`position-relative d-inline-block ps-4 mb-2 me-2`,children:[(0,Y.jsx)(t,{svg:N,className:`svg-container position-absolute top-50 start-0 translate-middle-y`}),(0,Y.jsx)(`span`,{className:`ps-1`,children:r})]}),(0,Y.jsx)(`span`,{className:`mb-2 me-2`,children:`•`})]}),e.partnerProfile.description]})})})}var X=`contentPartners.contentPartnerDashboardComingSoon`,ce=a.encloseNamespace(X);function le(e){return(0,Y.jsxs)(E,{children:[(0,Y.jsx)(E.Image,{src:e.comingSoonImageUrl,altText:ce(`description`,{partnerName:e.partnerName})}),(0,Y.jsx)(E.Heading,{children:(0,Y.jsx)(j,{namespace:X,phrase:`heading`})}),(0,Y.jsx)(E.Info,{children:(0,Y.jsx)(j,{namespace:X,phrase:`description`,options:{partnerName:e.partnerName}})})]})}var Z=`contentPartners.contentPartnerDashboardContentRegion`,Q=a.encloseNamespace(Z);function ue(e){return(0,Y.jsxs)(E,{children:[(0,Y.jsx)(E.Image,{src:e.contentRegionImageUrl,altText:Q(`imageAlt`)}),(0,Y.jsx)(E.Heading,{children:(0,Y.jsx)(j,{namespace:Z,phrase:`heading`})}),(0,Y.jsx)(E.Cta,{text:Q(`cta`),appLink:e.contentRegionButtonLink,className:`btn btn-dark`})]})}var $=`contentPartners.contentPartnerDashboardNoContent`,de=a.encloseNamespace($);function fe(e){return(0,Y.jsxs)(E,{children:[(0,Y.jsx)(E.Image,{src:e.noContentImageUrl,altText:de(`description`)}),(0,Y.jsx)(E.Heading,{children:(0,Y.jsx)(j,{namespace:$,phrase:`heading`})}),(0,Y.jsx)(E.Info,{children:(0,Y.jsx)(j,{namespace:$,phrase:`description`})})]})}var pe={"coming-soon":le,"content-region":ue,"no-content":fe};function me(e){let t=pe[e.type];return(0,Y.jsx)(t,{...e})}var he=[g.ContentPartnerVideos];function ge(e,t){let n=e[t];return n?he.includes(n.widgetId)&&t===e.length-1:!1}function _e(e){let t=u.sortBy(e.dashboard?.widgets,`index`),{emptyWidgets:n,setEmptyWidget:r}=B(t);function a(t,n,r,i){let a=v.getWidgetParams(n,r,v.getDashboardTargetType(e.dashboard));return e.getWidgetContentRequest(t,a,r,void 0,i)}function o(){if(!e.isInContentRegion)return`content-region`;if(e.isComingSoon||e.dashboard.status===x.Archived&&!e.isReadonly)return`coming-soon`;if(e.dashboard.status===x.Draft&&!e.isPreviewing)return!1;if(!t?.length)return`no-content`;let r=Object.values(n);return r.length>0&&r.every(e=>!!e)?`no-content`:!1}let s=L.getPartnerBannerInfo(e.partnerProfile),c=o(),l=(!c||c===`content-region`)&&e.partnerProfile.description;return(0,Y.jsxs)(Y.Fragment,{children:[!!t.length&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(R,{type:`partner-profile`,partnerBannerType:L.getPartnerBannerType(e.partnerProfile),heading:s.heading,blockColourClass:s.blockColourClass,logo:s.logo,logoBgColour:s.logoBgColour,banner:s.banner,imageCdnUrl:e.commonVideoProps.imageCdnUrl,actions:e.getBannerActions?.(),onClickSignUp:e.onClickSignUp,isAuthenticated:e.isAuthenticated,videoUrl:e.partnerProfile._videobanner?.value?.url,websiteUrl:L.getPartnerLinkByType(e.partnerProfile?.links,`website`,L.makeUTMs({slug:e.partnerProfile._slug.value})),isStudent:e.hasPermissions(i.StudentExperience),log:e.log}),(0,Y.jsxs)(`div`,{className:`py-3 mb-3 border-bottom`,children:[(0,Y.jsx)(F,{breadcrumbs:e.breadcrumbs}),l&&(0,Y.jsx)(se,{partnerProfile:e.partnerProfile})]}),(0,Y.jsx)(`div`,{className:`mt-3`,children:!c&&t.map((n,i)=>(0,Y.jsx)(K,{dashboardTarget:b.PartnerProfile,index:i,item:n,infiniteFetch:ge(t,i),getName:e=>e.name,getWidgetMetadata:e=>e.metadata,appLinks:e.widgetAppLinks,hasPermissions:e.hasPermissions,commonVideoProps:e.commonVideoProps,audiences:e.audiences,setIsEmpty:e=>r(n.id,e),getCursor:e=>e.cursor,getRequest:e=>a(n.id,n.widgetId,n.templateId,e),hasLocalPermissions:e.hasLocalPermissions,settingsHash:e.settings,getContent:e=>e.content,resultsTransformers:y.getWidgetResultsTransformers(),onClickSearchAllVideos:e.onClickSearchAllVideos,getSeeMoreAppLink:e.getSeeMoreAppLink,isEmptyPredicate:e=>Array.isArray(e)&&Array.isArray(e[0]?.content)&&!e[0]?.content?.length,getSelectedItems:null,appLinkOptions:null},n.id))})]}),c&&(0,Y.jsx)(me,{type:c,partnerName:e.partnerProfile.name,comingSoonImageUrl:e.emptyImageUrl,contentRegionImageUrl:e.emptyImageUrl,contentRegionButtonLink:e.widgetAppLinks?.partnerHome?.(),noContentImageUrl:e.emptyImageUrl})]})}function ve(){return{"click-video-banner-controls":{isValid:()=>!0,analyticsOptions:{actionType:h.Click,entity:f.PartnerProfile,descriptor:p.VideoBannerControls,location:m.ContentPartnerDashboardVideoBanner}},"click-video-banner-sign-up":{isValid:()=>!0,analyticsOptions:{actionType:h.Click,entity:f.PartnerProfile,workflowPhase:d.Start,descriptor:p.VideoBannerSignUp,location:m.ContentPartnerDashboardVideoBanner}}}}function ye(e){let{getData:t,log:n}=P({analyticsOptions:e.analyticsOptions,baseData:e.data,config:ve(),shouldLog:e.shouldLog??!0});return{log:n,getData:t}}var be=a.encloseNamespace(`contentPartners.dashboard`);function xe(e){let t=l(C.currentUser()),i=ie(e.slug),a=W({location:G.VideoItem,presentationSlug:null}),{log:o}=ye({data:{entity:{id:i.data?.id,name:i.data?.name,contentRegion:t.data?.contentRegion}},analyticsOptions:{entity:f.PartnerProfile,location:m.ContentPartnerDashboard}});ae({app:`channels`,id:i.data?.id,metadata:{conversionSuffix:i.data?.name}});let{openInCurationStudioLabel:s,isUserCurator:u,getOpenInCurationStudioLink:d}=U(),{commonVideoProps:p}=I({locationContext:m.VideoThumbnail}),{hasPermissions:h,hasLocalPermissions:g}=k(),v=ee(null),{dashboard:y,isPreviewing:x}=re({targetType:b.PartnerProfile,partnerProfileSlug:e.slug,queryParams:e.queryParams});O(D.getDefaultMetadata({title:i.data?.name,phraseContext:{phraseHandler:be,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},allowIndexing:!0}));let S=H({name:i.data?.name});oe.useEffect(()=>{!y.hasCompleted||y.data||n.throw(new T)},[y.data,y.hasCompleted]);let E=V(t.data,{channelId:i.data?.id,presentationSlug:null});function j(){return u?[{label:s,href:d(y.data?.typeId,y.data?.id),openInNewTab:!0}]:[]}function N(e,t,n,r,i){return ne.dashboardWidgetContent(e,t,n,r,{cursor:i})}function P(e){return _[e.widgetId]?.getCollectionAppLink?.(E,e.content)??null}function F(e){o?.({type:`click-video-banner-sign-up`,email:e}),r.trigger(M.getSignUpAppLink({email:e}))}let R=i.hasCompleted&&y.hasCompleted,B=A.isBot(),K=x?!0:L.isInContentRegion(i.data,t.data?.contentRegion,t.data?.isAuthenticated);function q(){r.trigger({application:c.SEARCH,action:w.Search.HOME,params:{scopeId:i.data?.id}})}return R?(0,Y.jsx)(`div`,{className:`bg-white px-4 position-relative`,children:(0,Y.jsxs)(z.Provider,{value:a,children:[!!(x&&y.data)&&(0,Y.jsx)(J,{status:y.data.status,type:`channel`}),(0,Y.jsx)(_e,{dashboard:y.data,partnerProfile:i.data,getWidgetContentRequest:N,commonVideoProps:p,breadcrumbs:S,getBannerActions:j,hasPermissions:h,hasLocalPermissions:g,settings:v,widgetAppLinks:E,emptyImageUrl:te.EmptyStates.WATCH_HISTORY,isBot:B,lazyLoad:!B,isAuthenticated:t.data?.isAuthenticated,isInContentRegion:K,onClickSignUp:F,isPreviewing:x,onClickSearchAllVideos:q,getSeeMoreAppLink:P,log:o})]})}):(0,Y.jsx)(Y.Fragment,{})}export{xe as ContentPartnersDashboardView};
|
|
2
|
+
//# sourceMappingURL=C46OeU6w2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BgPye7Nd2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/channel-dashboard-description/ChannelDashboardDescription.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-no-content/ContentPartnerDashboardNoContent.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-empty-state/ContentPartnerEmptyState.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard.tsx","../../../../libs/shared/src/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger.ts","../../src/apps/content-partners/views/content-partners-dashboard/ContentPartnersDashboardView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ExpandableTextInline } from 'libs/shared/components/expandable-text-inline/ExpandableTextInline';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\ninterface ChannelDashboardDescriptionProps {\n partnerProfile: PartnerProfile;\n}\n\nexport function ChannelDashboardDescription(props: ChannelDashboardDescriptionProps): JSX.Element {\n const websiteLink = ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n );\n\n const displayWebsiteLink = UrlHelper.getHostname(websiteLink) ?? websiteLink;\n\n return (\n <div className='mt-3'>\n <ExpandableTextInline>\n {() => (\n <p className='mb-0'>\n {websiteLink && (\n <>\n <a\n href={websiteLink}\n target='_blank'\n rel='noopener noreferrer'\n className='position-relative d-inline-block ps-4 mb-2 me-2'\n >\n <SvgContainer svg={LinkSvg} className='svg-container position-absolute top-50 start-0 translate-middle-y' />\n <span className='ps-1'>{displayWebsiteLink}</span>\n </a>\n <span className='mb-2 me-2'>•</span>\n </>\n )}\n {props.partnerProfile.description}\n </p>\n )}\n </ExpandableTextInline>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardComingSoonProps {\n partnerName: string;\n comingSoonImageUrl: string;\n}\n\nexport function ContentPartnerDashboardComingSoon(props: ContentPartnerDashboardComingSoonProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.comingSoonImageUrl}\n altText={getPhrase('description', { partnerName: props.partnerName })}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' options={{ partnerName: props.partnerName }} />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardContentRegion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardContentRegionProps {\n contentRegionImageUrl: string;\n contentRegionButtonLink: Core.AppLink;\n}\n\nexport function ContentPartnerDashboardContentRegion(props: ContentPartnerDashboardContentRegionProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.contentRegionImageUrl} altText={getPhrase('imageAlt')} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Cta text={getPhrase('cta')} appLink={props.contentRegionButtonLink} className='btn btn-dark' />\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardNoContent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardNoContentProps {\n noContentImageUrl: string;\n}\n\nexport function ContentPartnerDashboardNoContent(props: ContentPartnerDashboardNoContentProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.noContentImageUrl}\n altText={getPhrase('description')}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport {\n ContentPartnerDashboardComingSoon,\n ContentPartnerDashboardComingSoonProps\n} from '../content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon';\nimport {\n ContentPartnerDashboardContentRegion,\n ContentPartnerDashboardContentRegionProps\n} from '../content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion';\nimport {\n ContentPartnerDashboardNoContent,\n ContentPartnerDashboardNoContentProps\n} from '../content-partner-dashboard-no-content/ContentPartnerDashboardNoContent';\n\nexport type ContentPartnerEmptyStateType = 'coming-soon' | 'content-region' | 'no-content';\n\nconst ContentParterEmptyStateTypes: Record<ContentPartnerEmptyStateType, React.ComponentType<any>> = {\n 'coming-soon': ContentPartnerDashboardComingSoon,\n 'content-region': ContentPartnerDashboardContentRegion,\n 'no-content': ContentPartnerDashboardNoContent\n};\n\ntype EmptyStateType<TType extends ContentPartnerEmptyStateType, TProps> = TProps & {\n type: TType\n};\n\ntype ContentPartnerEmptyStateProps =\n EmptyStateType<'coming-soon', ContentPartnerDashboardComingSoonProps> |\n EmptyStateType<'content-region', ContentPartnerDashboardContentRegionProps> |\n EmptyStateType<'no-content', ContentPartnerDashboardNoContentProps>;\n\nexport function ContentPartnerEmptyState(props: ContentPartnerEmptyStateProps): JSX.Element {\n const Component = ContentParterEmptyStateTypes[props.type];\n\n return <Component {...props} />;\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteWidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/InfiniteWidgetContainerView';\nimport { AllPartnerProfileWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useEmptyWidgets } from 'libs/shared/hooks/useEmptyWidgets';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardStatus, DashboardTargetType, PartnerProfile, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { ContentPartnerEventLoggerFn } from '../../utils/get-content-partner-event-logger/getContentPartnerEventLogger';\n\nimport { ChannelDashboardDescription } from './channel-dashboard-description/ChannelDashboardDescription';\nimport { ContentPartnerEmptyState, ContentPartnerEmptyStateType } from './empty-state/content-partner-empty-state/ContentPartnerEmptyState';\n\nconst InfiniteFetchWidgetIds: WidgetTypeId[] = [WidgetTypeId.ContentPartnerVideos];\n\nfunction shouldInfiniteFetch(widgets: CuratedWidget[], index: number): boolean {\n const currentWidget = widgets[index];\n\n if (!currentWidget) return false;\n \n return InfiniteFetchWidgetIds.includes(currentWidget.widgetId) && index === widgets.length - 1;\n}\n\nexport interface ContentPartnerDashboardProps {\n dashboard: CuratedDashboard;\n partnerProfile: PartnerProfile;\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ) => Flight.Request;\n commonVideoProps: CommonVideoProps;\n getBannerActions?: () => ActionOptions[];\n breadcrumbs?: Breadcrumb[];\n isReadonly?: boolean;\n widgetAppLinks?: AllPartnerProfileWidgetTemplates['appLinks'];\n scrollToWidgetId?: string;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n settings?: AllPartnerProfileWidgetTemplates['settings'];\n audiences?: PresentationAudience[];\n currentUser?: CurrentUser;\n emptyImageUrl?: string;\n lazyLoad?: boolean;\n isBot?: boolean;\n isComingSoon?: boolean;\n isPreviewing?: boolean;\n isAuthenticated?: boolean;\n isInContentRegion: boolean;\n onClickSignUp: (email: string) => void;\n onClickSearchAllVideos?: () => void;\n getSeeMoreAppLink?: (widget: CuratedWidget) => Core.AppLink;\n log?: ContentPartnerEventLoggerFn;\n}\n\nexport function ContentPartnerDashboard(props: ContentPartnerDashboardProps): JSX.Element {\n const widgets = ArrayHelper.sortBy(props.dashboard?.widgets, 'index');\n\n const { emptyWidgets, setEmptyWidget } = useEmptyWidgets(widgets);\n\n function getWidgetContentRequest(\n id: string,\n widgetTypeId: WidgetTypeId,\n template: WidgetTemplate,\n cursor?: string\n ): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard)\n );\n\n return props.getWidgetContentRequest(id, params, template, undefined, cursor);\n }\n\n function getEmptyStateType(): ContentPartnerEmptyStateType | false {\n if (!props.isInContentRegion)\n return 'content-region';\n \n if (props.isComingSoon)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return false;\n\n if (!widgets?.length)\n return 'no-content';\n \n const emptyValues = Object.values(emptyWidgets);\n \n if (emptyValues.length > 0 && emptyValues.every(state => !!state))\n return 'no-content';\n\n return false;\n }\n\n const bannerInfo = ContentPartnersHelper.getPartnerBannerInfo(props.partnerProfile);\n\n const emptyState = getEmptyStateType();\n const showExpandableDescription = (!emptyState || emptyState === 'content-region') && props.partnerProfile.description;\n\n return (\n <>\n {!!widgets.length &&\n <>\n <BannerHeader\n type='partner-profile'\n partnerBannerType={ContentPartnersHelper.getPartnerBannerType(props.partnerProfile)}\n heading={bannerInfo.heading}\n blockColourClass={bannerInfo.blockColourClass}\n logo={bannerInfo.logo}\n logoBgColour={bannerInfo.logoBgColour}\n banner={bannerInfo.banner}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n actions={props.getBannerActions?.()}\n onClickSignUp={props.onClickSignUp}\n isAuthenticated={props.isAuthenticated}\n videoUrl={props.partnerProfile._videobanner?.value?.url}\n websiteUrl={ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n )}\n isStudent={props.hasPermissions(PermissionName.StudentExperience)}\n log={props.log}\n />\n \n <div className='py-3 mb-3 border-bottom'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n {showExpandableDescription && (\n <ChannelDashboardDescription partnerProfile={props.partnerProfile} />\n )}\n </div>\n\n <div className='mt-3'>\n {!emptyState && widgets.map((widget, idx) => (\n <InfiniteWidgetContainerView<CuratedWidget, CuratedWidget, AllPartnerProfileWidgetTemplates>\n dashboardTarget={DashboardTargetType.PartnerProfile}\n key={widget.id}\n index={idx}\n item={widget}\n infiniteFetch={shouldInfiniteFetch(widgets, idx)}\n getName={widget => widget.name}\n getWidgetMetadata={w => w.metadata}\n appLinks={props.widgetAppLinks}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n audiences={props.audiences}\n setIsEmpty={isEmpty => setEmptyWidget(widget.id, isEmpty)}\n getCursor={w => w.cursor}\n getRequest={cursor => getWidgetContentRequest(widget.id, widget.widgetId, widget.templateId, cursor)}\n hasLocalPermissions={props.hasLocalPermissions}\n settingsHash={props.settings}\n getContent={w => w.content}\n resultsTransformers={WidgetHelper.getWidgetResultsTransformers()}\n onClickSearchAllVideos={props.onClickSearchAllVideos}\n getSeeMoreAppLink={props.getSeeMoreAppLink}\n isEmptyPredicate={items => (\n Array.isArray(items) && Array.isArray(items[0]?.content) && !items[0]?.content?.length\n )}\n\n getSelectedItems={null}\n appLinkOptions={null}\n />\n ))}\n </div>\n </>\n }\n\n {emptyState && <ContentPartnerEmptyState\n type={emptyState}\n // Coming soon empty state props\n partnerName={props.partnerProfile.name}\n comingSoonImageUrl={props.emptyImageUrl}\n // Content region empty state props\n contentRegionImageUrl={props.emptyImageUrl}\n contentRegionButtonLink={props.widgetAppLinks?.partnerHome?.()}\n // No content empty state props\n noContentImageUrl={props.emptyImageUrl}\n />}\n </>\n );\n}\n","import { AnalyticsOptions, ContentPartnerDescriptors, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EventLogConfig, getEventLogger } from 'libs/shared/utils/get-event-logger/getEventLogger';\n\nimport { BaseContentPartnerData, ContentPartnerData } from './interfaces/GetContentPartnerEventLogger';\n\ninterface ContentPartnerEventLoggerOptions {\n data: BaseContentPartnerData;\n analyticsOptions: AnalyticsOptions;\n shouldLog?: boolean;\n}\n\nexport type ContentPartnerEventLoggerFn = ReturnType<typeof getContentPartnerEventLogger>['log'];\n\nfunction getLogDataConfig(): EventLogConfig<ContentPartnerData> {\n return {\n 'click-video-banner-controls': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n descriptor: ContentPartnerDescriptors.VideoBannerControls,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n },\n 'click-video-banner-sign-up': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n workflowPhase: WorkflowPhase.Start,\n descriptor: ContentPartnerDescriptors.VideoBannerSignUp,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n }\n };\n}\n\nexport function getContentPartnerEventLogger(options: ContentPartnerEventLoggerOptions) {\n const { getData, log } = getEventLogger({\n analyticsOptions: options.analyticsOptions,\n baseData: options.data,\n config: getLogDataConfig(),\n shouldLog: options.shouldLog ?? true\n });\n\n return {\n log,\n getData\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { ContentPartnerDashboard } from 'libs/shared/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard';\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { getContentPartnerEventLogger } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardTargetType, Presentation } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePartnerProfile } from 'shared/hooks/usePartnerProfile';\nimport { DashboardViewQueryParams } from 'shared/interfaces/query-params/DashboardViewQueryParams';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { getContentPartnerWidgetAppLinks } from 'apps/content-partners/utils/getContentPartnerWidgetAppLinks';\nimport { useSignUpEntry } from 'apps/sign-up/hooks/useSignUpEntry';\nimport { SignUpHelper } from 'apps/sign-up/utils/SignUpHelper';\n\nconst namespace = 'contentPartners.dashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ContentPartnersDashboardViewProps {\n slug: string;\n queryParams?: DashboardViewQueryParams;\n}\n\nexport function ContentPartnersDashboardView(props: ContentPartnersDashboardViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const partnerProfile = usePartnerProfile(props.slug);\n const videoActions = useVideoActions({\n location: VideoActionsLocation.VideoItem,\n presentationSlug: null\n });\n\n const { log } = getContentPartnerEventLogger({\n data: {\n entity: {\n id: partnerProfile.data?.id,\n name: partnerProfile.data?.name,\n contentRegion: currentUser.data?.contentRegion\n }\n },\n analyticsOptions: {\n entity: EntityType.PartnerProfile,\n location: LocationContext.ContentPartnerDashboard\n }\n });\n\n useSignUpEntry({\n app: 'channels',\n id: partnerProfile.data?.id,\n metadata: { conversionSuffix: partnerProfile.data?.name }\n });\n\n const { openInCurationStudioLabel, isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail\n });\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const settings = useSettings(null);\n\n const { dashboard, isPreviewing } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.PartnerProfile,\n partnerProfileSlug: props.slug,\n queryParams: props.queryParams\n });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: partnerProfile.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: true\n }));\n\n const breadcrumbs = useBreadcrumbs({ name: partnerProfile.data?.name });\n\n React.useEffect(() => {\n if (!dashboard.hasCompleted || dashboard.data)\n return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ dashboard.data, dashboard.hasCompleted ]);\n\n const widgetAppLinks = getContentPartnerWidgetAppLinks(\n currentUser.data,\n { channelId: partnerProfile.data?.id, presentationSlug: null }\n );\n\n function getBannerActions(): ActionOptions[] {\n if (!isUserCurator)\n return [];\n\n return [{\n label: openInCurationStudioLabel,\n href: getOpenInCurationStudioLink(dashboard.data?.typeId, dashboard.data?.id),\n openInNewTab: true\n }];\n }\n\n function getWidgetContentRequest(\n id: string,\n params: CuratedWidgetQueryParams,\n template: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ): Flight.Request {\n return DashboardRequests.dashboardWidgetContent(\n id,\n params,\n template,\n presentation,\n { cursor }\n );\n }\n\n function getSeeMoreAppLink(widget: CuratedWidget): Core.AppLink {\n return WidgetTypeIdConfig[widget.widgetId]\n ?.getCollectionAppLink?.(widgetAppLinks, widget.content) ?? null;\n }\n\n function onClickSignUp(email: string): void {\n log?.({\n type: 'click-video-banner-sign-up',\n email: email\n });\n Core.AppLinkHelper.trigger(\n SignUpHelper.getSignUpAppLink({\n email\n })\n );\n }\n\n const loaded = partnerProfile.hasCompleted && dashboard.hasCompleted;\n const isBot = SeoHelper.isBot();\n\n const isInContentRegion = isPreviewing ?\n true : // skip content region check if previewing\n ContentPartnersHelper.isInContentRegion(\n partnerProfile.data,\n currentUser.data?.contentRegion,\n currentUser.data?.isAuthenticated\n );\n\n function onClickSearchAllVideos() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n scopeId: partnerProfile.data?.id\n }\n });\n }\n\n if (!loaded)\n return <></>;\n \n return (\n <div className='bg-white px-4 position-relative'>\n <VideoActionsContext.Provider value={videoActions}>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='channel' />}\n\n <ContentPartnerDashboard\n dashboard={dashboard.data}\n partnerProfile={partnerProfile.data}\n getWidgetContentRequest={getWidgetContentRequest}\n commonVideoProps={commonVideoProps}\n breadcrumbs={breadcrumbs}\n getBannerActions={getBannerActions}\n hasPermissions={hasPermissions}\n hasLocalPermissions={hasLocalPermissions}\n settings={settings}\n widgetAppLinks={widgetAppLinks}\n emptyImageUrl={ImageUrls.EmptyStates.WATCH_HISTORY}\n isBot={isBot}\n // Only lazy load if its an actual user\n lazyLoad={!isBot}\n isAuthenticated={currentUser.data?.isAuthenticated}\n isInContentRegion={isInContentRegion}\n onClickSignUp={onClickSignUp}\n isPreviewing={isPreviewing}\n onClickSearchAllVideos={onClickSearchAllVideos}\n getSeeMoreAppLink={getSeeMoreAppLink}\n log={log}\n />\n </VideoActionsContext.Provider>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C46OeU6w2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/channel-dashboard-description/ChannelDashboardDescription.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-no-content/ContentPartnerDashboardNoContent.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-empty-state/ContentPartnerEmptyState.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard.tsx","../../../../libs/shared/src/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger.ts","../../src/apps/content-partners/views/content-partners-dashboard/ContentPartnersDashboardView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ExpandableTextInline } from 'libs/shared/components/expandable-text-inline/ExpandableTextInline';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\ninterface ChannelDashboardDescriptionProps {\n partnerProfile: PartnerProfile;\n}\n\nexport function ChannelDashboardDescription(props: ChannelDashboardDescriptionProps): JSX.Element {\n const websiteLink = ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n );\n\n const displayWebsiteLink = UrlHelper.getHostname(websiteLink) ?? websiteLink;\n\n return (\n <div className='mt-3'>\n <ExpandableTextInline>\n {() => (\n <p className='mb-0'>\n {websiteLink && (\n <>\n <a\n href={websiteLink}\n target='_blank'\n rel='noopener noreferrer'\n className='position-relative d-inline-block ps-4 mb-2 me-2'\n >\n <SvgContainer svg={LinkSvg} className='svg-container position-absolute top-50 start-0 translate-middle-y' />\n <span className='ps-1'>{displayWebsiteLink}</span>\n </a>\n <span className='mb-2 me-2'>•</span>\n </>\n )}\n {props.partnerProfile.description}\n </p>\n )}\n </ExpandableTextInline>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardComingSoonProps {\n partnerName: string;\n comingSoonImageUrl: string;\n}\n\nexport function ContentPartnerDashboardComingSoon(props: ContentPartnerDashboardComingSoonProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.comingSoonImageUrl}\n altText={getPhrase('description', { partnerName: props.partnerName })}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' options={{ partnerName: props.partnerName }} />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardContentRegion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardContentRegionProps {\n contentRegionImageUrl: string;\n contentRegionButtonLink: Core.AppLink;\n}\n\nexport function ContentPartnerDashboardContentRegion(props: ContentPartnerDashboardContentRegionProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.contentRegionImageUrl} altText={getPhrase('imageAlt')} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Cta text={getPhrase('cta')} appLink={props.contentRegionButtonLink} className='btn btn-dark' />\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardNoContent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardNoContentProps {\n noContentImageUrl: string;\n}\n\nexport function ContentPartnerDashboardNoContent(props: ContentPartnerDashboardNoContentProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.noContentImageUrl}\n altText={getPhrase('description')}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport {\n ContentPartnerDashboardComingSoon,\n ContentPartnerDashboardComingSoonProps\n} from '../content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon';\nimport {\n ContentPartnerDashboardContentRegion,\n ContentPartnerDashboardContentRegionProps\n} from '../content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion';\nimport {\n ContentPartnerDashboardNoContent,\n ContentPartnerDashboardNoContentProps\n} from '../content-partner-dashboard-no-content/ContentPartnerDashboardNoContent';\n\nexport type ContentPartnerEmptyStateType = 'coming-soon' | 'content-region' | 'no-content';\n\nconst ContentParterEmptyStateTypes: Record<ContentPartnerEmptyStateType, React.ComponentType<any>> = {\n 'coming-soon': ContentPartnerDashboardComingSoon,\n 'content-region': ContentPartnerDashboardContentRegion,\n 'no-content': ContentPartnerDashboardNoContent\n};\n\ntype EmptyStateType<TType extends ContentPartnerEmptyStateType, TProps> = TProps & {\n type: TType\n};\n\ntype ContentPartnerEmptyStateProps =\n EmptyStateType<'coming-soon', ContentPartnerDashboardComingSoonProps> |\n EmptyStateType<'content-region', ContentPartnerDashboardContentRegionProps> |\n EmptyStateType<'no-content', ContentPartnerDashboardNoContentProps>;\n\nexport function ContentPartnerEmptyState(props: ContentPartnerEmptyStateProps): JSX.Element {\n const Component = ContentParterEmptyStateTypes[props.type];\n\n return <Component {...props} />;\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteWidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/InfiniteWidgetContainerView';\nimport { AllPartnerProfileWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useEmptyWidgets } from 'libs/shared/hooks/useEmptyWidgets';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardStatus, DashboardTargetType, PartnerProfile, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { ContentPartnerEventLoggerFn } from '../../utils/get-content-partner-event-logger/getContentPartnerEventLogger';\n\nimport { ChannelDashboardDescription } from './channel-dashboard-description/ChannelDashboardDescription';\nimport { ContentPartnerEmptyState, ContentPartnerEmptyStateType } from './empty-state/content-partner-empty-state/ContentPartnerEmptyState';\n\nconst InfiniteFetchWidgetIds: WidgetTypeId[] = [WidgetTypeId.ContentPartnerVideos];\n\nfunction shouldInfiniteFetch(widgets: CuratedWidget[], index: number): boolean {\n const currentWidget = widgets[index];\n\n if (!currentWidget) return false;\n \n return InfiniteFetchWidgetIds.includes(currentWidget.widgetId) && index === widgets.length - 1;\n}\n\nexport interface ContentPartnerDashboardProps {\n dashboard: CuratedDashboard;\n partnerProfile: PartnerProfile;\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ) => Flight.Request;\n commonVideoProps: CommonVideoProps;\n getBannerActions?: () => ActionOptions[];\n breadcrumbs?: Breadcrumb[];\n isReadonly?: boolean;\n widgetAppLinks?: AllPartnerProfileWidgetTemplates['appLinks'];\n scrollToWidgetId?: string;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n settings?: AllPartnerProfileWidgetTemplates['settings'];\n audiences?: PresentationAudience[];\n currentUser?: CurrentUser;\n emptyImageUrl?: string;\n lazyLoad?: boolean;\n isBot?: boolean;\n isComingSoon?: boolean;\n isPreviewing?: boolean;\n isAuthenticated?: boolean;\n isInContentRegion: boolean;\n onClickSignUp: (email: string) => void;\n onClickSearchAllVideos?: () => void;\n getSeeMoreAppLink?: (widget: CuratedWidget) => Core.AppLink;\n log?: ContentPartnerEventLoggerFn;\n}\n\nexport function ContentPartnerDashboard(props: ContentPartnerDashboardProps): JSX.Element {\n const widgets = ArrayHelper.sortBy(props.dashboard?.widgets, 'index');\n\n const { emptyWidgets, setEmptyWidget } = useEmptyWidgets(widgets);\n\n function getWidgetContentRequest(\n id: string,\n widgetTypeId: WidgetTypeId,\n template: WidgetTemplate,\n cursor?: string\n ): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard)\n );\n\n return props.getWidgetContentRequest(id, params, template, undefined, cursor);\n }\n\n function getEmptyStateType(): ContentPartnerEmptyStateType | false {\n if (!props.isInContentRegion)\n return 'content-region';\n \n if (props.isComingSoon)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return false;\n\n if (!widgets?.length)\n return 'no-content';\n \n const emptyValues = Object.values(emptyWidgets);\n \n if (emptyValues.length > 0 && emptyValues.every(state => !!state))\n return 'no-content';\n\n return false;\n }\n\n const bannerInfo = ContentPartnersHelper.getPartnerBannerInfo(props.partnerProfile);\n\n const emptyState = getEmptyStateType();\n const showExpandableDescription = (!emptyState || emptyState === 'content-region') && props.partnerProfile.description;\n\n return (\n <>\n {!!widgets.length &&\n <>\n <BannerHeader\n type='partner-profile'\n partnerBannerType={ContentPartnersHelper.getPartnerBannerType(props.partnerProfile)}\n heading={bannerInfo.heading}\n blockColourClass={bannerInfo.blockColourClass}\n logo={bannerInfo.logo}\n logoBgColour={bannerInfo.logoBgColour}\n banner={bannerInfo.banner}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n actions={props.getBannerActions?.()}\n onClickSignUp={props.onClickSignUp}\n isAuthenticated={props.isAuthenticated}\n videoUrl={props.partnerProfile._videobanner?.value?.url}\n websiteUrl={ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n )}\n isStudent={props.hasPermissions(PermissionName.StudentExperience)}\n log={props.log}\n />\n \n <div className='py-3 mb-3 border-bottom'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n {showExpandableDescription && (\n <ChannelDashboardDescription partnerProfile={props.partnerProfile} />\n )}\n </div>\n\n <div className='mt-3'>\n {!emptyState && widgets.map((widget, idx) => (\n <InfiniteWidgetContainerView<CuratedWidget, CuratedWidget, AllPartnerProfileWidgetTemplates>\n dashboardTarget={DashboardTargetType.PartnerProfile}\n key={widget.id}\n index={idx}\n item={widget}\n infiniteFetch={shouldInfiniteFetch(widgets, idx)}\n getName={widget => widget.name}\n getWidgetMetadata={w => w.metadata}\n appLinks={props.widgetAppLinks}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n audiences={props.audiences}\n setIsEmpty={isEmpty => setEmptyWidget(widget.id, isEmpty)}\n getCursor={w => w.cursor}\n getRequest={cursor => getWidgetContentRequest(widget.id, widget.widgetId, widget.templateId, cursor)}\n hasLocalPermissions={props.hasLocalPermissions}\n settingsHash={props.settings}\n getContent={w => w.content}\n resultsTransformers={WidgetHelper.getWidgetResultsTransformers()}\n onClickSearchAllVideos={props.onClickSearchAllVideos}\n getSeeMoreAppLink={props.getSeeMoreAppLink}\n isEmptyPredicate={items => (\n Array.isArray(items) && Array.isArray(items[0]?.content) && !items[0]?.content?.length\n )}\n\n getSelectedItems={null}\n appLinkOptions={null}\n />\n ))}\n </div>\n </>\n }\n\n {emptyState && <ContentPartnerEmptyState\n type={emptyState}\n // Coming soon empty state props\n partnerName={props.partnerProfile.name}\n comingSoonImageUrl={props.emptyImageUrl}\n // Content region empty state props\n contentRegionImageUrl={props.emptyImageUrl}\n contentRegionButtonLink={props.widgetAppLinks?.partnerHome?.()}\n // No content empty state props\n noContentImageUrl={props.emptyImageUrl}\n />}\n </>\n );\n}\n","import { AnalyticsOptions, ContentPartnerDescriptors, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EventLogConfig, getEventLogger } from 'libs/shared/utils/get-event-logger/getEventLogger';\n\nimport { BaseContentPartnerData, ContentPartnerData } from './interfaces/GetContentPartnerEventLogger';\n\ninterface ContentPartnerEventLoggerOptions {\n data: BaseContentPartnerData;\n analyticsOptions: AnalyticsOptions;\n shouldLog?: boolean;\n}\n\nexport type ContentPartnerEventLoggerFn = ReturnType<typeof getContentPartnerEventLogger>['log'];\n\nfunction getLogDataConfig(): EventLogConfig<ContentPartnerData> {\n return {\n 'click-video-banner-controls': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n descriptor: ContentPartnerDescriptors.VideoBannerControls,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n },\n 'click-video-banner-sign-up': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n workflowPhase: WorkflowPhase.Start,\n descriptor: ContentPartnerDescriptors.VideoBannerSignUp,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n }\n };\n}\n\nexport function getContentPartnerEventLogger(options: ContentPartnerEventLoggerOptions) {\n const { getData, log } = getEventLogger({\n analyticsOptions: options.analyticsOptions,\n baseData: options.data,\n config: getLogDataConfig(),\n shouldLog: options.shouldLog ?? true\n });\n\n return {\n log,\n getData\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { ContentPartnerDashboard } from 'libs/shared/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard';\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { getContentPartnerEventLogger } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardTargetType, Presentation } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePartnerProfile } from 'shared/hooks/usePartnerProfile';\nimport { DashboardViewQueryParams } from 'shared/interfaces/query-params/DashboardViewQueryParams';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { getContentPartnerWidgetAppLinks } from 'apps/content-partners/utils/getContentPartnerWidgetAppLinks';\nimport { useSignUpEntry } from 'apps/sign-up/hooks/useSignUpEntry';\nimport { SignUpHelper } from 'apps/sign-up/utils/SignUpHelper';\n\nconst namespace = 'contentPartners.dashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ContentPartnersDashboardViewProps {\n slug: string;\n queryParams?: DashboardViewQueryParams;\n}\n\nexport function ContentPartnersDashboardView(props: ContentPartnersDashboardViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const partnerProfile = usePartnerProfile(props.slug);\n const videoActions = useVideoActions({\n location: VideoActionsLocation.VideoItem,\n presentationSlug: null\n });\n\n const { log } = getContentPartnerEventLogger({\n data: {\n entity: {\n id: partnerProfile.data?.id,\n name: partnerProfile.data?.name,\n contentRegion: currentUser.data?.contentRegion\n }\n },\n analyticsOptions: {\n entity: EntityType.PartnerProfile,\n location: LocationContext.ContentPartnerDashboard\n }\n });\n\n useSignUpEntry({\n app: 'channels',\n id: partnerProfile.data?.id,\n metadata: { conversionSuffix: partnerProfile.data?.name }\n });\n\n const { openInCurationStudioLabel, isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail\n });\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const settings = useSettings(null);\n\n const { dashboard, isPreviewing } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.PartnerProfile,\n partnerProfileSlug: props.slug,\n queryParams: props.queryParams\n });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: partnerProfile.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: true\n }));\n\n const breadcrumbs = useBreadcrumbs({ name: partnerProfile.data?.name });\n\n React.useEffect(() => {\n if (!dashboard.hasCompleted || dashboard.data)\n return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ dashboard.data, dashboard.hasCompleted ]);\n\n const widgetAppLinks = getContentPartnerWidgetAppLinks(\n currentUser.data,\n { channelId: partnerProfile.data?.id, presentationSlug: null }\n );\n\n function getBannerActions(): ActionOptions[] {\n if (!isUserCurator)\n return [];\n\n return [{\n label: openInCurationStudioLabel,\n href: getOpenInCurationStudioLink(dashboard.data?.typeId, dashboard.data?.id),\n openInNewTab: true\n }];\n }\n\n function getWidgetContentRequest(\n id: string,\n params: CuratedWidgetQueryParams,\n template: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ): Flight.Request {\n return DashboardRequests.dashboardWidgetContent(\n id,\n params,\n template,\n presentation,\n { cursor }\n );\n }\n\n function getSeeMoreAppLink(widget: CuratedWidget): Core.AppLink {\n return WidgetTypeIdConfig[widget.widgetId]\n ?.getCollectionAppLink?.(widgetAppLinks, widget.content) ?? null;\n }\n\n function onClickSignUp(email: string): void {\n log?.({\n type: 'click-video-banner-sign-up',\n email: email\n });\n Core.AppLinkHelper.trigger(\n SignUpHelper.getSignUpAppLink({\n email\n })\n );\n }\n\n const loaded = partnerProfile.hasCompleted && dashboard.hasCompleted;\n const isBot = SeoHelper.isBot();\n\n const isInContentRegion = isPreviewing ?\n true : // skip content region check if previewing\n ContentPartnersHelper.isInContentRegion(\n partnerProfile.data,\n currentUser.data?.contentRegion,\n currentUser.data?.isAuthenticated\n );\n\n function onClickSearchAllVideos() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n scopeId: partnerProfile.data?.id\n }\n });\n }\n\n if (!loaded)\n return <></>;\n \n return (\n <div className='bg-white px-4 position-relative'>\n <VideoActionsContext.Provider value={videoActions}>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='channel' />}\n\n <ContentPartnerDashboard\n dashboard={dashboard.data}\n partnerProfile={partnerProfile.data}\n getWidgetContentRequest={getWidgetContentRequest}\n commonVideoProps={commonVideoProps}\n breadcrumbs={breadcrumbs}\n getBannerActions={getBannerActions}\n hasPermissions={hasPermissions}\n hasLocalPermissions={hasLocalPermissions}\n settings={settings}\n widgetAppLinks={widgetAppLinks}\n emptyImageUrl={ImageUrls.EmptyStates.WATCH_HISTORY}\n isBot={isBot}\n // Only lazy load if its an actual user\n lazyLoad={!isBot}\n isAuthenticated={currentUser.data?.isAuthenticated}\n isInContentRegion={isInContentRegion}\n onClickSignUp={onClickSignUp}\n isPreviewing={isPreviewing}\n onClickSearchAllVideos={onClickSearchAllVideos}\n getSeeMoreAppLink={getSeeMoreAppLink}\n log={log}\n />\n </VideoActionsContext.Provider>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./DAXXjFlN.chunk.js";import{t as e}from"./DMnm3Ewv.chunk.js";import{n as t}from"./B785hxeE.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{u as a}from"./BX0wDJmp.chunk.js";import{y as o}from"./NlCAcBdo.chunk.js";import{t as s}from"./DGmmTRu72.chunk.js";import{t as c}from"./DbSUQ2A12.chunk.js";import{t as l}from"./DZssmXj6.chunk.js";import{t as u}from"./BC8PeYqm.chunk.js";import{t as d}from"./LoQS6GjP.chunk.js";import{t as f}from"./CqrjHjAN.chunk.js";import{t as p}from"./XIE88U01.chunk.js";import{n as m,t as h}from"./C6-aC3vu.chunk.js";import{t as g}from"./7LGxCHGV.chunk.js";import{t as _}from"./Bbv3vbm7.chunk.js";import{t as v}from"./B3gsVN-_.chunk.js";import{l as y,r as b}from"./BxjzTnvL2.chunk.js";import{t as x}from"./Dfw0sxVt2.chunk.js";import{t as S}from"./C1loT8MD2.chunk.js";import{n as C}from"./ChnNWPOK2.chunk.js";import{t as w}from"./C9XBZFiR.chunk.js";import{t as T}from"./BnuuRu_J2.chunk.js";import{t as E}from"./CC5Dr9aG.chunk.js";import{t as D}from"./BYaCUOEW2.chunk.js";import{t as O}from"./DNuJUXpr2.chunk.js";import{v as k}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./DAXXjFlN.chunk.js";import{t as e}from"./DMnm3Ewv.chunk.js";import{n as t}from"./B785hxeE.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{u as a}from"./BX0wDJmp.chunk.js";import{y as o}from"./NlCAcBdo.chunk.js";import{t as s}from"./DGmmTRu72.chunk.js";import{t as c}from"./DbSUQ2A12.chunk.js";import{t as l}from"./DZssmXj6.chunk.js";import{t as u}from"./BC8PeYqm.chunk.js";import{t as d}from"./LoQS6GjP.chunk.js";import{t as f}from"./CqrjHjAN.chunk.js";import{t as p}from"./XIE88U01.chunk.js";import{n as m,t as h}from"./C6-aC3vu.chunk.js";import{t as g}from"./7LGxCHGV.chunk.js";import{t as _}from"./Bbv3vbm7.chunk.js";import{t as v}from"./B3gsVN-_.chunk.js";import{l as y,r as b}from"./BxjzTnvL2.chunk.js";import{t as x}from"./Dfw0sxVt2.chunk.js";import{t as S}from"./C1loT8MD2.chunk.js";import{n as C}from"./ChnNWPOK2.chunk.js";import{t as w}from"./C9XBZFiR.chunk.js";import{t as T}from"./BnuuRu_J2.chunk.js";import{t as E}from"./CC5Dr9aG.chunk.js";import{t as D}from"./BYaCUOEW2.chunk.js";import{t as O}from"./DNuJUXpr2.chunk.js";import{v as k}from"./VJQU9c4G2.chunk.js";import{t as A}from"./B6GfukUn2.chunk.js";r();var j=i(),M=n.encloseNamespace(`shared.playClip`),N={notFound:p,forbidden:{privacy:_}};P.defaultProps={queryParams:{}};function P(n){let{context:r,contextId:i,mtv:p}=n.queryParams,{hasProduct:_}=x(),{commonVideoProps:P,hasCommonVideoPropsCompleted:F}=T({locationContext:o.PlayClip,mtv:p}),{hasPermissions:I}=v(),{hasTopicDirectories:L,hasPlayPageTranscript:R}=s(null),z=a(f.currentUser()),B=a(l.clip(n.id)),V=a(u.videoInteractives(n.id)),H=a(!!B.data?._parentVideo&&d.video(B.data._parentVideo.id));O([H.data]);let U=a(!!B.data?._parentVideo&&l.videoClips(B.data._parentVideo.id)),W=a(B.statusCode===e.Forbidden&&l.clip(n.id,c.StripMetadata)),G=b({video:H.data,context:r,contextId:i,moviesAndTv:p,currentUser:z.data}),K=D(),q=k(),J=y(n.id,!0),Y=S({objectId:B.data?.id,objectTypeId:B.data?.typeId}),X=E({name:B.data?.name});return h(m.getClipMetadata({content:B.data,phraseContext:{phraseHandler:M,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`}})),w(B,N,{forbidden:!0}),O(G.videos??[]),g(W),C({id:n.id,app:`clips`}),B.data&&z.hasCompleted&&J.hasCompleted&&F?(0,j.jsx)(A,{clip:B.data,clips:U.data?.data,interactives:V.data?.data,currentUser:z.data,relatedVideos:r===`playlist`?G:{...G,videos:[]},hasProduct:_,queryParams:n.queryParams,audiences:K.data,canManageVideoAccess:I(t.ManageVideoAccess),pointsOfInterest:J.items,featureAccess:Y,tableOfContentsId:n.queryParams?.tocId,shouldShowSideTableOfContents:q,breadcrumbs:X,commonVideoProps:P,hasTopicDirectories:L,hasTheatreMode:R}):(0,j.jsx)(j.Fragment,{})}export{P as PlayClipView};
|
|
2
|
+
//# sourceMappingURL=C4OV7pr-.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"C4OV7pr-.chunk.js","names":[],"sources":["../../src/shared/views/play-clip/PlayClipView.tsx"],"sourcesContent":["import * as React from 'react';\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 { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Clip, ClipCollection, CurrentUser, InteractiveCollection, Video } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\n\nimport { PlayClip } from './components/play-clip/PlayClip';\n\nexport interface PlayViewProps {\n id: string;\n queryParams?: PlayViewQueryParams;\n}\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nPlayClipView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipView(props: PlayViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.PlayClip, mtv });\n const { hasPermissions } = usePermissions();\n const { hasTopicDirectories, hasPlayPageTranscript } = useSettings(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n\n const interactives = Flight.useBasicFetch<InteractiveCollection>(InteractiveRequests.videoInteractives(props.id));\n const video = Flight.useBasicFetch<Video>(\n !!clip.data?._parentVideo && VideoRequests.video(clip.data._parentVideo.id)\n );\n useVideoMixin([video.data]);\n\n const childClips = Flight.useBasicFetch<ClipCollection>(\n !!clip.data?._parentVideo && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess({\n objectId: clip.data?.id,\n objectTypeId: clip.data?.typeId\n });\n\n const breadcrumbs = useBreadcrumbs({ name: clip.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n pointsOfInterest.hasCompleted &&\n hasCommonVideoPropsCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n clip={clip.data}\n clips={childClips.data?.data}\n interactives={interactives.data?.data}\n currentUser={currentUser.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n breadcrumbs={breadcrumbs}\n commonVideoProps={commonVideoProps}\n hasTopicDirectories={hasTopicDirectories}\n hasTheatreMode={hasPlayPageTranscript}\n />\n );\n}\n"],"mappings":"2sCA4CM,EAAY,EAAgB,iBAAiB,iBAAS,EAEtD,EAAa,CACjB,SAAU,EACV,UAAW,CACT,QAAS,CACX,CACF,EAEA,EAAa,aAAe,CAC1B,YAAa,CAAC,CAChB,EAEA,SAAgB,EAAa,EAAmC,CAC9D,GAAM,CAAE,UAAS,YAAW,OAAQ,EAAM,YAEpC,CAAE,cAAe,EAAY,EAC7B,CACJ,mBACA,gCACE,EAAoB,CAAE,gBAAiB,EAAgB,SAAU,KAAI,CAAC,EACpE,CAAE,kBAAmB,EAAe,EACpC,CAAE,sBAAqB,yBAA0B,EAAY,IAAI,EAEjE,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAO,EAA2B,EAAa,KAAK,EAAM,EAAE,CAAC,EAE7D,EAAe,EAA4C,EAAoB,kBAAkB,EAAM,EAAE,CAAC,EAC1G,EAAQ,EACZ,CAAC,CAAC,EAAK,MAAM,cAAgB,EAAc,MAAM,EAAK,KAAK,aAAa,EAAE,CAC5E,EACA,EAAc,CAAC,EAAM,IAAI,CAAC,EAE1B,IAAM,EAAa,EACjB,CAAC,CAAC,EAAK,MAAM,cAAgB,EAAa,WAAW,EAAK,KAAK,aAAa,EAAE,CAChF,EAEM,EAAe,EAA2B,EAAK,aAAe,EAAW,WAC7E,EAAa,KAAK,EAAM,GAAI,EAAuB,aAAa,CAAC,EAC7D,EAAgB,EAAoB,CACxC,MAAO,EAAM,KACb,UACA,YACA,YAAa,EACb,YAAa,EAAY,IAC3B,CAAC,EACK,EAAY,EAAyB,EACrC,EAAgC,EAAiC,EAEjE,EAAmB,EAAyB,EAAM,GAAI,EAAI,EAE1D,EAAgB,EAAsB,CAC1C,SAAU,EAAK,MAAM,GACrB,aAAc,EAAK,MAAM,MAC3B,CAAC,EAEK,EAAc,EAAe,CAAE,KAAM,EAAK,MAAM,IAAK,CAAC,EA0B5D,OAxBA,EAAmB,EAAmB,gBAAgB,CACpD,QAAS,EAAK,KACd,cAAe,CACb,cAAe,EACf,YAAa,YACb,kBAAmB,iBACrB,CACF,CAAC,CAAC,EAEF,EAAqB,EAAM,EAAY,CAAE,UAAW,EAAK,CAAC,EAC1D,EAAc,EAAc,QAAU,CAAC,CAAC,EACxC,EAAsB,CAAY,EAClC,EAAa,CAAE,GAAI,EAAM,GAAI,IAAK,OAAQ,CAAC,EAGzC,EAAK,MACL,EAAY,cACZ,EAAiB,cACjB,GAOA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAK,KACX,MAAO,EAAW,MAAM,KACxB,aAAc,EAAa,MAAM,KACjC,YAAa,EAAY,KAEzB,cAAe,IAAY,WAAa,EAAgB,CAAE,GAAG,EAAe,OAAQ,CAAC,CAAC,EAC1E,aACZ,YAAa,EAAM,YACnB,UAAW,EAAU,KACrB,qBAAsB,EAAe,EAAe,iBAAiB,EACrE,iBAAkB,EAAiB,MACpB,gBACf,kBAAmB,EAAM,aAAa,MACP,gCAClB,cACK,mBACG,sBACrB,eAAgB,CACjB,CAAA,GAtBM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAwBf"}
|