@clickview/curator 1.101.0-rc.5 → 1.101.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 +214 -214
- package/dist/Assets/js/dist/scripts/{DRFvgQ8W2.chunk.js → BKQIzKcF2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DRFvgQ8W2.chunk.js.map → BKQIzKcF2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DVVpmgqo.chunk.js → BOrAaHLK.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DVVpmgqo.chunk.js.map → BOrAaHLK.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BhSjbB8b.chunk.js → COH92JF5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BhSjbB8b.chunk.js.map → COH92JF5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DjPcCTgD.chunk.js → CR-5nCWm.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DjPcCTgD.chunk.js.map → CR-5nCWm.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DWI3MPMB.chunk.js → CqZqlJSF.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DWI3MPMB.chunk.js.map → CqZqlJSF.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{6Xv7Rh4u.chunk.js → CzCUe0Ej.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{6Xv7Rh4u.chunk.js.map → CzCUe0Ej.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/DOdn0XmW2.chunk.js +2 -0
- package/dist/Assets/js/dist/scripts/{D6kT_5BE2.chunk.js.map → DOdn0XmW2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{UFmS4XTi.chunk.js → DTUkmChD.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{UFmS4XTi.chunk.js.map → DTUkmChD.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{mnL4Dbfb.chunk.js → DW7-la-i.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{mnL4Dbfb.chunk.js.map → DW7-la-i.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DRewBr6v.chunk.js → Dhnl-PB5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DRewBr6v.chunk.js.map → Dhnl-PB5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DQKCtEam.chunk.js → DuU4GBw5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DQKCtEam.chunk.js.map → DuU4GBw5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{4RooerDO2.chunk.js → LmwQmHZz2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{4RooerDO2.chunk.js.map → LmwQmHZz2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{app-BZJms7pb.js → app-DHtN6XkT.js} +3 -3
- package/dist/Assets/js/dist/scripts/{app-BZJms7pb.js.map → app-DHtN6XkT.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B-n4bfSb.chunk.js → eKSK4iyn.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B-n4bfSb.chunk.js.map → eKSK4iyn.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CZpBv6pj.chunk.js → esASf9N4.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CZpBv6pj.chunk.js.map → esASf9N4.chunk.js.map} +1 -1
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/package.json +1 -1
- package/dist/Assets/js/dist/scripts/D6kT_5BE2.chunk.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{c as r,n as i,r as a}from"./DqUkhPat.chunk.js";import{i as o}from"./EkUBWhps2.chunk.js";import{E as s,G as c,K as l}from"./CN0FW5R_2.chunk.js";import{c as u}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{n as d}from"./DalFHGv7.chunk.js";import{t as f}from"./BAlfH8pU.chunk.js";import{t as p}from"./DxyWWBj-.chunk.js";import{a as m,l as h,o as g,s as _,u as v}from"./CHZfdgw6.chunk.js";import{R as y,z as b}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{c as r,n as i,r as a}from"./DqUkhPat.chunk.js";import{i as o}from"./EkUBWhps2.chunk.js";import{E as s,G as c,K as l}from"./CN0FW5R_2.chunk.js";import{c as u}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{n as d}from"./DalFHGv7.chunk.js";import{t as f}from"./BAlfH8pU.chunk.js";import{t as p}from"./DxyWWBj-.chunk.js";import{a as m,l as h,o as g,s as _,u as v}from"./CHZfdgw6.chunk.js";import{R as y,z as b}from"./DTUkmChD.chunk.js";import{t as x}from"./Bxa3hIWS.chunk.js";import{t as S}from"./eKSK4iyn.chunk.js";var C=t(e(),1),w={container:`_container_xmv3v_1`,close:`_close_xmv3v_4`,drag:`_drag_xmv3v_13`},T=n(),E=270,D=480,O=15;function k(e){let[t,n]=p(`pip:pos`,{right:15,bottom:15},{storage:o.SessionStorage});function r(e){let r=t.right-e.delta.x,i=t.bottom-e.delta.y;window.innerHeight-t.bottom-E+e.delta.y<O&&(i=window.innerHeight-E-O),r<-240&&(r=-240),i<-135&&(i=-135),r>window.innerWidth-D/2&&(r=window.innerWidth-D/2),i>window.innerHeight-E/2&&(i=window.innerHeight-E/2),n({right:r,bottom:i})}return(0,T.jsx)(m,{onDragEnd:r,sensors:v(h(g,{activationConstraint:{distance:10}})),children:(0,T.jsx)(A,{...e,pos:t})})}function A(e){let[t,n]=C.useState(!1),o=s(),{attributes:p,listeners:m,setNodeRef:h,transform:g}=_({id:`pip`}),v={right:`${e.pos.right}px`,bottom:`${e.pos.bottom}px`,width:`${D}px`,height:`${E}px`,transform:g?`translate3d(${g.x}px, ${g.y}px, 0)`:``},O=u(l.getAssemblyLineVideo(e.videoId)),k=u(y.createViewKey(e.videoId,b.MasterObject));function A(){return!k.hasCompleted||!O.hasCompleted}function j(){return O.data.regions?.map(e=>c.mapVideoContentRegionToLabel(e)).join(` / `)}C.useEffect(()=>{t&&A()&&n(!1)},[A()]),C.useEffect(()=>()=>{o?.resetPlayer()},[]);function M(e){n(!0),o&&o.setPlayerRef(e)}return(0,T.jsx)(`div`,{className:`${w.container} position-fixed box-shadow rounded-3 bg-white overflow-hidden`,style:v,children:k.hasError||O.hasError?(0,T.jsxs)(`div`,{className:`d-flex align-items-center justify-content-center h-100 text-center px-3`,children:[(0,T.jsx)(r,{ref:h,...m,...p,onClick:e.close,className:`${w.drag} d-flex align-items-center justify-content-center rounded-circle box-shadow`,children:(0,T.jsx)(i,{svg:x,size:a.Large})}),O.data.regions?.length?(0,T.jsxs)(`p`,{children:[`This video cannot be viewed from your account. Please log into an account for one of the following regions: `,j()]}):(0,T.jsx)(`p`,{children:`This video cannot be viewed from your account because it has not been added to any libraries yet.`}),(0,T.jsx)(r,{onClick:e.close,className:`${w.close} d-flex align-items-center justify-content-center rounded-circle box-shadow`,children:(0,T.jsx)(i,{svg:f,size:a.Large})})]}):(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:t?`d-none`:`d-flex align-items-center justify-content-center h-100`,children:(0,T.jsx)(d,{})}),!A()&&(0,T.jsxs)(`div`,{className:t?``:`d-none`,children:[(0,T.jsx)(r,{ref:h,...m,...p,onClick:e.close,className:`${w.drag} d-flex align-items-center justify-content-center rounded-circle box-shadow`,children:(0,T.jsx)(i,{svg:x,size:a.Large})}),(0,T.jsx)(S,{viewKey:k.data?.viewKey,playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:M,eventLogging:!1,autoplay:!0}),(0,T.jsx)(r,{onClick:e.close,className:`${w.close} d-flex align-items-center justify-content-center rounded-circle box-shadow`,children:(0,T.jsx)(i,{svg:f,size:a.Large})})]})]})})}export{k as PictureInPictureView};
|
|
2
|
+
//# sourceMappingURL=Dhnl-PB5.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DRewBr6v.chunk.js","names":[],"sources":["../../../../../src/apps/assembly-line/views/picture-in-picture/picture-in-picture.module.scss","../../../../../src/apps/assembly-line/views/picture-in-picture/PictureInPictureView.tsx"],"sourcesContent":[":local {\n .container {\n z-index: 100000;\n }\n\n .close {\n position: absolute;\n top: $spacer;\n right: $spacer;\n width: 2.5rem;\n height: 2.5rem;\n background-color: rgba($gray-200, 0.5);\n z-index: 1;\n }\n\n .drag {\n position: absolute;\n top: $spacer;\n left: $spacer;\n width: 2.5rem;\n height: 2.5rem;\n background-color: rgba($gray-200, 0.5);\n z-index: 2;\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { DndContext, DragEndEvent, PointerSensor, useDraggable, useSensor, useSensors } from '@dnd-kit/core';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\nimport { HamburgerSvg } from 'libs/shared/images/svg/objects/HamburgerSvg';\nimport { PlayerViewKey } from 'libs/shared/interfaces';\n\nimport { Player } from 'projects/player/players/player';\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\nimport { useCuratorPlayer } from 'shared/context/CuratorPlayerContext';\n\nimport { AssemblyLineRequests } from 'apps/assembly-line/flight-requests/AssemblyLineRequests';\nimport { AssemblyLineVideo } from 'apps/assembly-line/interfaces/AssemblyLineVideo';\nimport { AssemblyLineHelper } from 'apps/assembly-line/utils/AssemblyLineHelper';\n\nimport styles from './picture-in-picture.module.scss';\n\nconst HEIGHT = 270;\nconst WIDTH = 480;\nconst TOP_MARGIN = 15;\n\ninterface ViewWrapperProps {\n videoId: string;\n close: () => void;\n}\n\nfunction ViewWrapper(props: ViewWrapperProps): JSX.Element {\n const [ pos, setPos ] = useViewModel(\n 'pip:pos',\n { right: 15, bottom: 15 },\n { storage: StorageType.SessionStorage }\n );\n\n function onDragEnd(event: DragEndEvent): void {\n let right = pos.right - event.delta.x;\n let bottom = pos.bottom - event.delta.y;\n const top = window.innerHeight - pos.bottom - HEIGHT + event.delta.y;\n\n if (top < TOP_MARGIN)\n bottom = window.innerHeight - HEIGHT - TOP_MARGIN;\n \n if (right < -(WIDTH / 2))\n right = -(WIDTH / 2);\n\n if (bottom < -(HEIGHT / 2))\n bottom = -(HEIGHT / 2);\n\n if (right > (window.innerWidth - (WIDTH / 2)))\n right = window.innerWidth - (WIDTH / 2);\n\n if (bottom > (window.innerHeight - (HEIGHT / 2)))\n bottom = window.innerHeight - (HEIGHT / 2);\n\n setPos({ right, bottom });\n }\n\n const mouseSensor = useSensor(PointerSensor, {\n activationConstraint: {\n distance: 10\n }\n });\n\n const sensors = useSensors(mouseSensor);\n\n return (\n <DndContext onDragEnd={onDragEnd} sensors={sensors}>\n <PictureInPictureView {...props} pos={pos} />\n </DndContext>\n );\n}\n\ninterface PictureInPictureViewProps extends ViewWrapperProps {\n pos: { right: number, bottom: number };\n}\n\nfunction PictureInPictureView(props: PictureInPictureViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n const curatorPlayer = useCuratorPlayer();\n\n const { attributes, listeners, setNodeRef, transform } = useDraggable({\n id: 'pip'\n });\n\n const style = {\n right: `${props.pos.right}px`,\n bottom: `${props.pos.bottom}px`,\n width: `${WIDTH}px`,\n height: `${HEIGHT}px`,\n transform: transform ?\n `translate3d(${transform.x}px, ${transform.y}px, 0)` :\n ''\n };\n\n const video = Flight.useBasicFetch<AssemblyLineVideo>(AssemblyLineRequests.getAssemblyLineVideo(props.videoId));\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n PlayerRequests.createViewKey(props.videoId, MediaIdType.MasterObject)\n );\n\n function isLoading(): boolean {\n return !viewKey.hasCompleted || !video.hasCompleted;\n }\n\n function getRegionList(): string {\n return video.data.regions?.map(c => AssemblyLineHelper.mapVideoContentRegionToLabel(c)).join(' / ');\n }\n\n React.useEffect(() => {\n if (ready && isLoading())\n setReady(false);\n }, [isLoading()]);\n\n // Reset playerRef when component unmounts (player closes)\n React.useEffect(() => {\n return () => {\n curatorPlayer?.resetPlayer();\n };\n }, []);\n\n function onPlayerReady(player: Player): void {\n setReady(true);\n if (curatorPlayer) {\n curatorPlayer.setPlayerRef(player);\n }\n }\n\n return (\n <div\n className={`${styles.container} position-fixed box-shadow rounded-3 bg-white overflow-hidden`}\n style={style}\n >\n {(viewKey.hasError || video.hasError) ? (\n <div className='d-flex align-items-center justify-content-center h-100 text-center px-3'>\n <DivButton\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n onClick={props.close}\n className={`${styles.drag} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={HamburgerSvg} size={SvgContainerSize.Large} />\n </DivButton>\n {video.data.regions?.length ? (\n <p>\n This video cannot be viewed from your account.\n Please log into an account for one of the following regions: {getRegionList()}\n </p>\n ) : (\n <p>\n This video cannot be viewed from your account because it has not been added to any libraries yet.\n </p>\n )}\n <DivButton\n onClick={props.close}\n className={`${styles.close} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={CloseSvg} size={SvgContainerSize.Large} />\n </DivButton>\n </div>\n ) : (\n <>\n <div className={ready ? 'd-none' : 'd-flex align-items-center justify-content-center h-100'}>\n <Spinner />\n </div>\n {!isLoading() && (\n <div className={!ready ? 'd-none' : ''}>\n <DivButton\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n onClick={props.close}\n className={`${styles.drag} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={HamburgerSvg} size={SvgContainerSize.Large} />\n </DivButton>\n <ClickViewPlayer\n viewKey={viewKey.data?.viewKey}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={onPlayerReady}\n eventLogging={false}\n autoplay\n />\n <DivButton\n onClick={props.close}\n className={`${styles.close} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={CloseSvg} size={SvgContainerSize.Large} />\n </DivButton>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { ViewWrapper as PictureInPictureView };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dhnl-PB5.chunk.js","names":[],"sources":["../../../../../src/apps/assembly-line/views/picture-in-picture/picture-in-picture.module.scss","../../../../../src/apps/assembly-line/views/picture-in-picture/PictureInPictureView.tsx"],"sourcesContent":[":local {\n .container {\n z-index: 100000;\n }\n\n .close {\n position: absolute;\n top: $spacer;\n right: $spacer;\n width: 2.5rem;\n height: 2.5rem;\n background-color: rgba($gray-200, 0.5);\n z-index: 1;\n }\n\n .drag {\n position: absolute;\n top: $spacer;\n left: $spacer;\n width: 2.5rem;\n height: 2.5rem;\n background-color: rgba($gray-200, 0.5);\n z-index: 2;\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { DndContext, DragEndEvent, PointerSensor, useDraggable, useSensor, useSensors } from '@dnd-kit/core';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\nimport { HamburgerSvg } from 'libs/shared/images/svg/objects/HamburgerSvg';\nimport { PlayerViewKey } from 'libs/shared/interfaces';\n\nimport { Player } from 'projects/player/players/player';\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\nimport { useCuratorPlayer } from 'shared/context/CuratorPlayerContext';\n\nimport { AssemblyLineRequests } from 'apps/assembly-line/flight-requests/AssemblyLineRequests';\nimport { AssemblyLineVideo } from 'apps/assembly-line/interfaces/AssemblyLineVideo';\nimport { AssemblyLineHelper } from 'apps/assembly-line/utils/AssemblyLineHelper';\n\nimport styles from './picture-in-picture.module.scss';\n\nconst HEIGHT = 270;\nconst WIDTH = 480;\nconst TOP_MARGIN = 15;\n\ninterface ViewWrapperProps {\n videoId: string;\n close: () => void;\n}\n\nfunction ViewWrapper(props: ViewWrapperProps): JSX.Element {\n const [ pos, setPos ] = useViewModel(\n 'pip:pos',\n { right: 15, bottom: 15 },\n { storage: StorageType.SessionStorage }\n );\n\n function onDragEnd(event: DragEndEvent): void {\n let right = pos.right - event.delta.x;\n let bottom = pos.bottom - event.delta.y;\n const top = window.innerHeight - pos.bottom - HEIGHT + event.delta.y;\n\n if (top < TOP_MARGIN)\n bottom = window.innerHeight - HEIGHT - TOP_MARGIN;\n \n if (right < -(WIDTH / 2))\n right = -(WIDTH / 2);\n\n if (bottom < -(HEIGHT / 2))\n bottom = -(HEIGHT / 2);\n\n if (right > (window.innerWidth - (WIDTH / 2)))\n right = window.innerWidth - (WIDTH / 2);\n\n if (bottom > (window.innerHeight - (HEIGHT / 2)))\n bottom = window.innerHeight - (HEIGHT / 2);\n\n setPos({ right, bottom });\n }\n\n const mouseSensor = useSensor(PointerSensor, {\n activationConstraint: {\n distance: 10\n }\n });\n\n const sensors = useSensors(mouseSensor);\n\n return (\n <DndContext onDragEnd={onDragEnd} sensors={sensors}>\n <PictureInPictureView {...props} pos={pos} />\n </DndContext>\n );\n}\n\ninterface PictureInPictureViewProps extends ViewWrapperProps {\n pos: { right: number, bottom: number };\n}\n\nfunction PictureInPictureView(props: PictureInPictureViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n const curatorPlayer = useCuratorPlayer();\n\n const { attributes, listeners, setNodeRef, transform } = useDraggable({\n id: 'pip'\n });\n\n const style = {\n right: `${props.pos.right}px`,\n bottom: `${props.pos.bottom}px`,\n width: `${WIDTH}px`,\n height: `${HEIGHT}px`,\n transform: transform ?\n `translate3d(${transform.x}px, ${transform.y}px, 0)` :\n ''\n };\n\n const video = Flight.useBasicFetch<AssemblyLineVideo>(AssemblyLineRequests.getAssemblyLineVideo(props.videoId));\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n PlayerRequests.createViewKey(props.videoId, MediaIdType.MasterObject)\n );\n\n function isLoading(): boolean {\n return !viewKey.hasCompleted || !video.hasCompleted;\n }\n\n function getRegionList(): string {\n return video.data.regions?.map(c => AssemblyLineHelper.mapVideoContentRegionToLabel(c)).join(' / ');\n }\n\n React.useEffect(() => {\n if (ready && isLoading())\n setReady(false);\n }, [isLoading()]);\n\n // Reset playerRef when component unmounts (player closes)\n React.useEffect(() => {\n return () => {\n curatorPlayer?.resetPlayer();\n };\n }, []);\n\n function onPlayerReady(player: Player): void {\n setReady(true);\n if (curatorPlayer) {\n curatorPlayer.setPlayerRef(player);\n }\n }\n\n return (\n <div\n className={`${styles.container} position-fixed box-shadow rounded-3 bg-white overflow-hidden`}\n style={style}\n >\n {(viewKey.hasError || video.hasError) ? (\n <div className='d-flex align-items-center justify-content-center h-100 text-center px-3'>\n <DivButton\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n onClick={props.close}\n className={`${styles.drag} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={HamburgerSvg} size={SvgContainerSize.Large} />\n </DivButton>\n {video.data.regions?.length ? (\n <p>\n This video cannot be viewed from your account.\n Please log into an account for one of the following regions: {getRegionList()}\n </p>\n ) : (\n <p>\n This video cannot be viewed from your account because it has not been added to any libraries yet.\n </p>\n )}\n <DivButton\n onClick={props.close}\n className={`${styles.close} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={CloseSvg} size={SvgContainerSize.Large} />\n </DivButton>\n </div>\n ) : (\n <>\n <div className={ready ? 'd-none' : 'd-flex align-items-center justify-content-center h-100'}>\n <Spinner />\n </div>\n {!isLoading() && (\n <div className={!ready ? 'd-none' : ''}>\n <DivButton\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n onClick={props.close}\n className={`${styles.drag} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={HamburgerSvg} size={SvgContainerSize.Large} />\n </DivButton>\n <ClickViewPlayer\n viewKey={viewKey.data?.viewKey}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={onPlayerReady}\n eventLogging={false}\n autoplay\n />\n <DivButton\n onClick={props.close}\n className={`${styles.close} d-flex align-items-center justify-content-center rounded-circle box-shadow`}\n >\n <SvgContainer svg={CloseSvg} size={SvgContainerSize.Large} />\n </DivButton>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { ViewWrapper as PictureInPictureView };\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,a as t,ln as n,r}from"./BlDu0qdC.chunk.js";import{a as i,n as a}from"./DqUkhPat.chunk.js";import{t as o}from"./DEBg-sxL.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{Q as c,at as l,q as u,t as d}from"./BjSaXG862.chunk.js";import{c as f,d as p}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as m}from"./Bt5qHBoM2.chunk.js";import{b as h}from"./CSSol6ro.chunk.js";import{n as g,t as _}from"./DalFHGv7.chunk.js";import{t as v}from"./BDwjs8qz.chunk.js";import{t as y}from"./CVBPygL42.chunk.js";import{a as b,o as x}from"./DBq-nnnE.chunk.js";import{t as S}from"./BrCws9ZQ.chunk.js";import{R as C,z as w}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,a as t,ln as n,r}from"./BlDu0qdC.chunk.js";import{a as i,n as a}from"./DqUkhPat.chunk.js";import{t as o}from"./DEBg-sxL.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{Q as c,at as l,q as u,t as d}from"./BjSaXG862.chunk.js";import{c as f,d as p}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as m}from"./Bt5qHBoM2.chunk.js";import{b as h}from"./CSSol6ro.chunk.js";import{n as g,t as _}from"./DalFHGv7.chunk.js";import{t as v}from"./BDwjs8qz.chunk.js";import{t as y}from"./CVBPygL42.chunk.js";import{a as b,o as x}from"./DBq-nnnE.chunk.js";import{t as S}from"./BrCws9ZQ.chunk.js";import{R as C,z as w}from"./DTUkmChD.chunk.js";import{t as T}from"./C0xW53b02.chunk.js";import{t as E}from"./NwRcHl3g.chunk.js";import{t as D}from"./BJZB0--B.chunk.js";import{n as O,t as k}from"./DW7-la-i.chunk.js";var A=n(t()),j={aiGlow:`_aiGlow_1o20p_1`,glow:`_glow_1o20p_6`,glowSpin:`_glowSpin_1o20p_18`,ring:`_ring_1o20p_25`,ringSpin:`_ringSpin_1o20p_37`,content:`_content_1o20p_43`,spinning:`_spinning_1o20p_49`,glowBorderSpin:`_glowBorderSpin_1o20p_1`,glowBorderSpinReverse:`_glowBorderSpinReverse_1o20p_1`},M=r();function N(e){return(0,M.jsxs)(`div`,{className:_(e.shouldShow&&j.aiGlow,e.shouldShow&&j.spinning,e.className),children:[(0,M.jsxs)(`div`,{className:e.shouldShow?j.content:void 0,children:[e.children,e.shouldShow&&(0,M.jsx)(`span`,{className:j.glow,"aria-hidden":`true`,children:(0,M.jsx)(`span`,{className:j.glowSpin})})]}),e.shouldShow&&(0,M.jsx)(`span`,{className:j.ring,"aria-hidden":`true`,children:(0,M.jsx)(`span`,{className:j.ringSpin})})]})}var P={application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE_DETAILS};function F(t){let[n,r]=A.useState(!1),[_,j]=A.useState(!1),F=p(),I=y(),L=f(m.currentUser()),R=f(m.token()),z=f(S.interactiveMetadata(t.id)),B=z.data?.metadata?.aiGenerated||!1,V=f(z.data&&C.createViewKey(z.data.id,w.MasterObject)),H=f(B&&S.getInteractiveGenerationResult(t.id)),U=A.useMemo(()=>x(),[]),W=A.useMemo(()=>x(),[]);A.useEffect(()=>{!z.hasCompleted||z.data.status===v.Draft||e.trigger({application:s.INTERACTIVES,action:o.Interactives.PREVIEW_INTERACTIVE,args:[t.id]},{replace:!0})},[z.hasCompleted]);function G(){e.trigger({...P,args:[t.id]})}function K(){e.trigger({...P,args:[t.id],params:{publish:!0}})}function q(){e.trigger({application:s.INTERACTIVES,action:o.Interactives.DELETE_INTERACTIVE,args:[t.id]})}function J(){e.trigger({application:s.INTERACTIVES,action:o.Interactives.COPY_INTERACTIVE,args:[t.id]})}function Y(e){d.logUserAction({id:e.id,typeId:e.typeId,interactiveId:e.interactiveId,timepointId:e.timepointId,order:e.order,data:e.data},{actionType:l.Delete,entity:u.Interaction,location:c.EditInteractive})}function X(e){d.logUserAction({id:e.id,typeId:e.typeId,interactiveId:e.interactiveId,timepointId:e.timepointId,order:e.order,data:e.data},{actionType:l.Edit,entity:u.Interaction,location:c.EditInteractive})}async function Z(e,n){j(!0);try{let r=S.createSuggestedInteraction(t.id,{atMs:e,questionType:n}),i=await F(r);return d.logUserAction({parentId:z.data?._parentClip?.id||z.data?._parentVideo?.id,interactiveId:i.interactiveId,interactionId:i.interactionId,timepointId:i.timepointId,visibleAtMs:i.visibleAtMs,questionType:i.question.type,merged:i.merged},{actionType:l.Suggest,entity:u.Interaction,location:c.EditInteractive}),i}catch(e){I.error(D.getSuggestQuestionError(e))}finally{j(!1)}}async function Q(e){try{let n=S.acceptSuggestedQuestion(t.id,{atMs:e.suggestedVisibleAtMs,reviewQuestionId:e.id,question:e.question}),r=await F(n);return d.logUserAction({interactiveId:r.interactiveId,masterInteractiveId:r.masterInteractiveId,interactionId:r.interactionId,timepointId:r.timepointId,visibleAtMs:r.visibleAtMs,questionType:r.question.type,merged:r.merged},{actionType:l.Approve,entity:u.Interaction,location:c.EditInteractive}),r}catch{I.error(`Something went wrong while adding this question. Please try again.`);return}}return!V.data||!z.data||!R.data||!H.hasCompleted&&z.data?.metadata?.aiGenerated?(0,M.jsx)(`div`,{className:`text-center py-5`,children:(0,M.jsx)(g,{as:`div`,animation:`border`})}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(T,{interactive:z.data,activeAction:o.Interactives.EDIT_INTERACTIVE,currentUser:L.data}),(0,M.jsxs)(`div`,{className:`${n?``:`d-none`}`,children:[(0,M.jsxs)(`div`,{className:`d-flex justify-content-between align-items-center mb-3`,children:[(0,M.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,M.jsx)(h,{object:{name:z.data.name},actions:[]}),B&&(0,M.jsx)(i,{title:`This interactive was generated by AI`,spanHack:!0,children:(0,M.jsx)(a,{svg:E})})]}),(0,M.jsx)(`div`,{className:`flex-shrink-0`,children:(0,M.jsx)(b,{node:U})})]}),(0,M.jsx)(N,{shouldShow:_,children:(0,M.jsx)(k,{viewKey:V.data.viewKey,imageApi:new URL(ClickView.Config.Urls.ImageAPI),playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:()=>r(!0),currentUser:L.data,mode:O.Create,actionsPortalNode:U,questionListPortalNode:W,authToken:R.data,onClickEditDetails:G,onClickPublish:K,onClickDelete:q,onClickCopy:J,onDeleteInteraction:Y,onEditInteraction:X,eventLogging:!1,parentVideo:z.data?._parentClip||z.data?._parentVideo,hasAiInteractives:!0,onSuggestQuestion:Z,reviewQuestions:H.data?.result?.needsReview,onAcceptReviewQuestion:Q})}),(0,M.jsx)(b,{node:W})]})]})}export{F as EditInteractiveView};
|
|
2
|
+
//# sourceMappingURL=DuU4GBw5.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DQKCtEam.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/components/ai-animation-wrapper/AiAnimationWrapper.module.scss","../../../../../../../libs/shared/src/components/ai-animation-wrapper/AiAnimationWrapper.tsx","../../../../../src/apps/interactives/views/edit-interactive/EditInteractiveView.tsx"],"sourcesContent":["$speed: 4s;\n$feather: 8px;\n$ring-width: 0.1%; //0 - 1%\n\n$gradient: conic-gradient(\n from 0deg,\n #E175FF 0%,\n #2EABFF 16%,\n #3D64FF 30%,\n #A19EFF 45%,\n #FF7E75 60%,\n #FF9100 75%,\n #E175FF 88%,\n #E175FF 100%\n);\n\n.aiGlow {\n position: relative;\n isolation: isolate;\n}\n\n.glow {\n position: absolute;\n inset: 0;\n overflow: hidden;\n filter: blur(9px) saturate(6);\n mask-image:\n linear-gradient(to bottom, black 0%, transparent 1%, transparent 99%, black 100%),\n linear-gradient(to right, black 0%, transparent 1%, transparent 99%, black 100%);\n mask-composite: add;\n -webkit-mask-composite: source-over;\n opacity: 1;\n pointer-events: none;\n}\n.glowSpin {\n position: absolute;\n inset: -100%;\n background: $gradient;\n opacity: 1;\n}\n\n.ring {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n overflow: hidden;\n z-index: 2;\n pointer-events: none;\n mask-image:\n linear-gradient(to bottom, black #{$ring-width}, transparent #{$feather}, transparent calc(100% - #{$feather}), black calc(100% - #{$ring-width})),\n linear-gradient(to right, black #{$ring-width}, transparent #{$feather}, transparent calc(100% - #{$feather}), black calc(100% - #{$ring-width}));\n mask-composite: add;\n -webkit-mask-composite: source-over;\n}\n.ringSpin {\n position: absolute;\n inset: -100%;\n background: $gradient;\n}\n\n.content {\n position: relative;\n z-index: 1;\n overflow: hidden;\n}\n\n.spinning {\n .ringSpin {\n animation: glowBorderSpin $speed linear infinite;\n }\n .glowSpin {\n animation: glowBorderSpinReverse calc(#{$speed} * 1.8) linear infinite;\n }\n}\n\n@keyframes glowBorderSpin {\n from { transform: rotate(0); }\n to { transform: rotate(360deg); }\n}\n@keyframes glowBorderSpinReverse {\n from { transform: rotate(0); }\n to { transform: rotate(-360deg); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinning {\n .ringSpin,\n .glowSpin { animation: none; }\n }\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport styles from './AiAnimationWrapper.module.scss';\n\ninterface AiAnimationWrapperProps {\n children: React.ReactNode;\n shouldShow: boolean;\n className?: string;\n}\n\nexport function AiAnimationWrapper(props: AiAnimationWrapperProps): JSX.Element {\n const wrapperClass = classNames(\n props.shouldShow && styles.aiGlow,\n props.shouldShow && styles.spinning,\n props.className\n );\n\n return (\n <div className={wrapperClass}>\n <div className={props.shouldShow ? styles.content : undefined}>\n {props.children}\n {props.shouldShow && (\n <span className={styles.glow} aria-hidden='true'>\n <span className={styles.glowSpin} />\n </span>\n )}\n </div>\n {props.shouldShow && (\n <span className={styles.ring} aria-hidden='true'>\n <span className={styles.ringSpin} />\n </span>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AiAnimationWrapper } from 'libs/shared/components/ai-animation-wrapper/AiAnimationWrapper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { AiSparkleSvg } from 'libs/shared/images/svg/objects/AiSparkleSvg';\nimport { AddedQuestion, AiSuggestedInteraction, CuratorUser, CurrentUser, Interaction, InteractionTypeId, InteractiveGenerationJobDetail, InteractiveMetadata, PlayerViewKey, ReviewQuestion } from 'libs/shared/interfaces';\nimport { AiInteractiveHelper } from 'libs/shared/utils/ai-interactive-helper/AiInteractiveHelper';\n\nimport { InteractiveMode } from 'projects/player/plugins/interactive-plugin/interfaces';\nimport { ClickViewInteractivePlayer } from 'projects/player/react/InteractivePlayer';\n\nimport { ObjectHeader } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\n\nimport { EditInteractivesNav } from 'apps/interactives/components/edit-interactives-nav/EditInteractivesNav';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\n\nconst EDIT_APPLINK = {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE_DETAILS\n};\n\ninterface EditInteractiveViewProps {\n id: string;\n}\n\nexport function EditInteractiveView(props: EditInteractiveViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n const [ isLoadingSuggestion, setIsLoadingSuggestion ] = React.useState(false);\n\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const token = Flight.useBasicFetch<string>(UserRequests.token());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.id)\n );\n const isAiInteractive = interactiveMetadata.data?.metadata?.aiGenerated || false;\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n interactiveMetadata.data &&\n PlayerRequests.createViewKey(interactiveMetadata.data.id, MediaIdType.MasterObject)\n );\n\n const generationResult = Flight.useBasicFetch<InteractiveGenerationJobDetail>(\n isAiInteractive && InteractiveRequests.getInteractiveGenerationResult(props.id)\n );\n\n const actionsPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n const questionListPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n React.useEffect(() => {\n if (!interactiveMetadata.hasCompleted || interactiveMetadata.data.status === CurationStatus.Draft)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_INTERACTIVE,\n args: [props.id]\n }, { replace: true });\n }, [interactiveMetadata.hasCompleted]);\n\n function onClickEditDetails(): void {\n Core.AppLinkHelper.trigger({\n ...EDIT_APPLINK,\n args: [props.id]\n });\n }\n\n function onClickPublish(): void {\n Core.AppLinkHelper.trigger({\n ...EDIT_APPLINK,\n args: [props.id],\n params: { publish: true }\n });\n }\n\n function onClickDelete(): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.DELETE_INTERACTIVE,\n args: [props.id]\n });\n }\n\n function onClickCopy() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.COPY_INTERACTIVE,\n args: [props.id]\n });\n }\n\n function onDeleteInteraction(interaction: Interaction): void {\n AnalyticsHelper.logUserAction({\n id: interaction.id,\n typeId: interaction.typeId,\n interactiveId: interaction.interactiveId,\n timepointId: interaction.timepointId,\n order: interaction.order,\n data: interaction.data\n }, {\n actionType: UserAction.Delete,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n }\n\n function onEditInteraction(interaction: Interaction): void {\n AnalyticsHelper.logUserAction({\n id: interaction.id,\n typeId: interaction.typeId,\n interactiveId: interaction.interactiveId,\n timepointId: interaction.timepointId,\n order: interaction.order,\n data: interaction.data\n }, {\n actionType: UserAction.Edit,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n }\n\n async function onSuggestQuestion(\n timePoint: number,\n questionType: InteractionTypeId | null\n ): Promise<AiSuggestedInteraction | undefined> {\n setIsLoadingSuggestion(true);\n try {\n const request = InteractiveRequests.createSuggestedInteraction(props.id, {\n atMs: timePoint,\n questionType\n });\n const suggestion = await fetchAsync<AiSuggestedInteraction>(request);\n\n AnalyticsHelper.logUserAction({\n parentId: interactiveMetadata.data?._parentClip?.id || interactiveMetadata.data?._parentVideo?.id,\n interactiveId: suggestion.interactiveId,\n interactionId: suggestion.interactionId,\n timepointId: suggestion.timepointId,\n visibleAtMs: suggestion.visibleAtMs,\n questionType: suggestion.question.type,\n merged: suggestion.merged\n }, {\n actionType: UserAction.Suggest,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n\n return suggestion;\n } catch (e) {\n alerts.error(AiInteractiveHelper.getSuggestQuestionError(e));\n } finally {\n setIsLoadingSuggestion(false);\n }\n }\n\n async function onAcceptReviewQuestion(reviewQuestion: ReviewQuestion): Promise<AddedQuestion | undefined> {\n try {\n const request = InteractiveRequests.acceptSuggestedQuestion(props.id, {\n atMs: reviewQuestion.suggestedVisibleAtMs,\n reviewQuestionId: reviewQuestion.id,\n question: reviewQuestion.question\n });\n const addedQuestion = await fetchAsync<AddedQuestion>(request);\n\n AnalyticsHelper.logUserAction({\n interactiveId: addedQuestion.interactiveId,\n masterInteractiveId: addedQuestion.masterInteractiveId,\n interactionId: addedQuestion.interactionId,\n timepointId: addedQuestion.timepointId,\n visibleAtMs: addedQuestion.visibleAtMs,\n questionType: addedQuestion.question.type,\n merged: addedQuestion.merged\n }, {\n actionType: UserAction.Approve,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n\n return addedQuestion;\n } catch {\n alerts.error('Something went wrong while adding this question. Please try again.');\n return undefined;\n }\n }\n\n const isLoading = !viewKey.data\n || !interactiveMetadata.data\n || !token.data\n || (!generationResult.hasCompleted && interactiveMetadata.data?.metadata?.aiGenerated);\n\n if (isLoading) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n return (\n <>\n <EditInteractivesNav\n interactive={interactiveMetadata.data}\n activeAction={Actions.Interactives.EDIT_INTERACTIVE}\n currentUser={currentUser.data}\n />\n <div className={`${ready ? '' : 'd-none'}`}>\n <div className='d-flex justify-content-between align-items-center mb-3'>\n <div className='d-flex align-items-center'>\n <ObjectHeader object={{ name: interactiveMetadata.data.name }} actions={[]} />\n {isAiInteractive && (\n <Tooltip title='This interactive was generated by AI' spanHack>\n <SvgContainer svg={AiSparkleSvg} />\n </Tooltip>\n )}\n </div>\n <div className='flex-shrink-0'>\n <OutPortal node={actionsPortalNode} />\n </div>\n </div>\n <AiAnimationWrapper shouldShow={isLoadingSuggestion}>\n <ClickViewInteractivePlayer\n viewKey={viewKey.data.viewKey}\n imageApi={new URL(ClickView.Config.Urls.ImageAPI)}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={() => setReady(true)}\n currentUser={currentUser.data as unknown as CurrentUser}\n mode={InteractiveMode.Create}\n actionsPortalNode={actionsPortalNode}\n questionListPortalNode={questionListPortalNode}\n authToken={token.data}\n onClickEditDetails={onClickEditDetails}\n onClickPublish={onClickPublish}\n onClickDelete={onClickDelete}\n onClickCopy={onClickCopy}\n onDeleteInteraction={onDeleteInteraction}\n onEditInteraction={onEditInteraction}\n eventLogging={false}\n parentVideo={interactiveMetadata.data?._parentClip || interactiveMetadata.data?._parentVideo}\n hasAiInteractives={true}\n onSuggestQuestion={onSuggestQuestion}\n reviewQuestions={generationResult.data?.result?.needsReview}\n onAcceptReviewQuestion={onAcceptReviewQuestion}\n />\n </AiAnimationWrapper>\n <OutPortal node={questionListPortalNode} />\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DuU4GBw5.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/components/ai-animation-wrapper/AiAnimationWrapper.module.scss","../../../../../../../libs/shared/src/components/ai-animation-wrapper/AiAnimationWrapper.tsx","../../../../../src/apps/interactives/views/edit-interactive/EditInteractiveView.tsx"],"sourcesContent":["$speed: 4s;\n$feather: 8px;\n$ring-width: 0.1%; //0 - 1%\n\n$gradient: conic-gradient(\n from 0deg,\n #E175FF 0%,\n #2EABFF 16%,\n #3D64FF 30%,\n #A19EFF 45%,\n #FF7E75 60%,\n #FF9100 75%,\n #E175FF 88%,\n #E175FF 100%\n);\n\n.aiGlow {\n position: relative;\n isolation: isolate;\n}\n\n.glow {\n position: absolute;\n inset: 0;\n overflow: hidden;\n filter: blur(9px) saturate(6);\n mask-image:\n linear-gradient(to bottom, black 0%, transparent 1%, transparent 99%, black 100%),\n linear-gradient(to right, black 0%, transparent 1%, transparent 99%, black 100%);\n mask-composite: add;\n -webkit-mask-composite: source-over;\n opacity: 1;\n pointer-events: none;\n}\n.glowSpin {\n position: absolute;\n inset: -100%;\n background: $gradient;\n opacity: 1;\n}\n\n.ring {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n overflow: hidden;\n z-index: 2;\n pointer-events: none;\n mask-image:\n linear-gradient(to bottom, black #{$ring-width}, transparent #{$feather}, transparent calc(100% - #{$feather}), black calc(100% - #{$ring-width})),\n linear-gradient(to right, black #{$ring-width}, transparent #{$feather}, transparent calc(100% - #{$feather}), black calc(100% - #{$ring-width}));\n mask-composite: add;\n -webkit-mask-composite: source-over;\n}\n.ringSpin {\n position: absolute;\n inset: -100%;\n background: $gradient;\n}\n\n.content {\n position: relative;\n z-index: 1;\n overflow: hidden;\n}\n\n.spinning {\n .ringSpin {\n animation: glowBorderSpin $speed linear infinite;\n }\n .glowSpin {\n animation: glowBorderSpinReverse calc(#{$speed} * 1.8) linear infinite;\n }\n}\n\n@keyframes glowBorderSpin {\n from { transform: rotate(0); }\n to { transform: rotate(360deg); }\n}\n@keyframes glowBorderSpinReverse {\n from { transform: rotate(0); }\n to { transform: rotate(-360deg); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinning {\n .ringSpin,\n .glowSpin { animation: none; }\n }\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport styles from './AiAnimationWrapper.module.scss';\n\ninterface AiAnimationWrapperProps {\n children: React.ReactNode;\n shouldShow: boolean;\n className?: string;\n}\n\nexport function AiAnimationWrapper(props: AiAnimationWrapperProps): JSX.Element {\n const wrapperClass = classNames(\n props.shouldShow && styles.aiGlow,\n props.shouldShow && styles.spinning,\n props.className\n );\n\n return (\n <div className={wrapperClass}>\n <div className={props.shouldShow ? styles.content : undefined}>\n {props.children}\n {props.shouldShow && (\n <span className={styles.glow} aria-hidden='true'>\n <span className={styles.glowSpin} />\n </span>\n )}\n </div>\n {props.shouldShow && (\n <span className={styles.ring} aria-hidden='true'>\n <span className={styles.ringSpin} />\n </span>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AiAnimationWrapper } from 'libs/shared/components/ai-animation-wrapper/AiAnimationWrapper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { AiSparkleSvg } from 'libs/shared/images/svg/objects/AiSparkleSvg';\nimport { AddedQuestion, AiSuggestedInteraction, CuratorUser, CurrentUser, Interaction, InteractionTypeId, InteractiveGenerationJobDetail, InteractiveMetadata, PlayerViewKey, ReviewQuestion } from 'libs/shared/interfaces';\nimport { AiInteractiveHelper } from 'libs/shared/utils/ai-interactive-helper/AiInteractiveHelper';\n\nimport { InteractiveMode } from 'projects/player/plugins/interactive-plugin/interfaces';\nimport { ClickViewInteractivePlayer } from 'projects/player/react/InteractivePlayer';\n\nimport { ObjectHeader } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\n\nimport { EditInteractivesNav } from 'apps/interactives/components/edit-interactives-nav/EditInteractivesNav';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\n\nconst EDIT_APPLINK = {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE_DETAILS\n};\n\ninterface EditInteractiveViewProps {\n id: string;\n}\n\nexport function EditInteractiveView(props: EditInteractiveViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n const [ isLoadingSuggestion, setIsLoadingSuggestion ] = React.useState(false);\n\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const token = Flight.useBasicFetch<string>(UserRequests.token());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.id)\n );\n const isAiInteractive = interactiveMetadata.data?.metadata?.aiGenerated || false;\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n interactiveMetadata.data &&\n PlayerRequests.createViewKey(interactiveMetadata.data.id, MediaIdType.MasterObject)\n );\n\n const generationResult = Flight.useBasicFetch<InteractiveGenerationJobDetail>(\n isAiInteractive && InteractiveRequests.getInteractiveGenerationResult(props.id)\n );\n\n const actionsPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n const questionListPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n React.useEffect(() => {\n if (!interactiveMetadata.hasCompleted || interactiveMetadata.data.status === CurationStatus.Draft)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_INTERACTIVE,\n args: [props.id]\n }, { replace: true });\n }, [interactiveMetadata.hasCompleted]);\n\n function onClickEditDetails(): void {\n Core.AppLinkHelper.trigger({\n ...EDIT_APPLINK,\n args: [props.id]\n });\n }\n\n function onClickPublish(): void {\n Core.AppLinkHelper.trigger({\n ...EDIT_APPLINK,\n args: [props.id],\n params: { publish: true }\n });\n }\n\n function onClickDelete(): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.DELETE_INTERACTIVE,\n args: [props.id]\n });\n }\n\n function onClickCopy() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.COPY_INTERACTIVE,\n args: [props.id]\n });\n }\n\n function onDeleteInteraction(interaction: Interaction): void {\n AnalyticsHelper.logUserAction({\n id: interaction.id,\n typeId: interaction.typeId,\n interactiveId: interaction.interactiveId,\n timepointId: interaction.timepointId,\n order: interaction.order,\n data: interaction.data\n }, {\n actionType: UserAction.Delete,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n }\n\n function onEditInteraction(interaction: Interaction): void {\n AnalyticsHelper.logUserAction({\n id: interaction.id,\n typeId: interaction.typeId,\n interactiveId: interaction.interactiveId,\n timepointId: interaction.timepointId,\n order: interaction.order,\n data: interaction.data\n }, {\n actionType: UserAction.Edit,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n }\n\n async function onSuggestQuestion(\n timePoint: number,\n questionType: InteractionTypeId | null\n ): Promise<AiSuggestedInteraction | undefined> {\n setIsLoadingSuggestion(true);\n try {\n const request = InteractiveRequests.createSuggestedInteraction(props.id, {\n atMs: timePoint,\n questionType\n });\n const suggestion = await fetchAsync<AiSuggestedInteraction>(request);\n\n AnalyticsHelper.logUserAction({\n parentId: interactiveMetadata.data?._parentClip?.id || interactiveMetadata.data?._parentVideo?.id,\n interactiveId: suggestion.interactiveId,\n interactionId: suggestion.interactionId,\n timepointId: suggestion.timepointId,\n visibleAtMs: suggestion.visibleAtMs,\n questionType: suggestion.question.type,\n merged: suggestion.merged\n }, {\n actionType: UserAction.Suggest,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n\n return suggestion;\n } catch (e) {\n alerts.error(AiInteractiveHelper.getSuggestQuestionError(e));\n } finally {\n setIsLoadingSuggestion(false);\n }\n }\n\n async function onAcceptReviewQuestion(reviewQuestion: ReviewQuestion): Promise<AddedQuestion | undefined> {\n try {\n const request = InteractiveRequests.acceptSuggestedQuestion(props.id, {\n atMs: reviewQuestion.suggestedVisibleAtMs,\n reviewQuestionId: reviewQuestion.id,\n question: reviewQuestion.question\n });\n const addedQuestion = await fetchAsync<AddedQuestion>(request);\n\n AnalyticsHelper.logUserAction({\n interactiveId: addedQuestion.interactiveId,\n masterInteractiveId: addedQuestion.masterInteractiveId,\n interactionId: addedQuestion.interactionId,\n timepointId: addedQuestion.timepointId,\n visibleAtMs: addedQuestion.visibleAtMs,\n questionType: addedQuestion.question.type,\n merged: addedQuestion.merged\n }, {\n actionType: UserAction.Approve,\n entity: EntityType.Interaction,\n location: LocationContext.EditInteractive\n });\n\n return addedQuestion;\n } catch {\n alerts.error('Something went wrong while adding this question. Please try again.');\n return undefined;\n }\n }\n\n const isLoading = !viewKey.data\n || !interactiveMetadata.data\n || !token.data\n || (!generationResult.hasCompleted && interactiveMetadata.data?.metadata?.aiGenerated);\n\n if (isLoading) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n return (\n <>\n <EditInteractivesNav\n interactive={interactiveMetadata.data}\n activeAction={Actions.Interactives.EDIT_INTERACTIVE}\n currentUser={currentUser.data}\n />\n <div className={`${ready ? '' : 'd-none'}`}>\n <div className='d-flex justify-content-between align-items-center mb-3'>\n <div className='d-flex align-items-center'>\n <ObjectHeader object={{ name: interactiveMetadata.data.name }} actions={[]} />\n {isAiInteractive && (\n <Tooltip title='This interactive was generated by AI' spanHack>\n <SvgContainer svg={AiSparkleSvg} />\n </Tooltip>\n )}\n </div>\n <div className='flex-shrink-0'>\n <OutPortal node={actionsPortalNode} />\n </div>\n </div>\n <AiAnimationWrapper shouldShow={isLoadingSuggestion}>\n <ClickViewInteractivePlayer\n viewKey={viewKey.data.viewKey}\n imageApi={new URL(ClickView.Config.Urls.ImageAPI)}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={() => setReady(true)}\n currentUser={currentUser.data as unknown as CurrentUser}\n mode={InteractiveMode.Create}\n actionsPortalNode={actionsPortalNode}\n questionListPortalNode={questionListPortalNode}\n authToken={token.data}\n onClickEditDetails={onClickEditDetails}\n onClickPublish={onClickPublish}\n onClickDelete={onClickDelete}\n onClickCopy={onClickCopy}\n onDeleteInteraction={onDeleteInteraction}\n onEditInteraction={onEditInteraction}\n eventLogging={false}\n parentVideo={interactiveMetadata.data?._parentClip || interactiveMetadata.data?._parentVideo}\n hasAiInteractives={true}\n onSuggestQuestion={onSuggestQuestion}\n reviewQuestions={generationResult.data?.result?.needsReview}\n onAcceptReviewQuestion={onAcceptReviewQuestion}\n />\n </AiAnimationWrapper>\n <OutPortal node={questionListPortalNode} />\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,ln as t,r as n,t as r,w as i}from"./BlDu0qdC.chunk.js";import{a,c as o,n as s,r as c,t as l}from"./DqUkhPat.chunk.js";import{t as u}from"./DEBg-sxL.chunk.js";import{t as d}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{t as f}from"./3UqFnJa82.chunk.js";import{t as p}from"./BkIiZ6It2.chunk.js";import{t as m}from"./DGsjQ2Bp2.chunk.js";import{c as h,d as g}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as _}from"./Bt5qHBoM2.chunk.js";import"./CSSol6ro.chunk.js";import{t as v}from"./BJlEATFT.chunk.js";import{n as y}from"./C-KuBn_h.chunk.js";import{t as b}from"./DD9IS7oH.chunk.js";import{t as x}from"./DalFHGv7.chunk.js";import{n as ee}from"./CsF4wDV1.chunk.js";import{t as te}from"./BDwjs8qz.chunk.js";import{t as ne}from"./CVBPygL42.chunk.js";import{r as S}from"./BRcHS92O.chunk.js";import{c as C,i as re,s as w}from"./ZWXQm8ZX.chunk.js";import{t as T}from"./C0g24IgE.chunk.js";import{t as E}from"./CpkZ4mcC2.chunk.js";import{t as D}from"./CywbKZjn2.chunk.js";import{n as O}from"./BZzcezvm2.chunk.js";import{t as ie}from"./lRFOmERf2.chunk.js";import{n as k}from"./CDJGGlmi.chunk.js";import{t as ae}from"./Dfa0xIg3.chunk.js";import{t as oe}from"./CKOR_WCT.chunk.js";import{t as se}from"./Hprw1_Va.chunk.js";import{t as ce}from"./BPLykIUZ.chunk.js";import{t as A}from"./EcvRrDzW.chunk.js";import{t as j}from"./D9NTGxdu2.chunk.js";import{t as M}from"./C8hLOeBc2.chunk.js";import{a as N,i as P}from"./SkqOfrUt2.chunk.js";import{t as F}from"./DGBPrhrP2.chunk.js";import{t as I}from"./DhOjWbk-2.chunk.js";import{t as L}from"./B9L4-la32.chunk.js";import{t as R}from"./Dxf39xUf.chunk.js";import{R as z,z as B}from"./UFmS4XTi.chunk.js";import{t as V}from"./B-n4bfSb.chunk.js";import{t as H}from"./FBRb9Ucn2.chunk.js";import{n as U,r as W,t as G}from"./BHZqVahv2.chunk.js";var K=t(e(),1),q=t(f()),J=4096,le=q.object().shape({name:q.string().trim().max(255,`Name is too long`).min(1,`Name is too short`).required(`Name is required`).default(``),logo:p,icon:p,banner:p,cover:p,description:q.string().trim().required(`Description is required`).default(``).max(J,`Descriptions cannot exceed ${J} characters`),contentRegions:q.array().default([]),slug:q.string().trim().required(`Slug is required`).matches(/^[a-zA-Z0-9-]+$/,`Slug can only contain letters, numbers, and hyphens`),parent:q.mixed().required(`Parent is required`),backgroundColour:q.string(),websiteLink:q.string().url(`Invalid website link`)}),Y={"channel-video-banner":[1920,1080]},X={getValidVideoExtensions:()=>k.VIDEO.split(`,`),getUploadVideoTypeResolution:e=>Y[e],validateVideoResolutionForType:(e,t)=>{let[n,r]=Y[e];return t.width>=n&&t.height>=r},getOfflinePlaybackObject:e=>({videoId:`preview`,viewerId:``,viewerCustomerId:``,region:null,files:{progressive:[{url:e,mimeType:`video/mp4`,profile:`hd`,quality:1080,label:`Preview`}],fileToken:``},chapters:{list:[]},subtitles:{list:[]},resources:{list:[]},mediaType:`MasterVideo`,localCacheAddresses:[],mediaId:`preview`,settings:{showSubtitles:!1,playbackProfile:`hd`,playbackProfileLocalCache:`hd`,playbackQuality:`1080`,playbackQualityLocalCache:`1080`,playbackQualityFallback:`1080`,playbackSubtitleSizeDefault:`medium`},title:`Preview`,ratingCode:``,seriesName:``,seasonNumber:0,episodeNumber:0}),getVideoResolution:async e=>new Promise((t,n)=>{e.type.startsWith(`video/`)||n(Error(`The file is not a video`));let r=document.createElement(`video`),i=URL.createObjectURL(e);r.addEventListener(`loadedmetadata`,()=>{let e=r.videoWidth,n=r.videoHeight;URL.revokeObjectURL(i),t({width:e,height:n})}),r.addEventListener(`error`,()=>{URL.revokeObjectURL(i),n(Error(`Failed to load video metadata`))}),r.src=i})};function ue(e){let t=ne(),n=g(),[r,i]=K.useState(0),[a,o]=K.useState(null),[s,c]=K.useState(`idle`),[l,u]=K.useState(null),d=m(ee.VideoUpload),f=h(_.currentUser());async function p(t,n){if(!a||!t||t!==a||!n||!n.url)return;let r=n.id,o=n.url;u(r),i(100),e.setFieldValue(o),await b(t,r,o)}function v(e){if(!a)return;let t=Array.from(e).find(e=>e===a);if(!t)return;let n=d.getUpload(t);n&&u(n.get(`id`))}async function b(r,i,a){if(!f.data){t.error(`Cannot complete upload: User not loaded`);return}let o=d.getUpload(r);if(!o){t.error(`Error: Video upload not found`);return}o.set(`sending`,!0);try{let t=await n(ce.completeUpload({id:o.get(`id`),fileId:i,userId:f.data.id,customerId:f.data.customerId,libraryId:e.hostedLibraryId,fileUrl:a,pendingProcessOrigin:W.Upload,origin:G.Curator,video:{name:r.name,description:``,productionYear:new Date().getFullYear(),productionCompanies:[],producers:[],distributors:[],directors:[],subtitles:[]},subtitleOptions:{subtitleExtractOptions:U.EmbeddedOnly},autoCaption:!1}));await e.onUploadComplete?.(t)}catch{t.error(`There was an error uploading the video. Please try again.`)}finally{c(`idle`)}}function x(n){let r=`.`+n.name.split(`.`).pop()?.toLowerCase();if(!e.validVideoExtensions.includes(r)){e.setFieldError(`The file must be a video file. Supported extensions are ${e.validVideoExtensions.join(`, `)}`);return}X.getVideoResolution(n).then(t=>{let[r,a]=X.getUploadVideoTypeResolution(e.type);if(!X.validateVideoResolutionForType(e.type,t)){e.setFieldError(`The video must be at least ${r} x ${a}px. Uploaded video is ${t.width} x ${t.height}px.`);return}u(null),c(`uploading`),i(0),o(n),e.setFieldTouched(!0),d.addFiles([n])}).catch(()=>{t.error(`Failed to get video resolution. Please try again later.`)})}return y(P.VIDEO_UPLOAD,`progress`,(e,t)=>{(!l||e===l)&&i(Math.floor(t))}),y(P.VIDEO_UPLOAD,N.UPLOAD_SUCCESS,p,[a,b]),y(P.VIDEO_UPLOAD,N.FILES_ADDED,v,[a,d]),{status:s,uploadProgress:r,onSelectFile:x}}var Z=n();function de(){return(0,Z.jsx)(`div`,{className:`mt-3`,children:(0,Z.jsxs)(`div`,{className:`d-flex flex-column justify-content-center align-items-center gap-3 mb-1`,children:[(0,Z.jsx)(`span`,{children:`The video is being processed currently. Please check back later.`}),(0,Z.jsx)(`button`,{className:`btn btn-outline-dark`,onClick:()=>i.Reload(),children:`Reload`})]})})}var fe=X.getValidVideoExtensions();function pe(e){let{getRootProps:t,getInputProps:n,isDragActive:r}=E({onDropAccepted:t=>e.onSelectFile(t[0]),noClick:!0,multiple:!1,noKeyboard:!0,accept:{"video/*":fe}});return(0,Z.jsxs)(`div`,{...t(),className:x(`border rounded position-relative p-5 mt-2 text-center bg-light overflow-hidden`,!!e.hasError&&`is-invalid`),children:[(0,Z.jsx)(`input`,{...n()}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`mb-2 px-3`,children:`Drag and drop a video to upload`}),(0,Z.jsx)(D,{svg:F,className:`btn btn-outline-dark`,mimeType:k.VIDEO,onFileSelect:t=>e.onSelectFile(Array.from(t)[0]),children:`Upload Video`})]}),r&&(0,Z.jsxs)(`div`,{className:`position-absolute w-100 h-100 top-0 start-0 d-flex align-items-center justify-content-center bg-light gap-2`,children:[(0,Z.jsx)(s,{svg:F,size:c.Large}),(0,Z.jsx)(`span`,{className:`h4 mb-0`,children:`Drop file here to begin uploading`})]})]})}function me(e){let[t,n]=e.resolution;return(0,Z.jsxs)(`div`,{className:`d-flex justify-content-between align-items-center`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{children:e.label}),e.showRequiredStar&&(0,Z.jsx)(`span`,{className:`text-danger`,children:`*`}),(0,Z.jsx)(`em`,{className:`ms-1 text-secondary`,children:e.note??`(Minimum resolution is ${t} x ${n}px)`})]}),(0,Z.jsxs)(`div`,{className:`d-flex align-items-center`,children:[e.showReplaceFileButton&&!!e.replaceFileButtonHandler&&(0,Z.jsx)(a,{title:`Replace video`,placement:`top`,spanHack:!0,children:(0,Z.jsx)(D,{className:`btn btn-link`,mimeType:k.VIDEO,svg:F,svgSize:c.Standard,onFileSelect:t=>e.replaceFileButtonHandler?.(Array.from(t)[0])})}),e.showReplaceFileButton&&!!e.deleteFileButtonHandler&&(0,Z.jsx)(a,{title:`Remove video`,placement:`top`,spanHack:!0,children:(0,Z.jsx)(o,{onClick:e.deleteFileButtonHandler,children:(0,Z.jsx)(s,{svg:se,size:c.Standard})})})]})]})}function Q(e){return(0,Z.jsxs)(`div`,{className:x(`mt-2`,e.hasError&&`is-invalid`),children:[(0,Z.jsx)(V,{viewKey:e.viewKey,offlinePlaybackObject:e.offlinePlaybackObject,playerApi:e.playerApiUrl,autoplay:!1,controls:!0}),e.children]})}function he(e){return(0,Z.jsxs)(`div`,{className:`mt-3`,children:[(0,Z.jsxs)(`div`,{className:`d-flex justify-content-between mb-1`,children:[(0,Z.jsx)(`span`,{children:`Uploading...`}),(0,Z.jsxs)(`span`,{children:[Math.round(e.progress),`%`]})]}),(0,Z.jsx)(b,{now:e.progress,variant:`info`,animated:e.progress<100})]})}var ge=new URL(ClickView.Config.Urls.PlayerApi),_e=X.getValidVideoExtensions();function ve(e){let t=e.uploadVideoType??`channel-video-banner`,n=C(),r=n.values[e.fieldName],[i,a]=K.useState(!1),{status:o,uploadProgress:l,onSelectFile:u}=ue({type:t,hostedLibraryId:e.hostedLibraryId,validVideoExtensions:_e,setFieldValue:t=>n.setFieldValue(e.fieldName,{fileUrl:t}),setFieldError:t=>n.setFieldError(e.fieldName,t),setFieldTouched:t=>n.setFieldTouched(e.fieldName,t),onUploadComplete:e.onUploadComplete}),d=h(r?.id&&z.createViewKey(r.id,B.MasterObject)),f=w(n.errors,e.fieldName),p=X.getUploadVideoTypeResolution(t),m=o===`uploading`,g=r?.fileUrl,_=!!d.data?.viewKey||!f&&!!g,y=r?.id&&r?.status===te.Processing;function b(){n.setFieldValue(e.fieldName,void 0)}return(0,Z.jsx)(`div`,{className:`form-group`,children:(0,Z.jsxs)(`div`,{className:x(`form-control h-auto py-2`,!!f&&`border border-danger`),children:[(0,Z.jsx)(me,{label:e.label,showRequiredStar:e.showRequiredStar,showReplaceFileButton:_&&!m&&!y,replaceFileButtonHandler:u,deleteFileButtonHandler:b,resolution:p}),m?(0,Z.jsx)(he,{progress:l}):y?(0,Z.jsx)(de,{}):_?(0,Z.jsxs)(Z.Fragment,{children:[!i&&(0,Z.jsx)(Q,{playerApiUrl:ge,viewKey:d.data?.viewKey,offlinePlaybackObject:!d.data?.viewKey&&g?X.getOfflinePlaybackObject(g):void 0,hasError:!!f}),(0,Z.jsx)(`div`,{className:`d-flex justify-content-center`,children:(0,Z.jsx)(s,{svg:i?ae:oe,size:c.Large,className:`svg-container cursor-pointer`,tooltipSpanHack:!0,onClick:()=>a(!i),title:i?`Show video`:`Hide video`,tooltipPlacement:`left`})})]}):(0,Z.jsx)(pe,{onSelectFile:u,hasError:!!f}),(0,Z.jsx)(v.Control.Feedback,{type:`invalid`,children:f})]})})}var $={input:`_input_1merh_1`,suggestionsContainer:`_suggestionsContainer_1merh_4`},ye={width:1920,height:1080};function be(e){let t=C();function n(e){t.setFieldValue(`parent`,e),t.setFieldTouched(`parent`,!0,!1)}function i(e){n(e)}function a(n){t.setFieldValue(`name`,n.target.value),e.isNew&&(t.setFieldValue(`slug`,r.slugify(n.target.value)??``),t.setFieldTouched(`slug`,!0))}function o(){n(null)}let s=t.touched.parent&&t.errors.parent;function c(){return typeof t.errors.parent==`string`?t.errors.parent:``}return(0,Z.jsxs)(re,{children:[(0,Z.jsx)(O,{label:`Name`,name:`name`,id:`name`,value:t.values.name,placeholder:`Enter a name for this content partner`,onChange:a,showRequiredStar:!0}),(0,Z.jsx)(O,{as:`textarea`,rows:2,label:`Description`,name:`description`,id:`description`,value:t.values.description,placeholder:`Enter a description for this content partner`,maxLength:J,showCharacterCounter:!0,showRequiredStar:!0}),(0,Z.jsx)(O,{label:`Website Link`,name:`websiteLink`,id:`websiteLink`,value:t.values.websiteLink,placeholder:`Enter a website link for this content partner`}),(0,Z.jsx)(O,{label:`Parent`,name:`parentId`,id:`parentId`,showRequiredStar:!0,children:()=>(0,Z.jsxs)(`div`,{className:`form-group`,children:[(0,Z.jsx)(`div`,{className:x(s&&`is-invalid`),children:(0,Z.jsx)(ie,{renderAsForm:!1,theme:()=>({suggestionsContainerOpen:x(`pb-0 pt-1 overflow-hidden bg-white border rounded position-absolute w-100`,$.suggestions),suggestionsContainer:`${$.suggestionsContainer}`,input:x(s&&`border-danger`)}),activationLength:2,placeholder:`Search for a parent company or person...`,clearQueryOnSelect:!0,searchIconPlacement:!1,debounceTime:300,allowableSuggestionFetchRequestedReasons:[`input-changed`,`input-focused`],getRemoteUrl:()=>e.getRemoteUrl(),getRemotePostBody:e=>({query:e,indices:[{index:`company`},{index:`person`}],searchType:`content`}),onSuggestionSelected:i,showClearInputIcon:!0,onClickClearInput:o,formatRemoteSuggestions:e=>e.results?.map(e=>({...e,name:e.name?.[0]})),initialQuery:t.values.parent?.name||``,getErrorStateComponent:e=>(0,Z.jsx)(j,{imageUrl:M.TYPEAHEAD_ERROR,onClickTryAgain:e}),getEmptyStateComponent:e=>(0,Z.jsxs)(`div`,{children:[`Couldn't find any matches for `,e]})})}),(0,Z.jsx)(v.Control.Feedback,{type:`invalid`,children:c()})]})}),(0,Z.jsx)(O,{label:`Slug`,name:`slug`,infoText:`Auto generated based on the parent company or person name`,id:`slug`,value:t.values.slug,readOnly:!e.isNew,disabled:!e.isNew,showRequiredStar:!0}),e.contentRegions&&!e.isNew&&(0,Z.jsx)(O,{label:`Content Regions`,name:`contentRegions`,id:`contentRegions`,children:()=>(0,Z.jsx)(`div`,{className:`w-50`,children:(0,Z.jsx)(I,{type:`checkbox`,id:t.values.id,options:e.contentRegions,selected:t.values.contentRegions||[],onUpdate:e=>t.setFieldValue(`contentRegions`,e),readOnly:!0})})}),(0,Z.jsx)(A,{imageType:S.Covers,fieldName:`cover`,uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE}}),(0,Z.jsx)(A,{imageType:S.Logos,fieldName:`logo`,label:`Logo`,overrideDimensions:{width:512,height:512},uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE}}),(0,Z.jsx)(A,{imageType:S.Covers,fieldName:`icon`,label:`Icon`,canRemove:!0,uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE}}),!e.isNew&&(0,Z.jsx)(L,{label:`Background colour`,fieldName:`backgroundColour`}),(0,Z.jsx)(A,{imageType:S.Banners,fieldName:`banner`,uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE},overrideDimensions:ye}),!!e.onVideoUploadComplete&&(0,Z.jsx)(ve,{label:`Video Banner`,fieldName:`videoBanner`,hostedLibraryId:ClickView.Config.Resources.ClickViewRootLibrary,onUploadComplete:e.onVideoUploadComplete}),(0,Z.jsxs)(`div`,{className:`d-flex gap-2`,children:[(0,Z.jsx)(R,{isNew:e.isNew,variant:`dark`}),!e.isNew&&(0,Z.jsx)(l,{appLink:e.deleteAppLink,className:`btn btn-danger`,children:`Delete Channel`})]})]})}function xe(e){let t=e.contentPartner?.links?H.getPartnerLinkByType(e.contentPartner.links,`website`):null,n={id:e.contentPartner?.id,name:e.contentPartner?.name||``,logo:e.contentPartner?.logo||null,icon:e.contentPartner?.icon||null,cover:e.contentPartner?.cover||null,banner:e.contentPartner?.banner||null,description:e.contentPartner?.description||``,slug:e.contentPartner?._slug.value||``,blurb:e.contentPartner?.blurb||``,contentSource:e.contentPartner?.contentSource||1,partnerType:e.contentPartner?.partnerType||2,backgroundColour:e.contentPartner?.metadata?.backgroundColour||null,contentRegions:e.contentPartner?.contentRegions?.data||[],parent:e.contentPartner?.person||e.contentPartner?.company,videoBanner:e.contentPartner?.videoBanner?{id:e.contentPartner?.videoBanner.id,status:e.contentPartner?.videoBanner.status}:null,websiteLink:t||``};function r(){return`/api/search/v4/search/raw?userId=${e.currentUser?.id}&customerid=${e.currentUser?.customerId}`}return(0,Z.jsx)(T,{initialValues:n,validationSchema:le,onSubmit:e.onSave,children:(0,Z.jsx)(be,{isNew:!(e.contentPartner&&e.contentPartner.id),contentRegions:e.contentRegions,getRemoteUrl:r,onVideoUploadComplete:e.onVideoUploadComplete,deleteAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.DELETE_CONTENT_PARTNER,args:[e.contentPartner?.id]}})})}export{xe as t};
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{a as e,ln as t,r as n,t as r,w as i}from"./BlDu0qdC.chunk.js";import{a,c as o,n as s,r as c,t as l}from"./DqUkhPat.chunk.js";import{t as u}from"./DEBg-sxL.chunk.js";import{t as d}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{t as f}from"./3UqFnJa82.chunk.js";import{t as p}from"./BkIiZ6It2.chunk.js";import{t as m}from"./DGsjQ2Bp2.chunk.js";import{c as h,d as g}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as _}from"./Bt5qHBoM2.chunk.js";import"./CSSol6ro.chunk.js";import{t as v}from"./BJlEATFT.chunk.js";import{n as y}from"./C-KuBn_h.chunk.js";import{t as b}from"./DD9IS7oH.chunk.js";import{t as x}from"./DalFHGv7.chunk.js";import{n as ee}from"./CsF4wDV1.chunk.js";import{t as te}from"./BDwjs8qz.chunk.js";import{t as ne}from"./CVBPygL42.chunk.js";import{r as S}from"./BRcHS92O.chunk.js";import{c as C,i as re,s as w}from"./ZWXQm8ZX.chunk.js";import{t as T}from"./C0g24IgE.chunk.js";import{t as E}from"./CpkZ4mcC2.chunk.js";import{t as D}from"./CywbKZjn2.chunk.js";import{n as O}from"./BZzcezvm2.chunk.js";import{t as ie}from"./lRFOmERf2.chunk.js";import{n as k}from"./CDJGGlmi.chunk.js";import{t as ae}from"./Dfa0xIg3.chunk.js";import{t as oe}from"./CKOR_WCT.chunk.js";import{t as se}from"./Hprw1_Va.chunk.js";import{t as ce}from"./BPLykIUZ.chunk.js";import{t as A}from"./EcvRrDzW.chunk.js";import{t as j}from"./D9NTGxdu2.chunk.js";import{t as M}from"./C8hLOeBc2.chunk.js";import{a as N,i as P}from"./SkqOfrUt2.chunk.js";import{t as F}from"./DGBPrhrP2.chunk.js";import{t as I}from"./DhOjWbk-2.chunk.js";import{t as L}from"./B9L4-la32.chunk.js";import{t as R}from"./Dxf39xUf.chunk.js";import{R as z,z as B}from"./DTUkmChD.chunk.js";import{t as V}from"./eKSK4iyn.chunk.js";import{t as H}from"./FBRb9Ucn2.chunk.js";import{n as U,r as W,t as G}from"./BHZqVahv2.chunk.js";var K=t(e(),1),q=t(f()),J=4096,le=q.object().shape({name:q.string().trim().max(255,`Name is too long`).min(1,`Name is too short`).required(`Name is required`).default(``),logo:p,icon:p,banner:p,cover:p,description:q.string().trim().required(`Description is required`).default(``).max(J,`Descriptions cannot exceed ${J} characters`),contentRegions:q.array().default([]),slug:q.string().trim().required(`Slug is required`).matches(/^[a-zA-Z0-9-]+$/,`Slug can only contain letters, numbers, and hyphens`),parent:q.mixed().required(`Parent is required`),backgroundColour:q.string(),websiteLink:q.string().url(`Invalid website link`)}),Y={"channel-video-banner":[1920,1080]},X={getValidVideoExtensions:()=>k.VIDEO.split(`,`),getUploadVideoTypeResolution:e=>Y[e],validateVideoResolutionForType:(e,t)=>{let[n,r]=Y[e];return t.width>=n&&t.height>=r},getOfflinePlaybackObject:e=>({videoId:`preview`,viewerId:``,viewerCustomerId:``,region:null,files:{progressive:[{url:e,mimeType:`video/mp4`,profile:`hd`,quality:1080,label:`Preview`}],fileToken:``},chapters:{list:[]},subtitles:{list:[]},resources:{list:[]},mediaType:`MasterVideo`,localCacheAddresses:[],mediaId:`preview`,settings:{showSubtitles:!1,playbackProfile:`hd`,playbackProfileLocalCache:`hd`,playbackQuality:`1080`,playbackQualityLocalCache:`1080`,playbackQualityFallback:`1080`,playbackSubtitleSizeDefault:`medium`},title:`Preview`,ratingCode:``,seriesName:``,seasonNumber:0,episodeNumber:0}),getVideoResolution:async e=>new Promise((t,n)=>{e.type.startsWith(`video/`)||n(Error(`The file is not a video`));let r=document.createElement(`video`),i=URL.createObjectURL(e);r.addEventListener(`loadedmetadata`,()=>{let e=r.videoWidth,n=r.videoHeight;URL.revokeObjectURL(i),t({width:e,height:n})}),r.addEventListener(`error`,()=>{URL.revokeObjectURL(i),n(Error(`Failed to load video metadata`))}),r.src=i})};function ue(e){let t=ne(),n=g(),[r,i]=K.useState(0),[a,o]=K.useState(null),[s,c]=K.useState(`idle`),[l,u]=K.useState(null),d=m(ee.VideoUpload),f=h(_.currentUser());async function p(t,n){if(!a||!t||t!==a||!n||!n.url)return;let r=n.id,o=n.url;u(r),i(100),e.setFieldValue(o),await b(t,r,o)}function v(e){if(!a)return;let t=Array.from(e).find(e=>e===a);if(!t)return;let n=d.getUpload(t);n&&u(n.get(`id`))}async function b(r,i,a){if(!f.data){t.error(`Cannot complete upload: User not loaded`);return}let o=d.getUpload(r);if(!o){t.error(`Error: Video upload not found`);return}o.set(`sending`,!0);try{let t=await n(ce.completeUpload({id:o.get(`id`),fileId:i,userId:f.data.id,customerId:f.data.customerId,libraryId:e.hostedLibraryId,fileUrl:a,pendingProcessOrigin:W.Upload,origin:G.Curator,video:{name:r.name,description:``,productionYear:new Date().getFullYear(),productionCompanies:[],producers:[],distributors:[],directors:[],subtitles:[]},subtitleOptions:{subtitleExtractOptions:U.EmbeddedOnly},autoCaption:!1}));await e.onUploadComplete?.(t)}catch{t.error(`There was an error uploading the video. Please try again.`)}finally{c(`idle`)}}function x(n){let r=`.`+n.name.split(`.`).pop()?.toLowerCase();if(!e.validVideoExtensions.includes(r)){e.setFieldError(`The file must be a video file. Supported extensions are ${e.validVideoExtensions.join(`, `)}`);return}X.getVideoResolution(n).then(t=>{let[r,a]=X.getUploadVideoTypeResolution(e.type);if(!X.validateVideoResolutionForType(e.type,t)){e.setFieldError(`The video must be at least ${r} x ${a}px. Uploaded video is ${t.width} x ${t.height}px.`);return}u(null),c(`uploading`),i(0),o(n),e.setFieldTouched(!0),d.addFiles([n])}).catch(()=>{t.error(`Failed to get video resolution. Please try again later.`)})}return y(P.VIDEO_UPLOAD,`progress`,(e,t)=>{(!l||e===l)&&i(Math.floor(t))}),y(P.VIDEO_UPLOAD,N.UPLOAD_SUCCESS,p,[a,b]),y(P.VIDEO_UPLOAD,N.FILES_ADDED,v,[a,d]),{status:s,uploadProgress:r,onSelectFile:x}}var Z=n();function de(){return(0,Z.jsx)(`div`,{className:`mt-3`,children:(0,Z.jsxs)(`div`,{className:`d-flex flex-column justify-content-center align-items-center gap-3 mb-1`,children:[(0,Z.jsx)(`span`,{children:`The video is being processed currently. Please check back later.`}),(0,Z.jsx)(`button`,{className:`btn btn-outline-dark`,onClick:()=>i.Reload(),children:`Reload`})]})})}var fe=X.getValidVideoExtensions();function pe(e){let{getRootProps:t,getInputProps:n,isDragActive:r}=E({onDropAccepted:t=>e.onSelectFile(t[0]),noClick:!0,multiple:!1,noKeyboard:!0,accept:{"video/*":fe}});return(0,Z.jsxs)(`div`,{...t(),className:x(`border rounded position-relative p-5 mt-2 text-center bg-light overflow-hidden`,!!e.hasError&&`is-invalid`),children:[(0,Z.jsx)(`input`,{...n()}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`mb-2 px-3`,children:`Drag and drop a video to upload`}),(0,Z.jsx)(D,{svg:F,className:`btn btn-outline-dark`,mimeType:k.VIDEO,onFileSelect:t=>e.onSelectFile(Array.from(t)[0]),children:`Upload Video`})]}),r&&(0,Z.jsxs)(`div`,{className:`position-absolute w-100 h-100 top-0 start-0 d-flex align-items-center justify-content-center bg-light gap-2`,children:[(0,Z.jsx)(s,{svg:F,size:c.Large}),(0,Z.jsx)(`span`,{className:`h4 mb-0`,children:`Drop file here to begin uploading`})]})]})}function me(e){let[t,n]=e.resolution;return(0,Z.jsxs)(`div`,{className:`d-flex justify-content-between align-items-center`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{children:e.label}),e.showRequiredStar&&(0,Z.jsx)(`span`,{className:`text-danger`,children:`*`}),(0,Z.jsx)(`em`,{className:`ms-1 text-secondary`,children:e.note??`(Minimum resolution is ${t} x ${n}px)`})]}),(0,Z.jsxs)(`div`,{className:`d-flex align-items-center`,children:[e.showReplaceFileButton&&!!e.replaceFileButtonHandler&&(0,Z.jsx)(a,{title:`Replace video`,placement:`top`,spanHack:!0,children:(0,Z.jsx)(D,{className:`btn btn-link`,mimeType:k.VIDEO,svg:F,svgSize:c.Standard,onFileSelect:t=>e.replaceFileButtonHandler?.(Array.from(t)[0])})}),e.showReplaceFileButton&&!!e.deleteFileButtonHandler&&(0,Z.jsx)(a,{title:`Remove video`,placement:`top`,spanHack:!0,children:(0,Z.jsx)(o,{onClick:e.deleteFileButtonHandler,children:(0,Z.jsx)(s,{svg:se,size:c.Standard})})})]})]})}function Q(e){return(0,Z.jsxs)(`div`,{className:x(`mt-2`,e.hasError&&`is-invalid`),children:[(0,Z.jsx)(V,{viewKey:e.viewKey,offlinePlaybackObject:e.offlinePlaybackObject,playerApi:e.playerApiUrl,autoplay:!1,controls:!0}),e.children]})}function he(e){return(0,Z.jsxs)(`div`,{className:`mt-3`,children:[(0,Z.jsxs)(`div`,{className:`d-flex justify-content-between mb-1`,children:[(0,Z.jsx)(`span`,{children:`Uploading...`}),(0,Z.jsxs)(`span`,{children:[Math.round(e.progress),`%`]})]}),(0,Z.jsx)(b,{now:e.progress,variant:`info`,animated:e.progress<100})]})}var ge=new URL(ClickView.Config.Urls.PlayerApi),_e=X.getValidVideoExtensions();function ve(e){let t=e.uploadVideoType??`channel-video-banner`,n=C(),r=n.values[e.fieldName],[i,a]=K.useState(!1),{status:o,uploadProgress:l,onSelectFile:u}=ue({type:t,hostedLibraryId:e.hostedLibraryId,validVideoExtensions:_e,setFieldValue:t=>n.setFieldValue(e.fieldName,{fileUrl:t}),setFieldError:t=>n.setFieldError(e.fieldName,t),setFieldTouched:t=>n.setFieldTouched(e.fieldName,t),onUploadComplete:e.onUploadComplete}),d=h(r?.id&&z.createViewKey(r.id,B.MasterObject)),f=w(n.errors,e.fieldName),p=X.getUploadVideoTypeResolution(t),m=o===`uploading`,g=r?.fileUrl,_=!!d.data?.viewKey||!f&&!!g,y=r?.id&&r?.status===te.Processing;function b(){n.setFieldValue(e.fieldName,void 0)}return(0,Z.jsx)(`div`,{className:`form-group`,children:(0,Z.jsxs)(`div`,{className:x(`form-control h-auto py-2`,!!f&&`border border-danger`),children:[(0,Z.jsx)(me,{label:e.label,showRequiredStar:e.showRequiredStar,showReplaceFileButton:_&&!m&&!y,replaceFileButtonHandler:u,deleteFileButtonHandler:b,resolution:p}),m?(0,Z.jsx)(he,{progress:l}):y?(0,Z.jsx)(de,{}):_?(0,Z.jsxs)(Z.Fragment,{children:[!i&&(0,Z.jsx)(Q,{playerApiUrl:ge,viewKey:d.data?.viewKey,offlinePlaybackObject:!d.data?.viewKey&&g?X.getOfflinePlaybackObject(g):void 0,hasError:!!f}),(0,Z.jsx)(`div`,{className:`d-flex justify-content-center`,children:(0,Z.jsx)(s,{svg:i?ae:oe,size:c.Large,className:`svg-container cursor-pointer`,tooltipSpanHack:!0,onClick:()=>a(!i),title:i?`Show video`:`Hide video`,tooltipPlacement:`left`})})]}):(0,Z.jsx)(pe,{onSelectFile:u,hasError:!!f}),(0,Z.jsx)(v.Control.Feedback,{type:`invalid`,children:f})]})})}var $={input:`_input_1merh_1`,suggestionsContainer:`_suggestionsContainer_1merh_4`},ye={width:1920,height:1080};function be(e){let t=C();function n(e){t.setFieldValue(`parent`,e),t.setFieldTouched(`parent`,!0,!1)}function i(e){n(e)}function a(n){t.setFieldValue(`name`,n.target.value),e.isNew&&(t.setFieldValue(`slug`,r.slugify(n.target.value)??``),t.setFieldTouched(`slug`,!0))}function o(){n(null)}let s=t.touched.parent&&t.errors.parent;function c(){return typeof t.errors.parent==`string`?t.errors.parent:``}return(0,Z.jsxs)(re,{children:[(0,Z.jsx)(O,{label:`Name`,name:`name`,id:`name`,value:t.values.name,placeholder:`Enter a name for this content partner`,onChange:a,showRequiredStar:!0}),(0,Z.jsx)(O,{as:`textarea`,rows:2,label:`Description`,name:`description`,id:`description`,value:t.values.description,placeholder:`Enter a description for this content partner`,maxLength:J,showCharacterCounter:!0,showRequiredStar:!0}),(0,Z.jsx)(O,{label:`Website Link`,name:`websiteLink`,id:`websiteLink`,value:t.values.websiteLink,placeholder:`Enter a website link for this content partner`}),(0,Z.jsx)(O,{label:`Parent`,name:`parentId`,id:`parentId`,showRequiredStar:!0,children:()=>(0,Z.jsxs)(`div`,{className:`form-group`,children:[(0,Z.jsx)(`div`,{className:x(s&&`is-invalid`),children:(0,Z.jsx)(ie,{renderAsForm:!1,theme:()=>({suggestionsContainerOpen:x(`pb-0 pt-1 overflow-hidden bg-white border rounded position-absolute w-100`,$.suggestions),suggestionsContainer:`${$.suggestionsContainer}`,input:x(s&&`border-danger`)}),activationLength:2,placeholder:`Search for a parent company or person...`,clearQueryOnSelect:!0,searchIconPlacement:!1,debounceTime:300,allowableSuggestionFetchRequestedReasons:[`input-changed`,`input-focused`],getRemoteUrl:()=>e.getRemoteUrl(),getRemotePostBody:e=>({query:e,indices:[{index:`company`},{index:`person`}],searchType:`content`}),onSuggestionSelected:i,showClearInputIcon:!0,onClickClearInput:o,formatRemoteSuggestions:e=>e.results?.map(e=>({...e,name:e.name?.[0]})),initialQuery:t.values.parent?.name||``,getErrorStateComponent:e=>(0,Z.jsx)(j,{imageUrl:M.TYPEAHEAD_ERROR,onClickTryAgain:e}),getEmptyStateComponent:e=>(0,Z.jsxs)(`div`,{children:[`Couldn't find any matches for `,e]})})}),(0,Z.jsx)(v.Control.Feedback,{type:`invalid`,children:c()})]})}),(0,Z.jsx)(O,{label:`Slug`,name:`slug`,infoText:`Auto generated based on the parent company or person name`,id:`slug`,value:t.values.slug,readOnly:!e.isNew,disabled:!e.isNew,showRequiredStar:!0}),e.contentRegions&&!e.isNew&&(0,Z.jsx)(O,{label:`Content Regions`,name:`contentRegions`,id:`contentRegions`,children:()=>(0,Z.jsx)(`div`,{className:`w-50`,children:(0,Z.jsx)(I,{type:`checkbox`,id:t.values.id,options:e.contentRegions,selected:t.values.contentRegions||[],onUpdate:e=>t.setFieldValue(`contentRegions`,e),readOnly:!0})})}),(0,Z.jsx)(A,{imageType:S.Covers,fieldName:`cover`,uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE}}),(0,Z.jsx)(A,{imageType:S.Logos,fieldName:`logo`,label:`Logo`,overrideDimensions:{width:512,height:512},uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE}}),(0,Z.jsx)(A,{imageType:S.Covers,fieldName:`icon`,label:`Icon`,canRemove:!0,uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE}}),!e.isNew&&(0,Z.jsx)(L,{label:`Background colour`,fieldName:`backgroundColour`}),(0,Z.jsx)(A,{imageType:S.Banners,fieldName:`banner`,uploadAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.UPLOAD_IMAGE},overrideDimensions:ye}),!!e.onVideoUploadComplete&&(0,Z.jsx)(ve,{label:`Video Banner`,fieldName:`videoBanner`,hostedLibraryId:ClickView.Config.Resources.ClickViewRootLibrary,onUploadComplete:e.onVideoUploadComplete}),(0,Z.jsxs)(`div`,{className:`d-flex gap-2`,children:[(0,Z.jsx)(R,{isNew:e.isNew,variant:`dark`}),!e.isNew&&(0,Z.jsx)(l,{appLink:e.deleteAppLink,className:`btn btn-danger`,children:`Delete Channel`})]})]})}function xe(e){let t=e.contentPartner?.links?H.getPartnerLinkByType(e.contentPartner.links,`website`):null,n={id:e.contentPartner?.id,name:e.contentPartner?.name||``,logo:e.contentPartner?.logo||null,icon:e.contentPartner?.icon||null,cover:e.contentPartner?.cover||null,banner:e.contentPartner?.banner||null,description:e.contentPartner?.description||``,slug:e.contentPartner?._slug.value||``,blurb:e.contentPartner?.blurb||``,contentSource:e.contentPartner?.contentSource||1,partnerType:e.contentPartner?.partnerType||2,backgroundColour:e.contentPartner?.metadata?.backgroundColour||null,contentRegions:e.contentPartner?.contentRegions?.data||[],parent:e.contentPartner?.person||e.contentPartner?.company,videoBanner:e.contentPartner?.videoBanner?{id:e.contentPartner?.videoBanner.id,status:e.contentPartner?.videoBanner.status}:null,websiteLink:t||``};function r(){return`/api/search/v4/search/raw?userId=${e.currentUser?.id}&customerid=${e.currentUser?.customerId}`}return(0,Z.jsx)(T,{initialValues:n,validationSchema:le,onSubmit:e.onSave,children:(0,Z.jsx)(be,{isNew:!(e.contentPartner&&e.contentPartner.id),contentRegions:e.contentRegions,getRemoteUrl:r,onVideoUploadComplete:e.onVideoUploadComplete,deleteAppLink:{application:d.CONTENT_PARTNERS,action:u.ContentPartners.DELETE_CONTENT_PARTNER,args:[e.contentPartner?.id]}})})}export{xe as t};
|
|
2
|
+
//# sourceMappingURL=LmwQmHZz2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"4RooerDO2.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/utils/ContentPartnerValidation.ts","../../../../../src/shared/components/upload-video/utils/UploadVideoUtils.ts","../../../../../src/shared/components/upload-video/hooks/useUploadVideo.ts","../../../../../src/shared/components/upload-video/ProcessingVideo.tsx","../../../../../src/shared/components/upload-video/UploadVideoDropzone.tsx","../../../../../src/shared/components/upload-video/UploadVideoLabel.tsx","../../../../../src/shared/components/upload-video/UploadVideoPlayer.tsx","../../../../../src/shared/components/upload-video/UploadVideoProgress.tsx","../../../../../src/shared/components/upload-video/UploadVideo.tsx","../../../../../src/apps/content-partners/components/edit-content-partner/edit-content-partner-form.module.scss","../../../../../src/apps/content-partners/components/edit-content-partner/EditContentPartnerForm.tsx","../../../../../src/apps/content-partners/components/edit-content-partner/EditContentPartner.tsx"],"sourcesContent":["import * as Yup from 'yup';\n\nimport { Company, ContentRegionObject, Person } from 'libs/shared/interfaces';\n\nimport { ImageValidationSchema } from 'shared/utils/validation/ImageValidationSchema';\n\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\n\n// same limit as for companies\nexport const MAX_PARTNER_DESCRIPTION_LENGTH = 4096;\nexport const MAX_BLURB_LENGTH = 60;\n\nexport const ContentPartnerValidationSchema = Yup.object().shape<EditPartnerFormData>({\n name: Yup.string()\n .trim()\n .max(255, 'Name is too long')\n .min(1, 'Name is too short')\n .required('Name is required')\n .default(''),\n\n logo: ImageValidationSchema,\n\n icon: ImageValidationSchema,\n\n banner: ImageValidationSchema,\n\n cover: ImageValidationSchema,\n\n description: Yup.string()\n .trim()\n .required('Description is required')\n .default('')\n .max(MAX_PARTNER_DESCRIPTION_LENGTH, `Descriptions cannot exceed ${MAX_PARTNER_DESCRIPTION_LENGTH} characters`),\n\n contentRegions: Yup.array<ContentRegionObject>()\n .default([]),\n\n slug: Yup.string()\n .trim()\n .required('Slug is required')\n .matches(/^[a-zA-Z0-9-]+$/, 'Slug can only contain letters, numbers, and hyphens'),\n\n parent: Yup.mixed<Company | Person>()\n .required('Parent is required'),\n\n backgroundColour: Yup.string(),\n websiteLink: Yup.string().url('Invalid website link')\n});\n","import { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\n\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\n\nexport type UploadVideoType = 'channel-video-banner';\n\n/**\n * Minimum resolution for each upload type\n*/\nconst UploadVideoTypeResolutionMap: Record<UploadVideoType, [width: number, height: number]> = {\n 'channel-video-banner': [ 1920, 1080 ]\n};\n\nexport const UploadVideoUtils = {\n getValidVideoExtensions: () => FileExtensions.VIDEO.split(','),\n getUploadVideoTypeResolution: (uploadVideoType: UploadVideoType) => UploadVideoTypeResolutionMap[uploadVideoType],\n validateVideoResolutionForType: (type: UploadVideoType, resolution: { width: number, height: number }) => {\n const [ minWidth, minHeight ] = UploadVideoTypeResolutionMap[type];\n return resolution.width >= minWidth && resolution.height >= minHeight;\n },\n /**\n * Returns a minimal playback object for a video url to preview in the player\n */\n getOfflinePlaybackObject: (url: string): PlaybackObject => {\n return {\n videoId: 'preview',\n viewerId: '',\n viewerCustomerId: '',\n region: null,\n files: {\n progressive: [{\n url: url,\n mimeType: 'video/mp4',\n profile: 'hd',\n quality: 1080,\n label: 'Preview'\n }],\n fileToken: ''\n },\n chapters: { list: []},\n subtitles: { list: []},\n resources: { list: []},\n mediaType: 'MasterVideo',\n localCacheAddresses: [],\n mediaId: 'preview',\n settings: {\n showSubtitles: false,\n playbackProfile: 'hd',\n playbackProfileLocalCache: 'hd',\n playbackQuality: '1080',\n playbackQualityLocalCache: '1080',\n playbackQualityFallback: '1080',\n playbackSubtitleSizeDefault: 'medium'\n },\n title: 'Preview',\n ratingCode: '',\n seriesName: '',\n seasonNumber: 0,\n episodeNumber: 0\n };\n },\n getVideoResolution: async (file: File): Promise<{ width: number, height: number }> => {\n return new Promise((resolve, reject) => {\n if (!file.type.startsWith('video/')) {\n reject(new Error('The file is not a video'));\n }\n\n const video = document.createElement('video');\n const objectUrl = URL.createObjectURL(file);\n\n video.addEventListener('loadedmetadata', () => {\n const width = video.videoWidth;\n const height = video.videoHeight;\n URL.revokeObjectURL(objectUrl);\n resolve({ width, height });\n });\n\n video.addEventListener('error', () => {\n URL.revokeObjectURL(objectUrl);\n reject(new Error('Failed to load video metadata'));\n });\n\n video.src = objectUrl;\n });\n }\n};\n","import React from 'react';\n\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { UploadEventNames } from 'libs/shared/apps/upload/constants/UploadConstants';\nimport { BaseVideoUploadService } from 'libs/shared/apps/upload/services/UploadService';\nimport { SharedServiceChannels } from 'libs/shared/constants/RadioChannels';\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\nimport { PendingProcessOrigin } from 'libs/shared/enums/PendingProcessOrigin';\nimport { SubtitleExtractionOptions } from 'libs/shared/enums/SubtitleExtractionOptions';\nimport { VideoOrigin } from 'libs/shared/enums/VideoOrigin';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useListenOn } from 'libs/shared/hooks/UseListenOn';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { PendingItem } from '../UploadVideo';\nimport { UploadVideoType, UploadVideoUtils } from '../utils/UploadVideoUtils';\n\ninterface UploadVideoResponse {\n id: string;\n url: string;\n extension: string;\n name: string;\n size: number;\n}\n\ntype UploadStatus = 'idle' | 'uploading';\n\ninterface UseUploadVideoOptions {\n type: UploadVideoType;\n hostedLibraryId: string;\n validVideoExtensions: string[];\n setFieldError: (error: string) => void;\n setFieldValue: (fileUrl: string) => void;\n setFieldTouched: (touched: boolean) => void;\n onUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n}\n\nexport function useUploadVideo(options: UseUploadVideoOptions) {\n const alert = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n const [ uploadProgress, setUploadProgress ] = React.useState(0);\n const [ file, setFile ] = React.useState<File | null>(null);\n const [ status, setStatus ] = React.useState<UploadStatus>('idle');\n const [ uploadedFileId, setUploadedFileId ] = React.useState<string | null>(null);\n\n const videoUploadService = useService<BaseVideoUploadService>(SharedServices.VideoUpload);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n async function handleUploadSuccess(uploadedFile: File, response: UploadVideoResponse) {\n // Only process if this is the file we are currently tracking\n if (!file || !uploadedFile || uploadedFile !== file) return;\n if (!response || !response.url) return;\n \n const newFileId = response.id;\n const newFileUrl = response.url;\n \n setUploadedFileId(newFileId);\n setUploadProgress(100);\n\n options.setFieldValue(newFileUrl);\n \n await submit(uploadedFile, newFileId, newFileUrl);\n }\n\n // Handler for files added event - this runs after async processing in service\n function handleFilesAdded(files: File[]) {\n if (!file) return;\n\n // Check if our file is in the added files list\n const matchingFile = Array.from(files).find(f => f === file);\n\n if (!matchingFile)\n return;\n \n const upload = videoUploadService.getUpload(matchingFile);\n if (upload) {\n setUploadedFileId(upload.get('id'));\n }\n }\n\n async function submit(fileToSubmit: File, fileIdToSubmit: string, fileUrlToSubmit: string) {\n if (!currentUser.data) {\n alert.error('Cannot complete upload: User not loaded');\n return;\n }\n\n const upload = videoUploadService.getUpload(fileToSubmit);\n\n if (!upload) {\n alert.error('Error: Video upload not found');\n return;\n }\n \n upload.set('sending', true);\n\n try {\n const pendingItem = await fetchAsync<PendingItem>(\n VideoRequests.completeUpload({\n id: upload.get('id'),\n fileId: fileIdToSubmit,\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n libraryId: options.hostedLibraryId,\n fileUrl: fileUrlToSubmit,\n pendingProcessOrigin: PendingProcessOrigin.Upload,\n origin: VideoOrigin.Curator,\n video: {\n name: fileToSubmit.name,\n description: '',\n productionYear: new Date().getFullYear(),\n productionCompanies: [],\n producers: [],\n distributors: [],\n directors: [],\n subtitles: []\n },\n subtitleOptions: {\n subtitleExtractOptions: SubtitleExtractionOptions.EmbeddedOnly\n },\n autoCaption: false\n })\n );\n\n // Leave it upto the parent component to handle actual association of video with any object\n await options.onUploadComplete?.(pendingItem);\n } catch {\n alert.error('There was an error uploading the video. Please try again.');\n } finally {\n setStatus('idle');\n }\n }\n\n function onSelectFile(file: File) {\n // Check if its a valid video extension\n const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();\n\n if (!options.validVideoExtensions.includes(fileExtension)) {\n options.setFieldError(`The file must be a video file. Supported extensions are ${options.validVideoExtensions.join(', ')}`);\n return;\n }\n\n // Get video resolution\n UploadVideoUtils.getVideoResolution(file).then(resolution => {\n const [ minWidth, minHeight ] = UploadVideoUtils.getUploadVideoTypeResolution(options.type);\n if (!UploadVideoUtils.validateVideoResolutionForType(options.type, resolution)) {\n options.setFieldError(`The video must be at least ${minWidth} x ${minHeight}px. Uploaded video is ${resolution.width} x ${resolution.height}px.`);\n return;\n }\n \n // Reset state before starting upload\n setUploadedFileId(null);\n setStatus('uploading');\n setUploadProgress(0);\n setFile(file);\n options.setFieldTouched(true);\n videoUploadService.addFiles([file]);\n }).catch(() => {\n alert.error('Failed to get video resolution. Please try again later.');\n });\n }\n\n /**\n * Event listeners / Side effects below\n */\n \n useListenOn(\n SharedServiceChannels.VIDEO_UPLOAD,\n 'progress',\n (id: string, percentage: number) => {\n if (!uploadedFileId || id === uploadedFileId) {\n setUploadProgress(Math.floor(percentage));\n }\n }\n );\n\n useListenOn(\n SharedServiceChannels.VIDEO_UPLOAD,\n UploadEventNames.UPLOAD_SUCCESS,\n handleUploadSuccess,\n [ file, submit ]\n );\n\n useListenOn(\n SharedServiceChannels.VIDEO_UPLOAD,\n UploadEventNames.FILES_ADDED,\n handleFilesAdded,\n [ file, videoUploadService ]\n );\n\n return {\n status,\n uploadProgress,\n onSelectFile\n };\n}\n","import React from 'react';\n\nimport { LocationUtils } from 'libs/common/backbone/core/LocationUtils';\n\nexport function ProcessingVideo() {\n return (\n <div className='mt-3'>\n <div className='d-flex flex-column justify-content-center align-items-center gap-3 mb-1'>\n <span>The video is being processed currently. Please check back later.</span>\n <button className='btn btn-outline-dark' onClick={() => LocationUtils.Reload()}>Reload</button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { FileSelectButton } from 'libs/shared/components/file-select-button/FileSelectButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UploadSvg } from 'libs/shared/images/svg/actions/UploadSvg';\n\nimport { UploadVideoUtils } from './utils/UploadVideoUtils';\n\ninterface UploadVideoDropzoneProps {\n onSelectFile: (file: File) => void;\n hasError: boolean;\n}\n\nconst validVideoExtensions = UploadVideoUtils.getValidVideoExtensions();\n\nexport function UploadVideoDropzone(props: UploadVideoDropzoneProps) {\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDropAccepted: acceptedFiles => props.onSelectFile(acceptedFiles[0]),\n noClick: true,\n multiple: false,\n noKeyboard: true,\n accept: {\n 'video/*': validVideoExtensions\n }\n });\n \n return (\n <div {...getRootProps()} className={classNames('border rounded position-relative p-5 mt-2 text-center bg-light overflow-hidden', !!props.hasError && 'is-invalid')}>\n <input {...getInputProps()} />\n <div>\n <div className='mb-2 px-3'>\n Drag and drop a video to upload\n </div>\n <FileSelectButton\n svg={UploadSvg}\n className='btn btn-outline-dark'\n mimeType={FileExtensions.VIDEO}\n onFileSelect={fileList => props.onSelectFile(Array.from(fileList)[0])}\n >\n Upload Video\n </FileSelectButton>\n </div>\n {isDragActive && (\n <div className='position-absolute w-100 h-100 top-0 start-0 d-flex align-items-center justify-content-center bg-light gap-2'>\n <SvgContainer svg={UploadSvg} size={SvgContainerSize.Large} />\n <span className='h4 mb-0'>Drop file here to begin uploading</span>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\n\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FileSelectButton } from 'libs/shared/components/file-select-button/FileSelectButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { UploadSvg } from 'libs/shared/images/svg/actions/UploadSvg';\n\ninterface UploadVideoLabelProps {\n label: string;\n showRequiredStar?: boolean;\n note?: string;\n showReplaceFileButton?: boolean;\n replaceFileButtonHandler?: (file: File) => void;\n deleteFileButtonHandler?: () => void;\n resolution: [width: number, height: number];\n}\n\nexport function UploadVideoLabel(props: UploadVideoLabelProps) {\n const [ minWidth, minHeight ] = props.resolution;\n\n return (\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label>{props.label}</label>\n {props.showRequiredStar && <span className='text-danger'>*</span>}\n <em className='ms-1 text-secondary'>\n {props.note ?? `(Minimum resolution is ${minWidth} x ${minHeight}px)`}\n </em>\n </div>\n <div className='d-flex align-items-center'>\n {props.showReplaceFileButton && !!props.replaceFileButtonHandler &&\n <Tooltip title='Replace video' placement='top' spanHack>\n <FileSelectButton\n className='btn btn-link'\n mimeType={FileExtensions.VIDEO}\n svg={UploadSvg}\n svgSize={SvgContainerSize.Standard}\n onFileSelect={fileList => props.replaceFileButtonHandler?.(Array.from(fileList)[0])}\n />\n </Tooltip>\n }\n\n {props.showReplaceFileButton && !!props.deleteFileButtonHandler && (\n <Tooltip title='Remove video' placement='top' spanHack>\n <DivButton onClick={props.deleteFileButtonHandler}>\n <SvgContainer svg={DeleteSvg} size={SvgContainerSize.Standard}></SvgContainer>\n </DivButton>\n </Tooltip>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\ninterface UploadVideoPlayerProps {\n playerApiUrl: URL;\n viewKey?: string;\n offlinePlaybackObject?: PlaybackObject;\n hasError?: boolean;\n}\n\nexport function UploadVideoPlayer(props: React.PropsWithChildren<UploadVideoPlayerProps>) {\n return (\n <div className={classNames('mt-2', props.hasError && 'is-invalid')}>\n <ClickViewPlayer\n viewKey={props.viewKey}\n offlinePlaybackObject={props.offlinePlaybackObject}\n playerApi={props.playerApiUrl}\n autoplay={false}\n controls\n />\n {props.children}\n </div>\n );\n}\n","import React from 'react';\nimport { ProgressBar } from 'react-bootstrap';\n\ninterface UploadVideoProgressProps {\n progress: number;\n}\n\nexport function UploadVideoProgress(props: UploadVideoProgressProps) {\n return (\n <div className='mt-3'>\n <div className='d-flex justify-content-between mb-1'>\n <span>Uploading...</span>\n <span>{Math.round(props.progress)}%</span>\n </div>\n <ProgressBar\n now={props.progress}\n variant='info'\n animated={props.progress < 100}\n />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { getIn, useFormikContext } from 'formik';\n\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { ChevronDownSvg } from 'libs/shared/images/svg/arrows/ChevronDownSvg';\nimport { ChevronUpSvg } from 'libs/shared/images/svg/arrows/ChevronUpSvg';\nimport { PlayerViewKey } from 'libs/shared/interfaces';\n\nimport { useUploadVideo } from './hooks/useUploadVideo';\nimport { UploadVideoType, UploadVideoUtils } from './utils/UploadVideoUtils';\nimport { ProcessingVideo } from './ProcessingVideo';\nimport { UploadVideoDropzone } from './UploadVideoDropzone';\nimport { UploadVideoLabel } from './UploadVideoLabel';\nimport { UploadVideoPlayer } from './UploadVideoPlayer';\nimport { UploadVideoProgress } from './UploadVideoProgress';\n\nconst playerApiUrl = new URL(ClickView.Config.Urls.PlayerApi);\nconst validVideoExtensions = UploadVideoUtils.getValidVideoExtensions();\n\nexport interface PendingItem {\n masterVideoId: string;\n pendingProcessId: string;\n}\n\nexport interface UploadVideoProps<Values extends HashObject> {\n label: string;\n fieldName: keyof Values & string;\n hostedLibraryId: string;\n showRequiredStar?: boolean;\n onUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n uploadVideoType?: UploadVideoType;\n}\n\nexport function UploadVideo<Values extends HashObject>(props: UploadVideoProps<Values>): React.ReactElement {\n const uploadType = props.uploadVideoType ?? 'channel-video-banner';\n const formikProps = useFormikContext<Values>();\n const formData = formikProps.values[props.fieldName];\n const [ hideContent, setHideContent ] = React.useState(false);\n const {\n status,\n uploadProgress,\n onSelectFile\n } = useUploadVideo({\n type: uploadType,\n hostedLibraryId: props.hostedLibraryId,\n validVideoExtensions: validVideoExtensions,\n setFieldValue: (fileUrl: string) => formikProps.setFieldValue(props.fieldName, { fileUrl }),\n setFieldError: (error: string) => formikProps.setFieldError(props.fieldName, error),\n setFieldTouched: (touched: boolean) => formikProps.setFieldTouched(props.fieldName, touched),\n onUploadComplete: props.onUploadComplete\n });\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n formData?.id &&\n PlayerRequests.createViewKey(formData.id, MediaIdType.MasterObject)\n );\n\n const error = getIn(formikProps.errors, props.fieldName);\n const resolution = UploadVideoUtils.getUploadVideoTypeResolution(uploadType);\n\n const isUploading = status === 'uploading';\n const fileUrl = formData?.fileUrl;\n\n const hasVideo = !!viewKey.data?.viewKey || (!error && !!fileUrl);\n const isProcessing =\n formData?.id &&\n formData?.status === CurationStatus.Processing;\n\n function onDeleteVideoBanner() {\n formikProps.setFieldValue(props.fieldName, undefined);\n }\n\n return (\n <div className='form-group'>\n <div className={classNames('form-control h-auto py-2', !!error && 'border border-danger')}>\n <UploadVideoLabel\n label={props.label}\n showRequiredStar={props.showRequiredStar}\n showReplaceFileButton={hasVideo && !isUploading && !isProcessing}\n replaceFileButtonHandler={onSelectFile}\n deleteFileButtonHandler={onDeleteVideoBanner}\n resolution={resolution}\n />\n {(() => {\n if (isUploading)\n return <UploadVideoProgress progress={uploadProgress} />;\n\n if (isProcessing)\n return <ProcessingVideo />;\n \n if (!hasVideo)\n return <UploadVideoDropzone onSelectFile={onSelectFile} hasError={!!error} />;\n \n return (\n <>\n {!hideContent &&\n <UploadVideoPlayer\n playerApiUrl={playerApiUrl}\n viewKey={viewKey.data?.viewKey}\n offlinePlaybackObject={!viewKey.data?.viewKey && fileUrl ?\n UploadVideoUtils.getOfflinePlaybackObject(fileUrl) :\n undefined\n }\n hasError={!!error}\n />\n }\n <div className='d-flex justify-content-center'>\n <SvgContainer\n svg={hideContent ? ChevronDownSvg : ChevronUpSvg}\n size={SvgContainerSize.Large}\n className='svg-container cursor-pointer'\n tooltipSpanHack\n onClick={() => setHideContent(!hideContent)}\n title={hideContent ? 'Show video' : 'Hide video'}\n tooltipPlacement='left'\n />\n </div>\n </>\n );\n })()}\n <Form.Control.Feedback type='invalid'>{error}</Form.Control.Feedback>\n </div>\n </div>\n );\n}\n",":local {\n .input:not(:last-child) {\n padding-bottom: map-get($spacers, 2);\n }\n\n .suggestionsContainer {\n position: relative;\n z-index: 1;\n }\n}","import React from 'react';\nimport { Form as BsForm } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { AppLink as AppLinkComponent } from 'libs/shared/components/app-link/AppLink';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { SearchBar } from 'libs/shared/components/search-bar/SearchBar';\nimport { SelectContentRegion } from 'libs/shared/components/select-content-region/SelectContentRegion';\nimport { TypeaheadErrorState } from 'libs/shared/components/typeahead-error-state/TypeaheadErrorState';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { Company, ContentRegionObject, Person } from 'libs/shared/interfaces';\n\nimport { ImageSelect } from 'shared/components';\nimport { ColorSelect } from 'shared/components/forms/color-select/ColorSelect';\nimport { PendingItem, UploadVideo } from 'shared/components/upload-video/UploadVideo';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\nimport { MAX_PARTNER_DESCRIPTION_LENGTH } from 'apps/content-partners/utils/ContentPartnerValidation';\n\nimport styles from './edit-content-partner-form.module.scss';\n\nconst PARTNER_PROFILE_BANNER_SIZE = { width: 1920, height: 1080 };\n\ninterface EditContentPartnerFormProps {\n isNew: boolean;\n contentRegions?: ContentRegionObject[];\n getRemoteUrl: () => string;\n onVideoUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n deleteAppLink: AppLink;\n}\n\nexport function EditContentPartnerForm(props: EditContentPartnerFormProps): JSX.Element {\n const formikProps = useFormikContext<EditPartnerFormData>();\n\n function setParentFieldValue(obj: Person | Company | null): void {\n formikProps.setFieldValue('parent', obj);\n formikProps.setFieldTouched('parent', true, false);\n }\n\n function onSelect(obj: Person | Company): void {\n setParentFieldValue(obj);\n }\n\n function onChangeName(e: React.ChangeEvent<HTMLInputElement>): void {\n formikProps.setFieldValue('name', e.target.value);\n\n if (!props.isNew)\n return;\n\n formikProps.setFieldValue('slug', TextHelper.slugify(e.target.value) ?? '');\n formikProps.setFieldTouched('slug', true);\n }\n\n function onClickClearInput(): void {\n setParentFieldValue(null);\n }\n\n const showParentError = formikProps.touched.parent && formikProps.errors.parent;\n\n function getParentError(): string {\n if (typeof formikProps.errors.parent === 'string') {\n return formikProps.errors.parent;\n }\n\n return '';\n }\n\n return (\n <Form>\n <FormField<EditPartnerFormData>\n label='Name'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this content partner'\n onChange={onChangeName}\n showRequiredStar\n />\n\n <FormField<EditPartnerFormData>\n as='textarea'\n rows={2}\n label='Description'\n name='description'\n id='description'\n value={formikProps.values.description}\n placeholder='Enter a description for this content partner'\n maxLength={MAX_PARTNER_DESCRIPTION_LENGTH}\n showCharacterCounter\n showRequiredStar\n />\n\n <FormField<EditPartnerFormData>\n label='Website Link'\n name='websiteLink'\n id='websiteLink'\n value={formikProps.values.websiteLink}\n placeholder='Enter a website link for this content partner'\n />\n\n <FormField<EditPartnerFormData>\n label='Parent'\n name='parentId'\n id='parentId'\n showRequiredStar\n >\n {() => {\n return (\n <div className='form-group'>\n <div className={classNames(showParentError && 'is-invalid')}>\n <SearchBar<Company | Person>\n renderAsForm={false}\n theme={() => ({\n suggestionsContainerOpen: classNames('pb-0 pt-1 overflow-hidden bg-white border rounded position-absolute w-100', styles.suggestions),\n suggestionsContainer: `${styles.suggestionsContainer}`,\n input: classNames(showParentError && 'border-danger')\n })}\n activationLength={2}\n placeholder='Search for a parent company or person...'\n clearQueryOnSelect={true}\n searchIconPlacement={false}\n debounceTime={300}\n allowableSuggestionFetchRequestedReasons={[ 'input-changed', 'input-focused' ]}\n getRemoteUrl={() => props.getRemoteUrl()}\n getRemotePostBody={(q: string) => {\n return {\n query: q,\n indices: [{ index: 'company' }, { index: 'person' }],\n searchType: 'content'\n };\n }}\n onSuggestionSelected={onSelect}\n showClearInputIcon\n onClickClearInput={onClickClearInput}\n formatRemoteSuggestions={(suggestions: SearchResults<Company | Person>) => {\n return suggestions.results?.map((suggestion: Company | Person) => {\n return {\n ...suggestion,\n name: suggestion.name?.[0]\n };\n });\n }}\n initialQuery={formikProps.values.parent?.name || ''}\n getErrorStateComponent={onClickTryAgain =>\n <TypeaheadErrorState imageUrl={ImageUrls.TYPEAHEAD_ERROR} onClickTryAgain={onClickTryAgain} />\n }\n getEmptyStateComponent={query => (\n <div>\n Couldn't find any matches for {query}\n </div>\n )}\n />\n </div>\n <BsForm.Control.Feedback type='invalid'>\n {getParentError()}\n </BsForm.Control.Feedback>\n </div>\n );\n }}\n\n </FormField>\n\n <FormField<EditPartnerFormData>\n label='Slug'\n name='slug'\n infoText='Auto generated based on the parent company or person name'\n \n id='slug'\n value={formikProps.values.slug}\n readOnly={!props.isNew}\n disabled={!props.isNew}\n showRequiredStar\n />\n\n {props.contentRegions && !props.isNew && (\n <FormField<EditPartnerFormData>\n label='Content Regions'\n name='contentRegions'\n id='contentRegions'\n >\n {() => (\n <div className='w-50'>\n <SelectContentRegion\n type='checkbox'\n id={formikProps.values.id}\n options={props.contentRegions}\n selected={formikProps.values.contentRegions || []}\n onUpdate={contentRegions => formikProps.setFieldValue('contentRegions', contentRegions)}\n readOnly\n />\n </div>\n )}\n </FormField>\n )}\n\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Covers}\n fieldName='cover'\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n />\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Logos}\n fieldName='logo'\n label='Logo'\n overrideDimensions={{ width: 512, height: 512 }}\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n />\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Covers}\n fieldName='icon'\n label='Icon'\n canRemove\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n />\n\n {!props.isNew && (\n <ColorSelect\n label='Background colour'\n fieldName='backgroundColour'\n />\n )}\n\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Banners}\n fieldName='banner'\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n overrideDimensions={PARTNER_PROFILE_BANNER_SIZE}\n />\n\n {!!props.onVideoUploadComplete && (\n <UploadVideo<EditPartnerFormData>\n label='Video Banner'\n fieldName='videoBanner'\n hostedLibraryId={ClickView.Config.Resources.ClickViewRootLibrary}\n onUploadComplete={props.onVideoUploadComplete}\n />\n )}\n <div className='d-flex gap-2'>\n <FormButtons isNew={props.isNew} variant='dark' />\n {!props.isNew && (\n <AppLinkComponent\n appLink={props.deleteAppLink}\n className='btn btn-danger'\n >\n Delete Channel\n </AppLinkComponent>\n )}\n </div>\n </Form>\n );\n}\n","import React from 'react';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ContentRegionObject, CurrentUser } from 'libs/shared/interfaces';\n\nimport { PendingItem } from 'shared/components/upload-video/UploadVideo';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ContentPartnerProfile } from 'shared/interfaces/models/ContentPartnerProfile';\n\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\nimport { ContentPartnerValidationSchema } from 'apps/content-partners/utils/ContentPartnerValidation';\n\nimport { EditContentPartnerForm } from './EditContentPartnerForm';\n\ninterface EditContentPartnerProps {\n onVideoUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n onSave: (data: EditPartnerFormData, onDone?: () => void) => Promise<void>;\n contentPartner?: ContentPartnerProfile;\n contentRegions?: ContentRegionObject[];\n currentUser: CurrentUser;\n}\n\nexport function EditContentPartner(props: EditContentPartnerProps): JSX.Element {\n const websiteLink = props.contentPartner?.links ?\n ContentPartnersHelper.getPartnerLinkByType(props.contentPartner.links, 'website') :\n null;\n \n const initialValues: EditPartnerFormData = {\n id: props.contentPartner?.id,\n name: props.contentPartner?.name || '',\n logo: props.contentPartner?.logo || null,\n icon: props.contentPartner?.icon || null,\n cover: props.contentPartner?.cover || null,\n banner: props.contentPartner?.banner || null,\n description: props.contentPartner?.description || '',\n slug: props.contentPartner?._slug.value || '',\n blurb: props.contentPartner?.blurb || '',\n contentSource: props.contentPartner?.contentSource || 1,\n partnerType: props.contentPartner?.partnerType || 2,\n backgroundColour: props.contentPartner?.metadata?.backgroundColour || null,\n contentRegions: props.contentPartner?.contentRegions?.data || [],\n parent: props.contentPartner?.person || props.contentPartner?.company,\n videoBanner: props.contentPartner?.videoBanner ?\n { id: props.contentPartner?.videoBanner.id, status: props.contentPartner?.videoBanner.status } :\n null,\n websiteLink: websiteLink || ''\n };\n\n function getRemoteUrl (): string {\n return `/api/search/v4/search/raw?userId=${props.currentUser?.id}&customerid=${props.currentUser?.customerId}`;\n }\n\n return (\n <FormWrapper<EditPartnerFormData>\n initialValues={initialValues}\n validationSchema={ContentPartnerValidationSchema}\n onSubmit={props.onSave}\n >\n <EditContentPartnerForm\n isNew={!(props.contentPartner && props.contentPartner.id)}\n contentRegions={props.contentRegions}\n getRemoteUrl={getRemoteUrl}\n onVideoUploadComplete={props.onVideoUploadComplete}\n deleteAppLink={{\n application: AppChannels.CONTENT_PARTNERS,\n action: Actions.ContentPartners.DELETE_CONTENT_PARTNER,\n args: [props.contentPartner?.id]\n }}\n />\n </FormWrapper>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LmwQmHZz2.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/utils/ContentPartnerValidation.ts","../../../../../src/shared/components/upload-video/utils/UploadVideoUtils.ts","../../../../../src/shared/components/upload-video/hooks/useUploadVideo.ts","../../../../../src/shared/components/upload-video/ProcessingVideo.tsx","../../../../../src/shared/components/upload-video/UploadVideoDropzone.tsx","../../../../../src/shared/components/upload-video/UploadVideoLabel.tsx","../../../../../src/shared/components/upload-video/UploadVideoPlayer.tsx","../../../../../src/shared/components/upload-video/UploadVideoProgress.tsx","../../../../../src/shared/components/upload-video/UploadVideo.tsx","../../../../../src/apps/content-partners/components/edit-content-partner/edit-content-partner-form.module.scss","../../../../../src/apps/content-partners/components/edit-content-partner/EditContentPartnerForm.tsx","../../../../../src/apps/content-partners/components/edit-content-partner/EditContentPartner.tsx"],"sourcesContent":["import * as Yup from 'yup';\n\nimport { Company, ContentRegionObject, Person } from 'libs/shared/interfaces';\n\nimport { ImageValidationSchema } from 'shared/utils/validation/ImageValidationSchema';\n\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\n\n// same limit as for companies\nexport const MAX_PARTNER_DESCRIPTION_LENGTH = 4096;\nexport const MAX_BLURB_LENGTH = 60;\n\nexport const ContentPartnerValidationSchema = Yup.object().shape<EditPartnerFormData>({\n name: Yup.string()\n .trim()\n .max(255, 'Name is too long')\n .min(1, 'Name is too short')\n .required('Name is required')\n .default(''),\n\n logo: ImageValidationSchema,\n\n icon: ImageValidationSchema,\n\n banner: ImageValidationSchema,\n\n cover: ImageValidationSchema,\n\n description: Yup.string()\n .trim()\n .required('Description is required')\n .default('')\n .max(MAX_PARTNER_DESCRIPTION_LENGTH, `Descriptions cannot exceed ${MAX_PARTNER_DESCRIPTION_LENGTH} characters`),\n\n contentRegions: Yup.array<ContentRegionObject>()\n .default([]),\n\n slug: Yup.string()\n .trim()\n .required('Slug is required')\n .matches(/^[a-zA-Z0-9-]+$/, 'Slug can only contain letters, numbers, and hyphens'),\n\n parent: Yup.mixed<Company | Person>()\n .required('Parent is required'),\n\n backgroundColour: Yup.string(),\n websiteLink: Yup.string().url('Invalid website link')\n});\n","import { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\n\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\n\nexport type UploadVideoType = 'channel-video-banner';\n\n/**\n * Minimum resolution for each upload type\n*/\nconst UploadVideoTypeResolutionMap: Record<UploadVideoType, [width: number, height: number]> = {\n 'channel-video-banner': [ 1920, 1080 ]\n};\n\nexport const UploadVideoUtils = {\n getValidVideoExtensions: () => FileExtensions.VIDEO.split(','),\n getUploadVideoTypeResolution: (uploadVideoType: UploadVideoType) => UploadVideoTypeResolutionMap[uploadVideoType],\n validateVideoResolutionForType: (type: UploadVideoType, resolution: { width: number, height: number }) => {\n const [ minWidth, minHeight ] = UploadVideoTypeResolutionMap[type];\n return resolution.width >= minWidth && resolution.height >= minHeight;\n },\n /**\n * Returns a minimal playback object for a video url to preview in the player\n */\n getOfflinePlaybackObject: (url: string): PlaybackObject => {\n return {\n videoId: 'preview',\n viewerId: '',\n viewerCustomerId: '',\n region: null,\n files: {\n progressive: [{\n url: url,\n mimeType: 'video/mp4',\n profile: 'hd',\n quality: 1080,\n label: 'Preview'\n }],\n fileToken: ''\n },\n chapters: { list: []},\n subtitles: { list: []},\n resources: { list: []},\n mediaType: 'MasterVideo',\n localCacheAddresses: [],\n mediaId: 'preview',\n settings: {\n showSubtitles: false,\n playbackProfile: 'hd',\n playbackProfileLocalCache: 'hd',\n playbackQuality: '1080',\n playbackQualityLocalCache: '1080',\n playbackQualityFallback: '1080',\n playbackSubtitleSizeDefault: 'medium'\n },\n title: 'Preview',\n ratingCode: '',\n seriesName: '',\n seasonNumber: 0,\n episodeNumber: 0\n };\n },\n getVideoResolution: async (file: File): Promise<{ width: number, height: number }> => {\n return new Promise((resolve, reject) => {\n if (!file.type.startsWith('video/')) {\n reject(new Error('The file is not a video'));\n }\n\n const video = document.createElement('video');\n const objectUrl = URL.createObjectURL(file);\n\n video.addEventListener('loadedmetadata', () => {\n const width = video.videoWidth;\n const height = video.videoHeight;\n URL.revokeObjectURL(objectUrl);\n resolve({ width, height });\n });\n\n video.addEventListener('error', () => {\n URL.revokeObjectURL(objectUrl);\n reject(new Error('Failed to load video metadata'));\n });\n\n video.src = objectUrl;\n });\n }\n};\n","import React from 'react';\n\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { UploadEventNames } from 'libs/shared/apps/upload/constants/UploadConstants';\nimport { BaseVideoUploadService } from 'libs/shared/apps/upload/services/UploadService';\nimport { SharedServiceChannels } from 'libs/shared/constants/RadioChannels';\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\nimport { PendingProcessOrigin } from 'libs/shared/enums/PendingProcessOrigin';\nimport { SubtitleExtractionOptions } from 'libs/shared/enums/SubtitleExtractionOptions';\nimport { VideoOrigin } from 'libs/shared/enums/VideoOrigin';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useListenOn } from 'libs/shared/hooks/UseListenOn';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { PendingItem } from '../UploadVideo';\nimport { UploadVideoType, UploadVideoUtils } from '../utils/UploadVideoUtils';\n\ninterface UploadVideoResponse {\n id: string;\n url: string;\n extension: string;\n name: string;\n size: number;\n}\n\ntype UploadStatus = 'idle' | 'uploading';\n\ninterface UseUploadVideoOptions {\n type: UploadVideoType;\n hostedLibraryId: string;\n validVideoExtensions: string[];\n setFieldError: (error: string) => void;\n setFieldValue: (fileUrl: string) => void;\n setFieldTouched: (touched: boolean) => void;\n onUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n}\n\nexport function useUploadVideo(options: UseUploadVideoOptions) {\n const alert = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n const [ uploadProgress, setUploadProgress ] = React.useState(0);\n const [ file, setFile ] = React.useState<File | null>(null);\n const [ status, setStatus ] = React.useState<UploadStatus>('idle');\n const [ uploadedFileId, setUploadedFileId ] = React.useState<string | null>(null);\n\n const videoUploadService = useService<BaseVideoUploadService>(SharedServices.VideoUpload);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n async function handleUploadSuccess(uploadedFile: File, response: UploadVideoResponse) {\n // Only process if this is the file we are currently tracking\n if (!file || !uploadedFile || uploadedFile !== file) return;\n if (!response || !response.url) return;\n \n const newFileId = response.id;\n const newFileUrl = response.url;\n \n setUploadedFileId(newFileId);\n setUploadProgress(100);\n\n options.setFieldValue(newFileUrl);\n \n await submit(uploadedFile, newFileId, newFileUrl);\n }\n\n // Handler for files added event - this runs after async processing in service\n function handleFilesAdded(files: File[]) {\n if (!file) return;\n\n // Check if our file is in the added files list\n const matchingFile = Array.from(files).find(f => f === file);\n\n if (!matchingFile)\n return;\n \n const upload = videoUploadService.getUpload(matchingFile);\n if (upload) {\n setUploadedFileId(upload.get('id'));\n }\n }\n\n async function submit(fileToSubmit: File, fileIdToSubmit: string, fileUrlToSubmit: string) {\n if (!currentUser.data) {\n alert.error('Cannot complete upload: User not loaded');\n return;\n }\n\n const upload = videoUploadService.getUpload(fileToSubmit);\n\n if (!upload) {\n alert.error('Error: Video upload not found');\n return;\n }\n \n upload.set('sending', true);\n\n try {\n const pendingItem = await fetchAsync<PendingItem>(\n VideoRequests.completeUpload({\n id: upload.get('id'),\n fileId: fileIdToSubmit,\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n libraryId: options.hostedLibraryId,\n fileUrl: fileUrlToSubmit,\n pendingProcessOrigin: PendingProcessOrigin.Upload,\n origin: VideoOrigin.Curator,\n video: {\n name: fileToSubmit.name,\n description: '',\n productionYear: new Date().getFullYear(),\n productionCompanies: [],\n producers: [],\n distributors: [],\n directors: [],\n subtitles: []\n },\n subtitleOptions: {\n subtitleExtractOptions: SubtitleExtractionOptions.EmbeddedOnly\n },\n autoCaption: false\n })\n );\n\n // Leave it upto the parent component to handle actual association of video with any object\n await options.onUploadComplete?.(pendingItem);\n } catch {\n alert.error('There was an error uploading the video. Please try again.');\n } finally {\n setStatus('idle');\n }\n }\n\n function onSelectFile(file: File) {\n // Check if its a valid video extension\n const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();\n\n if (!options.validVideoExtensions.includes(fileExtension)) {\n options.setFieldError(`The file must be a video file. Supported extensions are ${options.validVideoExtensions.join(', ')}`);\n return;\n }\n\n // Get video resolution\n UploadVideoUtils.getVideoResolution(file).then(resolution => {\n const [ minWidth, minHeight ] = UploadVideoUtils.getUploadVideoTypeResolution(options.type);\n if (!UploadVideoUtils.validateVideoResolutionForType(options.type, resolution)) {\n options.setFieldError(`The video must be at least ${minWidth} x ${minHeight}px. Uploaded video is ${resolution.width} x ${resolution.height}px.`);\n return;\n }\n \n // Reset state before starting upload\n setUploadedFileId(null);\n setStatus('uploading');\n setUploadProgress(0);\n setFile(file);\n options.setFieldTouched(true);\n videoUploadService.addFiles([file]);\n }).catch(() => {\n alert.error('Failed to get video resolution. Please try again later.');\n });\n }\n\n /**\n * Event listeners / Side effects below\n */\n \n useListenOn(\n SharedServiceChannels.VIDEO_UPLOAD,\n 'progress',\n (id: string, percentage: number) => {\n if (!uploadedFileId || id === uploadedFileId) {\n setUploadProgress(Math.floor(percentage));\n }\n }\n );\n\n useListenOn(\n SharedServiceChannels.VIDEO_UPLOAD,\n UploadEventNames.UPLOAD_SUCCESS,\n handleUploadSuccess,\n [ file, submit ]\n );\n\n useListenOn(\n SharedServiceChannels.VIDEO_UPLOAD,\n UploadEventNames.FILES_ADDED,\n handleFilesAdded,\n [ file, videoUploadService ]\n );\n\n return {\n status,\n uploadProgress,\n onSelectFile\n };\n}\n","import React from 'react';\n\nimport { LocationUtils } from 'libs/common/backbone/core/LocationUtils';\n\nexport function ProcessingVideo() {\n return (\n <div className='mt-3'>\n <div className='d-flex flex-column justify-content-center align-items-center gap-3 mb-1'>\n <span>The video is being processed currently. Please check back later.</span>\n <button className='btn btn-outline-dark' onClick={() => LocationUtils.Reload()}>Reload</button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { FileSelectButton } from 'libs/shared/components/file-select-button/FileSelectButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UploadSvg } from 'libs/shared/images/svg/actions/UploadSvg';\n\nimport { UploadVideoUtils } from './utils/UploadVideoUtils';\n\ninterface UploadVideoDropzoneProps {\n onSelectFile: (file: File) => void;\n hasError: boolean;\n}\n\nconst validVideoExtensions = UploadVideoUtils.getValidVideoExtensions();\n\nexport function UploadVideoDropzone(props: UploadVideoDropzoneProps) {\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDropAccepted: acceptedFiles => props.onSelectFile(acceptedFiles[0]),\n noClick: true,\n multiple: false,\n noKeyboard: true,\n accept: {\n 'video/*': validVideoExtensions\n }\n });\n \n return (\n <div {...getRootProps()} className={classNames('border rounded position-relative p-5 mt-2 text-center bg-light overflow-hidden', !!props.hasError && 'is-invalid')}>\n <input {...getInputProps()} />\n <div>\n <div className='mb-2 px-3'>\n Drag and drop a video to upload\n </div>\n <FileSelectButton\n svg={UploadSvg}\n className='btn btn-outline-dark'\n mimeType={FileExtensions.VIDEO}\n onFileSelect={fileList => props.onSelectFile(Array.from(fileList)[0])}\n >\n Upload Video\n </FileSelectButton>\n </div>\n {isDragActive && (\n <div className='position-absolute w-100 h-100 top-0 start-0 d-flex align-items-center justify-content-center bg-light gap-2'>\n <SvgContainer svg={UploadSvg} size={SvgContainerSize.Large} />\n <span className='h4 mb-0'>Drop file here to begin uploading</span>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\n\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FileSelectButton } from 'libs/shared/components/file-select-button/FileSelectButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { UploadSvg } from 'libs/shared/images/svg/actions/UploadSvg';\n\ninterface UploadVideoLabelProps {\n label: string;\n showRequiredStar?: boolean;\n note?: string;\n showReplaceFileButton?: boolean;\n replaceFileButtonHandler?: (file: File) => void;\n deleteFileButtonHandler?: () => void;\n resolution: [width: number, height: number];\n}\n\nexport function UploadVideoLabel(props: UploadVideoLabelProps) {\n const [ minWidth, minHeight ] = props.resolution;\n\n return (\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label>{props.label}</label>\n {props.showRequiredStar && <span className='text-danger'>*</span>}\n <em className='ms-1 text-secondary'>\n {props.note ?? `(Minimum resolution is ${minWidth} x ${minHeight}px)`}\n </em>\n </div>\n <div className='d-flex align-items-center'>\n {props.showReplaceFileButton && !!props.replaceFileButtonHandler &&\n <Tooltip title='Replace video' placement='top' spanHack>\n <FileSelectButton\n className='btn btn-link'\n mimeType={FileExtensions.VIDEO}\n svg={UploadSvg}\n svgSize={SvgContainerSize.Standard}\n onFileSelect={fileList => props.replaceFileButtonHandler?.(Array.from(fileList)[0])}\n />\n </Tooltip>\n }\n\n {props.showReplaceFileButton && !!props.deleteFileButtonHandler && (\n <Tooltip title='Remove video' placement='top' spanHack>\n <DivButton onClick={props.deleteFileButtonHandler}>\n <SvgContainer svg={DeleteSvg} size={SvgContainerSize.Standard}></SvgContainer>\n </DivButton>\n </Tooltip>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\ninterface UploadVideoPlayerProps {\n playerApiUrl: URL;\n viewKey?: string;\n offlinePlaybackObject?: PlaybackObject;\n hasError?: boolean;\n}\n\nexport function UploadVideoPlayer(props: React.PropsWithChildren<UploadVideoPlayerProps>) {\n return (\n <div className={classNames('mt-2', props.hasError && 'is-invalid')}>\n <ClickViewPlayer\n viewKey={props.viewKey}\n offlinePlaybackObject={props.offlinePlaybackObject}\n playerApi={props.playerApiUrl}\n autoplay={false}\n controls\n />\n {props.children}\n </div>\n );\n}\n","import React from 'react';\nimport { ProgressBar } from 'react-bootstrap';\n\ninterface UploadVideoProgressProps {\n progress: number;\n}\n\nexport function UploadVideoProgress(props: UploadVideoProgressProps) {\n return (\n <div className='mt-3'>\n <div className='d-flex justify-content-between mb-1'>\n <span>Uploading...</span>\n <span>{Math.round(props.progress)}%</span>\n </div>\n <ProgressBar\n now={props.progress}\n variant='info'\n animated={props.progress < 100}\n />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { getIn, useFormikContext } from 'formik';\n\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { ChevronDownSvg } from 'libs/shared/images/svg/arrows/ChevronDownSvg';\nimport { ChevronUpSvg } from 'libs/shared/images/svg/arrows/ChevronUpSvg';\nimport { PlayerViewKey } from 'libs/shared/interfaces';\n\nimport { useUploadVideo } from './hooks/useUploadVideo';\nimport { UploadVideoType, UploadVideoUtils } from './utils/UploadVideoUtils';\nimport { ProcessingVideo } from './ProcessingVideo';\nimport { UploadVideoDropzone } from './UploadVideoDropzone';\nimport { UploadVideoLabel } from './UploadVideoLabel';\nimport { UploadVideoPlayer } from './UploadVideoPlayer';\nimport { UploadVideoProgress } from './UploadVideoProgress';\n\nconst playerApiUrl = new URL(ClickView.Config.Urls.PlayerApi);\nconst validVideoExtensions = UploadVideoUtils.getValidVideoExtensions();\n\nexport interface PendingItem {\n masterVideoId: string;\n pendingProcessId: string;\n}\n\nexport interface UploadVideoProps<Values extends HashObject> {\n label: string;\n fieldName: keyof Values & string;\n hostedLibraryId: string;\n showRequiredStar?: boolean;\n onUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n uploadVideoType?: UploadVideoType;\n}\n\nexport function UploadVideo<Values extends HashObject>(props: UploadVideoProps<Values>): React.ReactElement {\n const uploadType = props.uploadVideoType ?? 'channel-video-banner';\n const formikProps = useFormikContext<Values>();\n const formData = formikProps.values[props.fieldName];\n const [ hideContent, setHideContent ] = React.useState(false);\n const {\n status,\n uploadProgress,\n onSelectFile\n } = useUploadVideo({\n type: uploadType,\n hostedLibraryId: props.hostedLibraryId,\n validVideoExtensions: validVideoExtensions,\n setFieldValue: (fileUrl: string) => formikProps.setFieldValue(props.fieldName, { fileUrl }),\n setFieldError: (error: string) => formikProps.setFieldError(props.fieldName, error),\n setFieldTouched: (touched: boolean) => formikProps.setFieldTouched(props.fieldName, touched),\n onUploadComplete: props.onUploadComplete\n });\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n formData?.id &&\n PlayerRequests.createViewKey(formData.id, MediaIdType.MasterObject)\n );\n\n const error = getIn(formikProps.errors, props.fieldName);\n const resolution = UploadVideoUtils.getUploadVideoTypeResolution(uploadType);\n\n const isUploading = status === 'uploading';\n const fileUrl = formData?.fileUrl;\n\n const hasVideo = !!viewKey.data?.viewKey || (!error && !!fileUrl);\n const isProcessing =\n formData?.id &&\n formData?.status === CurationStatus.Processing;\n\n function onDeleteVideoBanner() {\n formikProps.setFieldValue(props.fieldName, undefined);\n }\n\n return (\n <div className='form-group'>\n <div className={classNames('form-control h-auto py-2', !!error && 'border border-danger')}>\n <UploadVideoLabel\n label={props.label}\n showRequiredStar={props.showRequiredStar}\n showReplaceFileButton={hasVideo && !isUploading && !isProcessing}\n replaceFileButtonHandler={onSelectFile}\n deleteFileButtonHandler={onDeleteVideoBanner}\n resolution={resolution}\n />\n {(() => {\n if (isUploading)\n return <UploadVideoProgress progress={uploadProgress} />;\n\n if (isProcessing)\n return <ProcessingVideo />;\n \n if (!hasVideo)\n return <UploadVideoDropzone onSelectFile={onSelectFile} hasError={!!error} />;\n \n return (\n <>\n {!hideContent &&\n <UploadVideoPlayer\n playerApiUrl={playerApiUrl}\n viewKey={viewKey.data?.viewKey}\n offlinePlaybackObject={!viewKey.data?.viewKey && fileUrl ?\n UploadVideoUtils.getOfflinePlaybackObject(fileUrl) :\n undefined\n }\n hasError={!!error}\n />\n }\n <div className='d-flex justify-content-center'>\n <SvgContainer\n svg={hideContent ? ChevronDownSvg : ChevronUpSvg}\n size={SvgContainerSize.Large}\n className='svg-container cursor-pointer'\n tooltipSpanHack\n onClick={() => setHideContent(!hideContent)}\n title={hideContent ? 'Show video' : 'Hide video'}\n tooltipPlacement='left'\n />\n </div>\n </>\n );\n })()}\n <Form.Control.Feedback type='invalid'>{error}</Form.Control.Feedback>\n </div>\n </div>\n );\n}\n",":local {\n .input:not(:last-child) {\n padding-bottom: map-get($spacers, 2);\n }\n\n .suggestionsContainer {\n position: relative;\n z-index: 1;\n }\n}","import React from 'react';\nimport { Form as BsForm } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { AppLink as AppLinkComponent } from 'libs/shared/components/app-link/AppLink';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { SearchBar } from 'libs/shared/components/search-bar/SearchBar';\nimport { SelectContentRegion } from 'libs/shared/components/select-content-region/SelectContentRegion';\nimport { TypeaheadErrorState } from 'libs/shared/components/typeahead-error-state/TypeaheadErrorState';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { Company, ContentRegionObject, Person } from 'libs/shared/interfaces';\n\nimport { ImageSelect } from 'shared/components';\nimport { ColorSelect } from 'shared/components/forms/color-select/ColorSelect';\nimport { PendingItem, UploadVideo } from 'shared/components/upload-video/UploadVideo';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\nimport { MAX_PARTNER_DESCRIPTION_LENGTH } from 'apps/content-partners/utils/ContentPartnerValidation';\n\nimport styles from './edit-content-partner-form.module.scss';\n\nconst PARTNER_PROFILE_BANNER_SIZE = { width: 1920, height: 1080 };\n\ninterface EditContentPartnerFormProps {\n isNew: boolean;\n contentRegions?: ContentRegionObject[];\n getRemoteUrl: () => string;\n onVideoUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n deleteAppLink: AppLink;\n}\n\nexport function EditContentPartnerForm(props: EditContentPartnerFormProps): JSX.Element {\n const formikProps = useFormikContext<EditPartnerFormData>();\n\n function setParentFieldValue(obj: Person | Company | null): void {\n formikProps.setFieldValue('parent', obj);\n formikProps.setFieldTouched('parent', true, false);\n }\n\n function onSelect(obj: Person | Company): void {\n setParentFieldValue(obj);\n }\n\n function onChangeName(e: React.ChangeEvent<HTMLInputElement>): void {\n formikProps.setFieldValue('name', e.target.value);\n\n if (!props.isNew)\n return;\n\n formikProps.setFieldValue('slug', TextHelper.slugify(e.target.value) ?? '');\n formikProps.setFieldTouched('slug', true);\n }\n\n function onClickClearInput(): void {\n setParentFieldValue(null);\n }\n\n const showParentError = formikProps.touched.parent && formikProps.errors.parent;\n\n function getParentError(): string {\n if (typeof formikProps.errors.parent === 'string') {\n return formikProps.errors.parent;\n }\n\n return '';\n }\n\n return (\n <Form>\n <FormField<EditPartnerFormData>\n label='Name'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this content partner'\n onChange={onChangeName}\n showRequiredStar\n />\n\n <FormField<EditPartnerFormData>\n as='textarea'\n rows={2}\n label='Description'\n name='description'\n id='description'\n value={formikProps.values.description}\n placeholder='Enter a description for this content partner'\n maxLength={MAX_PARTNER_DESCRIPTION_LENGTH}\n showCharacterCounter\n showRequiredStar\n />\n\n <FormField<EditPartnerFormData>\n label='Website Link'\n name='websiteLink'\n id='websiteLink'\n value={formikProps.values.websiteLink}\n placeholder='Enter a website link for this content partner'\n />\n\n <FormField<EditPartnerFormData>\n label='Parent'\n name='parentId'\n id='parentId'\n showRequiredStar\n >\n {() => {\n return (\n <div className='form-group'>\n <div className={classNames(showParentError && 'is-invalid')}>\n <SearchBar<Company | Person>\n renderAsForm={false}\n theme={() => ({\n suggestionsContainerOpen: classNames('pb-0 pt-1 overflow-hidden bg-white border rounded position-absolute w-100', styles.suggestions),\n suggestionsContainer: `${styles.suggestionsContainer}`,\n input: classNames(showParentError && 'border-danger')\n })}\n activationLength={2}\n placeholder='Search for a parent company or person...'\n clearQueryOnSelect={true}\n searchIconPlacement={false}\n debounceTime={300}\n allowableSuggestionFetchRequestedReasons={[ 'input-changed', 'input-focused' ]}\n getRemoteUrl={() => props.getRemoteUrl()}\n getRemotePostBody={(q: string) => {\n return {\n query: q,\n indices: [{ index: 'company' }, { index: 'person' }],\n searchType: 'content'\n };\n }}\n onSuggestionSelected={onSelect}\n showClearInputIcon\n onClickClearInput={onClickClearInput}\n formatRemoteSuggestions={(suggestions: SearchResults<Company | Person>) => {\n return suggestions.results?.map((suggestion: Company | Person) => {\n return {\n ...suggestion,\n name: suggestion.name?.[0]\n };\n });\n }}\n initialQuery={formikProps.values.parent?.name || ''}\n getErrorStateComponent={onClickTryAgain =>\n <TypeaheadErrorState imageUrl={ImageUrls.TYPEAHEAD_ERROR} onClickTryAgain={onClickTryAgain} />\n }\n getEmptyStateComponent={query => (\n <div>\n Couldn't find any matches for {query}\n </div>\n )}\n />\n </div>\n <BsForm.Control.Feedback type='invalid'>\n {getParentError()}\n </BsForm.Control.Feedback>\n </div>\n );\n }}\n\n </FormField>\n\n <FormField<EditPartnerFormData>\n label='Slug'\n name='slug'\n infoText='Auto generated based on the parent company or person name'\n \n id='slug'\n value={formikProps.values.slug}\n readOnly={!props.isNew}\n disabled={!props.isNew}\n showRequiredStar\n />\n\n {props.contentRegions && !props.isNew && (\n <FormField<EditPartnerFormData>\n label='Content Regions'\n name='contentRegions'\n id='contentRegions'\n >\n {() => (\n <div className='w-50'>\n <SelectContentRegion\n type='checkbox'\n id={formikProps.values.id}\n options={props.contentRegions}\n selected={formikProps.values.contentRegions || []}\n onUpdate={contentRegions => formikProps.setFieldValue('contentRegions', contentRegions)}\n readOnly\n />\n </div>\n )}\n </FormField>\n )}\n\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Covers}\n fieldName='cover'\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n />\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Logos}\n fieldName='logo'\n label='Logo'\n overrideDimensions={{ width: 512, height: 512 }}\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n />\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Covers}\n fieldName='icon'\n label='Icon'\n canRemove\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n />\n\n {!props.isNew && (\n <ColorSelect\n label='Background colour'\n fieldName='backgroundColour'\n />\n )}\n\n <ImageSelect<EditPartnerFormData>\n imageType={ImageType.Banners}\n fieldName='banner'\n uploadAppLink={{ application: AppChannels.CONTENT_PARTNERS, action: Actions.ContentPartners.UPLOAD_IMAGE }}\n overrideDimensions={PARTNER_PROFILE_BANNER_SIZE}\n />\n\n {!!props.onVideoUploadComplete && (\n <UploadVideo<EditPartnerFormData>\n label='Video Banner'\n fieldName='videoBanner'\n hostedLibraryId={ClickView.Config.Resources.ClickViewRootLibrary}\n onUploadComplete={props.onVideoUploadComplete}\n />\n )}\n <div className='d-flex gap-2'>\n <FormButtons isNew={props.isNew} variant='dark' />\n {!props.isNew && (\n <AppLinkComponent\n appLink={props.deleteAppLink}\n className='btn btn-danger'\n >\n Delete Channel\n </AppLinkComponent>\n )}\n </div>\n </Form>\n );\n}\n","import React from 'react';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ContentRegionObject, CurrentUser } from 'libs/shared/interfaces';\n\nimport { PendingItem } from 'shared/components/upload-video/UploadVideo';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ContentPartnerProfile } from 'shared/interfaces/models/ContentPartnerProfile';\n\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\nimport { ContentPartnerValidationSchema } from 'apps/content-partners/utils/ContentPartnerValidation';\n\nimport { EditContentPartnerForm } from './EditContentPartnerForm';\n\ninterface EditContentPartnerProps {\n onVideoUploadComplete?: (pendingItem: PendingItem) => Promise<void>;\n onSave: (data: EditPartnerFormData, onDone?: () => void) => Promise<void>;\n contentPartner?: ContentPartnerProfile;\n contentRegions?: ContentRegionObject[];\n currentUser: CurrentUser;\n}\n\nexport function EditContentPartner(props: EditContentPartnerProps): JSX.Element {\n const websiteLink = props.contentPartner?.links ?\n ContentPartnersHelper.getPartnerLinkByType(props.contentPartner.links, 'website') :\n null;\n \n const initialValues: EditPartnerFormData = {\n id: props.contentPartner?.id,\n name: props.contentPartner?.name || '',\n logo: props.contentPartner?.logo || null,\n icon: props.contentPartner?.icon || null,\n cover: props.contentPartner?.cover || null,\n banner: props.contentPartner?.banner || null,\n description: props.contentPartner?.description || '',\n slug: props.contentPartner?._slug.value || '',\n blurb: props.contentPartner?.blurb || '',\n contentSource: props.contentPartner?.contentSource || 1,\n partnerType: props.contentPartner?.partnerType || 2,\n backgroundColour: props.contentPartner?.metadata?.backgroundColour || null,\n contentRegions: props.contentPartner?.contentRegions?.data || [],\n parent: props.contentPartner?.person || props.contentPartner?.company,\n videoBanner: props.contentPartner?.videoBanner ?\n { id: props.contentPartner?.videoBanner.id, status: props.contentPartner?.videoBanner.status } :\n null,\n websiteLink: websiteLink || ''\n };\n\n function getRemoteUrl (): string {\n return `/api/search/v4/search/raw?userId=${props.currentUser?.id}&customerid=${props.currentUser?.customerId}`;\n }\n\n return (\n <FormWrapper<EditPartnerFormData>\n initialValues={initialValues}\n validationSchema={ContentPartnerValidationSchema}\n onSubmit={props.onSave}\n >\n <EditContentPartnerForm\n isNew={!(props.contentPartner && props.contentPartner.id)}\n contentRegions={props.contentRegions}\n getRemoteUrl={getRemoteUrl}\n onVideoUploadComplete={props.onVideoUploadComplete}\n deleteAppLink={{\n application: AppChannels.CONTENT_PARTNERS,\n action: Actions.ContentPartners.DELETE_CONTENT_PARTNER,\n args: [props.contentPartner?.id]\n }}\n />\n </FormWrapper>\n );\n}\n"],"mappings":"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"}
|