@clickview/exchange 0.62.0-rc.1 → 0.62.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 +542 -542
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{BPYdRA7H.chunk.js → 0uwnPAi2.chunk.js} +2 -2
- package/dist/scripts/{BPYdRA7H.chunk.js.map → 0uwnPAi2.chunk.js.map} +1 -1
- package/dist/scripts/{eUKFc6dK.chunk.js → 6f-CHYL3.chunk.js} +2 -2
- package/dist/scripts/{eUKFc6dK.chunk.js.map → 6f-CHYL3.chunk.js.map} +1 -1
- package/dist/scripts/{BS8sYAAh.chunk.js → B09qwiFG.chunk.js} +2 -2
- package/dist/scripts/{BS8sYAAh.chunk.js.map → B09qwiFG.chunk.js.map} +1 -1
- package/dist/scripts/{BbrEvwAi2.chunk.js → B0uOvqjG2.chunk.js} +2 -2
- package/dist/scripts/{BbrEvwAi2.chunk.js.map → B0uOvqjG2.chunk.js.map} +1 -1
- package/dist/scripts/{EIJf9JbR2.chunk.js → B8BobN3r2.chunk.js} +2 -2
- package/dist/scripts/{EIJf9JbR2.chunk.js.map → B8BobN3r2.chunk.js.map} +1 -1
- package/dist/scripts/{Ca_-2JTE2.chunk.js → B8wHzPHI2.chunk.js} +2 -2
- package/dist/scripts/{Ca_-2JTE2.chunk.js.map → B8wHzPHI2.chunk.js.map} +1 -1
- package/dist/scripts/{DkB0qBxI.chunk.js → BAIdKirt.chunk.js} +2 -2
- package/dist/scripts/{DkB0qBxI.chunk.js.map → BAIdKirt.chunk.js.map} +1 -1
- package/dist/scripts/{Bi8itw8v2.chunk.js → BAwP70HI2.chunk.js} +2 -2
- package/dist/scripts/{Bi8itw8v2.chunk.js.map → BAwP70HI2.chunk.js.map} +1 -1
- package/dist/scripts/{BHbt9wzx.chunk.js → BEv09vqz.chunk.js} +2 -2
- package/dist/scripts/{BHbt9wzx.chunk.js.map → BEv09vqz.chunk.js.map} +1 -1
- package/dist/scripts/{8pXw5z942.chunk.js → BLs3APIS2.chunk.js} +2 -2
- package/dist/scripts/{8pXw5z942.chunk.js.map → BLs3APIS2.chunk.js.map} +1 -1
- package/dist/scripts/{DuPL-nK72.chunk.js → BP0LMV9S2.chunk.js} +2 -2
- package/dist/scripts/{DuPL-nK72.chunk.js.map → BP0LMV9S2.chunk.js.map} +1 -1
- package/dist/scripts/{EO2xPuAQ.chunk.js → BPttZx0-.chunk.js} +2 -2
- package/dist/scripts/{EO2xPuAQ.chunk.js.map → BPttZx0-.chunk.js.map} +1 -1
- package/dist/scripts/{NtrZI2Ef.chunk.js → BQk9Mhlr.chunk.js} +2 -2
- package/dist/scripts/{NtrZI2Ef.chunk.js.map → BQk9Mhlr.chunk.js.map} +1 -1
- package/dist/scripts/{amjwjus3.chunk.js → BXIfsdxg.chunk.js} +2 -2
- package/dist/scripts/{amjwjus3.chunk.js.map → BXIfsdxg.chunk.js.map} +1 -1
- package/dist/scripts/{DKz4jhnr2.chunk.js → B_P4D3Hf2.chunk.js} +2 -2
- package/dist/scripts/{DKz4jhnr2.chunk.js.map → B_P4D3Hf2.chunk.js.map} +1 -1
- package/dist/scripts/{DfOgl-0-2.chunk.js → BgskDBpT2.chunk.js} +2 -2
- package/dist/scripts/{DfOgl-0-2.chunk.js.map → BgskDBpT2.chunk.js.map} +1 -1
- package/dist/scripts/{BsLLiG1-.chunk.js → BhOZYAZn.chunk.js} +2 -2
- package/dist/scripts/{BsLLiG1-.chunk.js.map → BhOZYAZn.chunk.js.map} +1 -1
- package/dist/scripts/{BaSi1pig.chunk.js → Bn9ROglk.chunk.js} +2 -2
- package/dist/scripts/{BaSi1pig.chunk.js.map → Bn9ROglk.chunk.js.map} +1 -1
- package/dist/scripts/{SDRXIwM22.chunk.js → Bo8PhXY12.chunk.js} +3 -3
- package/dist/scripts/{SDRXIwM22.chunk.js.map → Bo8PhXY12.chunk.js.map} +1 -1
- package/dist/scripts/{C3Hw2TpW2.chunk.js → BrVyRSUS2.chunk.js} +2 -2
- package/dist/scripts/{C3Hw2TpW2.chunk.js.map → BrVyRSUS2.chunk.js.map} +1 -1
- package/dist/scripts/{DmVXt6_V.chunk.js → BxLgTmMl.chunk.js} +2 -2
- package/dist/scripts/{DmVXt6_V.chunk.js.map → BxLgTmMl.chunk.js.map} +1 -1
- package/dist/scripts/{DsHiClyc2.chunk.js → Bxsu4S752.chunk.js} +2 -2
- package/dist/scripts/{DsHiClyc2.chunk.js.map → Bxsu4S752.chunk.js.map} +1 -1
- package/dist/scripts/{MYu2AEsL.chunk.js → C-PORBUs.chunk.js} +2 -2
- package/dist/scripts/{MYu2AEsL.chunk.js.map → C-PORBUs.chunk.js.map} +1 -1
- package/dist/scripts/{CxUrOnxW2.chunk.js → C1StI3Bl2.chunk.js} +2 -2
- package/dist/scripts/{CxUrOnxW2.chunk.js.map → C1StI3Bl2.chunk.js.map} +1 -1
- package/dist/scripts/{CKL4ViMC.chunk.js → C6Hr-vqw.chunk.js} +2 -2
- package/dist/scripts/{CKL4ViMC.chunk.js.map → C6Hr-vqw.chunk.js.map} +1 -1
- package/dist/scripts/{Bue5_bLM.chunk.js → CBnNAkzx.chunk.js} +2 -2
- package/dist/scripts/{Bue5_bLM.chunk.js.map → CBnNAkzx.chunk.js.map} +1 -1
- package/dist/scripts/{C03mMZ4k.chunk.js → CFkqPGiT.chunk.js} +2 -2
- package/dist/scripts/{C03mMZ4k.chunk.js.map → CFkqPGiT.chunk.js.map} +1 -1
- package/dist/scripts/{vvCGyl_q.chunk.js → CKD2j1rw.chunk.js} +2 -2
- package/dist/scripts/{vvCGyl_q.chunk.js.map → CKD2j1rw.chunk.js.map} +1 -1
- package/dist/scripts/{DqM6hYTJ2.chunk.js → CSKzCsLv2.chunk.js} +2 -2
- package/dist/scripts/{DqM6hYTJ2.chunk.js.map → CSKzCsLv2.chunk.js.map} +1 -1
- package/dist/scripts/{B7m3cCi42.chunk.js → CZgaUoHE2.chunk.js} +2 -2
- package/dist/scripts/{B7m3cCi42.chunk.js.map → CZgaUoHE2.chunk.js.map} +1 -1
- package/dist/scripts/{CL9SkODG.chunk.js → C_7tv1r9.chunk.js} +2 -2
- package/dist/scripts/{CL9SkODG.chunk.js.map → C_7tv1r9.chunk.js.map} +1 -1
- package/dist/scripts/{CKZJ2qae2.chunk.js → C_jUsStb2.chunk.js} +2 -2
- package/dist/scripts/{CKZJ2qae2.chunk.js.map → C_jUsStb2.chunk.js.map} +1 -1
- package/dist/scripts/{DSZkTUVU.chunk.js → CdNTKjPA.chunk.js} +2 -2
- package/dist/scripts/{DSZkTUVU.chunk.js.map → CdNTKjPA.chunk.js.map} +1 -1
- package/dist/scripts/{CfNYdg0m.chunk.js → ChDwbV8F.chunk.js} +2 -2
- package/dist/scripts/{CfNYdg0m.chunk.js.map → ChDwbV8F.chunk.js.map} +1 -1
- package/dist/scripts/{pOL5_XNC.chunk.js → Cq-TpkxJ.chunk.js} +2 -2
- package/dist/scripts/{pOL5_XNC.chunk.js.map → Cq-TpkxJ.chunk.js.map} +1 -1
- package/dist/scripts/{F1LOVRO_.chunk.js → CrCX606H.chunk.js} +2 -2
- package/dist/scripts/{F1LOVRO_.chunk.js.map → CrCX606H.chunk.js.map} +1 -1
- package/dist/scripts/{BtdygabL2.chunk.js → CrDpB82d2.chunk.js} +2 -2
- package/dist/scripts/{BtdygabL2.chunk.js.map → CrDpB82d2.chunk.js.map} +1 -1
- package/dist/scripts/{BvamDkjt2.chunk.js → Czivka682.chunk.js} +2 -2
- package/dist/scripts/{BvamDkjt2.chunk.js.map → Czivka682.chunk.js.map} +1 -1
- package/dist/scripts/{sViLex0Q.chunk.js → DEP_Z-S0.chunk.js} +2 -2
- package/dist/scripts/{sViLex0Q.chunk.js.map → DEP_Z-S0.chunk.js.map} +1 -1
- package/dist/scripts/{1iKkdpYv.chunk.js → DQBoqkL7.chunk.js} +2 -2
- package/dist/scripts/{1iKkdpYv.chunk.js.map → DQBoqkL7.chunk.js.map} +1 -1
- package/dist/scripts/{C2AXrtJf.chunk.js → DeXP2wHV.chunk.js} +2 -2
- package/dist/scripts/{C2AXrtJf.chunk.js.map → DeXP2wHV.chunk.js.map} +1 -1
- package/dist/scripts/{U0UyGd9c2.chunk.js → Df82DFJ62.chunk.js} +2 -2
- package/dist/scripts/{U0UyGd9c2.chunk.js.map → Df82DFJ62.chunk.js.map} +1 -1
- package/dist/scripts/{BlOKamx72.chunk.js → DgrEIxhT2.chunk.js} +2 -2
- package/dist/scripts/{BlOKamx72.chunk.js.map → DgrEIxhT2.chunk.js.map} +1 -1
- package/dist/scripts/{OBYDGOgI2.chunk.js → DhT0tpZm2.chunk.js} +2 -2
- package/dist/scripts/{OBYDGOgI2.chunk.js.map → DhT0tpZm2.chunk.js.map} +1 -1
- package/dist/scripts/{Ct_4zyE3.chunk.js → Dhe09-jE.chunk.js} +2 -2
- package/dist/scripts/{Ct_4zyE3.chunk.js.map → Dhe09-jE.chunk.js.map} +1 -1
- package/dist/scripts/{xEGWFFpD2.chunk.js → DhtgaF-y2.chunk.js} +2 -2
- package/dist/scripts/{xEGWFFpD2.chunk.js.map → DhtgaF-y2.chunk.js.map} +1 -1
- package/dist/scripts/{nMyWveQA2.chunk.js → Div1wl-R2.chunk.js} +2 -2
- package/dist/scripts/{nMyWveQA2.chunk.js.map → Div1wl-R2.chunk.js.map} +1 -1
- package/dist/scripts/{DG6L7zHU2.chunk.js → DjuXXgD-2.chunk.js} +2 -2
- package/dist/scripts/{DG6L7zHU2.chunk.js.map → DjuXXgD-2.chunk.js.map} +1 -1
- package/dist/scripts/{BAN6QE-X.chunk.js → Dkazht4Q.chunk.js} +2 -2
- package/dist/scripts/{BAN6QE-X.chunk.js.map → Dkazht4Q.chunk.js.map} +1 -1
- package/dist/scripts/{D_k-Kl3-2.chunk.js → DmmZ2XbB2.chunk.js} +2 -2
- package/dist/scripts/{D_k-Kl3-2.chunk.js.map → DmmZ2XbB2.chunk.js.map} +1 -1
- package/dist/scripts/{l7UAnIb0.chunk.js → Dr35AMvf.chunk.js} +2 -2
- package/dist/scripts/{l7UAnIb0.chunk.js.map → Dr35AMvf.chunk.js.map} +1 -1
- package/dist/scripts/{CK_CN_mA.chunk.js → HgLS_KfH.chunk.js} +2 -2
- package/dist/scripts/{CK_CN_mA.chunk.js.map → HgLS_KfH.chunk.js.map} +1 -1
- package/dist/scripts/{Pixwk-h-.chunk.js → W8Q7Z6fd.chunk.js} +2 -2
- package/dist/scripts/{Pixwk-h-.chunk.js.map → W8Q7Z6fd.chunk.js.map} +1 -1
- package/dist/scripts/{BzJLc19T2.chunk.js → XWykPl9h2.chunk.js} +2 -2
- package/dist/scripts/{BzJLc19T2.chunk.js.map → XWykPl9h2.chunk.js.map} +1 -1
- package/dist/scripts/{G-hiM6b42.chunk.js → _3n_0ch72.chunk.js} +2 -2
- package/dist/scripts/{G-hiM6b42.chunk.js.map → _3n_0ch72.chunk.js.map} +1 -1
- package/dist/scripts/{app-BGxmHvGl.js → app-CgkYY4K0.js} +3 -3
- package/dist/scripts/app-CgkYY4K0.js.map +1 -0
- package/dist/scripts/{BINz0dmF.chunk.js → go6zFmPK.chunk.js} +2 -2
- package/dist/scripts/{BINz0dmF.chunk.js.map → go6zFmPK.chunk.js.map} +1 -1
- package/dist/scripts/{DFXpg6rF.chunk.js → p5-1Ey-R.chunk.js} +2 -2
- package/dist/scripts/{DFXpg6rF.chunk.js.map → p5-1Ey-R.chunk.js.map} +1 -1
- package/dist/scripts/{BobZ5p_m2.chunk.js → qrcrWbQJ2.chunk.js} +2 -2
- package/dist/scripts/{BobZ5p_m2.chunk.js.map → qrcrWbQJ2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/app-BGxmHvGl.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BzJLc19T2.chunk.js","names":[],"sources":["../../../../libs/shared/src/utils/TreeHelper.ts","../../../../libs/shared/src/components/tree/tree.module.scss","../../../../libs/shared/src/components/tree/TreeNodeText.tsx","../../../../libs/shared/src/components/tree/TreeNode.tsx","../../../../libs/shared/src/components/tree/Tree.tsx","../../../../libs/shared/src/apps/libraries/components/add-to-library-form/AddToLibraryForm.tsx","../../../../libs/shared/src/apps/libraries/utils/LibraryHelper.ts","../../../../libs/shared/src/apps/libraries/validation/AddToLibraryValidationSchema.ts","../../../../libs/shared/src/enums/LibraryRequestObjectType.ts","../../../../libs/shared/src/utils/error-message-helper/ErrorMessageHelper.ts","../../../../libs/shared/src/utils/LaunchUrlHelper.ts","../../../../libs/shared/src/apps/libraries/views/add-to-library/AddToLibraryView.tsx"],"sourcesContent":["import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BaseObject, MasterNestedObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nfunction _find<T extends BaseTree<BaseObject>>(\n node: T,\n id: string | number,\n parents: T[]\n): [ T | null, T[] ] {\n if (TextHelper.isEqual(node.id, id))\n return [ node, parents ];\n\n const children = node.children;\n\n if (!children || !children.length)\n return [ null, null ];\n\n for (let i = 0; i < children.length; i++) {\n const [ child, foundParents ] = _find(children[i] as T, id, [ ...parents, node ]);\n\n if (child)\n return [ child, foundParents ];\n }\n\n return [ null, null ];\n}\n\nexport const DEFAULT_MAX_DEPTH = 7;\n\nexport const TreeHelper = {\n find<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T | null {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [child] = _find(tree.children[j] as T, id, []);\n \n if (child)\n return child;\n }\n },\n\n getPath<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T[] {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [ , path ] = _find(tree.children[j] as T, id, []);\n \n if (path?.length)\n return path;\n }\n },\n\n getParent<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T {\n const path = TreeHelper.getPath(tree, id);\n\n if (!path?.length)\n return null;\n\n return path[path.length - 1];\n },\n\n convertNestedObjectToTree<T extends BaseObject>(nestedObject: MasterNestedObject<T>): BaseTree<T> {\n const node: BaseTree<T> = {\n ...nestedObject.data,\n children: nestedObject.children\n };\n\n if (node.children?.length)\n node.children = node.children.map(TreeHelper.convertNestedObjectToTree);\n\n return node;\n },\n\n findDepth<T extends MasterNestedObject<BaseObject>>(nodes: T[], targetId: string, currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return 0;\n }\n\n let depth = 0;\n\n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return currentDepth;\n }\n\n const childDepth = TreeHelper.findDepth(node.children, targetId, currentDepth + 1);\n\n if (childDepth > 0) {\n depth = childDepth;\n break;\n }\n }\n\n return depth;\n },\n\n findMaxChildDepth<T extends BaseObject>(nodes: MasterNestedObject<T>[], currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return currentDepth;\n }\n \n let deepestLevel = currentDepth;\n \n for (const node of nodes) {\n const childLevel = TreeHelper.findMaxChildDepth(node.children, currentDepth + 1);\n deepestLevel = Math.max(deepestLevel, childLevel);\n }\n \n return deepestLevel;\n },\n\n findTargetNode<T extends BaseObject>(nodes: MasterNestedObject<T>[], targetId: string): MasterNestedObject<T> | null {\n if (!nodes || nodes.length === 0) {\n return null;\n }\n \n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return node;\n }\n \n const result = TreeHelper.findTargetNode(node.children, targetId);\n if (result !== null) {\n return result;\n }\n }\n \n return null;\n },\n\n isMaxDepth<T extends MasterNestedObject<BaseObject>>(\n nodes: T[],\n sourceId: string,\n targetId: string,\n maxDepth: number = DEFAULT_MAX_DEPTH\n ): boolean {\n const sourceTree = TreeHelper.findTargetNode(nodes, sourceId);\n const maxChildDepth = TreeHelper.findMaxChildDepth(sourceTree.children);\n const targetDepth = TreeHelper.findDepth(nodes, targetId);\n \n return maxChildDepth + targetDepth >= maxDepth;\n },\n\n flatten<T>(\n tree: BaseTree<T>\n ): T[] {\n if (!tree)\n return [];\n\n const nodes: T[] = [];\n\n function pushNode(node: BaseTree<T>): void {\n nodes.push(ObjectHelper.omit(node, ['children']));\n node.children.forEach(pushNode);\n }\n\n tree.children.forEach(pushNode);\n\n return nodes;\n }\n};\n","$chevron-container-size: $cv-svg-size;\n$chevron-visible-size: calc($chevron-container-size / 3); // The actual chevron is 1/3rd of the container size\n$chevron-root-padding: map-get($spacers, 1);\n$text-root-padding: $chevron-root-padding + $chevron-container-size;\n\n@mixin nestedFolderTree($from, $to) {\n :local .tree {\n .text {\n padding-left: $text-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n .chevron {\n right: auto;\n left: $chevron-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n @if $from != $to {\n @include nestedFolderTree($from + 1, $to)\n }\n }\n}\n\n@include nestedFolderTree(0, 20);\n\n:local {\n .chevron {\n display: inline-block;\n position: absolute;\n color: black;\n cursor: pointer;\n top: 50%;\n margin-top: -$cv-svg-size-sm*0.5;\n right: 100%;\n }\n\n .text {\n overflow-wrap: break-word;\n padding-right: $cv-svg-size;\n cursor: pointer;\n\n &.disabled {\n cursor: not-allowed;\n }\n }\n\n .root {\n .chevron {\n left: $chevron-root-padding;\n }\n\n .text {\n padding-left: $text-root-padding;\n }\n }\n\n .selected {\n font-weight: 600;\n }\n\n .actions {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n display: none !important;\n\n &:hover {\n display: flex !important;\n }\n }\n\n .node:hover {\n text-decoration: none;\n\n &.noActions {\n background-color: $light-blue;\n }\n\n :global(.dropdown) {\n display: block;\n }\n\n + .actions {\n display: block !important;\n }\n }\n}","import React from 'react';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport styles from './tree.module.scss';\n\ninterface TreeNodeTextProps<T extends BaseTree<BaseObject>> {\n tree: T;\n text: string;\n className?: string;\n isDisabled?: boolean;\n disabledTooltip?: string | ((tree: T) => string);\n}\n\nexport function TreeNodeText<T extends BaseTree<BaseObject>>(props: TreeNodeTextProps<T>): React.ReactElement {\n function getTextClass(): string {\n let textClassName = `${styles.text} clamp-4`;\n\n if (props.className)\n textClassName += ` ${props.className}`;\n\n return textClassName;\n }\n\n if (props.isDisabled) {\n const disabledToolTip = typeof props.disabledTooltip === 'string' ?\n props.disabledTooltip :\n props.disabledTooltip?.(props.tree);\n\n return (\n <Tooltip title={disabledToolTip} spanHack spanHackClassName='d-inline-block flex-grow-1'>\n <span className={`${getTextClass()} text-secondary ${styles.disabled}`}>\n {props.text}\n </span>\n </Tooltip>\n );\n }\n\n return (\n <div className={getTextClass()}>\n {props.text}\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { Tree } from './Tree';\nimport { TreeNodeText } from './TreeNodeText';\n\nimport styles from './tree.module.scss';\n\nconst TREE_ACTIONS_CLASS = 'tree-actions';\n\nexport interface TreeNodeAction<T extends BaseTree<BaseObject>> {\n label: string;\n getAppLink: (node: T) => Core.AppLink;\n className?: string;\n}\n\ninterface TreeNodeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isRoot?: boolean;\n isDropdown?: boolean;\n multiSelect?: boolean;\n depth: number;\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nTreeNode.defaultProps = {\n selectedLinkClassName: styles.selected\n};\n\nexport function TreeNode<T extends BaseTree<BaseObject>>(props: TreeNodeProps<T>): React.ReactElement {\n const { tree, selectedIds, getAppLink, onSelect, isDisabled, isClickDisabled, actions, isDropdown } = props;\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n // If one of our children is selected\n const isParentOfSelected = React.useMemo(() => {\n return selectedIds?.some(id => TreeHelper.find(tree, id));\n }, [ tree, selectedIds ]);\n\n // Or we are below the initial open depth\n const initiallyOpen = props.openDepth && props.depth < props.openDepth;\n\n // We render expanded initially\n const [ isExpanded, setIsExpanded ] = React.useState(isParentOfSelected || initiallyOpen);\n\n const isSelected = selectedIds?.some(id => TextHelper.isEqual(tree.id, id));\n let hasChildren = !!tree.children && !!tree.children.length;\n\n if (props.maxDisplayDepth && hasChildren)\n hasChildren = props.depth < props.maxDisplayDepth;\n\n /**\n * We need to stop propagation of our event if our tree is rendered\n * inside of a bootstrap dropdown - Sha\n */\n React.useEffect(() => {\n if (!ref.current || !isDropdown)\n return;\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n onSelectNode();\n };\n\n ref.current.addEventListener('click', onClick);\n return () => {\n if (!ref.current)\n return;\n\n ref.current.removeEventListener('click', onClick);\n };\n }, [ ref.current, onSelect ]);\n\n /**\n * Check if an expanded item should actually be collapsed\n */\n React.useEffect(() => {\n // Don't do auto collapsing for trees that support multiple selections\n if (props.multiSelect)\n return;\n\n // Skip item if it's already collapsed\n if (!isExpanded)\n return;\n\n // Parents of a selected item should remain expanded\n if (isParentOfSelected)\n return;\n\n // Selected items should remain expanded\n if (isSelected)\n return;\n\n // Disabled items can be expanded if nothing has been selected\n if (!props.selectedIds?.length && isDisabled?.(props.tree))\n return;\n\n // If we want it to be initially open\n if (initiallyOpen)\n return;\n\n setIsExpanded(false);\n }, [selectedIds]);\n\n function onSelectNode(): void {\n if (isClickDisabled?.(tree))\n return;\n\n if (!props.multiSelect)\n setIsExpanded(!isExpanded);\n\n if (getAppLink) {\n Core.AppLinkHelper.trigger(getAppLink(tree));\n return;\n }\n\n if (isDisabled?.(tree)) {\n onSelect(null);\n return;\n }\n\n onSelect?.(tree);\n }\n\n function onClickCaret(e: any): void {\n e.stopPropagation();\n\n if (props.multiSelect) {\n setIsExpanded(!isExpanded);\n return;\n }\n\n onSelectNode();\n }\n\n function getNodeClass(): string {\n let className = `py-1 d-flex align-items-center w-100 position-relative ${styles.node}`;\n\n if (isSelected)\n className += ' ' + props.selectedLinkClassName;\n\n if (!actions?.length)\n className += ' ' + styles.noActions;\n\n if (isParentOfSelected && props.multiSelect)\n className += ' text-underline fst-italic';\n\n return className;\n }\n\n if (props.maxDisplayDepth && (props.depth > props.maxDisplayDepth))\n return <></>;\n\n return (\n <li className={`position-relative ${isExpanded ? '' : styles.collapsed} ${props.isRoot ? styles.root : ''}`}>\n <div className='position-relative'>\n <DivButton\n className={getNodeClass()}\n onClick={isDropdown ? null : onSelectNode}\n ref={ref}\n >\n {hasChildren && (\n <div className={styles.chevron} onClick={onClickCaret}>\n <Caret direction={isExpanded ? 'down' : 'right'} />\n </div>\n )}\n\n <TreeNodeText\n tree={tree}\n // Always prefer name over description\n text={tree.name || tree.description}\n isDisabled={isDisabled?.(tree) || isClickDisabled?.(tree)}\n disabledTooltip={props.disabledTooltip}\n />\n </DivButton>\n\n {!!props.actions && (\n <Actions\n className={styles.actions}\n actions={actions?.map(a => ({ ...a, appLink: a.getAppLink(tree) }))}\n actionsDropdownClassName={`btn btn-light ${TREE_ACTIONS_CLASS} py-0`}\n />\n )}\n\n {isExpanded && <Tree key={tree.id} {...props} isChild depth={props.depth + 1} />}\n </div>\n </li>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport { TreeNode, TreeNodeAction } from './TreeNode';\n\nimport styles from './tree.module.scss';\n\nexport interface TreeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isChild?: boolean;\n depth?: number;\n multiSelect?: boolean;\n /**\n * Set to true if you are using this component inside of\n * a bootstrap dropdown menu and don't want it to close\n * on click events - Sha\n */\n isDropdown?: boolean;\n /**\n * If you want to initially render open to a certain depth\n */\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nexport function Tree<T extends BaseTree<BaseObject>>(props: TreeProps<T>): React.ReactElement {\n const { tree, ...childProps } = props;\n\n if (!tree || !tree.children)\n return <></>;\n\n return (\n <ul className={`m-0 p-0 list-unstyled ${styles.tree}`}>\n {tree.children.map((child, key) => (\n <TreeNode key={key} tree={child} {...childProps} isRoot={!props.isChild} depth={props.depth || 0} />\n ))}\n </ul>\n );\n}\n","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AddToLibraryFormValues } from 'libs/shared/apps/libraries/views/add-to-library/AddToLibraryView';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { BaseTree, Folder, Library, LibraryTree, PopupViewProps, VideoTypes } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nconst namespace = 'libraries.addToLibraryForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryFormProps extends PopupViewProps {\n libraries: Library[];\n isFolderDisabled: (folder: BaseTree<Folder>) => boolean;\n video: VideoTypes;\n videoLibraries?: Library[];\n getCategoryTree: (libraryId: string) => LibraryTree[];\n}\n\nexport function AddToLibraryForm(props: AddToLibraryFormProps): JSX.Element {\n const formikProps = useFormikContextWrapper<AddToLibraryFormValues>();\n\n const isMakingLibraryRequest = !formikProps.values.library.canAddContent;\n const isAlreadyInLibrary = props.videoLibraries?.find(l => l.id === formikProps.values.library.id);\n\n const tree = React.useMemo(() => {\n const categoryTree = props.getCategoryTree(formikProps.values.library.id);\n\n const rootBranches = categoryTree.map(TreeHelper.convertNestedObjectToTree);\n\n return {\n children: rootBranches\n } as BaseTree<Library>;\n }, [formikProps.values.library.id]);\n\n return (\n <>\n {isAlreadyInLibrary && (\n <div className='alert alert-info'>\n <Text namespace={namespace} phrase='alreadyInLibrary' options={{ library: formikProps.values.library.name }} />\n </div>\n )}\n\n {isMakingLibraryRequest && (\n <p>\n <Text namespace={namespace} phrase='sendLibraryRequest' options={{ video: props.video.name }} />\n </p>\n )}\n\n <Form>\n {props.libraries.length > 1 && (\n <FormField\n as='select'\n label={getPhrase('selectLibrary')}\n name='library'\n value={formikProps.values.library?.id ?? ''}\n className={!formikProps.values.library?.id ? 'text-secondary' : ''}\n showRequiredStar\n onChange={(e: any) => {\n formikProps.setFieldValue('folder', null);\n\n const libraryId = e.target.value;\n\n formikProps.setFieldValue('library', props.libraries.find(l => l.id.toString() === libraryId.toString()));\n }}\n >\n {props.libraries.map(library => (\n <option key={library.id} value={library.id} className='text-dark'>\n {library.name}\n </option>\n ))}\n </FormField>\n )}\n\n <FormField\n label={getPhrase('selectFolder')}\n name='folder'\n showRequiredStar\n disabled={!formikProps.values.library}\n >\n {() => (\n <Scrollbars autoHeight autoHeightMax={300} className='border rounded-3'>\n <Tree\n tree={tree}\n onSelect={(folder: Folder) => formikProps.setFieldValue('folder', folder)}\n isDisabled={props.isFolderDisabled}\n disabledTooltip={LanguageService.getPhrase(namespace, 'disabledFolder')}\n selectedIds={formikProps.values.folder?.id ? [formikProps.values.folder.id] : undefined}\n selectedLinkClassName='bg-light'\n />\n </Scrollbars>\n )}\n </FormField>\n \n {!!formikProps.values.folder && (\n <p className='mt-n2'>\n <Text\n namespace={namespace}\n phrase={isMakingLibraryRequest ? 'requestTo' : 'addTo'}\n options={{ folder: formikProps.values.folder.name }}\n />\n </p>\n )}\n\n {isMakingLibraryRequest && (\n <FormField\n label={LanguageService.getPhrase(namespace, 'comment')}\n as='textarea'\n name='comment'\n id='comment'\n placeholder={LanguageService.getPhrase(namespace, 'commentPlaceholder')}\n value={formikProps.values.comment}\n />\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit variant='dark' text={getPhrase('addToLibrary')} />\n </PopupButtons>\n </Form>\n </>\n );\n}\n","import { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { CurrentUser, Library } from 'libs/shared/interfaces';\n\ntype LibraryTypes = Library['type'] | 'shared_library';\n\nexport const LibraryHelper = {\n /**\n * Orders libraries by type (custom -> shared -> hosted).\n * Also orders libraries of same type alphabetically.\n */\n sort(libraries: Library[]): Library[] {\n if (!libraries?.length)\n return [];\n\n return libraries.sort((a: Library, b: Library) => {\n // This is required because shared libraries have a type of `custom_library`\n const aType: LibraryTypes = a.isSharedLibrary ? 'shared_library' : a.type;\n const bType: LibraryTypes = b.isSharedLibrary ? 'shared_library' : b.type;\n \n if (aType === bType)\n return a.name.localeCompare(b.name);\n \n if (aType === 'custom_library')\n return -1;\n \n if (aType === 'shared_library' && bType !== 'custom_library')\n return -1;\n\n if (aType === 'hosted_library' && bType !== 'custom_library' && bType !== 'shared_library')\n return -1;\n \n return 1;\n });\n },\n\n hasTwigOrTigtag(libraries: Library[], currentUser: CurrentUser) {\n if (!currentUser)\n return { hasTwig: false, hasTigtag: false };\n\n // Anon users can see Twig/Tigtag if they're in England.\n if (!currentUser.isAuthenticated) {\n const hasAnonAccess = (\n currentUser.contentRegion === ContentRegion.UK ||\n currentUser.contentRegion === ContentRegion.SCOT\n );\n\n return {\n hasTwig: hasAnonAccess,\n hasTigtag: hasAnonAccess\n };\n }\n\n if (!libraries)\n return { hasTwig: false, hasTigtag: false };\n \n let hasTwig = false;\n let hasTigtag = false;\n\n for (const lib of libraries) {\n if (lib.id.toString() === HardCoded.Libraries.TWIG)\n hasTwig = true;\n else if (lib.id.toString() === HardCoded.Libraries.TIGTAG)\n hasTigtag = true;\n\n // If both are true we don't need to keep searching\n if (hasTwig && hasTigtag)\n break;\n }\n\n return { hasTwig, hasTigtag };\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'libraries.validation';\n\nexport const AddToLibraryValidationSchema = object().shape({\n comment: string()\n .nullable()\n .max(512, () => LanguageService.getPhrase(namespace, 'commentExceeds')),\n library: object()\n .required(() => LanguageService.getPhrase(namespace, 'libraryRequired'))\n .nullable(),\n folder: object()\n .required(() => LanguageService.getPhrase(namespace, 'folderRequired'))\n .nullable()\n});\n","export enum LibraryRequestObjectType {\n MasterVideo = 1,\n MasterClip = 2,\n MasterInteractive = 3\n}\n","import { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InviteColleagueXhr, LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\n\nconst getPhrase = LanguageService.encloseNamespace('shared.errorMessageHelper');\n\nconst LIBRARY_ERROR_PHRASE_MAPPING = {\n 'operation-not-allowed': 'operationNotAllowed',\n 'library-not-supported': 'libraryNotSupported',\n 'access-denied': 'accessDenied',\n 'library-access-denied': 'libraryAccessDenied',\n 'library-access-denied-create': 'libraryAccessDeniedCreate',\n 'library-access-denied-fulfil': 'libraryAccessDeniedFulfill',\n 'library-access-denied-not-authorized': 'libraryAccessDeniedNotAuthorized',\n 'library-request-access-denied': 'accessDenied',\n 'library-request-access-denied-create-request': 'libraryRequestAccessDeniedCreateRequest',\n 'library-request-access-denied-process-comment': 'libraryRequestAccessDeniedProcessComment',\n 'customer-not-found': 'customerNotFound',\n 'customer-not-found-current-user': 'customerNotFound',\n 'customer-not-found-library-owner': 'customerNotFoundLibraryOwner',\n 'customer-not-found-destination-library-owner': 'customerNotFoundLibraryOwner',\n 'user-not-found': 'userNotFound',\n 'library-not-found': 'libraryNotFound',\n 'video-not-found': 'videoNotFound',\n 'category-not-found': 'categoryNotFound',\n 'category-not-found-destination-not-provided': 'categoryNotFoundDestinationNotProvided',\n 'category-not-found-not-in-library': 'categoryNotFoundInLibrary',\n 'library-request-not-found': 'libraryRequestNotFound',\n 'invalid-category-path': 'invalidCategoryPath',\n 'library-api-error': 'somethingWentWrong',\n 'content-not-playable': 'contentNotPlayable',\n 'invalid-object': 'invalidObject',\n 'same-request-existed': 'sameRequestExisted',\n 'unknown-error': 'somethingWentWrong',\n 'no-email': 'noEmailError'\n};\n\nconst INVITE_COLLEAGUE_PHRASE_MAPPING = {\n 'create-invitation-failed': 'createInvitationFailed',\n 'invitation-resend-failed': 'invitationResendFailed',\n 'failed-to-accept': 'failedToAccept',\n 'invitee-not-found': 'inviteeNotFound',\n 'invitation-not-found': 'invitationNotFound',\n 'invitation-deleted': 'invitationDeleted',\n 'too-many-emails': 'tooManyEmails'\n};\n\nexport const ErrorMessageHelper = {\n libraryApiError(xhr: LibraryApiXhr): string {\n const phrase = LIBRARY_ERROR_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n },\n inviteColleagueError(xhr: InviteColleagueXhr): string {\n const phrase = INVITE_COLLEAGUE_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n }\n};\n\nexport const ErrorMessageHelperValidation = {\n libraryApiErrors(): void {\n Object.values(LIBRARY_ERROR_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n },\n inviteColleagueErrors(): void {\n Object.values(INVITE_COLLEAGUE_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n }\n};\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\ninterface OpenLibraryFolderParams {\n libraryId: string;\n folderId: string;\n}\n\nexport const LaunchUrlHelper = {\n buildOpenAppLinkUrl(baseLaunchUrl: string, appLink: string, product?: string): string {\n return UrlHelper.urlBuilder(`${baseLaunchUrl}/open`, { appLink, product });\n },\n\n buildOpenVideoUrl(baseLaunchUrl: string, videoId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `video:${videoId}`, product);\n },\n\n buildOpenClipUrl(baseLaunchUrl: string, clipId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `clip:${clipId}`, product);\n },\n\n buildOpenInteractiveUrl(baseLaunchUrl: string, interactiveId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `interactive:${interactiveId}`, product);\n },\n\n buildOpenTopicUrl(baseLaunchUrl: string, topicId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `topic:${topicId}`, product);\n },\n\n buildOpenSeriesUrl(baseLaunchUrl: string, seriesId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `series:${seriesId}`, product);\n },\n\n buildOpenPlaylistUrl(baseLaunchUrl: string, playlistId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `playlist:${playlistId}`, product);\n },\n\n buildOpenCategoryUrl(baseLaunchUrl: string, categoryId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `category:${categoryId}`, product);\n },\n\n buildOpenLibraryFolderUrl(baseLaunchUrl: string, params: OpenLibraryFolderParams, product?: string): string {\n const appLink = `library:${params.libraryId}:folder:${params.folderId}`;\n \n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, appLink, product);\n }\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { AlertType } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AddToLibraryForm } from 'libs/shared/apps/libraries/components/add-to-library-form/AddToLibraryForm';\nimport { LibraryHelper } from 'libs/shared/apps/libraries/utils/LibraryHelper';\nimport { AddToLibraryValidationSchema } from 'libs/shared/apps/libraries/validation/AddToLibraryValidationSchema';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LibraryRequestObjectType } from 'libs/shared/enums/LibraryRequestObjectType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { BaseTree, Clip, Config, CurrentUser, Folder, InteractiveMetadata, Library, LibraryTree, PopupViewProps, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { AddToLibraryRequest } from 'libs/shared/interfaces/requests/AddToLibraryRequest';\nimport { LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\nimport { ErrorMessageHelper } from 'libs/shared/utils/error-message-helper/ErrorMessageHelper';\nimport { LaunchUrlHelper } from 'libs/shared/utils/LaunchUrlHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\nimport { VideoSortHelper } from 'libs/shared/utils/VideoSortHelper';\n\nexport interface AddToLibraryFormValues {\n library: Library;\n folder: Folder;\n comment?: string;\n}\n\ntype LibraryObjectType = MasterType.Video | MasterType.Clip | MasterType.Interactive;\n\ntype ObjectTypeMap = {\n [K in LibraryObjectType]: LibraryRequestObjectType;\n};\n\nconst OBJECT_TYPE_MAP: ObjectTypeMap = {\n [MasterType.Video]: LibraryRequestObjectType.MasterVideo,\n [MasterType.Clip]: LibraryRequestObjectType.MasterClip,\n [MasterType.Interactive]: LibraryRequestObjectType.MasterInteractive\n};\n\nconst namespace = 'libraries.addToLibrary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryViewProps extends PopupViewProps {\n id: string;\n typeId: MasterType;\n folderAppLink?: Core.AppLink;\n}\n\nexport function AddToLibraryView(props: AddToLibraryViewProps): JSX.Element {\n const user = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const librariesWithCategories = Flight.useBasicFetch<LibraryTree[]>(LibraryRequests.librariesWithCategories());\n const libraries = Flight.useBasicFetch<Library[]>(LibraryRequests.libraryRequestLibraries());\n\n const videoRequest = VideoHelper.getVideoRequest(props.id, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const isClipOrInteractive = VideoHelper.isClip(video.data) || VideoHelper.isInteractive(video.data);\n const parentVideo = isClipOrInteractive && (video.data as Clip | InteractiveMetadata)?._parentVideo;\n const parentVideoDetails = Flight.useBasicFetch<Video>(\n parentVideo && VideoRequests.video(parentVideo.id)\n );\n\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const sortedLibraries = React.useMemo(() => LibraryHelper.sort(libraries.data), [libraries.data]);\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n const sort = !!user.data && VideoSortHelper.getOrSetSortType(user.data.id);\n\n /**\n * We try to pull the library and category id off the video/clip/interactive.\n * If we can't, then we try to get them off the _parentVideo. \n */\n function getSourceIds() {\n let sourceCategoryId: string = null;\n let sourceLibraryId = ArrayHelper.first(video.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && video.data.categories.data?.length) {\n const category = video.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n\n if (category)\n sourceCategoryId = category.id;\n }\n\n if (!sourceLibraryId) {\n sourceLibraryId = ArrayHelper.first(parentVideoDetails.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && parentVideoDetails.data.categories.data?.length) {\n const category = parentVideoDetails.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n \n if (category)\n sourceCategoryId = category.id;\n }\n }\n\n return {\n sourceLibraryId: sourceLibraryId ? +sourceLibraryId : null,\n sourceCategoryId: sourceCategoryId ? +sourceCategoryId : null\n };\n }\n\n function addToLibrary(data: AddToLibraryFormValues, onDone: () => void): void {\n const { sourceLibraryId, sourceCategoryId } = getSourceIds();\n\n const request: AddToLibraryRequest = {\n objectId: props.id.toString(),\n objectType: OBJECT_TYPE_MAP[props.typeId as LibraryObjectType],\n message: data.comment,\n sourceLibraryId,\n destinationLibraryId: +data.library.id,\n metadata: {\n destinationCategoryId: +data.folder.id,\n sourceCategoryId\n }\n };\n\n fetchAsync(LibraryRequests.addToLibrary(request, sort))\n .then(() => {\n if (!data.library.canAddContent) {\n alerts.success({\n type: AlertType.Pending,\n heading: getPhrase('pendingApproval'),\n message: getPhrase('libraryRequestSent', { library: data.library.name, escapeText: true })\n });\n } else {\n alerts.success({\n type: AlertType.Success,\n heading: '',\n message: getPhrase('addToLibrarySuccess', { folder: data.folder.name, video: video.data.name, escapeText: true }),\n ...(props.folderAppLink ? {\n appLink: {\n ...props.folderAppLink,\n args: [ data.library.id, data.folder.id, TextHelper.slugify(data.folder.name) ]\n },\n appLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n appLinkClassName: 'info-link'\n } : {\n extLink: LaunchUrlHelper.buildOpenLibraryFolderUrl(config.data.launchUrl, {\n libraryId: data.library.id,\n folderId: data.folder.id\n }),\n extLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n extLinkClassName: 'info-link'\n })\n });\n }\n })\n .catch((xhr: LibraryApiXhr) => {\n const errorMessage = ErrorMessageHelper.libraryApiError(xhr);\n handleGenerateReportError(xhr, errorMessage, errorMessage);\n onDone();\n })\n .finally(() => {\n props.closePopup();\n });\n }\n\n function getCategoryTree(libraryId: string): LibraryTree[] {\n return librariesWithCategories.data.find(l => l.data.id.toString() === libraryId.toString())?.children;\n }\n\n function isFolderDisabled(folder: BaseTree<Folder>): boolean {\n return !!video.data.categories?.data?.find(category => category.id === folder.id);\n }\n\n const dataLoaded = (\n libraries.data &&\n video.data &&\n librariesWithCategories.data\n );\n\n return (\n <Popup title={getPhrase('addToLibrary')} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded || loading}>\n {dataLoaded && (\n <FormWrapper<AddToLibraryFormValues>\n initialValues={{\n library: ArrayHelper.first(sortedLibraries),\n folder: null,\n comment: ''\n }}\n validationSchema={AddToLibraryValidationSchema}\n onSubmit={addToLibrary}\n >\n <AddToLibraryForm\n libraries={sortedLibraries}\n closePopup={props.closePopup}\n isFolderDisabled={isFolderDisabled}\n video={video.data}\n videoLibraries={video.data?.libraries?.data}\n getCategoryTree={getCategoryTree}\n />\n </FormWrapper>\n )}\n </Popup>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"XWykPl9h2.chunk.js","names":[],"sources":["../../../../libs/shared/src/utils/TreeHelper.ts","../../../../libs/shared/src/components/tree/tree.module.scss","../../../../libs/shared/src/components/tree/TreeNodeText.tsx","../../../../libs/shared/src/components/tree/TreeNode.tsx","../../../../libs/shared/src/components/tree/Tree.tsx","../../../../libs/shared/src/apps/libraries/components/add-to-library-form/AddToLibraryForm.tsx","../../../../libs/shared/src/apps/libraries/utils/LibraryHelper.ts","../../../../libs/shared/src/apps/libraries/validation/AddToLibraryValidationSchema.ts","../../../../libs/shared/src/enums/LibraryRequestObjectType.ts","../../../../libs/shared/src/utils/error-message-helper/ErrorMessageHelper.ts","../../../../libs/shared/src/utils/LaunchUrlHelper.ts","../../../../libs/shared/src/apps/libraries/views/add-to-library/AddToLibraryView.tsx"],"sourcesContent":["import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BaseObject, MasterNestedObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nfunction _find<T extends BaseTree<BaseObject>>(\n node: T,\n id: string | number,\n parents: T[]\n): [ T | null, T[] ] {\n if (TextHelper.isEqual(node.id, id))\n return [ node, parents ];\n\n const children = node.children;\n\n if (!children || !children.length)\n return [ null, null ];\n\n for (let i = 0; i < children.length; i++) {\n const [ child, foundParents ] = _find(children[i] as T, id, [ ...parents, node ]);\n\n if (child)\n return [ child, foundParents ];\n }\n\n return [ null, null ];\n}\n\nexport const DEFAULT_MAX_DEPTH = 7;\n\nexport const TreeHelper = {\n find<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T | null {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [child] = _find(tree.children[j] as T, id, []);\n \n if (child)\n return child;\n }\n },\n\n getPath<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T[] {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [ , path ] = _find(tree.children[j] as T, id, []);\n \n if (path?.length)\n return path;\n }\n },\n\n getParent<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T {\n const path = TreeHelper.getPath(tree, id);\n\n if (!path?.length)\n return null;\n\n return path[path.length - 1];\n },\n\n convertNestedObjectToTree<T extends BaseObject>(nestedObject: MasterNestedObject<T>): BaseTree<T> {\n const node: BaseTree<T> = {\n ...nestedObject.data,\n children: nestedObject.children\n };\n\n if (node.children?.length)\n node.children = node.children.map(TreeHelper.convertNestedObjectToTree);\n\n return node;\n },\n\n findDepth<T extends MasterNestedObject<BaseObject>>(nodes: T[], targetId: string, currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return 0;\n }\n\n let depth = 0;\n\n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return currentDepth;\n }\n\n const childDepth = TreeHelper.findDepth(node.children, targetId, currentDepth + 1);\n\n if (childDepth > 0) {\n depth = childDepth;\n break;\n }\n }\n\n return depth;\n },\n\n findMaxChildDepth<T extends BaseObject>(nodes: MasterNestedObject<T>[], currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return currentDepth;\n }\n \n let deepestLevel = currentDepth;\n \n for (const node of nodes) {\n const childLevel = TreeHelper.findMaxChildDepth(node.children, currentDepth + 1);\n deepestLevel = Math.max(deepestLevel, childLevel);\n }\n \n return deepestLevel;\n },\n\n findTargetNode<T extends BaseObject>(nodes: MasterNestedObject<T>[], targetId: string): MasterNestedObject<T> | null {\n if (!nodes || nodes.length === 0) {\n return null;\n }\n \n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return node;\n }\n \n const result = TreeHelper.findTargetNode(node.children, targetId);\n if (result !== null) {\n return result;\n }\n }\n \n return null;\n },\n\n isMaxDepth<T extends MasterNestedObject<BaseObject>>(\n nodes: T[],\n sourceId: string,\n targetId: string,\n maxDepth: number = DEFAULT_MAX_DEPTH\n ): boolean {\n const sourceTree = TreeHelper.findTargetNode(nodes, sourceId);\n const maxChildDepth = TreeHelper.findMaxChildDepth(sourceTree.children);\n const targetDepth = TreeHelper.findDepth(nodes, targetId);\n \n return maxChildDepth + targetDepth >= maxDepth;\n },\n\n flatten<T>(\n tree: BaseTree<T>\n ): T[] {\n if (!tree)\n return [];\n\n const nodes: T[] = [];\n\n function pushNode(node: BaseTree<T>): void {\n nodes.push(ObjectHelper.omit(node, ['children']));\n node.children.forEach(pushNode);\n }\n\n tree.children.forEach(pushNode);\n\n return nodes;\n }\n};\n","$chevron-container-size: $cv-svg-size;\n$chevron-visible-size: calc($chevron-container-size / 3); // The actual chevron is 1/3rd of the container size\n$chevron-root-padding: map-get($spacers, 1);\n$text-root-padding: $chevron-root-padding + $chevron-container-size;\n\n@mixin nestedFolderTree($from, $to) {\n :local .tree {\n .text {\n padding-left: $text-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n .chevron {\n right: auto;\n left: $chevron-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n @if $from != $to {\n @include nestedFolderTree($from + 1, $to)\n }\n }\n}\n\n@include nestedFolderTree(0, 20);\n\n:local {\n .chevron {\n display: inline-block;\n position: absolute;\n color: black;\n cursor: pointer;\n top: 50%;\n margin-top: -$cv-svg-size-sm*0.5;\n right: 100%;\n }\n\n .text {\n overflow-wrap: break-word;\n padding-right: $cv-svg-size;\n cursor: pointer;\n\n &.disabled {\n cursor: not-allowed;\n }\n }\n\n .root {\n .chevron {\n left: $chevron-root-padding;\n }\n\n .text {\n padding-left: $text-root-padding;\n }\n }\n\n .selected {\n font-weight: 600;\n }\n\n .actions {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n display: none !important;\n\n &:hover {\n display: flex !important;\n }\n }\n\n .node:hover {\n text-decoration: none;\n\n &.noActions {\n background-color: $light-blue;\n }\n\n :global(.dropdown) {\n display: block;\n }\n\n + .actions {\n display: block !important;\n }\n }\n}","import React from 'react';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport styles from './tree.module.scss';\n\ninterface TreeNodeTextProps<T extends BaseTree<BaseObject>> {\n tree: T;\n text: string;\n className?: string;\n isDisabled?: boolean;\n disabledTooltip?: string | ((tree: T) => string);\n}\n\nexport function TreeNodeText<T extends BaseTree<BaseObject>>(props: TreeNodeTextProps<T>): React.ReactElement {\n function getTextClass(): string {\n let textClassName = `${styles.text} clamp-4`;\n\n if (props.className)\n textClassName += ` ${props.className}`;\n\n return textClassName;\n }\n\n if (props.isDisabled) {\n const disabledToolTip = typeof props.disabledTooltip === 'string' ?\n props.disabledTooltip :\n props.disabledTooltip?.(props.tree);\n\n return (\n <Tooltip title={disabledToolTip} spanHack spanHackClassName='d-inline-block flex-grow-1'>\n <span className={`${getTextClass()} text-secondary ${styles.disabled}`}>\n {props.text}\n </span>\n </Tooltip>\n );\n }\n\n return (\n <div className={getTextClass()}>\n {props.text}\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { Tree } from './Tree';\nimport { TreeNodeText } from './TreeNodeText';\n\nimport styles from './tree.module.scss';\n\nconst TREE_ACTIONS_CLASS = 'tree-actions';\n\nexport interface TreeNodeAction<T extends BaseTree<BaseObject>> {\n label: string;\n getAppLink: (node: T) => Core.AppLink;\n className?: string;\n}\n\ninterface TreeNodeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isRoot?: boolean;\n isDropdown?: boolean;\n multiSelect?: boolean;\n depth: number;\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nTreeNode.defaultProps = {\n selectedLinkClassName: styles.selected\n};\n\nexport function TreeNode<T extends BaseTree<BaseObject>>(props: TreeNodeProps<T>): React.ReactElement {\n const { tree, selectedIds, getAppLink, onSelect, isDisabled, isClickDisabled, actions, isDropdown } = props;\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n // If one of our children is selected\n const isParentOfSelected = React.useMemo(() => {\n return selectedIds?.some(id => TreeHelper.find(tree, id));\n }, [ tree, selectedIds ]);\n\n // Or we are below the initial open depth\n const initiallyOpen = props.openDepth && props.depth < props.openDepth;\n\n // We render expanded initially\n const [ isExpanded, setIsExpanded ] = React.useState(isParentOfSelected || initiallyOpen);\n\n const isSelected = selectedIds?.some(id => TextHelper.isEqual(tree.id, id));\n let hasChildren = !!tree.children && !!tree.children.length;\n\n if (props.maxDisplayDepth && hasChildren)\n hasChildren = props.depth < props.maxDisplayDepth;\n\n /**\n * We need to stop propagation of our event if our tree is rendered\n * inside of a bootstrap dropdown - Sha\n */\n React.useEffect(() => {\n if (!ref.current || !isDropdown)\n return;\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n onSelectNode();\n };\n\n ref.current.addEventListener('click', onClick);\n return () => {\n if (!ref.current)\n return;\n\n ref.current.removeEventListener('click', onClick);\n };\n }, [ ref.current, onSelect ]);\n\n /**\n * Check if an expanded item should actually be collapsed\n */\n React.useEffect(() => {\n // Don't do auto collapsing for trees that support multiple selections\n if (props.multiSelect)\n return;\n\n // Skip item if it's already collapsed\n if (!isExpanded)\n return;\n\n // Parents of a selected item should remain expanded\n if (isParentOfSelected)\n return;\n\n // Selected items should remain expanded\n if (isSelected)\n return;\n\n // Disabled items can be expanded if nothing has been selected\n if (!props.selectedIds?.length && isDisabled?.(props.tree))\n return;\n\n // If we want it to be initially open\n if (initiallyOpen)\n return;\n\n setIsExpanded(false);\n }, [selectedIds]);\n\n function onSelectNode(): void {\n if (isClickDisabled?.(tree))\n return;\n\n if (!props.multiSelect)\n setIsExpanded(!isExpanded);\n\n if (getAppLink) {\n Core.AppLinkHelper.trigger(getAppLink(tree));\n return;\n }\n\n if (isDisabled?.(tree)) {\n onSelect(null);\n return;\n }\n\n onSelect?.(tree);\n }\n\n function onClickCaret(e: any): void {\n e.stopPropagation();\n\n if (props.multiSelect) {\n setIsExpanded(!isExpanded);\n return;\n }\n\n onSelectNode();\n }\n\n function getNodeClass(): string {\n let className = `py-1 d-flex align-items-center w-100 position-relative ${styles.node}`;\n\n if (isSelected)\n className += ' ' + props.selectedLinkClassName;\n\n if (!actions?.length)\n className += ' ' + styles.noActions;\n\n if (isParentOfSelected && props.multiSelect)\n className += ' text-underline fst-italic';\n\n return className;\n }\n\n if (props.maxDisplayDepth && (props.depth > props.maxDisplayDepth))\n return <></>;\n\n return (\n <li className={`position-relative ${isExpanded ? '' : styles.collapsed} ${props.isRoot ? styles.root : ''}`}>\n <div className='position-relative'>\n <DivButton\n className={getNodeClass()}\n onClick={isDropdown ? null : onSelectNode}\n ref={ref}\n >\n {hasChildren && (\n <div className={styles.chevron} onClick={onClickCaret}>\n <Caret direction={isExpanded ? 'down' : 'right'} />\n </div>\n )}\n\n <TreeNodeText\n tree={tree}\n // Always prefer name over description\n text={tree.name || tree.description}\n isDisabled={isDisabled?.(tree) || isClickDisabled?.(tree)}\n disabledTooltip={props.disabledTooltip}\n />\n </DivButton>\n\n {!!props.actions && (\n <Actions\n className={styles.actions}\n actions={actions?.map(a => ({ ...a, appLink: a.getAppLink(tree) }))}\n actionsDropdownClassName={`btn btn-light ${TREE_ACTIONS_CLASS} py-0`}\n />\n )}\n\n {isExpanded && <Tree key={tree.id} {...props} isChild depth={props.depth + 1} />}\n </div>\n </li>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport { TreeNode, TreeNodeAction } from './TreeNode';\n\nimport styles from './tree.module.scss';\n\nexport interface TreeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isChild?: boolean;\n depth?: number;\n multiSelect?: boolean;\n /**\n * Set to true if you are using this component inside of\n * a bootstrap dropdown menu and don't want it to close\n * on click events - Sha\n */\n isDropdown?: boolean;\n /**\n * If you want to initially render open to a certain depth\n */\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nexport function Tree<T extends BaseTree<BaseObject>>(props: TreeProps<T>): React.ReactElement {\n const { tree, ...childProps } = props;\n\n if (!tree || !tree.children)\n return <></>;\n\n return (\n <ul className={`m-0 p-0 list-unstyled ${styles.tree}`}>\n {tree.children.map((child, key) => (\n <TreeNode key={key} tree={child} {...childProps} isRoot={!props.isChild} depth={props.depth || 0} />\n ))}\n </ul>\n );\n}\n","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AddToLibraryFormValues } from 'libs/shared/apps/libraries/views/add-to-library/AddToLibraryView';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { BaseTree, Folder, Library, LibraryTree, PopupViewProps, VideoTypes } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nconst namespace = 'libraries.addToLibraryForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryFormProps extends PopupViewProps {\n libraries: Library[];\n isFolderDisabled: (folder: BaseTree<Folder>) => boolean;\n video: VideoTypes;\n videoLibraries?: Library[];\n getCategoryTree: (libraryId: string) => LibraryTree[];\n}\n\nexport function AddToLibraryForm(props: AddToLibraryFormProps): JSX.Element {\n const formikProps = useFormikContextWrapper<AddToLibraryFormValues>();\n\n const isMakingLibraryRequest = !formikProps.values.library.canAddContent;\n const isAlreadyInLibrary = props.videoLibraries?.find(l => l.id === formikProps.values.library.id);\n\n const tree = React.useMemo(() => {\n const categoryTree = props.getCategoryTree(formikProps.values.library.id);\n\n const rootBranches = categoryTree.map(TreeHelper.convertNestedObjectToTree);\n\n return {\n children: rootBranches\n } as BaseTree<Library>;\n }, [formikProps.values.library.id]);\n\n return (\n <>\n {isAlreadyInLibrary && (\n <div className='alert alert-info'>\n <Text namespace={namespace} phrase='alreadyInLibrary' options={{ library: formikProps.values.library.name }} />\n </div>\n )}\n\n {isMakingLibraryRequest && (\n <p>\n <Text namespace={namespace} phrase='sendLibraryRequest' options={{ video: props.video.name }} />\n </p>\n )}\n\n <Form>\n {props.libraries.length > 1 && (\n <FormField\n as='select'\n label={getPhrase('selectLibrary')}\n name='library'\n value={formikProps.values.library?.id ?? ''}\n className={!formikProps.values.library?.id ? 'text-secondary' : ''}\n showRequiredStar\n onChange={(e: any) => {\n formikProps.setFieldValue('folder', null);\n\n const libraryId = e.target.value;\n\n formikProps.setFieldValue('library', props.libraries.find(l => l.id.toString() === libraryId.toString()));\n }}\n >\n {props.libraries.map(library => (\n <option key={library.id} value={library.id} className='text-dark'>\n {library.name}\n </option>\n ))}\n </FormField>\n )}\n\n <FormField\n label={getPhrase('selectFolder')}\n name='folder'\n showRequiredStar\n disabled={!formikProps.values.library}\n >\n {() => (\n <Scrollbars autoHeight autoHeightMax={300} className='border rounded-3'>\n <Tree\n tree={tree}\n onSelect={(folder: Folder) => formikProps.setFieldValue('folder', folder)}\n isDisabled={props.isFolderDisabled}\n disabledTooltip={LanguageService.getPhrase(namespace, 'disabledFolder')}\n selectedIds={formikProps.values.folder?.id ? [formikProps.values.folder.id] : undefined}\n selectedLinkClassName='bg-light'\n />\n </Scrollbars>\n )}\n </FormField>\n \n {!!formikProps.values.folder && (\n <p className='mt-n2'>\n <Text\n namespace={namespace}\n phrase={isMakingLibraryRequest ? 'requestTo' : 'addTo'}\n options={{ folder: formikProps.values.folder.name }}\n />\n </p>\n )}\n\n {isMakingLibraryRequest && (\n <FormField\n label={LanguageService.getPhrase(namespace, 'comment')}\n as='textarea'\n name='comment'\n id='comment'\n placeholder={LanguageService.getPhrase(namespace, 'commentPlaceholder')}\n value={formikProps.values.comment}\n />\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit variant='dark' text={getPhrase('addToLibrary')} />\n </PopupButtons>\n </Form>\n </>\n );\n}\n","import { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { CurrentUser, Library } from 'libs/shared/interfaces';\n\ntype LibraryTypes = Library['type'] | 'shared_library';\n\nexport const LibraryHelper = {\n /**\n * Orders libraries by type (custom -> shared -> hosted).\n * Also orders libraries of same type alphabetically.\n */\n sort(libraries: Library[]): Library[] {\n if (!libraries?.length)\n return [];\n\n return libraries.sort((a: Library, b: Library) => {\n // This is required because shared libraries have a type of `custom_library`\n const aType: LibraryTypes = a.isSharedLibrary ? 'shared_library' : a.type;\n const bType: LibraryTypes = b.isSharedLibrary ? 'shared_library' : b.type;\n \n if (aType === bType)\n return a.name.localeCompare(b.name);\n \n if (aType === 'custom_library')\n return -1;\n \n if (aType === 'shared_library' && bType !== 'custom_library')\n return -1;\n\n if (aType === 'hosted_library' && bType !== 'custom_library' && bType !== 'shared_library')\n return -1;\n \n return 1;\n });\n },\n\n hasTwigOrTigtag(libraries: Library[], currentUser: CurrentUser) {\n if (!currentUser)\n return { hasTwig: false, hasTigtag: false };\n\n // Anon users can see Twig/Tigtag if they're in England.\n if (!currentUser.isAuthenticated) {\n const hasAnonAccess = (\n currentUser.contentRegion === ContentRegion.UK ||\n currentUser.contentRegion === ContentRegion.SCOT\n );\n\n return {\n hasTwig: hasAnonAccess,\n hasTigtag: hasAnonAccess\n };\n }\n\n if (!libraries)\n return { hasTwig: false, hasTigtag: false };\n \n let hasTwig = false;\n let hasTigtag = false;\n\n for (const lib of libraries) {\n if (lib.id.toString() === HardCoded.Libraries.TWIG)\n hasTwig = true;\n else if (lib.id.toString() === HardCoded.Libraries.TIGTAG)\n hasTigtag = true;\n\n // If both are true we don't need to keep searching\n if (hasTwig && hasTigtag)\n break;\n }\n\n return { hasTwig, hasTigtag };\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'libraries.validation';\n\nexport const AddToLibraryValidationSchema = object().shape({\n comment: string()\n .nullable()\n .max(512, () => LanguageService.getPhrase(namespace, 'commentExceeds')),\n library: object()\n .required(() => LanguageService.getPhrase(namespace, 'libraryRequired'))\n .nullable(),\n folder: object()\n .required(() => LanguageService.getPhrase(namespace, 'folderRequired'))\n .nullable()\n});\n","export enum LibraryRequestObjectType {\n MasterVideo = 1,\n MasterClip = 2,\n MasterInteractive = 3\n}\n","import { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InviteColleagueXhr, LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\n\nconst getPhrase = LanguageService.encloseNamespace('shared.errorMessageHelper');\n\nconst LIBRARY_ERROR_PHRASE_MAPPING = {\n 'operation-not-allowed': 'operationNotAllowed',\n 'library-not-supported': 'libraryNotSupported',\n 'access-denied': 'accessDenied',\n 'library-access-denied': 'libraryAccessDenied',\n 'library-access-denied-create': 'libraryAccessDeniedCreate',\n 'library-access-denied-fulfil': 'libraryAccessDeniedFulfill',\n 'library-access-denied-not-authorized': 'libraryAccessDeniedNotAuthorized',\n 'library-request-access-denied': 'accessDenied',\n 'library-request-access-denied-create-request': 'libraryRequestAccessDeniedCreateRequest',\n 'library-request-access-denied-process-comment': 'libraryRequestAccessDeniedProcessComment',\n 'customer-not-found': 'customerNotFound',\n 'customer-not-found-current-user': 'customerNotFound',\n 'customer-not-found-library-owner': 'customerNotFoundLibraryOwner',\n 'customer-not-found-destination-library-owner': 'customerNotFoundLibraryOwner',\n 'user-not-found': 'userNotFound',\n 'library-not-found': 'libraryNotFound',\n 'video-not-found': 'videoNotFound',\n 'category-not-found': 'categoryNotFound',\n 'category-not-found-destination-not-provided': 'categoryNotFoundDestinationNotProvided',\n 'category-not-found-not-in-library': 'categoryNotFoundInLibrary',\n 'library-request-not-found': 'libraryRequestNotFound',\n 'invalid-category-path': 'invalidCategoryPath',\n 'library-api-error': 'somethingWentWrong',\n 'content-not-playable': 'contentNotPlayable',\n 'invalid-object': 'invalidObject',\n 'same-request-existed': 'sameRequestExisted',\n 'unknown-error': 'somethingWentWrong',\n 'no-email': 'noEmailError'\n};\n\nconst INVITE_COLLEAGUE_PHRASE_MAPPING = {\n 'create-invitation-failed': 'createInvitationFailed',\n 'invitation-resend-failed': 'invitationResendFailed',\n 'failed-to-accept': 'failedToAccept',\n 'invitee-not-found': 'inviteeNotFound',\n 'invitation-not-found': 'invitationNotFound',\n 'invitation-deleted': 'invitationDeleted',\n 'too-many-emails': 'tooManyEmails'\n};\n\nexport const ErrorMessageHelper = {\n libraryApiError(xhr: LibraryApiXhr): string {\n const phrase = LIBRARY_ERROR_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n },\n inviteColleagueError(xhr: InviteColleagueXhr): string {\n const phrase = INVITE_COLLEAGUE_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n }\n};\n\nexport const ErrorMessageHelperValidation = {\n libraryApiErrors(): void {\n Object.values(LIBRARY_ERROR_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n },\n inviteColleagueErrors(): void {\n Object.values(INVITE_COLLEAGUE_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n }\n};\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\ninterface OpenLibraryFolderParams {\n libraryId: string;\n folderId: string;\n}\n\nexport const LaunchUrlHelper = {\n buildOpenAppLinkUrl(baseLaunchUrl: string, appLink: string, product?: string): string {\n return UrlHelper.urlBuilder(`${baseLaunchUrl}/open`, { appLink, product });\n },\n\n buildOpenVideoUrl(baseLaunchUrl: string, videoId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `video:${videoId}`, product);\n },\n\n buildOpenClipUrl(baseLaunchUrl: string, clipId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `clip:${clipId}`, product);\n },\n\n buildOpenInteractiveUrl(baseLaunchUrl: string, interactiveId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `interactive:${interactiveId}`, product);\n },\n\n buildOpenTopicUrl(baseLaunchUrl: string, topicId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `topic:${topicId}`, product);\n },\n\n buildOpenSeriesUrl(baseLaunchUrl: string, seriesId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `series:${seriesId}`, product);\n },\n\n buildOpenPlaylistUrl(baseLaunchUrl: string, playlistId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `playlist:${playlistId}`, product);\n },\n\n buildOpenCategoryUrl(baseLaunchUrl: string, categoryId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `category:${categoryId}`, product);\n },\n\n buildOpenLibraryFolderUrl(baseLaunchUrl: string, params: OpenLibraryFolderParams, product?: string): string {\n const appLink = `library:${params.libraryId}:folder:${params.folderId}`;\n \n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, appLink, product);\n }\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { AlertType } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AddToLibraryForm } from 'libs/shared/apps/libraries/components/add-to-library-form/AddToLibraryForm';\nimport { LibraryHelper } from 'libs/shared/apps/libraries/utils/LibraryHelper';\nimport { AddToLibraryValidationSchema } from 'libs/shared/apps/libraries/validation/AddToLibraryValidationSchema';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LibraryRequestObjectType } from 'libs/shared/enums/LibraryRequestObjectType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { BaseTree, Clip, Config, CurrentUser, Folder, InteractiveMetadata, Library, LibraryTree, PopupViewProps, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { AddToLibraryRequest } from 'libs/shared/interfaces/requests/AddToLibraryRequest';\nimport { LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\nimport { ErrorMessageHelper } from 'libs/shared/utils/error-message-helper/ErrorMessageHelper';\nimport { LaunchUrlHelper } from 'libs/shared/utils/LaunchUrlHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\nimport { VideoSortHelper } from 'libs/shared/utils/VideoSortHelper';\n\nexport interface AddToLibraryFormValues {\n library: Library;\n folder: Folder;\n comment?: string;\n}\n\ntype LibraryObjectType = MasterType.Video | MasterType.Clip | MasterType.Interactive;\n\ntype ObjectTypeMap = {\n [K in LibraryObjectType]: LibraryRequestObjectType;\n};\n\nconst OBJECT_TYPE_MAP: ObjectTypeMap = {\n [MasterType.Video]: LibraryRequestObjectType.MasterVideo,\n [MasterType.Clip]: LibraryRequestObjectType.MasterClip,\n [MasterType.Interactive]: LibraryRequestObjectType.MasterInteractive\n};\n\nconst namespace = 'libraries.addToLibrary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryViewProps extends PopupViewProps {\n id: string;\n typeId: MasterType;\n folderAppLink?: Core.AppLink;\n}\n\nexport function AddToLibraryView(props: AddToLibraryViewProps): JSX.Element {\n const user = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const librariesWithCategories = Flight.useBasicFetch<LibraryTree[]>(LibraryRequests.librariesWithCategories());\n const libraries = Flight.useBasicFetch<Library[]>(LibraryRequests.libraryRequestLibraries());\n\n const videoRequest = VideoHelper.getVideoRequest(props.id, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const isClipOrInteractive = VideoHelper.isClip(video.data) || VideoHelper.isInteractive(video.data);\n const parentVideo = isClipOrInteractive && (video.data as Clip | InteractiveMetadata)?._parentVideo;\n const parentVideoDetails = Flight.useBasicFetch<Video>(\n parentVideo && VideoRequests.video(parentVideo.id)\n );\n\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const sortedLibraries = React.useMemo(() => LibraryHelper.sort(libraries.data), [libraries.data]);\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n const sort = !!user.data && VideoSortHelper.getOrSetSortType(user.data.id);\n\n /**\n * We try to pull the library and category id off the video/clip/interactive.\n * If we can't, then we try to get them off the _parentVideo. \n */\n function getSourceIds() {\n let sourceCategoryId: string = null;\n let sourceLibraryId = ArrayHelper.first(video.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && video.data.categories.data?.length) {\n const category = video.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n\n if (category)\n sourceCategoryId = category.id;\n }\n\n if (!sourceLibraryId) {\n sourceLibraryId = ArrayHelper.first(parentVideoDetails.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && parentVideoDetails.data.categories.data?.length) {\n const category = parentVideoDetails.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n \n if (category)\n sourceCategoryId = category.id;\n }\n }\n\n return {\n sourceLibraryId: sourceLibraryId ? +sourceLibraryId : null,\n sourceCategoryId: sourceCategoryId ? +sourceCategoryId : null\n };\n }\n\n function addToLibrary(data: AddToLibraryFormValues, onDone: () => void): void {\n const { sourceLibraryId, sourceCategoryId } = getSourceIds();\n\n const request: AddToLibraryRequest = {\n objectId: props.id.toString(),\n objectType: OBJECT_TYPE_MAP[props.typeId as LibraryObjectType],\n message: data.comment,\n sourceLibraryId,\n destinationLibraryId: +data.library.id,\n metadata: {\n destinationCategoryId: +data.folder.id,\n sourceCategoryId\n }\n };\n\n fetchAsync(LibraryRequests.addToLibrary(request, sort))\n .then(() => {\n if (!data.library.canAddContent) {\n alerts.success({\n type: AlertType.Pending,\n heading: getPhrase('pendingApproval'),\n message: getPhrase('libraryRequestSent', { library: data.library.name, escapeText: true })\n });\n } else {\n alerts.success({\n type: AlertType.Success,\n heading: '',\n message: getPhrase('addToLibrarySuccess', { folder: data.folder.name, video: video.data.name, escapeText: true }),\n ...(props.folderAppLink ? {\n appLink: {\n ...props.folderAppLink,\n args: [ data.library.id, data.folder.id, TextHelper.slugify(data.folder.name) ]\n },\n appLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n appLinkClassName: 'info-link'\n } : {\n extLink: LaunchUrlHelper.buildOpenLibraryFolderUrl(config.data.launchUrl, {\n libraryId: data.library.id,\n folderId: data.folder.id\n }),\n extLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n extLinkClassName: 'info-link'\n })\n });\n }\n })\n .catch((xhr: LibraryApiXhr) => {\n const errorMessage = ErrorMessageHelper.libraryApiError(xhr);\n handleGenerateReportError(xhr, errorMessage, errorMessage);\n onDone();\n })\n .finally(() => {\n props.closePopup();\n });\n }\n\n function getCategoryTree(libraryId: string): LibraryTree[] {\n return librariesWithCategories.data.find(l => l.data.id.toString() === libraryId.toString())?.children;\n }\n\n function isFolderDisabled(folder: BaseTree<Folder>): boolean {\n return !!video.data.categories?.data?.find(category => category.id === folder.id);\n }\n\n const dataLoaded = (\n libraries.data &&\n video.data &&\n librariesWithCategories.data\n );\n\n return (\n <Popup title={getPhrase('addToLibrary')} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded || loading}>\n {dataLoaded && (\n <FormWrapper<AddToLibraryFormValues>\n initialValues={{\n library: ArrayHelper.first(sortedLibraries),\n folder: null,\n comment: ''\n }}\n validationSchema={AddToLibraryValidationSchema}\n onSubmit={addToLibrary}\n >\n <AddToLibraryForm\n libraries={sortedLibraries}\n closePopup={props.closePopup}\n isFolderDisabled={isFolderDisabled}\n video={video.data}\n videoLibraries={video.data?.libraries?.data}\n getCategoryTree={getCategoryTree}\n />\n </FormWrapper>\n )}\n </Popup>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{_t as e,ft as t,s as n}from"./CnnBLBPY.chunk.js";import{y as r}from"./D8clSITt.chunk.js";import{t as i}from"./GN6vNflP.chunk.js";import{t as a}from"./xL848v0O.chunk.js";import{t as o}from"./CrBD6Z4s.chunk.js";import{t as s}from"./D_PyfoSL.chunk.js";import{c,tt as l}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{_t as e,ft as t,s as n}from"./CnnBLBPY.chunk.js";import{y as r}from"./D8clSITt.chunk.js";import{t as i}from"./GN6vNflP.chunk.js";import{t as a}from"./xL848v0O.chunk.js";import{t as o}from"./CrBD6Z4s.chunk.js";import{t as s}from"./D_PyfoSL.chunk.js";import{c,tt as l}from"./app-CgkYY4K0.js";import{t as u}from"./CTTruW3_2.chunk.js";import{t as d}from"./D2DuwJJH2.chunk.js";import{t as f}from"./DjuXXgD-2.chunk.js";import{i as p,t as m}from"./CxfZJDOr2.chunk.js";var h=function(e){return e.Screenrights=`screenrights`,e.Era=`era`,e.ClickView=`clickview`,e}({}),g={clip(e,t){return{key:`clip:${e}:${t}`,url:o.urlBuilder(`{gateway}/v1/objects/${e}`,{query:c.CLIP,permissionFilterOption:t})}},videoClips(e,t,n){return{key:`video:${e}:clips:${t}:${n}`,url:o.urlBuilder(`{gateway}/v1/objects/${e}/clips`,{query:c.CLIP_COLLECTION,permissionFilterOption:t,cursor:n})}},clipWithAllInteractives(e,t){return{key:`clip:${e}:${t}:interactives`,url:o.urlBuilder(`{gateway}/v1/objects/${e}`,{query:`${c.CLIP},interactives{status:[0,1]}`,permissionFilterOption:t}),normalize:!1}},publicClip(e,t,n,r){return{key:`clip:${e}:public:${t}`,url:o.urlBuilder(`/api/objects/${e}`,{query:`_parentVideo,_canBeConsumed,_thumbnail`,permissionFilterOption:d.StripMetadata,shareId:t}),bootstrapName:`shared:object:${e}`,success:n,error:r}},sharedClip(e,t,n,r){return{key:`shared:clip:${e}`,url:o.urlBuilder(`/api/objects/${e}`,{shareId:t,query:c.CLIP}),success:n,error:r}},createClip(e,t,n,i,a){return{key:`create:clip`,url:`{gateway}/v1/objects/${e}/clips`,data:t,type:r.POST,invalidationKeys:[`videos:${e}`,`my:videos`],success:n,error:i,always:a}},updateClip(e,t,n,i,a){return{key:`update:clip`,url:`{gateway}/v1/objects/${e}`,data:t,type:r.PUT,invalidationKeys:[`clip:${e}`],success:n,error:i,always:a}},deleteClip(e,t,n,i,a){return{key:`delete:clip`,url:`{gateway}/v1/objects/${e}`,type:r.DELETE,invalidationKeys:[`videos:${t}`,`my:videos`,`videos`],success:n,error:i,always:a}}},_={interactiveMetadata(e,t){return{url:o.urlBuilder(`{gateway}/v1/objects/${e}`,{query:c.INTERACTIVE,permissionFilterOption:t}),key:`interactive:metadata:${e}:${t}`}},videoInteractives(e,t,n){return{key:`video:${e}:interactives:${t}:${n}`,url:o.urlBuilder(`{gateway}/v1/objects/${e}/interactives`,{query:c.INTERACTIVE_COLLECTION,cursor:n}),publicUrl:o.urlBuilder(`/api/objects/${e}/interactives`,{query:c.INTERACTIVE_COLLECTION,cursor:n})}},sharedInteractiveMetadata(e,t,n,r){return{url:o.urlBuilder(`/api/objects/${e}`,{shareId:t,query:c.INTERACTIVE}),key:`shared:interactive:metadata:${e}`,success:n,error:r}},publicInteractiveMetadata(e,t,n,r){return{url:o.urlBuilder(`/api/objects/${e}`,{query:`_parentVideo[_rating],_canBeConsumed,_thumbnail`,permissionFilterOption:d.StripMetadata,shareId:t}),key:`interactive:metadata:${e}:public:${t}`,bootstrapName:`shared:object:${e}`,success:n,error:r}},interactive(e){return{url:`/api/domain/v1/interactives/${e}`,key:`interactive:${e}`,normalize:!1}},createInteractive(e,t,n){return{url:`/api/domain/v1/interactives`,key:`create:interactive`,type:r.POST,invalidationKeys:[`my:videos`],data:e,success:t,error:n}},createInteractiveMetadata(e,t,n,i){return{url:`{gateway}/v1/objects/${e}/interactives`,key:`create:interactive:metadata`,type:r.POST,data:t,success:n,error:i}},updateInteractive(e,t,n,i){return{url:`/api/domain/v1/interactives/${e}`,key:`update:interactive`,type:r.PUT,data:t,success:n,error:i,formatData:()=>t,invalidationKeys:[`interactive:${e}`]}},updateInteractiveMetadata(e,t,n,i){return{url:`{gateway}/v1/objects/${e}`,key:`update:interactive:metadata`,type:r.PUT,data:t,success:n,error:i}},interactiveResultSet(e,t){return{url:`/api/domain/v1/analytics/interactives/${e}/metadata/${t}`,key:`interactive:result:set:${e}:${t}`}},copyInteractive(e,t,n){return{url:`/api/domain/v1/interactives/${e}/copy`,key:`copy:interactive`,type:r.POST,invalidationKeys:[`interactive:${e}`,`my:videos`],success:t,error:n}},deleteInteractiveMetadata(e,t,n){return{url:`{gateway}/v1/objects/${e}`,key:`delete:interactive`,type:r.DELETE,invalidationKeys:[`interactive:${e}`,`my:videos`,`videos`],success:t,error:n}},removeInteractiveMetadata({libraryId:e,categoryId:t,interactiveMetadataId:n}){return{url:o.urlBuilder(`/api/domain/v1/libraries/${e}/videos`,{categoryId:t,videoIds:n}),key:`remove:interactive:metadata:${n}`,type:r.DELETE,invalidationKeys:[`interactive:${n}`,`my:videos`,`videos`]}},contributeToCommunity(e){return{url:`/api/domain/v2/interactives/${e}/contribute`,key:`contribute:interactive`,type:r.POST}},revokefromCommunity(e){return{url:`/api/domain/v2/interactives/${e}/contribute`,key:`contribute:interactive`,type:r.DELETE}},isContributed(e){return{url:`/api/domain/v2/interactives/${e}/contributed`,key:`iscontributed:${e}`,normalize:!1}},updateInteraction(e){return{url:`/api/domain/v1/interactions/bulk/${e.id}`,key:`contribute:interactive`,data:e,type:r.PUT,invalidationKeys:[`interactive:${e.interactiveId}`]}}},v=i.encloseNamespace(`shared.shared-utils`),y={isVideo(e){return e?.typeId===l.Video},isClip(e){return e?.typeId===l.Clip},isInteractive(e){return e?.typeId===l.Interactive},isVideoTypeArchived(e){return e?.status===u.Archived},isVideoType(e){return y.isVideo(e)||y.isInteractive(e)||y.isClip(e)},hasSeries(e){return!!e?.series?.id},showVideoGuidance(e){return!e(s.StudentExperience)},showInteractivesGuidance(e){return!e||y.isInteractive(e)?!1:!!e.interactives?.data?.length},showResourcesGuidance(e){return!e||y.isInteractive(e)?!1:!!((e.resources?.data?.length||0)+(e.links?.data?.length||0))},canViewCurriculumLinks(e,t){return!(e(s.ViewCurriculums)&&e(s.ManagePresentations))||!t||!y.isVideo(t)?!1:!!t._hasCurriculumLinks?.value},getVideoProgress(e){return e?.lastProgressPoint?e?.lastProgressPoint:e?._videoProgress?.progress?e?._videoProgress?.progress:0},getThumbnail(e){if(!e)return null;if(y.isVideo(e))return e.thumbnail;if(e?._thumbnail)return e._thumbnail;if(y.isClip(e))return e.thumbnail||e._parentVideo?.thumbnail;if(y.isInteractive(e))return e._parentVideo?.thumbnail||e._parentClip?.thumbnail},getDuration(e){if(e){if(y.isVideo(e))return e.duration;if(y.isInteractive(e)){if(e._parentClip?.id)return(e._parentClip.endTime-e._parentClip.startTime)*1e3;if(e._parentVideo?.duration)return e._parentVideo.duration}if(y.isClip(e))return(e.endTime-e.startTime)*1e3}},getAnalyticsEntity(e){if(y.isVideo(e))return n.Video;if(y.isInteractive(e))return n.Interactive;if(y.isClip(e))return n.Clip},getAnalyticsData(e,t={}){if(y.isVideo(e))return{...t||{},id:e.id,name:e.name};if(y.isClip(e)){let n={...t||{},id:e.id,name:e.name};return e._parentVideo?.id&&(n.video={id:e._parentVideo?.id,name:e._parentVideo.name}),n}let n={...t,id:e.id,interactiveId:e.interactiveId,name:e.name,status:e.status,originType:e.originType};return e?._parentClip?.id&&(n.clip={id:e?._parentClip?.id,name:e?._parentClip.name}),e?._parentVideo?.id&&(n.video={id:e?._parentVideo?.id,name:e?._parentVideo.name}),n},getCanBeConsumed(e){return!e||!y.isVideoType(e)?{canNavigate:!1,canConsume:!1}:e._canBeConsumed?{canNavigate:e._canBeConsumed?.reason===`login-required`&&y.isVideo(e)||e._canBeConsumed.value===!0,canConsume:e._canBeConsumed.value,reason:e._canBeConsumed?.reason}:{canNavigate:!0,canConsume:!0}},getPrivacyReasoning(e,t=!1){let{canConsume:n,canNavigate:r,reason:i}=y.getCanBeConsumed(e),a=()=>y.isClip(e)?v(`clipParentDeleted`):y.isInteractive(e)?v(`interactiveParentDeleted`):v(`videoDeleted`),o=()=>y.isClip(e)?v(`clipLoginRequired`):y.isInteractive(e)?v(`interactiveLoginRequired`):v(`videoLoginRequired`);if(!n&&!r){if(t)return o();switch(i){case`rating-not-allowed`:return v(`ratingNotAllowed`);case`video-deleted`:return a();case`clickview-private`:return v(`clickViewPrivate`);case`private`:return v(`genericCannotAccess`);case`login-required`:return o();case`restricted-access`:return m.getWeightedRestriction(e._restrictions?.value)?.type===p.Custom?v(`awaitingApproval`):v(`restrictedAccess`);default:return v(`genericCannotAccess`)}}return y.isInteractive(e)&&e.status===u.Draft?v(`draftInteractive`):``},getTitle(e){if(e.name)return y.isInteractive(e)&&e.status===u.Draft?v(`draftInteractiveTitle`,{name:e.name}):e.name;let{canConsume:t,reason:n}=y.getCanBeConsumed(e);return v(!t&&n===`private`?`privateVideo`:!t&&n===`video-deleted`?`videoUnavailable`:`privateVideo`)},getParentVideo(e){if(y.isVideo(e))return e;if(y.isClip(e)||y.isInteractive(e))return e._parentVideo},getRating(e){return y.isVideo(e)?e._rating?.value||e.rating:e?._parentVideo?._rating?.value},getVideoRequest(n,r,i){if(i){switch(r){case l.Video:return f.sharedVideo(n,i);case l.Clip:return g.sharedClip(n,i);case l.Interactive:return _.sharedInteractiveMetadata(n,i)}e.throw(new t(`Unsupported master type`))}switch(r){case l.Video:return f.video(n);case l.Clip:return g.clip(n);case l.Interactive:return _.interactiveMetadata(n)}e.throw(new t(`Unsupported master type`))},isBroadcast(e){return!!e?.contentLicences?.data?.some(e=>e.systemName===h.Era||e.systemName===h.Screenrights)},isUgc(e){return!y.isBroadcast(e)&&!e?._isClickViewCurated?.value},getReleaseDate(e){return e&&e.dateReleased&&y.isBroadcast(e)?a.format(e.dateReleased,`DD/MM/YYYY`):``},canViewOriginalVideo(e){return!!e?._parentVideo?._canBeConsumed?.value},getTrackingCode(e){if(y.isVideo(e))return e.trackingCode;if(y.isClip(e)||y.isInteractive(e))return e._parentVideo.trackingCode},isInExchange(e){return!!e?.libraries?.data?.some(e=>e.typeId===l.ExchangeCollection)},canViewUploadDate(e){return!(!e||!e.dateCreated||!e._isClickViewCurated||e._isClickViewCurated.value)}};export{y as t};
|
|
2
|
+
//# sourceMappingURL=_3n_0ch72.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"G-hiM6b42.chunk.js","names":[],"sources":["../../../../libs/shared/src/enums/ContentLicenceType.ts","../../../../libs/shared/src/flight-requests/ClipRequests.ts","../../../../libs/shared/src/flight-requests/InteractiveRequests.ts","../../../../libs/shared/src/utils/VideoHelper.ts"],"sourcesContent":["export enum ContentLicenseType {\n Screenrights = 'screenrights',\n Era = 'era',\n ClickView = 'clickview'\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { Clip, CreateOrUpdateClipRequest } from 'libs/shared/interfaces';\n\nexport const ClipRequests = {\n clip(id: string, permissionFilterOption?: PermissionFilterOption): Flight.Request {\n return {\n key: `clip:${id}:${permissionFilterOption}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: SharedWithStatements.CLIP,\n permissionFilterOption\n })\n };\n },\n\n videoClips(parentId: string, permissionFilterOption?: PermissionFilterOption, cursor?: string) {\n return {\n key: `video:${parentId}:clips:${permissionFilterOption}:${cursor}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${parentId}/clips`, {\n query: SharedWithStatements.CLIP_COLLECTION,\n permissionFilterOption,\n cursor\n })\n };\n },\n\n clipWithAllInteractives(id: string, permissionFilterOption?: PermissionFilterOption): Flight.Request {\n return {\n key: `clip:${id}:${permissionFilterOption}:interactives`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `${SharedWithStatements.CLIP},interactives{status:[0,1]}`,\n permissionFilterOption\n }),\n normalize: false\n };\n },\n\n publicClip(\n id: string,\n shareId?: string,\n success?: (clip: Clip) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n key: `clip:${id}:public:${shareId}`,\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n // Query statement here is coupled with ClickView.Lite.Common\\Services\\OpenGraph\\OpenGraphService.cs\n // in lite. If you update this, please update both.\n query: '_parentVideo,_canBeConsumed,_thumbnail',\n permissionFilterOption: PermissionFilterOption.StripMetadata,\n shareId\n }),\n bootstrapName: `shared:object:${id}`,\n success,\n error\n };\n },\n\n sharedClip(\n id: string,\n shareId: string,\n success?: (clip: Clip) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n key: `shared:clip:${id}`,\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n shareId,\n query: SharedWithStatements.CLIP\n }),\n success,\n error\n };\n },\n\n createClip(\n videoId: string,\n data: CreateOrUpdateClipRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'create:clip',\n url: `{gateway}/v1/objects/${videoId}/clips`,\n data,\n type: HttpVerbs.POST,\n invalidationKeys: [ `videos:${videoId}`, 'my:videos' ],\n success,\n error,\n always\n };\n },\n\n updateClip(\n id: string,\n data: CreateOrUpdateClipRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'update:clip',\n url: `{gateway}/v1/objects/${id}`,\n data,\n type: HttpVerbs.PUT,\n invalidationKeys: [`clip:${id}`],\n success,\n error,\n always\n };\n },\n\n deleteClip(\n id: string,\n videoId: string,\n success?: (data: any) => void,\n error?: (data: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: `delete:clip`,\n url: `{gateway}/v1/objects/${id}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [ `videos:${videoId}`, 'my:videos', 'videos' ],\n success,\n error,\n always\n };\n }\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { CreateInteractiveMetadataRequest, CreateInteractiveRequest, EditInteractiveMetadataOriginRequest, EditInteractiveMetadataRequest, EditInteractiveRequest, Interaction, InteractiveMetadata } from 'libs/shared/interfaces';\n\nexport const InteractiveRequests = {\n interactiveMetadata(id: string, permissionFilterOption?: PermissionFilterOption): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: SharedWithStatements.INTERACTIVE,\n permissionFilterOption\n }),\n key: `interactive:metadata:${id}:${permissionFilterOption}`\n };\n },\n\n videoInteractives(\n parentId: string,\n permissionFilterOption?: PermissionFilterOption,\n cursor?: string\n ): Flight.PublicRequest {\n return {\n key: `video:${parentId}:interactives:${permissionFilterOption}:${cursor}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${parentId}/interactives`, {\n query: SharedWithStatements.INTERACTIVE_COLLECTION,\n cursor\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${parentId}/interactives`, {\n query: SharedWithStatements.INTERACTIVE_COLLECTION,\n cursor\n })\n };\n },\n\n sharedInteractiveMetadata(\n id: string,\n shareId: string,\n success?: (interactiveMetadata: InteractiveMetadata) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n shareId,\n query: SharedWithStatements.INTERACTIVE\n }),\n key: `shared:interactive:metadata:${id}`,\n success,\n error\n };\n },\n publicInteractiveMetadata(\n id: string,\n shareId?: string,\n success?: (interactive: InteractiveMetadata) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n // Query statement here is coupled with ClickView.Lite.Common\\Services\\OpenGraph\\OpenGraphService.cs\n // in lite. If you update this, please update both.\n query: '_parentVideo[_rating],_canBeConsumed,_thumbnail',\n permissionFilterOption: PermissionFilterOption.StripMetadata,\n shareId\n }),\n key: `interactive:metadata:${id}:public:${shareId}`,\n bootstrapName: `shared:object:${id}`,\n success,\n error\n };\n },\n interactive(id: string): Flight.Request {\n return {\n url: `/api/domain/v1/interactives/${id}`,\n key: `interactive:${id}`,\n normalize: false\n };\n },\n createInteractive(\n data: CreateInteractiveRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: '/api/domain/v1/interactives',\n key: 'create:interactive',\n type: HttpVerbs.POST,\n invalidationKeys: ['my:videos'],\n data,\n success,\n error\n };\n },\n createInteractiveMetadata(\n videoId: string,\n data: CreateInteractiveMetadataRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${videoId}/interactives`,\n key: 'create:interactive:metadata',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n updateInteractive(\n id: string,\n data: EditInteractiveRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/interactives/${id}`,\n key: 'update:interactive',\n type: HttpVerbs.PUT,\n data,\n success,\n error,\n /* Update state because domain doesn't return the updated object */\n formatData: () => data,\n invalidationKeys: [`interactive:${id}`]\n };\n },\n updateInteractiveMetadata(\n id: string,\n data: EditInteractiveMetadataRequest | EditInteractiveMetadataOriginRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}`,\n key: 'update:interactive:metadata',\n type: HttpVerbs.PUT,\n data,\n success,\n error\n };\n },\n interactiveResultSet(interactiveId: string, interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`\n };\n },\n copyInteractive(\n interactiveId: string,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/interactives/${interactiveId}/copy`,\n key: 'copy:interactive',\n type: HttpVerbs.POST,\n invalidationKeys: [ `interactive:${interactiveId}`, 'my:videos' ],\n success,\n error\n };\n },\n deleteInteractiveMetadata(\n interactiveMetadataId: string,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${interactiveMetadataId}`,\n key: 'delete:interactive',\n type: HttpVerbs.DELETE,\n invalidationKeys: [ `interactive:${interactiveMetadataId}`, 'my:videos', 'videos' ],\n success,\n error\n };\n },\n removeInteractiveMetadata({\n libraryId,\n categoryId,\n interactiveMetadataId\n }: {\n libraryId: string,\n categoryId: string,\n interactiveMetadataId: string\n }): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/domain/v1/libraries/${libraryId}/videos`, { categoryId, videoIds: interactiveMetadataId }),\n key: `remove:interactive:metadata:${interactiveMetadataId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [ `interactive:${interactiveMetadataId}`, 'my:videos', 'videos' ]\n };\n },\n contributeToCommunity(interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v2/interactives/${interactiveMetadataId}/contribute`,\n key: 'contribute:interactive',\n type: HttpVerbs.POST\n };\n },\n revokefromCommunity(interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v2/interactives/${interactiveMetadataId}/contribute`,\n key: 'contribute:interactive',\n type: HttpVerbs.DELETE\n };\n },\n isContributed(interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v2/interactives/${interactiveMetadataId}/contributed`,\n key: `iscontributed:${interactiveMetadataId}`,\n normalize: false\n };\n },\n updateInteraction(interaction: Interaction) {\n return {\n url: `/api/domain/v1/interactions/bulk/${interaction.id}`,\n key: 'contribute:interactive',\n data: interaction,\n type: HttpVerbs.PUT,\n invalidationKeys: [`interactive:${interaction.interactiveId}`]\n };\n }\n};\n","import { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { ContentLicenseType } from 'libs/shared/enums/ContentLicenceType';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { BaseObject, CanBeConsumedReason, Clip, InteractiveMetadata, Rating, Thumbnail, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { PermissionName } from '../enums/PermissionName';\nimport { HasPermissionsFunc } from '../hooks/usePermissions';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const VideoHelper = {\n isVideo(obj: BaseObject): obj is Video {\n return obj?.typeId === MasterType.Video;\n },\n\n isClip(obj: BaseObject): obj is Clip {\n return obj?.typeId === MasterType.Clip;\n },\n\n isInteractive(obj: BaseObject): obj is InteractiveMetadata {\n return obj?.typeId === MasterType.Interactive;\n },\n\n isVideoTypeArchived(obj: VideoTypes): boolean {\n return obj?.status === CurationStatus.Archived;\n },\n\n /**\n * Returns true of the object is a video, clip or interactive\n */\n isVideoType(object: BaseObject): object is Video | Clip | InteractiveMetadata {\n return VideoHelper.isVideo(object) || VideoHelper.isInteractive(object) || VideoHelper.isClip(object);\n },\n\n hasSeries(video: Video): boolean {\n return !!video?.series?.id;\n },\n\n showVideoGuidance(hasPermissions: HasPermissionsFunc): boolean {\n return !hasPermissions(PermissionName.StudentExperience);\n },\n\n showInteractivesGuidance(video: VideoTypes): boolean {\n if (!video || VideoHelper.isInteractive(video))\n return false;\n\n const interactiveCount = video.interactives?.data?.length || 0;\n\n return !!interactiveCount;\n },\n\n showResourcesGuidance(video: VideoTypes): boolean {\n if (!video || VideoHelper.isInteractive(video))\n return false;\n\n const resourceCount = (\n (video.resources?.data?.length || 0) +\n (video.links?.data?.length || 0)\n );\n\n return !!resourceCount;\n },\n\n canViewCurriculumLinks(hasPermissions: HasPermissionsFunc, video: VideoTypes): boolean {\n const canView = (\n hasPermissions(PermissionName.ViewCurriculums) &&\n hasPermissions(PermissionName.ManagePresentations)\n );\n\n if (!canView)\n return false;\n \n if (!video || !VideoHelper.isVideo(video))\n return false;\n\n return !!video._hasCurriculumLinks?.value;\n },\n\n getVideoProgress(video: Video): number {\n if (video?.lastProgressPoint)\n return video?.lastProgressPoint;\n\n // Use virtual assoc\n if (video?._videoProgress?.progress)\n return video?._videoProgress?.progress;\n\n return 0;\n },\n\n getThumbnail(video: VideoTypes): Thumbnail {\n if (!video)\n return null;\n\n if (VideoHelper.isVideo(video))\n return video.thumbnail;\n\n if (video?._thumbnail)\n return video._thumbnail;\n\n // Fallbacks for virtual assoc if needed\n if (VideoHelper.isClip(video))\n return video.thumbnail || video._parentVideo?.thumbnail;\n\n if (VideoHelper.isInteractive(video))\n return video._parentVideo?.thumbnail || video._parentClip?.thumbnail;\n },\n\n getDuration(video: VideoTypes): number {\n if (!video)\n return;\n\n if (VideoHelper.isVideo(video))\n return video.duration;\n\n if (VideoHelper.isInteractive(video)) {\n if (video._parentClip?.id)\n return (video._parentClip.endTime - video._parentClip.startTime) * 1000;\n\n if (video._parentVideo?.duration)\n return video._parentVideo.duration;\n }\n\n if (VideoHelper.isClip(video))\n return (video.endTime - video.startTime) * 1000;\n },\n\n getAnalyticsEntity(video: VideoTypes): EntityType {\n if (VideoHelper.isVideo(video))\n return EntityType.Video;\n\n if (VideoHelper.isInteractive(video))\n return EntityType.Interactive;\n\n if (VideoHelper.isClip(video))\n return EntityType.Clip;\n },\n\n getAnalyticsData(\n video: VideoTypes,\n extraAnalyticsData: HashObject = {}\n ): HashObject {\n if (VideoHelper.isVideo(video)) {\n return {\n ...(extraAnalyticsData || {}),\n id: video.id,\n name: video.name\n };\n }\n\n if (VideoHelper.isClip(video)) {\n const data: HashObject = {\n ...(extraAnalyticsData || {}),\n id: video.id,\n name: video.name\n };\n\n if (video._parentVideo?.id)\n data.video = { id: video._parentVideo?.id, name: video._parentVideo.name };\n\n return data;\n }\n\n const data: HashObject = {\n ...extraAnalyticsData,\n id: video.id,\n interactiveId: video.interactiveId,\n name: video.name,\n status: video.status,\n originType: video.originType\n };\n\n if (video?._parentClip?.id)\n data.clip = { id: video?._parentClip?.id, name: video?._parentClip.name };\n\n if (video?._parentVideo?.id)\n data.video = { id: video?._parentVideo?.id, name: video?._parentVideo.name };\n \n return data;\n },\n\n getCanBeConsumed(video: BaseObject): {\n canNavigate: boolean,\n canConsume: boolean,\n reason?: CanBeConsumedReason\n } {\n if (!video || !VideoHelper.isVideoType(video)) {\n return {\n canNavigate: false,\n canConsume: false\n };\n }\n\n if (video._canBeConsumed) {\n return {\n /**\n * Product navigation is enabled for \"login-required\" reason to support public access. \n * The video itself cannot be consumed, however, clients can allow users to browse the platform.\n * \n * Note: canNavigate is initially available for just videos. Interactives and Clips will be supported in Y2.\n */\n canNavigate: (video._canBeConsumed?.reason === 'login-required' && VideoHelper.isVideo(video)) || video._canBeConsumed.value === true,\n canConsume: video._canBeConsumed.value,\n reason: video._canBeConsumed?.reason\n };\n }\n\n /**\n * Many of the components shared between online and lite read this value.\n * Online doesn't fetch or care about this value, which means by this point it should\n * still be null. In this case, we just set it to true so that the components can render\n * as normal.\n */\n return {\n canNavigate: true,\n canConsume: true\n };\n },\n\n getPrivacyReasoning(video: VideoTypes, showSignIn: boolean = false): string {\n const { canConsume, canNavigate, reason } = VideoHelper.getCanBeConsumed(video);\n\n const getNoLongerAvailableText = () => {\n if (VideoHelper.isClip(video))\n return getPhrase('clipParentDeleted');\n\n if (VideoHelper.isInteractive(video))\n return getPhrase('interactiveParentDeleted');\n\n return getPhrase('videoDeleted');\n };\n\n const getLoginRequiredText = () => {\n if (VideoHelper.isClip(video))\n return getPhrase('clipLoginRequired');\n\n if (VideoHelper.isInteractive(video))\n return getPhrase('interactiveLoginRequired');\n\n return getPhrase('videoLoginRequired');\n };\n\n if (!canConsume && !canNavigate) {\n if (showSignIn)\n return getLoginRequiredText();\n\n switch (reason) {\n case 'rating-not-allowed': {\n return getPhrase('ratingNotAllowed');\n }\n\n case 'video-deleted': {\n return getNoLongerAvailableText();\n }\n\n case 'clickview-private': {\n return getPhrase('clickViewPrivate');\n }\n\n case 'private': {\n return getPhrase('genericCannotAccess');\n }\n\n case 'login-required': {\n return getLoginRequiredText();\n }\n\n case 'restricted-access': {\n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n\n if (restriction?.type === RestrictionType.Custom)\n return getPhrase('awaitingApproval');\n\n return getPhrase('restrictedAccess');\n }\n\n default: {\n return getPhrase('genericCannotAccess');\n }\n }\n }\n\n if (VideoHelper.isInteractive(video) && video.status === CurationStatus.Draft)\n return getPhrase('draftInteractive');\n\n return '';\n },\n\n getTitle(video: VideoTypes): string {\n if (video.name) {\n if (VideoHelper.isInteractive(video) && video.status === CurationStatus.Draft) {\n return getPhrase('draftInteractiveTitle', { name: video.name });\n }\n\n return video.name;\n }\n\n const { canConsume, reason } = VideoHelper.getCanBeConsumed(video);\n\n if (!canConsume && reason === 'private')\n return getPhrase('privateVideo');\n\n if (!canConsume && reason === 'video-deleted')\n return getPhrase('videoUnavailable');\n\n return getPhrase('privateVideo');\n },\n\n getParentVideo(video: VideoTypes): Video | null {\n if (VideoHelper.isVideo(video))\n return video;\n\n if (VideoHelper.isClip(video) || VideoHelper.isInteractive(video))\n return video._parentVideo;\n },\n\n getRating(video: VideoTypes): Rating | null {\n if (VideoHelper.isVideo(video))\n return video._rating?.value || video.rating;\n\n return video?._parentVideo?._rating?.value;\n },\n\n getVideoRequest(\n objectId: string,\n objectTypeId: MasterType,\n shareId?: string\n ): Flight.Request {\n if (shareId) {\n switch (objectTypeId) {\n case MasterType.Video:\n return VideoRequests.sharedVideo(objectId, shareId);\n case MasterType.Clip:\n return ClipRequests.sharedClip(objectId, shareId);\n case MasterType.Interactive:\n return InteractiveRequests.sharedInteractiveMetadata(objectId, shareId);\n }\n\n Core.ErrorHelper.throw(new DevError('Unsupported master type'));\n }\n\n switch (objectTypeId) {\n case MasterType.Video:\n return VideoRequests.video(objectId);\n case MasterType.Clip:\n return ClipRequests.clip(objectId);\n case MasterType.Interactive:\n return InteractiveRequests.interactiveMetadata(objectId);\n }\n\n Core.ErrorHelper.throw(new DevError('Unsupported master type'));\n },\n\n isBroadcast(video: Video): boolean {\n return !!video?.contentLicences?.data?.some(l =>\n l.systemName === ContentLicenseType.Era ||\n l.systemName === ContentLicenseType.Screenrights);\n },\n\n isUgc(video: Video): boolean {\n // if video isn't broadcast and isn't curated by the ClickView team, chances are it's UGC\n return !VideoHelper.isBroadcast(video) && !video?._isClickViewCurated?.value;\n },\n\n getReleaseDate(video: Video): string {\n if (!video)\n return '';\n\n if (video.dateReleased && VideoHelper.isBroadcast(video))\n return DateHelper.format(video.dateReleased, 'DD/MM/YYYY');\n\n return '';\n },\n\n canViewOriginalVideo(video: Clip | InteractiveMetadata): boolean {\n return !!video?._parentVideo?._canBeConsumed?.value;\n },\n\n getTrackingCode(video: VideoTypes): string | undefined {\n if (VideoHelper.isVideo(video))\n return video.trackingCode;\n\n if (VideoHelper.isClip(video) || VideoHelper.isInteractive(video))\n return video._parentVideo.trackingCode;\n },\n\n isInExchange(video: Video): boolean {\n return !!video?.libraries?.data?.some(l => l.typeId === MasterType.ExchangeCollection);\n },\n\n canViewUploadDate(video: Video): boolean {\n if (!video || !video.dateCreated)\n return false;\n\n if (!video._isClickViewCurated || video._isClickViewCurated.value)\n return false;\n\n return true;\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_3n_0ch72.chunk.js","names":[],"sources":["../../../../libs/shared/src/enums/ContentLicenceType.ts","../../../../libs/shared/src/flight-requests/ClipRequests.ts","../../../../libs/shared/src/flight-requests/InteractiveRequests.ts","../../../../libs/shared/src/utils/VideoHelper.ts"],"sourcesContent":["export enum ContentLicenseType {\n Screenrights = 'screenrights',\n Era = 'era',\n ClickView = 'clickview'\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { Clip, CreateOrUpdateClipRequest } from 'libs/shared/interfaces';\n\nexport const ClipRequests = {\n clip(id: string, permissionFilterOption?: PermissionFilterOption): Flight.Request {\n return {\n key: `clip:${id}:${permissionFilterOption}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: SharedWithStatements.CLIP,\n permissionFilterOption\n })\n };\n },\n\n videoClips(parentId: string, permissionFilterOption?: PermissionFilterOption, cursor?: string) {\n return {\n key: `video:${parentId}:clips:${permissionFilterOption}:${cursor}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${parentId}/clips`, {\n query: SharedWithStatements.CLIP_COLLECTION,\n permissionFilterOption,\n cursor\n })\n };\n },\n\n clipWithAllInteractives(id: string, permissionFilterOption?: PermissionFilterOption): Flight.Request {\n return {\n key: `clip:${id}:${permissionFilterOption}:interactives`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `${SharedWithStatements.CLIP},interactives{status:[0,1]}`,\n permissionFilterOption\n }),\n normalize: false\n };\n },\n\n publicClip(\n id: string,\n shareId?: string,\n success?: (clip: Clip) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n key: `clip:${id}:public:${shareId}`,\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n // Query statement here is coupled with ClickView.Lite.Common\\Services\\OpenGraph\\OpenGraphService.cs\n // in lite. If you update this, please update both.\n query: '_parentVideo,_canBeConsumed,_thumbnail',\n permissionFilterOption: PermissionFilterOption.StripMetadata,\n shareId\n }),\n bootstrapName: `shared:object:${id}`,\n success,\n error\n };\n },\n\n sharedClip(\n id: string,\n shareId: string,\n success?: (clip: Clip) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n key: `shared:clip:${id}`,\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n shareId,\n query: SharedWithStatements.CLIP\n }),\n success,\n error\n };\n },\n\n createClip(\n videoId: string,\n data: CreateOrUpdateClipRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'create:clip',\n url: `{gateway}/v1/objects/${videoId}/clips`,\n data,\n type: HttpVerbs.POST,\n invalidationKeys: [ `videos:${videoId}`, 'my:videos' ],\n success,\n error,\n always\n };\n },\n\n updateClip(\n id: string,\n data: CreateOrUpdateClipRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'update:clip',\n url: `{gateway}/v1/objects/${id}`,\n data,\n type: HttpVerbs.PUT,\n invalidationKeys: [`clip:${id}`],\n success,\n error,\n always\n };\n },\n\n deleteClip(\n id: string,\n videoId: string,\n success?: (data: any) => void,\n error?: (data: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: `delete:clip`,\n url: `{gateway}/v1/objects/${id}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [ `videos:${videoId}`, 'my:videos', 'videos' ],\n success,\n error,\n always\n };\n }\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { CreateInteractiveMetadataRequest, CreateInteractiveRequest, EditInteractiveMetadataOriginRequest, EditInteractiveMetadataRequest, EditInteractiveRequest, Interaction, InteractiveMetadata } from 'libs/shared/interfaces';\n\nexport const InteractiveRequests = {\n interactiveMetadata(id: string, permissionFilterOption?: PermissionFilterOption): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: SharedWithStatements.INTERACTIVE,\n permissionFilterOption\n }),\n key: `interactive:metadata:${id}:${permissionFilterOption}`\n };\n },\n\n videoInteractives(\n parentId: string,\n permissionFilterOption?: PermissionFilterOption,\n cursor?: string\n ): Flight.PublicRequest {\n return {\n key: `video:${parentId}:interactives:${permissionFilterOption}:${cursor}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${parentId}/interactives`, {\n query: SharedWithStatements.INTERACTIVE_COLLECTION,\n cursor\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${parentId}/interactives`, {\n query: SharedWithStatements.INTERACTIVE_COLLECTION,\n cursor\n })\n };\n },\n\n sharedInteractiveMetadata(\n id: string,\n shareId: string,\n success?: (interactiveMetadata: InteractiveMetadata) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n shareId,\n query: SharedWithStatements.INTERACTIVE\n }),\n key: `shared:interactive:metadata:${id}`,\n success,\n error\n };\n },\n publicInteractiveMetadata(\n id: string,\n shareId?: string,\n success?: (interactive: InteractiveMetadata) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n // Query statement here is coupled with ClickView.Lite.Common\\Services\\OpenGraph\\OpenGraphService.cs\n // in lite. If you update this, please update both.\n query: '_parentVideo[_rating],_canBeConsumed,_thumbnail',\n permissionFilterOption: PermissionFilterOption.StripMetadata,\n shareId\n }),\n key: `interactive:metadata:${id}:public:${shareId}`,\n bootstrapName: `shared:object:${id}`,\n success,\n error\n };\n },\n interactive(id: string): Flight.Request {\n return {\n url: `/api/domain/v1/interactives/${id}`,\n key: `interactive:${id}`,\n normalize: false\n };\n },\n createInteractive(\n data: CreateInteractiveRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: '/api/domain/v1/interactives',\n key: 'create:interactive',\n type: HttpVerbs.POST,\n invalidationKeys: ['my:videos'],\n data,\n success,\n error\n };\n },\n createInteractiveMetadata(\n videoId: string,\n data: CreateInteractiveMetadataRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${videoId}/interactives`,\n key: 'create:interactive:metadata',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n updateInteractive(\n id: string,\n data: EditInteractiveRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/interactives/${id}`,\n key: 'update:interactive',\n type: HttpVerbs.PUT,\n data,\n success,\n error,\n /* Update state because domain doesn't return the updated object */\n formatData: () => data,\n invalidationKeys: [`interactive:${id}`]\n };\n },\n updateInteractiveMetadata(\n id: string,\n data: EditInteractiveMetadataRequest | EditInteractiveMetadataOriginRequest,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}`,\n key: 'update:interactive:metadata',\n type: HttpVerbs.PUT,\n data,\n success,\n error\n };\n },\n interactiveResultSet(interactiveId: string, interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`\n };\n },\n copyInteractive(\n interactiveId: string,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/interactives/${interactiveId}/copy`,\n key: 'copy:interactive',\n type: HttpVerbs.POST,\n invalidationKeys: [ `interactive:${interactiveId}`, 'my:videos' ],\n success,\n error\n };\n },\n deleteInteractiveMetadata(\n interactiveMetadataId: string,\n success?: (data: any) => void,\n error?: (data: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${interactiveMetadataId}`,\n key: 'delete:interactive',\n type: HttpVerbs.DELETE,\n invalidationKeys: [ `interactive:${interactiveMetadataId}`, 'my:videos', 'videos' ],\n success,\n error\n };\n },\n removeInteractiveMetadata({\n libraryId,\n categoryId,\n interactiveMetadataId\n }: {\n libraryId: string,\n categoryId: string,\n interactiveMetadataId: string\n }): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/domain/v1/libraries/${libraryId}/videos`, { categoryId, videoIds: interactiveMetadataId }),\n key: `remove:interactive:metadata:${interactiveMetadataId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [ `interactive:${interactiveMetadataId}`, 'my:videos', 'videos' ]\n };\n },\n contributeToCommunity(interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v2/interactives/${interactiveMetadataId}/contribute`,\n key: 'contribute:interactive',\n type: HttpVerbs.POST\n };\n },\n revokefromCommunity(interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v2/interactives/${interactiveMetadataId}/contribute`,\n key: 'contribute:interactive',\n type: HttpVerbs.DELETE\n };\n },\n isContributed(interactiveMetadataId: string): Flight.Request {\n return {\n url: `/api/domain/v2/interactives/${interactiveMetadataId}/contributed`,\n key: `iscontributed:${interactiveMetadataId}`,\n normalize: false\n };\n },\n updateInteraction(interaction: Interaction) {\n return {\n url: `/api/domain/v1/interactions/bulk/${interaction.id}`,\n key: 'contribute:interactive',\n data: interaction,\n type: HttpVerbs.PUT,\n invalidationKeys: [`interactive:${interaction.interactiveId}`]\n };\n }\n};\n","import { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { ContentLicenseType } from 'libs/shared/enums/ContentLicenceType';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { BaseObject, CanBeConsumedReason, Clip, InteractiveMetadata, Rating, Thumbnail, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { PermissionName } from '../enums/PermissionName';\nimport { HasPermissionsFunc } from '../hooks/usePermissions';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const VideoHelper = {\n isVideo(obj: BaseObject): obj is Video {\n return obj?.typeId === MasterType.Video;\n },\n\n isClip(obj: BaseObject): obj is Clip {\n return obj?.typeId === MasterType.Clip;\n },\n\n isInteractive(obj: BaseObject): obj is InteractiveMetadata {\n return obj?.typeId === MasterType.Interactive;\n },\n\n isVideoTypeArchived(obj: VideoTypes): boolean {\n return obj?.status === CurationStatus.Archived;\n },\n\n /**\n * Returns true of the object is a video, clip or interactive\n */\n isVideoType(object: BaseObject): object is Video | Clip | InteractiveMetadata {\n return VideoHelper.isVideo(object) || VideoHelper.isInteractive(object) || VideoHelper.isClip(object);\n },\n\n hasSeries(video: Video): boolean {\n return !!video?.series?.id;\n },\n\n showVideoGuidance(hasPermissions: HasPermissionsFunc): boolean {\n return !hasPermissions(PermissionName.StudentExperience);\n },\n\n showInteractivesGuidance(video: VideoTypes): boolean {\n if (!video || VideoHelper.isInteractive(video))\n return false;\n\n const interactiveCount = video.interactives?.data?.length || 0;\n\n return !!interactiveCount;\n },\n\n showResourcesGuidance(video: VideoTypes): boolean {\n if (!video || VideoHelper.isInteractive(video))\n return false;\n\n const resourceCount = (\n (video.resources?.data?.length || 0) +\n (video.links?.data?.length || 0)\n );\n\n return !!resourceCount;\n },\n\n canViewCurriculumLinks(hasPermissions: HasPermissionsFunc, video: VideoTypes): boolean {\n const canView = (\n hasPermissions(PermissionName.ViewCurriculums) &&\n hasPermissions(PermissionName.ManagePresentations)\n );\n\n if (!canView)\n return false;\n \n if (!video || !VideoHelper.isVideo(video))\n return false;\n\n return !!video._hasCurriculumLinks?.value;\n },\n\n getVideoProgress(video: Video): number {\n if (video?.lastProgressPoint)\n return video?.lastProgressPoint;\n\n // Use virtual assoc\n if (video?._videoProgress?.progress)\n return video?._videoProgress?.progress;\n\n return 0;\n },\n\n getThumbnail(video: VideoTypes): Thumbnail {\n if (!video)\n return null;\n\n if (VideoHelper.isVideo(video))\n return video.thumbnail;\n\n if (video?._thumbnail)\n return video._thumbnail;\n\n // Fallbacks for virtual assoc if needed\n if (VideoHelper.isClip(video))\n return video.thumbnail || video._parentVideo?.thumbnail;\n\n if (VideoHelper.isInteractive(video))\n return video._parentVideo?.thumbnail || video._parentClip?.thumbnail;\n },\n\n getDuration(video: VideoTypes): number {\n if (!video)\n return;\n\n if (VideoHelper.isVideo(video))\n return video.duration;\n\n if (VideoHelper.isInteractive(video)) {\n if (video._parentClip?.id)\n return (video._parentClip.endTime - video._parentClip.startTime) * 1000;\n\n if (video._parentVideo?.duration)\n return video._parentVideo.duration;\n }\n\n if (VideoHelper.isClip(video))\n return (video.endTime - video.startTime) * 1000;\n },\n\n getAnalyticsEntity(video: VideoTypes): EntityType {\n if (VideoHelper.isVideo(video))\n return EntityType.Video;\n\n if (VideoHelper.isInteractive(video))\n return EntityType.Interactive;\n\n if (VideoHelper.isClip(video))\n return EntityType.Clip;\n },\n\n getAnalyticsData(\n video: VideoTypes,\n extraAnalyticsData: HashObject = {}\n ): HashObject {\n if (VideoHelper.isVideo(video)) {\n return {\n ...(extraAnalyticsData || {}),\n id: video.id,\n name: video.name\n };\n }\n\n if (VideoHelper.isClip(video)) {\n const data: HashObject = {\n ...(extraAnalyticsData || {}),\n id: video.id,\n name: video.name\n };\n\n if (video._parentVideo?.id)\n data.video = { id: video._parentVideo?.id, name: video._parentVideo.name };\n\n return data;\n }\n\n const data: HashObject = {\n ...extraAnalyticsData,\n id: video.id,\n interactiveId: video.interactiveId,\n name: video.name,\n status: video.status,\n originType: video.originType\n };\n\n if (video?._parentClip?.id)\n data.clip = { id: video?._parentClip?.id, name: video?._parentClip.name };\n\n if (video?._parentVideo?.id)\n data.video = { id: video?._parentVideo?.id, name: video?._parentVideo.name };\n \n return data;\n },\n\n getCanBeConsumed(video: BaseObject): {\n canNavigate: boolean,\n canConsume: boolean,\n reason?: CanBeConsumedReason\n } {\n if (!video || !VideoHelper.isVideoType(video)) {\n return {\n canNavigate: false,\n canConsume: false\n };\n }\n\n if (video._canBeConsumed) {\n return {\n /**\n * Product navigation is enabled for \"login-required\" reason to support public access. \n * The video itself cannot be consumed, however, clients can allow users to browse the platform.\n * \n * Note: canNavigate is initially available for just videos. Interactives and Clips will be supported in Y2.\n */\n canNavigate: (video._canBeConsumed?.reason === 'login-required' && VideoHelper.isVideo(video)) || video._canBeConsumed.value === true,\n canConsume: video._canBeConsumed.value,\n reason: video._canBeConsumed?.reason\n };\n }\n\n /**\n * Many of the components shared between online and lite read this value.\n * Online doesn't fetch or care about this value, which means by this point it should\n * still be null. In this case, we just set it to true so that the components can render\n * as normal.\n */\n return {\n canNavigate: true,\n canConsume: true\n };\n },\n\n getPrivacyReasoning(video: VideoTypes, showSignIn: boolean = false): string {\n const { canConsume, canNavigate, reason } = VideoHelper.getCanBeConsumed(video);\n\n const getNoLongerAvailableText = () => {\n if (VideoHelper.isClip(video))\n return getPhrase('clipParentDeleted');\n\n if (VideoHelper.isInteractive(video))\n return getPhrase('interactiveParentDeleted');\n\n return getPhrase('videoDeleted');\n };\n\n const getLoginRequiredText = () => {\n if (VideoHelper.isClip(video))\n return getPhrase('clipLoginRequired');\n\n if (VideoHelper.isInteractive(video))\n return getPhrase('interactiveLoginRequired');\n\n return getPhrase('videoLoginRequired');\n };\n\n if (!canConsume && !canNavigate) {\n if (showSignIn)\n return getLoginRequiredText();\n\n switch (reason) {\n case 'rating-not-allowed': {\n return getPhrase('ratingNotAllowed');\n }\n\n case 'video-deleted': {\n return getNoLongerAvailableText();\n }\n\n case 'clickview-private': {\n return getPhrase('clickViewPrivate');\n }\n\n case 'private': {\n return getPhrase('genericCannotAccess');\n }\n\n case 'login-required': {\n return getLoginRequiredText();\n }\n\n case 'restricted-access': {\n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n\n if (restriction?.type === RestrictionType.Custom)\n return getPhrase('awaitingApproval');\n\n return getPhrase('restrictedAccess');\n }\n\n default: {\n return getPhrase('genericCannotAccess');\n }\n }\n }\n\n if (VideoHelper.isInteractive(video) && video.status === CurationStatus.Draft)\n return getPhrase('draftInteractive');\n\n return '';\n },\n\n getTitle(video: VideoTypes): string {\n if (video.name) {\n if (VideoHelper.isInteractive(video) && video.status === CurationStatus.Draft) {\n return getPhrase('draftInteractiveTitle', { name: video.name });\n }\n\n return video.name;\n }\n\n const { canConsume, reason } = VideoHelper.getCanBeConsumed(video);\n\n if (!canConsume && reason === 'private')\n return getPhrase('privateVideo');\n\n if (!canConsume && reason === 'video-deleted')\n return getPhrase('videoUnavailable');\n\n return getPhrase('privateVideo');\n },\n\n getParentVideo(video: VideoTypes): Video | null {\n if (VideoHelper.isVideo(video))\n return video;\n\n if (VideoHelper.isClip(video) || VideoHelper.isInteractive(video))\n return video._parentVideo;\n },\n\n getRating(video: VideoTypes): Rating | null {\n if (VideoHelper.isVideo(video))\n return video._rating?.value || video.rating;\n\n return video?._parentVideo?._rating?.value;\n },\n\n getVideoRequest(\n objectId: string,\n objectTypeId: MasterType,\n shareId?: string\n ): Flight.Request {\n if (shareId) {\n switch (objectTypeId) {\n case MasterType.Video:\n return VideoRequests.sharedVideo(objectId, shareId);\n case MasterType.Clip:\n return ClipRequests.sharedClip(objectId, shareId);\n case MasterType.Interactive:\n return InteractiveRequests.sharedInteractiveMetadata(objectId, shareId);\n }\n\n Core.ErrorHelper.throw(new DevError('Unsupported master type'));\n }\n\n switch (objectTypeId) {\n case MasterType.Video:\n return VideoRequests.video(objectId);\n case MasterType.Clip:\n return ClipRequests.clip(objectId);\n case MasterType.Interactive:\n return InteractiveRequests.interactiveMetadata(objectId);\n }\n\n Core.ErrorHelper.throw(new DevError('Unsupported master type'));\n },\n\n isBroadcast(video: Video): boolean {\n return !!video?.contentLicences?.data?.some(l =>\n l.systemName === ContentLicenseType.Era ||\n l.systemName === ContentLicenseType.Screenrights);\n },\n\n isUgc(video: Video): boolean {\n // if video isn't broadcast and isn't curated by the ClickView team, chances are it's UGC\n return !VideoHelper.isBroadcast(video) && !video?._isClickViewCurated?.value;\n },\n\n getReleaseDate(video: Video): string {\n if (!video)\n return '';\n\n if (video.dateReleased && VideoHelper.isBroadcast(video))\n return DateHelper.format(video.dateReleased, 'DD/MM/YYYY');\n\n return '';\n },\n\n canViewOriginalVideo(video: Clip | InteractiveMetadata): boolean {\n return !!video?._parentVideo?._canBeConsumed?.value;\n },\n\n getTrackingCode(video: VideoTypes): string | undefined {\n if (VideoHelper.isVideo(video))\n return video.trackingCode;\n\n if (VideoHelper.isClip(video) || VideoHelper.isInteractive(video))\n return video._parentVideo.trackingCode;\n },\n\n isInExchange(video: Video): boolean {\n return !!video?.libraries?.data?.some(l => l.typeId === MasterType.ExchangeCollection);\n },\n\n canViewUploadDate(video: Video): boolean {\n if (!video || !video.dateCreated)\n return false;\n\n if (!video._isClickViewCurated || video._isClickViewCurated.value)\n return false;\n\n return true;\n }\n};\n"],"mappings":"odAAA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,aAAA,eACA,EAAA,IAAA,MACA,EAAA,UAAA,kBACD,CCKY,EAAe,CAC1B,KAAK,EAAY,EAAiE,CAChF,MAAO,CACL,IAAK,QAAQ,EAAG,GAAG,IACnB,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,EAAqB,KAC5B,yBACD,CAAA,CACF,EAGH,WAAW,EAAkB,EAAiD,EAAiB,CAC7F,MAAO,CACL,IAAK,SAAS,EAAS,SAAS,EAAuB,GAAG,IAC1D,IAAK,EAAU,WAAW,wBAAwB,EAAS,QAAS,CAClE,MAAO,EAAqB,gBAC5B,yBACA,SACD,CAAA,CACF,EAGH,wBAAwB,EAAY,EAAiE,CACnG,MAAO,CACL,IAAK,QAAQ,EAAG,GAAG,EAAuB,eAC1C,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,GAAG,EAAqB,KAAK,6BACpC,yBACD,CAAC,CACF,UAAW,GACZ,EAGH,WACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,QAAQ,EAAG,UAAU,IAC1B,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAG9C,MAAO,yCACP,uBAAwB,EAAuB,cAC/C,UACD,CAAC,CACF,cAAe,iBAAiB,IAChC,UACA,QACD,EAGH,WACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,eAAe,IACpB,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAC9C,UACA,MAAO,EAAqB,KAC7B,CAAC,CACF,UACA,QACD,EAGH,WACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,cACL,IAAK,wBAAwB,EAAQ,QACrC,OACA,KAAM,EAAU,KAChB,iBAAkB,CAAE,UAAU,IAAW,YAAa,CACtD,UACA,QACA,SACD,EAGH,WACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,cACL,IAAK,wBAAwB,IAC7B,OACA,KAAM,EAAU,IAChB,iBAAkB,CAAC,QAAQ,IAAK,CAChC,UACA,QACA,SACD,EAGH,WACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,cACL,IAAK,wBAAwB,IAC7B,KAAM,EAAU,OAChB,iBAAkB,CAAE,UAAU,IAAW,YAAa,SAAU,CAChE,UACA,QACA,SACD,EAEJ,CC9HY,EAAsB,CACjC,oBAAoB,EAAY,EAAiE,CAC/F,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,EAAqB,YAC5B,yBACD,CAAC,CACF,IAAK,wBAAwB,EAAG,GAAG,IACpC,EAGH,kBACE,EACA,EACA,EACsB,CACtB,MAAO,CACL,IAAK,SAAS,EAAS,gBAAgB,EAAuB,GAAG,IACjE,IAAK,EAAU,WAAW,wBAAwB,EAAS,eAAgB,CACzE,MAAO,EAAqB,uBAC5B,SACD,CAAC,CACF,UAAW,EAAU,WAAW,gBAAgB,EAAS,eAAgB,CACvE,MAAO,EAAqB,uBAC5B,SACD,CAAA,CACF,EAGH,0BACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAC9C,UACA,MAAO,EAAqB,YAC7B,CAAC,CACF,IAAK,+BAA+B,IACpC,UACA,QACD,EAEH,0BACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAG9C,MAAO,kDACP,uBAAwB,EAAuB,cAC/C,UACD,CAAC,CACF,IAAK,wBAAwB,EAAG,UAAU,IAC1C,cAAe,iBAAiB,IAChC,UACA,QACD,EAEH,YAAY,EAA4B,CACtC,MAAO,CACL,IAAK,+BAA+B,IACpC,IAAK,eAAe,IACpB,UAAW,GACZ,EAEH,kBACE,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,8BACL,IAAK,qBACL,KAAM,EAAU,KAChB,iBAAkB,CAAC,YAAY,CAC/B,OACA,UACA,QACD,EAEH,0BACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,EAAQ,eACrC,IAAK,8BACL,KAAM,EAAU,KAChB,OACA,UACA,QACD,EAEH,kBACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,+BAA+B,IACpC,IAAK,qBACL,KAAM,EAAU,IAChB,OACA,UACA,QAEA,eAAkB,EAClB,iBAAkB,CAAC,eAAe,IAAA,CACnC,EAEH,0BACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,IAC7B,IAAK,8BACL,KAAM,EAAU,IAChB,OACA,UACA,QACD,EAEH,qBAAqB,EAAuB,EAA+C,CACzF,MAAO,CACL,IAAK,yCAAyC,EAAc,YAAY,IACxE,IAAK,0BAA0B,EAAc,GAAG,IACjD,EAEH,gBACE,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,+BAA+B,EAAc,OAClD,IAAK,mBACL,KAAM,EAAU,KAChB,iBAAkB,CAAE,eAAe,IAAiB,YAAa,CACjE,UACA,QACD,EAEH,0BACE,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,IAC7B,IAAK,qBACL,KAAM,EAAU,OAChB,iBAAkB,CAAE,eAAe,IAAyB,YAAa,SAAU,CACnF,UACA,QACD,EAEH,0BAA0B,CACxB,YACA,aACA,yBAKiB,CACjB,MAAO,CACL,IAAK,EAAU,WAAW,4BAA4B,EAAU,SAAU,CAAE,aAAY,SAAU,EAAuB,CAAC,CAC1H,IAAK,+BAA+B,IACpC,KAAM,EAAU,OAChB,iBAAkB,CAAE,eAAe,IAAyB,YAAa,UAC1E,EAEH,sBAAsB,EAA+C,CACnE,MAAO,CACL,IAAK,+BAA+B,EAAsB,aAC1D,IAAK,yBACL,KAAM,EAAU,KACjB,EAEH,oBAAoB,EAA+C,CACjE,MAAO,CACL,IAAK,+BAA+B,EAAsB,aAC1D,IAAK,yBACL,KAAM,EAAU,OACjB,EAEH,cAAc,EAA+C,CAC3D,MAAO,CACL,IAAK,+BAA+B,EAAsB,cAC1D,IAAK,iBAAiB,IACtB,UAAW,GACZ,EAEH,kBAAkB,EAA0B,CAC1C,MAAO,CACL,IAAK,oCAAoC,EAAY,KACrD,IAAK,yBACL,KAAM,EACN,KAAM,EAAU,IAChB,iBAAkB,CAAC,eAAe,EAAY,gBAAA,CAC/C,EAEJ,CCzMK,EAAY,EAAgB,iBADhB,sBAC2C,CAEhD,EAAc,CACzB,QAAQ,EAA+B,CACrC,OAAO,GAAK,SAAW,EAAW,OAGpC,OAAO,EAA8B,CACnC,OAAO,GAAK,SAAW,EAAW,MAGpC,cAAc,EAA6C,CACzD,OAAO,GAAK,SAAW,EAAW,aAGpC,oBAAoB,EAA0B,CAC5C,OAAO,GAAK,SAAW,EAAe,UAMxC,YAAY,EAAkE,CAC5E,OAAO,EAAY,QAAQ,EAAO,EAAI,EAAY,cAAc,EAAO,EAAI,EAAY,OAAO,EAAO,EAGvG,UAAU,EAAuB,CAC/B,MAAO,CAAC,CAAC,GAAO,QAAQ,IAG1B,kBAAkB,EAA6C,CAC7D,MAAO,CAAC,EAAe,EAAe,kBAAkB,EAG1D,yBAAyB,EAA4B,CAMnD,MALI,CAAC,GAAS,EAAY,cAAc,EAAM,CACrC,GAIF,CAAC,CAFiB,EAAM,cAAc,MAAM,QAKrD,sBAAsB,EAA4B,CAShD,MARI,CAAC,GAAS,EAAY,cAAc,EAAM,CACrC,GAOF,CAAC,GAJL,EAAM,WAAW,MAAM,QAAU,IACjC,EAAM,OAAO,MAAM,QAAU,KAMlC,uBAAuB,EAAoC,EAA4B,CAYrF,MANI,EAJF,EAAe,EAAe,gBAAgB,EAC9C,EAAe,EAAe,oBAAoB,GAMhD,CAAC,GAAS,CAAC,EAAY,QAAQ,EAAM,CAChC,GAEF,CAAC,CAAC,EAAM,qBAAqB,OAGtC,iBAAiB,EAAsB,CAQrC,OAPI,GAAO,kBACF,GAAO,kBAGZ,GAAO,gBAAgB,SAClB,GAAO,gBAAgB,SAEzB,GAGT,aAAa,EAA8B,CACzC,GAAI,CAAC,EACH,OAAO,KAET,GAAI,EAAY,QAAQ,EAAM,CAC5B,OAAO,EAAM,UAEf,GAAI,GAAO,WACT,OAAO,EAAM,WAGf,GAAI,EAAY,OAAO,EAAM,CAC3B,OAAO,EAAM,WAAa,EAAM,cAAc,UAEhD,GAAI,EAAY,cAAc,EAAM,CAClC,OAAO,EAAM,cAAc,WAAa,EAAM,aAAa,WAG/D,YAAY,EAA2B,CAChC,KAGL,IAAI,EAAY,QAAQ,EAAM,CAC5B,OAAO,EAAM,SAEf,GAAI,EAAY,cAAc,EAAM,CAAE,CACpC,GAAI,EAAM,aAAa,GACrB,OAAQ,EAAM,YAAY,QAAU,EAAM,YAAY,WAAa,IAErE,GAAI,EAAM,cAAc,SACtB,OAAO,EAAM,aAAa,SAG9B,GAAI,EAAY,OAAO,EAAM,CAC3B,OAAQ,EAAM,QAAU,EAAM,WAAa,MAG/C,mBAAmB,EAA+B,CAChD,GAAI,EAAY,QAAQ,EAAM,CAC5B,OAAO,EAAW,MAEpB,GAAI,EAAY,cAAc,EAAM,CAClC,OAAO,EAAW,YAEpB,GAAI,EAAY,OAAO,EAAM,CAC3B,OAAO,EAAW,MAGtB,iBACE,EACA,EAAiC,EAAE,CACvB,CACZ,GAAI,EAAY,QAAQ,EAAM,CAC5B,MAAO,CACL,GAAI,GAAsB,EAAE,CAC5B,GAAI,EAAM,GACV,KAAM,EAAM,KACb,CAGH,GAAI,EAAY,OAAO,EAAM,CAAE,CAC7B,IAAM,EAAmB,CACvB,GAAI,GAAsB,EAAE,CAC5B,GAAI,EAAM,GACV,KAAM,EAAM,KACb,CAKD,OAHI,EAAM,cAAc,KACtB,EAAK,MAAQ,CAAE,GAAI,EAAM,cAAc,GAAI,KAAM,EAAM,aAAa,KAAM,EAErE,EAGT,IAAM,EAAmB,CACvB,GAAG,EACH,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,WAAY,EAAM,WACnB,CAQD,OANI,GAAO,aAAa,KACtB,EAAK,KAAO,CAAE,GAAI,GAAO,aAAa,GAAI,KAAM,GAAO,YAAY,KAAM,EAEvE,GAAO,cAAc,KACvB,EAAK,MAAQ,CAAE,GAAI,GAAO,cAAc,GAAI,KAAM,GAAO,aAAa,KAAM,EAEvE,GAGT,iBAAiB,EAIf,CA4BA,MA3BI,CAAC,GAAS,CAAC,EAAY,YAAY,EAAM,CACpC,CACL,YAAa,GACb,WAAY,GACb,CAGC,EAAM,eACD,CAOL,YAAc,EAAM,gBAAgB,SAAW,kBAAoB,EAAY,QAAQ,EAAM,EAAK,EAAM,eAAe,QAAU,GACjI,WAAY,EAAM,eAAe,MACjC,OAAQ,EAAM,gBAAgB,OAC/B,CASI,CACL,YAAa,GACb,WAAY,GACb,EAGH,oBAAoB,EAAmB,EAAsB,GAAe,CAC1E,GAAM,CAAE,aAAY,cAAa,UAAW,EAAY,iBAAiB,EAAM,CAEzE,MACA,EAAY,OAAO,EAAM,CACpB,EAAU,oBAAoB,CAEnC,EAAY,cAAc,EAAM,CAC3B,EAAU,2BAA2B,CAEvC,EAAU,eAAe,CAG5B,MACA,EAAY,OAAO,EAAM,CACpB,EAAU,oBAAoB,CAEnC,EAAY,cAAc,EAAM,CAC3B,EAAU,2BAA2B,CAEvC,EAAU,qBAAqB,CAGxC,GAAI,CAAC,GAAc,CAAC,EAAa,CAC/B,GAAI,EACF,OAAO,GAAsB,CAE/B,OAAQ,EAAR,CACE,IAAK,qBACH,OAAO,EAAU,mBAAmB,CAGtC,IAAK,gBACH,OAAO,GAA0B,CAGnC,IAAK,oBACH,OAAO,EAAU,mBAAmB,CAGtC,IAAK,UACH,OAAO,EAAU,sBAAsB,CAGzC,IAAK,iBACH,OAAO,GAAsB,CAG/B,IAAK,oBAMH,OALoB,EAAkB,uBAAuB,EAAM,eAAe,MAAM,EAEvE,OAAS,EAAgB,OACjC,EAAU,mBAAmB,CAE/B,EAAU,mBAAmB,CAGtC,QACE,OAAO,EAAU,sBAAsB,EAQ7C,OAHI,EAAY,cAAc,EAAM,EAAI,EAAM,SAAW,EAAe,MAC/D,EAAU,mBAAmB,CAE/B,IAGT,SAAS,EAA2B,CAClC,GAAI,EAAM,KAKR,OAJI,EAAY,cAAc,EAAM,EAAI,EAAM,SAAW,EAAe,MAC/D,EAAU,wBAAyB,CAAE,KAAM,EAAM,KAAM,CAAC,CAG1D,EAAM,KAGf,GAAM,CAAE,aAAY,UAAW,EAAY,iBAAiB,EAAM,CAQlE,OALS,EADL,CAAC,GAAc,IAAW,UACX,eAEf,CAAC,GAAc,IAAW,gBACX,mBAEF,eALiB,EAQpC,eAAe,EAAiC,CAC9C,GAAI,EAAY,QAAQ,EAAM,CAC5B,OAAO,EAET,GAAI,EAAY,OAAO,EAAM,EAAI,EAAY,cAAc,EAAM,CAC/D,OAAO,EAAM,cAGjB,UAAU,EAAkC,CAI1C,OAHI,EAAY,QAAQ,EAAM,CACrB,EAAM,SAAS,OAAS,EAAM,OAEhC,GAAO,cAAc,SAAS,OAGvC,gBACE,EACA,EACA,EACgB,CAChB,GAAI,EAAS,CACX,OAAQ,EAAR,CACE,KAAK,EAAW,MACd,OAAO,EAAc,YAAY,EAAU,EAAQ,CACrD,KAAK,EAAW,KACd,OAAO,EAAa,WAAW,EAAU,EAAQ,CACnD,KAAK,EAAW,YACd,OAAO,EAAoB,0BAA0B,EAAU,EAAQ,CAG3E,EAAiB,MAAM,IAAI,EAAS,0BAA0B,CAAC,CAGjE,OAAQ,EAAR,CACE,KAAK,EAAW,MACd,OAAO,EAAc,MAAM,EAAS,CACtC,KAAK,EAAW,KACd,OAAO,EAAa,KAAK,EAAS,CACpC,KAAK,EAAW,YACd,OAAO,EAAoB,oBAAoB,EAAS,CAG5D,EAAiB,MAAM,IAAI,EAAS,0BAA0B,CAAC,EAGjE,YAAY,EAAuB,CACjC,MAAO,CAAC,CAAC,GAAO,iBAAiB,MAAM,KAAK,GAC1C,EAAE,aAAe,EAAmB,KACpC,EAAE,aAAe,EAAmB,aAAa,EAGrD,MAAM,EAAuB,CAE3B,MAAO,CAAC,EAAY,YAAY,EAAM,EAAI,CAAC,GAAO,qBAAqB,OAGzE,eAAe,EAAsB,CAOnC,OANK,GAGD,EAAM,cAAgB,EAAY,YAAY,EAAM,CAC/C,EAAW,OAAO,EAAM,aAAc,aAAa,CAErD,IAGT,qBAAqB,EAA4C,CAC/D,MAAO,CAAC,CAAC,GAAO,cAAc,gBAAgB,OAGhD,gBAAgB,EAAuC,CACrD,GAAI,EAAY,QAAQ,EAAM,CAC5B,OAAO,EAAM,aAEf,GAAI,EAAY,OAAO,EAAM,EAAI,EAAY,cAAc,EAAM,CAC/D,OAAO,EAAM,aAAa,cAG9B,aAAa,EAAuB,CAClC,MAAO,CAAC,CAAC,GAAO,WAAW,MAAM,KAAK,GAAK,EAAE,SAAW,EAAW,mBAAmB,EAGxF,kBAAkB,EAAuB,CAOvC,MAHA,EAHI,CAAC,GAAS,CAAC,EAAM,aAGjB,CAAC,EAAM,qBAAuB,EAAM,oBAAoB,QAK/D"}
|