@clickview/lite 0.103.0-rc.0 → 0.103.0
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 +640 -640
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{BXosUOUS.chunk.js → 14z5Gy8L.chunk.js} +2 -2
- package/dist/scripts/{BXosUOUS.chunk.js.map → 14z5Gy8L.chunk.js.map} +1 -1
- package/dist/scripts/{BqkK_0Jk2.chunk.js → B4AZn1xm2.chunk.js} +2 -2
- package/dist/scripts/{BqkK_0Jk2.chunk.js.map → B4AZn1xm2.chunk.js.map} +1 -1
- package/dist/scripts/{_wBbQ-0z2.chunk.js → BBndy2td2.chunk.js} +2 -2
- package/dist/scripts/{_wBbQ-0z2.chunk.js.map → BBndy2td2.chunk.js.map} +1 -1
- package/dist/scripts/{BhgNNQjX.chunk.js → BOQck-Qs.chunk.js} +2 -2
- package/dist/scripts/{BhgNNQjX.chunk.js.map → BOQck-Qs.chunk.js.map} +1 -1
- package/dist/scripts/{BCTM3KG42.chunk.js → BQNOt7_Q2.chunk.js} +2 -2
- package/dist/scripts/{BCTM3KG42.chunk.js.map → BQNOt7_Q2.chunk.js.map} +1 -1
- package/dist/scripts/{DBdkd4Ag2.chunk.js → BTXOoJko2.chunk.js} +3 -3
- package/dist/scripts/{DBdkd4Ag2.chunk.js.map → BTXOoJko2.chunk.js.map} +1 -1
- package/dist/scripts/{wmwWqIeA.chunk.js → BTr5dJhb.chunk.js} +2 -2
- package/dist/scripts/{wmwWqIeA.chunk.js.map → BTr5dJhb.chunk.js.map} +1 -1
- package/dist/scripts/{B-aaIChO2.chunk.js → BTugVIIN2.chunk.js} +2 -2
- package/dist/scripts/{B-aaIChO2.chunk.js.map → BTugVIIN2.chunk.js.map} +1 -1
- package/dist/scripts/{_eRiDJm1.chunk.js → Ba4uGz_V.chunk.js} +2 -2
- package/dist/scripts/{_eRiDJm1.chunk.js.map → Ba4uGz_V.chunk.js.map} +1 -1
- package/dist/scripts/{Bx6qaXLc.chunk.js → Bdbe2u0R.chunk.js} +2 -2
- package/dist/scripts/{Bx6qaXLc.chunk.js.map → Bdbe2u0R.chunk.js.map} +1 -1
- package/dist/scripts/{syYCrnUX.chunk.js → BgoVmaXQ.chunk.js} +2 -2
- package/dist/scripts/{syYCrnUX.chunk.js.map → BgoVmaXQ.chunk.js.map} +1 -1
- package/dist/scripts/{B5DWwtp0.chunk.js → BjA9XV5y.chunk.js} +2 -2
- package/dist/scripts/{B5DWwtp0.chunk.js.map → BjA9XV5y.chunk.js.map} +1 -1
- package/dist/scripts/{Dp8z_udC.chunk.js → BoT5D3IL.chunk.js} +2 -2
- package/dist/scripts/{Dp8z_udC.chunk.js.map → BoT5D3IL.chunk.js.map} +1 -1
- package/dist/scripts/{BYMMqtaN.chunk.js → BqdHoEFM.chunk.js} +2 -2
- package/dist/scripts/{BYMMqtaN.chunk.js.map → BqdHoEFM.chunk.js.map} +1 -1
- package/dist/scripts/{BIvmcqND2.chunk.js → CCUznsdX2.chunk.js} +2 -2
- package/dist/scripts/{BIvmcqND2.chunk.js.map → CCUznsdX2.chunk.js.map} +1 -1
- package/dist/scripts/{BsNCh4UD.chunk.js → CFqL2Hm5.chunk.js} +3 -3
- package/dist/scripts/{BsNCh4UD.chunk.js.map → CFqL2Hm5.chunk.js.map} +1 -1
- package/dist/scripts/{BE8Ze3Fa2.chunk.js → CHmbcl4Y2.chunk.js} +2 -2
- package/dist/scripts/{BE8Ze3Fa2.chunk.js.map → CHmbcl4Y2.chunk.js.map} +1 -1
- package/dist/scripts/{RuVwpX36.chunk.js → CWCtYUUU.chunk.js} +2 -2
- package/dist/scripts/{RuVwpX36.chunk.js.map → CWCtYUUU.chunk.js.map} +1 -1
- package/dist/scripts/{CO8EIpI8.chunk.js → CXUrMkZu.chunk.js} +2 -2
- package/dist/scripts/{CO8EIpI8.chunk.js.map → CXUrMkZu.chunk.js.map} +1 -1
- package/dist/scripts/{DLqG-wwP.chunk.js → CYrelpYt.chunk.js} +2 -2
- package/dist/scripts/{DLqG-wwP.chunk.js.map → CYrelpYt.chunk.js.map} +1 -1
- package/dist/scripts/{Drx3PvJj.chunk.js → Cc9f2ux0.chunk.js} +2 -2
- package/dist/scripts/{Drx3PvJj.chunk.js.map → Cc9f2ux0.chunk.js.map} +1 -1
- package/dist/scripts/Cj_F4Lv92.chunk.js +2 -0
- package/dist/scripts/{C8l37H7t2.chunk.js.map → Cj_F4Lv92.chunk.js.map} +1 -1
- package/dist/scripts/{B5M-3wpn.chunk.js → CjwT65ug.chunk.js} +2 -2
- package/dist/scripts/{B5M-3wpn.chunk.js.map → CjwT65ug.chunk.js.map} +1 -1
- package/dist/scripts/{Dd23z1_x2.chunk.js → CvSpUZcJ2.chunk.js} +2 -2
- package/dist/scripts/{Dd23z1_x2.chunk.js.map → CvSpUZcJ2.chunk.js.map} +1 -1
- package/dist/scripts/{QrUfkwZX.chunk.js → DFleEz5_.chunk.js} +2 -2
- package/dist/scripts/{QrUfkwZX.chunk.js.map → DFleEz5_.chunk.js.map} +1 -1
- package/dist/scripts/{ygwO7HPs2.chunk.js → DIaT_eGy2.chunk.js} +2 -2
- package/dist/scripts/{ygwO7HPs2.chunk.js.map → DIaT_eGy2.chunk.js.map} +1 -1
- package/dist/scripts/{DXRsxBJw.chunk.js → DTliAJ8L.chunk.js} +2 -2
- package/dist/scripts/{DXRsxBJw.chunk.js.map → DTliAJ8L.chunk.js.map} +1 -1
- package/dist/scripts/{CfVIZBcI2.chunk.js → DXkvlC_92.chunk.js} +2 -2
- package/dist/scripts/{CfVIZBcI2.chunk.js.map → DXkvlC_92.chunk.js.map} +1 -1
- package/dist/scripts/{DE5jvfAx2.chunk.js → D_t70KgV2.chunk.js} +2 -2
- package/dist/scripts/{DE5jvfAx2.chunk.js.map → D_t70KgV2.chunk.js.map} +1 -1
- package/dist/scripts/{Dc01PBv1.chunk.js → Dn2EPvQj.chunk.js} +2 -2
- package/dist/scripts/{Dc01PBv1.chunk.js.map → Dn2EPvQj.chunk.js.map} +1 -1
- package/dist/scripts/{C4CuJJXy2.chunk.js → Dvl1XgHV2.chunk.js} +2 -2
- package/dist/scripts/{C4CuJJXy2.chunk.js.map → Dvl1XgHV2.chunk.js.map} +1 -1
- package/dist/scripts/{YzhKditE.chunk.js → ESLgHTNq.chunk.js} +2 -2
- package/dist/scripts/{YzhKditE.chunk.js.map → ESLgHTNq.chunk.js.map} +1 -1
- package/dist/scripts/{DfSzsD3P.chunk.js → FysETOFv.chunk.js} +2 -2
- package/dist/scripts/{DfSzsD3P.chunk.js.map → FysETOFv.chunk.js.map} +1 -1
- package/dist/scripts/{OmYpHs7g.chunk.js → _Cm5O72d.chunk.js} +3 -3
- package/dist/scripts/{OmYpHs7g.chunk.js.map → _Cm5O72d.chunk.js.map} +1 -1
- package/dist/scripts/{app-BzCWmnrr.js → app-k0jrat-b.js} +4 -4
- package/dist/scripts/{app-BzCWmnrr.js.map → app-k0jrat-b.js.map} +1 -1
- package/dist/scripts/{C46080Xd.chunk.js → dxqgnrOi.chunk.js} +2 -2
- package/dist/scripts/{C46080Xd.chunk.js.map → dxqgnrOi.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/C8l37H7t2.chunk.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"B5M-3wpn.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/time-input/time-input.module.scss","../../../../libs/shared/src/components/time-input/TimeInput.tsx","../../../../libs/shared/src/apps/clips/components/clip-time-form/ClipTimeForm.tsx","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle.ts","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar.ts","../../../player/src/plugins/create-clip-plugin/create-clip-plugin.ts","../../../player/src/players/create-clip-player.ts","../../../player/src/react/CreateClipPlayer.tsx","../../src/shared/views/edit-clip-timepoints/EditClipTimepointsView.tsx"],"sourcesContent":[":local {\n .arrowContainer {\n padding: 0.16666rem;\n cursor: pointer;\n\n &:hover {\n background-color: $gray-400;\n }\n }\n\n %arrow {\n width: 0.66666rem; \n height: 0.33333rem; \n border-left: 0.33333rem solid transparent;\n border-right: 0.33333rem solid transparent;\n }\n\n .upArrow {\n @extend %arrow;\n border-bottom: 0.33333rem solid $gray-900;\n }\n\n .downArrow {\n @extend %arrow;\n border-top: 0.33333rem solid $gray-900;\n }\n\n .inputContainer {\n border: 1px solid $gray-300;\n transition: box-shadow 0.1s ease-in-out;\n\n &.focus {\n border: 1px solid $blue;\n outline: 0 !important;\n box-shadow: $input-focus-box-shadow;\n }\n\n input {\n width: 1.5rem;\n }\n }\n}","import * as React from 'react';\n\nimport { TimeHelper } from 'libs/common/react/utils/TimeHelper';\n\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport styles from './time-input.module.scss';\n\nconst UP_ARROW_KEYCODE = 38;\nconst DOWN_ARROW_KEYCODE = 40;\n\nconst HOUR = 3600; // hour in seconds;\n\ninterface TimeInputProps {\n /**\n * A time in seconds\n */\n value: number;\n\n /**\n * Callback to set time where time is in seconds.\n *\n * Will be called on blur.\n */\n setTime: (time: number) => void;\n\n /**\n * Allows a time to be typed in by the user.\n *\n * Note: this doesn't include UP/DOWN keyboard arrows which are always enabled.\n */\n allowKeyboardInput?: boolean;\n\n formSize?: 'md' | 'lg';\n\n hasError?: boolean;\n\n /**\n * Time in seconds to logically cap the maximum input value\n */\n maxValue?: number;\n\n disabled?: boolean;\n\n /**\n * If set to true, will hide the up and down arrow buttons\n */\n hideButtons?: boolean;\n\n duration?: number;\n}\n\nTimeInput.defaultProps = {\n allowKeyboardInput: true,\n size: 'lg'\n};\n\nexport function TimeInput(props: TimeInputProps): JSX.Element {\n const [ hours, setHours ] = React.useState('00');\n const [ minutes, setMinutes ] = React.useState('00');\n const [ seconds, setSeconds ] = React.useState('00');\n const [ focus, setFocus ] = React.useState(false);\n\n const minutesRef = React.useRef(null);\n const secondsRef = React.useRef(null);\n\n const showHours = props.duration && props.duration >= HOUR;\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n e.target.select();\n setFocus(true);\n }\n\n function handleChange(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void,\n nextInputRef?: React.MutableRefObject<HTMLInputElement>\n ) {\n const inputValue = event.target.value;\n const formattedValue = inputValue.replace(/\\D/g, '').slice(0, 2);\n setValue(formattedValue);\n \n if (formattedValue.length === 2 && nextInputRef?.current)\n requestAnimationFrame(() => nextInputRef.current.focus());\n }\n\n function increment(): void {\n props.setTime(props.value + 1);\n }\n\n function decrement(): void {\n props.setTime(props.value - 1);\n }\n\n function handleBlur(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void\n ): void {\n if (!props.allowKeyboardInput)\n return;\n\n updateTime(TimeHelper.convertDurationToSeconds(hours, minutes, seconds));\n setValue(event.target.value.padStart(2, '0'));\n setFocus(false);\n }\n\n function updateTime(value: number) {\n if (value < 0)\n return;\n \n if (props.maxValue && value > props.maxValue)\n return;\n \n props.setTime(value);\n }\n\n function setTimeInputs() {\n const displayDuration = DurationHelper.ToDisplayDuration(props.value * 1000, true).split(':');\n\n setHours(String(displayDuration[0]).padStart(2, '0'));\n setMinutes(displayDuration[1]);\n setSeconds(displayDuration[2]);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.keyCode === UP_ARROW_KEYCODE)\n increment();\n\n if (e.keyCode === DOWN_ARROW_KEYCODE)\n decrement();\n }\n\n React.useEffect(() => {\n setTimeInputs();\n }, [props.value]);\n\n return (\n <div className={`${styles.inputContainer} ${focus ? styles.focus : ''} position-relative bg-white d-flex align-items-center p-2 rounded-pill font-size-md`}>\n <div className={`${showHours ? '' : 'd-none'}`}>\n <input\n type='text'\n className='border-0 outline-none'\n value={hours}\n maxLength={2}\n placeholder='HH'\n onChange={e => handleChange(e, setHours, minutesRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setHours)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <div>\n <input\n ref={minutesRef}\n type='text'\n className='border-0 outline-none'\n value={minutes}\n maxLength={2}\n placeholder='MM'\n onChange={e => handleChange(e, setMinutes, secondsRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setMinutes)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <input\n ref={secondsRef}\n type='text'\n className='border-0 outline-none'\n value={seconds}\n maxLength={2}\n placeholder='SS'\n onChange={e => setSeconds(e.target.value)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setSeconds)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n {!props.hideButtons &&\n <div>\n <div className={styles.arrowContainer} onClick={increment}>\n <div className={styles.upArrow} />\n </div>\n <div className={styles.arrowContainer} onClick={decrement}>\n <div className={styles.downArrow} />\n </div>\n </div>\n }\n </div>\n );\n}\n\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimeInput } from 'libs/shared/components/time-input/TimeInput';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nconst namespace = 'shared.clipTimeForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * All times are in seconds.\n */\ninterface ClipTimeFormProps {\n startTime: number;\n endTime: number;\n setStartTime: (time: number) => void;\n setEndTime: (time: number) => void;\n onSubmit: () => void;\n onCancel: () => void;\n duration: number;\n}\n\nexport function ClipTimeForm(props: ClipTimeFormProps): JSX.Element {\n if (isNaN(props.startTime) || isNaN(props.endTime))\n return <></>;\n\n /**\n * DurationHelper.ToDisplayDuration in TimeInput will truncate as decimals\n * so we floor the times when displaying the duration.\n */\n const duration = Math.floor(props.endTime) - Math.floor(props.startTime);\n\n return (\n <div className='px-3'>\n <form className='d-flex align-items-center justify-content-center pb-4'>\n <div>\n <TimeInput\n value={props.startTime}\n setTime={props.setStartTime}\n duration={props.duration}\n />\n </div>\n <span className='px-2'>-</span>\n <div className='me-2'>\n <TimeInput\n value={props.endTime}\n setTime={props.setEndTime}\n duration={props.duration}\n />\n </div>\n <span>\n <strong><Text namespace={namespace} phrase='duration' /></strong>\n \n {DurationHelper.ToDisplayDuration((duration) * 1000)}\n </span>\n </form>\n <div className='d-flex justify-content-end'>\n <button className='btn btn-link' onClick={props.onCancel}>\n {getPhrase('cancel')}\n </button>\n <button className='btn btn-dark' onClick={props.onSubmit}>\n {getPhrase('next')}\n </button>\n </div>\n </div>\n );\n}\n","import videojs from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\n// tslint:disable-next-line\nconst handleSvg = '<svg viewBox=\"0 0 5 14\" pointer-events=\"none\"><g id=\"Clips\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Clip-2\" transform=\"translate(-835.000000, -632.000000)\" fill=\"#FFFFFF\"><g id=\"Video-Copy\" transform=\"translate(275.000000, 96.000000)\"><g id=\"Handles\" transform=\"translate(560.000000, 536.000000)\"><circle id=\"Oval\" cx=\"1\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-2\" cx=\"1\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-4\" cx=\"1\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-8\" cx=\"1\" cy=\"13\" r=\"1\"></circle><circle id=\"Oval-Copy\" cx=\"4\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-3\" cx=\"4\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-5\" cx=\"4\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-9\" cx=\"4\" cy=\"13\" r=\"1\"></circle></g></g></g></g></svg>';\n\nexport class ClipTimepointSelectorHandle extends Component {\n public buildCSSClass(): string {\n return `cv-clip-timepoint-handle ${super.buildCSSClass()}`;\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML: handleSvg\n }, attributes);\n }\n\n public isEventTarget(e: videojs.EventTarget.Event): boolean {\n return this.el().contains(e.target as Node);\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport {\n ClipTimepointSelectorHandle\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle';\n\nimport './clip-timepoint-selector.scss';\n\nexport interface ClipTimepointSelectorOptions extends videojs.ComponentOptions {\n startTime: number;\n endTime: number;\n minDuration: number;\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n}\n\nexport class ClipTimepointSelector extends Component {\n // tslint:disable-next-line\n public options_: ClipTimepointSelectorOptions;\n\n // tslint:disable-next-line\n public el_: HTMLElement;\n\n private minDuration: number;\n\n /**\n * These variables shouldn't be set directly.\n * setStartTime and setEndTime should be used.\n */\n private startTime: number;\n private endTime: number;\n\n private startHandle: ClipTimepointSelectorHandle;\n private endHandle: ClipTimepointSelectorHandle;\n\n private dragStartActive: boolean = false;\n private dragEndActive: boolean = false;\n private dragSliderActive: boolean = false;\n\n private dragSliderCurrentPosition: number = null;\n\n constructor(player: VideoJsPlayer, options: ClipTimepointSelectorOptions) {\n super(player, options);\n\n this.minDuration = Math.min(player.duration(), this.options_.minDuration);\n\n this.setStartTime(options.startTime, false);\n this.setEndTime(options.endTime, false);\n\n this.startHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.startHandle.addClass('cv-clip-start-handle');\n this.addChild(this.startHandle);\n\n this.endHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.endHandle.addClass('cv-clip-end-handle');\n this.addChild(this.endHandle);\n\n this.on(this.player(), 'update:clip:start:time', ({ time }) => this.setStartTime(time));\n this.on(this.player(), 'update:clip:end:time', ({ time }) => this.setEndTime(time));\n\n this.bindListeners();\n this.update();\n }\n\n public createEl(): Element {\n return super.createEl('div', {\n className: 'cv-clip-timepoint-selector'\n }, {});\n }\n\n private update(): void {\n this.options_.onChangeStartTime(this.startTime);\n this.options_.onChangeEndTime(this.endTime);\n\n this.requestAnimationFrame(() => {\n this.setStartOffset();\n this.setWidth();\n });\n }\n\n private setStartTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const maxStartTime = this.player().duration() - this.minDuration;\n\n if (time > maxStartTime)\n time = maxStartTime;\n\n if (time < 0)\n time = 0;\n\n this.startTime = time;\n\n if (this.endTime && (this.endTime - this.startTime < this.minDuration)) {\n const newEndTime = typeof currentDuration === 'number' ?\n this.startTime + currentDuration :\n this.startTime + this.minDuration;\n\n this.setEndTime(newEndTime);\n }\n\n /**\n * Seek player to the clip start time.\n */\n this.player().currentTime(this.startTime);\n\n if (shouldUpdate)\n this.update();\n }\n\n private setEndTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const minEndTime = this.minDuration;\n\n if (time < minEndTime)\n time = minEndTime;\n\n if (time > this.player().duration())\n time = this.player().duration();\n\n this.endTime = time;\n\n if (this.startTime && (this.endTime - this.startTime < this.minDuration)) {\n const newStartTime = typeof currentDuration === 'number' ?\n this.endTime - currentDuration :\n this.endTime - this.minDuration;\n\n this.setStartTime(newStartTime);\n }\n\n if (shouldUpdate)\n this.update();\n }\n\n private bindListeners(): void {\n this.onTimeupdate = this.onTimeupdate.bind(this);\n this.player().on('timeupdate', this.onTimeupdate);\n\n this.on('mousedown', this.dragStart);\n this.on('touchstart', this.dragStart);\n\n this.player().on('dispose', () => {\n this.player().off('timeupdate', this.onTimeupdate);\n this.off('mousedown', this.dragStart);\n this.off('touchstart', this.dragStart);\n });\n }\n\n private hasStartTime(): boolean {\n return typeof this.startTime === 'number';\n }\n\n private hasEndTime(): boolean {\n return typeof this.endTime === 'number';\n }\n\n private onTimeupdate(): void {\n /**\n * Pause the player if it plays past the end point\n */\n const currentTime = this.player().currentTime();\n if (currentTime > this.endTime && currentTime < (this.endTime + 0.5))\n this.player().pause();\n }\n\n private dragStart(e: videojs.EventTarget.Event): void {\n if (this.startHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragStartActive = true;\n }\n\n if (this.endHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragEndActive = true;\n }\n\n if (e.target === this.el()) {\n e.stopImmediatePropagation();\n this.dragSliderActive = true;\n this.dragSliderCurrentPosition = this.getPosition(e);\n }\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.on(doc, 'mousemove', this.drag);\n this.on(doc, 'mouseup', this.dragEnd);\n this.on(doc, 'touchmove', this.drag);\n this.on(doc, 'touchend', this.dragEnd);\n\n this.drag(e);\n }\n\n private dragEnd(): void {\n this.dragStartActive = false;\n this.dragEndActive = false;\n this.dragSliderActive = false;\n this.dragSliderCurrentPosition = null;\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.off(doc, 'mousemove', this.drag);\n this.off(doc, 'mouseup', this.dragEnd);\n this.off(doc, 'touchmove', this.drag);\n this.off(doc, 'touchend', this.dragEnd);\n }\n\n private drag(e: videojs.EventTarget.Event): void {\n if (!this.dragStartActive && !this.dragEndActive && !this.dragSliderActive || !videojs.dom.isSingleLeftClick(e))\n return;\n \n const position = this.getPosition(e);\n\n const timepoint = position * this.player().duration();\n\n if (this.dragStartActive)\n this.handleStartHandleDrag(timepoint);\n\n if (this.dragEndActive)\n this.handleEndHandleDrag(timepoint);\n\n if (this.dragSliderActive)\n this.handleSliderDrag(position);\n }\n\n private handleStartHandleDrag(timepoint: number): void {\n this.setStartTime(timepoint);\n }\n\n private handleEndHandleDrag(timepoint: number): void {\n this.setEndTime(timepoint);\n }\n\n private handleSliderDrag(position: number): void {\n const timeDifference = (position - this.dragSliderCurrentPosition) * this.player().duration();\n const newStartTime = this.startTime + timeDifference;\n const newEndTime = this.endTime + timeDifference;\n\n /**\n * Don't move if the clip is already at the beginning and/or end\n * of the video.\n */\n if (newStartTime <= 0 || newEndTime >= this.player().duration())\n return;\n\n this.dragSliderCurrentPosition = position;\n this.setStartTime(newStartTime);\n this.setEndTime(newEndTime);\n }\n\n private getPosition(e: videojs.EventTarget.Event): number {\n return videojs.dom.getPointerPosition(this.el_.parentNode as HTMLElement, e).x;\n }\n\n private setStartOffset(): void {\n this.el_.style.marginLeft = `${this.getPercentage(this.startTime)}%`;\n }\n\n private setWidth(): void {\n this.el_.style.width = `${this.getPercentage(this.endTime - this.startTime)}%`;\n }\n\n private getPercentage(time: number): number {\n return +((time / this.player().duration() * 100).toFixed(4));\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport './create-clip-progress-indicator.scss';\n\ninterface CreateClipProgressIndicatorOptions extends videojs.ComponentOptions {\n seekBar: videojs.Component;\n playProgressBar: videojs.Component;\n}\n\nexport class CreateClipProgressIndicator extends Component {\n private el_: HTMLDivElement;\n private seekBar_: videojs.Component;\n private playProgressBar_: videojs.Component;\n private videoWasPlaying_: boolean;\n\n constructor(player: VideoJsPlayer, options: CreateClipProgressIndicatorOptions) {\n super(player, options);\n\n this.seekBar_ = options.seekBar;\n this.playProgressBar_ = options.playProgressBar;\n\n this.bindListeners();\n this.player_.one('dispose', () => {\n this.unbindListeners();\n });\n }\n\n public createEl(tagName?: string, properties?: any, attribtues?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: 'cv-create-clip-progress-indicator'\n }, attribtues);\n }\n\n private bindListeners(): void {\n this.on('mousedown', this.handleMouseDown);\n this.on('touchstart', this.handleMouseDown);\n }\n\n private unbindListeners(): void {\n const doc = (this.el_ as any).ownerDocument;\n\n this.off('mousedown', this.handleMouseDown);\n this.off('touchstart', this.handleMouseDown);\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n }\n\n private handleMouseDown(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n event.stopPropagation();\n if (event.type === 'mousedown')\n event.preventDefault();\n\n /**\n * Comment below copied over from videojs - Sha\n * \n * Do not call preventDefault() on touchstart in Chrome\n * to avoid console warnings. Use a 'touch-action: none' style\n * instead to prevent unintented scrolling.\n * https://developers.google.com/web/updates/2017/01/scrolling-intervention\n */\n if (event.type === 'touchstart' && !videojs.browser.IS_CHROME)\n event.preventDefault();\n\n this.player_.scrubbing(true);\n this.videoWasPlaying_ = !this.player_.paused();\n this.player_.pause();\n\n videojs.dom.blockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.on(doc, 'mousemove', this.handleMouseMove);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchmove', this.handleMouseMove);\n this.on(doc, 'touchend', this.handleMouseUp);\n\n this.handleMouseMove(event);\n\n this.player_.addClass('cv-hide-mouse-time');\n }\n\n private handleMouseMove(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n const distance = videojs.dom.getPointerPosition((this.seekBar_ as any).el_, event).x;\n\n let newTime = distance * this.player_.duration();\n\n // Don't let video end while scrubbing.\n if (newTime === this.player_.duration())\n newTime = newTime - 0.1;\n\n this.player_.currentTime(newTime);\n (this.playProgressBar_ as any).update();\n }\n\n private handleMouseUp(event: videojs.EventTarget.Event): void {\n videojs.dom.unblockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n\n event?.stopPropagation();\n this.player_.scrubbing(false);\n this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n if (this.videoWasPlaying_) {\n this.player_.play();\n }\n\n (this.seekBar_ as any).update();\n this.player_.removeClass('cv-hide-mouse-time');\n }\n}\n\nvideojs.registerComponent('CreateClipProgressIndicator', CreateClipProgressIndicator);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n ClipTimepointSelector,\n ClipTimepointSelectorOptions\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector';\nimport { CreateClipProgressIndicator } from 'projects/player/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator';\n\nimport './create-clip-seek-bar.scss';\n\nconst SeekBar = videojs.getComponent('SeekBar') as unknown as typeof videojs.SeekBar;\n\ninterface CreateClipSeekBarOptions extends ClipTimepointSelectorOptions {}\n\nexport class CreateClipSeekBar extends SeekBar {\n constructor(player: VideoJsPlayer, options: any) {\n super(player, options);\n\n this.addClass('cv-create-clip-seek-bar');\n }\n\n public initialize(options: CreateClipSeekBarOptions): void {\n const timepointSelector = new ClipTimepointSelector(this.player(), options);\n\n this.addChild(timepointSelector);\n\n const playProgressBar = this.getChild('playProgressBar');\n const indicator = new CreateClipProgressIndicator(this.player_, {\n seekBar: this,\n playProgressBar\n });\n playProgressBar.addChild(indicator);\n }\n}\n\nCreateClipSeekBar.prototype.options_ = {\n children: ['playProgressBar'],\n barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices\nif (!videojs.browser.IS_IOS && !videojs.browser.IS_ANDROID) {\n CreateClipSeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\nvideojs.registerComponent('CreateClipSeekBar', CreateClipSeekBar);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n CreateClipSeekBar\n} from 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nimport 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nconst DEFAULT_MIN_CLIP_DURATION = 5; // seconds;\n\ninterface CreateClipPluginOptions {\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nclass CreateClipPlugin extends Plugin {\n private options: CreateClipPluginOptions;\n\n constructor(player: VideoJsPlayer, options: CreateClipPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n this.initCreateClipSeekBar = this.initCreateClipSeekBar.bind(this);\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initCreateClipSeekBar));\n }\n\n private initCreateClipSeekBar(): void {\n const seekBar = this.player.controlBar.getChild('ProgressControl')?.getChild('SeekBar') as CreateClipSeekBar;\n\n if (!seekBar)\n return;\n\n const startTime = (!isNaN(this.options.startTime) && this.options.startTime >= 0) ?\n this.options.startTime :\n 0;\n\n const endTime = (!isNaN(this.options.endTime) && this.options.endTime <= this.player.duration()) ?\n this.options.endTime :\n this.player.duration();\n\n const minDuration = Math.min(this.options.minDuration || DEFAULT_MIN_CLIP_DURATION, this.player.duration());\n\n seekBar.initialize({\n startTime,\n endTime,\n minDuration,\n onChangeStartTime: this.options.onChangeStartTime,\n onChangeEndTime: this.options.onChangeEndTime\n });\n }\n\n public dispose(): void {\n this.player.off('loadedmetadata', this.initCreateClipSeekBar);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('createClipPlugin', CreateClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n createClipPlugin(options: CreateClipPluginOptions): void;\n }\n}\n","/* eslint simple-import-sort/imports: 0 */\n\nimport { VideoJsPlayerOptions } from 'video.js';\nimport { BasePlayer, BasePlayerOptions } from './base-player';\n\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\n\nimport 'projects/player/plugins/create-clip-plugin/create-clip-plugin';\n\nexport interface CreateClipPlayerOptions extends Omit<BasePlayerOptions, 'playbackRates'> {\n onChangeEndTime: (endTime: number) => void;\n onChangeStartTime: (startTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nexport class CreateClipPlayer extends BasePlayer {\n declare protected options: CreateClipPlayerOptions;\n\n constructor(id: string | Element, options: CreateClipPlayerOptions) {\n super(id, {\n allowFullscreen: true,\n ...options,\n playbackRates: null,\n enableLocalCache: false\n });\n }\n\n protected getPlayerClassName(): string {\n return 'cv-create-clip-player';\n }\n\n protected configurePlugins(): void {\n const { startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime } = this.options;\n this.player.createClipPlugin({ startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime });\n }\n\n protected getPlayerOptions(): VideoJsPlayerOptions {\n const options = super.getPlayerOptions();\n options.inactivityTimeout = 0;\n return options;\n }\n\n protected getSeekBarName(): string {\n return 'CreateClipSeekBar';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'create-clip-player';\n }\n}\n","import React from 'react';\n\nimport { CreateClipPlayer, CreateClipPlayerOptions } from 'projects/player/players/create-clip-player';\nimport { getProxy } from 'projects/player/utils/getProxy';\n\nexport interface ClickViewCreateClipPlayerProps extends CreateClipPlayerOptions {\n onReady?: (player: CreateClipPlayer) => void;\n onDispose?: () => void;\n}\n\nexport function ClickViewCreateClipPlayer(props: ClickViewCreateClipPlayerProps): React.ReactElement {\n const { onReady, onDispose } = props;\n\n const ref = React.useRef(null);\n const playerRef = React.useRef<CreateClipPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current?.dispose();\n\n if (!ref)\n return;\n\n playerRef.current = new CreateClipPlayer(ref.current, props);\n\n if (onReady) {\n playerRef.current.ready(() => {\n onReady(getProxy(playerRef.current));\n });\n }\n\n if (onDispose) {\n playerRef.current.one('dispose', onDispose);\n }\n \n return () => {\n playerRef.current?.dispose();\n };\n }, [props.viewKey]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:start:time', time: props.startTime });\n }, [props.startTime]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:end:time', time: props.endTime });\n }, [props.endTime]);\n\n return (\n <div ref={ref}></div>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ClipTimeForm } from 'libs/shared/apps/clips/components/clip-time-form/ClipTimeForm';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, PlayerViewKey, Video } from 'libs/shared/interfaces';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\n\nimport { CreateClipPlayer } from 'projects/player/players/create-clip-player';\nimport { ClickViewCreateClipPlayer } from 'projects/player/react/CreateClipPlayer';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst NAV_LOCK_ID = 'edit-clip-timepoints';\nconst namespace = 'shared.editClipTimepoints';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEFAULT_DURATION = 30;\nconst MIN_DURATION = 5;\n\nfunction handleError(error: string): void {\n DialogHelper.render(\n (\n <p>{error}</p>\n ), {\n title: getPhrase('errorHeading'),\n cancelButtonProps: {\n variant: 'link',\n text: getPhrase('close')\n }\n }\n );\n}\n\nfunction safeStringToNumber(value: string): number {\n if (!value) return 0;\n\n const number = Number(value);\n return isNaN(number) ? 0 : number;\n}\n\ninterface EditClipTimepointsViewProps {\n id?: string;\n videoId?: string;\n startTime?: string;\n isCopying?: boolean;\n}\n\nexport function EditClipTimepointsView(props: EditClipTimepointsViewProps): JSX.Element {\n const playerRef = React.useRef<CreateClipPlayer>(null);\n \n const initialStartTime = safeStringToNumber(props.startTime);\n\n const [ startTime, setStartTime ] = React.useState<number>(initialStartTime);\n const [ endTime, setEndTime ] = React.useState<number>(initialStartTime + DEFAULT_DURATION);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(!!props.id && ClipRequests.clip(props.id));\n const videoId = clip.data?._parentVideo?.id || props.videoId;\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(!!videoId &&\n PlayerRequests.createViewKey(videoId, MediaIdType.MasterObject));\n const video = Flight.useBasicFetch<Video>(!!videoId && VideoRequests.video(videoId));\n\n const [ duration, setDuration ] = React.useState<number>(0);\n\n const navLock = useNavLock();\n\n useSetPageMetadata({ title: props.id ? clip.data?.name : getPhrase('pageTitle') });\n\n React.useEffect(() => {\n navLock.lock({\n id: NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody')\n });\n }, []);\n\n React.useEffect(() => {\n if (!clip.data)\n return;\n\n setStartTime(clip.data.startTime);\n setEndTime(clip.data.endTime);\n }, [clip.data]);\n\n function onReady(player: CreateClipPlayer): void {\n playerRef.current = player;\n\n player.on('durationchange', () => setDuration(player.duration()));\n }\n\n function onSubmit(): void {\n let error = '';\n\n if (startTime > endTime)\n error = getPhrase('startTimeGreaterThanEndTime');\n\n if (endTime - startTime < MIN_DURATION)\n error = getPhrase('tooShort', { minDuration: MIN_DURATION });\n\n if (error) {\n handleError(error);\n return;\n }\n\n navLock.unlock(NAV_LOCK_ID);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: props.id ? Actions.Clips.EDIT_CLIP_DETAILS_POPUP : Actions.Clips.CREATE_CLIP_DETAILS,\n args: props.id ? [props.id] : [props.videoId],\n params: { startTime, endTime, isCopying: props.isCopying }\n });\n }\n\n function onCancel(): void {\n const startTime = playerRef.current?.currentTime() ?? 0;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [\n null,\n video.data?.id,\n TextHelper.slugify(video.data?.name)\n ],\n params: { t: startTime }\n });\n }\n\n if (!props.id && !props.videoId)\n return <></>;\n\n return (\n <div className='px-3'>\n {!!config.data && !!viewKey.data && !!video.data && (!props.id || !!clip.data) &&\n <div className='pb-3'>\n <div className='mb-3'>\n <ClickViewCreateClipPlayer\n onReady={onReady}\n playerApi={new URL(config.data.playerApiUrl)}\n viewKey={viewKey.data.viewKey}\n startTime={startTime}\n endTime={endTime}\n onChangeStartTime={setStartTime}\n onChangeEndTime={setEndTime}\n minDuration={MIN_DURATION}\n autoplay\n />\n </div>\n <ClipTimeForm\n startTime={startTime}\n endTime={endTime}\n setStartTime={setStartTime}\n setEndTime={setEndTime}\n onSubmit={onSubmit}\n onCancel={onCancel}\n duration={duration}\n />\n </div>\n }\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CjwT65ug.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/time-input/time-input.module.scss","../../../../libs/shared/src/components/time-input/TimeInput.tsx","../../../../libs/shared/src/apps/clips/components/clip-time-form/ClipTimeForm.tsx","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle.ts","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar.ts","../../../player/src/plugins/create-clip-plugin/create-clip-plugin.ts","../../../player/src/players/create-clip-player.ts","../../../player/src/react/CreateClipPlayer.tsx","../../src/shared/views/edit-clip-timepoints/EditClipTimepointsView.tsx"],"sourcesContent":[":local {\n .arrowContainer {\n padding: 0.16666rem;\n cursor: pointer;\n\n &:hover {\n background-color: $gray-400;\n }\n }\n\n %arrow {\n width: 0.66666rem; \n height: 0.33333rem; \n border-left: 0.33333rem solid transparent;\n border-right: 0.33333rem solid transparent;\n }\n\n .upArrow {\n @extend %arrow;\n border-bottom: 0.33333rem solid $gray-900;\n }\n\n .downArrow {\n @extend %arrow;\n border-top: 0.33333rem solid $gray-900;\n }\n\n .inputContainer {\n border: 1px solid $gray-300;\n transition: box-shadow 0.1s ease-in-out;\n\n &.focus {\n border: 1px solid $blue;\n outline: 0 !important;\n box-shadow: $input-focus-box-shadow;\n }\n\n input {\n width: 1.5rem;\n }\n }\n}","import * as React from 'react';\n\nimport { TimeHelper } from 'libs/common/react/utils/TimeHelper';\n\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport styles from './time-input.module.scss';\n\nconst UP_ARROW_KEYCODE = 38;\nconst DOWN_ARROW_KEYCODE = 40;\n\nconst HOUR = 3600; // hour in seconds;\n\ninterface TimeInputProps {\n /**\n * A time in seconds\n */\n value: number;\n\n /**\n * Callback to set time where time is in seconds.\n *\n * Will be called on blur.\n */\n setTime: (time: number) => void;\n\n /**\n * Allows a time to be typed in by the user.\n *\n * Note: this doesn't include UP/DOWN keyboard arrows which are always enabled.\n */\n allowKeyboardInput?: boolean;\n\n formSize?: 'md' | 'lg';\n\n hasError?: boolean;\n\n /**\n * Time in seconds to logically cap the maximum input value\n */\n maxValue?: number;\n\n disabled?: boolean;\n\n /**\n * If set to true, will hide the up and down arrow buttons\n */\n hideButtons?: boolean;\n\n duration?: number;\n}\n\nTimeInput.defaultProps = {\n allowKeyboardInput: true,\n size: 'lg'\n};\n\nexport function TimeInput(props: TimeInputProps): JSX.Element {\n const [ hours, setHours ] = React.useState('00');\n const [ minutes, setMinutes ] = React.useState('00');\n const [ seconds, setSeconds ] = React.useState('00');\n const [ focus, setFocus ] = React.useState(false);\n\n const minutesRef = React.useRef(null);\n const secondsRef = React.useRef(null);\n\n const showHours = props.duration && props.duration >= HOUR;\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n e.target.select();\n setFocus(true);\n }\n\n function handleChange(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void,\n nextInputRef?: React.MutableRefObject<HTMLInputElement>\n ) {\n const inputValue = event.target.value;\n const formattedValue = inputValue.replace(/\\D/g, '').slice(0, 2);\n setValue(formattedValue);\n \n if (formattedValue.length === 2 && nextInputRef?.current)\n requestAnimationFrame(() => nextInputRef.current.focus());\n }\n\n function increment(): void {\n props.setTime(props.value + 1);\n }\n\n function decrement(): void {\n props.setTime(props.value - 1);\n }\n\n function handleBlur(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void\n ): void {\n if (!props.allowKeyboardInput)\n return;\n\n updateTime(TimeHelper.convertDurationToSeconds(hours, minutes, seconds));\n setValue(event.target.value.padStart(2, '0'));\n setFocus(false);\n }\n\n function updateTime(value: number) {\n if (value < 0)\n return;\n \n if (props.maxValue && value > props.maxValue)\n return;\n \n props.setTime(value);\n }\n\n function setTimeInputs() {\n const displayDuration = DurationHelper.ToDisplayDuration(props.value * 1000, true).split(':');\n\n setHours(String(displayDuration[0]).padStart(2, '0'));\n setMinutes(displayDuration[1]);\n setSeconds(displayDuration[2]);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.keyCode === UP_ARROW_KEYCODE)\n increment();\n\n if (e.keyCode === DOWN_ARROW_KEYCODE)\n decrement();\n }\n\n React.useEffect(() => {\n setTimeInputs();\n }, [props.value]);\n\n return (\n <div className={`${styles.inputContainer} ${focus ? styles.focus : ''} position-relative bg-white d-flex align-items-center p-2 rounded-pill font-size-md`}>\n <div className={`${showHours ? '' : 'd-none'}`}>\n <input\n type='text'\n className='border-0 outline-none'\n value={hours}\n maxLength={2}\n placeholder='HH'\n onChange={e => handleChange(e, setHours, minutesRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setHours)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <div>\n <input\n ref={minutesRef}\n type='text'\n className='border-0 outline-none'\n value={minutes}\n maxLength={2}\n placeholder='MM'\n onChange={e => handleChange(e, setMinutes, secondsRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setMinutes)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <input\n ref={secondsRef}\n type='text'\n className='border-0 outline-none'\n value={seconds}\n maxLength={2}\n placeholder='SS'\n onChange={e => setSeconds(e.target.value)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setSeconds)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n {!props.hideButtons &&\n <div>\n <div className={styles.arrowContainer} onClick={increment}>\n <div className={styles.upArrow} />\n </div>\n <div className={styles.arrowContainer} onClick={decrement}>\n <div className={styles.downArrow} />\n </div>\n </div>\n }\n </div>\n );\n}\n\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimeInput } from 'libs/shared/components/time-input/TimeInput';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nconst namespace = 'shared.clipTimeForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * All times are in seconds.\n */\ninterface ClipTimeFormProps {\n startTime: number;\n endTime: number;\n setStartTime: (time: number) => void;\n setEndTime: (time: number) => void;\n onSubmit: () => void;\n onCancel: () => void;\n duration: number;\n}\n\nexport function ClipTimeForm(props: ClipTimeFormProps): JSX.Element {\n if (isNaN(props.startTime) || isNaN(props.endTime))\n return <></>;\n\n /**\n * DurationHelper.ToDisplayDuration in TimeInput will truncate as decimals\n * so we floor the times when displaying the duration.\n */\n const duration = Math.floor(props.endTime) - Math.floor(props.startTime);\n\n return (\n <div className='px-3'>\n <form className='d-flex align-items-center justify-content-center pb-4'>\n <div>\n <TimeInput\n value={props.startTime}\n setTime={props.setStartTime}\n duration={props.duration}\n />\n </div>\n <span className='px-2'>-</span>\n <div className='me-2'>\n <TimeInput\n value={props.endTime}\n setTime={props.setEndTime}\n duration={props.duration}\n />\n </div>\n <span>\n <strong><Text namespace={namespace} phrase='duration' /></strong>\n \n {DurationHelper.ToDisplayDuration((duration) * 1000)}\n </span>\n </form>\n <div className='d-flex justify-content-end'>\n <button className='btn btn-link' onClick={props.onCancel}>\n {getPhrase('cancel')}\n </button>\n <button className='btn btn-dark' onClick={props.onSubmit}>\n {getPhrase('next')}\n </button>\n </div>\n </div>\n );\n}\n","import videojs from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\n// tslint:disable-next-line\nconst handleSvg = '<svg viewBox=\"0 0 5 14\" pointer-events=\"none\"><g id=\"Clips\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Clip-2\" transform=\"translate(-835.000000, -632.000000)\" fill=\"#FFFFFF\"><g id=\"Video-Copy\" transform=\"translate(275.000000, 96.000000)\"><g id=\"Handles\" transform=\"translate(560.000000, 536.000000)\"><circle id=\"Oval\" cx=\"1\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-2\" cx=\"1\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-4\" cx=\"1\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-8\" cx=\"1\" cy=\"13\" r=\"1\"></circle><circle id=\"Oval-Copy\" cx=\"4\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-3\" cx=\"4\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-5\" cx=\"4\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-9\" cx=\"4\" cy=\"13\" r=\"1\"></circle></g></g></g></g></svg>';\n\nexport class ClipTimepointSelectorHandle extends Component {\n public buildCSSClass(): string {\n return `cv-clip-timepoint-handle ${super.buildCSSClass()}`;\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML: handleSvg\n }, attributes);\n }\n\n public isEventTarget(e: videojs.EventTarget.Event): boolean {\n return this.el().contains(e.target as Node);\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport {\n ClipTimepointSelectorHandle\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle';\n\nimport './clip-timepoint-selector.scss';\n\nexport interface ClipTimepointSelectorOptions extends videojs.ComponentOptions {\n startTime: number;\n endTime: number;\n minDuration: number;\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n}\n\nexport class ClipTimepointSelector extends Component {\n // tslint:disable-next-line\n public options_: ClipTimepointSelectorOptions;\n\n // tslint:disable-next-line\n public el_: HTMLElement;\n\n private minDuration: number;\n\n /**\n * These variables shouldn't be set directly.\n * setStartTime and setEndTime should be used.\n */\n private startTime: number;\n private endTime: number;\n\n private startHandle: ClipTimepointSelectorHandle;\n private endHandle: ClipTimepointSelectorHandle;\n\n private dragStartActive: boolean = false;\n private dragEndActive: boolean = false;\n private dragSliderActive: boolean = false;\n\n private dragSliderCurrentPosition: number = null;\n\n constructor(player: VideoJsPlayer, options: ClipTimepointSelectorOptions) {\n super(player, options);\n\n this.minDuration = Math.min(player.duration(), this.options_.minDuration);\n\n this.setStartTime(options.startTime, false);\n this.setEndTime(options.endTime, false);\n\n this.startHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.startHandle.addClass('cv-clip-start-handle');\n this.addChild(this.startHandle);\n\n this.endHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.endHandle.addClass('cv-clip-end-handle');\n this.addChild(this.endHandle);\n\n this.on(this.player(), 'update:clip:start:time', ({ time }) => this.setStartTime(time));\n this.on(this.player(), 'update:clip:end:time', ({ time }) => this.setEndTime(time));\n\n this.bindListeners();\n this.update();\n }\n\n public createEl(): Element {\n return super.createEl('div', {\n className: 'cv-clip-timepoint-selector'\n }, {});\n }\n\n private update(): void {\n this.options_.onChangeStartTime(this.startTime);\n this.options_.onChangeEndTime(this.endTime);\n\n this.requestAnimationFrame(() => {\n this.setStartOffset();\n this.setWidth();\n });\n }\n\n private setStartTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const maxStartTime = this.player().duration() - this.minDuration;\n\n if (time > maxStartTime)\n time = maxStartTime;\n\n if (time < 0)\n time = 0;\n\n this.startTime = time;\n\n if (this.endTime && (this.endTime - this.startTime < this.minDuration)) {\n const newEndTime = typeof currentDuration === 'number' ?\n this.startTime + currentDuration :\n this.startTime + this.minDuration;\n\n this.setEndTime(newEndTime);\n }\n\n /**\n * Seek player to the clip start time.\n */\n this.player().currentTime(this.startTime);\n\n if (shouldUpdate)\n this.update();\n }\n\n private setEndTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const minEndTime = this.minDuration;\n\n if (time < minEndTime)\n time = minEndTime;\n\n if (time > this.player().duration())\n time = this.player().duration();\n\n this.endTime = time;\n\n if (this.startTime && (this.endTime - this.startTime < this.minDuration)) {\n const newStartTime = typeof currentDuration === 'number' ?\n this.endTime - currentDuration :\n this.endTime - this.minDuration;\n\n this.setStartTime(newStartTime);\n }\n\n if (shouldUpdate)\n this.update();\n }\n\n private bindListeners(): void {\n this.onTimeupdate = this.onTimeupdate.bind(this);\n this.player().on('timeupdate', this.onTimeupdate);\n\n this.on('mousedown', this.dragStart);\n this.on('touchstart', this.dragStart);\n\n this.player().on('dispose', () => {\n this.player().off('timeupdate', this.onTimeupdate);\n this.off('mousedown', this.dragStart);\n this.off('touchstart', this.dragStart);\n });\n }\n\n private hasStartTime(): boolean {\n return typeof this.startTime === 'number';\n }\n\n private hasEndTime(): boolean {\n return typeof this.endTime === 'number';\n }\n\n private onTimeupdate(): void {\n /**\n * Pause the player if it plays past the end point\n */\n const currentTime = this.player().currentTime();\n if (currentTime > this.endTime && currentTime < (this.endTime + 0.5))\n this.player().pause();\n }\n\n private dragStart(e: videojs.EventTarget.Event): void {\n if (this.startHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragStartActive = true;\n }\n\n if (this.endHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragEndActive = true;\n }\n\n if (e.target === this.el()) {\n e.stopImmediatePropagation();\n this.dragSliderActive = true;\n this.dragSliderCurrentPosition = this.getPosition(e);\n }\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.on(doc, 'mousemove', this.drag);\n this.on(doc, 'mouseup', this.dragEnd);\n this.on(doc, 'touchmove', this.drag);\n this.on(doc, 'touchend', this.dragEnd);\n\n this.drag(e);\n }\n\n private dragEnd(): void {\n this.dragStartActive = false;\n this.dragEndActive = false;\n this.dragSliderActive = false;\n this.dragSliderCurrentPosition = null;\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.off(doc, 'mousemove', this.drag);\n this.off(doc, 'mouseup', this.dragEnd);\n this.off(doc, 'touchmove', this.drag);\n this.off(doc, 'touchend', this.dragEnd);\n }\n\n private drag(e: videojs.EventTarget.Event): void {\n if (!this.dragStartActive && !this.dragEndActive && !this.dragSliderActive || !videojs.dom.isSingleLeftClick(e))\n return;\n \n const position = this.getPosition(e);\n\n const timepoint = position * this.player().duration();\n\n if (this.dragStartActive)\n this.handleStartHandleDrag(timepoint);\n\n if (this.dragEndActive)\n this.handleEndHandleDrag(timepoint);\n\n if (this.dragSliderActive)\n this.handleSliderDrag(position);\n }\n\n private handleStartHandleDrag(timepoint: number): void {\n this.setStartTime(timepoint);\n }\n\n private handleEndHandleDrag(timepoint: number): void {\n this.setEndTime(timepoint);\n }\n\n private handleSliderDrag(position: number): void {\n const timeDifference = (position - this.dragSliderCurrentPosition) * this.player().duration();\n const newStartTime = this.startTime + timeDifference;\n const newEndTime = this.endTime + timeDifference;\n\n /**\n * Don't move if the clip is already at the beginning and/or end\n * of the video.\n */\n if (newStartTime <= 0 || newEndTime >= this.player().duration())\n return;\n\n this.dragSliderCurrentPosition = position;\n this.setStartTime(newStartTime);\n this.setEndTime(newEndTime);\n }\n\n private getPosition(e: videojs.EventTarget.Event): number {\n return videojs.dom.getPointerPosition(this.el_.parentNode as HTMLElement, e).x;\n }\n\n private setStartOffset(): void {\n this.el_.style.marginLeft = `${this.getPercentage(this.startTime)}%`;\n }\n\n private setWidth(): void {\n this.el_.style.width = `${this.getPercentage(this.endTime - this.startTime)}%`;\n }\n\n private getPercentage(time: number): number {\n return +((time / this.player().duration() * 100).toFixed(4));\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport './create-clip-progress-indicator.scss';\n\ninterface CreateClipProgressIndicatorOptions extends videojs.ComponentOptions {\n seekBar: videojs.Component;\n playProgressBar: videojs.Component;\n}\n\nexport class CreateClipProgressIndicator extends Component {\n private el_: HTMLDivElement;\n private seekBar_: videojs.Component;\n private playProgressBar_: videojs.Component;\n private videoWasPlaying_: boolean;\n\n constructor(player: VideoJsPlayer, options: CreateClipProgressIndicatorOptions) {\n super(player, options);\n\n this.seekBar_ = options.seekBar;\n this.playProgressBar_ = options.playProgressBar;\n\n this.bindListeners();\n this.player_.one('dispose', () => {\n this.unbindListeners();\n });\n }\n\n public createEl(tagName?: string, properties?: any, attribtues?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: 'cv-create-clip-progress-indicator'\n }, attribtues);\n }\n\n private bindListeners(): void {\n this.on('mousedown', this.handleMouseDown);\n this.on('touchstart', this.handleMouseDown);\n }\n\n private unbindListeners(): void {\n const doc = (this.el_ as any).ownerDocument;\n\n this.off('mousedown', this.handleMouseDown);\n this.off('touchstart', this.handleMouseDown);\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n }\n\n private handleMouseDown(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n event.stopPropagation();\n if (event.type === 'mousedown')\n event.preventDefault();\n\n /**\n * Comment below copied over from videojs - Sha\n * \n * Do not call preventDefault() on touchstart in Chrome\n * to avoid console warnings. Use a 'touch-action: none' style\n * instead to prevent unintented scrolling.\n * https://developers.google.com/web/updates/2017/01/scrolling-intervention\n */\n if (event.type === 'touchstart' && !videojs.browser.IS_CHROME)\n event.preventDefault();\n\n this.player_.scrubbing(true);\n this.videoWasPlaying_ = !this.player_.paused();\n this.player_.pause();\n\n videojs.dom.blockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.on(doc, 'mousemove', this.handleMouseMove);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchmove', this.handleMouseMove);\n this.on(doc, 'touchend', this.handleMouseUp);\n\n this.handleMouseMove(event);\n\n this.player_.addClass('cv-hide-mouse-time');\n }\n\n private handleMouseMove(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n const distance = videojs.dom.getPointerPosition((this.seekBar_ as any).el_, event).x;\n\n let newTime = distance * this.player_.duration();\n\n // Don't let video end while scrubbing.\n if (newTime === this.player_.duration())\n newTime = newTime - 0.1;\n\n this.player_.currentTime(newTime);\n (this.playProgressBar_ as any).update();\n }\n\n private handleMouseUp(event: videojs.EventTarget.Event): void {\n videojs.dom.unblockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n\n event?.stopPropagation();\n this.player_.scrubbing(false);\n this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n if (this.videoWasPlaying_) {\n this.player_.play();\n }\n\n (this.seekBar_ as any).update();\n this.player_.removeClass('cv-hide-mouse-time');\n }\n}\n\nvideojs.registerComponent('CreateClipProgressIndicator', CreateClipProgressIndicator);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n ClipTimepointSelector,\n ClipTimepointSelectorOptions\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector';\nimport { CreateClipProgressIndicator } from 'projects/player/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator';\n\nimport './create-clip-seek-bar.scss';\n\nconst SeekBar = videojs.getComponent('SeekBar') as unknown as typeof videojs.SeekBar;\n\ninterface CreateClipSeekBarOptions extends ClipTimepointSelectorOptions {}\n\nexport class CreateClipSeekBar extends SeekBar {\n constructor(player: VideoJsPlayer, options: any) {\n super(player, options);\n\n this.addClass('cv-create-clip-seek-bar');\n }\n\n public initialize(options: CreateClipSeekBarOptions): void {\n const timepointSelector = new ClipTimepointSelector(this.player(), options);\n\n this.addChild(timepointSelector);\n\n const playProgressBar = this.getChild('playProgressBar');\n const indicator = new CreateClipProgressIndicator(this.player_, {\n seekBar: this,\n playProgressBar\n });\n playProgressBar.addChild(indicator);\n }\n}\n\nCreateClipSeekBar.prototype.options_ = {\n children: ['playProgressBar'],\n barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices\nif (!videojs.browser.IS_IOS && !videojs.browser.IS_ANDROID) {\n CreateClipSeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\nvideojs.registerComponent('CreateClipSeekBar', CreateClipSeekBar);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n CreateClipSeekBar\n} from 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nimport 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nconst DEFAULT_MIN_CLIP_DURATION = 5; // seconds;\n\ninterface CreateClipPluginOptions {\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nclass CreateClipPlugin extends Plugin {\n private options: CreateClipPluginOptions;\n\n constructor(player: VideoJsPlayer, options: CreateClipPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n this.initCreateClipSeekBar = this.initCreateClipSeekBar.bind(this);\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initCreateClipSeekBar));\n }\n\n private initCreateClipSeekBar(): void {\n const seekBar = this.player.controlBar.getChild('ProgressControl')?.getChild('SeekBar') as CreateClipSeekBar;\n\n if (!seekBar)\n return;\n\n const startTime = (!isNaN(this.options.startTime) && this.options.startTime >= 0) ?\n this.options.startTime :\n 0;\n\n const endTime = (!isNaN(this.options.endTime) && this.options.endTime <= this.player.duration()) ?\n this.options.endTime :\n this.player.duration();\n\n const minDuration = Math.min(this.options.minDuration || DEFAULT_MIN_CLIP_DURATION, this.player.duration());\n\n seekBar.initialize({\n startTime,\n endTime,\n minDuration,\n onChangeStartTime: this.options.onChangeStartTime,\n onChangeEndTime: this.options.onChangeEndTime\n });\n }\n\n public dispose(): void {\n this.player.off('loadedmetadata', this.initCreateClipSeekBar);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('createClipPlugin', CreateClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n createClipPlugin(options: CreateClipPluginOptions): void;\n }\n}\n","/* eslint simple-import-sort/imports: 0 */\n\nimport { VideoJsPlayerOptions } from 'video.js';\nimport { BasePlayer, BasePlayerOptions } from './base-player';\n\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\n\nimport 'projects/player/plugins/create-clip-plugin/create-clip-plugin';\n\nexport interface CreateClipPlayerOptions extends Omit<BasePlayerOptions, 'playbackRates'> {\n onChangeEndTime: (endTime: number) => void;\n onChangeStartTime: (startTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nexport class CreateClipPlayer extends BasePlayer {\n declare protected options: CreateClipPlayerOptions;\n\n constructor(id: string | Element, options: CreateClipPlayerOptions) {\n super(id, {\n allowFullscreen: true,\n ...options,\n playbackRates: null,\n enableLocalCache: false\n });\n }\n\n protected getPlayerClassName(): string {\n return 'cv-create-clip-player';\n }\n\n protected configurePlugins(): void {\n const { startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime } = this.options;\n this.player.createClipPlugin({ startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime });\n }\n\n protected getPlayerOptions(): VideoJsPlayerOptions {\n const options = super.getPlayerOptions();\n options.inactivityTimeout = 0;\n return options;\n }\n\n protected getSeekBarName(): string {\n return 'CreateClipSeekBar';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'create-clip-player';\n }\n}\n","import React from 'react';\n\nimport { CreateClipPlayer, CreateClipPlayerOptions } from 'projects/player/players/create-clip-player';\nimport { getProxy } from 'projects/player/utils/getProxy';\n\nexport interface ClickViewCreateClipPlayerProps extends CreateClipPlayerOptions {\n onReady?: (player: CreateClipPlayer) => void;\n onDispose?: () => void;\n}\n\nexport function ClickViewCreateClipPlayer(props: ClickViewCreateClipPlayerProps): React.ReactElement {\n const { onReady, onDispose } = props;\n\n const ref = React.useRef(null);\n const playerRef = React.useRef<CreateClipPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current?.dispose();\n\n if (!ref)\n return;\n\n playerRef.current = new CreateClipPlayer(ref.current, props);\n\n if (onReady) {\n playerRef.current.ready(() => {\n onReady(getProxy(playerRef.current));\n });\n }\n\n if (onDispose) {\n playerRef.current.one('dispose', onDispose);\n }\n \n return () => {\n playerRef.current?.dispose();\n };\n }, [props.viewKey]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:start:time', time: props.startTime });\n }, [props.startTime]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:end:time', time: props.endTime });\n }, [props.endTime]);\n\n return (\n <div ref={ref}></div>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ClipTimeForm } from 'libs/shared/apps/clips/components/clip-time-form/ClipTimeForm';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, PlayerViewKey, Video } from 'libs/shared/interfaces';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\n\nimport { CreateClipPlayer } from 'projects/player/players/create-clip-player';\nimport { ClickViewCreateClipPlayer } from 'projects/player/react/CreateClipPlayer';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst NAV_LOCK_ID = 'edit-clip-timepoints';\nconst namespace = 'shared.editClipTimepoints';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEFAULT_DURATION = 30;\nconst MIN_DURATION = 5;\n\nfunction handleError(error: string): void {\n DialogHelper.render(\n (\n <p>{error}</p>\n ), {\n title: getPhrase('errorHeading'),\n cancelButtonProps: {\n variant: 'link',\n text: getPhrase('close')\n }\n }\n );\n}\n\nfunction safeStringToNumber(value: string): number {\n if (!value) return 0;\n\n const number = Number(value);\n return isNaN(number) ? 0 : number;\n}\n\ninterface EditClipTimepointsViewProps {\n id?: string;\n videoId?: string;\n startTime?: string;\n isCopying?: boolean;\n}\n\nexport function EditClipTimepointsView(props: EditClipTimepointsViewProps): JSX.Element {\n const playerRef = React.useRef<CreateClipPlayer>(null);\n \n const initialStartTime = safeStringToNumber(props.startTime);\n\n const [ startTime, setStartTime ] = React.useState<number>(initialStartTime);\n const [ endTime, setEndTime ] = React.useState<number>(initialStartTime + DEFAULT_DURATION);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(!!props.id && ClipRequests.clip(props.id));\n const videoId = clip.data?._parentVideo?.id || props.videoId;\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(!!videoId &&\n PlayerRequests.createViewKey(videoId, MediaIdType.MasterObject));\n const video = Flight.useBasicFetch<Video>(!!videoId && VideoRequests.video(videoId));\n\n const [ duration, setDuration ] = React.useState<number>(0);\n\n const navLock = useNavLock();\n\n useSetPageMetadata({ title: props.id ? clip.data?.name : getPhrase('pageTitle') });\n\n React.useEffect(() => {\n navLock.lock({\n id: NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody')\n });\n }, []);\n\n React.useEffect(() => {\n if (!clip.data)\n return;\n\n setStartTime(clip.data.startTime);\n setEndTime(clip.data.endTime);\n }, [clip.data]);\n\n function onReady(player: CreateClipPlayer): void {\n playerRef.current = player;\n\n player.on('durationchange', () => setDuration(player.duration()));\n }\n\n function onSubmit(): void {\n let error = '';\n\n if (startTime > endTime)\n error = getPhrase('startTimeGreaterThanEndTime');\n\n if (endTime - startTime < MIN_DURATION)\n error = getPhrase('tooShort', { minDuration: MIN_DURATION });\n\n if (error) {\n handleError(error);\n return;\n }\n\n navLock.unlock(NAV_LOCK_ID);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: props.id ? Actions.Clips.EDIT_CLIP_DETAILS_POPUP : Actions.Clips.CREATE_CLIP_DETAILS,\n args: props.id ? [props.id] : [props.videoId],\n params: { startTime, endTime, isCopying: props.isCopying }\n });\n }\n\n function onCancel(): void {\n const startTime = playerRef.current?.currentTime() ?? 0;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [\n null,\n video.data?.id,\n TextHelper.slugify(video.data?.name)\n ],\n params: { t: startTime }\n });\n }\n\n if (!props.id && !props.videoId)\n return <></>;\n\n return (\n <div className='px-3'>\n {!!config.data && !!viewKey.data && !!video.data && (!props.id || !!clip.data) &&\n <div className='pb-3'>\n <div className='mb-3'>\n <ClickViewCreateClipPlayer\n onReady={onReady}\n playerApi={new URL(config.data.playerApiUrl)}\n viewKey={viewKey.data.viewKey}\n startTime={startTime}\n endTime={endTime}\n onChangeStartTime={setStartTime}\n onChangeEndTime={setEndTime}\n minDuration={MIN_DURATION}\n autoplay\n />\n </div>\n <ClipTimeForm\n startTime={startTime}\n endTime={endTime}\n setStartTime={setStartTime}\n setEndTime={setEndTime}\n onSubmit={onSubmit}\n onCancel={onCancel}\n duration={duration}\n />\n </div>\n }\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"./D8uRDrkd.chunk.js";import{_ as n,y as r}from"./BftnFbcr.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{t as b}from"./oPIkfKWW2.chunk.js";import{n as x,t as S}from"./CmcCVXi32.chunk.js";import{t as ee}from"./CcDvlSWl2.chunk.js";import{t as C}from"./DZX1tZ-D2.chunk.js";import{t as w}from"./DdsRCMkN.chunk.js";import{t as T}from"./BWaKdG0l.chunk.js";import{t as te}from"./PgzMrOyM.chunk.js";import{t as E}from"./Vp01-r6R.chunk.js";import{n as D,t as O}from"./A8xLZrSw.chunk.js";import{t as k}from"./BQKcAczf.chunk.js";import{t as A}from"./DR9DEoQL.chunk.js";import{n as j}from"./CpFtf-tI2.chunk.js";import{t as ne}from"./D0bhWkNM.chunk.js";import{t as M}from"./De16zmhB.chunk.js";import{t as re}from"./DewCxv4i.chunk.js";import{t as ie}from"./NVkf8UeY.chunk.js";import{t as ae}from"./BXU-68zb2.chunk.js";import{t as N}from"./B97Lnms-.chunk.js";import{t as P}from"./C2pEjcxD.chunk.js";import{t as F}from"./BmR4qY-v2.chunk.js";import{t as I}from"./DDiorDZl.chunk.js";import{t as L}from"./y3q_PHh_.chunk.js";import{o as R}from"./YcLj4o6h.chunk.js";import{n as z,t as B}from"./Bp_pLLKM.chunk.js";import{t as V}from"./cX5MHowe.chunk.js";import{r as H}from"./CHQUozwb.chunk.js";import{n as U,t as W}from"./DWeyYfUG.chunk.js";import{t as G}from"./kMWvzbRv2.chunk.js";import{t as K}from"./DFrZwydG2.chunk.js";import{t as q}from"./BpiZZWnJ2.chunk.js";import{t as oe}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./D8uRDrkd.chunk.js";import{_ as n,y as r}from"./BftnFbcr.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{t as b}from"./oPIkfKWW2.chunk.js";import{n as x,t as S}from"./CmcCVXi32.chunk.js";import{t as ee}from"./CcDvlSWl2.chunk.js";import{t as C}from"./DZX1tZ-D2.chunk.js";import{t as w}from"./DdsRCMkN.chunk.js";import{t as T}from"./BWaKdG0l.chunk.js";import{t as te}from"./PgzMrOyM.chunk.js";import{t as E}from"./Vp01-r6R.chunk.js";import{n as D,t as O}from"./A8xLZrSw.chunk.js";import{t as k}from"./BQKcAczf.chunk.js";import{t as A}from"./DR9DEoQL.chunk.js";import{n as j}from"./CpFtf-tI2.chunk.js";import{t as ne}from"./D0bhWkNM.chunk.js";import{t as M}from"./De16zmhB.chunk.js";import{t as re}from"./DewCxv4i.chunk.js";import{t as ie}from"./NVkf8UeY.chunk.js";import{t as ae}from"./BXU-68zb2.chunk.js";import{t as N}from"./B97Lnms-.chunk.js";import{t as P}from"./C2pEjcxD.chunk.js";import{t as F}from"./BmR4qY-v2.chunk.js";import{t as I}from"./DDiorDZl.chunk.js";import{t as L}from"./y3q_PHh_.chunk.js";import{o as R}from"./YcLj4o6h.chunk.js";import{n as z,t as B}from"./Bp_pLLKM.chunk.js";import{t as V}from"./cX5MHowe.chunk.js";import{r as H}from"./CHQUozwb.chunk.js";import{n as U,t as W}from"./DWeyYfUG.chunk.js";import{t as G}from"./kMWvzbRv2.chunk.js";import{t as K}from"./DFrZwydG2.chunk.js";import{t as q}from"./BpiZZWnJ2.chunk.js";import{t as oe}from"./Cj_F4Lv92.chunk.js";var se=e(o()),J=s();function ce(e){let n=I.getPartnerLinkByType(e.partnerProfile?.links,`website`,I.makeUTMs({slug:e.partnerProfile._slug.value})),r=C.getHostname(n)??n;return(0,J.jsx)(`div`,{className:`mt-3`,children:(0,J.jsx)(K,{children:()=>(0,J.jsxs)(`p`,{className:`mb-0`,children:[n&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`a`,{href:n,target:`_blank`,rel:`noopener noreferrer`,className:`position-relative d-inline-block ps-4 mb-2 me-2`,children:[(0,J.jsx)(t,{svg:M,className:`svg-container position-absolute top-50 start-0 translate-middle-y`}),(0,J.jsx)(`span`,{className:`ps-1`,children:r})]}),(0,J.jsx)(`span`,{className:`mb-2 me-2`,children:`•`})]}),e.partnerProfile.description]})})})}var Y=`contentPartners.contentPartnerDashboardComingSoon`,le=a.encloseNamespace(Y);function ue(e){return(0,J.jsxs)(E,{children:[(0,J.jsx)(E.Image,{src:e.comingSoonImageUrl,altText:le(`description`,{partnerName:e.partnerName})}),(0,J.jsx)(E.Heading,{children:(0,J.jsx)(j,{namespace:Y,phrase:`heading`})}),(0,J.jsx)(E.Info,{children:(0,J.jsx)(j,{namespace:Y,phrase:`description`,options:{partnerName:e.partnerName}})})]})}var X=`contentPartners.contentPartnerDashboardContentRegion`,Z=a.encloseNamespace(X);function de(e){return(0,J.jsxs)(E,{children:[(0,J.jsx)(E.Image,{src:e.contentRegionImageUrl,altText:Z(`imageAlt`)}),(0,J.jsx)(E.Heading,{children:(0,J.jsx)(j,{namespace:X,phrase:`heading`})}),(0,J.jsx)(E.Cta,{text:Z(`cta`),appLink:e.contentRegionButtonLink,className:`btn btn-dark`})]})}var Q=`contentPartners.contentPartnerDashboardNoContent`,fe=a.encloseNamespace(Q);function $(e){return(0,J.jsxs)(E,{children:[(0,J.jsx)(E.Image,{src:e.noContentImageUrl,altText:fe(`description`)}),(0,J.jsx)(E.Heading,{children:(0,J.jsx)(j,{namespace:Q,phrase:`heading`})}),(0,J.jsx)(E.Info,{children:(0,J.jsx)(j,{namespace:Q,phrase:`description`})})]})}var pe={"coming-soon":ue,"content-region":de,"no-content":$};function me(e){let t=pe[e.type];return(0,J.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}=z(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===S.Archived&&!e.isReadonly)return`coming-soon`;if(e.dashboard.status===S.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=I.getPartnerBannerInfo(e.partnerProfile),c=o(),l=(!c||c===`content-region`)&&e.partnerProfile.description;return(0,J.jsxs)(J.Fragment,{children:[!!t.length&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(L,{type:`partner-profile`,partnerBannerType:I.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:I.getPartnerLinkByType(e.partnerProfile?.links,`website`,I.makeUTMs({slug:e.partnerProfile._slug.value})),isStudent:e.hasPermissions(i.StudentExperience),log:e.log}),(0,J.jsxs)(`div`,{className:`py-3 mb-3 border-bottom`,children:[(0,J.jsx)(P,{breadcrumbs:e.breadcrumbs}),l&&(0,J.jsx)(ce,{partnerProfile:e.partnerProfile})]}),(0,J.jsx)(`div`,{className:`mt-3`,children:!c&&t.map((n,i)=>(0,J.jsx)(G,{dashboardTarget:x.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,J.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}=N({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(b.currentUser()),i=ae(e.slug),a=U({location:W.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}});oe({app:`channels`,id:i.data?.id,metadata:{conversionSuffix:i.data?.name}});let{openInCurationStudioLabel:s,isUserCurator:u,getOpenInCurationStudioLink:d}=H(),{commonVideoProps:p}=F({locationContext:m.VideoThumbnail}),{hasPermissions:h,hasLocalPermissions:g}=k(),v=ee(null),{dashboard:y,isPreviewing:S}=ie({targetType:x.PartnerProfile,partnerProfileSlug:e.slug,queryParams:e.queryParams});O(D.getDefaultMetadata({title:i.data?.name,phraseContext:{phraseHandler:be,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},allowIndexing:!0}));let C=V({name:i.data?.name});se.useEffect(()=>{!y.hasCompleted||y.data||n.throw(new T)},[y.data,y.hasCompleted]);let E=B(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 M(e,t,n,r,i){return re.dashboardWidgetContent(e,t,n,r,{cursor:i})}function N(e){return _[e.widgetId]?.getCollectionAppLink?.(E,e.content)??null}function P(e){o?.({type:`click-video-banner-sign-up`,email:e}),r.trigger(ne.getSignUpAppLink({email:e}))}let L=i.hasCompleted&&y.hasCompleted,z=A.isBot(),G=S?!0:I.isInContentRegion(i.data,t.data?.contentRegion,t.data?.isAuthenticated);function K(){r.trigger({application:c.SEARCH,action:w.Search.HOME,params:{scopeId:i.data?.id}})}return L?(0,J.jsx)(`div`,{className:`bg-white px-4 position-relative`,children:(0,J.jsxs)(R.Provider,{value:a,children:[!!(S&&y.data)&&(0,J.jsx)(q,{status:y.data.status,type:`channel`}),(0,J.jsx)(_e,{dashboard:y.data,partnerProfile:i.data,getWidgetContentRequest:M,commonVideoProps:p,breadcrumbs:C,getBannerActions:j,hasPermissions:h,hasLocalPermissions:g,settings:v,widgetAppLinks:E,emptyImageUrl:te.EmptyStates.WATCH_HISTORY,isBot:z,lazyLoad:!z,isAuthenticated:t.data?.isAuthenticated,isInContentRegion:G,onClickSignUp:P,isPreviewing:S,onClickSearchAllVideos:K,getSeeMoreAppLink:N,log:o})]})}):(0,J.jsx)(J.Fragment,{})}export{xe as ContentPartnersDashboardView};
|
|
2
|
+
//# sourceMappingURL=CvSpUZcJ2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dd23z1_x2.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":"CvSpUZcJ2.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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"}
|