@clickview/reports 0.90.0-rc.3 → 0.90.0-rc.4

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 (65) hide show
  1. package/dist/.vite/manifest.json +210 -210
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/{Bzx4bLV8.chunk.js → B9syewbL.chunk.js} +2 -2
  5. package/dist/scripts/{Bzx4bLV8.chunk.js.map → B9syewbL.chunk.js.map} +1 -1
  6. package/dist/scripts/{D2gRMPGY.chunk.js → BDLgF915.chunk.js} +2 -2
  7. package/dist/scripts/{D2gRMPGY.chunk.js.map → BDLgF915.chunk.js.map} +1 -1
  8. package/dist/scripts/{BJOOjdj2.chunk.js → BHwx99h9.chunk.js} +2 -2
  9. package/dist/scripts/{BJOOjdj2.chunk.js.map → BHwx99h9.chunk.js.map} +1 -1
  10. package/dist/scripts/{CowQEpZQ2.chunk.js → B_QHbZ3D2.chunk.js} +2 -2
  11. package/dist/scripts/{CowQEpZQ2.chunk.js.map → B_QHbZ3D2.chunk.js.map} +1 -1
  12. package/dist/scripts/{TzLygaBE.chunk.js → BcjF3S7y.chunk.js} +2 -2
  13. package/dist/scripts/{TzLygaBE.chunk.js.map → BcjF3S7y.chunk.js.map} +1 -1
  14. package/dist/scripts/{DbSzdDBS2.chunk.js → C5nG9HKq2.chunk.js} +2 -2
  15. package/dist/scripts/{DbSzdDBS2.chunk.js.map → C5nG9HKq2.chunk.js.map} +1 -1
  16. package/dist/scripts/{4ViYfbV7.chunk.js → CCdxPE8F.chunk.js} +2 -2
  17. package/dist/scripts/{4ViYfbV7.chunk.js.map → CCdxPE8F.chunk.js.map} +1 -1
  18. package/dist/scripts/{Dj87pb142.chunk.js → CDx9_B5h2.chunk.js} +2 -2
  19. package/dist/scripts/{Dj87pb142.chunk.js.map → CDx9_B5h2.chunk.js.map} +1 -1
  20. package/dist/scripts/{DDS7ndOq2.chunk.js → CEM-Xsc32.chunk.js} +2 -2
  21. package/dist/scripts/{DDS7ndOq2.chunk.js.map → CEM-Xsc32.chunk.js.map} +1 -1
  22. package/dist/scripts/{PSwC3iEf2.chunk.js → CGYMpd9x2.chunk.js} +2 -2
  23. package/dist/scripts/{PSwC3iEf2.chunk.js.map → CGYMpd9x2.chunk.js.map} +1 -1
  24. package/dist/scripts/{CitsW6ql.chunk.js → CLDXLTBe.chunk.js} +2 -2
  25. package/dist/scripts/{CitsW6ql.chunk.js.map → CLDXLTBe.chunk.js.map} +1 -1
  26. package/dist/scripts/{BL1X9vs52.chunk.js → CWVwHN-C2.chunk.js} +2 -2
  27. package/dist/scripts/{BL1X9vs52.chunk.js.map → CWVwHN-C2.chunk.js.map} +1 -1
  28. package/dist/scripts/{kAYY_iVY2.chunk.js → CXyHtApp2.chunk.js} +2 -2
  29. package/dist/scripts/{kAYY_iVY2.chunk.js.map → CXyHtApp2.chunk.js.map} +1 -1
  30. package/dist/scripts/{BU8DxGLM2.chunk.js → C_gBUP2y2.chunk.js} +2 -2
  31. package/dist/scripts/{BU8DxGLM2.chunk.js.map → C_gBUP2y2.chunk.js.map} +1 -1
  32. package/dist/scripts/{BXWs2cI72.chunk.js → C_nTmCTH2.chunk.js} +2 -2
  33. package/dist/scripts/{BXWs2cI72.chunk.js.map → C_nTmCTH2.chunk.js.map} +1 -1
  34. package/dist/scripts/{DPJbiCR02.chunk.js → CeSe3AP62.chunk.js} +18 -18
  35. package/dist/scripts/CeSe3AP62.chunk.js.map +1 -0
  36. package/dist/scripts/{fh6sbun-.chunk.js → Cv7tjWWS.chunk.js} +2 -2
  37. package/dist/scripts/{fh6sbun-.chunk.js.map → Cv7tjWWS.chunk.js.map} +1 -1
  38. package/dist/scripts/{BLzRzOyq.chunk.js → D63nJT6V.chunk.js} +2 -2
  39. package/dist/scripts/{BLzRzOyq.chunk.js.map → D63nJT6V.chunk.js.map} +1 -1
  40. package/dist/scripts/{Ch4Y5yk4.chunk.js → DATsYYMP.chunk.js} +2 -2
  41. package/dist/scripts/{Ch4Y5yk4.chunk.js.map → DATsYYMP.chunk.js.map} +1 -1
  42. package/dist/scripts/{DNY9inGn2.chunk.js → DBpZNnAI2.chunk.js} +2 -2
  43. package/dist/scripts/{DNY9inGn2.chunk.js.map → DBpZNnAI2.chunk.js.map} +1 -1
  44. package/dist/scripts/{CKKR2-wU2.chunk.js → DGuSwgQf2.chunk.js} +2 -2
  45. package/dist/scripts/{CKKR2-wU2.chunk.js.map → DGuSwgQf2.chunk.js.map} +1 -1
  46. package/dist/scripts/{DWQdiwUw.chunk.js → DHz5C_j8.chunk.js} +2 -2
  47. package/dist/scripts/{DWQdiwUw.chunk.js.map → DHz5C_j8.chunk.js.map} +1 -1
  48. package/dist/scripts/{4mtEyuqT2.chunk.js → DJpo4rMq2.chunk.js} +2 -2
  49. package/dist/scripts/{4mtEyuqT2.chunk.js.map → DJpo4rMq2.chunk.js.map} +1 -1
  50. package/dist/scripts/{EvtCZWZL2.chunk.js → DKgzSSZ12.chunk.js} +2 -2
  51. package/dist/scripts/{EvtCZWZL2.chunk.js.map → DKgzSSZ12.chunk.js.map} +1 -1
  52. package/dist/scripts/{Bl13dT192.chunk.js → DqX2L2fn2.chunk.js} +2 -2
  53. package/dist/scripts/{Bl13dT192.chunk.js.map → DqX2L2fn2.chunk.js.map} +1 -1
  54. package/dist/scripts/{7M6FzdyD.chunk.js → J0H9O8cX.chunk.js} +2 -2
  55. package/dist/scripts/{7M6FzdyD.chunk.js.map → J0H9O8cX.chunk.js.map} +1 -1
  56. package/dist/scripts/{app-B1NVV4PT.js → app-F8o5al1q.js} +3 -3
  57. package/dist/scripts/{app-B1NVV4PT.js.map → app-F8o5al1q.js.map} +1 -1
  58. package/dist/scripts/{CcjJpEaF2.chunk.js → med1nnv82.chunk.js} +2 -2
  59. package/dist/scripts/{CcjJpEaF2.chunk.js.map → med1nnv82.chunk.js.map} +1 -1
  60. package/dist/scripts/{DE24b7R6.chunk.js → q1iKm4P4.chunk.js} +2 -2
  61. package/dist/scripts/{DE24b7R6.chunk.js.map → q1iKm4P4.chunk.js.map} +1 -1
  62. package/dist/scripts/{4gz8eG_F.chunk.js → r68VJd6w.chunk.js} +2 -2
  63. package/dist/scripts/{4gz8eG_F.chunk.js.map → r68VJd6w.chunk.js.map} +1 -1
  64. package/package.json +1 -1
  65. package/dist/scripts/DPJbiCR02.chunk.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{N as e,Tr as t,at as n}from"./CrTgNROp.chunk.js";import{i as r,r as i}from"./CxNc1BDX.chunk.js";import{t as a}from"./BIVEB8w0.chunk.js";import{Ft as o,H as s,j as c}from"./app-B1NVV4PT.js";var l=t(((e,t)=>{function n(){return t.exports=n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},t.exports.__esModule=!0,t.exports.default=t.exports,n.apply(null,arguments)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports})),u={colours:`amber.apricot.aqua.azure.black.blue.bronze.brown.chocolate.copper.coral.cream.crimson.cyan.emerald.gold.green.grey.indigo.ivory.jade.lavender.lime.maroon.mint.navy.olive.orange.peach.pink.plum.purple.red.rose.ruby.sage.salmon.sapphire.scarlet.silver.sky.teal.turquoise.violet.white.yellow`.split(`.`),animals:`aardvark.albatross.alligator.alpaca.ant.anteater.antelope.ape.armadillo.baboon.badger.bat.bear.beaver.bee.beetle.bison.blackbird.boar.bobcat.bonobo.buffalo.butterfly.camel.canary.capybara.caribou.cat.caterpillar.chameleon.cheetah.chimpanzee.chinchilla.chipmunk.clownfish.cockatoo.cougar.cow.coyote.crab.crane.crocodile.crow.deer.dingo.dog.dolphin.donkey.dove.dragonfly.duck.eagle.elephant.elk.emu.falcon.ferret.finch.firefly.fish.flamingo.fox.frog.gazelle.gecko.gerbil.giraffe.goat.goldfish.goose.gorilla.grasshopper.gull.hamster.hare.hawk.hedgehog.heron.hippopotamus.horse.hummingbird.iguana.impala.jaguar.jellyfish.kangaroo.kingfisher.kiwi.koala.koi.ladybug.lemur.leopard.lion.lizard.llama.lobster.lynx.macaw.magpie.manatee.mandrill.marlin.meerkat.mole.mongoose.monkey.moose.mouse.mule.narwhal.newt.nightingale.ocelot.octopus.orangutan.orca.ostrich.otter.owl.ox.panda.panther.parakeet.parrot.peacock.pelican.penguin.pheasant.pigeon.platypus.pony.porcupine.possum.pufferfish.puffin.puma.quail.rabbit.raccoon.raven.reindeer.rhinoceros.roadrunner.robin.rooster.salamander.salmon.seahorse.seal.shark.sheep.sloth.snail.snake.sparrow.squid.squirrel.starfish.stingray.stork.swallow.swan.swordfish.tapir.tiger.toad.tortoise.toucan.trout.tuna.turtle.wallaby.walrus.weasel.whale.wildebeest.wolf.wolverine.woodpecker.yak.zebra`.split(`.`)},d=a.encloseNamespace(`shared.analyticsUtils`);function f(e){return e.charAt(0).toUpperCase()+e.slice(1)}function p(e){if(!e)return 0;let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t|=0}return Math.abs(t)}function m(e,t){let n=Math.floor(new Date().getMinutes()/5),r=p(`${e||t}-${n}`),i=u.colours[r%u.colours.length],a=u.animals[Math.floor(r/u.colours.length)%u.animals.length];return`${f(i)} ${f(a)}`}function h(e,t){return e?t?m(e.id,e.sessionId):e.deleted?d(`deleted`):o.getFullName(e)||d(`anonUser`):d(`anonUser`)}n();var g=e();function _(e){return(0,g.jsx)(`svg`,{...e,children:(0,g.jsx)(`path`,{d:`m16.837 9.842-1.138-3.678a1.65 1.65 0 0 0-.887-1.01 1.67 1.67 0 0 0-1.348-.02l-1.14.486a.8.8 0 0 1-.647 0l-1.14-.488a1.67 1.67 0 0 0-1.348.021 1.65 1.65 0 0 0-.887 1.01L7.164 9.842a7.17 7.17 0 0 0-3.062 1.85.41.41 0 0 0 .314.683h15.17c.162 0 .31-.094.376-.241a.41.41 0 0 0-.064-.44 7.17 7.17 0 0 0-3.061-1.852M9.094 6.404a.836.836 0 0 1 1.117-.516l1.135.484c.416.181.89.181 1.306 0l1.137-.485a.836.836 0 0 1 1.117.516l.976 3.153a16.17 16.17 0 0 0-7.764 0zm-3.59 5.148c1.455-1.019 3.866-1.645 6.497-1.645a14.5 14.5 0 0 1 4.41.651c.74.229 1.444.563 2.087.994zm9.807 1.645a2.9 2.9 0 0 0-2.508 1.447 1.61 1.61 0 0 0-1.604 0c-.763-1.323-2.425-1.835-3.807-1.173s-2.016 2.272-1.452 3.69a2.93 2.93 0 0 0 3.6 1.704 2.906 2.906 0 0 0 1.968-3.445.88.88 0 0 1 .986 0 2.87 2.87 0 0 0 1.269 3.088 2.91 2.91 0 0 0 3.351-.176c.966-.762 1.341-2.048.935-3.204s-1.505-1.932-2.738-1.93m-6.62 4.936c-1.143 0-2.07-.92-2.07-2.056s.927-2.057 2.07-2.057 2.069.92 2.069 2.057a2.065 2.065 0 0 1-2.07 2.056m6.62 0c-1.142 0-2.069-.92-2.069-2.056s.927-2.057 2.07-2.057 2.068.92 2.068 2.057a2.065 2.065 0 0 1-2.069 2.056`,fill:`currentColor`})})}var v={iconCircle:`_iconCircle_186sk_1`,dot:`_dot_186sk_8`};function y(e){let t=e.type===`anon`;return e.type===`student-reach`?(0,g.jsx)(`div`,{className:`position-relative h-100 w-100`,children:(0,g.jsx)(`div`,{className:`${v.iconCircle} bg-orange text-light ${e.extraClasses||``}`,children:(0,g.jsx)(i,{svg:c,size:e.anonymousSvgSize||r.Large,className:`svg-container w-100 h-100`})})}):t?(0,g.jsxs)(`div`,{className:`position-relative h-100 w-100`,children:[(0,g.jsx)(`div`,{className:`${v.iconCircle} bg-gray-700 text-light ${e.extraClasses||``}`,children:(0,g.jsx)(i,{svg:_,size:e.anonymousSvgSize||r.Large,className:`svg-container w-100 h-100`})}),e.showDot&&(0,g.jsx)(`div`,{className:`${v.dot} rounded-circle bg-danger`})]}):(0,g.jsx)(s,{imageCdnUrl:e.imageCdnUrl,initials:e.initials,imageUrl:e.imageUrl,extraClasses:e.extraClasses,showDot:e.showDot,anonymiseUsers:e.anonymiseUsers})}export{h as n,l as r,y as t};
