@clickview/reports 0.87.0-rc.0 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/.vite/manifest.json +292 -292
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/3AogjH3v.chunk.js +2 -0
  5. package/dist/scripts/3AogjH3v.chunk.js.map +1 -0
  6. package/dist/scripts/{BYLD2f9R2.chunk.js → B01p94Dy2.chunk.js} +2 -2
  7. package/dist/scripts/{BYLD2f9R2.chunk.js.map → B01p94Dy2.chunk.js.map} +1 -1
  8. package/dist/scripts/{C7rNnvPs.chunk.js → BKWokslH.chunk.js} +2 -2
  9. package/dist/scripts/{C7rNnvPs.chunk.js.map → BKWokslH.chunk.js.map} +1 -1
  10. package/dist/scripts/{BQcTfbZm2.chunk.js → BSethuDj2.chunk.js} +2 -2
  11. package/dist/scripts/{BQcTfbZm2.chunk.js.map → BSethuDj2.chunk.js.map} +1 -1
  12. package/dist/scripts/{CkS0imTk2.chunk.js → BbbU3LZb2.chunk.js} +2 -2
  13. package/dist/scripts/{CkS0imTk2.chunk.js.map → BbbU3LZb2.chunk.js.map} +1 -1
  14. package/dist/scripts/{DPmS69Mt2.chunk.js → BfXnhpYV2.chunk.js} +2 -2
  15. package/dist/scripts/{DPmS69Mt2.chunk.js.map → BfXnhpYV2.chunk.js.map} +1 -1
  16. package/dist/scripts/{CKTy7NJ92.chunk.js → BnSmV6552.chunk.js} +2 -2
  17. package/dist/scripts/{CKTy7NJ92.chunk.js.map → BnSmV6552.chunk.js.map} +1 -1
  18. package/dist/scripts/BryHI-Z6.chunk.js +2 -0
  19. package/dist/scripts/BryHI-Z6.chunk.js.map +1 -0
  20. package/dist/scripts/{Bs_S7mFn2.chunk.js → C587wSvL2.chunk.js} +2 -2
  21. package/dist/scripts/{Bs_S7mFn2.chunk.js.map → C587wSvL2.chunk.js.map} +1 -1
  22. package/dist/scripts/{DldsJ3cq.chunk.js → CGfKmxkF.chunk.js} +2 -2
  23. package/dist/scripts/{DldsJ3cq.chunk.js.map → CGfKmxkF.chunk.js.map} +1 -1
  24. package/dist/scripts/{DkXQWig4.chunk.js → CPfbCh7G.chunk.js} +2 -2
  25. package/dist/scripts/{DkXQWig4.chunk.js.map → CPfbCh7G.chunk.js.map} +1 -1
  26. package/dist/scripts/{B_HlStqa2.chunk.js → CYTD62SM2.chunk.js} +2 -2
  27. package/dist/scripts/{B_HlStqa2.chunk.js.map → CYTD62SM2.chunk.js.map} +1 -1
  28. package/dist/scripts/{CllvFALa2.chunk.js → ChsDPjp62.chunk.js} +2 -2
  29. package/dist/scripts/{CllvFALa2.chunk.js.map → ChsDPjp62.chunk.js.map} +1 -1
  30. package/dist/scripts/{DxBCBFh3.chunk.js → Cje7C8bz.chunk.js} +2 -2
  31. package/dist/scripts/{DxBCBFh3.chunk.js.map → Cje7C8bz.chunk.js.map} +1 -1
  32. package/dist/scripts/{BLzQ085A.chunk.js → Co8fEkVu.chunk.js} +2 -2
  33. package/dist/scripts/{BLzQ085A.chunk.js.map → Co8fEkVu.chunk.js.map} +1 -1
  34. package/dist/scripts/{DuQ74iFu.chunk.js → CqU1GfrZ.chunk.js} +2 -2
  35. package/dist/scripts/{DuQ74iFu.chunk.js.map → CqU1GfrZ.chunk.js.map} +1 -1
  36. package/dist/scripts/{rdbFZIyT.chunk.js → CrnI3v9u.chunk.js} +2 -2
  37. package/dist/scripts/{rdbFZIyT.chunk.js.map → CrnI3v9u.chunk.js.map} +1 -1
  38. package/dist/scripts/{28JMpJbt.chunk.js → Cu1MGmFY.chunk.js} +2 -2
  39. package/dist/scripts/{28JMpJbt.chunk.js.map → Cu1MGmFY.chunk.js.map} +1 -1
  40. package/dist/scripts/{BbTaGrM02.chunk.js → CzP4rwtN2.chunk.js} +2 -2
  41. package/dist/scripts/{BbTaGrM02.chunk.js.map → CzP4rwtN2.chunk.js.map} +1 -1
  42. package/dist/scripts/{BxKrer6h.chunk.js → D0Qw5weM.chunk.js} +2 -2
  43. package/dist/scripts/{BxKrer6h.chunk.js.map → D0Qw5weM.chunk.js.map} +1 -1
  44. package/dist/scripts/{DK50VHUW2.chunk.js → D3xJ2nOi2.chunk.js} +2 -2
  45. package/dist/scripts/{DK50VHUW2.chunk.js.map → D3xJ2nOi2.chunk.js.map} +1 -1
  46. package/dist/scripts/{DFxl2xgU.chunk.js → DLvXDRHp.chunk.js} +2 -2
  47. package/dist/scripts/{DFxl2xgU.chunk.js.map → DLvXDRHp.chunk.js.map} +1 -1
  48. package/dist/scripts/{Bn4Go0UF.chunk.js → DPwC1loE.chunk.js} +2 -2
  49. package/dist/scripts/{Bn4Go0UF.chunk.js.map → DPwC1loE.chunk.js.map} +1 -1
  50. package/dist/scripts/{C1m-1G6w2.chunk.js → DROEKPMt2.chunk.js} +2 -2
  51. package/dist/scripts/{C1m-1G6w2.chunk.js.map → DROEKPMt2.chunk.js.map} +1 -1
  52. package/dist/scripts/{DfhaG70Z2.chunk.js → DfsBAns02.chunk.js} +2 -2
  53. package/dist/scripts/{DfhaG70Z2.chunk.js.map → DfsBAns02.chunk.js.map} +1 -1
  54. package/dist/scripts/{BOGodQXj2.chunk.js → DoqY7Zz22.chunk.js} +2 -2
  55. package/dist/scripts/{BOGodQXj2.chunk.js.map → DoqY7Zz22.chunk.js.map} +1 -1
  56. package/dist/scripts/{BQLCt3Ad.chunk.js → Ds5BQW36.chunk.js} +45 -45
  57. package/dist/scripts/Ds5BQW36.chunk.js.map +1 -0
  58. package/dist/scripts/DtHo-s19.chunk.js +1 -0
  59. package/dist/scripts/{WxjzAHzM.chunk.js → F0alulpY.chunk.js} +2 -2
  60. package/dist/scripts/{WxjzAHzM.chunk.js.map → F0alulpY.chunk.js.map} +1 -1
  61. package/dist/scripts/{yklF-2M1.chunk.js → GIKXvkU2.chunk.js} +2 -2
  62. package/dist/scripts/{yklF-2M1.chunk.js.map → GIKXvkU2.chunk.js.map} +1 -1
  63. package/dist/scripts/{Du87dvla.chunk.js → JKXdJyQp.chunk.js} +2 -2
  64. package/dist/scripts/{Du87dvla.chunk.js.map → JKXdJyQp.chunk.js.map} +1 -1
  65. package/dist/scripts/{CItOH7dg2.chunk.js → QGZBrJRg2.chunk.js} +2 -2
  66. package/dist/scripts/{CItOH7dg2.chunk.js.map → QGZBrJRg2.chunk.js.map} +1 -1
  67. package/dist/scripts/{SNiCkvSP.chunk.js → UxXRVBhL.chunk.js} +2 -2
  68. package/dist/scripts/{SNiCkvSP.chunk.js.map → UxXRVBhL.chunk.js.map} +1 -1
  69. package/dist/scripts/{rtCrJwRm.chunk.js → Z3CSanPV.chunk.js} +2 -2
  70. package/dist/scripts/{rtCrJwRm.chunk.js.map → Z3CSanPV.chunk.js.map} +1 -1
  71. package/dist/scripts/{app-BeoBow2q.js → app-CirLTvga.js} +6 -6
  72. package/dist/scripts/app-CirLTvga.js.map +1 -0
  73. package/dist/scripts/ieOSVilg.chunk.js +1 -0
  74. package/dist/scripts/{C2ZUZoNE2.chunk.js → msX5dXMR2.chunk.js} +2 -2
  75. package/dist/scripts/{C2ZUZoNE2.chunk.js.map → msX5dXMR2.chunk.js.map} +1 -1
  76. package/package.json +1 -1
  77. package/dist/scripts/BQLCt3Ad.chunk.js.map +0 -1
  78. package/dist/scripts/CZQnIbqt.chunk.js +0 -1
  79. package/dist/scripts/CfPosTww.chunk.js +0 -2
  80. package/dist/scripts/CfPosTww.chunk.js.map +0 -1
  81. package/dist/scripts/DVHj6R3-.chunk.js +0 -2
  82. package/dist/scripts/DVHj6R3-.chunk.js.map +0 -1
  83. package/dist/scripts/ao_3LgdP.chunk.js +0 -1
  84. package/dist/scripts/app-BeoBow2q.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{Gt as e,Kn as t,Nn as n,Pn as r,Rn as i,Vn as a,Vt as o,Wt as s,Yt as c,an as l,cn as u,in as d,zt as f}from"./BSV_W0cK.chunk.js";import{b as p}from"./DLiesDxa.chunk.js";import{t as m}from"./BDdd6NA7.chunk.js";import{n as h,t as g}from"./CNQKHXPY.chunk.js";import{n as _}from"./Bqlm3yF_.chunk.js";u();var v=class extends f{constructor(){super(),this.constructors={},this.destructors={},this.instances={},this.singletonInstances={},this.referenceCounts={}}get name(){return`InstanceManager`}static get Instance(){return this.instance||=new this}registerDataService(e,t){this.validateConstructor(e);let n=e.prototype.name;return this.referenceCounts[n]=0,this.constructors[n]=()=>new e({dataProvider:this.getInstance(t.dataProvider),cache:this.getInstance(t.cache),bootstrapData:t.bootstrapData,defaultErrorHandler:t.defaultErrorHandler,alertService:t.alertService}),this.destructors[n]=()=>{this.instances[n]?this.instances[n].destroy():c.throw(new s(`Trying to destroy a ${n} instance that has already been destroyed`)),this.releaseInstance(t.dataProvider),this.releaseInstance(t.cache)},this}registerInstance(e,t){this.validateConstructor(e);let n=e.prototype.name;return this.referenceCounts[n]=0,this.constructors[n]=()=>new e(t),this.destructors[n]=()=>a(this.instances[n].destroy)&&this.instances[n].destroy(),this}registerSingleton(e){let t=e.name;return this.singletonInstances[t]=e,this}getInstance(e,t){return this.singletonInstances[e]?this.singletonInstances[e]:(this.constructors[e]||c.throw(new s(`${e} was not registered with ${this.name}`)),this.referenceCounts[e]++,t&&this.listenTo(t,`destroy`,()=>this.releaseInstance(e)),this.instances[e]||(this.instances[e]=this.constructors[e]()),this.instances[e])}releaseInstance(e){if(this.instances[e])return window.setTimeout(()=>{this.referenceCounts[e]--,this.referenceCounts[e]<1&&(this.destructors[e](),delete this.instances[e])},0),this}validateConstructor(e){let t=e.prototype.name;t||c.throw(new s(`Classes registered with ${this.name} must have a unique name property.`)),this.constructors[t]&&c.throw(new s(`A class with the name: ${t} has already been registered with ${this.name}`))}}.Instance,y={LOCALE:`locale`,PHRASES:`phrases`,VERSION:`version`,TOKEN:`token`,PERMISSIONS:`permissions`,USER:`currentUser`,PRODUCTS:`products`},b={admin:async()=>(await g(async()=>{let{default:e}=await import(`./B751cs0L2.chunk.js`);return{default:e}},[])).default,teacher:async()=>(await g(async()=>{let{default:e}=await import(`./CAH8oCSg2.chunk.js`);return{default:e}},[])).default,freemium:async()=>(await g(async()=>{let{default:e}=await import(`./fVuTMtqg2.chunk.js`);return{default:e}},[])).default,streamable:async()=>(await g(async()=>{let{default:e}=await import(`./CgohO1KN2.chunk.js`);return{default:e}},[])).default,"cv-student":async()=>(await g(async()=>{let{default:e}=await import(`./BuUwj64o2.chunk.js`);return{default:e}},[])).default},x={currentUser(e,t){return{url:`/api/currentuser`,publicUrl:`/api/currentuser`,key:`currentuser`,normalizeOptions:{namespace:`currentuser`},bootstrapName:y.USER,success:e,error:t}},user(e,t,n){return{url:`{gateway}/v1/users/${e}`,key:`users:${e}`,success:t,error:n}},groups(e){return{url:`{gateway}/v1/objects/${e}/members?query=groups`,key:`users:${e}:groups`}},usersById(e,t,n){return{url:h.urlBuilder(`{gateway}/v1/users`,{id:e}),key:`users:list:${e.join(`,`)}`,success:t,error:n,formatData:t=>{let n=t.reduce((e,t)=>(e[t.id.toString()]=t,e),{});return e.map(e=>n[e.toString()])}}},getUserIdByQuery(e,t){return{url:`{gateway}/v1/users/ids?${e}`,key:`users:ids:${e}`,success:t}},workspace(e,t){return{url:`/api/domain/v2/me/workspace?query=categorytree`,key:`workspace`,success:e,error:t}},sendVerificationEmail(e,t,n,r){return{url:`/api/account/email`,key:`verify:email`,type:p.POST,data:{emailAddress:e},success:t,error:n,always:r,invalidationKeys:[`verify:email:status`]}},token(e,t){return{url:`/api/token`,key:`token`,bootstrapName:y.TOKEN,formatData:e=>typeof e.expiry!=`number`||e.expiry<=0||isNaN(e.expiry)?e:{value:e.value,localTTL:new Date().getTime()+e.expiry*1e3},success:e,error:t}},permissions(e,t){return{url:`{gateway}/v1/users/me/permissions`,publicUrl:`/api/permissions`,key:`permissions`,success:e,error:t,normalize:!1,formatData:e=>e.reduce((e,t)=>(e[t]=!0,e),{}),bootstrapName:y.PERMISSIONS}},_simulatedPermissions(e,t,n){return{url:`simulated:/v1/users/me/permissions/${e}`,key:`permissions`,success:t,error:n,normalize:!1,formatData:e=>e.reduce((e,t)=>(e[t]=!0,e),{}),successResponse:async()=>(await b[e]()).map(e=>e)}},customers(e){return{url:`{gateway}/v1/objects/${e}/customers`,key:`customers`}},accessPolicy(){return{url:`{gateway}/v1/users/me/access-policy`,key:`access:policy`}},updateJobTitle(e,t,n){return{url:`{gateway}/v1/customers/${t}/users/job-titles`,key:`update:${e}:job:title:${n}`,type:p.PUT,data:{customerId:t,users:[{userId:e,jobTitle:n}]},updateState:{keys:`users:${e}`,updateData:t=>{let r=t[`users:${e}`];return{...t,[`users:${e}`]:{...r,userProfile:{...r.userProfile,metadata:{...r.userProfile.metadata||{},jobTitle:n}}}}}}}},getById(e,t){let n=m.uniq(e);return n.sort(),{url:`{gateway}/v1/objects?query=${`avatar&${n.map(e=>`id=${e}`).join(`&`)}`}`,key:`users:by:id:${n.join(`,`)}`,error:t}},updateCurrentUser(e,t,n,r){return{url:`{gateway}/v1/users/me/info`,key:`edit:current:user`,type:p.PUT,data:e,invalidationKeys:[`search:aggregation`,`currentuser`],success:t,error:n,always:r}},updateUserJobTitle(e){return{url:`{gateway}/v1/users/me/profile`,key:`edit:current:user:role`,type:p.PUT,data:{jobTitle:e},invalidationKeys:[`search:aggregation`,`currentuser`,`users:`]}},getTeachingLevel(e,t){return{url:`{gateway}/v1/objects/${e}?query=userprofiles[teachinglevel]{customer.id:${t}}`,key:`get:teaching:level:user:${e}:${t}`,formatData:e=>e?.userProfiles?.data?.[0]?.teachingLevel??null}},setTeachingLevel(e){return{url:`{gateway}/v1/users/me/teaching-level`,key:`set:teaching:level`,type:p.PUT,data:{learningLevelId:e},invalidationKeys:[`get:teaching:level`]}}},S=t(l());u();var C=function(e){return e.Success=`success`,e.Warning=`warning`,e.Fail=`danger`,e.Info=`info`,e.Pending=`pending`,e}({}),w=function(e){return e.Success=`Success! 🙌`,e.Warning=`Whoops...`,e.Fail=`Oops...`,e.Info=`FYI`,e}({}),T=class extends f{constructor(e){super(e)}initialize(){this.alertCollection=new e,this.listenTo(d.ALERT,`remove:alert`,this.removeAlert),this.showAlerts()}get name(){return _.ALERT}get defaults(){return{maxAlerts:3}}showAlerts(){let e=S.default.channel(d.ALERT),t={collection:this.alertCollection};this.options.alertViewCtor&&(t=i({},t,{ctor:this.options.alertViewCtor})),e.trigger(`show:alert`,t)}removeAlert(e){this.alertCollection.remove(e),this.showAlerts()}createAlert(e){this.alertCollection.length===this.options.maxAlerts&&this.alertCollection.shift(),e.id||(e=i({},e,{id:this.generateUniqueAlertId()})),this.alertCollection.push(new o(e)),this.showAlerts()}clearAllAlerts(){this.alertCollection.reset(null)}success(e){return typeof e==`string`?n(()=>this.createAlert(i({},this.options.defaultSuccessAlert,{message:e})),this):e.useXHR?n((e,t)=>this.createAlert(i({},this.options.defaultSuccessAlert,{message:t})),this):n(()=>this.createAlert(i({},this.options.defaultSuccessAlert,e)),this)}error(e){return typeof e==`string`?n(()=>this.createAlert(i({},this.options.defaultErrorAlert,{message:e})),this):e.useXHR?n(e=>this.createAlert(i({},this.options.defaultErrorAlert,{message:e.message})),this):n(()=>this.createAlert(i({},this.options.defaultErrorAlertIL_DEFAULT,e)),this)}generateUniqueAlertId(){return r(`alert_`)}};export{y as a,x as i,T as n,v as o,w as r,C as t};
