@clickview/curator 1.101.0-rc.4 → 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 +475 -475
- package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js → -OUl3n-W.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js.map → -OUl3n-W.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js +9 -0
- package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js.map +1 -0
- package/dist/Assets/js/dist/scripts/B0UOCPE6.chunk.js +2 -0
- package/dist/Assets/js/dist/scripts/{r-zw-56e.chunk.js.map → B0UOCPE6.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js → BD2aIccu2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js.map → BD2aIccu2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js → BJJeLngO2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js.map → BJJeLngO2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js → BKQIzKcF2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js.map → BKQIzKcF2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js → BOrAaHLK.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js.map → BOrAaHLK.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/BSMzg7zU.chunk.js.map +1 -1
- package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js → BUWsFXQp2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js.map → BUWsFXQp2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js → C1xOGHlL2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js.map → C1xOGHlL2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js → CAo_C8em2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js.map → CAo_C8em2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js → COH92JF5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js.map → COH92JF5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js → CR-5nCWm.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js.map → CR-5nCWm.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js → CW1ea_Kx2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js.map → CW1ea_Kx2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js → Cbwl04yH2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js.map → Cbwl04yH2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js → CpqMUVVi.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js.map → CpqMUVVi.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js → CqZqlJSF.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js.map → CqZqlJSF.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js → CzCUe0Ej.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js.map → CzCUe0Ej.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js → DTUkmChD.chunk.js} +3 -3
- package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js.map → DTUkmChD.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js → DW7-la-i.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js.map → DW7-la-i.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js → Dhnl-PB5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js.map → Dhnl-PB5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js → DuU4GBw5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js.map → DuU4GBw5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js → LmwQmHZz2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js.map → LmwQmHZz2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js → app-DHtN6XkT.js} +3 -3
- package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js.map → app-DHtN6XkT.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js → eKSK4iyn.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js.map → eKSK4iyn.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js → esASf9N4.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js.map → esASf9N4.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{De-ohgjE.chunk.js → x1pOfdJd.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/x1pOfdJd.chunk.js.map +1 -0
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/package.json +1 -1
- package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js +0 -9
- package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js.map +0 -1
- package/dist/Assets/js/dist/scripts/De-ohgjE.chunk.js.map +0 -1
- package/dist/Assets/js/dist/scripts/r-zw-56e.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":"ecehd0o7.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":"jdQzplq1.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"./DhN_Jc2z.chunk.js";import{t as V}from"./DUsXdKYh.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":"CvMpxc4j2.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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"}
|