2
- //# sourceMappingURL=BJOOjdj2.chunk.js.map
1
+ import{N as e,Tr as t,at as n}from"./CrTgNROp.chunk.js";import{i as r,r as i}from"./CxNc1BDX.chunk.js";import{t as a}from"./BIVEB8w0.chunk.js";import{Ft as o,H as s,j as c}from"./app-F8o5al1q.js";var l=t(((e,t)=>{function n(){return t.exports=n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},t.exports.__esModule=!0,t.exports.default=t.exports,n.apply(null,arguments)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports})),u={colours:`amber.apricot.aqua.azure.black.blue.bronze.brown.chocolate.copper.coral.cream.crimson.cyan.emerald.gold.green.grey.indigo.ivory.jade.lavender.lime.maroon.mint.navy.olive.orange.peach.pink.plum.purple.red.rose.ruby.sage.salmon.sapphire.scarlet.silver.sky.teal.turquoise.violet.white.yellow`.split(`.`),animals:`aardvark.albatross.alligator.alpaca.ant.anteater.antelope.ape.armadillo.baboon.badger.bat.bear.beaver.bee.beetle.bison.blackbird.boar.bobcat.bonobo.buffalo.butterfly.camel.canary.capybara.caribou.cat.caterpillar.chameleon.cheetah.chimpanzee.chinchilla.chipmunk.clownfish.cockatoo.cougar.cow.coyote.crab.crane.crocodile.crow.deer.dingo.dog.dolphin.donkey.dove.dragonfly.duck.eagle.elephant.elk.emu.falcon.ferret.finch.firefly.fish.flamingo.fox.frog.gazelle.gecko.gerbil.giraffe.goat.goldfish.goose.gorilla.grasshopper.gull.hamster.hare.hawk.hedgehog.heron.hippopotamus.horse.hummingbird.iguana.impala.jaguar.jellyfish.kangaroo.kingfisher.kiwi.koala.koi.ladybug.lemur.leopard.lion.lizard.llama.lobster.lynx.macaw.magpie.manatee.mandrill.marlin.meerkat.mole.mongoose.monkey.moose.mouse.mule.narwhal.newt.nightingale.ocelot.octopus.orangutan.orca.ostrich.otter.owl.ox.panda.panther.parakeet.parrot.peacock.pelican.penguin.pheasant.pigeon.platypus.pony.porcupine.possum.pufferfish.puffin.puma.quail.rabbit.raccoon.raven.reindeer.rhinoceros.roadrunner.robin.rooster.salamander.salmon.seahorse.seal.shark.sheep.sloth.snail.snake.sparrow.squid.squirrel.starfish.stingray.stork.swallow.swan.swordfish.tapir.tiger.toad.tortoise.toucan.trout.tuna.turtle.wallaby.walrus.weasel.whale.wildebeest.wolf.wolverine.woodpecker.yak.zebra`.split(`.`)},d=a.encloseNamespace(`shared.analyticsUtils`);function f(e){return e.charAt(0).toUpperCase()+e.slice(1)}function p(e){if(!e)return 0;let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t|=0}return Math.abs(t)}function m(e,t){let n=Math.floor(new Date().getMinutes()/5),r=p(`${e||t}-${n}`),i=u.colours[r%u.colours.length],a=u.animals[Math.floor(r/u.colours.length)%u.animals.length];return`${f(i)} ${f(a)}`}function h(e,t){return e?t?m(e.id,e.sessionId):e.deleted?d(`deleted`):o.getFullName(e)||d(`anonUser`):d(`anonUser`)}n();var g=e();function _(e){return(0,g.jsx)(`svg`,{...e,children:(0,g.jsx)(`path`,{d:`m16.837 9.842-1.138-3.678a1.65 1.65 0 0 0-.887-1.01 1.67 1.67 0 0 0-1.348-.02l-1.14.486a.8.8 0 0 1-.647 0l-1.14-.488a1.67 1.67 0 0 0-1.348.021 1.65 1.65 0 0 0-.887 1.01L7.164 9.842a7.17 7.17 0 0 0-3.062 1.85.41.41 0 0 0 .314.683h15.17c.162 0 .31-.094.376-.241a.41.41 0 0 0-.064-.44 7.17 7.17 0 0 0-3.061-1.852M9.094 6.404a.836.836 0 0 1 1.117-.516l1.135.484c.416.181.89.181 1.306 0l1.137-.485a.836.836 0 0 1 1.117.516l.976 3.153a16.17 16.17 0 0 0-7.764 0zm-3.59 5.148c1.455-1.019 3.866-1.645 6.497-1.645a14.5 14.5 0 0 1 4.41.651c.74.229 1.444.563 2.087.994zm9.807 1.645a2.9 2.9 0 0 0-2.508 1.447 1.61 1.61 0 0 0-1.604 0c-.763-1.323-2.425-1.835-3.807-1.173s-2.016 2.272-1.452 3.69a2.93 2.93 0 0 0 3.6 1.704 2.906 2.906 0 0 0 1.968-3.445.88.88 0 0 1 .986 0 2.87 2.87 0 0 0 1.269 3.088 2.91 2.91 0 0 0 3.351-.176c.966-.762 1.341-2.048.935-3.204s-1.505-1.932-2.738-1.93m-6.62 4.936c-1.143 0-2.07-.92-2.07-2.056s.927-2.057 2.07-2.057 2.069.92 2.069 2.057a2.065 2.065 0 0 1-2.07 2.056m6.62 0c-1.142 0-2.069-.92-2.069-2.056s.927-2.057 2.07-2.057 2.068.92 2.068 2.057a2.065 2.065 0 0 1-2.069 2.056`,fill:`currentColor`})})}var v={iconCircle:`_iconCircle_186sk_1`,dot:`_dot_186sk_8`};function y(e){let t=e.type===`anon`;return e.type===`student-reach`?(0,g.jsx)(`div`,{className:`position-relative h-100 w-100`,children:(0,g.jsx)(`div`,{className:`${v.iconCircle} bg-orange text-light ${e.extraClasses||``}`,children:(0,g.jsx)(i,{svg:c,size:e.anonymousSvgSize||r.Large,className:`svg-container w-100 h-100`})})}):t?(0,g.jsxs)(`div`,{className:`position-relative h-100 w-100`,children:[(0,g.jsx)(`div`,{className:`${v.iconCircle} bg-gray-700 text-light ${e.extraClasses||``}`,children:(0,g.jsx)(i,{svg:_,size:e.anonymousSvgSize||r.Large,className:`svg-container w-100 h-100`})}),e.showDot&&(0,g.jsx)(`div`,{className:`${v.dot} rounded-circle bg-danger`})]}):(0,g.jsx)(s,{imageCdnUrl:e.imageCdnUrl,initials:e.initials,imageUrl:e.imageUrl,extraClasses:e.extraClasses,showDot:e.showDot,anonymiseUsers:e.anonymiseUsers})}export{h as n,l as r,y as t};
2
+ //# sourceMappingURL=BHwx99h9.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BJOOjdj2.chunk.js","names":[],"sources":["../../../../../node_modules/@babel/runtime/helpers/extends.js","../../../../libs/shared/src/apps/analytics/utils/anon-name-dictionaries.json","../../../../libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","../../../../libs/shared/src/images/svg/objects/AnonymousSvg.tsx","../../../../libs/shared/src/components/engagement-avatar/engagement-avatar.module.scss","../../../../libs/shared/src/components/engagement-avatar/EngagementAvatar.tsx"],"sourcesContent":["function _extends() {\n return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","{\n \"colours\": [\n \"amber\",\n \"apricot\",\n \"aqua\",\n \"azure\",\n \"black\",\n \"blue\",\n \"bronze\",\n \"brown\",\n \"chocolate\",\n \"copper\",\n \"coral\",\n \"cream\",\n \"crimson\",\n \"cyan\",\n \"emerald\",\n \"gold\",\n \"green\",\n \"grey\",\n \"indigo\",\n \"ivory\",\n \"jade\",\n \"lavender\",\n \"lime\",\n \"maroon\",\n \"mint\",\n \"navy\",\n \"olive\",\n \"orange\",\n \"peach\",\n \"pink\",\n \"plum\",\n \"purple\",\n \"red\",\n \"rose\",\n \"ruby\",\n \"sage\",\n \"salmon\",\n \"sapphire\",\n \"scarlet\",\n \"silver\",\n \"sky\",\n \"teal\",\n \"turquoise\",\n \"violet\",\n \"white\",\n \"yellow\"\n ],\n \"animals\": [\n \"aardvark\", \"albatross\", \"alligator\", \"alpaca\", \"ant\", \"anteater\", \"antelope\", \"ape\", \"armadillo\",\n \"baboon\", \"badger\", \"bat\", \"bear\", \"beaver\", \"bee\", \"beetle\", \"bison\", \"blackbird\", \"boar\", \"bobcat\", \"bonobo\", \"buffalo\", \"butterfly\",\n \"camel\", \"canary\", \"capybara\", \"caribou\", \"cat\", \"caterpillar\", \"chameleon\",\n \"cheetah\", \"chimpanzee\", \"chinchilla\", \"chipmunk\", \"clownfish\", \"cockatoo\", \"cougar\", \"cow\", \"coyote\",\n \"crab\", \"crane\", \"crocodile\", \"crow\",\n \"deer\", \"dingo\", \"dog\", \"dolphin\", \"donkey\", \"dove\", \"dragonfly\", \"duck\",\n \"eagle\", \"elephant\", \"elk\", \"emu\",\n \"falcon\", \"ferret\", \"finch\", \"firefly\", \"fish\", \"flamingo\", \"fox\", \"frog\",\n \"gazelle\", \"gecko\", \"gerbil\", \"giraffe\", \"goat\", \"goldfish\", \"goose\", \"gorilla\", \"grasshopper\", \"gull\",\n \"hamster\", \"hare\", \"hawk\", \"hedgehog\", \"heron\", \"hippopotamus\", \"horse\", \"hummingbird\",\n \"iguana\", \"impala\",\n \"jaguar\", \"jellyfish\",\n \"kangaroo\", \"kingfisher\", \"kiwi\", \"koala\", \"koi\",\n \"ladybug\", \"lemur\", \"leopard\", \"lion\", \"lizard\", \"llama\", \"lobster\", \"lynx\",\n \"macaw\", \"magpie\", \"manatee\", \"mandrill\", \"marlin\", \"meerkat\", \"mole\", \"mongoose\", \"monkey\", \"moose\", \"mouse\", \"mule\",\n \"narwhal\", \"newt\", \"nightingale\",\n \"ocelot\", \"octopus\", \"orangutan\", \"orca\", \"ostrich\", \"otter\", \"owl\", \"ox\",\n \"panda\", \"panther\", \"parakeet\", \"parrot\", \"peacock\", \"pelican\", \"penguin\", \"pheasant\", \"pigeon\", \"platypus\",\n \"pony\", \"porcupine\", \"possum\", \"pufferfish\", \"puffin\", \"puma\",\n \"quail\",\n \"rabbit\", \"raccoon\", \"raven\", \"reindeer\", \"rhinoceros\", \"roadrunner\", \"robin\", \"rooster\",\n \"salamander\", \"salmon\", \"seahorse\", \"seal\", \"shark\", \"sheep\", \"sloth\", \"snail\", \"snake\", \"sparrow\",\n \"squid\", \"squirrel\", \"starfish\", \"stingray\", \"stork\", \"swallow\", \"swan\", \"swordfish\",\n \"tapir\", \"tiger\", \"toad\", \"tortoise\", \"toucan\", \"trout\", \"tuna\", \"turtle\",\n \"wallaby\", \"walrus\", \"weasel\", \"whale\", \"wildebeest\", \"wolf\", \"wolverine\", \"woodpecker\",\n \"yak\",\n \"zebra\"\n ]\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport dictionaries from './anon-name-dictionaries.json';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nfunction stringToSeed(input: string): number {\n if (!input)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction generateAnonName(userId: string, sessionId: string): string {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n *\n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n *\n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const bucket = Math.floor((new Date()).getMinutes() / 5);\n const seed = stringToSeed(`${userId || sessionId}-${bucket}`);\n // Treat the seed as a mixed-radix number: the low \"digit\" (mod) picks the colour, the next\n // \"digit\" (quotient) picks the animal. This decorrelates the two indices so every pair is\n // reachable and consecutive seeds cycle through all colours before the animal advances.\n const colour = dictionaries.colours[seed % dictionaries.colours.length];\n const animal = dictionaries.animals[Math.floor(seed / dictionaries.colours.length) % dictionaries.animals.length];\n return `${capitalize(colour)} ${capitalize(animal)}`;\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise) {\n if (user.deleted)\n return getPhrase('deleted');\n\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n }\n\n return generateAnonName(user.id, user.sessionId);\n}\n","import React from 'react';\n\nexport function AnonymousSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}\n >\n <path\n d='m16.837 9.842-1.138-3.678a1.65 1.65 0 0 0-.887-1.01 1.67 1.67 0 0 0-1.348-.02l-1.14.486a.8.8 0 0 1-.647 0l-1.14-.488a1.67 1.67 0 0 0-1.348.021 1.65 1.65 0 0 0-.887 1.01L7.164 9.842a7.17 7.17 0 0 0-3.062 1.85.41.41 0 0 0 .314.683h15.17c.162 0 .31-.094.376-.241a.41.41 0 0 0-.064-.44 7.17 7.17 0 0 0-3.061-1.852M9.094 6.404a.836.836 0 0 1 1.117-.516l1.135.484c.416.181.89.181 1.306 0l1.137-.485a.836.836 0 0 1 1.117.516l.976 3.153a16.17 16.17 0 0 0-7.764 0zm-3.59 5.148c1.455-1.019 3.866-1.645 6.497-1.645a14.5 14.5 0 0 1 4.41.651c.74.229 1.444.563 2.087.994zm9.807 1.645a2.9 2.9 0 0 0-2.508 1.447 1.61 1.61 0 0 0-1.604 0c-.763-1.323-2.425-1.835-3.807-1.173s-2.016 2.272-1.452 3.69a2.93 2.93 0 0 0 3.6 1.704 2.906 2.906 0 0 0 1.968-3.445.88.88 0 0 1 .986 0 2.87 2.87 0 0 0 1.269 3.088 2.91 2.91 0 0 0 3.351-.176c.966-.762 1.341-2.048.935-3.204s-1.505-1.932-2.738-1.93m-6.62 4.936c-1.143 0-2.07-.92-2.07-2.056s.927-2.057 2.07-2.057 2.069.92 2.069 2.057a2.065 2.065 0 0 1-2.07 2.056m6.62 0c-1.142 0-2.069-.92-2.069-2.056s.927-2.057 2.07-2.057 2.068.92 2.068 2.057a2.065 2.065 0 0 1-2.069 2.056'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n .iconCircle {\n border-radius: 50%;\n width: 100%;\n height: 100%;\n text-align: center;\n line-height: 100%;\n }\n\n .dot {\n position: absolute;\n top: -0.1rem;\n right: -0.1rem;\n width: 0.8rem;\n height: 0.8rem;\n }\n}\n","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { AnonymousSvg } from 'libs/shared/images/svg/objects/AnonymousSvg';\nimport { GroupSvg } from 'libs/shared/images/svg/objects/GroupSvg';\nimport { EngagementType } from 'libs/shared/interfaces';\n\nimport styles from './engagement-avatar.module.scss';\n\ninterface EngagementAvatarProps {\n imageCdnUrl: string;\n initials: string;\n imageUrl?: string;\n extraClasses?: string;\n showDot?: boolean;\n anonymiseUsers?: boolean;\n /** When set, determines the avatar icon based on engagement type. */\n type?: EngagementType;\n anonymousSvgSize?: SvgContainerSize;\n}\n\nexport function EngagementAvatar(props: EngagementAvatarProps): JSX.Element {\n const isAnonymous = props.type === 'anon';\n const isClassroomViews = props.type === 'student-reach';\n\n if (isClassroomViews) {\n return (\n <div className='position-relative h-100 w-100'>\n <div className={`${styles.iconCircle} bg-orange text-light ${props.extraClasses || ''}`}>\n <SvgContainer\n svg={GroupSvg}\n size={props.anonymousSvgSize || SvgContainerSize.Large}\n className='svg-container w-100 h-100'\n />\n </div>\n </div>\n );\n }\n\n if (isAnonymous) {\n return (\n <div className='position-relative h-100 w-100'>\n <div className={`${styles.iconCircle} bg-gray-700 text-light ${props.extraClasses || ''}`}>\n <SvgContainer\n svg={AnonymousSvg}\n size={props.anonymousSvgSize || SvgContainerSize.Large}\n className='svg-container w-100 h-100'\n />\n </div>\n {props.showDot && <div className={`${styles.dot} rounded-circle bg-danger`} />}\n </div>\n );\n }\n\n return (\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.initials}\n imageUrl={props.imageUrl}\n extraClasses={props.extraClasses}\n showDot={props.showDot}\n anonymiseUsers={props.anonymiseUsers}\n />\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"BHwx99h9.chunk.js","names":[],"sources":["../../../../../node_modules/@babel/runtime/helpers/extends.js","../../../../libs/shared/src/apps/analytics/utils/anon-name-dictionaries.json","../../../../libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","../../../../libs/shared/src/images/svg/objects/AnonymousSvg.tsx","../../../../libs/shared/src/components/engagement-avatar/engagement-avatar.module.scss","../../../../libs/shared/src/components/engagement-avatar/EngagementAvatar.tsx"],"sourcesContent":["function _extends() {\n return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","{\n \"colours\": [\n \"amber\",\n \"apricot\",\n \"aqua\",\n \"azure\",\n \"black\",\n \"blue\",\n \"bronze\",\n \"brown\",\n \"chocolate\",\n \"copper\",\n \"coral\",\n \"cream\",\n \"crimson\",\n \"cyan\",\n \"emerald\",\n \"gold\",\n \"green\",\n \"grey\",\n \"indigo\",\n \"ivory\",\n \"jade\",\n \"lavender\",\n \"lime\",\n \"maroon\",\n \"mint\",\n \"navy\",\n \"olive\",\n \"orange\",\n \"peach\",\n \"pink\",\n \"plum\",\n \"purple\",\n \"red\",\n \"rose\",\n \"ruby\",\n \"sage\",\n \"salmon\",\n \"sapphire\",\n \"scarlet\",\n \"silver\",\n \"sky\",\n \"teal\",\n \"turquoise\",\n \"violet\",\n \"white\",\n \"yellow\"\n ],\n \"animals\": [\n \"aardvark\", \"albatross\", \"alligator\", \"alpaca\", \"ant\", \"anteater\", \"antelope\", \"ape\", \"armadillo\",\n \"baboon\", \"badger\", \"bat\", \"bear\", \"beaver\", \"bee\", \"beetle\", \"bison\", \"blackbird\", \"boar\", \"bobcat\", \"bonobo\", \"buffalo\", \"butterfly\",\n \"camel\", \"canary\", \"capybara\", \"caribou\", \"cat\", \"caterpillar\", \"chameleon\",\n \"cheetah\", \"chimpanzee\", \"chinchilla\", \"chipmunk\", \"clownfish\", \"cockatoo\", \"cougar\", \"cow\", \"coyote\",\n \"crab\", \"crane\", \"crocodile\", \"crow\",\n \"deer\", \"dingo\", \"dog\", \"dolphin\", \"donkey\", \"dove\", \"dragonfly\", \"duck\",\n \"eagle\", \"elephant\", \"elk\", \"emu\",\n \"falcon\", \"ferret\", \"finch\", \"firefly\", \"fish\", \"flamingo\", \"fox\", \"frog\",\n \"gazelle\", \"gecko\", \"gerbil\", \"giraffe\", \"goat\", \"goldfish\", \"goose\", \"gorilla\", \"grasshopper\", \"gull\",\n \"hamster\", \"hare\", \"hawk\", \"hedgehog\", \"heron\", \"hippopotamus\", \"horse\", \"hummingbird\",\n \"iguana\", \"impala\",\n \"jaguar\", \"jellyfish\",\n \"kangaroo\", \"kingfisher\", \"kiwi\", \"koala\", \"koi\",\n \"ladybug\", \"lemur\", \"leopard\", \"lion\", \"lizard\", \"llama\", \"lobster\", \"lynx\",\n \"macaw\", \"magpie\", \"manatee\", \"mandrill\", \"marlin\", \"meerkat\", \"mole\", \"mongoose\", \"monkey\", \"moose\", \"mouse\", \"mule\",\n \"narwhal\", \"newt\", \"nightingale\",\n \"ocelot\", \"octopus\", \"orangutan\", \"orca\", \"ostrich\", \"otter\", \"owl\", \"ox\",\n \"panda\", \"panther\", \"parakeet\", \"parrot\", \"peacock\", \"pelican\", \"penguin\", \"pheasant\", \"pigeon\", \"platypus\",\n \"pony\", \"porcupine\", \"possum\", \"pufferfish\", \"puffin\", \"puma\",\n \"quail\",\n \"rabbit\", \"raccoon\", \"raven\", \"reindeer\", \"rhinoceros\", \"roadrunner\", \"robin\", \"rooster\",\n \"salamander\", \"salmon\", \"seahorse\", \"seal\", \"shark\", \"sheep\", \"sloth\", \"snail\", \"snake\", \"sparrow\",\n \"squid\", \"squirrel\", \"starfish\", \"stingray\", \"stork\", \"swallow\", \"swan\", \"swordfish\",\n \"tapir\", \"tiger\", \"toad\", \"tortoise\", \"toucan\", \"trout\", \"tuna\", \"turtle\",\n \"wallaby\", \"walrus\", \"weasel\", \"whale\", \"wildebeest\", \"wolf\", \"wolverine\", \"woodpecker\",\n \"yak\",\n \"zebra\"\n ]\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport dictionaries from './anon-name-dictionaries.json';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nfunction stringToSeed(input: string): number {\n if (!input)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction generateAnonName(userId: string, sessionId: string): string {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n *\n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n *\n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const bucket = Math.floor((new Date()).getMinutes() / 5);\n const seed = stringToSeed(`${userId || sessionId}-${bucket}`);\n // Treat the seed as a mixed-radix number: the low \"digit\" (mod) picks the colour, the next\n // \"digit\" (quotient) picks the animal. This decorrelates the two indices so every pair is\n // reachable and consecutive seeds cycle through all colours before the animal advances.\n const colour = dictionaries.colours[seed % dictionaries.colours.length];\n const animal = dictionaries.animals[Math.floor(seed / dictionaries.colours.length) % dictionaries.animals.length];\n return `${capitalize(colour)} ${capitalize(animal)}`;\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise) {\n if (user.deleted)\n return getPhrase('deleted');\n\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n }\n\n return generateAnonName(user.id, user.sessionId);\n}\n","import React from 'react';\n\nexport function AnonymousSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}\n >\n <path\n d='m16.837 9.842-1.138-3.678a1.65 1.65 0 0 0-.887-1.01 1.67 1.67 0 0 0-1.348-.02l-1.14.486a.8.8 0 0 1-.647 0l-1.14-.488a1.67 1.67 0 0 0-1.348.021 1.65 1.65 0 0 0-.887 1.01L7.164 9.842a7.17 7.17 0 0 0-3.062 1.85.41.41 0 0 0 .314.683h15.17c.162 0 .31-.094.376-.241a.41.41 0 0 0-.064-.44 7.17 7.17 0 0 0-3.061-1.852M9.094 6.404a.836.836 0 0 1 1.117-.516l1.135.484c.416.181.89.181 1.306 0l1.137-.485a.836.836 0 0 1 1.117.516l.976 3.153a16.17 16.17 0 0 0-7.764 0zm-3.59 5.148c1.455-1.019 3.866-1.645 6.497-1.645a14.5 14.5 0 0 1 4.41.651c.74.229 1.444.563 2.087.994zm9.807 1.645a2.9 2.9 0 0 0-2.508 1.447 1.61 1.61 0 0 0-1.604 0c-.763-1.323-2.425-1.835-3.807-1.173s-2.016 2.272-1.452 3.69a2.93 2.93 0 0 0 3.6 1.704 2.906 2.906 0 0 0 1.968-3.445.88.88 0 0 1 .986 0 2.87 2.87 0 0 0 1.269 3.088 2.91 2.91 0 0 0 3.351-.176c.966-.762 1.341-2.048.935-3.204s-1.505-1.932-2.738-1.93m-6.62 4.936c-1.143 0-2.07-.92-2.07-2.056s.927-2.057 2.07-2.057 2.069.92 2.069 2.057a2.065 2.065 0 0 1-2.07 2.056m6.62 0c-1.142 0-2.069-.92-2.069-2.056s.927-2.057 2.07-2.057 2.068.92 2.068 2.057a2.065 2.065 0 0 1-2.069 2.056'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n .iconCircle {\n border-radius: 50%;\n width: 100%;\n height: 100%;\n text-align: center;\n line-height: 100%;\n }\n\n .dot {\n position: absolute;\n top: -0.1rem;\n right: -0.1rem;\n width: 0.8rem;\n height: 0.8rem;\n }\n}\n","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { AnonymousSvg } from 'libs/shared/images/svg/objects/AnonymousSvg';\nimport { GroupSvg } from 'libs/shared/images/svg/objects/GroupSvg';\nimport { EngagementType } from 'libs/shared/interfaces';\n\nimport styles from './engagement-avatar.module.scss';\n\ninterface EngagementAvatarProps {\n imageCdnUrl: string;\n initials: string;\n imageUrl?: string;\n extraClasses?: string;\n showDot?: boolean;\n anonymiseUsers?: boolean;\n /** When set, determines the avatar icon based on engagement type. */\n type?: EngagementType;\n anonymousSvgSize?: SvgContainerSize;\n}\n\nexport function EngagementAvatar(props: EngagementAvatarProps): JSX.Element {\n const isAnonymous = props.type === 'anon';\n const isClassroomViews = props.type === 'student-reach';\n\n if (isClassroomViews) {\n return (\n <div className='position-relative h-100 w-100'>\n <div className={`${styles.iconCircle} bg-orange text-light ${props.extraClasses || ''}`}>\n <SvgContainer\n svg={GroupSvg}\n size={props.anonymousSvgSize || SvgContainerSize.Large}\n className='svg-container w-100 h-100'\n />\n </div>\n </div>\n );\n }\n\n if (isAnonymous) {\n return (\n <div className='position-relative h-100 w-100'>\n <div className={`${styles.iconCircle} bg-gray-700 text-light ${props.extraClasses || ''}`}>\n <SvgContainer\n svg={AnonymousSvg}\n size={props.anonymousSvgSize || SvgContainerSize.Large}\n className='svg-container w-100 h-100'\n />\n </div>\n {props.showDot && <div className={`${styles.dot} rounded-circle bg-danger`} />}\n </div>\n );\n }\n\n return (\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.initials}\n imageUrl={props.imageUrl}\n extraClasses={props.extraClasses}\n showDot={props.showDot}\n anonymiseUsers={props.anonymiseUsers}\n />\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Dr as e,N as t,at as n}from"./CrTgNROp.chunk.js";import{r}from"./CxNc1BDX.chunk.js";import{n as i}from"./HeoWyBUD.chunk.js";import{t as a}from"./BIVEB8w0.chunk.js";import{Ct as o,I as s,Q as c,kt as l,wt as u,z as d}from"./app-B1NVV4PT.js";import{m as f}from"./Bzx4bLV8.chunk.js";import{t as p}from"./Dj87pb142.chunk.js";var m=e(n());function h(e){let[,t]=i(s.HEADER_ACTIONS);(0,m.useEffect)(()=>(t(e),()=>{t(null)}),[!!e])}var g=t(),_=a.encloseNamespace(`reportsShared.anonymiseAction`);function v(){let[e,t]=i(s.ANONYMISE_USERS,!1);return(0,g.jsxs)(`div`,{className:`d-flex align-items center justify-content-between`,onClick:()=>t(!e),children:[(0,g.jsx)(`span`,{className:`me-3`,children:_(`hideNames`)}),(0,g.jsx)(c,{on:e,onClick:()=>{}})]})}var y=a.encloseNamespace(`reportsShared.utils`);function b(e){let t=f(o.getPrimaryObjectUrl);if(!e)return;let n=[];return t&&n.push({label:()=>(0,g.jsxs)(`span`,{className:`d-flex justify-content-between align-items-center`,children:[(0,g.jsx)(`span`,{className:`me-2`,children:y(`seeVideo`)}),(0,g.jsx)(r,{svg:d})]}),href:t(e),openInNewTab:!0}),n.push({label:()=>(0,g.jsx)(v,{})}),n}function x(){return[{label:y(`generateReport`),appLink:{application:l.DEFAULT,action:u.Default.GENERATE_REPORT,params:{type:p.VideoViews}}}]}function S(){return[{label:y(`generateReport`),appLink:{application:l.DEFAULT,action:u.Default.GENERATE_REPORT,params:{type:p.Logins}}}]}export{h as i,x as n,b as r,S as t};
2
- //# sourceMappingURL=CowQEpZQ2.chunk.js.map
1
+ import{Dr as e,N as t,at as n}from"./CrTgNROp.chunk.js";import{r}from"./CxNc1BDX.chunk.js";import{n as i}from"./HeoWyBUD.chunk.js";import{t as a}from"./BIVEB8w0.chunk.js";import{Ct as o,I as s,Q as c,kt as l,wt as u,z as d}from"./app-F8o5al1q.js";import{m as f}from"./B9syewbL.chunk.js";import{t as p}from"./CDx9_B5h2.chunk.js";var m=e(n());function h(e){let[,t]=i(s.HEADER_ACTIONS);(0,m.useEffect)(()=>(t(e),()=>{t(null)}),[!!e])}var g=t(),_=a.encloseNamespace(`reportsShared.anonymiseAction`);function v(){let[e,t]=i(s.ANONYMISE_USERS,!1);return(0,g.jsxs)(`div`,{className:`d-flex align-items center justify-content-between`,onClick:()=>t(!e),children:[(0,g.jsx)(`span`,{className:`me-3`,children:_(`hideNames`)}),(0,g.jsx)(c,{on:e,onClick:()=>{}})]})}var y=a.encloseNamespace(`reportsShared.utils`);function b(e){let t=f(o.getPrimaryObjectUrl);if(!e)return;let n=[];return t&&n.push({label:()=>(0,g.jsxs)(`span`,{className:`d-flex justify-content-between align-items-center`,children:[(0,g.jsx)(`span`,{className:`me-2`,children:y(`seeVideo`)}),(0,g.jsx)(r,{svg:d})]}),href:t(e),openInNewTab:!0}),n.push({label:()=>(0,g.jsx)(v,{})}),n}function x(){return[{label:y(`generateReport`),appLink:{application:l.DEFAULT,action:u.Default.GENERATE_REPORT,params:{type:p.VideoViews}}}]}function S(){return[{label:y(`generateReport`),appLink:{application:l.DEFAULT,action:u.Default.GENERATE_REPORT,params:{type:p.Logins}}}]}export{h as i,x as n,b as r,S as t};
2
+ //# sourceMappingURL=B_QHbZ3D2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CowQEpZQ2.chunk.js","names":[],"sources":["../../src/shared/hooks/UseSetHeaderActions.ts","../../src/shared/components/anonymise-action/AnonymiseAction.tsx","../../src/shared/utils/HeaderActionUtils.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { DropdownActionOptions } from 'libs/shared/components/actions/ActionsDropdown';\n\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\n\n/**\n * This hook will only set the actions on the initial render.\n * If the actions are dynamic, either this hook will need to be updated\n * or useViewModel used directly.\n */\nexport function useSetHeaderActions(actions?: DropdownActionOptions[]): void {\n const [ , setActions ] = useViewModel<DropdownActionOptions[]>(ViewModelKeys.HEADER_ACTIONS);\n\n useEffect(() => {\n setActions(actions);\n\n return () => {\n setActions(null);\n };\n }, [!!actions]);\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\n\nconst namespace = 'reportsShared.anonymiseAction';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AnonymiseAction(): JSX.Element {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS, false);\n\n return (\n <div\n className='d-flex align-items center justify-content-between'\n onClick={() => setAnonymiseUsers(!anonymiseUsers)}\n >\n <span className='me-3'>\n {getPhrase('hideNames')}\n </span>\n <ToggleSwitch on={anonymiseUsers} onClick={() => {}} />\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DropdownActionOptions } from 'libs/shared/components/actions/ActionsDropdown';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useGetExternalUrl } from 'libs/shared/hooks/UseGetExternalUrl';\nimport { NewWindowSvg } from 'libs/shared/images/svg/actions/NewWindowSvg';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { AnonymiseAction } from 'shared/components/anonymise-action/AnonymiseAction';\nimport { Actions } from 'shared/constants/ReportsActions';\nimport { AppChannels } from 'shared/constants/ReportsRadioChannels';\nimport { GenerateReportType } from 'shared/views/generate-report/GenerateReportView';\n\nimport { ExternalRouteHelper } from './ExternalRouteHelper';\n\nconst namespace = 'reportsShared.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useGetObjectHeaderActions(object?: BaseObject): DropdownActionOptions[] {\n const getObjectUrl = useGetExternalUrl(ExternalRouteHelper.getPrimaryObjectUrl);\n if (!object)\n return;\n\n const actions: DropdownActionOptions[] = [];\n\n if (getObjectUrl)\n actions.push({\n label: () => (\n <span\n className='d-flex justify-content-between align-items-center'\n >\n <span className='me-2'>\n {/* // TODO: once we have non-video types this will need to be updated. */}\n {getPhrase('seeVideo')}\n </span>\n <SvgContainer svg={NewWindowSvg} />\n </span>\n ),\n href: getObjectUrl(object),\n openInNewTab: true\n });\n\n actions.push({\n label: () => <AnonymiseAction />\n });\n\n return actions;\n}\n\nexport function getVideoHeaderActions(): DropdownActionOptions[] {\n return [{\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.GENERATE_REPORT,\n params: { type: GenerateReportType.VideoViews }\n }\n }];\n}\n\nexport function getLoginHeaderActions(): DropdownActionOptions[] {\n return [{\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.GENERATE_REPORT,\n params: { type: GenerateReportType.Logins }\n }\n }];\n}\n"],"mappings":"qVAaA,SAAgB,EAAoB,EAAyC,CAC3E,GAAM,EAAI,GAAe,EAAsC,EAAc,cAAc,GAE3F,EAAA,EAAA,UAAA,MACE,EAAW,CAAO,MAEL,CACX,EAAW,IAAI,CACjB,GACC,CAAC,CAAC,CAAC,CAAO,CAAC,CAChB,WCbM,EAAY,EAAgB,iBAAiB,+BAAS,EAE5D,SAAgB,GAA+B,CAC7C,GAAM,CAAE,EAAgB,GAAsB,EAAsB,EAAc,gBAAiB,EAAK,EAExG,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAU,oDACV,YAAe,EAAkB,CAAC,CAAc,WAFlD,EAIE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBACb,EAAU,WAAW,CAClB,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,GAAI,EAAgB,YAAe,CAAC,CAAI,CAAA,CACnD,GAET,CCRA,IAAM,EAAY,EAAgB,iBAAiB,qBAAS,EAE5D,SAAgB,EAA0B,EAA8C,CACtF,IAAM,EAAe,EAAkB,EAAoB,mBAAmB,EAC9E,GAAI,CAAC,EACH,OAEF,IAAM,EAAmC,CAAC,EAuB1C,OArBI,GACF,EAAQ,KAAK,CACX,WACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAU,6DADZ,EAGE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBAEb,EAAU,UAAU,CACjB,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,IAAK,CAAe,CAAA,CAC9B,IAER,KAAM,EAAa,CAAM,EACzB,aAAc,EAChB,CAAC,EAEH,EAAQ,KAAK,CACX,WAAa,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,CAAA,CACjC,CAAC,EAEM,CACT,CAEA,SAAgB,GAAiD,CAC/D,MAAO,CAAC,CACN,MAAO,EAAU,gBAAgB,EACjC,QAAS,CACP,YAAa,EAAY,QACzB,OAAQ,EAAQ,QAAQ,gBACxB,OAAQ,CAAE,KAAM,EAAmB,UAAW,CAChD,CACF,CAAC,CACH,CAEA,SAAgB,GAAiD,CAC/D,MAAO,CAAC,CACN,MAAO,EAAU,gBAAgB,EACjC,QAAS,CACP,YAAa,EAAY,QACzB,OAAQ,EAAQ,QAAQ,gBACxB,OAAQ,CAAE,KAAM,EAAmB,MAAO,CAC5C,CACF,CAAC,CACH"}
1
+ {"version":3,"file":"B_QHbZ3D2.chunk.js","names":[],"sources":["../../src/shared/hooks/UseSetHeaderActions.ts","../../src/shared/components/anonymise-action/AnonymiseAction.tsx","../../src/shared/utils/HeaderActionUtils.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { DropdownActionOptions } from 'libs/shared/components/actions/ActionsDropdown';\n\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\n\n/**\n * This hook will only set the actions on the initial render.\n * If the actions are dynamic, either this hook will need to be updated\n * or useViewModel used directly.\n */\nexport function useSetHeaderActions(actions?: DropdownActionOptions[]): void {\n const [ , setActions ] = useViewModel<DropdownActionOptions[]>(ViewModelKeys.HEADER_ACTIONS);\n\n useEffect(() => {\n setActions(actions);\n\n return () => {\n setActions(null);\n };\n }, [!!actions]);\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\n\nconst namespace = 'reportsShared.anonymiseAction';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AnonymiseAction(): JSX.Element {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS, false);\n\n return (\n <div\n className='d-flex align-items center justify-content-between'\n onClick={() => setAnonymiseUsers(!anonymiseUsers)}\n >\n <span className='me-3'>\n {getPhrase('hideNames')}\n </span>\n <ToggleSwitch on={anonymiseUsers} onClick={() => {}} />\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DropdownActionOptions } from 'libs/shared/components/actions/ActionsDropdown';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useGetExternalUrl } from 'libs/shared/hooks/UseGetExternalUrl';\nimport { NewWindowSvg } from 'libs/shared/images/svg/actions/NewWindowSvg';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { AnonymiseAction } from 'shared/components/anonymise-action/AnonymiseAction';\nimport { Actions } from 'shared/constants/ReportsActions';\nimport { AppChannels } from 'shared/constants/ReportsRadioChannels';\nimport { GenerateReportType } from 'shared/views/generate-report/GenerateReportView';\n\nimport { ExternalRouteHelper } from './ExternalRouteHelper';\n\nconst namespace = 'reportsShared.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useGetObjectHeaderActions(object?: BaseObject): DropdownActionOptions[] {\n const getObjectUrl = useGetExternalUrl(ExternalRouteHelper.getPrimaryObjectUrl);\n if (!object)\n return;\n\n const actions: DropdownActionOptions[] = [];\n\n if (getObjectUrl)\n actions.push({\n label: () => (\n <span\n className='d-flex justify-content-between align-items-center'\n >\n <span className='me-2'>\n {/* // TODO: once we have non-video types this will need to be updated. */}\n {getPhrase('seeVideo')}\n </span>\n <SvgContainer svg={NewWindowSvg} />\n </span>\n ),\n href: getObjectUrl(object),\n openInNewTab: true\n });\n\n actions.push({\n label: () => <AnonymiseAction />\n });\n\n return actions;\n}\n\nexport function getVideoHeaderActions(): DropdownActionOptions[] {\n return [{\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.GENERATE_REPORT,\n params: { type: GenerateReportType.VideoViews }\n }\n }];\n}\n\nexport function getLoginHeaderActions(): DropdownActionOptions[] {\n return [{\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.GENERATE_REPORT,\n params: { type: GenerateReportType.Logins }\n }\n }];\n}\n"],"mappings":"qVAaA,SAAgB,EAAoB,EAAyC,CAC3E,GAAM,EAAI,GAAe,EAAsC,EAAc,cAAc,GAE3F,EAAA,EAAA,UAAA,MACE,EAAW,CAAO,MAEL,CACX,EAAW,IAAI,CACjB,GACC,CAAC,CAAC,CAAC,CAAO,CAAC,CAChB,WCbM,EAAY,EAAgB,iBAAiB,+BAAS,EAE5D,SAAgB,GAA+B,CAC7C,GAAM,CAAE,EAAgB,GAAsB,EAAsB,EAAc,gBAAiB,EAAK,EAExG,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAU,oDACV,YAAe,EAAkB,CAAC,CAAc,WAFlD,EAIE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBACb,EAAU,WAAW,CAClB,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,GAAI,EAAgB,YAAe,CAAC,CAAI,CAAA,CACnD,GAET,CCRA,IAAM,EAAY,EAAgB,iBAAiB,qBAAS,EAE5D,SAAgB,EAA0B,EAA8C,CACtF,IAAM,EAAe,EAAkB,EAAoB,mBAAmB,EAC9E,GAAI,CAAC,EACH,OAEF,IAAM,EAAmC,CAAC,EAuB1C,OArBI,GACF,EAAQ,KAAK,CACX,WACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAU,6DADZ,EAGE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBAEb,EAAU,UAAU,CACjB,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,IAAK,CAAe,CAAA,CAC9B,IAER,KAAM,EAAa,CAAM,EACzB,aAAc,EAChB,CAAC,EAEH,EAAQ,KAAK,CACX,WAAa,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,CAAA,CACjC,CAAC,EAEM,CACT,CAEA,SAAgB,GAAiD,CAC/D,MAAO,CAAC,CACN,MAAO,EAAU,gBAAgB,EACjC,QAAS,CACP,YAAa,EAAY,QACzB,OAAQ,EAAQ,QAAQ,gBACxB,OAAQ,CAAE,KAAM,EAAmB,UAAW,CAChD,CACF,CAAC,CACH,CAEA,SAAgB,GAAiD,CAC/D,MAAO,CAAC,CACN,MAAO,EAAU,gBAAgB,EACjC,QAAS,CACP,YAAa,EAAY,QACzB,OAAQ,EAAQ,QAAQ,gBACxB,OAAQ,CAAE,KAAM,EAAmB,MAAO,CAC5C,CACF,CAAC,CACH"}
@@ -1,2 +1,2 @@
1
- import{Dr as e,N as t,at as n,it as r}from"./CrTgNROp.chunk.js";import{h as i}from"./Dwe-4MVf.chunk.js";import{t as a}from"./o2slFZEB.chunk.js";import"./HeoWyBUD.chunk.js";import"./app-B1NVV4PT.js";var o=e(n()),s=e(r()),c=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),l=`html`,u=`svg`,d=`http://www.w3.org/2000/svg`,f=function(e,t){if(t===l)return e instanceof HTMLElement;if(t===u)return e instanceof SVGElement;throw Error(`Unrecognized element type "`+t+`" for validateElementType.`)},p=function(e,t){var n={},r,i,a;if(e===l)a=document.createElement(`div`);else if(e===u)a=document.createElementNS(d,`g`);else throw Error(`Invalid element type "`+e+`" for createPortalNode: must be "html" or "svg".`);if(t&&typeof t==`object`)for(var o=0,s=Object.entries(t.attributes);o<s.length;o++){var c=s[o],p=c[0],m=c[1];a.setAttribute(p,m)}var h={element:a,elementType:e,setPortalProps:function(e){n=e},getInitialPortalProps:function(){return n},mount:function(t,n){if(n!==i){if(h.unmount(),t!==r&&!f(t,e))throw Error(`Invalid element type for portal: "`+e+`" portalNodes must be used with `+e+` elements, but OutPortal is within <`+t.tagName+`>.`);t.replaceChild(h.element,n),r=t,i=n}},unmount:function(e){e&&e!==i||r&&i&&(r.replaceChild(i,h.element),r=void 0,i=void 0)}};return h},m=function(e){c(t,e);function t(t){var n=e.call(this,t)||this;return n.addPropsChannel=function(){Object.assign(n.props.node,{setPortalProps:function(e){n.setState({nodeProps:e})}})},n.state={nodeProps:n.props.node.getInitialPortalProps()},n}return t.prototype.componentDidMount=function(){this.addPropsChannel()},t.prototype.componentDidUpdate=function(){this.addPropsChannel()},t.prototype.render=function(){var e=this,t=this.props,n=t.children,r=t.node;return s.createPortal(o.Children.map(n,function(t){return o.isValidElement(t)?o.cloneElement(t,e.state.nodeProps):t}),r.element)},t}(o.PureComponent),h=function(e){c(t,e);function t(t){var n=e.call(this,t)||this;return n.placeholderNode=o.createRef(),n.passPropsThroughPortal(),n}return t.prototype.passPropsThroughPortal=function(){var e=Object.assign({},this.props,{node:void 0});this.props.node.setPortalProps(e)},t.prototype.componentDidMount=function(){var e=this.props.node;this.currentPortalNode=e;var t=this.placeholderNode.current,n=t.parentNode;e.mount(n,t),this.passPropsThroughPortal()},t.prototype.componentDidUpdate=function(){var e=this.props.node;this.currentPortalNode&&e!==this.currentPortalNode&&(this.currentPortalNode.unmount(this.placeholderNode.current),this.currentPortalNode.setPortalProps({}),this.currentPortalNode=e);var t=this.placeholderNode.current,n=t.parentNode;e.mount(n,t),this.passPropsThroughPortal()},t.prototype.componentWillUnmount=function(){var e=this.props.node;e.unmount(this.placeholderNode.current),e.setPortalProps({})},t.prototype.render=function(){return o.createElement(`div`,{ref:this.placeholderNode})},t}(o.PureComponent),g=p.bind(null,l);p.bind(null,u),t();var _=o.createContext({hasProvider:!1});function v(){return o.useContext(_)}var y=50;function b(e,t){let n=i(a.chunk(e,y).map(e=>t(a.uniq(e)))),r=a.flatten(n.data);return{itemsArr:r,items:n.data.length?r.reduce((e,t)=>({...e,[t.id]:t}),{}):null,isFetching:n.isFetching,hasCompleted:n.hasCompleted}}function x(e,t,n){let r=n??(e=>typeof e==`object`?e.id:e),{fetchItems:i,...a}=S({getRequest:t,_getKey:n});return o.useEffect(()=>{e?.length&&i(e)},[e?.map(r).join(`,`)]),a}function S(e){let t=e._getKey??(e=>typeof e==`object`?e.id:e),n=o.useRef(new Set),[r,s]=o.useState([]);function c(r){if(!r?.length)return;let i=[];r.forEach(e=>{let r=t(e);n.current.has(r)||(i.push(e),n.current.add(r))}),i.length&&s(t=>[...t,...a.chunk(i,y).map(e.getRequest)])}let l=i(r),u=a.flatten(l.data),d=l.data.length?u.reduce((e,n)=>({...e,[t(n)]:n}),{}):null;return{hasFirstRequestCompleted:!!l.responses?.[0]?.hasCompleted,itemsArr:u,items:d,isFetching:l.isFetching,fetchItems:c}}export{h as a,m as i,x as n,g as o,v as r,b as t};
2
- //# sourceMappingURL=TzLygaBE.chunk.js.map
1
+ import{Dr as e,N as t,at as n,it as r}from"./CrTgNROp.chunk.js";import{h as i}from"./Dwe-4MVf.chunk.js";import{t as a}from"./o2slFZEB.chunk.js";import"./HeoWyBUD.chunk.js";import"./app-F8o5al1q.js";var o=e(n()),s=e(r()),c=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),l=`html`,u=`svg`,d=`http://www.w3.org/2000/svg`,f=function(e,t){if(t===l)return e instanceof HTMLElement;if(t===u)return e instanceof SVGElement;throw Error(`Unrecognized element type "`+t+`" for validateElementType.`)},p=function(e,t){var n={},r,i,a;if(e===l)a=document.createElement(`div`);else if(e===u)a=document.createElementNS(d,`g`);else throw Error(`Invalid element type "`+e+`" for createPortalNode: must be "html" or "svg".`);if(t&&typeof t==`object`)for(var o=0,s=Object.entries(t.attributes);o<s.length;o++){var c=s[o],p=c[0],m=c[1];a.setAttribute(p,m)}var h={element:a,elementType:e,setPortalProps:function(e){n=e},getInitialPortalProps:function(){return n},mount:function(t,n){if(n!==i){if(h.unmount(),t!==r&&!f(t,e))throw Error(`Invalid element type for portal: "`+e+`" portalNodes must be used with `+e+` elements, but OutPortal is within <`+t.tagName+`>.`);t.replaceChild(h.element,n),r=t,i=n}},unmount:function(e){e&&e!==i||r&&i&&(r.replaceChild(i,h.element),r=void 0,i=void 0)}};return h},m=function(e){c(t,e);function t(t){var n=e.call(this,t)||this;return n.addPropsChannel=function(){Object.assign(n.props.node,{setPortalProps:function(e){n.setState({nodeProps:e})}})},n.state={nodeProps:n.props.node.getInitialPortalProps()},n}return t.prototype.componentDidMount=function(){this.addPropsChannel()},t.prototype.componentDidUpdate=function(){this.addPropsChannel()},t.prototype.render=function(){var e=this,t=this.props,n=t.children,r=t.node;return s.createPortal(o.Children.map(n,function(t){return o.isValidElement(t)?o.cloneElement(t,e.state.nodeProps):t}),r.element)},t}(o.PureComponent),h=function(e){c(t,e);function t(t){var n=e.call(this,t)||this;return n.placeholderNode=o.createRef(),n.passPropsThroughPortal(),n}return t.prototype.passPropsThroughPortal=function(){var e=Object.assign({},this.props,{node:void 0});this.props.node.setPortalProps(e)},t.prototype.componentDidMount=function(){var e=this.props.node;this.currentPortalNode=e;var t=this.placeholderNode.current,n=t.parentNode;e.mount(n,t),this.passPropsThroughPortal()},t.prototype.componentDidUpdate=function(){var e=this.props.node;this.currentPortalNode&&e!==this.currentPortalNode&&(this.currentPortalNode.unmount(this.placeholderNode.current),this.currentPortalNode.setPortalProps({}),this.currentPortalNode=e);var t=this.placeholderNode.current,n=t.parentNode;e.mount(n,t),this.passPropsThroughPortal()},t.prototype.componentWillUnmount=function(){var e=this.props.node;e.unmount(this.placeholderNode.current),e.setPortalProps({})},t.prototype.render=function(){return o.createElement(`div`,{ref:this.placeholderNode})},t}(o.PureComponent),g=p.bind(null,l);p.bind(null,u),t();var _=o.createContext({hasProvider:!1});function v(){return o.useContext(_)}var y=50;function b(e,t){let n=i(a.chunk(e,y).map(e=>t(a.uniq(e)))),r=a.flatten(n.data);return{itemsArr:r,items:n.data.length?r.reduce((e,t)=>({...e,[t.id]:t}),{}):null,isFetching:n.isFetching,hasCompleted:n.hasCompleted}}function x(e,t,n){let r=n??(e=>typeof e==`object`?e.id:e),{fetchItems:i,...a}=S({getRequest:t,_getKey:n});return o.useEffect(()=>{e?.length&&i(e)},[e?.map(r).join(`,`)]),a}function S(e){let t=e._getKey??(e=>typeof e==`object`?e.id:e),n=o.useRef(new Set),[r,s]=o.useState([]);function c(r){if(!r?.length)return;let i=[];r.forEach(e=>{let r=t(e);n.current.has(r)||(i.push(e),n.current.add(r))}),i.length&&s(t=>[...t,...a.chunk(i,y).map(e.getRequest)])}let l=i(r),u=a.flatten(l.data),d=l.data.length?u.reduce((e,n)=>({...e,[t(n)]:n}),{}):null;return{hasFirstRequestCompleted:!!l.responses?.[0]?.hasCompleted,itemsArr:u,items:d,isFetching:l.isFetching,fetchItems:c}}export{h as a,m as i,x as n,g as o,v as r,b as t};
2
+ //# sourceMappingURL=BcjF3S7y.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TzLygaBE.chunk.js","names":[],"sources":["../../../../../node_modules/react-reverse-portal/dist/web/index.js","../../../../libs/shared/src/context/player-context/PlayerContext.tsx","../../../../libs/shared/src/hooks/UseBatchFetch.ts"],"sourcesContent":["var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n// Internally, the portalNode must be for either HTML or SVG elements\nvar ELEMENT_TYPE_HTML = 'html';\nvar ELEMENT_TYPE_SVG = 'svg';\n// ReactDOM can handle several different namespaces, but they're not exported publicly\n// https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/shared/DOMNamespaces.js#L8-L10\nvar SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nvar validateElementType = function (domElement, elementType) {\n if (elementType === ELEMENT_TYPE_HTML) {\n return domElement instanceof HTMLElement;\n }\n if (elementType === ELEMENT_TYPE_SVG) {\n return domElement instanceof SVGElement;\n }\n throw new Error(\"Unrecognized element type \\\"\" + elementType + \"\\\" for validateElementType.\");\n};\n// This is the internal implementation: the public entry points set elementType to an appropriate value\nvar createPortalNode = function (elementType, options) {\n var initialProps = {};\n var parent;\n var lastPlaceholder;\n var element;\n if (elementType === ELEMENT_TYPE_HTML) {\n element = document.createElement('div');\n }\n else if (elementType === ELEMENT_TYPE_SVG) {\n element = document.createElementNS(SVG_NAMESPACE, 'g');\n }\n else {\n throw new Error(\"Invalid element type \\\"\" + elementType + \"\\\" for createPortalNode: must be \\\"html\\\" or \\\"svg\\\".\");\n }\n if (options && typeof options === \"object\") {\n for (var _i = 0, _a = Object.entries(options.attributes); _i < _a.length; _i++) {\n var _b = _a[_i], key = _b[0], value = _b[1];\n element.setAttribute(key, value);\n }\n }\n var portalNode = {\n element: element,\n elementType: elementType,\n setPortalProps: function (props) {\n initialProps = props;\n },\n getInitialPortalProps: function () {\n return initialProps;\n },\n mount: function (newParent, newPlaceholder) {\n if (newPlaceholder === lastPlaceholder) {\n // Already mounted - noop.\n return;\n }\n portalNode.unmount();\n // To support SVG and other non-html elements, the portalNode's elementType needs to match\n // the elementType it's being rendered into\n if (newParent !== parent) {\n if (!validateElementType(newParent, elementType)) {\n throw new Error(\"Invalid element type for portal: \\\"\" + elementType + \"\\\" portalNodes must be used with \" + elementType + \" elements, but OutPortal is within <\" + newParent.tagName + \">.\");\n }\n }\n newParent.replaceChild(portalNode.element, newPlaceholder);\n parent = newParent;\n lastPlaceholder = newPlaceholder;\n },\n unmount: function (expectedPlaceholder) {\n if (expectedPlaceholder && expectedPlaceholder !== lastPlaceholder) {\n // Skip unmounts for placeholders that aren't currently mounted\n // They will have been automatically unmounted already by a subsequent mount()\n return;\n }\n if (parent && lastPlaceholder) {\n parent.replaceChild(lastPlaceholder, portalNode.element);\n parent = undefined;\n lastPlaceholder = undefined;\n }\n }\n };\n return portalNode;\n};\nvar InPortal = /** @class */ (function (_super) {\n __extends(InPortal, _super);\n function InPortal(props) {\n var _this = _super.call(this, props) || this;\n _this.addPropsChannel = function () {\n Object.assign(_this.props.node, {\n setPortalProps: function (props) {\n // Rerender the child node here if/when the out portal props change\n _this.setState({ nodeProps: props });\n }\n });\n };\n _this.state = {\n nodeProps: _this.props.node.getInitialPortalProps(),\n };\n return _this;\n }\n InPortal.prototype.componentDidMount = function () {\n this.addPropsChannel();\n };\n InPortal.prototype.componentDidUpdate = function () {\n this.addPropsChannel();\n };\n InPortal.prototype.render = function () {\n var _this = this;\n var _a = this.props, children = _a.children, node = _a.node;\n return ReactDOM.createPortal(React.Children.map(children, function (child) {\n if (!React.isValidElement(child))\n return child;\n return React.cloneElement(child, _this.state.nodeProps);\n }), node.element);\n };\n return InPortal;\n}(React.PureComponent));\nvar OutPortal = /** @class */ (function (_super) {\n __extends(OutPortal, _super);\n function OutPortal(props) {\n var _this = _super.call(this, props) || this;\n _this.placeholderNode = React.createRef();\n _this.passPropsThroughPortal();\n return _this;\n }\n OutPortal.prototype.passPropsThroughPortal = function () {\n var propsForTarget = Object.assign({}, this.props, { node: undefined });\n this.props.node.setPortalProps(propsForTarget);\n };\n OutPortal.prototype.componentDidMount = function () {\n var node = this.props.node;\n this.currentPortalNode = node;\n var placeholder = this.placeholderNode.current;\n var parent = placeholder.parentNode;\n node.mount(parent, placeholder);\n this.passPropsThroughPortal();\n };\n OutPortal.prototype.componentDidUpdate = function () {\n // We re-mount on update, just in case we were unmounted (e.g. by\n // a second OutPortal, which has now been removed)\n var node = this.props.node;\n // If we're switching portal nodes, we need to clean up the current one first.\n if (this.currentPortalNode && node !== this.currentPortalNode) {\n this.currentPortalNode.unmount(this.placeholderNode.current);\n this.currentPortalNode.setPortalProps({});\n this.currentPortalNode = node;\n }\n var placeholder = this.placeholderNode.current;\n var parent = placeholder.parentNode;\n node.mount(parent, placeholder);\n this.passPropsThroughPortal();\n };\n OutPortal.prototype.componentWillUnmount = function () {\n var node = this.props.node;\n node.unmount(this.placeholderNode.current);\n node.setPortalProps({});\n };\n OutPortal.prototype.render = function () {\n // Render a placeholder to the DOM, so we can get a reference into\n // our location in the DOM, and swap it out for the portaled node.\n // A <div> placeholder works fine even for SVG.\n return React.createElement(\"div\", { ref: this.placeholderNode });\n };\n return OutPortal;\n}(React.PureComponent));\nvar createHtmlPortalNode = createPortalNode.bind(null, ELEMENT_TYPE_HTML);\nvar createSvgPortalNode = createPortalNode.bind(null, ELEMENT_TYPE_SVG);\nexport { createHtmlPortalNode, createSvgPortalNode, InPortal, OutPortal, };\n//# sourceMappingURL=index.js.map","import React from 'react';\nimport { createHtmlPortalNode, HtmlPortalNode } from 'react-reverse-portal';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { DefaultDisplayMode, PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerContextState } from 'libs/shared/context/player-context/interfaces/PlayerContextState';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { playerContextReducer } from 'libs/shared/context/player-context/reducer/PlayerContextReducer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nconst _THEATRE_MODE = 'play-page-theatre-mode';\n\nexport interface PlayerContextValues extends PlayerContextState {\n playerRef?: React.MutableRefObject<PlayerReference>;\n portalNode?: HtmlPortalNode;\n questionListPortalNode?: HtmlPortalNode;\n\n useInitialize?: (initializeData: PlayerInitializationData) => void;\n dispose?: () => void;\n setPlayerRef?: (player: any) => void;\n setPlayerMode?: (mode: PlayerMode) => void;\n setDefaultDisplayMode?: (displayMode: DefaultDisplayMode) => void;\n setStarted?: (started: boolean) => void;\n setPersist?: () => void;\n\n /**\n * Tells components if an instance of <PlayerContextProvider /> exists\n * above them in the tree. I.e. When this is used in curator.\n */\n hasProvider: boolean;\n}\n\nconst PlayerContext = React.createContext<PlayerContextValues>({ hasProvider: false });\n\nexport function usePlayerContext() {\n return React.useContext(PlayerContext);\n}\n\nfunction getInitialState(): PlayerContextState {\n const hasSavedTheatreMode = LocalStorageHelper.get(_THEATRE_MODE);\n\n return {\n defaultDisplayMode: hasSavedTheatreMode ? 'theatre' : 'normal'\n };\n}\n\nexport function PlayerContextProvider(props: React.PropsWithChildren) {\n const [ state, dispatch ] = React.useReducer(playerContextReducer, getInitialState());\n const { hasPreviewVideos } = useSettings(null);\n\n const playerRef = React.useRef<any>(null);\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(\n { attributes: { class: 'cv-theatre-mode-video-container' } }\n ), []);\n\n const questionListPortalNode = React.useMemo(createHtmlPortalNode, []);\n\n function setPlayerRef(player: PlayerReference) {\n playerRef.current = player;\n }\n\n function useInitialize(initializeData: PlayerInitializationData) {\n const enabled = hasPreviewVideos || initializeData.mode !== 'hover';\n\n React.useEffect(() => {\n if (!enabled)\n return;\n\n /**\n * Cannot initialize a hover player if we already have a player elsewhere.\n */\n if (initializeData.mode === 'hover' && state.mode)\n return;\n\n /**\n * No hover to play on interactives. This feature is ComingSoon™️ - Sha\n */\n if (initializeData.mode === 'hover' && initializeData.objectTypeId === MasterType.Interactive)\n return;\n\n dispatch({\n type: 'initialize',\n data: initializeData\n });\n\n return disposeInternal;\n }, []);\n }\n\n function setPlayerMode(mode: PlayerMode) {\n dispatch({ type: 'mode', data: { mode } });\n }\n\n function setDefaultDisplayMode(defaultDisplayMode: DefaultDisplayMode) {\n LocalStorageHelper.set(_THEATRE_MODE, defaultDisplayMode === 'theatre');\n\n dispatch({ type: 'defaultDisplayMode', data: { defaultDisplayMode } });\n }\n\n function setStarted(): void {\n dispatch({ type: 'started' });\n }\n\n function disposeInternal(force: boolean = false): void {\n if (force) {\n playerRef.current = null;\n }\n\n dispatch({ type: 'dispose', data: { force: force } });\n }\n\n function setPersist(): void {\n dispatch({ type: 'persist' });\n }\n\n /**\n * If anything external calls dispose, we ignore the persist flag and force a disposal\n */\n function dispose(): void {\n disposeInternal(true);\n }\n\n const playerContextValues: PlayerContextValues = {\n ...state,\n playerRef,\n setPlayerRef,\n portalNode,\n questionListPortalNode,\n useInitialize,\n setPlayerMode,\n setDefaultDisplayMode,\n setStarted,\n dispose,\n setPersist,\n hasProvider: true\n };\n\n return (\n <PlayerContext.Provider value={playerContextValues}>\n {props.children}\n </PlayerContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: {[key: string]: T } | null;\n isFetching: boolean;\n hasCompleted: 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, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length ?\n itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {}) :\n null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching,\n hasCompleted: responses.hasCompleted\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<TResponse, TObjects = string>(\n objs: TObjects[],\n getRequest: (items: TObjects[]) => Flight.Request,\n _getKey?: (obj: TObjects) => string\n) {\n const getKey = _getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const { fetchItems, ...data } = useGrowingBatchFetchFunc<TResponse, TObjects>({ getRequest, _getKey });\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n fetchItems(objs);\n }, [objs?.map(getKey).join(',')]);\n\n return data;\n}\n\ninterface UseGrowingBatchFetchFuncOptions<TObjects> {\n getRequest: (items: TObjects[]) => Flight.Request;\n _getKey?: (obj: TObjects) => string;\n}\n\n/**\n * When you need the useGrowingBatchFetch() behaviour, but need to trigger the\n * fetch manually and update the objects - Nish \n */\nexport function useGrowingBatchFetchFunc<TResponse, TObjects = string>(\n options: UseGrowingBatchFetchFuncOptions<TObjects>\n) {\n const getKey = options._getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n function fetchItems(objs: TObjects[]) {\n if (!objs?.length)\n return;\n\n const unfetchedItems: TObjects[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n \n setRequests(r => ([ ...r, ...ArrayHelper.chunk<TObjects>(unfetchedItems, CHUNK_SIZE).map(options.getRequest) ]));\n }\n\n const responses = Flight.useBasicFetchAll<TResponse[]>(requests);\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length ?\n itemsArr.reduce<Record<string, TResponse>>((acc, item) => ({ ...acc, [getKey(item)]: item }), {}) :\n null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching,\n fetchItems\n };\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"BcjF3S7y.chunk.js","names":[],"sources":["../../../../../node_modules/react-reverse-portal/dist/web/index.js","../../../../libs/shared/src/context/player-context/PlayerContext.tsx","../../../../libs/shared/src/hooks/UseBatchFetch.ts"],"sourcesContent":["var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n// Internally, the portalNode must be for either HTML or SVG elements\nvar ELEMENT_TYPE_HTML = 'html';\nvar ELEMENT_TYPE_SVG = 'svg';\n// ReactDOM can handle several different namespaces, but they're not exported publicly\n// https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/shared/DOMNamespaces.js#L8-L10\nvar SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nvar validateElementType = function (domElement, elementType) {\n if (elementType === ELEMENT_TYPE_HTML) {\n return domElement instanceof HTMLElement;\n }\n if (elementType === ELEMENT_TYPE_SVG) {\n return domElement instanceof SVGElement;\n }\n throw new Error(\"Unrecognized element type \\\"\" + elementType + \"\\\" for validateElementType.\");\n};\n// This is the internal implementation: the public entry points set elementType to an appropriate value\nvar createPortalNode = function (elementType, options) {\n var initialProps = {};\n var parent;\n var lastPlaceholder;\n var element;\n if (elementType === ELEMENT_TYPE_HTML) {\n element = document.createElement('div');\n }\n else if (elementType === ELEMENT_TYPE_SVG) {\n element = document.createElementNS(SVG_NAMESPACE, 'g');\n }\n else {\n throw new Error(\"Invalid element type \\\"\" + elementType + \"\\\" for createPortalNode: must be \\\"html\\\" or \\\"svg\\\".\");\n }\n if (options && typeof options === \"object\") {\n for (var _i = 0, _a = Object.entries(options.attributes); _i < _a.length; _i++) {\n var _b = _a[_i], key = _b[0], value = _b[1];\n element.setAttribute(key, value);\n }\n }\n var portalNode = {\n element: element,\n elementType: elementType,\n setPortalProps: function (props) {\n initialProps = props;\n },\n getInitialPortalProps: function () {\n return initialProps;\n },\n mount: function (newParent, newPlaceholder) {\n if (newPlaceholder === lastPlaceholder) {\n // Already mounted - noop.\n return;\n }\n portalNode.unmount();\n // To support SVG and other non-html elements, the portalNode's elementType needs to match\n // the elementType it's being rendered into\n if (newParent !== parent) {\n if (!validateElementType(newParent, elementType)) {\n throw new Error(\"Invalid element type for portal: \\\"\" + elementType + \"\\\" portalNodes must be used with \" + elementType + \" elements, but OutPortal is within <\" + newParent.tagName + \">.\");\n }\n }\n newParent.replaceChild(portalNode.element, newPlaceholder);\n parent = newParent;\n lastPlaceholder = newPlaceholder;\n },\n unmount: function (expectedPlaceholder) {\n if (expectedPlaceholder && expectedPlaceholder !== lastPlaceholder) {\n // Skip unmounts for placeholders that aren't currently mounted\n // They will have been automatically unmounted already by a subsequent mount()\n return;\n }\n if (parent && lastPlaceholder) {\n parent.replaceChild(lastPlaceholder, portalNode.element);\n parent = undefined;\n lastPlaceholder = undefined;\n }\n }\n };\n return portalNode;\n};\nvar InPortal = /** @class */ (function (_super) {\n __extends(InPortal, _super);\n function InPortal(props) {\n var _this = _super.call(this, props) || this;\n _this.addPropsChannel = function () {\n Object.assign(_this.props.node, {\n setPortalProps: function (props) {\n // Rerender the child node here if/when the out portal props change\n _this.setState({ nodeProps: props });\n }\n });\n };\n _this.state = {\n nodeProps: _this.props.node.getInitialPortalProps(),\n };\n return _this;\n }\n InPortal.prototype.componentDidMount = function () {\n this.addPropsChannel();\n };\n InPortal.prototype.componentDidUpdate = function () {\n this.addPropsChannel();\n };\n InPortal.prototype.render = function () {\n var _this = this;\n var _a = this.props, children = _a.children, node = _a.node;\n return ReactDOM.createPortal(React.Children.map(children, function (child) {\n if (!React.isValidElement(child))\n return child;\n return React.cloneElement(child, _this.state.nodeProps);\n }), node.element);\n };\n return InPortal;\n}(React.PureComponent));\nvar OutPortal = /** @class */ (function (_super) {\n __extends(OutPortal, _super);\n function OutPortal(props) {\n var _this = _super.call(this, props) || this;\n _this.placeholderNode = React.createRef();\n _this.passPropsThroughPortal();\n return _this;\n }\n OutPortal.prototype.passPropsThroughPortal = function () {\n var propsForTarget = Object.assign({}, this.props, { node: undefined });\n this.props.node.setPortalProps(propsForTarget);\n };\n OutPortal.prototype.componentDidMount = function () {\n var node = this.props.node;\n this.currentPortalNode = node;\n var placeholder = this.placeholderNode.current;\n var parent = placeholder.parentNode;\n node.mount(parent, placeholder);\n this.passPropsThroughPortal();\n };\n OutPortal.prototype.componentDidUpdate = function () {\n // We re-mount on update, just in case we were unmounted (e.g. by\n // a second OutPortal, which has now been removed)\n var node = this.props.node;\n // If we're switching portal nodes, we need to clean up the current one first.\n if (this.currentPortalNode && node !== this.currentPortalNode) {\n this.currentPortalNode.unmount(this.placeholderNode.current);\n this.currentPortalNode.setPortalProps({});\n this.currentPortalNode = node;\n }\n var placeholder = this.placeholderNode.current;\n var parent = placeholder.parentNode;\n node.mount(parent, placeholder);\n this.passPropsThroughPortal();\n };\n OutPortal.prototype.componentWillUnmount = function () {\n var node = this.props.node;\n node.unmount(this.placeholderNode.current);\n node.setPortalProps({});\n };\n OutPortal.prototype.render = function () {\n // Render a placeholder to the DOM, so we can get a reference into\n // our location in the DOM, and swap it out for the portaled node.\n // A <div> placeholder works fine even for SVG.\n return React.createElement(\"div\", { ref: this.placeholderNode });\n };\n return OutPortal;\n}(React.PureComponent));\nvar createHtmlPortalNode = createPortalNode.bind(null, ELEMENT_TYPE_HTML);\nvar createSvgPortalNode = createPortalNode.bind(null, ELEMENT_TYPE_SVG);\nexport { createHtmlPortalNode, createSvgPortalNode, InPortal, OutPortal, };\n//# sourceMappingURL=index.js.map","import React from 'react';\nimport { createHtmlPortalNode, HtmlPortalNode } from 'react-reverse-portal';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { DefaultDisplayMode, PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerContextState } from 'libs/shared/context/player-context/interfaces/PlayerContextState';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { playerContextReducer } from 'libs/shared/context/player-context/reducer/PlayerContextReducer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nconst _THEATRE_MODE = 'play-page-theatre-mode';\n\nexport interface PlayerContextValues extends PlayerContextState {\n playerRef?: React.MutableRefObject<PlayerReference>;\n portalNode?: HtmlPortalNode;\n questionListPortalNode?: HtmlPortalNode;\n\n useInitialize?: (initializeData: PlayerInitializationData) => void;\n dispose?: () => void;\n setPlayerRef?: (player: any) => void;\n setPlayerMode?: (mode: PlayerMode) => void;\n setDefaultDisplayMode?: (displayMode: DefaultDisplayMode) => void;\n setStarted?: (started: boolean) => void;\n setPersist?: () => void;\n\n /**\n * Tells components if an instance of <PlayerContextProvider /> exists\n * above them in the tree. I.e. When this is used in curator.\n */\n hasProvider: boolean;\n}\n\nconst PlayerContext = React.createContext<PlayerContextValues>({ hasProvider: false });\n\nexport function usePlayerContext() {\n return React.useContext(PlayerContext);\n}\n\nfunction getInitialState(): PlayerContextState {\n const hasSavedTheatreMode = LocalStorageHelper.get(_THEATRE_MODE);\n\n return {\n defaultDisplayMode: hasSavedTheatreMode ? 'theatre' : 'normal'\n };\n}\n\nexport function PlayerContextProvider(props: React.PropsWithChildren) {\n const [ state, dispatch ] = React.useReducer(playerContextReducer, getInitialState());\n const { hasPreviewVideos } = useSettings(null);\n\n const playerRef = React.useRef<any>(null);\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(\n { attributes: { class: 'cv-theatre-mode-video-container' } }\n ), []);\n\n const questionListPortalNode = React.useMemo(createHtmlPortalNode, []);\n\n function setPlayerRef(player: PlayerReference) {\n playerRef.current = player;\n }\n\n function useInitialize(initializeData: PlayerInitializationData) {\n const enabled = hasPreviewVideos || initializeData.mode !== 'hover';\n\n React.useEffect(() => {\n if (!enabled)\n return;\n\n /**\n * Cannot initialize a hover player if we already have a player elsewhere.\n */\n if (initializeData.mode === 'hover' && state.mode)\n return;\n\n /**\n * No hover to play on interactives. This feature is ComingSoon™️ - Sha\n */\n if (initializeData.mode === 'hover' && initializeData.objectTypeId === MasterType.Interactive)\n return;\n\n dispatch({\n type: 'initialize',\n data: initializeData\n });\n\n return disposeInternal;\n }, []);\n }\n\n function setPlayerMode(mode: PlayerMode) {\n dispatch({ type: 'mode', data: { mode } });\n }\n\n function setDefaultDisplayMode(defaultDisplayMode: DefaultDisplayMode) {\n LocalStorageHelper.set(_THEATRE_MODE, defaultDisplayMode === 'theatre');\n\n dispatch({ type: 'defaultDisplayMode', data: { defaultDisplayMode } });\n }\n\n function setStarted(): void {\n dispatch({ type: 'started' });\n }\n\n function disposeInternal(force: boolean = false): void {\n if (force) {\n playerRef.current = null;\n }\n\n dispatch({ type: 'dispose', data: { force: force } });\n }\n\n function setPersist(): void {\n dispatch({ type: 'persist' });\n }\n\n /**\n * If anything external calls dispose, we ignore the persist flag and force a disposal\n */\n function dispose(): void {\n disposeInternal(true);\n }\n\n const playerContextValues: PlayerContextValues = {\n ...state,\n playerRef,\n setPlayerRef,\n portalNode,\n questionListPortalNode,\n useInitialize,\n setPlayerMode,\n setDefaultDisplayMode,\n setStarted,\n dispose,\n setPersist,\n hasProvider: true\n };\n\n return (\n <PlayerContext.Provider value={playerContextValues}>\n {props.children}\n </PlayerContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: {[key: string]: T } | null;\n isFetching: boolean;\n hasCompleted: 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, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length ?\n itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {}) :\n null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching,\n hasCompleted: responses.hasCompleted\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<TResponse, TObjects = string>(\n objs: TObjects[],\n getRequest: (items: TObjects[]) => Flight.Request,\n _getKey?: (obj: TObjects) => string\n) {\n const getKey = _getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const { fetchItems, ...data } = useGrowingBatchFetchFunc<TResponse, TObjects>({ getRequest, _getKey });\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n fetchItems(objs);\n }, [objs?.map(getKey).join(',')]);\n\n return data;\n}\n\ninterface UseGrowingBatchFetchFuncOptions<TObjects> {\n getRequest: (items: TObjects[]) => Flight.Request;\n _getKey?: (obj: TObjects) => string;\n}\n\n/**\n * When you need the useGrowingBatchFetch() behaviour, but need to trigger the\n * fetch manually and update the objects - Nish \n */\nexport function useGrowingBatchFetchFunc<TResponse, TObjects = string>(\n options: UseGrowingBatchFetchFuncOptions<TObjects>\n) {\n const getKey = options._getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n function fetchItems(objs: TObjects[]) {\n if (!objs?.length)\n return;\n\n const unfetchedItems: TObjects[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n \n setRequests(r => ([ ...r, ...ArrayHelper.chunk<TObjects>(unfetchedItems, CHUNK_SIZE).map(options.getRequest) ]));\n }\n\n const responses = Flight.useBasicFetchAll<TResponse[]>(requests);\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length ?\n itemsArr.reduce<Record<string, TResponse>>((acc, item) => ({ ...acc, [getKey(item)]: item }), {}) :\n null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching,\n fetchItems\n };\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Dr as e,H as t,N as n,at as r}from"./CrTgNROp.chunk.js";import{n as i}from"./CxNc1BDX.chunk.js";import{n as a}from"./Dwe-4MVf.chunk.js";import{t as o}from"./Dsv_eF8a.chunk.js";import{t as s}from"./BIVEB8w0.chunk.js";import{L as c,Q as l,R as u,Z as d,at as f,c as p,lt as m,o as h}from"./app-B1NVV4PT.js";import{t as g}from"./B0BRYUl5.chunk.js";import{t as _}from"./DNY9inGn2.chunk.js";var v=e(r(),1),y=n(),b=`reportsDefault.classroomSizeSelector`,x=10,S=40;function C(e){return(0,y.jsxs)(`div`,{className:i(`border rounded-3 p-3`,e.className),children:[(0,y.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeTitle`})}),(0,y.jsx)(`p`,{className:`text-secondary mb-3`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeDescription`})}),(0,y.jsx)(`label`,{className:`mb-1`,htmlFor:`classroomSize`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeLabel`})}),(0,y.jsx)(m.Range,{id:`classroomSize`,min:x,max:S,step:1,value:e.classroomSize,onChange:t=>e.onClassroomSizeChanged(Number(t.target.value))}),(0,y.jsxs)(`div`,{className:`d-flex justify-content-between small mb-2`,children:[(0,y.jsx)(`span`,{children:x}),(0,y.jsx)(`span`,{children:S})]}),(0,y.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeSummary`,options:{count:e.classroomSize}})})]})}var w=`reportsDefault.classroomViewsToggle`;function T(e){return(0,y.jsxs)(`div`,{className:i(`border rounded-3 p-3 d-flex align-items-center gap-3`,e.className),children:[(0,y.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,y.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,y.jsx)(a,{namespace:w,phrase:`title`})}),(0,y.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,y.jsx)(a,{namespace:w,phrase:`description`})})]}),(0,y.jsx)(l,{on:e.enabled,floatEnd:!1,onClick:()=>e.onEnabledChanged(!e.enabled)})]})}var E=`reportsDefault.schoolHoursSelector`,D=[6,7,8,9,10,11,12,13,14,15,16,17,18],O=p.getTimezones();function k(e){let[t,n]=v.useState(!1),r=e.startHour<e.endHour;return(0,y.jsxs)(`div`,{className:i(`border rounded-3 p-3`,e.className),children:[(0,y.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursTitle`})}),(0,y.jsx)(`p`,{className:`text-secondary mb-3`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursDescription`})}),(0,y.jsxs)(`div`,{className:`d-flex align-items-end gap-3 mb-2`,children:[(0,y.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,y.jsx)(`label`,{className:`small mb-1 d-block`,children:(0,y.jsx)(a,{namespace:E,phrase:`startTimeLabel`})}),(0,y.jsx)(`select`,{className:`form-select`,value:e.startHour,onChange:t=>e.onStartHourChanged(Number(t.target.value)),children:D.map(e=>(0,y.jsx)(`option`,{value:e,children:o.hourToFriendlyString(e)},e))})]}),(0,y.jsx)(`span`,{className:`pb-2`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursTo`})}),(0,y.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,y.jsx)(`label`,{className:`small mb-1 d-block`,children:(0,y.jsx)(a,{namespace:E,phrase:`endTimeLabel`})}),(0,y.jsx)(`select`,{className:`form-select`,value:e.endHour,onChange:t=>e.onEndHourChanged(Number(t.target.value)),children:D.map(e=>(0,y.jsx)(`option`,{value:e,children:o.hourToFriendlyString(e)},e))})]})]}),r?(0,y.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursSummary`,options:{startTime:o.hourToFriendlyString(e.startHour),endTime:o.hourToFriendlyString(e.endHour)}})}):(0,y.jsx)(`p`,{className:`text-danger mb-0`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursValidation`})}),(0,y.jsx)(`div`,{className:`mt-3`,children:t?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(`label`,{className:`mb-1 d-block`,children:(0,y.jsx)(a,{namespace:E,phrase:`timezoneLabel`})}),(0,y.jsx)(`select`,{className:`form-select`,value:e.timezone,onChange:t=>e.onTimezoneChanged(t.target.value),children:O.map(e=>(0,y.jsx)(`option`,{value:e,children:e},e))})]}):(0,y.jsxs)(`span`,{className:`text-secondary`,children:[(0,y.jsx)(a,{namespace:E,phrase:`timezoneCurrent`,options:{timezone:e.timezone}}),` — `,(0,y.jsx)(`button`,{className:`btn btn-link text-info p-0 align-baseline`,onClick:()=>n(!0),children:(0,y.jsx)(a,{namespace:E,phrase:`timezoneChange`})})]})})]})}var A=`reports.classroomViewsPopup`,j=s.encloseNamespace(A);function M(e){let n=h(t.ClassroomViewsPopup),{enableAlert:r}=_(n.hasClassroomViews),i=g(),s=o.timeStringToHour(n.schoolStartTime),l=o.timeStringToHour(n.schoolEndTime),[p,m]=v.useState(n.hasClassroomViews),[b,x]=v.useState(n.classroomSize),[S,w]=v.useState(n.timezone),[E,D]=v.useState(s),[O,M]=v.useState(l),[N,P]=v.useState(!1),F=!p||E<O&&S,I=p!==n.hasClassroomViews||b!==n.classroomSize||S!==n.timezone||E!==s||O!==l;async function L(){try{P(!0),await n.updateSettingsAsync({hasClassroomViews:p,schoolStartTime:o.hourToTimeString(E),schoolEndTime:o.hourToTimeString(O),timezone:S,classroomSize:b}),i.success(j(`success`)),p||r(),e.closePopup()}catch{i.error(j(`error`))}finally{P(!1)}}return(0,y.jsxs)(f,{closePopup:e.closePopup,title:j(`title`),size:`lg`,children:[(0,y.jsx)(`p`,{children:(0,y.jsx)(a,{namespace:A,phrase:`description1`})}),(0,y.jsx)(`p`,{children:(0,y.jsx)(a,{namespace:A,phrase:`description2`})}),(0,y.jsx)(T,{className:`my-3`,enabled:p,onEnabledChanged:m}),p&&(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(C,{className:`mb-3`,classroomSize:b,onClassroomSizeChanged:x}),(0,y.jsx)(k,{className:`mb-3`,startHour:E,endHour:O,timezone:S,onStartHourChanged:D,onEndHourChanged:M,onTimezoneChanged:w})]}),(0,y.jsxs)(d,{className:`justify-content-between`,children:[(0,y.jsx)(`a`,{href:c.getLiteArticle(u.ClassroomViews),target:`_blank`,rel:`noopener noreferrer`,className:`text-info`,children:(0,y.jsx)(a,{namespace:A,phrase:`learnMore`})}),(0,y.jsxs)(`div`,{className:`d-flex`,children:[(0,y.jsx)(d.Cancel,{onClick:e.closePopup,text:j(`close`)}),(0,y.jsx)(d.Submit,{onClick:L,text:j(`save`),showSpinner:N,variant:`dark`,disabled:!F||!I})]})]})]})}export{M as ClassroomViewsPopupView};
2
- //# sourceMappingURL=DbSzdDBS2.chunk.js.map
1
+ import{Dr as e,H as t,N as n,at as r}from"./CrTgNROp.chunk.js";import{n as i}from"./CxNc1BDX.chunk.js";import{n as a}from"./Dwe-4MVf.chunk.js";import{t as o}from"./Dsv_eF8a.chunk.js";import{t as s}from"./BIVEB8w0.chunk.js";import{L as c,Q as l,R as u,Z as d,at as f,c as p,lt as m,o as h}from"./app-F8o5al1q.js";import{t as g}from"./B0BRYUl5.chunk.js";import{t as _}from"./DBpZNnAI2.chunk.js";var v=e(r(),1),y=n(),b=`reportsDefault.classroomSizeSelector`,x=10,S=40;function C(e){return(0,y.jsxs)(`div`,{className:i(`border rounded-3 p-3`,e.className),children:[(0,y.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeTitle`})}),(0,y.jsx)(`p`,{className:`text-secondary mb-3`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeDescription`})}),(0,y.jsx)(`label`,{className:`mb-1`,htmlFor:`classroomSize`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeLabel`})}),(0,y.jsx)(m.Range,{id:`classroomSize`,min:x,max:S,step:1,value:e.classroomSize,onChange:t=>e.onClassroomSizeChanged(Number(t.target.value))}),(0,y.jsxs)(`div`,{className:`d-flex justify-content-between small mb-2`,children:[(0,y.jsx)(`span`,{children:x}),(0,y.jsx)(`span`,{children:S})]}),(0,y.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,y.jsx)(a,{namespace:b,phrase:`classroomSizeSummary`,options:{count:e.classroomSize}})})]})}var w=`reportsDefault.classroomViewsToggle`;function T(e){return(0,y.jsxs)(`div`,{className:i(`border rounded-3 p-3 d-flex align-items-center gap-3`,e.className),children:[(0,y.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,y.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,y.jsx)(a,{namespace:w,phrase:`title`})}),(0,y.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,y.jsx)(a,{namespace:w,phrase:`description`})})]}),(0,y.jsx)(l,{on:e.enabled,floatEnd:!1,onClick:()=>e.onEnabledChanged(!e.enabled)})]})}var E=`reportsDefault.schoolHoursSelector`,D=[6,7,8,9,10,11,12,13,14,15,16,17,18],O=p.getTimezones();function k(e){let[t,n]=v.useState(!1),r=e.startHour<e.endHour;return(0,y.jsxs)(`div`,{className:i(`border rounded-3 p-3`,e.className),children:[(0,y.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursTitle`})}),(0,y.jsx)(`p`,{className:`text-secondary mb-3`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursDescription`})}),(0,y.jsxs)(`div`,{className:`d-flex align-items-end gap-3 mb-2`,children:[(0,y.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,y.jsx)(`label`,{className:`small mb-1 d-block`,children:(0,y.jsx)(a,{namespace:E,phrase:`startTimeLabel`})}),(0,y.jsx)(`select`,{className:`form-select`,value:e.startHour,onChange:t=>e.onStartHourChanged(Number(t.target.value)),children:D.map(e=>(0,y.jsx)(`option`,{value:e,children:o.hourToFriendlyString(e)},e))})]}),(0,y.jsx)(`span`,{className:`pb-2`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursTo`})}),(0,y.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,y.jsx)(`label`,{className:`small mb-1 d-block`,children:(0,y.jsx)(a,{namespace:E,phrase:`endTimeLabel`})}),(0,y.jsx)(`select`,{className:`form-select`,value:e.endHour,onChange:t=>e.onEndHourChanged(Number(t.target.value)),children:D.map(e=>(0,y.jsx)(`option`,{value:e,children:o.hourToFriendlyString(e)},e))})]})]}),r?(0,y.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursSummary`,options:{startTime:o.hourToFriendlyString(e.startHour),endTime:o.hourToFriendlyString(e.endHour)}})}):(0,y.jsx)(`p`,{className:`text-danger mb-0`,children:(0,y.jsx)(a,{namespace:E,phrase:`schoolHoursValidation`})}),(0,y.jsx)(`div`,{className:`mt-3`,children:t?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(`label`,{className:`mb-1 d-block`,children:(0,y.jsx)(a,{namespace:E,phrase:`timezoneLabel`})}),(0,y.jsx)(`select`,{className:`form-select`,value:e.timezone,onChange:t=>e.onTimezoneChanged(t.target.value),children:O.map(e=>(0,y.jsx)(`option`,{value:e,children:e},e))})]}):(0,y.jsxs)(`span`,{className:`text-secondary`,children:[(0,y.jsx)(a,{namespace:E,phrase:`timezoneCurrent`,options:{timezone:e.timezone}}),` — `,(0,y.jsx)(`button`,{className:`btn btn-link text-info p-0 align-baseline`,onClick:()=>n(!0),children:(0,y.jsx)(a,{namespace:E,phrase:`timezoneChange`})})]})})]})}var A=`reports.classroomViewsPopup`,j=s.encloseNamespace(A);function M(e){let n=h(t.ClassroomViewsPopup),{enableAlert:r}=_(n.hasClassroomViews),i=g(),s=o.timeStringToHour(n.schoolStartTime),l=o.timeStringToHour(n.schoolEndTime),[p,m]=v.useState(n.hasClassroomViews),[b,x]=v.useState(n.classroomSize),[S,w]=v.useState(n.timezone),[E,D]=v.useState(s),[O,M]=v.useState(l),[N,P]=v.useState(!1),F=!p||E<O&&S,I=p!==n.hasClassroomViews||b!==n.classroomSize||S!==n.timezone||E!==s||O!==l;async function L(){try{P(!0),await n.updateSettingsAsync({hasClassroomViews:p,schoolStartTime:o.hourToTimeString(E),schoolEndTime:o.hourToTimeString(O),timezone:S,classroomSize:b}),i.success(j(`success`)),p||r(),e.closePopup()}catch{i.error(j(`error`))}finally{P(!1)}}return(0,y.jsxs)(f,{closePopup:e.closePopup,title:j(`title`),size:`lg`,children:[(0,y.jsx)(`p`,{children:(0,y.jsx)(a,{namespace:A,phrase:`description1`})}),(0,y.jsx)(`p`,{children:(0,y.jsx)(a,{namespace:A,phrase:`description2`})}),(0,y.jsx)(T,{className:`my-3`,enabled:p,onEnabledChanged:m}),p&&(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(C,{className:`mb-3`,classroomSize:b,onClassroomSizeChanged:x}),(0,y.jsx)(k,{className:`mb-3`,startHour:E,endHour:O,timezone:S,onStartHourChanged:D,onEndHourChanged:M,onTimezoneChanged:w})]}),(0,y.jsxs)(d,{className:`justify-content-between`,children:[(0,y.jsx)(`a`,{href:c.getLiteArticle(u.ClassroomViews),target:`_blank`,rel:`noopener noreferrer`,className:`text-info`,children:(0,y.jsx)(a,{namespace:A,phrase:`learnMore`})}),(0,y.jsxs)(`div`,{className:`d-flex`,children:[(0,y.jsx)(d.Cancel,{onClick:e.closePopup,text:j(`close`)}),(0,y.jsx)(d.Submit,{onClick:L,text:j(`save`),showSpinner:N,variant:`dark`,disabled:!F||!I})]})]})]})}export{M as ClassroomViewsPopupView};
2
+ //# sourceMappingURL=C5nG9HKq2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DbSzdDBS2.chunk.js","names":[],"sources":["../../src/apps/default/views/classroom-views-popup/components/classroom-size-selector/ClassroomSizeSelector.tsx","../../src/apps/default/views/classroom-views-popup/components/classroom-views-toggle/ClassroomViewsToggle.tsx","../../src/apps/default/views/classroom-views-popup/components/school-hours-selector/SchoolHoursSelector.tsx","../../src/apps/default/views/classroom-views-popup/ClassroomViewsPopupView.tsx"],"sourcesContent":["import React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.classroomSizeSelector';\n\nconst MIN_CLASSROOM_SIZE = 10;\nconst MAX_CLASSROOM_SIZE = 40;\n\ninterface ClassroomSizeSelectorProps {\n className?: string;\n classroomSize: number;\n onClassroomSizeChanged: (size: number) => void;\n}\n\nexport function ClassroomSizeSelector(props: ClassroomSizeSelectorProps) {\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='classroomSizeTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='classroomSizeDescription' /></p>\n\n <label className='mb-1' htmlFor='classroomSize'><Text namespace={namespace} phrase='classroomSizeLabel' /></label>\n\n <Form.Range\n id='classroomSize'\n min={MIN_CLASSROOM_SIZE}\n max={MAX_CLASSROOM_SIZE}\n step={1}\n value={props.classroomSize}\n onChange={e => props.onClassroomSizeChanged(Number(e.target.value))}\n />\n <div className='d-flex justify-content-between small mb-2'>\n <span>{MIN_CLASSROOM_SIZE}</span>\n <span>{MAX_CLASSROOM_SIZE}</span>\n </div>\n\n <p className='text-secondary mb-0'>\n <Text namespace={namespace} phrase='classroomSizeSummary' options={{ count: props.classroomSize }} />\n </p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nconst namespace = 'reportsDefault.classroomViewsToggle';\n\ninterface ClassroomViewsToggleProps {\n className?: string;\n enabled: boolean;\n onEnabledChanged: (enabled: boolean) => void;\n}\n\nexport function ClassroomViewsToggle(props: ClassroomViewsToggleProps) {\n return (\n <div className={classNames('border rounded-3 p-3 d-flex align-items-center gap-3', props.className)}>\n <div className='flex-grow-1'>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='title' /></h3>\n <p className='text-secondary mb-0'><Text namespace={namespace} phrase='description' /></p>\n </div>\n\n <ToggleSwitch\n on={props.enabled}\n floatEnd={false}\n onClick={() => props.onEnabledChanged(!props.enabled)}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.schoolHoursSelector';\n\nconst SCHOOL_HOURS = [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ];\nconst ALL_TIMEZONES = TimezoneHelper.getTimezones();\n\ninterface SchoolHoursSelectorProps {\n className?: string;\n startHour: number;\n endHour: number;\n timezone: string;\n onStartHourChanged: (hour: number) => void;\n onEndHourChanged: (hour: number) => void;\n onTimezoneChanged: (tz: string) => void;\n}\n\nexport function SchoolHoursSelector(props: SchoolHoursSelectorProps) {\n const [ showTimezoneSelect, setShowTimezoneSelect ] = React.useState(false);\n\n const isTimeRangeValid = props.startHour < props.endHour;\n\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='schoolHoursTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='schoolHoursDescription' /></p>\n\n <div className='d-flex align-items-end gap-3 mb-2'>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='startTimeLabel' /></label>\n <select\n className='form-select'\n value={props.startHour}\n onChange={e => props.onStartHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n <span className='pb-2'><Text namespace={namespace} phrase='schoolHoursTo' /></span>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='endTimeLabel' /></label>\n <select\n className='form-select'\n value={props.endHour}\n onChange={e => props.onEndHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n </div>\n\n {isTimeRangeValid ? (\n <p className='text-secondary mb-0'>\n <Text\n namespace={namespace}\n phrase='schoolHoursSummary'\n options={{\n startTime: DateHelper.hourToFriendlyString(props.startHour),\n endTime: DateHelper.hourToFriendlyString(props.endHour)\n }}\n />\n </p>\n ) : (\n <p className='text-danger mb-0'>\n <Text namespace={namespace} phrase='schoolHoursValidation' />\n </p>\n )}\n\n <div className='mt-3'>\n {showTimezoneSelect ? (\n <>\n <label className='mb-1 d-block'><Text namespace={namespace} phrase='timezoneLabel' /></label>\n <select className='form-select' value={props.timezone} onChange={e => props.onTimezoneChanged(e.target.value)}>\n {ALL_TIMEZONES.map(tz => (\n <option key={tz} value={tz}>{tz}</option>\n ))}\n </select>\n </>\n ) : (\n <span className='text-secondary'>\n <Text namespace={namespace} phrase='timezoneCurrent' options={{ timezone: props.timezone }} />\n {' — '}\n <button className='btn btn-link text-info p-0 align-baseline' onClick={() => setShowTimezoneSelect(true)}>\n <Text namespace={namespace} phrase='timezoneChange' />\n </button>\n </span>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { useClassroomViewsAlert } from 'shared/hooks/useClassroomViewsAlert';\nimport { useClassroomViewsSettings } from 'shared/hooks/useClassroomViewsSettings';\n\nimport { ClassroomSizeSelector } from './components/classroom-size-selector/ClassroomSizeSelector';\nimport { ClassroomViewsToggle } from './components/classroom-views-toggle/ClassroomViewsToggle';\nimport { SchoolHoursSelector } from './components/school-hours-selector/SchoolHoursSelector';\n\nconst namespace = 'reports.classroomViewsPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function ClassroomViewsPopupView(props: PopupViewProps): JSX.Element {\n const classroomViewsSettings = useClassroomViewsSettings(LocationContext.ClassroomViewsPopup);\n const { enableAlert } = useClassroomViewsAlert(classroomViewsSettings.hasClassroomViews);\n const alerts = useAlerts();\n\n const initialStartHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolStartTime);\n const initialEndHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolEndTime);\n \n const [ hasClassroomViews, setHasClassroomViews ] = React.useState(classroomViewsSettings.hasClassroomViews);\n const [ classroomSize, setClassroomSize ] = React.useState(classroomViewsSettings.classroomSize);\n const [ timezone, setTimezone ] = React.useState(classroomViewsSettings.timezone);\n const [ schoolStartHour, setSchoolStartHour ] = React.useState(initialStartHour);\n const [ schoolEndHour, setSchoolEndHour ] = React.useState(initialEndHour);\n const [ isSaving, setIsSaving ] = React.useState(false);\n\n const isFormValid = hasClassroomViews ? (schoolStartHour < schoolEndHour && timezone) : true;\n const isDirty = hasClassroomViews !== classroomViewsSettings.hasClassroomViews\n || classroomSize !== classroomViewsSettings.classroomSize\n || timezone !== classroomViewsSettings.timezone\n || schoolStartHour !== initialStartHour\n || schoolEndHour !== initialEndHour;\n\n async function onSave() {\n try {\n setIsSaving(true);\n \n await classroomViewsSettings.updateSettingsAsync({\n hasClassroomViews,\n schoolStartTime: DateHelper.hourToTimeString(schoolStartHour),\n schoolEndTime: DateHelper.hourToTimeString(schoolEndHour),\n timezone,\n classroomSize\n });\n \n alerts.success(getPhrase('success'));\n\n // We re-enable the alert if the user has just turned off Classroom Views, \n // to give them a reminder about the feature and how to turn it back on..\n if (!hasClassroomViews)\n enableAlert();\n \n props.closePopup();\n } catch {\n alerts.error(getPhrase('error'));\n } finally {\n setIsSaving(false);\n }\n }\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={getPhrase('title')}\n size='lg'\n >\n <p><Text namespace={namespace} phrase='description1' /></p>\n <p><Text namespace={namespace} phrase='description2' /></p>\n\n <ClassroomViewsToggle\n className='my-3'\n enabled={hasClassroomViews}\n onEnabledChanged={setHasClassroomViews}\n />\n\n {hasClassroomViews && (\n <>\n <ClassroomSizeSelector\n className='mb-3'\n classroomSize={classroomSize}\n onClassroomSizeChanged={setClassroomSize}\n />\n\n <SchoolHoursSelector\n className='mb-3'\n startHour={schoolStartHour}\n endHour={schoolEndHour}\n timezone={timezone}\n onStartHourChanged={setSchoolStartHour}\n onEndHourChanged={setSchoolEndHour}\n onTimezoneChanged={setTimezone}\n />\n </>\n )}\n\n <PopupButtons className='justify-content-between'>\n <a href={ArticleHelper.getLiteArticle(LiteSupportArticle.ClassroomViews)} target='_blank' rel='noopener noreferrer' className='text-info'>\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n <div className='d-flex'>\n <PopupButtons.Cancel onClick={props.closePopup} text={getPhrase('close')} />\n <PopupButtons.Submit onClick={onSave} text={getPhrase('save')} showSpinner={isSaving} variant='dark' disabled={!isFormValid || !isDirty} />\n </div>\n </PopupButtons>\n </Popup>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"C5nG9HKq2.chunk.js","names":[],"sources":["../../src/apps/default/views/classroom-views-popup/components/classroom-size-selector/ClassroomSizeSelector.tsx","../../src/apps/default/views/classroom-views-popup/components/classroom-views-toggle/ClassroomViewsToggle.tsx","../../src/apps/default/views/classroom-views-popup/components/school-hours-selector/SchoolHoursSelector.tsx","../../src/apps/default/views/classroom-views-popup/ClassroomViewsPopupView.tsx"],"sourcesContent":["import React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.classroomSizeSelector';\n\nconst MIN_CLASSROOM_SIZE = 10;\nconst MAX_CLASSROOM_SIZE = 40;\n\ninterface ClassroomSizeSelectorProps {\n className?: string;\n classroomSize: number;\n onClassroomSizeChanged: (size: number) => void;\n}\n\nexport function ClassroomSizeSelector(props: ClassroomSizeSelectorProps) {\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='classroomSizeTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='classroomSizeDescription' /></p>\n\n <label className='mb-1' htmlFor='classroomSize'><Text namespace={namespace} phrase='classroomSizeLabel' /></label>\n\n <Form.Range\n id='classroomSize'\n min={MIN_CLASSROOM_SIZE}\n max={MAX_CLASSROOM_SIZE}\n step={1}\n value={props.classroomSize}\n onChange={e => props.onClassroomSizeChanged(Number(e.target.value))}\n />\n <div className='d-flex justify-content-between small mb-2'>\n <span>{MIN_CLASSROOM_SIZE}</span>\n <span>{MAX_CLASSROOM_SIZE}</span>\n </div>\n\n <p className='text-secondary mb-0'>\n <Text namespace={namespace} phrase='classroomSizeSummary' options={{ count: props.classroomSize }} />\n </p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nconst namespace = 'reportsDefault.classroomViewsToggle';\n\ninterface ClassroomViewsToggleProps {\n className?: string;\n enabled: boolean;\n onEnabledChanged: (enabled: boolean) => void;\n}\n\nexport function ClassroomViewsToggle(props: ClassroomViewsToggleProps) {\n return (\n <div className={classNames('border rounded-3 p-3 d-flex align-items-center gap-3', props.className)}>\n <div className='flex-grow-1'>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='title' /></h3>\n <p className='text-secondary mb-0'><Text namespace={namespace} phrase='description' /></p>\n </div>\n\n <ToggleSwitch\n on={props.enabled}\n floatEnd={false}\n onClick={() => props.onEnabledChanged(!props.enabled)}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.schoolHoursSelector';\n\nconst SCHOOL_HOURS = [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ];\nconst ALL_TIMEZONES = TimezoneHelper.getTimezones();\n\ninterface SchoolHoursSelectorProps {\n className?: string;\n startHour: number;\n endHour: number;\n timezone: string;\n onStartHourChanged: (hour: number) => void;\n onEndHourChanged: (hour: number) => void;\n onTimezoneChanged: (tz: string) => void;\n}\n\nexport function SchoolHoursSelector(props: SchoolHoursSelectorProps) {\n const [ showTimezoneSelect, setShowTimezoneSelect ] = React.useState(false);\n\n const isTimeRangeValid = props.startHour < props.endHour;\n\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='schoolHoursTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='schoolHoursDescription' /></p>\n\n <div className='d-flex align-items-end gap-3 mb-2'>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='startTimeLabel' /></label>\n <select\n className='form-select'\n value={props.startHour}\n onChange={e => props.onStartHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n <span className='pb-2'><Text namespace={namespace} phrase='schoolHoursTo' /></span>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='endTimeLabel' /></label>\n <select\n className='form-select'\n value={props.endHour}\n onChange={e => props.onEndHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n </div>\n\n {isTimeRangeValid ? (\n <p className='text-secondary mb-0'>\n <Text\n namespace={namespace}\n phrase='schoolHoursSummary'\n options={{\n startTime: DateHelper.hourToFriendlyString(props.startHour),\n endTime: DateHelper.hourToFriendlyString(props.endHour)\n }}\n />\n </p>\n ) : (\n <p className='text-danger mb-0'>\n <Text namespace={namespace} phrase='schoolHoursValidation' />\n </p>\n )}\n\n <div className='mt-3'>\n {showTimezoneSelect ? (\n <>\n <label className='mb-1 d-block'><Text namespace={namespace} phrase='timezoneLabel' /></label>\n <select className='form-select' value={props.timezone} onChange={e => props.onTimezoneChanged(e.target.value)}>\n {ALL_TIMEZONES.map(tz => (\n <option key={tz} value={tz}>{tz}</option>\n ))}\n </select>\n </>\n ) : (\n <span className='text-secondary'>\n <Text namespace={namespace} phrase='timezoneCurrent' options={{ timezone: props.timezone }} />\n {' — '}\n <button className='btn btn-link text-info p-0 align-baseline' onClick={() => setShowTimezoneSelect(true)}>\n <Text namespace={namespace} phrase='timezoneChange' />\n </button>\n </span>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { useClassroomViewsAlert } from 'shared/hooks/useClassroomViewsAlert';\nimport { useClassroomViewsSettings } from 'shared/hooks/useClassroomViewsSettings';\n\nimport { ClassroomSizeSelector } from './components/classroom-size-selector/ClassroomSizeSelector';\nimport { ClassroomViewsToggle } from './components/classroom-views-toggle/ClassroomViewsToggle';\nimport { SchoolHoursSelector } from './components/school-hours-selector/SchoolHoursSelector';\n\nconst namespace = 'reports.classroomViewsPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function ClassroomViewsPopupView(props: PopupViewProps): JSX.Element {\n const classroomViewsSettings = useClassroomViewsSettings(LocationContext.ClassroomViewsPopup);\n const { enableAlert } = useClassroomViewsAlert(classroomViewsSettings.hasClassroomViews);\n const alerts = useAlerts();\n\n const initialStartHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolStartTime);\n const initialEndHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolEndTime);\n \n const [ hasClassroomViews, setHasClassroomViews ] = React.useState(classroomViewsSettings.hasClassroomViews);\n const [ classroomSize, setClassroomSize ] = React.useState(classroomViewsSettings.classroomSize);\n const [ timezone, setTimezone ] = React.useState(classroomViewsSettings.timezone);\n const [ schoolStartHour, setSchoolStartHour ] = React.useState(initialStartHour);\n const [ schoolEndHour, setSchoolEndHour ] = React.useState(initialEndHour);\n const [ isSaving, setIsSaving ] = React.useState(false);\n\n const isFormValid = hasClassroomViews ? (schoolStartHour < schoolEndHour && timezone) : true;\n const isDirty = hasClassroomViews !== classroomViewsSettings.hasClassroomViews\n || classroomSize !== classroomViewsSettings.classroomSize\n || timezone !== classroomViewsSettings.timezone\n || schoolStartHour !== initialStartHour\n || schoolEndHour !== initialEndHour;\n\n async function onSave() {\n try {\n setIsSaving(true);\n \n await classroomViewsSettings.updateSettingsAsync({\n hasClassroomViews,\n schoolStartTime: DateHelper.hourToTimeString(schoolStartHour),\n schoolEndTime: DateHelper.hourToTimeString(schoolEndHour),\n timezone,\n classroomSize\n });\n \n alerts.success(getPhrase('success'));\n\n // We re-enable the alert if the user has just turned off Classroom Views, \n // to give them a reminder about the feature and how to turn it back on..\n if (!hasClassroomViews)\n enableAlert();\n \n props.closePopup();\n } catch {\n alerts.error(getPhrase('error'));\n } finally {\n setIsSaving(false);\n }\n }\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={getPhrase('title')}\n size='lg'\n >\n <p><Text namespace={namespace} phrase='description1' /></p>\n <p><Text namespace={namespace} phrase='description2' /></p>\n\n <ClassroomViewsToggle\n className='my-3'\n enabled={hasClassroomViews}\n onEnabledChanged={setHasClassroomViews}\n />\n\n {hasClassroomViews && (\n <>\n <ClassroomSizeSelector\n className='mb-3'\n classroomSize={classroomSize}\n onClassroomSizeChanged={setClassroomSize}\n />\n\n <SchoolHoursSelector\n className='mb-3'\n startHour={schoolStartHour}\n endHour={schoolEndHour}\n timezone={timezone}\n onStartHourChanged={setSchoolStartHour}\n onEndHourChanged={setSchoolEndHour}\n onTimezoneChanged={setTimezone}\n />\n </>\n )}\n\n <PopupButtons className='justify-content-between'>\n <a href={ArticleHelper.getLiteArticle(LiteSupportArticle.ClassroomViews)} target='_blank' rel='noopener noreferrer' className='text-info'>\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n <div className='d-flex'>\n <PopupButtons.Cancel onClick={props.closePopup} text={getPhrase('close')} />\n <PopupButtons.Submit onClick={onSave} text={getPhrase('save')} showSpinner={isSaving} variant='dark' disabled={!isFormValid || !isDirty} />\n </div>\n </PopupButtons>\n </Popup>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{N as e,P as t,at as n}from"./CrTgNROp.chunk.js";import{x as r}from"./CxNc1BDX.chunk.js";import{t as i}from"./o2slFZEB.chunk.js";import{at as a}from"./app-B1NVV4PT.js";n();var o=e();function s(e){let n=e.buttons.map(t=>({buttonText:t.text,className:t.className,onClick:()=>{t.success?r.isFunction(e.onDone)&&e.onDone():r.isFunction(e.onFail)&&e.onFail(),e.closePopup()},type:t.type,close:t.close}));return n=i.sortBy(n,`close`),(0,o.jsxs)(a,{title:e.title,closePopup:e.closePopup,children:[(0,o.jsx)(`p`,{dangerouslySetInnerHTML:{__html:t.sanitize(e.text)}}),(0,o.jsx)(`div`,{className:`d-flex justify-content-end border-top pt-3 px-3 mx-n3`,children:n.map((e,t)=>(0,o.jsx)(`button`,{className:e.className,onClick:e.onClick,type:e.type,children:e.buttonText},t))})]})}export{s as DialogView};
2
- //# sourceMappingURL=4ViYfbV7.chunk.js.map
1
+ import{N as e,P as t,at as n}from"./CrTgNROp.chunk.js";import{x as r}from"./CxNc1BDX.chunk.js";import{t as i}from"./o2slFZEB.chunk.js";import{at as a}from"./app-F8o5al1q.js";n();var o=e();function s(e){let n=e.buttons.map(t=>({buttonText:t.text,className:t.className,onClick:()=>{t.success?r.isFunction(e.onDone)&&e.onDone():r.isFunction(e.onFail)&&e.onFail(),e.closePopup()},type:t.type,close:t.close}));return n=i.sortBy(n,`close`),(0,o.jsxs)(a,{title:e.title,closePopup:e.closePopup,children:[(0,o.jsx)(`p`,{dangerouslySetInnerHTML:{__html:t.sanitize(e.text)}}),(0,o.jsx)(`div`,{className:`d-flex justify-content-end border-top pt-3 px-3 mx-n3`,children:n.map((e,t)=>(0,o.jsx)(`button`,{className:e.className,onClick:e.onClick,type:e.type,children:e.buttonText},t))})]})}export{s as DialogView};
2
+ //# sourceMappingURL=CCdxPE8F.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"4ViYfbV7.chunk.js","names":[],"sources":["../../../../libs/shared/src/views/dialog/DialogView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { DialogOptions, PopupViewProps } from 'libs/shared/interfaces';\n\ninterface DialogViewProps extends DialogOptions {\n onDone?: () => void;\n onFail?: () => void;\n}\n\ntype PropTypes = React.PropsWithChildren<DialogViewProps & PopupViewProps>;\n\nexport function DialogView(props: PropTypes): React.ReactElement {\n let buttons = props.buttons.map(b => {\n const onClick = () => {\n if (b.success)\n FunctionHelper.isFunction(props.onDone) && props.onDone();\n else\n FunctionHelper.isFunction(props.onFail) && props.onFail();\n\n props.closePopup();\n };\n\n return {\n buttonText: b.text,\n className: b.className,\n onClick,\n type: b.type,\n close: b.close\n };\n });\n\n /**\n * The dismiss action should always be on the left side of the popup\n */\n buttons = ArrayHelper.sortBy(buttons, 'close');\n\n return (\n <Popup title={props.title} closePopup={props.closePopup}>\n <p dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(props.text) }} />\n <div className='d-flex justify-content-end border-top pt-3 px-3 mx-n3'>\n {buttons.map((b, idx) => (\n <button key={idx} className={b.className} onClick={b.onClick} type={b.type}>\n {b.buttonText}\n </button>\n ))}\n </div>\n </Popup>\n );\n}\n"],"mappings":"4LAgBA,SAAgB,EAAW,EAAsC,CAC/D,IAAI,EAAU,EAAM,QAAQ,IAAI,IAUvB,CACL,WAAY,EAAE,KACd,UAAW,EAAE,UACb,YAZoB,CAChB,EAAE,QACJ,EAAe,WAAW,EAAM,MAAM,GAAK,EAAM,OAAO,EAExD,EAAe,WAAW,EAAM,MAAM,GAAK,EAAM,OAAO,EAE1D,EAAM,WAAW,CACnB,EAME,KAAM,EAAE,KACR,MAAO,EAAE,KACX,EACD,EAOD,MAFA,GAAU,EAAY,OAAO,EAAS,OAAO,GAG3C,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,MAAO,EAAM,MAAO,WAAY,EAAM,oBAA7C,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,wBAAyB,CAAE,OAAQ,EAAW,SAAS,EAAM,IAAI,CAAE,CAAI,CAAA,GAC1E,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iEACZ,EAAQ,KAAK,EAAG,KACf,EAAA,EAAA,IAAA,CAAC,SAAD,CAAkB,UAAW,EAAE,UAAW,QAAS,EAAE,QAAS,KAAM,EAAE,cACnE,EAAE,UACG,EAFK,CAEL,CACT,CACE,CAAA,CACA,GAEX"}
1
+ {"version":3,"file":"CCdxPE8F.chunk.js","names":[],"sources":["../../../../libs/shared/src/views/dialog/DialogView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { DialogOptions, PopupViewProps } from 'libs/shared/interfaces';\n\ninterface DialogViewProps extends DialogOptions {\n onDone?: () => void;\n onFail?: () => void;\n}\n\ntype PropTypes = React.PropsWithChildren<DialogViewProps & PopupViewProps>;\n\nexport function DialogView(props: PropTypes): React.ReactElement {\n let buttons = props.buttons.map(b => {\n const onClick = () => {\n if (b.success)\n FunctionHelper.isFunction(props.onDone) && props.onDone();\n else\n FunctionHelper.isFunction(props.onFail) && props.onFail();\n\n props.closePopup();\n };\n\n return {\n buttonText: b.text,\n className: b.className,\n onClick,\n type: b.type,\n close: b.close\n };\n });\n\n /**\n * The dismiss action should always be on the left side of the popup\n */\n buttons = ArrayHelper.sortBy(buttons, 'close');\n\n return (\n <Popup title={props.title} closePopup={props.closePopup}>\n <p dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(props.text) }} />\n <div className='d-flex justify-content-end border-top pt-3 px-3 mx-n3'>\n {buttons.map((b, idx) => (\n <button key={idx} className={b.className} onClick={b.onClick} type={b.type}>\n {b.buttonText}\n </button>\n ))}\n </div>\n </Popup>\n );\n}\n"],"mappings":"4LAgBA,SAAgB,EAAW,EAAsC,CAC/D,IAAI,EAAU,EAAM,QAAQ,IAAI,IAUvB,CACL,WAAY,EAAE,KACd,UAAW,EAAE,UACb,YAZoB,CAChB,EAAE,QACJ,EAAe,WAAW,EAAM,MAAM,GAAK,EAAM,OAAO,EAExD,EAAe,WAAW,EAAM,MAAM,GAAK,EAAM,OAAO,EAE1D,EAAM,WAAW,CACnB,EAME,KAAM,EAAE,KACR,MAAO,EAAE,KACX,EACD,EAOD,MAFA,GAAU,EAAY,OAAO,EAAS,OAAO,GAG3C,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,MAAO,EAAM,MAAO,WAAY,EAAM,oBAA7C,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,wBAAyB,CAAE,OAAQ,EAAW,SAAS,EAAM,IAAI,CAAE,CAAI,CAAA,GAC1E,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iEACZ,EAAQ,KAAK,EAAG,KACf,EAAA,EAAA,IAAA,CAAC,SAAD,CAAkB,UAAW,EAAE,UAAW,QAAS,EAAE,QAAS,KAAM,EAAE,cACnE,EAAE,UACG,EAFK,CAEL,CACT,CACE,CAAA,CACA,GAEX"}
@@ -1,2 +1,2 @@
1
- import{Er as e,N as t,at as n,qt as r}from"./CrTgNROp.chunk.js";import{C as i,g as a,m as o,n as s,t as c}from"./Dwe-4MVf.chunk.js";import{t as l}from"./Dsv_eF8a.chunk.js";import{n as u}from"./28VvvkVW.chunk.js";import{t as d}from"./7dV7tXUX.chunk.js";import{t as f}from"./BIVEB8w0.chunk.js";import{Dt as p,Ot as m,Rt as h,Z as g,a as _,at as v,yt as y}from"./app-B1NVV4PT.js";import{t as b}from"./B0BRYUl5.chunk.js";n();var x=`shared.verifiedEmailError`,S=class extends y{constructor(e,t,n){super(`VerifiedEmailRequiredError`),this.message=e,this.liteUrl=t,this.hasLite=n}get name(){return`VerifiedEmailRequiredError`}get dialogOptions(){let e=u.safeUrlConcat(this.liteUrl,`settings/account`);return{title:f.getPhrase(x,`heading`),text:this.hasLite?`${this.message} ${f.getPhrase(x,`visitSettings`,{href:e})}`:this.message,buttons:[{text:f.getPhrase(x,`close`),className:`btn btn-dark`,success:!0}]}}},C=()=>{let e=o(o(d.currentUser()).data?.isAuthenticated&&p.userProducts()),t=!e.hasCompleted;return{hasProduct:n=>t||e.hasError||!e.data?.length?!1:e.data.some(e=>e.id===n),products:e,isLoadingProducts:t}};function w(){let e=b(),{hasProduct:t,isLoadingProducts:n}=C(),i=o(h.config());function a(n,a,o){if(!n.responseJSON||n.responseJSON?.type!==`no-email`){e.error(a);return}r.throw(new S(o,i.data.liteUrl,t(m.Primary)))}return{handleGenerateReportError:a,loading:!i.hasCompleted||n}}function T(e){return{dateRange:{start:e.start,end:e.end},offsetInMin:Math.abs(new Date().getTimezoneOffset())}}var E={videoViewsReport(e,t){return{url:`{gateway}/v1/analytics/video-views/reports`,key:`video:views:report`,type:i.POST,data:{...T(e),version:t},invalidationKeys:`export`,normalize:!1}},loginsReport(e,t,n,r){return{url:`{gateway}/v1/analytics/logins/reports`,key:`logins:report`,data:T(e),type:i.POST,normalize:!1,success:t,error:n,always:r}}},D=e({GenerateReportType:()=>N,GenerateReportView:()=>P,getReportFriendlyDate:()=>M}),O=t(),k=`reportsShared.generateReport`,A=f.encloseNamespace(k);function j(e){switch(e){case 0:return`loginsDescription`;case 1:return`videosDescription`;default:return``}}function M(e){let t=l.convertUTCToLocal(e).toString();return l.format(t,`Do MMMM YYYY`)}var N=function(e){return e[e.Logins=0]=`Logins`,e[e.VideoViews=1]=`VideoViews`,e}({});function P(e){let t=_(`video-views`),n=_(`logins`),r=e.type===1?t:n,i=b(),{loading:o,handleGenerateReportError:l}=w(),u=a();function d(){switch(e.type){case 0:return E.loginsReport(n);case 1:return E.videoViewsReport(t,`v3`);default:return null}}function f(){u(d()).then(()=>i.success(A(`success`))).catch(e=>l(e,A(`error`),A(`noEmailError`))).finally(e.closePopup)}return(0,O.jsx)(c.Provider,{value:k,children:(0,O.jsxs)(v,{title:A(`title`),showLoadingSpinner:o,closePopup:e.closePopup,children:[(0,O.jsx)(`p`,{children:(0,O.jsx)(s,{phrase:j(e.type)})}),(0,O.jsx)(`p`,{children:(0,O.jsx)(s,{phrase:`dateRange`,options:{dateFrom:M(r.start),dateTo:M(r.end)}})}),(0,O.jsx)(`p`,{children:(0,O.jsx)(s,{phrase:`emailDescription`})}),(0,O.jsxs)(g,{children:[(0,O.jsx)(g.Cancel,{onClick:e.closePopup}),(0,O.jsx)(g.Submit,{variant:`dark`,onClick:f,text:A(`generateReport`)})]})]})})}export{D as n,N as t};
2
- //# sourceMappingURL=Dj87pb142.chunk.js.map
1
+ import{Er as e,N as t,at as n,qt as r}from"./CrTgNROp.chunk.js";import{C as i,g as a,m as o,n as s,t as c}from"./Dwe-4MVf.chunk.js";import{t as l}from"./Dsv_eF8a.chunk.js";import{n as u}from"./28VvvkVW.chunk.js";import{t as d}from"./7dV7tXUX.chunk.js";import{t as f}from"./BIVEB8w0.chunk.js";import{Dt as p,Ot as m,Rt as h,Z as g,a as _,at as v,yt as y}from"./app-F8o5al1q.js";import{t as b}from"./B0BRYUl5.chunk.js";n();var x=`shared.verifiedEmailError`,S=class extends y{constructor(e,t,n){super(`VerifiedEmailRequiredError`),this.message=e,this.liteUrl=t,this.hasLite=n}get name(){return`VerifiedEmailRequiredError`}get dialogOptions(){let e=u.safeUrlConcat(this.liteUrl,`settings/account`);return{title:f.getPhrase(x,`heading`),text:this.hasLite?`${this.message} ${f.getPhrase(x,`visitSettings`,{href:e})}`:this.message,buttons:[{text:f.getPhrase(x,`close`),className:`btn btn-dark`,success:!0}]}}},C=()=>{let e=o(o(d.currentUser()).data?.isAuthenticated&&p.userProducts()),t=!e.hasCompleted;return{hasProduct:n=>t||e.hasError||!e.data?.length?!1:e.data.some(e=>e.id===n),products:e,isLoadingProducts:t}};function w(){let e=b(),{hasProduct:t,isLoadingProducts:n}=C(),i=o(h.config());function a(n,a,o){if(!n.responseJSON||n.responseJSON?.type!==`no-email`){e.error(a);return}r.throw(new S(o,i.data.liteUrl,t(m.Primary)))}return{handleGenerateReportError:a,loading:!i.hasCompleted||n}}function T(e){return{dateRange:{start:e.start,end:e.end},offsetInMin:Math.abs(new Date().getTimezoneOffset())}}var E={videoViewsReport(e,t){return{url:`{gateway}/v1/analytics/video-views/reports`,key:`video:views:report`,type:i.POST,data:{...T(e),version:t},invalidationKeys:`export`,normalize:!1}},loginsReport(e,t,n,r){return{url:`{gateway}/v1/analytics/logins/reports`,key:`logins:report`,data:T(e),type:i.POST,normalize:!1,success:t,error:n,always:r}}},D=e({GenerateReportType:()=>N,GenerateReportView:()=>P,getReportFriendlyDate:()=>M}),O=t(),k=`reportsShared.generateReport`,A=f.encloseNamespace(k);function j(e){switch(e){case 0:return`loginsDescription`;case 1:return`videosDescription`;default:return``}}function M(e){let t=l.convertUTCToLocal(e).toString();return l.format(t,`Do MMMM YYYY`)}var N=function(e){return e[e.Logins=0]=`Logins`,e[e.VideoViews=1]=`VideoViews`,e}({});function P(e){let t=_(`video-views`),n=_(`logins`),r=e.type===1?t:n,i=b(),{loading:o,handleGenerateReportError:l}=w(),u=a();function d(){switch(e.type){case 0:return E.loginsReport(n);case 1:return E.videoViewsReport(t,`v3`);default:return null}}function f(){u(d()).then(()=>i.success(A(`success`))).catch(e=>l(e,A(`error`),A(`noEmailError`))).finally(e.closePopup)}return(0,O.jsx)(c.Provider,{value:k,children:(0,O.jsxs)(v,{title:A(`title`),showLoadingSpinner:o,closePopup:e.closePopup,children:[(0,O.jsx)(`p`,{children:(0,O.jsx)(s,{phrase:j(e.type)})}),(0,O.jsx)(`p`,{children:(0,O.jsx)(s,{phrase:`dateRange`,options:{dateFrom:M(r.start),dateTo:M(r.end)}})}),(0,O.jsx)(`p`,{children:(0,O.jsx)(s,{phrase:`emailDescription`})}),(0,O.jsxs)(g,{children:[(0,O.jsx)(g.Cancel,{onClick:e.closePopup}),(0,O.jsx)(g.Submit,{variant:`dark`,onClick:f,text:A(`generateReport`)})]})]})})}export{D as n,N as t};
2
+ //# sourceMappingURL=CDx9_B5h2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dj87pb142.chunk.js","names":[],"sources":["../../../../libs/shared/src/errors/general/verified-email/VerifiedEmailRequiredError.ts","../../../../libs/shared/src/hooks/UseProducts.ts","../../../../libs/shared/src/hooks/useVerifiedEmailRequiredErrorHandler.ts","../../src/shared/flight-requests/ReportRequests.ts","../../src/shared/views/generate-report/GenerateReportView.tsx"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.verifiedEmailError';\n\nexport class VerifiedEmailRequiredError extends DialogError {\n public message: string;\n public liteUrl: string;\n public hasLite: boolean;\n\n constructor(message: string, liteUrl: string, hasLite: boolean) {\n super('VerifiedEmailRequiredError');\n\n this.message = message;\n this.liteUrl = liteUrl;\n this.hasLite = hasLite;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'VerifiedEmailRequiredError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n const href = UrlHelper.safeUrlConcat(this.liteUrl, 'settings/account');\n\n return {\n title: LanguageService.getPhrase(namespace, 'heading'),\n text: this.hasLite ?\n `${this.message} ${LanguageService.getPhrase(namespace, 'visitSettings', { href })}` :\n this.message,\n buttons: [{\n text: LanguageService.getPhrase(namespace, 'close'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ProductRequests } from 'libs/shared/flight-requests/ProductRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Product } from 'libs/shared/interfaces';\n\nexport type HasProductFunc = (productId: ProductId) => boolean;\n\nexport interface UseProductsResponse {\n hasProduct: (product: ProductId) => boolean;\n products: Flight.Response<Product[]>;\n isLoadingProducts: boolean;\n}\n\nexport const useProducts = (): UseProductsResponse => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const products = Flight.useBasicFetch<Product[]>(currentUser.data?.isAuthenticated && ProductRequests.userProducts());\n const isLoadingProducts = !products.hasCompleted;\n\n const hasProduct = (productId: ProductId) => {\n if (isLoadingProducts || products.hasError)\n return false;\n\n if (!products.data?.length)\n return false;\n\n return products.data.some(product => product.id === productId);\n };\n\n return {\n hasProduct,\n products,\n isLoadingProducts\n };\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { VerifiedEmailRequiredError } from 'libs/shared/errors/general/verified-email/VerifiedEmailRequiredError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useVerifiedEmailRequiredErrorHandler() {\n const alerts = useAlerts();\n const { hasProduct, isLoadingProducts } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function handleGenerateReportError(xhr: Xhr, message: string, noEmailError: string) {\n if (!xhr.responseJSON || xhr.responseJSON?.type !== 'no-email') {\n alerts.error(message);\n return;\n }\n\n Core.ErrorHelper.throw(\n new VerifiedEmailRequiredError(noEmailError, config.data.liteUrl, hasProduct(ProductId.Primary))\n );\n }\n\n return {\n handleGenerateReportError,\n loading: !config.hasCompleted || isLoadingProducts\n };\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\ntype ReportVersion = 'v2' | 'v3';\n\ninterface DateRange {\n start: string;\n end: string;\n}\n\ninterface ReportRequestPayload {\n dateRange: DateRange;\n offsetInMin: number;\n userIds?: number[];\n groupsIds?: number[];\n}\n\nfunction formatReportRequest(filterParams: AnalyticsRequestFilter): ReportRequestPayload {\n return {\n dateRange: {\n start: filterParams.start,\n end: filterParams.end\n },\n offsetInMin: Math.abs(new Date().getTimezoneOffset())\n };\n}\n\nexport const ReportRequests = {\n videoViewsReport(\n filterParams: AnalyticsRequestFilter,\n version: ReportVersion\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/video-views/reports',\n key: 'video:views:report',\n type: HttpVerbs.POST,\n data: { ...formatReportRequest(filterParams), version },\n invalidationKeys: 'export',\n normalize: false\n };\n },\n\n loginsReport(\n filterParams: AnalyticsRequestFilter,\n success?: () => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/logins/reports',\n key: 'logins:report',\n data: formatReportRequest(filterParams),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n }\n};\n","import React from 'react';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nimport { ReportRequests } from 'shared/flight-requests/ReportRequests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\n\nconst namespace = 'reportsShared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getLangPhrase(type: GenerateReportType): string {\n switch (type) {\n case GenerateReportType.Logins:\n return 'loginsDescription';\n\n case GenerateReportType.VideoViews:\n return 'videosDescription';\n\n default:\n return '';\n }\n}\n\nexport function getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\nexport enum GenerateReportType {\n Logins,\n VideoViews\n}\n\ninterface GenerateReportViewProps {\n type: GenerateReportType;\n}\n\nexport function GenerateReportView(props: PropsWithPopupViewProps<GenerateReportViewProps>): JSX.Element {\n const videoViewsFilter = useGetRequestFilter('video-views');\n const loginsFilter = useGetRequestFilter('logins');\n const filterQueryParams = props.type === GenerateReportType.VideoViews ? videoViewsFilter : loginsFilter;\n const alerts = useAlerts();\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n function getRequest(): Flight.Request {\n switch (props.type) {\n case GenerateReportType.Logins:\n return ReportRequests.loginsReport(loginsFilter);\n\n case GenerateReportType.VideoViews:\n return ReportRequests.videoViewsReport(videoViewsFilter, 'v3');\n\n default:\n return null;\n }\n }\n\n function onClick() {\n fetchAsync(getRequest())\n .then(() => alerts.success(getPhrase('success')))\n .catch((xhr: Xhr) => handleGenerateReportError(xhr, getPhrase('error'), getPhrase('noEmailError')))\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={loading}\n closePopup={props.closePopup}\n >\n <p>\n <Text phrase={getLangPhrase(props.type)} />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(filterQueryParams.start),\n dateTo: getReportFriendlyDate(filterQueryParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClick}\n text={getPhrase('generateReport')}\n />\n </PopupButtons>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CDx9_B5h2.chunk.js","names":[],"sources":["../../../../libs/shared/src/errors/general/verified-email/VerifiedEmailRequiredError.ts","../../../../libs/shared/src/hooks/UseProducts.ts","../../../../libs/shared/src/hooks/useVerifiedEmailRequiredErrorHandler.ts","../../src/shared/flight-requests/ReportRequests.ts","../../src/shared/views/generate-report/GenerateReportView.tsx"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.verifiedEmailError';\n\nexport class VerifiedEmailRequiredError extends DialogError {\n public message: string;\n public liteUrl: string;\n public hasLite: boolean;\n\n constructor(message: string, liteUrl: string, hasLite: boolean) {\n super('VerifiedEmailRequiredError');\n\n this.message = message;\n this.liteUrl = liteUrl;\n this.hasLite = hasLite;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'VerifiedEmailRequiredError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n const href = UrlHelper.safeUrlConcat(this.liteUrl, 'settings/account');\n\n return {\n title: LanguageService.getPhrase(namespace, 'heading'),\n text: this.hasLite ?\n `${this.message} ${LanguageService.getPhrase(namespace, 'visitSettings', { href })}` :\n this.message,\n buttons: [{\n text: LanguageService.getPhrase(namespace, 'close'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ProductRequests } from 'libs/shared/flight-requests/ProductRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Product } from 'libs/shared/interfaces';\n\nexport type HasProductFunc = (productId: ProductId) => boolean;\n\nexport interface UseProductsResponse {\n hasProduct: (product: ProductId) => boolean;\n products: Flight.Response<Product[]>;\n isLoadingProducts: boolean;\n}\n\nexport const useProducts = (): UseProductsResponse => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const products = Flight.useBasicFetch<Product[]>(currentUser.data?.isAuthenticated && ProductRequests.userProducts());\n const isLoadingProducts = !products.hasCompleted;\n\n const hasProduct = (productId: ProductId) => {\n if (isLoadingProducts || products.hasError)\n return false;\n\n if (!products.data?.length)\n return false;\n\n return products.data.some(product => product.id === productId);\n };\n\n return {\n hasProduct,\n products,\n isLoadingProducts\n };\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { VerifiedEmailRequiredError } from 'libs/shared/errors/general/verified-email/VerifiedEmailRequiredError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useVerifiedEmailRequiredErrorHandler() {\n const alerts = useAlerts();\n const { hasProduct, isLoadingProducts } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function handleGenerateReportError(xhr: Xhr, message: string, noEmailError: string) {\n if (!xhr.responseJSON || xhr.responseJSON?.type !== 'no-email') {\n alerts.error(message);\n return;\n }\n\n Core.ErrorHelper.throw(\n new VerifiedEmailRequiredError(noEmailError, config.data.liteUrl, hasProduct(ProductId.Primary))\n );\n }\n\n return {\n handleGenerateReportError,\n loading: !config.hasCompleted || isLoadingProducts\n };\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\ntype ReportVersion = 'v2' | 'v3';\n\ninterface DateRange {\n start: string;\n end: string;\n}\n\ninterface ReportRequestPayload {\n dateRange: DateRange;\n offsetInMin: number;\n userIds?: number[];\n groupsIds?: number[];\n}\n\nfunction formatReportRequest(filterParams: AnalyticsRequestFilter): ReportRequestPayload {\n return {\n dateRange: {\n start: filterParams.start,\n end: filterParams.end\n },\n offsetInMin: Math.abs(new Date().getTimezoneOffset())\n };\n}\n\nexport const ReportRequests = {\n videoViewsReport(\n filterParams: AnalyticsRequestFilter,\n version: ReportVersion\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/video-views/reports',\n key: 'video:views:report',\n type: HttpVerbs.POST,\n data: { ...formatReportRequest(filterParams), version },\n invalidationKeys: 'export',\n normalize: false\n };\n },\n\n loginsReport(\n filterParams: AnalyticsRequestFilter,\n success?: () => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/logins/reports',\n key: 'logins:report',\n data: formatReportRequest(filterParams),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n }\n};\n","import React from 'react';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nimport { ReportRequests } from 'shared/flight-requests/ReportRequests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\n\nconst namespace = 'reportsShared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getLangPhrase(type: GenerateReportType): string {\n switch (type) {\n case GenerateReportType.Logins:\n return 'loginsDescription';\n\n case GenerateReportType.VideoViews:\n return 'videosDescription';\n\n default:\n return '';\n }\n}\n\nexport function getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\nexport enum GenerateReportType {\n Logins,\n VideoViews\n}\n\ninterface GenerateReportViewProps {\n type: GenerateReportType;\n}\n\nexport function GenerateReportView(props: PropsWithPopupViewProps<GenerateReportViewProps>): JSX.Element {\n const videoViewsFilter = useGetRequestFilter('video-views');\n const loginsFilter = useGetRequestFilter('logins');\n const filterQueryParams = props.type === GenerateReportType.VideoViews ? videoViewsFilter : loginsFilter;\n const alerts = useAlerts();\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n function getRequest(): Flight.Request {\n switch (props.type) {\n case GenerateReportType.Logins:\n return ReportRequests.loginsReport(loginsFilter);\n\n case GenerateReportType.VideoViews:\n return ReportRequests.videoViewsReport(videoViewsFilter, 'v3');\n\n default:\n return null;\n }\n }\n\n function onClick() {\n fetchAsync(getRequest())\n .then(() => alerts.success(getPhrase('success')))\n .catch((xhr: Xhr) => handleGenerateReportError(xhr, getPhrase('error'), getPhrase('noEmailError')))\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={loading}\n closePopup={props.closePopup}\n >\n <p>\n <Text phrase={getLangPhrase(props.type)} />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(filterQueryParams.start),\n dateTo: getReportFriendlyDate(filterQueryParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClick}\n text={getPhrase('generateReport')}\n />\n </PopupButtons>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n"],"mappings":"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"}