@clickview/lite 0.66.0-rc.0 → 0.66.0-rc.2

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.
Files changed (29) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/1958-46fa15e385-lite.chunk.js +2 -0
  3. package/dist/scripts/1958-46fa15e385-lite.chunk.js.map +1 -0
  4. package/dist/scripts/2431-d7d95fc5e6-lite.chunk.js +2 -0
  5. package/dist/scripts/2431-d7d95fc5e6-lite.chunk.js.map +1 -0
  6. package/dist/scripts/301-eccaa4c313-lite.chunk.js +2 -0
  7. package/dist/scripts/301-eccaa4c313-lite.chunk.js.map +1 -0
  8. package/dist/scripts/4359-e928b3edc9-lite.chunk.js +2 -0
  9. package/dist/scripts/4359-e928b3edc9-lite.chunk.js.map +1 -0
  10. package/dist/scripts/6965-46edd86c90-lite.chunk.js +2 -0
  11. package/dist/scripts/6965-46edd86c90-lite.chunk.js.map +1 -0
  12. package/dist/scripts/9182-95605d2b04-lite.chunk.js +2 -0
  13. package/dist/scripts/9182-95605d2b04-lite.chunk.js.map +1 -0
  14. package/dist/scripts/{bundle-80560f5679.min.js → bundle-f772739f5d.min.js} +3 -3
  15. package/dist/scripts/{bundle-80560f5679.min.js.map → bundle-f772739f5d.min.js.map} +1 -1
  16. package/package.json +1 -1
  17. package/dist/scripts/1958-0883952491-lite.chunk.js +0 -2
  18. package/dist/scripts/1958-0883952491-lite.chunk.js.map +0 -1
  19. package/dist/scripts/2431-f91a102c7b-lite.chunk.js +0 -2
  20. package/dist/scripts/2431-f91a102c7b-lite.chunk.js.map +0 -1
  21. package/dist/scripts/301-089f4b9e0c-lite.chunk.js +0 -2
  22. package/dist/scripts/301-089f4b9e0c-lite.chunk.js.map +0 -1
  23. package/dist/scripts/4359-55d1d30bcf-lite.chunk.js +0 -2
  24. package/dist/scripts/4359-55d1d30bcf-lite.chunk.js.map +0 -1
  25. package/dist/scripts/6965-3ae3c81898-lite.chunk.js +0 -2
  26. package/dist/scripts/6965-3ae3c81898-lite.chunk.js.map +0 -1
  27. package/dist/scripts/9182-db74c44406-lite.chunk.js +0 -2
  28. package/dist/scripts/9182-db74c44406-lite.chunk.js.map +0 -1
  29. /package/dist/scripts/{bundle-80560f5679.min.js.LICENSE.txt → bundle-f772739f5d.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/6965-46edd86c90-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/share/components/shared-to-avatar-list/shared-to-avatar-list.scss","file:///app/packages/libs/shared/src/apps/share/components/shared-to-avatar-list/SharedToAvatarList.tsx","file:///app/packages/libs/shared/src/apps/share/constants/TableTheme.ts","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/components/avatar-list/AvatarList.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRouteHelper.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/share/components/shares-header/SharesHeader.tsx","file:///app/packages/libs/shared/src/apps/share/components/shared-by-me/empty-state/SharedByMeEmptyState.tsx","file:///app/packages/libs/shared/src/apps/share/components/shared-by-me/share-status-indicator/ShareStatusIndicator.tsx","file:///app/packages/libs/shared/src/apps/share/components/shared-by-me/share-status-indicator/share-status-indicator.scss","file:///app/packages/libs/shared/src/apps/share/components/shared-by-me/table/SharedByMeTableUtils.tsx","file:///app/packages/libs/shared/src/apps/share/components/shared-by-me/table/SharedByMeTable.tsx","file:///app/packages/projects/lite/src/apps/share/views/shared-by-me/partial-loading/partial-shared-by-me-table.scss","file:///app/packages/projects/lite/src/apps/share/views/shared-by-me/partial-loading/PartialSharedByMeTable.tsx","file:///app/packages/projects/lite/src/apps/share/views/shared-by-me/SharedByMeViewUtils.tsx","file:///app/packages/projects/lite/src/apps/share/views/shared-by-me/SharedByMeView.tsx","file:///app/packages/libs/shared/src/utils/ShareHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/useSharesTable.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n includePublicResults: boolean,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: includePublicResults ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n formatData: (data: any) => {\n return {\n ...data,\n students: data.students.map((student: any) => {\n if (!student.name || !student.profileId)\n return student;\n\n return {\n ...student,\n publicUser: {\n profileId: student.profileId,\n name: student.name\n }\n };\n })\n };\n },\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"ByxQa\",\"sm\":\"EgJ0v\",\"sharedAvatar\":\"cW0NT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { AvatarItemProps, AvatarList } from 'libs/shared/components/avatar-list/AvatarList';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Classroom, ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './shared-to-avatar-list.scss';\n\nconst namespace = 'reportsShare.sharedToAvatarList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getHiddenRecipientText(hiddenRecipients: BaseObject[]): string {\n const counts = ArrayHelper.countBy(hiddenRecipients, 'typeId');\n const userCount = counts[MasterType.User];\n const classroomCount = counts[MasterType.Classroom];\n const groupCount = counts[MasterType.ClassroomGroup];\n\n if (userCount && classroomCount && groupCount)\n return getPhrase('classroomsGroupsAndUsers', { userCount, classroomCount, groupCount });\n\n if (userCount && classroomCount)\n return getPhrase('classroomsAndUsers', { userCount, classroomCount });\n\n if (userCount && groupCount)\n return getPhrase('groupsAndUsers', { userCount, groupCount });\n\n if (classroomCount && groupCount)\n return getPhrase('classroomsAndGroups', { classroomCount, groupCount });\n\n if (userCount)\n return getPhrase('users', { userCount });\n\n if (classroomCount)\n return getPhrase('classrooms', { classroomCount });\n\n if (groupCount)\n return getPhrase('groups', { groupCount });\n}\n\nfunction SharedToAvatar(props: AvatarItemProps): JSX.Element {\n const user: User = props.item?.typeId === MasterType.User && props.item as User;\n const classroom: Classroom = props.item?.typeId === MasterType.Classroom && props.item as Classroom;\n const classroomGroup: ClassroomGroup = props.item?.typeId === MasterType.ClassroomGroup\n && props.item as ClassroomGroup;\n\n const svgContainerClassName = 'd-flex justify-content-center align-items-center text-white rounded-circle h-100 w-100';\n\n return (\n <>\n {!!user &&\n <Tooltip title={`${user.name} ${user.surname}`} spanHack spanHackClassName='h-100 w-100'>\n <Avatar\n imageUrl={user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(user.name, user.surname)}\n extraClasses={styles.sharedAvatar}\n />\n </Tooltip>\n }\n {!!classroom &&\n <Tooltip title={classroom.name} spanHack spanHackClassName='h-100 w-100'>\n <div className={svgContainerClassName}>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Large}\n variant='teal'\n />\n </div>\n </Tooltip>\n }\n {!!classroomGroup &&\n <Tooltip title={classroomGroup.name} spanHack spanHackClassName='h-100 w-100'>\n <div className={svgContainerClassName}>\n <IconCircle\n svgName={cvSvgLibrary.Group}\n variant={mapColourToBsVariant(classroomGroup.metadata?.colour)}\n />\n </div>\n </Tooltip>\n }\n </>\n );\n}\n\n\ninterface AnonymousSharedToAvatarProps {\n avatarSize?: 'md' | 'sm';\n}\n\nexport function AnonymousSharedToAvatar(props: AnonymousSharedToAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}>\n <Tooltip\n title={getPhrase('anonymous')}\n spanHack\n spanHackClassName='bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100'\n >\n <SvgContainer svgName={cvSvgLibrary.Anonymous} size={props.avatarSize === 'sm' ? SvgContainerSize.Small : null} />\n </Tooltip>\n </div>\n );\n}\n\ninterface SharedLinkAvatarProps {\n text?: string;\n avatarSize?: 'md' | 'sm';\n className?: string;\n}\n\nexport function SharedLinkAvatar(props: SharedLinkAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}>\n <Tooltip\n title={props.text || getPhrase('sharedLink')}\n spanHack\n spanHackClassName={`bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100 ${props.className || ''}`}\n >\n <SvgContainer svgName={cvSvgLibrary.Link} size={props.avatarSize === 'sm' ? SvgContainerSize.Small : null} />\n </Tooltip>\n </div>\n );\n}\n\ninterface SharedToAvatarListProps {\n recipients: BaseObject[];\n imageCdnUrl: string;\n maxAvatars?: number;\n hasShareLink?: boolean;\n avatarSize?: 'md' | 'sm';\n shareLinkText?: string;\n}\n\nSharedToAvatarList.defaultProps = {\n maxAvatars: 5\n};\n\nexport function SharedToAvatarList(props: SharedToAvatarListProps): JSX.Element {\n return (\n <AvatarList\n {...props}\n items={props.recipients}\n avatarItem={SharedToAvatar}\n avatarContainerClassname={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}\n getHiddenTooltip={getHiddenRecipientText}\n hasShareLink={props.hasShareLink}\n shareLinkText={props.shareLinkText}\n />\n );\n}","import { TableTheme } from 'libs/shared/components/table/Table';\n\nexport const SHARES_TABLE_THEME: TableTheme = {\n table: 'striped-list no-full-width pb-3',\n header: 'fw-semibold pb-1',\n headerCell: `py-2 ps-2 text-nowrap`,\n row: 'striped-row rounded',\n cell: 'd-flex align-items-center p-2'\n};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n showBorder?: boolean; // only works for button without text label\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n customSize?: boolean;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n\n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n svgSize={props.dropdownToggleSvgSize}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n showBorder={a.showBorder}\n customSize={props.customSize}\n ariaLabel={a.tooltip}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n aria-label={'More actions dropdown'}\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <ul className='dropdown-menu dropdown-menu-end dropdown-menu-right font-size-normal' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <li key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </li>\n );\n }\n \n return (\n <li key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </li>\n );\n })\n }\n </ul>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharedLinkAvatar } from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.avatarList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface AvatarItemProps {\n imageCdnUrl: string;\n index: number;\n item?: BaseObject;\n hiddenItems?: BaseObject[];\n maxAvatars?: number;\n}\n\ninterface AvatarListProps {\n items: BaseObject[];\n imageCdnUrl: string;\n maxAvatars?: number;\n avatarItem?: (props: AvatarItemProps) => JSX.Element;\n getHiddenTooltip?: (hiddenItems: BaseObject[]) => string;\n numberClassname?: string;\n avatarContainerClassname?: string;\n roleToDisplay?: 'student' | 'staff';\n hasShareLink?: boolean;\n avatarSize?: 'md' | 'sm';\n shareLinkText?: string;\n}\n\nAvatarList.defaultProps = {\n maxAvatars: 5\n};\n\nexport function AvatarList(props: AvatarListProps): JSX.Element {\n const itemsToDisplay = props.items.length > props.maxAvatars\n ? props.items.slice(0, props.maxAvatars - 1)\n : props.items;\n\n const hiddenItems = props.items.length > itemsToDisplay.length\n ? props.items.slice(props.maxAvatars - 1)\n : [];\n\n const AvatarItem = props.avatarItem;\n const hiddenItemsCounts = hiddenItems.length;\n const translateX = props.avatarSize === 'sm' ? 4 : 8;\n\n function getTooltip() {\n if (props.getHiddenTooltip)\n return props.getHiddenTooltip(hiddenItems);\n\n if (props.roleToDisplay)\n return getPhrase(props.roleToDisplay === 'staff' ? 'staff' : 'student', { count: hiddenItemsCounts, smartCount: hiddenItemsCounts });\n\n return getPhrase('users', { count: hiddenItemsCounts, smartCount: hiddenItemsCounts });\n }\n\n function getContainerStyles() {\n return {\n marginRight: `-${((itemsToDisplay.length - 1) + (hiddenItems.length ? 1 : 0) + (props.hasShareLink ? 1 : 0)) * translateX}px`\n };\n }\n\n function getAvatarStyles(idx: number) {\n return {\n transform: `translateX(${(props.hasShareLink ? idx + 1 : idx) * -translateX}px)`,\n zIndex: props.maxAvatars - idx\n };\n }\n\n if (itemsToDisplay.length === 0 && hiddenItems.length === 0)\n return <></>;\n\n return (\n <div\n className='d-flex'\n style={getContainerStyles()}\n >\n {props.hasShareLink && (\n <div style={{ zIndex: props.maxAvatars + 1 }}>\n <SharedLinkAvatar text={props.shareLinkText} avatarSize={props.avatarSize} className='bg-dark text-white' />\n </div>\n )}\n {itemsToDisplay.map((item, idx) => (\n <div\n className={`${props.avatarContainerClassname || ''}`} key={item.id}\n style={getAvatarStyles(idx)}\n >\n <AvatarItem\n item={item}\n imageCdnUrl={props.imageCdnUrl}\n index={idx}\n maxAvatars={props.maxAvatars}\n />\n </div>\n ))}\n\n {!!hiddenItems.length && (\n <div\n className={`${props.avatarContainerClassname || ''} bg-white rounded-circle`}\n style={{ transform: `translateX(${itemsToDisplay.length * -translateX}px)`, zIndex: props.maxAvatars - itemsToDisplay.length }}\n >\n <Tooltip title={getTooltip()} spanHack spanHackClassName='h-100 w-100'>\n <div className={`d-flex justify-content-center align-items-center border border-dark rounded-circle h-100 w-100 ${props.numberClassname || ''}`}>\n {`+${hiddenItems.length}`}\n </div>\n </Tooltip>\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, 25);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const items = responses.data.length\n ? ArrayHelper.flatten(responses.data).reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n items,\n isFetching: responses.isFetching\n };\n}","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Config } from 'libs/shared/interfaces';\n\nexport const AnalyticsRouteHelper = {\n getObjectUrl(config: Config, object: BaseObject): string {\n const baseUrl = config.analyticsWebUrl;\n\n if (!baseUrl)\n return;\n\n let relativeUrl = '';\n\n switch (object.typeId) {\n case MasterType.Video:\n relativeUrl = `/videos/${object.id}/overview`;\n break;\n\n case MasterType.Clip:\n relativeUrl = `/clips/${object.id}/overview`;\n break;\n\n case MasterType.Interactive:\n relativeUrl = `/interactives/${object.id}/overview`;\n break;\n }\n\n if (!relativeUrl)\n return;\n\n return UrlHelper.safeUrlConcat(baseUrl, relativeUrl);\n }\n};","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'share.sharesHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst SHARED_BY_ME_APP_LINK = { application: AppChannels.MY_SHARES, action: Actions.MyShares.SHARED_BY_ME };\nconst SHARED_WITH_ME_APP_LINK = { application: AppChannels.MY_SHARES, action: Actions.MyShares.SHARED_WITH_ME };\n\nfunction getPillTabs(): PillTab[] {\n const currentAppLink = ContextService.getCurrentRoute()?.appLink;\n\n return [\n {\n name: getPhrase('sharedByMe'),\n onSelect: () => Core.AppLinkHelper.trigger(SHARED_BY_ME_APP_LINK),\n active: currentAppLink?.action === SHARED_BY_ME_APP_LINK.action\n },\n {\n name: getPhrase('sharedWithMe'),\n onSelect: () => Core.AppLinkHelper.trigger(SHARED_WITH_ME_APP_LINK),\n active: currentAppLink?.action === SHARED_WITH_ME_APP_LINK.action\n }\n ];\n}\n\nexport function SharesHeader(): JSX.Element {\n return (\n <div className='pb-3'>\n <h1 className='h2 mb-3'>{getPhrase('shares')}</h1>\n <PillTabSelector tabs={getPillTabs()} />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'share.sharedByMeEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharedByMeEmptyStateProps {\n imageUrl: string;\n appLink?: Core.AppLink;\n useInteractiveCopy?: boolean;\n}\n\nexport function SharedByMeEmptyState(props: SharedByMeEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size='small'/>\n <EmptyState.Heading>\n {getPhrase(props.useInteractiveCopy ? 'interactivesHeading' : 'genericHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>{getPhrase(props.useInteractiveCopy ? 'interactivesInfo' : 'genericInfo')}</EmptyState.Info>\n {!!props.appLink &&\n <EmptyState.Cta appLink={props.appLink} text={getPhrase('cta')} />\n }\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { UnionShareObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './share-status-indicator.scss';\n\nconst namespace = 'share.shareStatusIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getStatusPhrase(share: UnionShareObject): string {\n if (share.type === ShareType.DirectShare)\n return getPhrase('active');\n\n switch (share.status) {\n case ShareLinkStatus.Active:\n return getPhrase('active');\n\n case ShareLinkStatus.Expired:\n return getPhrase('expired');\n }\n}\n\nfunction getBgColourClassName(share: UnionShareObject): string {\n if (share.type === ShareType.DirectShare)\n return 'bg-success';\n \n switch (share.status) {\n case ShareLinkStatus.Active:\n return 'bg-success';\n\n case ShareLinkStatus.Expired:\n return 'bg-gray-500';\n }\n}\n\ninterface ShareStatusIndicatorProps {\n share: UnionShareObject;\n}\n\n/**\n * TODO: add support for deleted share links (currently the api doesn't return these.)\n */\nexport function ShareStatusIndicator(props: ShareStatusIndicatorProps): JSX.Element {\n if (props.share.type === ShareType.DirectShare && !props.share.recipients?.length)\n return <></>;\n\n if (props.share.type === ShareType.ShareLink && props.share.isPasswordProtected) {\n return (\n <Tooltip title={getPhrase('passwordProtected')} spanHack>\n <SvgContainer svgName={cvSvgLibrary.Lock} size={SvgContainerSize.Small} />\n </Tooltip>\n );\n }\n\n return (\n <Tooltip\n title={getStatusPhrase(props.share)}\n spanHack\n spanHackClassName={styles.indicatorContainer}\n >\n <div className={`${styles.indicator} ${getBgColourClassName(props.share)}`} />\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"indicatorContainer\":\"T6YAv\",\"indicator\":\"_MRHG\"};","import React from 'react';\nimport { Column } from 'react-table';\nimport { format as formatDate } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport {\n ShareStatusIndicator\n} from 'libs/shared/apps/share/components/shared-by-me/share-status-indicator/ShareStatusIndicator';\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport {\n AnonymousSharedToAvatar,\n SharedLinkAvatar,\n SharedToAvatarList\n} from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, UnionShareObject } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.sharedByMeTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDateShared(share: UnionShareObject): string {\n if (share.type === ShareType.ShareLink || !share?.recipients?.length)\n return share.dateCreated;\n\n const datesShared = share.recipients.map(r => r.dateShared);\n\n datesShared.sort((date1, date2) => {\n if (DateHelper.isSame(date1, date2))\n return 0;\n\n return DateHelper.isAfter(date1, date2) ? 1 : -2;\n });\n\n\n if (!datesShared.length)\n return '';\n\n return ArrayHelper.last(datesShared);\n}\n\ninterface SharedByMeTableData {\n share: UnionShareObject;\n sharedObject: SharableEntity;\n dateShared: string;\n shareRecipients?: BaseObject[];\n viewCount: number;\n}\n\ntype TableDataGroupings = { [date: string]: SharedByMeTableData[] };\n\nexport function getColumns(\n index: number,\n dateHeading: string,\n getObjectAppLink: (object: BaseObject) => Core.AppLink,\n getObjectActions: (object: BaseObject) => ActionOptions[],\n imageCdnUrl: string,\n showStatus?: boolean,\n showViewCount?: boolean,\n breakpoints?: Breakpoints\n): Column<SharedByMeTableData>[] {\n const isMobile = breakpoints && (breakpoints.xs || breakpoints.sm);\n\n const columns: Column<SharedByMeTableData>[] = [\n {\n Header: showStatus ? '' : dateHeading,\n accessor: 'sharedObject',\n id: 'image',\n Cell: ({ value }) => (\n <div className='w-100'>\n <SharedObjectImage\n object={value}\n appLink={getObjectAppLink(value)}\n showVideoMetadata\n locationContext={LocationContext.SharedByMe}\n />\n </div>\n ),\n minWidth: 140,\n maxWidth: 30\n },\n {\n accessor: 'sharedObject',\n id: 'name',\n Cell: ({ value }) => {\n if (value.name) {\n if (VideoHelper.isVideoType(value) && !VideoHelper.getCanBeConsumed(value)?.canNavigate) {\n return (\n <span className='clamp-2'>\n {value.name}\n </span>\n );\n }\n\n return (\n <div className='clamp-2'>\n {VideoHelper.isVideoType(value) && (\n <VideoSubText\n type='series'\n video={value}\n appLink={'series' in value && value.series ? getObjectAppLink(value.series) : null}\n analyticsOptions={{ location: LocationContext.Insights }}\n />\n )}\n <AppLink\n appLink={getObjectAppLink(value)}\n analyticsData={{ id: value.id, name: value.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(value.type),\n actionType: UserAction.Click,\n location: LocationContext.SharedByMe\n }}\n >\n {value.name}\n </AppLink>\n </div>\n );\n }\n\n return <span><Text namespace={namespace} phrase='videoUnavailable' /></span>;\n },\n width: 60\n },\n {\n Header: index === 0 ? getPhrase('sharedTo') : '',\n accessor: 'shareRecipients',\n Cell: ({ value }) => {\n if (!value)\n return <SharedLinkAvatar />;\n\n if (!value.length)\n return <AnonymousSharedToAvatar />;\n\n return <SharedToAvatarList recipients={value} imageCdnUrl={imageCdnUrl} maxAvatars={isMobile ? 1 : 2} />;\n },\n width: 40\n },\n !isMobile && {\n Header: index === 0 ? getPhrase('shared') : '',\n id: 'dateShared',\n accessor: s => formatDate(s.dateShared),\n width: 40\n },\n {\n accessor: 'sharedObject',\n id: 'actions',\n Cell: ({ value }) => (\n <Actions\n actions={getObjectActions(value)}\n className='w-100 justify-content-end pe-2'\n />\n ),\n width: 20\n }\n ];\n\n const statusColumn: Column<SharedByMeTableData> = {\n Header: dateHeading,\n accessor: 'share',\n id: 'status',\n Cell: ({ value }) => (\n <ShareStatusIndicator share={value} />\n ),\n width: 5\n };\n\n const viewCountColumn: Column<SharedByMeTableData> = {\n Header: getPhrase('views'),\n accessor: 'viewCount',\n width: 30\n };\n\n if (showStatus)\n columns.splice(0, 0, statusColumn);\n\n if (showViewCount)\n columns.splice(columns.length - 1, 0, viewCountColumn);\n\n return columns.filter((Boolean));\n}\n\nexport function useGetData(\n sentShares: UnionShareObject[],\n sharedObjects: BaseObject[],\n shareRecipients: BaseObject[],\n groupByDate: boolean,\n dependencies: (string | boolean)[]\n): TableDataGroupings {\n return React.useMemo(() => {\n const tableData: SharedByMeTableData[] = [];\n\n sentShares.forEach(s => {\n const sharedObject = sharedObjects.find(o => o.id === s.objectId);\n\n let recipients: BaseObject[] | null = null;\n\n if (s.type === ShareType.DirectShare) {\n recipients = [];\n\n s.recipients?.forEach(r => {\n const recipient = shareRecipients.find(s => s.id === r.id);\n\n if (recipient)\n recipients.push(recipient);\n });\n }\n\n // Skip if we don't have access to the shared object (e.g. if it's been deleted)\n if (sharedObject)\n tableData.push({\n share: s,\n sharedObject,\n shareRecipients: recipients,\n dateShared: getDateShared(s),\n viewCount: s.viewCount ?? 0\n });\n });\n\n if (!groupByDate)\n return { [getPhrase('title')]: tableData };\n\n return ShareHelper.groupByDateShared(tableData);\n }, [...dependencies]);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { SHARES_TABLE_THEME } from 'libs/shared/apps/share/constants/TableTheme';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, UnionShareObject } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './SharedByMeTableUtils';\n\ninterface SharedByMeTableProps {\n sentShares: UnionShareObject[];\n sharedObjects: BaseObject[];\n shareRecipients: BaseObject[];\n getObjectAppLink: (object: BaseObject) => Core.AppLink;\n getObjectActions: (object: BaseObject) => ActionOptions[];\n imageCdnUrl: string;\n groupByDateShared?: boolean;\n showStatus?: boolean;\n showViewCount?: boolean;\n dependencies?: (string | boolean)[];\n breakpoints?: Breakpoints;\n}\n\nfunction SharedByMeTableMemo(props: SharedByMeTableProps): JSX.Element {\n const data = useGetData(\n props.sentShares,\n props.sharedObjects,\n props.shareRecipients,\n !!props.groupByDateShared,\n props.dependencies\n );\n\n return (\n <>\n {Object.keys(data).map((heading, index) => (\n <Table\n key={index}\n columns={getColumns(\n index,\n heading,\n props.getObjectAppLink,\n props.getObjectActions,\n props.imageCdnUrl,\n props.showStatus,\n props.showViewCount,\n props.breakpoints\n )}\n data={data[heading]}\n theme={SHARES_TABLE_THEME}\n />\n ))}\n </>\n );\n}\n\nexport const SharedByMeTable = React.memo(SharedByMeTableMemo);","// extracted by mini-css-extract-plugin\nexport default {\"imageColumn\":\"uIOaA\",\"nameColumn\":\"Nta2B\",\"sharedToColumn\":\"XTJBC\",\"dateSharedColumn\":\"HdARK\",\"actionsColumn\":\"DXyZw\",\"heading\":\"XZ6o7\",\"image\":\"MolfU\",\"name\":\"MM43m\",\"avatar\":\"EboYM\",\"date\":\"by_XM\",\"actions\":\"_S2M_\"};","import React from 'react';\n\nimport styles from './partial-shared-by-me-table.scss';\n\nfunction PartialRow(): JSX.Element {\n return (\n <div className={`d-flex striped-row rounded`}>\n <div className={`d-flex align-items-center justify-content-center p-2 ${styles.imageColumn}`}>\n <div className={`partial-loading-background rounded w-100 ${styles.image}`} />\n </div>\n <div className={`d-flex align-items-center p-2 ${styles.nameColumn}`}>\n <div className={`partial-loading-background w-75 ${styles.name}`} />\n </div>\n <div className={`d-flex align-items-center p-2 ${styles.sharedToColumn}`}>\n <div className={`partial-loading-background ${styles.avatar}`} />\n </div>\n <div className={`d-none d-md-flex align-items-center p-2 ${styles.dateSharedColumn}`}>\n <div className={`partial-loading-background ${styles.date}`} />\n </div>\n <div className={`d-flex align-items-center justify-content-end p-2 ${styles.actionsColumn}`}>\n <div className={`partial-loading-background rounded me-2 ${styles.actions}`} />\n </div>\n </div>\n );\n}\n\ninterface PartialHeaderProps {\n fullHeader?: boolean;\n}\n\nfunction PartialHeader(props: PartialHeaderProps): JSX.Element {\n return (\n <div className='d-flex mb-1'>\n <div className={`${styles.imageColumn} p-2`}>\n <div className={`partial-loading-background ${styles.heading}`} />\n </div>\n <div className={`${styles.nameColumn} p-2`}>\n &nbsp;\n </div>\n <div className={`${styles.sharedToColumn} p-2`}>\n {props.fullHeader\n ? <div className={`partial-loading-background ${styles.heading}`} />\n : <>&nbsp;</>\n }\n </div>\n <div className={`${styles.dateSharedColumn} p-2 d-none d-md-flex`}>\n {props.fullHeader\n ? <div className={`partial-loading-background ${styles.heading}`} />\n : <>&nbsp;</>\n }\n </div>\n <div className={`${styles.actionsColumn} p-2`}>\n &nbsp;\n </div>\n </div>\n );\n}\n\nexport function PartialSharedByMeTable(): JSX.Element {\n return (\n <>\n <div className='mb-3'>\n <PartialHeader fullHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n\n <div className='mb-3'>\n <PartialHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n\n <div className='mb-3'>\n <PartialHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, Config } from 'libs/shared/interfaces';\nimport { AnalyticsRouteHelper } from 'libs/shared/utils/AnalyticsRouteHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'liteShare.sharedByMe';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getShareActionOptions(sharedObject: BaseObject, entityType: SharableEntityType): ActionOptions {\n return {\n label: getPhrase('editShareSettings'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.SHARE,\n args: [sharedObject.id],\n params: { entityType }\n }\n };\n}\n\ninterface SeeUsageActionProps {\n label: string;\n url?: string;\n}\n\nfunction SeeUsageAction(props: SeeUsageActionProps): JSX.Element {\n return (\n <Tooltip title={props.label} spanHack>\n <a\n href={props.url}\n target='_blank'\n >\n <SvgContainer svgName={cvSvgLibrary.Analytics} />\n </a>\n </Tooltip>\n );\n}\n\nfunction getSharedObjectActions(\n sharedObject: BaseObject,\n isMobile: boolean,\n config: Config\n): ActionOptions[] {\n let entityType: SharableEntityType;\n let analyticsPhrase = 'viewUsage';\n\n if (VideoHelper.isVideo(sharedObject))\n entityType = 'video';\n\n if (VideoHelper.isInteractive(sharedObject)) {\n entityType = 'interactive';\n analyticsPhrase = 'viewResults';\n }\n\n if (VideoHelper.isClip(sharedObject))\n entityType = 'clip';\n\n if (sharedObject.typeId === MasterType.Series)\n entityType = 'series';\n\n if (sharedObject.typeId === MasterType.Playlist)\n entityType = 'playlist';\n\n if (VideoHelper.isVideoType(sharedObject)) {\n const { canConsume } = VideoHelper.getCanBeConsumed(sharedObject);\n\n if (!canConsume)\n return [];\n }\n\n const sharedObjectActions = [getShareActionOptions(sharedObject, entityType)];\n\n const objectUrl = AnalyticsRouteHelper.getObjectUrl(config, sharedObject);\n if (objectUrl) {\n sharedObjectActions.push({\n label: !isMobile\n ? () => <SeeUsageAction label={getPhrase(analyticsPhrase)} url={objectUrl} />\n : getPhrase(analyticsPhrase),\n\n className: 'btn btn-link',\n button: !isMobile,\n href: AnalyticsRouteHelper.getObjectUrl(config, sharedObject),\n openInNewTab: true\n });\n }\n\n return sharedObjectActions;\n}\n\nexport function useGetSharedObjectActions(breakpoints: Breakpoints): ((object: BaseObject) => ActionOptions[]) | null {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const isMobile = breakpoints.xs || breakpoints.sm;\n\n return React.useCallback((object: BaseObject) =>\n getSharedObjectActions(object, isMobile, config.data), [isMobile]);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharedByMeEmptyState } from 'libs/shared/apps/share/components/shared-by-me/empty-state/SharedByMeEmptyState';\nimport { SharedByMeTable } from 'libs/shared/apps/share/components/shared-by-me/table/SharedByMeTable';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useSharesTable } from 'shared/hooks/useSharesTable';\nimport { getObjectAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { SharesHeader } from 'apps/share/components/shares-header/SharesHeader';\n\nimport { PartialSharedByMeTable } from './partial-loading/PartialSharedByMeTable';\nimport {\n useGetSharedObjectActions\n} from './SharedByMeViewUtils';\n\nconst namespace = 'liteShare.sharedByMe';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function SharedByMeView(): JSX.Element {\n const { hasPermissions } = usePermissions();\n const { hasInsights } = useSettings(null);\n\n const breakpoints = useBreakpoints();\n\n const {\n sentShares,\n sharedObjects,\n shareRecipients,\n isFetching,\n showPartialLoading,\n nextCursor,\n hasMore,\n fetchNext,\n imageCdnUrl\n } = useSharesTable();\n\n const hasMyShares = hasPermissions(PermissionName.ViewMyShares) && hasInsights;\n\n React.useEffect(() => {\n if (hasMyShares)\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n }, { replace: true });\n }, [hasMyShares]);\n\n useSetPageMetadata({ title: getPhrase('sharedByMe') });\n\n const getSharedObjectActions = useGetSharedObjectActions(breakpoints);\n\n return (\n <div className='px-3'>\n {!hasMyShares && <SharesHeader />}\n\n {(() => {\n if (showPartialLoading)\n return <PartialSharedByMeTable />;\n\n if (!sentShares.length)\n return (\n <SharedByMeEmptyState\n appLink={{ application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME }}\n imageUrl={ImageUrls.EmptyStates.Share.SHARED_WITH_ME}\n />\n );\n\n return (\n <>\n <SharedByMeTable\n sentShares={sentShares}\n sharedObjects={sharedObjects}\n shareRecipients={shareRecipients}\n getObjectAppLink={getObjectAppLink}\n getObjectActions={getSharedObjectActions}\n imageCdnUrl={imageCdnUrl}\n groupByDateShared\n dependencies={[isFetching]}\n breakpoints={breakpoints}\n />\n {(hasMore || isFetching) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} nextCursor={nextCursor} />\n }\n </>\n );\n })()}\n </div>\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { DirectShare, UnionShareObject } from 'libs/shared/interfaces';\n\nexport const ShareHelper = {\n getDirectShares(sentShares: UnionShareObject[]): DirectShare[] {\n return sentShares?.filter(s => s.type === ShareType.DirectShare) as DirectShare[] ?? [];\n },\n \n getRecipientIds(sentShares: UnionShareObject[]): string[] {\n return ArrayHelper.uniq(ArrayHelper.flatten(ShareHelper.getDirectShares(sentShares).map(d => d.recipients ?? [])), 'id').map(r => r.id);\n }\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { GetSentItemsParams } from 'libs/shared/apps/share/interfaces/requests/GetSentItemsParams';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch, UseBatchFetchResult } from 'libs/shared/hooks/UseBatchFetch';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { BaseObject, Config, CurrentUser, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { ShareHelper } from 'libs/shared/utils/ShareHelper';\n\n\nexport function getBatchFetchResultAsArray(result: UseBatchFetchResult<BaseObject>): BaseObject[] {\n return result.items ? Object.values(result.items) : [];\n}\n\n/**\n * As we are displaying data in an infinite list, we only want to show partial loading\n * on the initial fetch.\n * Whenever a new page is fetched, `sharedObjects.data` and `recipients.data` will be `undefined`,\n * as their key will change. So instead of using those values to determine whether or not to\n * show partial loading, we save the first time that they load in state and then use that.\n */\nexport function usePartialLoading(\n sentShare: UnionShareObject[],\n sharedObjectsFetchResult: UseBatchFetchResult<BaseObject>,\n recipientIds: string[],\n recipientsFetchResult: UseBatchFetchResult<BaseObject>,\n filterKey: string\n): boolean {\n const [ initialSharedObjectsLoaded, setInitialSharedObjectsLoaded ] = React.useState(\n !!sharedObjectsFetchResult.items\n );\n const [ initialRecipientsLoaded, setInitialRecipientsLoaded ] = React.useState(\n !!recipientsFetchResult.items\n );\n\n React.useEffect(() => {\n setInitialSharedObjectsLoaded(false);\n setInitialRecipientsLoaded(false);\n }, [filterKey]);\n\n React.useEffect(() => {\n if (!sharedObjectsFetchResult.isFetching && sharedObjectsFetchResult.items)\n setInitialSharedObjectsLoaded(true);\n }, [ sharedObjectsFetchResult.isFetching, filterKey ]);\n\n React.useEffect(() => {\n if (!recipientsFetchResult.isFetching && recipientsFetchResult.items)\n setInitialRecipientsLoaded(true);\n }, [ recipientsFetchResult.isFetching, filterKey ]);\n\n if (sentShare && !sentShare.length)\n return false;\n\n return !sentShare\n || !initialSharedObjectsLoaded\n || (recipientIds.length && !initialRecipientsLoaded);\n}\n\nexport function useSharesTable(\n params?: GetSentItemsParams,\n interactiveInsights?: boolean,\n shouldFetch: boolean = true\n) {\n const fetch = Flight.useGetFetch();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const getRequest = (cursor?: string) => shouldFetch && ShareRequests.sentShare({\n cursor,\n ...params\n });\n const fetchNext = (cursor?: string) => fetch(getRequest(cursor));\n\n const {\n items: sentShares,\n hasMore,\n isFetching: isFetchingSentShares,\n nextCursor\n } = useInfiniteList<UnionShareObject>(getRequest, fetchNext);\n\n const sharedObjectIds = sentShares?.map(s => s.objectId) ?? [];\n\n const sharedObjectsFetchResult = useBatchFetch(sharedObjectIds, (ids: string[]) => {\n return ShareRequests.sharedObjectsById(ids);\n });\n\n const recipientIds = ShareHelper.getRecipientIds(sentShares);\n\n const shareRecipientsFetchResult = useBatchFetch(recipientIds, (ids: string[]) => {\n return ShareRequests.getRecipientsById(ids, currentUser.data.customerId);\n });\n \n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const filterKey = JSON.stringify(params);\n\n const showPartialLoading = usePartialLoading(\n sentShares,\n sharedObjectsFetchResult,\n recipientIds,\n shareRecipientsFetchResult,\n filterKey\n );\n\n // Wait until all data is fetched before telling the table to re-render\n const isFetching = isFetchingSentShares\n || sharedObjectsFetchResult.isFetching\n || shareRecipientsFetchResult.isFetching;\n\n const sharedObjects = getBatchFetchResultAsArray(sharedObjectsFetchResult);\n\n const [ shareRecipients, setShareRecipients ] = React.useState<BaseObject[]>(\n getBatchFetchResultAsArray(shareRecipientsFetchResult)\n );\n\n React.useEffect(() => {\n if (ObjectHelper.isEmpty(shareRecipientsFetchResult.items)) return;\n\n setShareRecipients(getBatchFetchResultAsArray(shareRecipientsFetchResult));\n }, [ !!shareRecipientsFetchResult.items, shareRecipientsFetchResult.isFetching, filterKey ]);\n \n const interactiveIds = getInteractiveIds();\n \n const interactivesPendingReview = Flight.useBasicFetch<InteractivesPendingReviews[]>(\n interactiveInsights && !!sharedObjectsFetchResult.items && currentUser.data &&\n InteractiveResultsRequests.pendingReviews({\n interactives: interactiveIds,\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n })\n );\n\n const dependencies = [ isFetching, filterKey, interactivesPendingReview.isFetching, shareRecipients.length ];\n \n function getInteractiveIds() {\n return interactiveInsights && sharedObjects?.length && sharedObjects.reduce(\n (acc, value) => {\n const isInteractive = value.typeId === MasterType.Interactive;\n\n if (!isInteractive) return acc;\n\n const interactive = value as InteractiveMetadata;\n return [ ...acc, { metadataId: interactive.id, interactiveId: interactive.interactiveId }];\n },\n []\n );\n }\n\n return {\n sentShares,\n sharedObjects,\n shareRecipients,\n interactivesPendingReview: interactivesPendingReview.data,\n isFetching,\n showPartialLoading,\n nextCursor,\n hasMore,\n fetchNext,\n imageCdnUrl: config.data?.imageCdnUrl,\n dependencies\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","includePublicResults","success","error","always","url","key","data","type","normalize","formatData","students","map","student","name","profileId","publicUser","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","getPhrase","LanguageService","getHiddenRecipientText","hiddenRecipients","counts","ArrayHelper","userCount","MasterType","classroomCount","groupCount","SharedToAvatar","props","user","item","typeId","classroom","classroomGroup","svgContainerClassName","Tooltip","title","surname","spanHack","spanHackClassName","Avatar","imageUrl","avatar","imageCdnUrl","initials","UserHelper","extraClasses","className","IconCircle","svgName","svgSize","SvgContainer","S","variant","metadata","colour","AnonymousSharedToAvatar","avatarSize","size","SharedLinkAvatar","text","SharedToAvatarList","AvatarList","items","recipients","avatarItem","avatarContainerClassname","getHiddenTooltip","hasShareLink","shareLinkText","defaultProps","maxAvatars","SHARES_TABLE_THEME","table","header","headerCell","row","cell","Actions","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","length","idx","label","appLink","href","onClick","dropdownToggleSvgSize","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","showBorder","customSize","ariaLabel","sortComponent","dropdownToggleClassName","actionsDropdownClassName","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","AppLink","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","showDivider","undefined","group","itemsToDisplay","slice","hiddenItems","AvatarItem","hiddenItemsCounts","translateX","getAvatarStyles","transform","zIndex","marginRight","index","roleToDisplay","count","smartCount","numberClassname","TabContents","tab","PillTabSelector","ref","containerRef","borderRadius","listClassName","tabs","active","onSelect","onSelectTab","useBatchFetch","itemIds","getRequest","requests","chunk","responses","reduce","acc","isFetching","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","Array","isArray","join","groupIdKey","AnalyticsRouteHelper","getObjectUrl","config","object","baseUrl","analyticsWebUrl","relativeUrl","mapColourToBsVariant","groupColour","SHARED_BY_ME_APP_LINK","application","SHARED_WITH_ME_APP_LINK","SharesHeader","currentAppLink","SharedByMeEmptyState","EmptyState","src","useInteractiveCopy","getStatusPhrase","share","ShareType","status","ShareLinkStatus","getBgColourClassName","ShareStatusIndicator","isPasswordProtected","getDateShared","dateCreated","datesShared","r","dateShared","date1","date2","DateHelper","getColumns","dateHeading","getObjectAppLink","getObjectActions","showStatus","showViewCount","breakpoints","isMobile","xs","sm","columns","Header","accessor","Cell","value","SharedObjectImage","showVideoMetadata","locationContext","minWidth","maxWidth","VideoHelper","canNavigate","VideoSubText","video","series","location","entity","ShareViewHelper","actionType","Text","namespace","phrase","s","statusColumn","viewCountColumn","splice","Boolean","SharedByMeTable","sentShares","sharedObjects","shareRecipients","groupByDate","dependencies","groupByDateShared","tableData","sharedObject","find","o","objectId","recipient","viewCount","ShareHelper","Object","keys","heading","Table","theme","PartialRow","PartialHeader","fullHeader","PartialSharedByMeTable","getShareActionOptions","entityType","args","params","SeeUsageAction","target","SharedByMeView","hasPermissions","usePermissions","hasInsights","useSettings","useBreakpoints","useSharesTable","showPartialLoading","nextCursor","hasMore","fetchNext","hasMyShares","PermissionName","replace","useSetPageMetadata","getSharedObjectActions","ConfigRequests","analyticsPhrase","canConsume","sharedObjectActions","objectUrl","useGetSharedObjectActions","InfiniteScrollFooter","ImageUrls","getDirectShares","getRecipientIds","d","getBatchFetchResultAsArray","result","values","interactiveInsights","shouldFetch","fetch","UserRequests","cursor","ShareRequests","isFetchingSentShares","sharedObjectIds","sharedObjectsFetchResult","ids","recipientIds","shareRecipientsFetchResult","filterKey","JSON","stringify","sentShare","recipientsFetchResult","initialSharedObjectsLoaded","setInitialSharedObjectsLoaded","initialRecipientsLoaded","setInitialRecipientsLoaded","usePartialLoading","setShareRecipients","ObjectHelper","interactiveIds","interactive","metadataId","interactivesPendingReview","I","interactives","filters","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","isNaN","test","parseInt","trim","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9182],{71020:(e,t,r)=>{r.d(t,{_:()=>s});var n=r(32735),i=r(80247),a=r(34152),o=r(83914),l=r(35223);const c={container:"VwD1b",spinner:"eJ85e"};function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function s(e){var t,r,s=(t=(0,a.YD)(),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,i,a,o,l=[],c=!0,u=!1;try{if(a=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(u)throw i}}return l}}(t,r)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?u(e,t):void 0}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=s[0],f=s[1];return n.useEffect((function(){var t;e.fetchOnScroll&&f&&!e.isFetching&&(null===(t=e.fetchNext)||void 0===t||t.call(e,e.nextCursor))}),[f,e.isFetching]),n.createElement("div",{className:"p-3 text-center ".concat(c.container),ref:d},e.isFetching?n.createElement(i.Z,{as:"span",animation:"border",role:"status",className:c.spinner}):n.createElement(o.x,{svgName:l.vn.ChevronDown,className:"svg-container cursor-pointer",size:o.S.Large,onClick:function(){var t;return null===(t=e.fetchNext)||void 0===t?void 0:t.call(e,e.nextCursor)}}))}s.defaultProps={fetchOnScroll:!1}},94644:(e,t,r)=>{r.d(t,{r:()=>s});var n=r(50242),i=r(81886),a=r(67058),o=r(14553),l=r(49267),c=r(49075),u={notFound:a.d,forbidden:{rating:o.q,yearLevel:o.q,region:l.a,privacy:o.q},badRequest:c._,internalServerError:c._};function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var a;a="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},u),t);a&&i.Q.Ry.isStatusCodeError(a)&&(a!==n.o.InternalServer?a!==n.o.NotFound?a!==n.o.Forbidden?r.badRequest||i.Q.Ry.throw(new o.badRequest):r.forbidden||i.Q.Ry.throw(new o.forbidden.privacy):r.notFound||i.Q.Ry.throw(new o.notFound):r.internalServerError||i.Q.Ry.throw(new c._))}}},39902:(e,t,r)=>{r.d(t,{f:()=>o});var n=r(20354),i=r(75896);function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function o(e,t){var r=i.m.chunk(e,25).map((function(e){return t(i.m.uniq(e))})),o=n.a.useBasicFetchAll(r);return{items:o.data.length?i.m.flatten(o.data).reduce((function(e,t){return Object.assign(Object.assign({},e),(r={},n=t.id,i=t,(n=function(e){var t=function(e){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=a(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==a(t)?t:t+""}(n))in r?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,r));var r,n,i}),{}):null,isFetching:o.isFetching}}},60115:(e,t,r)=>{r.d(t,{K:()=>u});var n=r(32735),i=r(50242),a=r(91967),o=400,l=r(45719);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function u(e,t,r,u,s,d){var f,m,v,h,p=(f=(0,n.useState)(0),m=2,function(e){if(Array.isArray(e))return e}(f)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,i,a,o,l=[],c=!0,u=!1;try{if(a=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(u)throw i}}return l}}(f,m)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,t):void 0}}(f,m)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),y=p[0],g=p[1],b=t,E=(0,l.P)((function(t){if(!e)return null;var r=e(t);return r?r.key:null}),u,s);return v={fetchNextPage:function(){if(t&&e&&E)return g((function(e){return e+1})),b(E.nextCursor)},hasMore:!!(null==E?void 0:E.nextCursor),isFetching:null==E?void 0:E.isFetching,scrollContainer:d},h=function(){if(!v.isFetching){if(v.scrollContainer){var e=v.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;v.fetchNextPage()}},(0,n.useEffect)((function(){var e=a.q.throttle(h,200),t=v.scrollContainer||window;return v.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[v.hasMore,v.fetchNextPage,v.scrollContainer]),(0,n.useEffect)((function(){E&&E.shouldInitialFetch&&t&&(b(),g((function(e){return e+1})))}),[null==E?void 0:E.shouldInitialFetch,t]),(0,n.useEffect)((function(){var e,t;if((null==E?void 0:E.statusCode)&&a.q.isFunction(r)){var n=+(null===(t=null===(e=E.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));n!==i.k.ClientError&&n!==i.k.ServerError||r(y,E.statusCode)}}),[null==E?void 0:E.statusCode]),{items:null==E?void 0:E.items,hasMore:!!(null==E?void 0:E.nextCursor),nextCursor:null==E?void 0:E.nextCursor,isFetching:null==E?void 0:E.isFetching,totalItems:null==E?void 0:E.totalItems,hasFirstPageCompleted:null==E?void 0:E.hasFirstPageCompleted}}},87821:(e,t,r)=>{r.d(t,{p:()=>a});var n=r(99940),i=r(110),a={userVideoHistory:function(e,t,r,n){var a="video:history",o="{gateway}/v1/users/me/watch-history";return e&&(a+=":".concat(e),o+="?cursor=".concat(e)),{key:a,url:o,formatData:function(e){return{data:e.data.map((function(e){var t=i.O.format(e.lastTimeWatched),r=i.O.format(t,"YYYY-MM-DD");return Object.assign(Object.assign({},e),{lastTimeWatched:t,lastDateWatched:r})})),pagination:e.pagination}},success:t,error:r,always:n}},videoHistory:function(e,t,r,n,i){var a=e.sort().map((function(e){return"videoId=".concat(e)}));return{key:"video:history:videos:".concat(a.join("&")),url:"{gateway}/v1/videos/history?".concat(a.join("&")),normalizeOptions:{namespace:t},formatData:function(e){return(null==e?void 0:e.length)?e.map((function(e){return{id:e.videoId,lastProgressPoint:e.lastProgressPoint}})):e},success:r,error:n,always:i}},removeFromHistory:function(e,t){return{url:"{gateway}/v1/users/me/videos/".concat(e,"/watch-history"),key:"remove:video:history:".concat(e),type:n.k.DELETE,invalidationKeys:["widget:".concat(t)]}}}},89885:(e,t,r)=>{r.r(t),r.d(t,{WatchHistoryView:()=>Z});var n=r(32735),i=r(70680),a=r(23481),o=r(20354),l=r(65858),c=r(71020),u=r(83345),s=r(51365),d=r(16714),f=r(94644),m=r(39151),v=r(1666),h=r(31949),p=r(1575),y=r(69883),g=r(39902),b=r(60115),E=r(22902),w=r(79612),S=r(51855),A=r(10671),P=r(27638),C=r(44110),k=r(97816),F=r(75896),O=r(110),j=r(13231),I=r(10741),x=r(22490),N=r(82431);function T(e){return T="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},T(e)}var L="watchHistory.watchHistoryVideoList";function H(e){var t=(0,E.T)().hasPermissions,r=F.m.groupBy(e.videoHistory,"lastDateWatched"),i={},o=Object.keys(r).sort().reverse();o.forEach((function(t){i[t]=r[t].map((function(t){var r=e.videos.find((function(e){return e.id.toString()===t.videoId.toString()}));return r?Object.assign(Object.assign({},r),{lastProgressPoint:t.lastProgressPoint}):null})).filter(Boolean)}));var l=o.reduce((function(e,t){var r,n,a,o,l=i[t].length,c=l+(null!==(r=e.runningTotal)&&void 0!==r?r:0);return Object.assign(Object.assign({},e),(n={runningTotal:c},o=c-l,(a=function(e){var t=function(e){if("object"!=T(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=T(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==T(t)?t:t+""}(a=t))in n?Object.defineProperty(n,a,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[a]=o,n))}),{});return n.createElement(n.Fragment,null,o.map((function(r){return i[r].length?n.createElement("div",{key:r,className:"pb-3"},n.createElement("h2",{className:"h4"},function(e){var t=O.O.timeSince(new Date(e),"day");return 0===t?a.T.getPhrase(L,"today"):1===t?a.T.getPhrase(L,"yesterday"):O.O.format(e,"Do MMMM")}(r)),n.createElement(j.E4,{videos:i[r],yearGroups:e.yearGroups,getVideoAppLink:x.W.getAppLink,getSubTextAppLink:function(e){return N.j.getSeriesAppLink(e.series)},hasPermissions:t,setFavourite:e.setFavourite,canFavourite:e.canFavourite,startingPositionIndex:l[r],presentationAudiences:e.presentationAudiences,getPreviewQuestionsAppLink:function(e){return I.j.getPreviewQuestionsAppLink(e)},imageCdnUrl:e.imageCdnUrl,isPlugin:e.isPlugin,getClassroomGuideAppLink:x.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:x.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:x.W.getResourceGuidanceAppLink})):n.createElement(n.Fragment,{key:r})})))}var D=r(87821),M=r(23232),V=r(99742),R=r(14070),W=r(97291),_="watchHistory.watchHistoryEmptyState",G=a.T.encloseNamespace(_);function U(e){var t=e.hasDiscover;return n.createElement(u.D.Provider,{value:_},n.createElement(M.u,null,n.createElement(M.u.Image,{src:V.W.EmptyStates.WATCH_HISTORY,altText:G("info")}),n.createElement(M.u.Heading,null,n.createElement(u.x,{phrase:"heading"})),n.createElement(M.u.Info,null,n.createElement(u.x,{phrase:"info"})),t&&n.createElement(M.u.Cta,{text:a.T.getPhrase(_,"cta"),appLink:{application:W.O.DASHBOARD,action:R.e.Dashboard.HOME}})))}function B(){return n.createElement(u.D.Provider,{value:_},n.createElement(M.u,null,n.createElement(M.u.Image,{src:V.W.EmptyStates.WATCH_HISTORY_PUBLIC,altText:G("publicInfo")}),n.createElement(M.u.Heading,null,n.createElement(u.x,{phrase:"publicHeading"})),n.createElement(M.u.Info,null,n.createElement(u.x,{phrase:"publicInfo"})),n.createElement(M.u.Cta,{text:a.T.getPhrase(_,"publicCta"),appLink:{application:W.O.SIGN_UP,action:R.e.SignUp.SIGN_UP},analyticsData:{},analyticsOptions:{actionType:l.Vw.Click,location:l.LZ.WatchHistoryLanding,entity:l.py.AppLink,workflowPhase:l.eu.Start,descriptor:l.Yu.SignUp}})))}var q=r(74696);const Y={partialDate:"vq4eE"};function $(){return n.createElement(n.Fragment,null,n.createElement("div",{className:"mb-3"},n.createElement("div",{className:"".concat(Y.partialDate," mb-2 partial-loading-background")}),n.createElement(q.S,{numVideos:2})),n.createElement("div",{className:"mb-3"},n.createElement("div",{className:"".concat(Y.partialDate," mb-2 partial-loading-background")}),n.createElement(q.S,{numVideos:3})),n.createElement("div",{className:"mb-3"},n.createElement("div",{className:"".concat(Y.partialDate," mb-2 partial-loading-background")}),n.createElement(q.S,{numVideos:2})),n.createElement("div",{className:"mb-3"},n.createElement("div",{className:"".concat(Y.partialDate," mb-2 partial-loading-background")}),n.createElement(q.S,{numVideos:5})))}var Q="watchHistory.watchHistory";function Z(){var e,t,r;(0,w.M)({title:a.T.getPhrase(Q,"pageTitle")});var F=(0,i.I0)(),O=(0,y.Z)(),j=(0,E.T)(),I=j.hasPermissions,x=j.hasLocalPermissions,N=(0,P.u)(l.LZ.VideoThumbnail),T=N.setFavourite,L=N.canFavourite,M=(0,S.G)().isPlugin,V=o.a.useBasicFetch(h.N.currentUser()),R=(0,A._)({location:A.i.VideoItem}),W=o.a.useBasicFetch((null===(e=V.data)||void 0===e?void 0:e.isAuthenticated)&&v.h.yearGroups(V.data.customerId)),_=o.a.useBasicFetch(m.L.config()),G=function(e){return D.p.userVideoHistory(e)},q=function(e){return o.a.getFetch(F)(G(e))},Y=!x(d.E.ViewWatchHistoryLanding)&&V.hasCompleted,Z=(0,b.K)(!!Y&&G,q,(function(e,t){if(1===e)return(0,f.r)(t);O.error(a.T.getPhrase(Q,"error"))})),z=Z.items,K=Z.hasMore,J=Z.isFetching,X=null!==(t=null==z?void 0:z.map((function(e){return e.videoId})))&&void 0!==t?t:[],ee=null!==(r=(0,g.f)(X,(function(e){return p.R.watchHistoryVideos(e)})).items)&&void 0!==r?r:{},te=Object.keys(ee).map((function(e){return ee[e]}));(0,k.V)(te);var re=(0,C.i)();return x(d.E.ViewWatchHistoryLanding)?n.createElement(B,null):n.createElement(u.D.Provider,{value:Q},n.createElement("div",{className:"px-3"},n.createElement("h1",{className:"h2"},n.createElement(u.x,{phrase:"heading"})),function(){var e;return z?z.length?te.length?n.createElement(s.M.Provider,{value:R},n.createElement(H,{videoHistory:z,videos:te,presentationAudiences:re.data,yearGroups:W.data,setFavourite:T,canFavourite:L,imageCdnUrl:null===(e=_.data)||void 0===e?void 0:e.imageCdnUrl,isPlugin:M}),(K||J)&&n.createElement(c._,{isFetching:J,fetchNext:q})):n.createElement($,null):n.createElement(U,{hasDiscover:I(d.C.ViewDiscover)}):n.createElement($,null)}()))}},44110:(e,t,r)=>{r.d(t,{i:()=>o});var n=r(20354),i=r(89454),a=r(86698),o=function(){var e=(0,a.y)({redirectOnError:!0}),t=e.activePresentation,r=e.getFallbackPresentation,o=t||r();return n.a.useBasicFetch(!!o&&i.O.presentationAudiences(o.id))}},97816:(e,t,r)=>{r.d(t,{V:()=>m});var n=r(32735),i=r(20354),a=r(75896),o=r(21750),l=r(31949),c=r(1575),u=r(31908);function s(e,t){if(e){if("string"==typeof e)return d(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var f=50;function m(e){var t,r,m=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},v=i.a.useBasicFetch(l.N.currentUser()),h=n.useRef(new Set),p=function(e){return e?Array.isArray(e)?e.filter((function(e){return!!e&&(u.M.isVideo(e)||u.M.isClip(e))})):"data"in e?e.data.filter((function(e){return!!e&&(u.M.isVideo(e)||u.M.isClip(e))})):[]:[]}(e),y=p.map((function(e){return e.id})),g=(t=n.useState([]),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,i,a,o,l=[],c=!0,u=!1;try{if(a=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(u)throw i}}return l}}(t,r)||s(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),b=g[0],E=g[1];n.useEffect((function(){if((null==y?void 0:y.length)&&v.hasCompleted){var e=[];y.forEach((function(t){h.current.has(t)||(e.push(t),h.current.add(t))})),e.length&&E((function(t){var r=function(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||s(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t);return a.m.chunk(e,f).forEach((function(e){var t;r.push(c.R.videoMixinAssocs(e,m.flightNamespace)),(null===(t=v.data)||void 0===t?void 0:t.isAuthenticated)&&r.push(o.x.hasCurriculumLinks(e,null,m.flightNamespace))})),r}))}}),[null==y?void 0:y.length,v.hasCompleted]),i.a.useBasicFetchAll(b)}},68050:(e,t,r)=>{r.d(t,{Z:()=>u});var n=r(95685),i=r.n(n),a=r(32735),o=r(46304),l=r(74512);const c=a.forwardRef((({bsPrefix:e,className:t,as:r="div",...n},a)=>{const c=(0,o.vE)(e,"row"),u=(0,o.pi)(),s=(0,o.zG)(),d=`${c}-cols`,f=[];return u.forEach((e=>{const t=n[e];let r;delete n[e],null!=t&&"object"==typeof t?({cols:r}=t):r=t;const i=e!==s?`-${e}`:"";null!=r&&f.push(`${d}${i}-${r}`)})),(0,l.jsx)(r,{ref:a,...n,className:i()(t,c,...f)})}));c.displayName="Row";const u=c}}]);
2
+ //# sourceMappingURL=9182-95605d2b04-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/9182-95605d2b04-lite.chunk.js","mappings":"+LACA,SAAgB,UAAY,QAAQ,QAAU,S,sGCmBxC,SAAUA,EAAqBC,GACnC,I,IAAmC,G,GAAX,U,EAAW,E,o4BAA3BC,EAAG,KAAEC,EAAM,KAYnB,OAVA,aAAgB,W,MACTF,EAAMG,eAGND,IAAUF,EAAMI,aAGN,QAAf,EAAAJ,EAAMK,iBAAS,gBAAGL,EAAMM,YAC1B,GAAG,CAAEJ,EAAQF,EAAMI,aAGjB,uBAAKG,UAAS,0BAAqB,aAAoBN,IAAKA,GACzDD,EAAMI,WACH,gBAACI,EAAA,EAAO,CAACC,GAAG,OAAOC,UAAU,SAASC,KAAK,SAASJ,UAAW,YAE/D,gBAACK,EAAA,EAAY,CACXC,QAAS,iBACTN,UAAU,+BACVO,KAAMF,EAAAG,EAAA,MACNC,QAAS,WAAK,MAAC,OAAe,QAAf,EAAAhB,EAAMK,iBAAS,sBAAGL,EAAMM,WAAW,IAM9D,CAhCAP,EAAqBkB,aAAe,CAClCd,eAAe,E,yGCUXe,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,IACZC,oBAAqB,KAGjB,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKI,OAGpB,IAAMC,EAAW,OAAH,wBACTf,GACAW,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,mBAMfA,IAAe,aAMfA,IAAe,cAUdD,EAAUL,YACb,aAAuB,IAAIQ,EAASR,YAN/BK,EAAUV,WACb,aAAuB,IAAIa,EAASb,UAAUI,SAX3CM,EAAUX,UACb,aAAuB,IAAIc,EAASd,UAPjCW,EAAUJ,qBACb,aAAuB,IAAI,KAvBvB,CA6CV,C,mSC3EM,SAAUQ,EACdC,EACAC,GAEA,IAEMC,EAFS,UAA0BF,EAAS,IAE1BG,KAAI,SAAAC,GAAK,OAAIH,EAAW,SAAiBG,GAAO,IAElEC,EAAY,qBAA6BH,GAM/C,MAAO,CACLI,MALYD,EAAUE,KAAKC,OACzB,YAAoBH,EAAUE,MAAME,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,I,EAAG,G,EAAGC,EAAKC,G,EAAKD,G,+XAAI,GAAK,CAAC,GAC1F,KAIF1C,WAAYoC,EAAUpC,WAE1B,C,wECjCM4C,EAAmB,I,iHC2BnB,SAAUC,EACdb,EACA/B,EACA6C,EACAC,EACAC,EACAC,GAEA,I,ID1BgCC,EAC1BC,ECyB+C,G,GAAX,IAAAC,UAAS,G,EAAE,E,o4BAA7CC,EAAY,KAAEC,EAAe,KAE/BC,EAActD,EAcduD,GAAW,QAZjB,SAAgBC,GACd,IAAKzB,EACH,OAAO,KAET,IAAM0B,EAAU1B,EAAWyB,GAE3B,OAAKC,EAGEA,EAAQC,IAFN,IAGX,GAIEZ,EACAC,GAwCF,ODrFgCE,ECwDd,CAChBU,cATF,WACE,GAAK3D,GAAc+B,GAAewB,EAIlC,OADAF,GAAgB,SAAAO,GAAU,OAAIA,EAAa,CAAC,IACrCN,EAAYC,EAAStD,WAC9B,EAIE4D,WAAWN,aAAQ,EAARA,EAAUtD,YACrBF,WAAYwD,aAAQ,EAARA,EAAUxD,WACtBiD,gBAAAA,GD3DIE,EAAe,WACnB,IAAID,EAAQlD,WAAZ,CAGA,GAAKkD,EAAQD,gBAON,CACL,IAAQA,EAAoBC,EAApBD,gBAKR,GAJ4BA,EAAgBc,wBAAwBC,OAASf,EAAgBgB,UAEzEhB,EAAgBiB,aAAetB,EAGjD,MACH,MAVC,GAJ4BuB,OAAOC,YAAcC,SAASC,gBAAgBL,UAEtDI,SAASC,gBAAgBJ,aAAetB,EAG1D,OAWJM,EAAQU,eAnBA,CAoBV,GAEA,IAAAW,YAAU,WACR,IAAMC,EAAWC,EAAA,WAAwBtB,EAAc,KAEjDF,EAAkBC,EAAQD,iBAAmBkB,OAKnD,OAHIjB,EAAQY,SACVb,EAAgByB,iBAAiB,SAAUF,GAEtC,kBAAMvB,EAAgB0B,oBAAoB,SAAUH,EAAS,CACtE,GAAG,CAAEtB,EAAQY,QAASZ,EAAQU,cAAeV,EAAQD,mBC6BrD,IAAAsB,YAAU,WACHf,GAGDA,EAASoB,oBAAsB3E,IACjCsD,IACAD,GAAgB,SAAAO,GAAU,OAAIA,EAAa,CAAC,IAEhD,GAAG,CAAEL,aAAQ,EAARA,EAAUoB,mBAAoB3E,KAEnC,IAAAsE,YAAU,W,QACR,IAAKf,aAAQ,EAARA,EAAU7B,aAAe8C,EAAA,aAA0B3B,GAAxD,CAGA,IAAM+B,IAAoE,QAA/B,EAAmB,QAAnB,EAAArB,EAAS7B,kBAAU,eAAEmD,kBAAU,eAAEC,OAAO,EAAG,IAElFF,IAAoBG,EAAA,eAA+BH,IAAoBG,EAAA,eAG3ElC,EAAQO,EAAcG,EAAS7B,WAPvB,CAQV,GAAG,CAAC6B,aAAQ,EAARA,EAAU7B,aAEP,CACLU,MAAOmB,aAAQ,EAARA,EAAUnB,MACjByB,WAAWN,aAAQ,EAARA,EAAUtD,YACrBA,WAAYsD,aAAQ,EAARA,EAAUtD,WACtBF,WAAYwD,aAAQ,EAARA,EAAUxD,WACtBiF,WAAYzB,aAAQ,EAARA,EAAUyB,WACtBC,sBAAuB1B,aAAQ,EAARA,EAAU0B,sBAErC,C,2DCjGaC,EAAuB,CAClCC,iBAAgB,SACd3B,EACA4B,EACAC,EACAC,GAEA,IAAI5B,EAAM,gBACN6B,EAAM,sCAOV,OALI/B,IACFE,GAAO,IAAJ,OAAQF,GACX+B,GAAO,WAAJ,OAAe/B,IAGb,CACLE,IAAAA,EACA6B,IAAAA,EACAC,WAAY,SAACC,GACX,MAAO,CACLpD,KAAMoD,EAAkBpD,KAAKJ,KAAI,SAAAyD,GAE/B,IAAMC,EAAuB,WAAkBD,EAAYE,iBACrDC,EAAuB,WAAkBF,EAAsB,cAErE,OAAO,OAAP,wBACKD,GAAW,CACdE,gBAAiBD,EACjBG,gBAAiBD,GAErB,IACAE,WAAYN,EAAkBM,WAElC,EACAX,QAAAA,EACAC,MAAAA,EACAC,OAAAA,EAEJ,EAEAU,aAAY,SACVC,EACAC,EACAd,EACAC,EACAC,GAEA,IAAMa,EAASF,EAAIG,OAAOnE,KAAI,SAAAoE,GAAC,wBAAeA,EAAC,IAE/C,MAAO,CACL3C,IAAK,wBAAF,OAA0ByC,EAAOG,KAAK,MACzCf,IAAK,+BAAF,OAAiCY,EAAOG,KAAK,MAChDC,iBAAkB,CAChBL,UAAAA,GAEFV,WAAY,SAACC,GACX,OAAKA,aAAiB,EAAjBA,EAAmBnD,QAOjBmD,EAAkBxD,KAAI,SAACuE,GAAwB,MAAM,CAC1D9D,GAAI8D,EAAaC,QACjBC,kBAAmBF,EAAaE,kBACjC,IATQjB,CAUX,EACAL,QAAAA,EACAC,MAAAA,EACAC,OAAAA,EAEJ,EAEAqB,kBAAiB,SAACF,EAAiBG,GACjC,MAAO,CACLrB,IAAK,gCAAF,OAAkCkB,EAAO,kBAC5C/C,IAAK,wBAAF,OAA0B+C,GAC7BI,KAAM,WACNC,iBAAkB,CAAC,UAAD,OACNF,IAGhB,E,ymBC5EF,IAAMV,EAAY,qCAyBZ,SAAUa,EAAsBpH,GACpC,IAAQqH,GAAmB,EAAAC,EAAA,KAAnBD,eAEFE,EAAgBC,EAAA,UAAoBxH,EAAMqG,aAAc,mBAExDoB,EAAiD,CAAC,EAElDC,EAAcC,OAAOC,KAAKL,GAAed,OAAOoB,UAGtDH,EAAYI,SAAQ,SAAAC,GAClBN,EAAYM,GAAQR,EAAcQ,GAAMzF,KAAI,SAAA0F,GAC1C,IAAMC,EAAQjI,EAAMkI,OAAOC,MAAK,SAAAC,GAAC,OAAIA,EAAErF,GAAGmC,aAAe8C,EAAQlB,QAAQ5B,UAAU,IAEnF,OAAK+C,EAGE,OAAP,wBACKA,GAAK,CACRlB,kBAAmBiB,EAAQjB,oBAJpB,IAMX,IAAGsB,OAAOC,QACZ,IAEA,IAAMC,EAAwBb,EAAY9E,QAAO,SAAC4F,EAAwBC,G,YAClEC,EAAYjB,EAAYgB,GAAa9F,OACrCgG,EAAeD,GAAoC,QAAvB,EAAAF,EAAWG,oBAAY,QAAI,GAE7D,OAAO,OAAP,wBACKH,I,EAAU,CACbG,aAAAA,G,EACeA,EAAeD,G,sRAA7BD,M,2FAEL,GAAG,CAAC,GAEJ,OACE,gCACGf,EAAYpF,KAAI,SAAAyF,GAGf,OAAKN,EAAYM,GAAMpF,OAIrB,uBAAKoB,IAAKgE,EAAMxH,UAAU,QACxB,sBAAIA,UAAU,MApE1B,SAAoBwH,GAClB,IAAMa,EAAOC,EAAA,YAAqB,IAAIC,KAAKf,GAAO,OAElD,OAAa,IAATa,EACKG,EAAA,YAA0BxC,EAAW,SAEjC,IAATqC,EACKG,EAAA,YAA0BxC,EAAW,aAEvCsC,EAAA,SAAkBd,EAAM,UACjC,CA0DgCiB,CAAWjB,IAC/B,gBAACkB,EAAA,GAAS,CACRf,OAAQT,EAAYM,GACpBmB,WAAYlJ,EAAMkJ,WAClBC,gBAAiBC,EAAA,aACjBC,kBAAmB,SAAApB,GAAK,OAAIqB,EAAA,mBAAqCrB,EAAMsB,OAAO,EAC9ElC,eAAgBA,EAChBmC,aAAcxJ,EAAMwJ,aACpBC,aAAczJ,EAAMyJ,aACpBC,sBAAuBnB,EAAsBR,GAC7C4B,sBAAuB3J,EAAM2J,sBAC7BC,2BAA4B,SAAAC,GAAW,OAAIC,EAAA,6BAA8CD,EAAY,EACrGE,YAAa/J,EAAM+J,YACnBC,SAAUhK,EAAMgK,SAChBC,yBAA0Bb,EAAA,2BAC1Bc,8BAA+Bd,EAAA,gCAC/Be,2BAA4Bf,EAAA,gCApBzB,gBAAC,WAAc,CAACrF,IAAKgE,GAwBhC,IAGN,C,2DChGM,EAAY,sCACZqC,EAAYrB,EAAA,mBAAiC,GAM7C,SAAUsB,EAAuB,GAA4C,IAA1CC,EAAW,EAAXA,YACvC,OACE,gBAAC,aAAiC,CAACC,MAAO,GACxC,gBAACC,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAACC,IAAKC,EAAA,4BAAqCC,QAASP,EAAU,UAE/E,gBAACI,EAAA,UAAkB,KAAC,gBAACI,EAAA,EAAI,CAACC,OAAO,aACjC,gBAACL,EAAA,OAAe,KAAC,gBAACI,EAAA,EAAI,CAACC,OAAO,UAE7BP,GACC,gBAACE,EAAA,MAAc,CACbM,KAAM/B,EAAA,YAA0B,EAAW,OAC3CgC,QAAS,CACPC,YAAa,cACbC,OAAQ,uBAOtB,CAEM,SAAUC,IACd,OACE,gBAAC,aAAiC,CAACX,MAAO,GACxC,gBAACC,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAACC,IAAKC,EAAA,mCAA4CC,QAASP,EAAU,gBACtF,gBAACI,EAAA,UAAkB,KAAC,gBAACI,EAAA,EAAI,CAACC,OAAO,mBACjC,gBAACL,EAAA,OAAe,KAAC,gBAACI,EAAA,EAAI,CAACC,OAAO,gBAC9B,gBAACL,EAAA,MAAc,CACbM,KAAM/B,EAAA,YAA0B,EAAW,aAC3CgC,QAAS,CACPC,YAAa,YACbC,OAAQ,oBAEVE,cAAe,CAAC,EAChBC,iBAAkB,CAChBC,WAAY,WACZC,SAAU,yBACVC,OAAQ,aACRC,cAAe,WACfC,WAAY,KAAAC,WAMxB,C,eCnEA,SAAgB,YAAc,SCKxB,SAAUC,IACd,OACE,gCACE,uBAAKpL,UAAU,QACb,uBAAKA,UAAS,UAAK,cAAkB,sCACrC,gBAACqL,EAAA,EAAgB,CAACC,UAAW,KAG/B,uBAAKtL,UAAU,QACb,uBAAKA,UAAS,UAAK,cAAkB,sCACrC,gBAACqL,EAAA,EAAgB,CAACC,UAAW,KAG/B,uBAAKtL,UAAU,QACb,uBAAKA,UAAS,UAAK,cAAkB,sCACrC,gBAACqL,EAAA,EAAgB,CAACC,UAAW,KAG/B,uBAAKtL,UAAU,QACb,uBAAKA,UAAS,UAAK,cAAkB,sCACrC,gBAACqL,EAAA,EAAgB,CAACC,UAAW,KAIrC,CCOA,IAAM,EAAY,4BAEZ,SAAUC,I,WACd,EAAAC,EAAA,GAAmB,CAAEC,MAAOjD,EAAA,YAA0B,EAAW,eACjE,IAAMkD,GAAW,UACXC,GAAS,SACf,GAAgD,EAAA5E,EAAA,KAAxCD,EAAc,EAAdA,eAAgB8E,EAAmB,EAAnBA,oBAExB,GAAuC,EAAAC,EAAAC,GAAkB,qBAAjD7C,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aACdO,GAAa,EAAAsC,EAAA,KAAbtC,SACFuC,EAAc,kBAAkCC,EAAA,iBAChDC,GAAe,EAAAC,EAAA,GAAgB,CAAEpB,SAAU,gBAC3CpC,EAAa,mBACD,QAAhB,EAAAqD,EAAY7J,YAAI,eAAEiK,kBAAmBC,EAAA,aAA4BL,EAAY7J,KAAKmK,aAE9EC,EAAS,kBAA6BC,EAAA,YAEtCC,EAA6B,SAACnJ,GAClC,OAAO0B,EAAA,mBAAsC1B,EAC/C,EAEMxD,EAAY,SAACwD,GACjB,OAAO,aAAgBoI,EAAhB,CAA0Be,EAA2BnJ,GAC9D,EAEMoJ,GAAed,EAAoB,8BAAgDI,EAAYW,aAErG,GAII,SAA8BD,GAAcD,EAAoC3M,GAEpF,SAAiB8M,EAAoBC,GACnC,GAAmB,IAAfD,EACF,OAAO,OAAgBC,GAEzBlB,EAAOxG,MAAMqD,EAAA,YAA0B,EAAW,SACpD,IAVS1C,EAAY,EAAnB5D,MACAyB,EAAO,EAAPA,QACA9D,EAAU,EAAVA,WAUIiN,EAA4C,QAAjC,EAAAhH,aAAY,EAAZA,EAAc/D,KAAI,SAAA8F,GAAC,OAAIA,EAAEtB,OAAO,WAAC,QAAI,GAMhDwG,GAAmC,QAAvB,GAJQ,OAAcD,GAAU,SAAC/G,GACjD,OAAOiH,EAAA,qBAAiCjH,EAC1C,IAEoC7D,aAAK,QAAI,CAAC,EAExCyF,GAASP,OAAOC,KAAK0F,IAAWhL,KAAI,SAAAS,GAAE,OAAIuK,GAAUvK,EAAG,KAE7D,EAAAyK,EAAA,GAActF,IAEd,IAAMuF,IAAY,EAAAC,EAAA,KAElB,OAAIvB,EAAoB,6BACf,gBAACjB,EAA4B,MAGpC,gBAAC,aAAiC,CAACX,MAAO,GACxC,uBAAKhK,UAAU,QACb,sBAAIA,UAAU,MAAK,gBAACqK,EAAA,EAAI,CAACC,OAAO,aAC9B,W,MACA,OAAKxE,EAGAA,EAAa1D,OAGbuF,GAAOvF,OAIV,gBAACgL,EAAA,WAA4B,CAACpD,MAAOkC,GACnC,gBAACrF,EAAqB,CACpBf,aAAcA,EACd6B,OAAQA,GACRyB,sBAAuB8D,GAAU/K,KACjCwG,WAAYA,EAAWxG,KACvB8G,aAAcA,EACdC,aAAcA,EACdM,YAAwB,QAAX,EAAA+C,EAAOpK,YAAI,eAAEqH,YAC1BC,SAAUA,KAEV9F,GAAW9D,IAAe,gBAACL,EAAA,EAAoB,CAACK,WAAYA,EAAYC,UAAWA,KAdhF,gBAACsL,EAAmB,MAHpB,gBAACtB,EAAsB,CAACC,YAAajD,EAAeuG,EAAA,kBAHpD,gBAACjC,EAAmB,KAuB/B,CAzBE,IA6BV,C,wECxHa+B,EAA2B,WACtC,OAAwD,OAAgB,CAAEG,iBAAiB,IAAnFC,EAAkB,EAAlBA,mBAAoBC,EAAuB,EAAvBA,wBAEtBC,EAAeF,GAAsBC,IAO3C,OALkB,oBACdC,GACF,0BAAuCA,EAAajL,IAIxD,C,yeCPA,IAAMkL,EAAa,GAyBb,SAAUT,EAAcU,GAA+C,I,IAA/B5K,EAAA,uDAA6B,CAAC,EACpEiJ,EAAc,kBAAkC,mBAEhD4B,EAAiB,SAA0B,IAAIC,KAE/ClG,EA1BR,SAAyBgG,GACvB,OAAKA,EAGDG,MAAMC,QAAQJ,GACTA,EAAQ7F,QAAO,SAAAkG,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEjF,SAAUL,EACLA,EAAQxL,KAAK2F,QAAO,SAAAkG,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEnF,GARE,EASX,CAeiBC,CAAgBN,GAEzBb,EAAWnF,EAAO5F,KAAI,SAAA8F,GAAC,OAAIA,EAAErF,EAAE,IAE+B,G,EAApC,WAAiC,I,EAAG,E,unBAA5De,EAAO,KAAE2K,EAAU,KAE3B,aAAgB,WACd,IAAKpB,aAAQ,EAARA,EAAU1K,SAAW4J,EAAYW,aAAtC,CAGA,IAAMwB,EAA6B,GAEnCrB,EAASvF,SAAQ,SAAA/E,GACVoL,EAAeQ,QAAQC,IAAI7L,KAC9B2L,EAAiBG,KAAK9L,GACtBoL,EAAeQ,QAAQG,IAAI/L,GAE/B,IAEK2L,EAAiB/L,QAGtB8L,GAAW,SAAAM,GACT,IAAMC,E,yWAAc,CAAID,GASxB,OAPA,UAA0BL,EAAkBT,GAAYnG,SAAQ,SAAAvF,G,MAC9DyM,EAAYH,KAAK,qBAA+BtM,EAAOe,EAAQ2L,mBAE3C,QAAhB,EAAA1C,EAAY7J,YAAI,eAAEiK,kBACpBqC,EAAYH,KAAK,uBAA0CtM,EAAO,KAAMe,EAAQ2L,iBACpF,IAEOD,CACT,GAzBQ,CA0BV,GAAG,CAAE3B,aAAQ,EAARA,EAAU1K,OAAQ4J,EAAYW,eAEnC,qBAAwBpJ,EAC1B,C,4FCxEA,MAAMoL,EAAmB,cAAiB,EACxCC,WACA5O,YAEAE,GAAI2O,EAAY,SACbpP,GACFC,KACD,MAAMoP,GAAoB,QAAmBF,EAAU,OACjDG,GAAc,UACdC,GAAgB,UAChBC,EAAa,GAAGH,SAChBI,EAAU,GAehB,OAdAH,EAAYxH,SAAQ4H,IAClB,MAAMC,EAAY3P,EAAM0P,GAExB,IAAIE,SADG5P,EAAM0P,GAEI,MAAbC,GAA0C,iBAAdA,IAE5BC,QACED,GAEJC,EAAOD,EAET,MAAME,EAAQH,IAAaH,EAAgB,IAAIG,IAAa,GAChD,MAARE,GAAcH,EAAQZ,KAAK,GAAGW,IAAaK,KAASD,IAAO,KAE7C,SAAKR,EAAW,CAClCnP,IAAKA,KACFD,EACHO,UAAW,IAAWA,EAAW8O,KAAsBI,IACvD,IAEJP,EAAIY,YAAc,MAClB,S","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/apps/watch-history/flight-requests/VideoHistoryRequests.ts","file:///app/packages/projects/lite/src/apps/watch-history/components/watch-history-video-list/WatchHistoryVideoList.tsx","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/empty-state/WatchHistoryEmptyState.tsx","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/partial-loading/partial-watch-history.scss","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/partial-loading/PartialWatchHistory.tsx","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/WatchHistoryView.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, 25);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const items = responses.data.length\n ? ArrayHelper.flatten(responses.data).reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n items,\n isFetching: responses.isFetching\n };\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","\nimport { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoHistoryCollection } from 'libs/shared/interfaces';\n\nexport const VideoHistoryRequests = {\n userVideoHistory(\n cursor?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let key = 'video:history';\n let url = `{gateway}/v1/users/me/watch-history`;\n\n if (cursor) {\n key += `:${cursor}`;\n url += `?cursor=${cursor}`;\n }\n\n return {\n key,\n url,\n formatData: (historyCollection: VideoHistoryCollection) => {\n return {\n data: historyCollection.data.map(historyData => {\n // Convert last watched times from UTC to local time\n const lastTimeWatchedLocal = DateHelper.format(historyData.lastTimeWatched);\n const lastDateWatchedLocal = DateHelper.format(lastTimeWatchedLocal, 'YYYY-MM-DD');\n\n return {\n ...historyData,\n lastTimeWatched: lastTimeWatchedLocal,\n lastDateWatched: lastDateWatchedLocal\n };\n }),\n pagination: historyCollection.pagination\n };\n },\n success,\n error,\n always\n };\n },\n\n videoHistory(\n ids: string[],\n namespace?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const params = ids.sort().map(i => `videoId=${i}`);\n\n return {\n key: `video:history:videos:${params.join('&')}`,\n url: `{gateway}/v1/videos/history?${params.join('&')}`,\n normalizeOptions: {\n namespace\n },\n formatData: (historyCollection: HashObject[]) => {\n if (!historyCollection?.length)\n return historyCollection;\n\n /**\n * Data is formatted to enable it to be merged with the existing video object in the store\n * Where we need to merge more history properties with the video object, map them below.\n */\n return historyCollection.map((watchHistory: HashObject) => ({\n id: watchHistory.videoId,\n lastProgressPoint: watchHistory.lastProgressPoint\n }));\n },\n success,\n error,\n always\n };\n },\n\n removeFromHistory(videoId: string, widgetId: string): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/videos/${videoId}/watch-history`,\n key: `remove:video:history:${videoId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [\n `widget:${widgetId}`\n ]\n };\n }\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, VideoHistory, VideoTypes, YearGroup } from 'libs/shared/interfaces';\n\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'watchHistory.watchHistoryVideoList';\n\nfunction formatDate(date: string): string {\n const diff = DateHelper.timeSince(new Date(date), 'day');\n\n if (diff === 0)\n return LanguageService.getPhrase(namespace, 'today');\n\n if (diff === 1)\n return LanguageService.getPhrase(namespace, 'yesterday');\n\n return DateHelper.format(date, 'Do MMMM');\n}\n\ninterface WatchHistoryVideoListProps {\n videoHistory: VideoHistory[];\n videos: VideoTypes[];\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n presentationAudiences?: PresentationAudience[];\n imageCdnUrl?: string;\n isPlugin: boolean;\n}\n\nexport function WatchHistoryVideoList(props: WatchHistoryVideoListProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const historyGroups = ArrayHelper.groupBy(props.videoHistory, 'lastDateWatched');\n\n const videoGroups: { [index: string]: VideoTypes[] } = {};\n\n const sortedDates = Object.keys(historyGroups).sort().reverse();\n\n // Map video history to video objects and mixin lastProgressPoint\n sortedDates.forEach(date => {\n videoGroups[date] = historyGroups[date].map(history => {\n const video = props.videos.find(v => v.id.toString() === history.videoId.toString());\n\n if (!video)\n return null;\n\n return {\n ...video,\n lastProgressPoint: history.lastProgressPoint\n };\n }).filter(Boolean);\n });\n\n const sortedDatesGroupCount = sortedDates.reduce((dateCounts: HashObject, currentDate: string) => {\n const dateTotal = videoGroups[currentDate].length;\n const runningTotal = dateTotal + (dateCounts.runningTotal ?? 0);\n\n return {\n ...dateCounts,\n runningTotal,\n [currentDate]: runningTotal - dateTotal\n };\n }, {});\n\n return (\n <>\n {sortedDates.map(date => {\n // TODO: Fix bug where watch history endpoint returns workspace videos that cannot be fetched/displayed.\n // This is caused by 1 user sharing their workspace video with another user.\n if (!videoGroups[date].length)\n return <React.Fragment key={date}></React.Fragment>;\n\n return (\n <div key={date} className='pb-3'>\n <h2 className='h4'>{formatDate(date)}</h2>\n <VideoList\n videos={videoGroups[date]}\n yearGroups={props.yearGroups}\n getVideoAppLink={VideoAppLinkHelper.getAppLink}\n getSubTextAppLink={video => SeriesAppLinkHelper.getSeriesAppLink(video.series)}\n hasPermissions={hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n startingPositionIndex={sortedDatesGroupCount[date]}\n presentationAudiences={props.presentationAudiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n </div>\n );\n })}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'watchHistory.watchHistoryEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WatchHistoryEmptyStateProps {\n hasDiscover: boolean;\n}\n\nexport function WatchHistoryEmptyState({ hasDiscover }: WatchHistoryEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.WATCH_HISTORY} altText={getPhrase('info')} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n\n {hasDiscover &&\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'cta')}\n appLink={{\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }}\n />\n }\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function WatchHistoryPublicEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.WATCH_HISTORY_PUBLIC} altText={getPhrase('publicInfo')}/>\n <EmptyState.Heading><Text phrase='publicHeading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='publicInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'publicCta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.WatchHistoryLanding,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialDate\":\"vq4eE\"};","import React from 'react';\n\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-watch-history.scss';\n\nexport function PartialWatchHistory(): JSX.Element {\n return (\n <>\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={2} />\n </div>\n\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={3} />\n </div>\n\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={2} />\n </div>\n\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={5} />\n </div>\n </>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, VideoHistory, YearGroup } from 'libs/shared/interfaces';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { WatchHistoryVideoList } from 'apps/watch-history/components/watch-history-video-list/WatchHistoryVideoList';\nimport { VideoHistoryRequests } from 'apps/watch-history/flight-requests/VideoHistoryRequests';\n\nimport { WatchHistoryEmptyState, WatchHistoryPublicEmptyState } from './empty-state/WatchHistoryEmptyState';\nimport { PartialWatchHistory } from './partial-loading/PartialWatchHistory';\n\nconst namespace = 'watchHistory.watchHistory';\n\nexport function WatchHistoryView(): JSX.Element {\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const getUserVideoHistoryRequest = (cursor?: string) => {\n return VideoHistoryRequests.userVideoHistory(cursor);\n };\n\n const fetchNext = (cursor?: string) => {\n return Flight.getFetch(dispatch)(getUserVideoHistoryRequest(cursor));\n };\n\n const shouldFetch = !hasLocalPermissions(LocalPermissionName.ViewWatchHistoryLanding) && currentUser.hasCompleted;\n\n const {\n items: videoHistory,\n hasMore,\n isFetching\n } = useInfiniteList<VideoHistory>(shouldFetch ? getUserVideoHistoryRequest : false, fetchNext, onError);\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const videoIds = videoHistory?.map(v => v.videoId) ?? [];\n\n const videosFetchResult = useBatchFetch(videoIds, (ids: string[]) => {\n return VideoRequests.watchHistoryVideos(ids);\n });\n\n const videosMap = videosFetchResult.items ?? {};\n\n const videos = Object.keys(videosMap).map(id => videosMap[id]);\n\n useVideoMixin(videos);\n\n const audiences = usePresentationAudiences();\n\n if (hasLocalPermissions(LocalPermissionName.ViewWatchHistoryLanding))\n return <WatchHistoryPublicEmptyState />;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='px-3'>\n <h1 className='h2'><Text phrase='heading' /></h1>\n {(() => {\n if (!videoHistory)\n return <PartialWatchHistory />;\n\n if (!videoHistory.length)\n return <WatchHistoryEmptyState hasDiscover={hasPermissions(PermissionName.ViewDiscover)} />;\n\n if (!videos.length)\n return <PartialWatchHistory />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <WatchHistoryVideoList\n videoHistory={videoHistory}\n videos={videos}\n presentationAudiences={audiences.data}\n yearGroups={yearGroups.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n imageCdnUrl={config.data?.imageCdnUrl}\n isPlugin={isPlugin}\n />\n {(hasMore || isFetching) && <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />}\n </VideoActionsContext.Provider>\n );\n })()}\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Clip, ClipCollection, CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst CHUNK_SIZE = 50;\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videos = getValidObjects(objects);\n\n const videoIds = videos.map(v => v.id);\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [...r] ;\n\n ArrayHelper.chunk<string>(unhydratedVideos, CHUNK_SIZE).forEach(chunk => {\n newRequests.push(VideoRequests.videoMixinAssocs(chunk, options.flightNamespace));\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(chunk, null, options.flightNamespace));\n });\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","items","data","length","reduce","acc","item","id","SCROLL_TOLERANCE","useInfiniteList","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","VideoHistoryRequests","userVideoHistory","success","error","always","url","formatData","historyCollection","historyData","lastTimeWatchedLocal","lastTimeWatched","lastDateWatchedLocal","lastDateWatched","pagination","videoHistory","ids","namespace","params","sort","i","join","normalizeOptions","watchHistory","videoId","lastProgressPoint","removeFromHistory","widgetId","type","invalidationKeys","WatchHistoryVideoList","hasPermissions","usePermissions","historyGroups","ArrayHelper","videoGroups","sortedDates","Object","keys","reverse","forEach","date","history","video","videos","find","v","filter","Boolean","sortedDatesGroupCount","dateCounts","currentDate","dateTotal","runningTotal","diff","DateHelper","Date","LanguageService","formatDate","VideoList","yearGroups","getVideoAppLink","VideoAppLinkHelper","getSubTextAppLink","SeriesAppLinkHelper","series","setFavourite","canFavourite","startingPositionIndex","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","imageCdnUrl","isPlugin","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getPhrase","WatchHistoryEmptyState","hasDiscover","value","EmptyState","src","ImageUrls","altText","Text","phrase","text","appLink","application","action","WatchHistoryPublicEmptyState","analyticsData","analyticsOptions","actionType","location","entity","workflowPhase","descriptor","SignUp","PartialWatchHistory","PartialVideoList","numVideos","WatchHistoryView","useSetPageMetadata","title","dispatch","alerts","hasLocalPermissions","useLiteFavourites","u","usePluginHelper","currentUser","UserRequests","videoActions","useVideoActions","isAuthenticated","CustomerRequests","customerId","config","ConfigRequests","getUserVideoHistoryRequest","shouldFetch","hasCompleted","pageNumber","httpStatus","videoIds","videosMap","VideoRequests","useVideoMixin","audiences","usePresentationAudiences","VideoActionsContext","PermissionName","redirectOnError","activePresentation","getFallbackPresentation","presentation","CHUNK_SIZE","objects","hydratedVideos","Set","Array","isArray","o","getValidObjects","setRequest","unhydratedVideos","current","has","push","add","r","newRequests","flightNamespace","Row","bsPrefix","Component","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}