2
+ //# sourceMappingURL=3AogjH3v.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../libs/common/src/backbone/services/InstanceManager.ts","../../../../libs/shared/src/constants/BootstrapKeys.ts","../../../../libs/shared/src/flight-requests/UserRequests.ts","../../../../libs/common/src/backbone/services/BaseAlertService.ts"],"sourcesContent":["import { ObjectHash } from 'backbone';\nimport { MnObject } from 'backbone.marionette';\nimport * as _ from 'underscore';\n\nimport { ErrorHelper } from 'libs/common/backbone/core/BaseError';\nimport { BaseService } from 'libs/common/backbone/core/BaseService';\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { BaseDataService, BaseDataServiceOptions } from 'libs/common/backbone/services/BaseDataService';\n\nimport { BaseAlertService } from './BaseAlertService';\n\ninterface DataServiceConstructor {\n new (options: BaseDataServiceOptions): BaseDataService;\n}\n\ninterface DataServiceInstanceOptions {\n cache: string;\n dataProvider: string;\n bootstrapData?: ObjectHash;\n defaultErrorHandler?: (...args: any[]) => any;\n alertService: BaseAlertService;\n}\n\nclass StaticInstanceManager extends BaseService {\n private static instance: StaticInstanceManager;\n\n private constructors: {[name: string]: () => MnObject };\n private destructors: {[name: string]: () => void };\n private instances: {[name: string]: any };\n private singletonInstances: {[name: string]: any };\n private referenceCounts: {[name: string]: number };\n\n private constructor() {\n super();\n\n this.constructors = {};\n this.destructors = {};\n this.instances = {};\n this.singletonInstances = {};\n this.referenceCounts = {};\n }\n\n // @ts-ignore\n public get name(): string {\n return 'InstanceManager';\n }\n\n public static get Instance(): StaticInstanceManager {\n return this.instance || (this.instance = new this());\n }\n\n public registerDataService(ctor: DataServiceConstructor, options: DataServiceInstanceOptions): this {\n this.validateConstructor(ctor);\n\n const name = ctor.prototype.name;\n\n this.referenceCounts[name] = 0;\n this.constructors[name] = () => new ctor({\n dataProvider: this.getInstance(options.dataProvider),\n cache: this.getInstance(options.cache),\n bootstrapData: options.bootstrapData,\n defaultErrorHandler: options.defaultErrorHandler,\n alertService: options.alertService\n });\n this.destructors[name] = () => {\n if (this.instances[name])\n this.instances[name].destroy();\n else\n ErrorHelper.throw(new DevError(`Trying to destroy a ${name} instance that has already been destroyed`));\n\n this.releaseInstance(options.dataProvider);\n this.releaseInstance(options.cache);\n };\n\n return this;\n }\n\n public registerInstance<TInstanceOptions>(ctor: new(...args: any[]) => any, options?: TInstanceOptions): this {\n this.validateConstructor(ctor);\n\n const name = ctor.prototype.name;\n\n this.referenceCounts[name] = 0;\n this.constructors[name] = () => new ctor(options);\n this.destructors[name] = () => _.isFunction(this.instances[name].destroy) && this.instances[name].destroy();\n\n return this;\n }\n\n public registerSingleton(instance: any): this {\n const name = instance.name;\n\n this.singletonInstances[name] = instance;\n\n return this;\n }\n\n public getInstance<T>(name: string, owner?: Backbone.Events): T {\n if (this.singletonInstances[name])\n return this.singletonInstances[name];\n\n if (!this.constructors[name])\n ErrorHelper.throw(new DevError(`${name} was not registered with ${this.name}`));\n\n this.referenceCounts[name]++;\n\n if (owner)\n this.listenTo(owner, 'destroy', () => this.releaseInstance(name));\n\n if (!this.instances[name]) {\n this.instances[name] = this.constructors[name]();\n }\n\n return this.instances[name];\n }\n\n public releaseInstance(name: string): this {\n if (!this.instances[name])\n return;\n\n /**\n * In scenarios where an application redirects to another application\n * within one execution cycle, an instance may be initialized, used to fetch\n * data and disposed of, before the instance is requested again, which will leave\n * a hanging open fetch request.\n *\n * By wrapping the below in a setTimeout we ensure any instance clean up\n * will always happen at the end of any execution cycle.\n */\n window.setTimeout(() => {\n this.referenceCounts[name]--;\n\n if (this.referenceCounts[name] < 1) {\n this.destructors[name]();\n delete this.instances[name];\n }\n }, 0);\n\n return this;\n }\n\n private validateConstructor(ctor: new(...args: any[]) => any): void {\n const name = ctor.prototype.name;\n\n if (!name)\n ErrorHelper.throw(new DevError(`Classes registered with ${this.name} must have a unique name property.`));\n\n if (this.constructors[name]) {\n ErrorHelper.throw(\n new DevError(`A class with the name: ${name} has already been registered with ${this.name}`)\n );\n }\n }\n}\n\nexport const InstanceManager = StaticInstanceManager.Instance;\n","const BootstrapKeys = {\n LOCALE: 'locale',\n PHRASES: 'phrases',\n VERSION: 'version',\n TOKEN: 'token',\n PERMISSIONS: 'permissions',\n USER: 'currentUser',\n PRODUCTS: 'products'\n};\n\nexport { BootstrapKeys };\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { EditCurrentUserDetails } from 'libs/shared/apps/user-manager/interfaces/EditCurrentUserDetails';\nimport { BootstrapKeys } from 'libs/shared/constants/BootstrapKeys';\nimport { PermissionName, PermissionsLookup } from 'libs/shared/enums/PermissionName';\nimport { CurrentUser, LearningLevel, User } from 'libs/shared/interfaces';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\n\nexport type SimulatedPermissionsPreset = 'admin' | 'teacher' | 'freemium' | 'streamable' | 'cv-student';\n\nexport const SIMULATED_PERMISSIONS_MAP: Record<SimulatedPermissionsPreset, () => Promise<string[]>> = {\n 'admin': async () => (await import('./simulated/permissions/admin.json')).default,\n 'teacher': async () => (await import('./simulated/permissions/teacher.json')).default,\n 'freemium': async () => (await import('./simulated/permissions/freemium.json')).default,\n 'streamable': async () => (await import('./simulated/permissions/streamable.json')).default,\n 'cv-student': async () => (await import('./simulated/permissions/cv-student.json')).default\n};\n\nexport const UserRequests = {\n currentUser(success?: (user: CurrentUser) => void, error?: (xhr?: Xhr) => void): Flight.PublicRequest {\n return {\n url: '/api/currentuser',\n publicUrl: '/api/currentuser',\n key: 'currentuser',\n normalizeOptions: {\n namespace: 'currentuser'\n },\n bootstrapName: BootstrapKeys.USER,\n success,\n error\n };\n },\n\n user(id: string, success?: (user: User) => void, error?: (xhr?: Xhr) => void): Flight.Request {\n return {\n url: `{gateway}/v1/users/${id}`,\n // If you update this key, please also update the key in the `updateJobTitle` request\n key: `users:${id}`,\n success,\n error\n };\n },\n\n groups(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/members?query=groups`,\n key: `users:${id}:groups`\n };\n },\n\n usersById(userIds: string[], success?: (users: User[]) => void, error?: (xhr?: Xhr) => void): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users', { id: userIds }),\n key: `users:list:${userIds.join(',')}`,\n success,\n error,\n formatData: (users: User[]) => {\n /**\n * It's not guarenteed that the users will be returned in the same order they are requested,\n * so we map them back to the request order here.\n */\n const userMap = users.reduce((prev: HashObject, curr) => {\n prev[curr.id.toString()] = curr;\n return prev;\n }, {});\n\n return userIds.map(userId => {\n return userMap[userId.toString()];\n });\n }\n };\n },\n\n getUserIdByQuery(\n query: string,\n success?: (ids: string[]) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/users/ids?${query}`,\n key: `users:ids:${query}`,\n success\n };\n },\n \n workspace(success?: (workspace: HashObject) => void, error?: () => void): Flight.Request {\n return {\n url: '/api/domain/v2/me/workspace?query=categorytree',\n key: 'workspace',\n success,\n error\n };\n },\n\n sendVerificationEmail(\n emailAddress: string,\n success: () => void,\n error: () => void,\n always: () => void\n ): Flight.Request {\n return {\n url: '/api/account/email',\n key: 'verify:email',\n type: HttpVerbs.POST,\n data: { emailAddress },\n success,\n error,\n always,\n invalidationKeys: ['verify:email:status']\n };\n },\n\n /**\n * This shared request makes calls directly to each consuming project (i.e. there's a \n * dedicated endpoint in both Lite and Analytics C#). When using this request, ensure that you \n * check the token response from your respective project. In future, we'll look to shift the\n * token out of the frontend, in the interim, if you need to modify this, please ensure\n * you consider the implication on Lite (which requires the localTTL) - Mike\n */\n token(success?: (token: HashObject) => void, error?: (xhr: Xhr) => void): Flight.Request {\n return {\n url: '/api/token',\n key: 'token',\n bootstrapName: BootstrapKeys.TOKEN,\n formatData: (data: HashObject): AuthToken => {\n /**\n * Where the server doesn't return a token expiry offset we'll continue to use\n * the token's value as is.\n */\n if (typeof data.expiry !== 'number' || data.expiry <= 0 || isNaN(data.expiry))\n return data as AuthToken;\n\n /**\n * Where the server does provide a token expiry offset, we'll compute and store the TTL\n * against the client's local clock. This will be subsquently checked to determine\n * when we'll need to request a refreshed token. See AuthTokenHelper.ts for further details.\n */\n return {\n value: data.value,\n // Convert token expiry from seconds to millseconds\n localTTL: new Date().getTime() + (data.expiry * 1000)\n };\n },\n success,\n error\n };\n },\n\n permissions(success?: (permissions: PermissionsLookup) => void, error?: () => void): Flight.PublicRequest {\n return {\n url: '{gateway}/v1/users/me/permissions',\n publicUrl: '/api/permissions',\n key: 'permissions',\n success,\n error,\n normalize: false,\n formatData: (data: PermissionName[]) =>\n data.reduce((acc: PermissionsLookup, permission) => {\n acc[permission] = true;\n return acc;\n }, {} as PermissionsLookup),\n bootstrapName: BootstrapKeys.PERMISSIONS\n };\n },\n\n _simulatedPermissions(\n preset: SimulatedPermissionsPreset,\n success?: (permissions: PermissionsLookup) => void,\n error?: () => void\n ): Flight.SimulatedRequest {\n return {\n url: `simulated:/v1/users/me/permissions/${preset}`,\n key: 'permissions',\n success,\n error,\n normalize: false,\n formatData: (data: PermissionName[]) =>\n data.reduce((acc: PermissionsLookup, p) => {\n acc[p] = true;\n return acc;\n }, {} as PermissionsLookup),\n successResponse: async () => {\n const permissions = await SIMULATED_PERMISSIONS_MAP[preset]();\n return permissions.map(p => p as PermissionName);\n }\n };\n },\n\n customers(userId: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${userId}/customers`,\n key: 'customers'\n };\n },\n\n /**\n * Please don't use this unless it's to send the current user's\n * access policy to collection API - Sha\n * https://i.imgur.com/u2DjLsC.png\n */\n accessPolicy(): Flight.Request {\n return {\n url: '{gateway}/v1/users/me/access-policy',\n key: 'access:policy'\n };\n },\n\n updateJobTitle(id: string, customerId: string, jobTitle: string): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/users/job-titles`,\n key: `update:${id}:job:title:${jobTitle}`,\n type: HttpVerbs.PUT,\n data: {\n customerId,\n users: [{\n userId: id,\n jobTitle\n }]\n },\n updateState: {\n keys: `users:${id}`,\n updateData: (state: any) => {\n const user = state[`users:${id}`];\n\n return {\n ...state,\n [`users:${id}`]: {\n ...user,\n userProfile: {\n ...user.userProfile,\n metadata: {\n ...(user.userProfile.metadata || {}),\n jobTitle\n }\n }\n }\n };\n }\n }\n };\n },\n \n getById(ids: string[], error?: (xhr: Xhr) => void): Flight.Request {\n const uniqIds = ArrayHelper.uniq(ids);\n uniqIds.sort();\n \n const query = `avatar&${uniqIds.map(id => `id=${id}`).join('&')}`;\n\n return {\n url: `{gateway}/v1/objects?query=${query}`,\n key: `users:by:id:${uniqIds.join(',')}`,\n error\n };\n },\n\n updateCurrentUser(\n details: EditCurrentUserDetails,\n success?: (updatedUser?: User) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/users/me/info',\n key: 'edit:current:user',\n type: HttpVerbs.PUT,\n data: details,\n invalidationKeys: [ 'search:aggregation', 'currentuser' ],\n success,\n error,\n always\n };\n },\n\n updateUserJobTitle(\n role: string\n ): Flight.Request {\n return {\n url: '{gateway}/v1/users/me/profile',\n key: 'edit:current:user:role',\n type: HttpVerbs.PUT,\n data: { jobTitle: role },\n // 'users:' matches `users:${id}` via the regex matcher in StateHelper.getMatchingKeyMap,\n // so per-id user caches drop their stale jobTitle along with `currentuser`.\n invalidationKeys: [ 'search:aggregation', 'currentuser', 'users:' ]\n };\n },\n\n getTeachingLevel(userId: string, customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${userId}?query=userprofiles[teachinglevel]{customer.id:${customerId}}`,\n key: `get:teaching:level:user:${userId}:${customerId}`,\n formatData: (user: User): LearningLevel | null => user?.userProfiles?.data?.[0]?.teachingLevel ?? null\n };\n },\n\n setTeachingLevel(learningLevelId: string): Flight.Request {\n return {\n url: '{gateway}/v1/users/me/teaching-level',\n key: 'set:teaching:level',\n type: HttpVerbs.PUT,\n data: { learningLevelId },\n invalidationKeys: ['get:teaching:level']\n };\n }\n};\n","import * as React from 'react';\nimport { ObjectHash } from 'backbone';\nimport Radio from 'backbone.radio';\nimport * as _ from 'underscore';\n\nimport { CommonChannels } from 'libs/common/backbone/constants/CommonChannels';\nimport { CommonServices } from 'libs/common/backbone/constants/CommonServices';\nimport { AppLink } from 'libs/common/backbone/core/AppLink';\nimport { BaseCollection } from 'libs/common/backbone/core/BaseCollection';\nimport { BaseCollectionView } from 'libs/common/backbone/core/BaseCollectionView';\nimport { BaseModel } from 'libs/common/backbone/core/BaseModel';\nimport { BaseService, BaseServiceOptions } from 'libs/common/backbone/core/BaseService';\nimport { BaseView } from 'libs/common/backbone/core/BaseView';\nimport { BaseComponent } from 'libs/common/backbone/core/BaseView';\nimport { ViewCtor } from 'libs/common/backbone/core/Types';\nimport { DataServiceError } from 'libs/common/backbone/interfaces/DataServiceError';\n\nexport enum AlertType {\n Success = 'success',\n Warning = 'warning',\n Fail = 'danger',\n Info = 'info',\n Pending = 'pending'\n}\n\nexport enum DefaultAlertHeading {\n Success = 'Success! 🙌',\n Warning = 'Whoops...',\n Fail = 'Oops...',\n Info = 'FYI'\n}\n\nexport interface BaseAlert {\n id?: string;\n type: AlertType;\n heading: string;\n message?: string;\n appLink?: AppLink;\n appLinkText?: string;\n appLinkClassName?: string;\n extLink?: string;\n extLinkText?: string;\n extLinkClassName?: string;\n timeout?: number;\n}\n\nexport interface DefaultAlertCallback {\n (message?: string, options?: ObjectHash): void;\n}\n\nexport interface BaseAlertOptions {\n useXHR: boolean;\n}\n\ntype View = BaseView | BaseCollectionView | BaseComponent;\n\ninterface AlertProps {\n alerts: BaseAlert[];\n removeAlert: (id: string) => void;\n}\n\nexport interface BaseAlertServiceOptions extends BaseServiceOptions {\n maxAlerts?: number;\n defaultSuccessAlert: BaseAlert;\n defaultErrorAlert: BaseAlert;\n alertViewCtor?: ViewCtor<View> | ((props: AlertProps) => React.ReactElement);\n}\n\nexport class BaseAlertService extends BaseService {\n declare protected options: BaseAlertServiceOptions;\n private alertCollection: BaseCollection;\n\n public constructor(options: BaseAlertServiceOptions) {\n super(options);\n }\n\n public initialize(): void {\n this.alertCollection = new BaseCollection();\n\n this.listenTo(CommonChannels.ALERT, 'remove:alert', this.removeAlert);\n\n this.showAlerts();\n }\n\n // @ts-ignore\n public get name(): string {\n return CommonServices.ALERT;\n }\n\n // @ts-ignore\n public get defaults(): ObjectHash {\n return {\n maxAlerts: 3\n };\n }\n\n /**\n * As it's not known which application is currently in scope,\n * we emit a render event to construct the alert collection view\n * if required. If the current application already has a alert\n * view rendered, it will simply be ignored.\n */\n private showAlerts(): void {\n const channel = Radio.channel(CommonChannels.ALERT);\n\n let options = { collection: this.alertCollection };\n\n if (this.options.alertViewCtor)\n options = _.extend({}, options, { ctor: this.options.alertViewCtor });\n\n channel.trigger('show:alert', options);\n }\n\n public removeAlert(id: string): void {\n this.alertCollection.remove(id);\n\n this.showAlerts();\n }\n\n public createAlert(alertData: BaseAlert): void {\n if (this.alertCollection.length === this.options.maxAlerts)\n this.alertCollection.shift();\n\n if (!alertData.id)\n alertData = _.extend({}, alertData, { id: this.generateUniqueAlertId() });\n\n this.alertCollection.push(new BaseModel(alertData));\n\n this.showAlerts();\n }\n\n public clearAllAlerts(): void {\n this.alertCollection.reset(null);\n }\n\n public success(successAlert: string | BaseAlert | BaseAlertOptions): DefaultAlertCallback {\n // Construct alert object from string\n if (typeof successAlert === 'string')\n return _.bind(() =>\n this.createAlert(_.extend({}, this.options.defaultSuccessAlert, { message: successAlert })), this);\n\n // Construct alert object from our XHR response\n if ((successAlert as BaseAlertOptions).useXHR) {\n return _.bind((data: any, textStatus: any) =>\n this.createAlert(_.extend({}, this.options.defaultSuccessAlert, { message: textStatus })), this);\n }\n\n // Use alert passed as an argument \n return _.bind(() => this.createAlert(_.extend({}, this.options.defaultSuccessAlert, successAlert)), this);\n }\n\n public error(errorAlert: string | BaseAlert | BaseAlertOptions): DefaultAlertCallback {\n // Construct alert object from string\n if (typeof errorAlert === 'string')\n return _.bind(() =>\n this.createAlert(_.extend({}, this.options.defaultErrorAlert, { message: errorAlert })), this);\n\n // Construct alert object from our XHR response\n if ((errorAlert as BaseAlertOptions).useXHR) {\n return _.bind((error: DataServiceError) =>\n this.createAlert(_.extend({}, this.options.defaultErrorAlert, { message: error.message })), this);\n }\n\n // Use alert passed as an argument \n return _.bind(() => this.createAlert(_.extend({}, this.options.defaultErrorAlertIL_DEFAULT, errorAlert)), this);\n }\n\n private generateUniqueAlertId(): string {\n return _.uniqueId('alert_');\n }\n}\n"],"file":"3AogjH3v.chunk.js"}
@@ -1,2 +1,2 @@
1
- import{Kn as e,st as t}from"./BSV_W0cK.chunk.js";import{n}from"./CNQKHXPY.chunk.js";import{t as r}from"./BOGodQXj2.chunk.js";var i=e(t(),1),a=new Map,o=new WeakMap,s=0,c=void 0;function l(e){return e?o.has(e)?o.get(e):(s+=1,o.set(e,s.toString()),o.get(e)):`0`}function u(e){return Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${t}_${t===`root`?l(e.root):e[t]}`).toString()}function d(e){let t=u(e),n=a.get(t);if(!n){let r=new Map,i,o=new IntersectionObserver(t=>{t.forEach(t=>{var n;let a=t.isIntersecting&&i.some(e=>t.intersectionRatio>=e);e.trackVisibility&&t.isVisible===void 0&&(t.isVisible=a),(n=r.get(t.target))==null||n.forEach(e=>{e(a,t)})})},e);i=o.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),n={id:t,observer:o,elements:r},a.set(t,n)}return n}function f(e,t,n={},r=c){if(window.IntersectionObserver===void 0&&r!==void 0){let i=e.getBoundingClientRect();return t(r,{isIntersecting:r,target:e,intersectionRatio:typeof n.threshold==`number`?n.threshold:0,time:0,boundingClientRect:i,intersectionRect:i,rootBounds:i}),()=>{}}let{id:i,observer:o,elements:s}=d(n),l=s.get(e)||[];return s.has(e)||s.set(e,l),l.push(t),o.observe(e),function(){l.splice(l.indexOf(t),1),l.length===0&&(s.delete(e),o.unobserve(e)),s.size===0&&(o.disconnect(),a.delete(i))}}function p({threshold:e,delay:t,trackVisibility:n,rootMargin:r,root:a,triggerOnce:o,skip:s,initialInView:c,fallbackInView:l,onChange:u}={}){let[d,p]=i.useState(null),m=i.useRef(),[h,g]=i.useState({inView:!!c,entry:void 0});m.current=u,i.useEffect(()=>{if(s||!d)return;let i;return i=f(d,(e,t)=>{g({inView:e,entry:t}),m.current&&m.current(e,t),t.isIntersecting&&o&&i&&(i(),i=void 0)},{root:a,rootMargin:r,threshold:e,trackVisibility:n,delay:t},l),()=>{i&&i()}},[Array.isArray(e)?e.toString():e,d,a,r,o,s,n,l,t]);let _=h.entry?.target,v=i.useRef();!d&&_&&!o&&!s&&v.current!==_&&(v.current=_,g({inView:!!c,entry:void 0}));let y=[p,h.inView,h.entry];return y.ref=y[0],y.inView=y[1],y.entry=y[2],y}function m(e){let{userId:t,customerId:n,...r}=e;return{...r,uid:t,cid:n}}var h={aggregation(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${e}`,m(t)),key:r(`video:views:v2:aggregation`,t,e),normalize:!1}},videoAggregation(e,t,i){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/${t}`,m(i)),key:r(`video:views:v2:aggregation:${e}`,i,t),normalize:!1}},aggregationChart(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${e}/chart`,m(t)),key:r(`video:views:v2:aggregation:chart`,t,e),normalize:!1}},videoAggregationChart(e,t,i){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/${t}/chart`,m(i)),key:r(`video:views:v2:aggregation:chart:${e}`,i,t),normalize:!1}},topStreams(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/top`,{...m(t),limit:e}),key:r(`video:views:v2:top:streams:${e}`,t),normalize:!1}},videoHeatMap(e,t,i){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/heat-map`,{...m(t),cursor:i}),key:r(`video:views:v2:heatmap:${e}`,t,i),normalize:!1}},videoHeatMapAggregation(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/heat-map`,m(t)),key:r(`video:views:v2:aggregation:heatmap:${e}`,t),normalize:!1}}};export{p as n,h as t};
2
- //# sourceMappingURL=BYLD2f9R2.chunk.js.map
1
+ import{Kn as e,st as t}from"./BSV_W0cK.chunk.js";import{n}from"./CNQKHXPY.chunk.js";import{t as r}from"./DoqY7Zz22.chunk.js";var i=e(t(),1),a=new Map,o=new WeakMap,s=0,c=void 0;function l(e){return e?o.has(e)?o.get(e):(s+=1,o.set(e,s.toString()),o.get(e)):`0`}function u(e){return Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${t}_${t===`root`?l(e.root):e[t]}`).toString()}function d(e){let t=u(e),n=a.get(t);if(!n){let r=new Map,i,o=new IntersectionObserver(t=>{t.forEach(t=>{var n;let a=t.isIntersecting&&i.some(e=>t.intersectionRatio>=e);e.trackVisibility&&t.isVisible===void 0&&(t.isVisible=a),(n=r.get(t.target))==null||n.forEach(e=>{e(a,t)})})},e);i=o.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),n={id:t,observer:o,elements:r},a.set(t,n)}return n}function f(e,t,n={},r=c){if(window.IntersectionObserver===void 0&&r!==void 0){let i=e.getBoundingClientRect();return t(r,{isIntersecting:r,target:e,intersectionRatio:typeof n.threshold==`number`?n.threshold:0,time:0,boundingClientRect:i,intersectionRect:i,rootBounds:i}),()=>{}}let{id:i,observer:o,elements:s}=d(n),l=s.get(e)||[];return s.has(e)||s.set(e,l),l.push(t),o.observe(e),function(){l.splice(l.indexOf(t),1),l.length===0&&(s.delete(e),o.unobserve(e)),s.size===0&&(o.disconnect(),a.delete(i))}}function p({threshold:e,delay:t,trackVisibility:n,rootMargin:r,root:a,triggerOnce:o,skip:s,initialInView:c,fallbackInView:l,onChange:u}={}){let[d,p]=i.useState(null),m=i.useRef(),[h,g]=i.useState({inView:!!c,entry:void 0});m.current=u,i.useEffect(()=>{if(s||!d)return;let i;return i=f(d,(e,t)=>{g({inView:e,entry:t}),m.current&&m.current(e,t),t.isIntersecting&&o&&i&&(i(),i=void 0)},{root:a,rootMargin:r,threshold:e,trackVisibility:n,delay:t},l),()=>{i&&i()}},[Array.isArray(e)?e.toString():e,d,a,r,o,s,n,l,t]);let _=h.entry?.target,v=i.useRef();!d&&_&&!o&&!s&&v.current!==_&&(v.current=_,g({inView:!!c,entry:void 0}));let y=[p,h.inView,h.entry];return y.ref=y[0],y.inView=y[1],y.entry=y[2],y}function m(e){let{userId:t,customerId:n,...r}=e;return{...r,uid:t,cid:n}}var h={aggregation(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${e}`,m(t)),key:r(`video:views:v2:aggregation`,t,e),normalize:!1}},videoAggregation(e,t,i){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/${t}`,m(i)),key:r(`video:views:v2:aggregation:${e}`,i,t),normalize:!1}},aggregationChart(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${e}/chart`,m(t)),key:r(`video:views:v2:aggregation:chart`,t,e),normalize:!1}},videoAggregationChart(e,t,i){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/${t}/chart`,m(i)),key:r(`video:views:v2:aggregation:chart:${e}`,i,t),normalize:!1}},topStreams(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/top`,{...m(t),limit:e}),key:r(`video:views:v2:top:streams:${e}`,t),normalize:!1}},videoHeatMap(e,t,i){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/heat-map`,{...m(t),cursor:i}),key:r(`video:views:v2:heatmap:${e}`,t,i),normalize:!1}},videoHeatMapAggregation(e,t){return{url:n.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/heat-map`,m(t)),key:r(`video:views:v2:aggregation:heatmap:${e}`,t),normalize:!1}}};export{p as n,h as t};
2
+ //# sourceMappingURL=B01p94Dy2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BYLD2f9R2.chunk.js","names":[],"sources":["../../../../../node_modules/react-intersection-observer/index.mjs","../../src/shared/flight-requests/VideoViewsV2Requests.ts"],"sourcesContent":["\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root)\n return \"0\";\n if (RootIds.has(root))\n return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip)\n return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef();\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref)\n return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current)\n callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef();\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\n/**\n * Becasue the V2 endpoints take the user context,\n * userId and customerId cannot be used for these values so instead\n * we are using uid and cid - sha\n */\nfunction formatFilter(filter: AnalyticsRequestFilter) {\n const { userId, customerId, ...rest } = filter;\n return { ...rest, uid: userId, cid: customerId };\n}\n\nexport const VideoViewsV2Requests = {\n aggregation(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation', filter, type),\n normalize: false\n };\n },\n\n videoAggregation(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n aggregationChart(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation:chart', filter, type),\n normalize: false\n };\n },\n\n videoAggregationChart(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:chart:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n topStreams(limit: number, filter: AnalyticsRequestFilter): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/top`, { ...formatFilter(filter), limit }),\n key: getAnalyticsRequestKey(`video:views:v2:top:streams:${limit}`, filter),\n normalize: false\n };\n },\n\n videoHeatMap(\n videoId: string,\n filter: AnalyticsRequestFilter,\n cursor?: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/heat-map`, { ...formatFilter(filter), cursor }),\n key: getAnalyticsRequestKey(`video:views:v2:heatmap:${videoId}`, filter, cursor),\n normalize: false\n };\n },\n\n videoHeatMapAggregation(\n videoId: string,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/heat-map`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:heatmap:${videoId}`, filter),\n normalize: false\n };\n }\n};\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"B01p94Dy2.chunk.js","names":[],"sources":["../../../../../node_modules/react-intersection-observer/index.mjs","../../src/shared/flight-requests/VideoViewsV2Requests.ts"],"sourcesContent":["\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root)\n return \"0\";\n if (RootIds.has(root))\n return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip)\n return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef();\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref)\n return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current)\n callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef();\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\n/**\n * Becasue the V2 endpoints take the user context,\n * userId and customerId cannot be used for these values so instead\n * we are using uid and cid - sha\n */\nfunction formatFilter(filter: AnalyticsRequestFilter) {\n const { userId, customerId, ...rest } = filter;\n return { ...rest, uid: userId, cid: customerId };\n}\n\nexport const VideoViewsV2Requests = {\n aggregation(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation', filter, type),\n normalize: false\n };\n },\n\n videoAggregation(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n aggregationChart(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation:chart', filter, type),\n normalize: false\n };\n },\n\n videoAggregationChart(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:chart:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n topStreams(limit: number, filter: AnalyticsRequestFilter): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/top`, { ...formatFilter(filter), limit }),\n key: getAnalyticsRequestKey(`video:views:v2:top:streams:${limit}`, filter),\n normalize: false\n };\n },\n\n videoHeatMap(\n videoId: string,\n filter: AnalyticsRequestFilter,\n cursor?: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/heat-map`, { ...formatFilter(filter), cursor }),\n key: getAnalyticsRequestKey(`video:views:v2:heatmap:${videoId}`, filter, cursor),\n normalize: false\n };\n },\n\n videoHeatMapAggregation(\n videoId: string,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/heat-map`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:heatmap:${videoId}`, filter),\n normalize: false\n };\n }\n};\n"],"x_google_ignoreList":[0],"mappings":"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"}