@clickview/lite 0.48.0-rc.7 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/{170-1f815b85a1-lite.chunk.js → 170-2d124965b7-lite.chunk.js} +2 -2
  3. package/dist/scripts/{170-1f815b85a1-lite.chunk.js.map → 170-2d124965b7-lite.chunk.js.map} +1 -1
  4. package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js → 1818-72409e60a9-lite.chunk.js} +1 -1
  5. package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js.map → 1818-72409e60a9-lite.chunk.js.map} +1 -1
  6. package/dist/scripts/{1863-cf9df40052-lite.chunk.js → 1863-e7c4a6f342-lite.chunk.js} +1 -1
  7. package/dist/scripts/{1863-cf9df40052-lite.chunk.js.map → 1863-e7c4a6f342-lite.chunk.js.map} +1 -1
  8. package/dist/scripts/{1958-9889c1ad24-lite.chunk.js → 1958-5336189397-lite.chunk.js} +1 -1
  9. package/dist/scripts/{1958-9889c1ad24-lite.chunk.js.map → 1958-5336189397-lite.chunk.js.map} +1 -1
  10. package/dist/scripts/{2086-a247f6e201-lite.chunk.js → 2086-f7082703d0-lite.chunk.js} +1 -1
  11. package/dist/scripts/{2086-a247f6e201-lite.chunk.js.map → 2086-f7082703d0-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/{2118-462a279c5a-lite.chunk.js → 2118-ec2a5f1e9b-lite.chunk.js} +2 -2
  13. package/dist/scripts/{2118-462a279c5a-lite.chunk.js.map → 2118-ec2a5f1e9b-lite.chunk.js.map} +1 -1
  14. package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js → 2182-8e4d603a1b-lite.chunk.js} +1 -1
  15. package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js.map → 2182-8e4d603a1b-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/{2279-5e92c84310-lite.chunk.js → 2279-252e92e1d8-lite.chunk.js} +1 -1
  17. package/dist/scripts/{2279-5e92c84310-lite.chunk.js.map → 2279-252e92e1d8-lite.chunk.js.map} +1 -1
  18. package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js → 2355-c588dc3ce2-lite.chunk.js} +1 -1
  19. package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js.map → 2355-c588dc3ce2-lite.chunk.js.map} +1 -1
  20. package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js → 2469-46411b862e-lite.chunk.js} +1 -1
  21. package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js.map → 2469-46411b862e-lite.chunk.js.map} +1 -1
  22. package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js → 2672-b01985cee8-lite.chunk.js} +1 -1
  23. package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js.map → 2672-b01985cee8-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js → 2734-6a7beb2ce2-lite.chunk.js} +1 -1
  25. package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js.map → 2734-6a7beb2ce2-lite.chunk.js.map} +1 -1
  26. package/dist/scripts/{287-ba98be7f21-lite.chunk.js → 287-3cbed16363-lite.chunk.js} +1 -1
  27. package/dist/scripts/{287-ba98be7f21-lite.chunk.js.map → 287-3cbed16363-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/{2875-0e5f209e47-lite.chunk.js → 2875-aefd69a61f-lite.chunk.js} +1 -1
  29. package/dist/scripts/{2875-0e5f209e47-lite.chunk.js.map → 2875-aefd69a61f-lite.chunk.js.map} +1 -1
  30. package/dist/scripts/{3042-6650521d8b-lite.chunk.js → 3042-7c1b5e4ff7-lite.chunk.js} +1 -1
  31. package/dist/scripts/{3042-6650521d8b-lite.chunk.js.map → 3042-7c1b5e4ff7-lite.chunk.js.map} +1 -1
  32. package/dist/scripts/{3158-31baada6cc-lite.chunk.js → 3158-2147de456d-lite.chunk.js} +1 -1
  33. package/dist/scripts/{3158-31baada6cc-lite.chunk.js.map → 3158-2147de456d-lite.chunk.js.map} +1 -1
  34. package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js → 3296-f3732c93d9-lite.chunk.js} +1 -1
  35. package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js.map → 3296-f3732c93d9-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/{3541-7ebd9db295-lite.chunk.js → 3541-15581012d3-lite.chunk.js} +1 -1
  37. package/dist/scripts/{3541-7ebd9db295-lite.chunk.js.map → 3541-15581012d3-lite.chunk.js.map} +1 -1
  38. package/dist/scripts/{3841-95df66e647-lite.chunk.js → 3841-bfae79638b-lite.chunk.js} +2 -2
  39. package/dist/scripts/{3841-95df66e647-lite.chunk.js.map → 3841-bfae79638b-lite.chunk.js.map} +1 -1
  40. package/dist/scripts/{3888-0bee9a9309-lite.chunk.js → 3888-87c1075a1b-lite.chunk.js} +1 -1
  41. package/dist/scripts/{3888-0bee9a9309-lite.chunk.js.map → 3888-87c1075a1b-lite.chunk.js.map} +1 -1
  42. package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js → 4138-b9b03c9900-lite.chunk.js} +1 -1
  43. package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js.map → 4138-b9b03c9900-lite.chunk.js.map} +1 -1
  44. package/dist/scripts/{4778-ebe369973c-lite.chunk.js → 4778-3c9f2b7f76-lite.chunk.js} +2 -2
  45. package/dist/scripts/{4778-ebe369973c-lite.chunk.js.map → 4778-3c9f2b7f76-lite.chunk.js.map} +1 -1
  46. package/dist/scripts/{4942-a27a31e79e-lite.chunk.js → 4942-acce40b333-lite.chunk.js} +2 -2
  47. package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.map → 4942-acce40b333-lite.chunk.js.map} +1 -1
  48. package/dist/scripts/{5075-f8719465be-lite.chunk.js → 5075-53172298fe-lite.chunk.js} +1 -1
  49. package/dist/scripts/{5075-f8719465be-lite.chunk.js.map → 5075-53172298fe-lite.chunk.js.map} +1 -1
  50. package/dist/scripts/{5157-cd12e2e443-lite.chunk.js → 5157-47a0f5c088-lite.chunk.js} +1 -1
  51. package/dist/scripts/{5157-cd12e2e443-lite.chunk.js.map → 5157-47a0f5c088-lite.chunk.js.map} +1 -1
  52. package/dist/scripts/{5268-f4db3933ff-lite.chunk.js → 5268-9b7560f3b1-lite.chunk.js} +2 -2
  53. package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.map → 5268-9b7560f3b1-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{5442-01ffd95162-lite.chunk.js → 5442-5ddfa2d951-lite.chunk.js} +1 -1
  55. package/dist/scripts/{5442-01ffd95162-lite.chunk.js.map → 5442-5ddfa2d951-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js → 5591-119d72ede5-lite.chunk.js} +1 -1
  57. package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js.map → 5591-119d72ede5-lite.chunk.js.map} +1 -1
  58. package/dist/scripts/{5595-3763b14d77-lite.chunk.js → 5595-628d4f252c-lite.chunk.js} +2 -2
  59. package/dist/scripts/5595-628d4f252c-lite.chunk.js.map +1 -0
  60. package/dist/scripts/{6102-4d948a5e48-lite.chunk.js → 6102-751dbbbf33-lite.chunk.js} +3 -3
  61. package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.map → 6102-751dbbbf33-lite.chunk.js.map} +1 -1
  62. package/dist/scripts/{6158-0c5e44f800-lite.chunk.js → 6158-d123add596-lite.chunk.js} +1 -1
  63. package/dist/scripts/{6158-0c5e44f800-lite.chunk.js.map → 6158-d123add596-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/{6263-8957d50afe-lite.chunk.js → 6263-24e67b7df2-lite.chunk.js} +1 -1
  65. package/dist/scripts/{6263-8957d50afe-lite.chunk.js.map → 6263-24e67b7df2-lite.chunk.js.map} +1 -1
  66. package/dist/scripts/{6330-c66465bd6d-lite.chunk.js → 6330-9a2a5fc07e-lite.chunk.js} +1 -1
  67. package/dist/scripts/{6330-c66465bd6d-lite.chunk.js.map → 6330-9a2a5fc07e-lite.chunk.js.map} +1 -1
  68. package/dist/scripts/{671-003843ca84-lite.chunk.js → 671-5571f33165-lite.chunk.js} +1 -1
  69. package/dist/scripts/{671-003843ca84-lite.chunk.js.map → 671-5571f33165-lite.chunk.js.map} +1 -1
  70. package/dist/scripts/{7167-efe85af16e-lite.chunk.js → 7167-dc4c954c2b-lite.chunk.js} +1 -1
  71. package/dist/scripts/{7167-efe85af16e-lite.chunk.js.map → 7167-dc4c954c2b-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/7293-58f4a7cf47-lite.chunk.js +2 -0
  73. package/dist/scripts/{7293-afd3349468-lite.chunk.js.map → 7293-58f4a7cf47-lite.chunk.js.map} +1 -1
  74. package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js → 7301-7c9342ef0c-lite.chunk.js} +1 -1
  75. package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js.map → 7301-7c9342ef0c-lite.chunk.js.map} +1 -1
  76. package/dist/scripts/{7708-ece31b78a9-lite.chunk.js → 7708-e91903481a-lite.chunk.js} +1 -1
  77. package/dist/scripts/{7708-ece31b78a9-lite.chunk.js.map → 7708-e91903481a-lite.chunk.js.map} +1 -1
  78. package/dist/scripts/{771-eb60e33941-lite.chunk.js → 771-5612b4ffc2-lite.chunk.js} +2 -2
  79. package/dist/scripts/{771-eb60e33941-lite.chunk.js.map → 771-5612b4ffc2-lite.chunk.js.map} +1 -1
  80. package/dist/scripts/{7855-37bcdd134e-lite.chunk.js → 7855-4b69540a71-lite.chunk.js} +1 -1
  81. package/dist/scripts/{7855-37bcdd134e-lite.chunk.js.map → 7855-4b69540a71-lite.chunk.js.map} +1 -1
  82. package/dist/scripts/{8024-66413cc05b-lite.chunk.js → 8024-765a4170c7-lite.chunk.js} +2 -2
  83. package/dist/scripts/{8024-66413cc05b-lite.chunk.js.map → 8024-765a4170c7-lite.chunk.js.map} +1 -1
  84. package/dist/scripts/{823-58d27c255b-lite.chunk.js → 823-33c5207c68-lite.chunk.js} +1 -1
  85. package/dist/scripts/{823-58d27c255b-lite.chunk.js.map → 823-33c5207c68-lite.chunk.js.map} +1 -1
  86. package/dist/scripts/8261-69854ff4d5-lite.chunk.js +2 -0
  87. package/dist/scripts/8261-69854ff4d5-lite.chunk.js.map +1 -0
  88. package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js → 8466-cea62163e8-lite.chunk.js} +1 -1
  89. package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js.map → 8466-cea62163e8-lite.chunk.js.map} +1 -1
  90. package/dist/scripts/{8681-41edd08b98-lite.chunk.js → 8681-49db3daae6-lite.chunk.js} +2 -2
  91. package/dist/scripts/{8681-41edd08b98-lite.chunk.js.map → 8681-49db3daae6-lite.chunk.js.map} +1 -1
  92. package/dist/scripts/{8772-9ae4d77363-lite.chunk.js → 8772-6c11095cea-lite.chunk.js} +1 -1
  93. package/dist/scripts/{8772-9ae4d77363-lite.chunk.js.map → 8772-6c11095cea-lite.chunk.js.map} +1 -1
  94. package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js → 8906-2f6b5e4c5c-lite.chunk.js} +2 -2
  95. package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.map → 8906-2f6b5e4c5c-lite.chunk.js.map} +1 -1
  96. package/dist/scripts/{920-4de8efbcf1-lite.chunk.js → 920-acc6596891-lite.chunk.js} +1 -1
  97. package/dist/scripts/{920-4de8efbcf1-lite.chunk.js.map → 920-acc6596891-lite.chunk.js.map} +1 -1
  98. package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js → 9212-cc987a13bf-lite.chunk.js} +1 -1
  99. package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js.map → 9212-cc987a13bf-lite.chunk.js.map} +1 -1
  100. package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js → 9242-144e7728ad-lite.chunk.js} +1 -1
  101. package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js.map → 9242-144e7728ad-lite.chunk.js.map} +1 -1
  102. package/dist/scripts/{9264-d2285d4310-lite.chunk.js → 9264-518952f13f-lite.chunk.js} +1 -1
  103. package/dist/scripts/{9264-d2285d4310-lite.chunk.js.map → 9264-518952f13f-lite.chunk.js.map} +1 -1
  104. package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js → 9478-4b3c088537-lite.chunk.js} +2 -2
  105. package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.map → 9478-4b3c088537-lite.chunk.js.map} +1 -1
  106. package/dist/scripts/{9484-be04a34bbf-lite.chunk.js → 9484-b85011dbea-lite.chunk.js} +2 -2
  107. package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.map → 9484-b85011dbea-lite.chunk.js.map} +1 -1
  108. package/dist/scripts/{bundle-8f540a1154.min.js → bundle-c158cdd3a9.min.js} +3 -3
  109. package/dist/scripts/{bundle-8f540a1154.min.js.map → bundle-c158cdd3a9.min.js.map} +1 -1
  110. package/package.json +1 -1
  111. package/dist/scripts/5595-3763b14d77-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7293-afd3349468-lite.chunk.js +0 -2
  113. package/dist/scripts/8261-72453f1978-lite.chunk.js +0 -2
  114. package/dist/scripts/8261-72453f1978-lite.chunk.js.map +0 -1
  115. /package/dist/scripts/{170-1f815b85a1-lite.chunk.js.LICENSE.txt → 170-2d124965b7-lite.chunk.js.LICENSE.txt} +0 -0
  116. /package/dist/scripts/{2118-462a279c5a-lite.chunk.js.LICENSE.txt → 2118-ec2a5f1e9b-lite.chunk.js.LICENSE.txt} +0 -0
  117. /package/dist/scripts/{3841-95df66e647-lite.chunk.js.LICENSE.txt → 3841-bfae79638b-lite.chunk.js.LICENSE.txt} +0 -0
  118. /package/dist/scripts/{4778-ebe369973c-lite.chunk.js.LICENSE.txt → 4778-3c9f2b7f76-lite.chunk.js.LICENSE.txt} +0 -0
  119. /package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.LICENSE.txt → 4942-acce40b333-lite.chunk.js.LICENSE.txt} +0 -0
  120. /package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.LICENSE.txt → 5268-9b7560f3b1-lite.chunk.js.LICENSE.txt} +0 -0
  121. /package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.LICENSE.txt → 6102-751dbbbf33-lite.chunk.js.LICENSE.txt} +0 -0
  122. /package/dist/scripts/{771-eb60e33941-lite.chunk.js.LICENSE.txt → 771-5612b4ffc2-lite.chunk.js.LICENSE.txt} +0 -0
  123. /package/dist/scripts/{8024-66413cc05b-lite.chunk.js.LICENSE.txt → 8024-765a4170c7-lite.chunk.js.LICENSE.txt} +0 -0
  124. /package/dist/scripts/{8681-41edd08b98-lite.chunk.js.LICENSE.txt → 8681-49db3daae6-lite.chunk.js.LICENSE.txt} +0 -0
  125. /package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.LICENSE.txt → 8906-2f6b5e4c5c-lite.chunk.js.LICENSE.txt} +0 -0
  126. /package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.LICENSE.txt → 9478-4b3c088537-lite.chunk.js.LICENSE.txt} +0 -0
  127. /package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.LICENSE.txt → 9484-b85011dbea-lite.chunk.js.LICENSE.txt} +0 -0
  128. /package/dist/scripts/{bundle-8f540a1154.min.js.LICENSE.txt → bundle-c158cdd3a9.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/7301-f20e4bdb8f-lite.chunk.js","mappings":"oLAOMA,EAAY,kBAUZ,SAAUC,EAAUC,GACxB,IACEC,EAKED,EALFC,SACAC,EAIEF,EAJFE,YACAC,EAGEH,EAHFG,UACAC,EAEEJ,EAFFI,aACAC,EACEL,EADFK,WAGF,OACE,uBAAKC,UAAU,+BACVD,EAAWE,QACZ,gCACE,uBAAKD,UAAU,QACb,gBAAC,IAAI,CAACR,UAAWA,EAAWU,OAAO,eAErC,uBAAKF,UAAU,QACb,gBAAC,IAAQ,KACP,gBAAC,WAAe,CAACG,GAAG,mBAAmBC,QAAQ,gBAC5CP,EAAUQ,OAGb,gBAAC,SAAa,KACXN,EAAWO,KAAI,SAAAC,GAAI,OAClB,gBAAC,SAAa,CACZC,IAAG,UAAKD,EAAKE,MAAK,YAAIF,EAAKG,QAC3BC,QAAS,kBAAMb,EAAaS,EAAK,GAEhCA,EAAKF,MACQ,QAO5B,uBAAKL,UAAU,QACb,gBAAC,IAAI,CAACR,UAAWA,EAAWU,OAAO,cAErC,gBAAC,IAAQ,CAACC,GAAG,oBAAoBS,QAASjB,EAAUkB,SAAU,kBAAMjB,GAAaD,EAAS,IAGhG,C,mHChDMH,EAAY,oBACZsB,EAAY,qBAAiCtB,GAM7C,SAAUuB,EAAWrB,GACzB,IAAMsB,GAAc,UASpB,OACE,uBAAKhB,UAAU,0DACb,2BACE,yBAAOA,UAAU,MAAMiB,QAAQ,IAAG,gBAAC,IAAI,CAACzB,UAAWA,EAAWU,OAAO,2BACrE,qBAAGF,UAAU,OAAM,gBAAC,IAAI,CAACR,UAAWA,EAAWU,OAAO,yBAExD,gBAAC,IAAO,CACNgB,MAAOJ,EAAU,qBACjBK,SAAUzB,EAAM0B,oBAChBC,UAAQ,EACRC,QAAQ,SAER,gBAAC,IAAY,CACXX,QApBR,WACMjB,EAAM0B,qBAGVJ,EAAYO,cAAc,kBAAkB,QAAmBP,EAAYQ,OAAOC,gBACpF,EAgBQC,KAAMV,EAAYQ,OAAOC,eACzBE,SAAUjC,EAAM0B,oBAChBQ,uBAAqB,KAK/B,C,oHChDA,SAAgB,eAAiB,S,0GCYjC,IACMd,EAAYe,EAAA,mBADA,0BAmBZ,SAAUC,EAAiBpC,G,UACoC,G,EAArB,YAAe,G,EAAM,E,k5BAA3DqC,EAAc,KAAEC,EAAiB,KAInCC,EAA6B,QAAlB,GAFG,UAESC,cAAM,eAAEC,SAErC,OACE,gCACE,yBACEnC,UAAS,uBAAkBiC,EAAW,aAAe,IACrDG,MAAO1C,EAAM0C,MACbvB,SAAU,SAAAwB,GACN3C,EAAM4C,SAAW5C,EAAMmB,SAASwB,EAAEE,OAAOH,MAC7C,EACAI,KAAMT,EAAiB,OAAS,WAChCU,YAAa/C,EAAM+C,aAAe3B,EAAU,uBAC5C4B,UAAWhD,EAAM4C,YAEhBL,GACD,gBAACU,EAAA,mBAAqB,CAACH,KAAK,WAAWP,KAEtCvC,EAAM4C,SACP,gBAACM,EAAA,EAAS,CAAC5C,UAAW,iBAAuBW,QAAS,kBAAMqB,GAAmBD,EAAe,GAC5F,gBAACc,EAAA,EAAY,CACXC,QAASf,EAAiB,eAAyB,gBACnDb,MAAOJ,EAAUiB,EAAiB,eAAiB,kBACnDgB,iBAAiB,UAIrBrD,EAAM4C,WAAa5C,EAAMsD,YAActD,EAAMuD,SAC7C,gBAACL,EAAA,EAAS,CAAC5C,UAAW,iBAAuBW,QAASjB,EAAMuD,SAC1D,gBAACJ,EAAA,EAAY,CACXC,QAAS,WAAoB5B,MAAOJ,EAAU,iBAC9CiC,iBAAiB,SAM7B,C,8IC/DA,IAAM,EAAY,sBAEZG,EAAuB,WAQvB,SAAUC,EAAazD,G,UACnB0B,EAAgD1B,EAAhD0B,oBAAqBgC,EAA2B1D,EAA3B0D,uBAEvBpC,GAAc,UAEoF,G,EAAtD,cAAgC,QAAf,EAAAtB,EAAM2D,iBAAS,eAAEC,sB,EAAoB,E,k5BAAhGC,EAAgB,KAAEC,EAAmB,KAsB7C,OACE,uBAAKxD,UAAU,QACb,uBAAKA,UAAU,qDACb,2BACE,yBAAOA,UAAU,MAAMiB,QAAQ,IAAG,gBAACwC,EAAA,EAAI,CAACjE,UAAW,EAAWU,OAAO,4BACrE,qBAAGF,UAAU,OAAM,gBAACyD,EAAA,EAAI,CAACjE,UAAW,EAAWU,OAAO,0BAExD,gBAACwD,EAAA,EAAY,CAAC/C,QA3BpB,W,OACqB,QAAf,EAAAjB,EAAM2D,iBAAS,eAAEC,sBACnBtC,EAAYO,cAAc,iBAAkBH,GAE9CJ,EAAYO,cAAc,WAAY,IAEtC6B,GAAwBhC,GACxBJ,EAAYO,cAAc,kBAAkB,QAAmBH,GACjE,EAmBsDM,GAAIN,KAGrDA,GACC,uBAAKpB,UAAU,0BACb,gBAAC8B,EAAgB,CACfM,MAAOmB,EAAmBL,EAAuBlC,EAAYQ,OAAOW,SACpEtB,SAxBV,SAAqBsB,GACnBnB,EAAYO,cAAc,WAAYY,EACxC,EAuBUc,QArBV,WACEjC,EAAYO,cAAc,WAAY,IACtCP,EAAYO,cAAc,kBAAkB,GAC5CiC,GAAoB,EACtB,EAkBUlB,SAAUiB,EACVP,UAAQ,KAMpB,C,kCCtEA,IAAMW,EAAmB,GACnB,SAAUC,EAAkBC,GAChC,IAAKA,EACH,OAAO,KAET,IAAMC,EAAO,IAAIC,KAGjB,OAFAD,EAAKE,QAAQF,EAAKG,UAAYN,GAEvBG,EAAKI,aACd,C,4DCHaC,GAAoC,UAASC,MAAM,CAC9DC,gBAAgB,UAChBC,YAAY,UACZ7C,gBAAgB,UAAS8C,WACzBpC,UAAU,UACPqC,KAAK,CACJC,KAAM,kBACNC,WAAW,EACXC,OAAQ,CAAC,EACTC,QAAS,cAXG,mBAWkC,eAC9CJ,KAAM,SAAAK,GAGJ,SAGKA,aAAG,EAAHA,EAAK5E,SAGN4E,EAAI5E,OAAS,EAInB,IACA,QACO,K,sMC9Bb,SAAgB,eAAiB,QAAQ,iBAAmB,S,khCCe5D,IAAMT,EAAY,sBACZsB,EAAYe,EAAA,mBAAiCrC,GAW7C,SAAUsF,EAAcpF,GAC5B,IAAMK,EAAagF,EAAA,wBAEkE,IAAzC,WAAkC,QAAO,GAA7EC,EAAa,KAAEC,EAAgB,KACgB,IAArB,YAAe,GAAM,GAA/CtF,EAAQ,KAAEC,EAAW,KACgF,IAAzE,WAAgCG,EAAWmF,MAAK,SAAAC,GAAC,MAAgB,SAAZA,EAAE1E,KAAgB,KAAE,GAArGZ,EAAS,KAAEC,EAAY,KAEoB,IAArB,YAAe,GAAM,GAA3CsF,EAAM,KAAEC,EAAS,KAwBnBC,EAAMP,EAAA,gBAA0B,CACpCQ,SAAU7F,EAAM6F,SAChBC,KAAM9F,EAAM+F,OAAOC,WACnBC,QAASjG,EAAMiG,QACfhG,SAAAA,IAGIiG,EAAcb,EAAA,iBAA2B,CAC7CO,IAAAA,EACA/E,KAAMV,IAGR,OACE,gBAAC,aAAiC,CAACuC,MAAO5C,GACxC,6BAAO,gBAACiE,EAAA,EAAI,CAACjE,UAAWA,EAAWU,OAAO,WAC1C,uBAAKF,UAAU,0BACb,4BACEA,UAAS,2CAAsC,kBAC/C6F,YAAY,EACZzD,MAAOwD,EACPE,KAAM,EACNpD,UAAQ,IAEV,gBAAC,EAAAqD,gBAAe,CAACC,OA9CvB,WACEf,EAAiB,UACjBgB,YAAW,kBAAMhB,EAAiB,OAAO,GAAE,KAGvCG,IAGJC,GAAU,GAEVa,EAAA,gBAA8B,OAAD,wBACxBxG,EAAMyG,QAAM,CACfC,aAAc,CACZ7F,KAAMV,EACNF,SAAAA,KAEDuG,EAAA,eAA6BG,EAAA,sBAAoC3G,EAAM4G,YAAa,CACrFC,WAAY,WACZC,WAAY,mBACZC,aAAc,WAElB,EAyBuCC,KAAMd,GACrC,0BAAQ5F,UAAS,wFAAmF,oBAA2BwC,KAAK,UACjI1B,EAAUkE,MAIjB,gBAACvF,EAAA,EAAS,CACRE,SAAUA,EACVC,YAAaA,EACbC,UAAWA,EACXC,aAAcA,EACdC,WAAYA,IAIpB,C,0BCtFM,EAAY,eAYZ,SAAU4G,EAAUjH,GACxB,OACE,gCACE,uBAAKM,UAAU,QACb,gBAAC8E,EAAa,CACZS,SAAU7F,EAAM2D,UAAUkC,SAC1BY,OAAQzG,EAAMyG,OACdG,WAAY5G,EAAM4G,WAClBb,OAAQ/F,EAAM+F,OACdmB,SAAUlH,EAAMkH,SAChBjB,QAASjG,EAAM2D,UAAUlD,GACzB0G,iBAAkBnH,EAAMmH,oBAI5B,gBAACC,EAAA,EAAY,KACX,gBAAClE,EAAA,EAAS,CAACjC,QAASjB,EAAMqH,cAAe/G,UAAU,wBACjD,gBAACyD,EAAA,EAAI,CAACjE,UAAW,EAAWU,OAAO,WAK7C,C,gFC5CA,SAAgB,gBAAkB,SCQlC,IAAM,EAAY,qBAMZ,SAAU8G,EAAatH,GAC3B,OACE,gBAACkD,EAAA,EAAS,CACRjC,QAASjB,EAAMuH,oBACfjH,UAAS,4CAAuC,oBAEhD,uBAAKA,UAAU,6BACb,uBAAKA,UAAU,qCACb,gBAAC6C,EAAA,EAAY,CAACC,QAAS,UAAmBvC,KAAMsC,EAAAqE,EAAA,SAElD,gBAACzD,EAAA,EAAI,CAACjE,UAAW,EAAWU,OAAO,kBAI3C,C,kKCrBA,IACM,EAAY2B,EAAA,mBADA,uBAGZ,SAAUsF,EAAqBC,EAAmBC,EAAyBC,G,MAC/E,IAAKF,IAAUC,EACb,OAAO,KAET,GAAIC,EACF,OAAO,EAAU,wBAEnB,IAAKC,EAAA,cAAwBH,GAC3B,OAAO,EAAU,oBAEnB,IAAMI,EAAcC,EAAA,yBAA4D,QAAnB,EAAAL,EAAMM,qBAAa,eAAEtF,OAKlF,GAAIoF,IAAgBA,EAAYG,UAC9B,OAAO,EAAU,cAEnB,IAEIC,EACAC,EAE8B,EAL5BC,EAASP,EAAA,YAAsBH,GAGF,E,25BAAA,CAEXC,GAAU,IAAlC,IAAK,EAAL,qBAAoC,KAAzBM,EAAS,UAIbC,GAAgBD,EAAUvF,MAAQwF,EAAaxF,SAClDwF,EAAeD,GAKbH,GAAeG,EAAUvF,OAASoF,EAAYG,WAM9CG,GAAUH,EAAUG,OAAO1F,MAAQ0F,EAAO1F,SAMzCyF,GAAuBF,EAAUvF,MAAQyF,EAAoBzF,SAChEyF,EAAsBF,EACzB,CAED,+BAGA,OAAKE,EAODA,EAAoBzF,QAAUwF,EAAaxF,MACtC,EAAU,eAAgB,CAAEuF,UAAWC,EAAanD,OAEtD,EAAU,iBAAkB,CAAEkD,UAAWE,EAAoBpD,OAT3D,EAAU,YAUrB,C,yBCzEA,SAAgB,gBAAkB,S,khCCgBlC,IACM,EAAY5C,EAAA,mBADA,uBAsDZkG,EAAiB,SAACC,GACtB,IAAQvG,EAAgDuG,EAAhDvG,eAAgB6B,EAAgC0E,EAAhC1E,oBAAqB2E,EAAWD,EAAXC,OAC7C,IAAKxG,IAAmB6B,EACtB,OAvC0B,SAAC0E,GAC7B,IAAQE,EAA6DF,EAA7DE,aAAcC,EAA+CH,EAA/CG,QAASb,EAAsCU,EAAtCV,cAAenB,EAAuB6B,EAAvB7B,OAAQkB,EAAeW,EAAfX,WAEtD,GAAIa,IAAiBE,EAAA,SAAoBF,IAAiBE,EAAA,SACxD,MAAO,CAAEC,KAAM,eAAwB3B,KAAM,EAAUY,EAAgB,uBAAyB,4BAMlG,IAAIgB,MAAMC,QAAQJ,GAGlB,OAAQA,EAAQA,SACd,IAAK,SACH,MAAO,CAAEE,KAAM,eAAwB3B,KAAM,EAAU,sBACzD,IAAK,YACH,OAAIyB,EAAQK,qBACH,CAAEH,KAAM,eAAwB3B,KAAM,EAAU,kBAClD,CAAE2B,KAAM,UAAmB3B,KAAMS,EAAqBhB,EAAQkB,EAAYC,IACnF,IAAK,mBACH,OAAIa,EAAQK,qBACH,CAAEH,KAAM,UAAmB3B,KAAM,EAAUY,EAAgB,uBAAyB,4BACtF,CAAEe,KAAM,UAAmB3B,KAAMS,EAAqBhB,EAAQkB,EAAYC,IAKnF,IAAK,aACL,IAAK,UACH,MAAO,CAAEe,KAAM,UAAmB3B,KAAM,EAAU,uBACpD,QACE,MAAO,CAAC,EAEd,CAKW+B,CAAsBT,GAE/B,IAAKvG,EACH,MAAO,CAAE4G,KAAM,UAAmB3B,KAAM,EAAU,aAEpD,IAAMgC,EAAUC,EAAA,UAAmBlH,GAC7BmH,EAAgBD,EAAA,cAAuBlH,EAAgB,IAAIsC,KAAQ,OAEzE,IAAKT,EAAqB,CACxB,IAAI,EAAOoF,EACP,EAAU,eACV,EAAU,SAAU,CAAEG,KAAMD,IAKhC,OAHIX,IAAWa,EAAA,YACb,EAAO,EAAU,YAEZ,CAAET,KAAM,WAAoB3B,KAAA,EACpC,CAED,IAAIA,EAAOgC,EACP,EAAU,uBACV,EAAU,iBAAkB,CAAEG,KAAMD,IAKxC,OAHIX,IAAWa,EAAA,YACbpC,EAAO,EAAU,oBAEZ,CAAE2B,KAAM,UAAmB3B,KAAAA,EACpC,EASA,SAASqC,EAAcrJ,GACrB,IAAQsJ,EAAwCtJ,EAAxCsJ,OAAQ9H,EAAgCxB,EAAhCwB,MAAO+H,EAAyBvJ,EAAzBuJ,YAAatI,EAAYjB,EAAZiB,QAEpC,OACE,sBAAIX,UAAS,UAAKgJ,EAAS,gBAAkB,GAAE,kBAAkBrI,QAAUqI,EAAmB,KAAVrI,GAClF,qBAAGX,UAAU,oBAAoBkB,GACjC,qBAAGlB,UAAU,qBAAqBiJ,GAGxC,CAEM,SAAUC,EAAcxJ,GAC5B,IAAqE,IAArB,YAAe,GAAM,GAA7DyJ,EAAe,KAAEC,EAAkB,KACuB,IAAlC,WAA6B,MAAK,GAA1DjB,EAAO,KAAEkB,EAAU,KAE3B,EAAuBtB,EAAerI,GAA9B2I,EAAI,EAAJA,KAAM3B,EAAI,EAAJA,KAEd,aAAgB,WACd0C,EAAmB1J,EAAMyI,QAAQgB,iBACjCE,EAAW3J,EAAMyI,QAAQA,QAC3B,GAAG,CAACzI,EAAMyI,UAEV,IAAMmB,EAAyBH,EAAkB,mBAAqB,YAEhEI,GACH7J,EAAM4D,sBACN5D,EAAM+B,gBACN/B,EAAM8J,4BAA8B9J,EAAM4H,cAG7C,OACE,uBAAKtH,UAAU,6BACXuJ,EAEE,uBAAKvJ,UAAU,aACb,0BAAQA,UAAS,qDAAgD,mBAAwB,iBAAiB,YACxG,gBAAC6C,EAAA,EAAY,CAACC,QAASuF,EAAMrI,UAAU,uBACvC,wBAAMA,UAAU,QAAQ0G,IAE1B,sBACE1G,UAAU,gCAETmJ,GACC,gBAACJ,EAAa,CACZC,OAAoB,WAAZb,EACRjH,MAAO,EAAU,UACjB+H,YAAa,EAAU,qBACvBtI,QAAS,kBAAMjB,EAAM+J,mBAAmB,UAAU,EAAM,IAG5D,gBAACV,EAAa,CACZC,OAAQb,IAAYmB,GAA0B5J,EAAMyI,QAAQK,qBAC5DtH,MAAO,EAAU,gBACjB+H,YAA+B,EAAlBE,EAA4B,0BAAuC,iBAChFxI,QAAS,kBAAMjB,EAAM+J,mBAAmBH,GAAwB,EAAK,IAEvE,gBAACP,EAAa,CACZC,OAAQb,IAAYmB,IAA2B5J,EAAMyI,QAAQK,qBAC7DtH,MAAO,EAAU,kBACjB+H,YAAa9B,EAAqBzH,EAAMyG,OAAQzG,EAAM2H,WAAY3H,EAAM4H,eACxE3G,QAAS,kBAAMjB,EAAM+J,mBAAmBH,GAAwB,EAAM,IAExE,gBAACP,EAAa,CACZC,OAAoB,YAAZb,EACRjH,MAAO,EAAU,WACjB+H,YAAa,EAAU,sBACvBtI,QAAS,kBAAMjB,EAAM+J,mBAAmB,WAAW,EAAM,MAM/D,gCACE,gBAAC5G,EAAA,EAAY,CAACC,QAASuF,EAAMrI,UAAU,uBACvC,4BAAO0G,IAMnB,C,eC5LM,SAAUgD,KACd,OACE,uBAAKjJ,MAAM,KAAKC,OAAO,KAAKiJ,QAAQ,YAAYC,KAAK,QACnD,0BAAQC,GAAG,KAAKC,GAAG,KAAKC,EAAE,KAAKH,KAAK,mBACpC,4BACE,2BAASzJ,GAAG,WAAW6J,oBAAoB,oBAAoBvJ,MAAM,IAAIC,OAAO,KAC9E,uBAAKuJ,UAAU,qBAAqBC,UAAU,uBAEhD,yBAAO/J,GAAG,oBAAoBM,MAAM,MAAMC,OAAO,MAAMuJ,UAAU,wzaAIzE,CCZM,SAAUE,KACd,OACE,uBAAKR,QAAQ,YAAYC,KAAK,QAC5B,wBAAMQ,EAAE,0fAA0fR,KAAK,SACvgB,wBAAMQ,EAAE,4sBAA4sBR,KAAK,SAG/tB,C,gBCEM,GAAY,0BAEZ,SAAUS,KACd,IAAMrK,EAAY,GAAH,OAAM,YAAa,uDAElC,OACE,gBAACsK,EAAA,EAAO,CAACpJ,MAAOW,EAAA,YAA0B,GAAW,4BAA6BR,UAAQ,GACxF,sBAAIrB,UAAU,6BACZ,sBAAIA,UAAWA,EAAWuK,MAAO,CAAEC,OAAQ,IACzC,gBAACd,GAAqB,OAGxB,sBAAI1J,UAAS,UAAKA,EAAS,YAAI,uBAA2BuK,MAAO,CAAEC,OAAQ,IACzE,gBAACL,GAAoB,QAK/B,C,2HCXA,IAAM,GAAY,oBAmBZ,SAAUM,GAAY/K,GAC1B,I,IAAmD,G,EAArB,YAAe,G,EAAM,E,o5BAA3C0F,EAAM,KAAEC,EAAS,KAkBzB,OACE,gCACE,uBAAKrF,UAAU,qDACb,uBAAKA,UAAS,UAAKN,EAAM2D,UAAY,QAAU,mCAC5C3D,EAAM2D,UAEH,gCACE,uBAAKrD,UAAU,0DACb,gBAACkJ,EAAa,CACZzH,eAAgB/B,EAAM2D,UAAU5B,eAChC6B,oBAAqB5D,EAAM2D,UAAUC,oBACrC6E,QAASzI,EAAMyI,QACfD,aAAcxI,EAAM2D,UAAUqH,aAC9BzC,OAAQvI,EAAM2D,UAAU4E,OACxBwB,mBAAoB/J,EAAM+J,mBAC1BnC,cAAe5H,EAAM4H,cACrBnB,OAAQzG,EAAMyG,OACdkB,WAAY3H,EAAM2H,WAClBmC,0BAA2B9J,EAAM8J,6BAGrC,gBAACmB,GAAA,EAAS,CAACvI,MAAO1C,EAAM2D,UAAUiC,IAAKU,OArCrD,WAEMZ,IAGJC,GAAU,GAEVa,EAAA,gBAA8B,OAAD,UACxBxG,EAAMyG,QACRD,EAAA,eAA6BG,EAAA,sBAAoC3G,EAAM4G,YAAa,CACrFC,WAAY,WACZC,WAAY,cACZC,aAAc,WAElB,KA0BY,uBAAKzG,UAAU,6BACb,uBAAKA,UAAU,QACZN,EAAMkL,mBACL,gBAACP,GAAsB,MAEvB,gBAACxH,EAAA,EAAY,CAACC,QAAS,UAAmB9C,UAAU,mBAIxD,wBAAMA,UAAU,eAAc,gBAACyD,EAAA,EAAI,CAACjE,UAAW,GAAWU,OAAO,mBAKvER,EAAM2D,WACN,gBAACT,EAAA,EAAS,CAAC5C,UAAU,YAAYW,QAASjB,EAAMmL,mBAC9C,gBAACpH,EAAA,EAAI,CAACvD,OAAO,iBAMzB,C,+DC5FM,GAAY2B,EAAA,mBAAiC,sBAE7CiJ,GAA0B,QAAa1G,MAAM,CACjDQ,QAAS,QACNmG,IAAI,KAAK,kBAAM,GAAU,gBAAgB,MAO9C,SAASC,KACP,IAAMhK,GAAc,UAEpB,OACE,gBAAC,MAAU,KACT,gBAACiK,GAAA,EAAS,CACRC,UAAU,WACVzG,KAAK,UACLtE,GAAG,UACHsC,YAAa,GAAU,eACvBL,MAAOpB,EAAYQ,OAAOoD,QAC1BvE,MAAO,GAAU,SACjB8K,mBAAiB,IAEnB,gBAACrE,EAAA,EAAY,KACX,gBAACA,EAAA,SAAmB,CAAC1G,QAAQ,OAAOsG,KAAM,GAAU,YAI5D,CAMM,SAAU0E,GAAa1L,GAU3B,OACE,gBAAC2L,GAAA,EAAW,CACVC,cAAe,CAAE1G,QAAS,IAC1B2G,iBAAkBT,GAClBU,SAbJ,SAAkBC,EAA2BC,GAC3C,IAAI9G,EAAkB,KAElB6G,EAAK7G,UACPA,EAAU6G,EAAK7G,SAEjBlF,EAAMiM,aAAa/G,EAAS8G,EAC9B,EAOIE,oBAAoB,GAEpB,gBAACZ,GAAgB,MAGvB,C,i7CCtCA,IAAM,GAAY,eACZ,GAAYnJ,EAAA,mBAAiC,IAEnD,SAASgK,GACPC,EACAC,EACAC,EACAC,GAEA,IAAKH,EACH,MAAO,GAET,IAAMI,EAAc,aAAKH,GAAiB,GAAKC,IAA0B1L,KAAI,SAAA6E,GAAC,OAAIA,EAAEhF,EAAE,IAEtF,OAAO2L,EAAmBK,QAAO,SAAAhH,GAE/B,OAAI+G,EAAYE,SAASjH,EAAEhF,KAIvBgF,EAAEhF,KAAO8L,CAIf,GACF,CAkCM,SAAUI,GAAU3M,G,QAC8C,KAAhC,WAA6B,IAAG,GAA9D4M,EAAU,KAAEC,EAAa,KAC8C,KAArB,YAAe,GAAM,GAAvEC,EAAoB,KAAEC,EAAuB,KAE7CC,GAAmB,EAAAC,GAAA,KAAnBD,eACFE,EAAkCF,EAAeG,GAAA,sBAsEjDC,EAAiBJ,EAAeG,GAAA,iBACpCH,EAAeG,GAAA,sBACfH,EAAeG,GAAA,0BAEXE,EAAiBlB,GACrBnM,EAAMsN,iBACNV,EACA5M,EAAMuN,sBACNvN,EAAMwN,YAAY/M,IAYpB,OAJA,aAAgB,WACdsM,IAA0B/M,EAAMyN,mBAClC,GAAG,CAACzN,EAAMyN,qBAGR,gCACGL,GACC,uBAAK9M,UAAU,4CACb,uBAAKA,UAAS,0DACZ,gBAACoN,EAAA,EACD,CACE5M,IAA6C,QAAxC,EAAAuM,aAAc,EAAdA,EAAgBzM,KAAI,SAAA6E,GAAC,OAAIA,EAAEhF,EAAE,IAAEkN,KAAK,YAAI,QAAI,eACjDC,aAAc,kBAAMC,EAAA,gBAAwB7N,EAAM8N,cAAe,YAAY,EAC7EC,kBA1DZ,SAA2BC,GACzB,IAAMC,EAAwB,GAoB9B,OAlBIjB,EAAeG,GAAA,iBACjBc,EAAQC,KAAK,CACXC,MAAO,OACPC,QAAS,CACPC,YAAa,CACX9F,OAAQ,CAAC,GAAD,OAAI+F,GAAA,yBACZC,WAAYvO,EAAMwN,YAAYe,eAMlCvB,EAAeG,GAAA,sBACjBc,EAAQC,KAAK,CAAEC,MAAO,cAEpBnB,EAAeG,GAAA,2BACjBc,EAAQC,KAAK,CAAEC,MAAO,oBAEjB,CACLH,MAAAA,EACAC,QAAAA,EACAO,WAAY,OACZC,MAAO,IAEX,EAgCYC,eAAgB1O,EAAM2O,qBACtBC,wBAAyB,SAACC,GAAgC,OACxD1C,GACE0C,aAAW,EAAXA,EAAaC,QACblC,EACA5M,EAAMuN,sBACNvN,EAAMwN,YAAY/M,GACnB,EAEH4M,eAAgBA,EAChBT,WAAYA,EACZmC,qBAAsB,SAAAC,GAAS,OAAInC,EAAc,GAAD,UAAMD,GAAU,CAAEoC,IAAY,EAC9EC,gBAAiB,SAAAD,GAAS,OAAInC,EAAcD,EAAWH,QAAO,SAAAhH,GAAC,OAAIA,EAAEhF,KAAOuO,EAAUvO,EAAE,IAAE,EAC1FsC,YAAa,GAAU,qBACvBmM,YAAalP,EAAMkP,YACnBC,iBAAkB,EAClBC,sBAAuBpP,EAAMqP,qBAvGzC,SAA+B5O,GACxBT,EAAMqP,qBAwBXrP,EAAMqP,oBAAoB5O,GArBT,SAAC6O,GAChB,IAAMC,EAA8B,GAEpC3C,EAAW4C,SAAQ,SAAAR,G,MACjB,GAAIA,EAAUvO,KAAOA,EACnB,OAAO8O,EAAcrB,KAAKc,GAE5B,IAAMS,EAAmBC,EAAA,YAAmDV,IAE5D,QAAX,EAAAM,aAAK,EAALA,EAAOvD,YAAI,eAAExL,QAGhBkP,EAAiBH,MAAQA,EAFzBG,EAAiBH,MAAQ,CAAEK,MAAO,EAAG5D,KAAM,GAAI6D,WAAY,MAK7DL,EAAcrB,KAAKuB,EACrB,IAEA5C,EAAcgD,EAAA,OAAiBN,EAAe,MAChD,GAGF,EA8EYO,aAAc,IACdC,mBAAoB/P,EAAM+P,mBAC1BC,mBAAoBhQ,EAAMgQ,mBAC1BC,qBAAsBjD,EAAeG,GAAA,yBAItCP,EAAWrM,QAAUP,EAAMuN,sBAAsBhN,OAEhD,2BACE,sBAAID,UAAU,oBAAmB,gBAACyD,EAAA,EAAI,CAACvD,OAAO,cAC9C,gBAAC,KAAU,CAAC0P,YAAU,GACpB,sBAAI5P,UAAU,iBACXN,EAAMuN,sBAAsB3M,KAAI,SAAA8J,GAAC,OAChC,sBAAI5J,IAAK4J,EAAEjK,GAAIH,UAAU,aACvB,gBAAC6P,EAAA,EAAa,CACZ1J,OAAQiE,EACRwE,YAAalP,EAAMkP,YACnBkB,gBAAiBpQ,EAAMqQ,uBACvBC,gBAAiBtD,EAAeG,GAAA,uBAE/B,OAKX,mCAEHP,EAAWrM,QAEZ,uBAAKD,UAAU,QACb,gBAACoL,GAAY,CACXO,aAnJd,SAAsB/G,EAAiB8G,GACrChM,EAAMiM,aACJW,EAAWhM,KAAI,SAAA6E,GAAC,MAAK,CAAEhF,GAAIgF,EAAEhF,GAAI8P,OAAQ9K,EAAE8K,OAAQ,IACnDrL,GACA,WACE2H,EAAc,IACdb,GACF,GAEJ,OAiJMY,EAAWrM,SAAWuM,GACtB,uBAAKxM,UAAS,uBAAkB8M,EAAiB,YAAc,qBAC7D,2BACGpN,EAAM2D,WACL,uBAAKrD,UAAU,oBAAmB,gBAACyD,EAAA,EAAI,CAACjE,UAAW,GAAWU,OAAO,eAEvE,gBAACuK,GAAW,CACVtE,OAAQzG,EAAMyG,OACdG,WAAY5G,EAAM4G,WAClBjD,UAAW3D,EAAM2D,UACjB6M,oBAAqBxQ,EAAMwQ,oBAC3BrF,kBAtFZ,WACE4B,GAAwB,GACxB/M,EAAMmL,mBACR,EAoFYsC,mBAAoBzN,EAAMyN,mBAC1BgD,eAAgBzQ,EAAMyQ,eACtBhI,QAASzI,EAAMyI,QACfD,aAAcxI,EAAMyG,OAAO8J,OAC3BxG,mBAAoB/J,EAAM+J,mBAC1BmB,mBAAoBlL,EAAM0Q,wBAC1B9I,cAAeoF,EAAeG,GAAA,qBAC9BxF,WAAY3H,EAAM2H,WAClBmC,0BAA2B9J,EAAM8J,4BAElC9J,EAAM2D,WAAa3D,EAAM0Q,yBACxB,uBAAKpQ,UAAS,WAAuB,QAAlB,EAAAN,EAAM2Q,oBAAY,eAAEpQ,SAAUP,EAAM4Q,SAAW,YAAc,GAAE,eAChF,gBAACC,GAAA,EAAiB,CAChBF,aAAc3Q,EAAM2Q,aACpB/K,IAAK5F,EAAM2D,UAAUiC,IACrBkL,WAAY9Q,EAAM8Q,WAClBC,QAAS7D,EACLlN,EAAMgR,0BACNhR,EAAMiR,uBAKfjR,EAAM2D,WAAa3D,EAAM4Q,UACxB,uBAAKtQ,UAAU,QACb,gBAACgH,EAAY,CAACC,oBAAqBvH,EAAMuH,uBAG5CvH,EAAM2D,WAAa3D,EAAMyQ,gBACxB,0BAAQnQ,UAAU,kCAAkCW,QAASjB,EAAMwQ,qBACjE,gBAACzM,EAAA,EAAI,CAACjE,UAAW,GAAWU,OAAO,wBAO5CsM,GACC,uBAAKxM,UAAU,sCACb,gBAAC4Q,EAAA,EAAO,CAACC,GAAG,MAAMC,UAAU,SAASC,KAAK,YAKpD,C,mJC5RA,IAAM,GAAY,eACZ,GAAYlP,EAAA,mBAAiC,IAgBnD,SAASmP,GAAkBtR,GACzB,I,IAAQgN,GAAmB,EAAAC,GAAA,KAAnBD,eAEqG,G,EAArD,aAAiBhN,EAAM2D,UAAUC,qB,EAAoB,E,o5BAArGlC,EAAmB,KAAEgC,EAAsB,KAEnD,OACE,gBAAC,MAAI,KACH,uBAAKpD,UAAU,0DACb,2BACE,yBAAOA,UAAU,QAAO,gBAACyD,EAAA,EAAI,CAACjE,UAAW,GAAWU,OAAO,qBAC3D,qBAAGF,UAAU,QAAO,gBAACyD,EAAA,EAAI,CAACjE,UAAW,GAAWU,OAAO,4BAEzD,gBAAC0C,EAAA,EAAS,CAACjC,QAASjB,EAAMuR,kBAAmBjR,UAAU,gCACrD,gBAACyD,EAAA,EAAI,CAACvD,OAAO,iBAIhBwM,EAAeG,GAAA,4BACd,gCACE,gBAAC9L,GAAA,EAAU,CAACK,oBAAqBA,IAChC1B,EAAM8J,2BACL,gBAACrG,GAAA,EAAY,CACXE,UAAW3D,EAAM2D,UACjBjC,oBAAqBA,EACrBgC,uBAAwBA,KAMhC,gBAAC0D,EAAA,EAAY,KACX,gBAACA,EAAA,SAAmB,CAACnG,QAASjB,EAAMqH,cAAeL,KAAM,GAAU,QAAStG,QAAQ,iBACpF,gBAAC0G,EAAA,SAAmB,CAAC1G,QAAQ,UAIrC,CAgBM,SAAU8Q,GAAcxR,GAC5B,IAAM4L,EAAsC,CAC1CnJ,SAAU,GACVkC,gBAAgB,EAChB5C,eAAgB/B,EAAM2D,UAAU5B,eAChC+G,qBAAsB9I,EAAM2D,UAAUmF,sBAGxC,OACE,gCACE,gBAAC6C,GAAA,EAAW,CACVC,cAAeA,EACfE,SAAU9L,EAAMyR,gBAChBC,mBAAmB,EACnB7F,iBAAkBpH,GAAA,GAElB,gBAAC6M,GAAiB,CAChB7K,OAAQzG,EAAMyG,OACdG,WAAY5G,EAAM4G,WAClBb,OAAQ/F,EAAM+F,OACdpC,UAAW3D,EAAM2D,UACjBuD,SAAUlH,EAAMkH,SAChBG,cAAerH,EAAMqH,cACrBF,iBAAkBnH,EAAMmH,iBACxBsB,QAASzI,EAAMyI,QACf8I,kBAAmBvR,EAAMuR,kBACzB3J,cAAe5H,EAAM4H,cACrBkC,0BAA2B9J,EAAM8J,6BAK3C,C,iMCvFA,IAAM,GAAY,eACZ,GAAY3H,EAAA,mBAAiC,IAEnD,SAASwP,GAAS7O,GAChB,OAAQA,GACN,IAAK,QAAS,OAAO,GAAU,cAC/B,IAAK,OAAQ,OAAO,GAAU,aAC9B,IAAK,cAAe,OAAO,GAAU,oBACrC,IAAK,SAAU,OAAO,GAAU,eAChC,IAAK,WAAY,OAAO,GAAU,iBAClC,IAAK,UAAW,OAAO,GAAU,cAErC,CAUA,IAAM8N,GAAW,SAAC9N,GAAwB,MAAc,UAATA,GAA6B,gBAATA,GAAmC,SAATA,CAAe,EACtG2N,GAAiB,SAAC3N,GAAwB,MAAc,UAATA,GAA6B,gBAATA,GAAmC,SAATA,CAAe,EAe5G,SAAU8O,GAAU5R,G,cAClB6R,GAAW,UAEXC,GAAS,UAGTC,GAAwB/R,EAAM8N,cAM6B,G,EAAnC,WAA4B,Q,EAAO,E,o5BAAzDkE,EAAM,KAAEC,EAAS,KAEjBjF,GAAmB,EAAAC,GAAA,KAAnBD,eAEFQ,EAAc,kBAAkC0E,GAAA,iBAChDzL,EAASE,EAAA,yBAAuC3G,EAAM4G,WAA7CD,CAAyD3G,EAAMkH,SAA0B,QAAhB,EAAAsG,EAAYzB,YAAI,eAAEtL,IACpGsF,EAAS,kBAA6BoM,GAAA,YACtCC,EAAY,kBAAiCL,GAAwBG,GAAA,WACrEvO,EAAY,kBAAgC0O,EAAA,yBAAqCrS,EAAMkH,WACvFoL,EAAkB,kBACtBD,EAAA,+BAA2CrS,EAAMkH,WAE7CqL,EAAa,mBAAmD,QAAhB,EAAA/E,EAAYzB,YAAI,eAAEwC,aACtE5H,EAAA,kCAAgD6G,EAAYzB,KAAKwC,WAAY+D,EAAgBvG,OAEzFyG,EAAsBhF,EAAYzB,MAAQ0G,EAAAC,EAAA,oBAAsClF,EAAYzB,KAAKtL,IAEjGkS,KAAgCH,aAAmB,EAAnBA,EAAqBjS,QACrD+M,EAAmB,kBAAmCqF,GAC1DN,EAAA,oBAAgCG,EAAqBhF,EAAYzB,KAAKwC,aAElE9F,EAAU,kBAA2C4J,EAAA,aAAyBrS,EAAMkH,WACpFS,EAAa,mBACD,QAAhB,EAAA6F,EAAYzB,YAAI,eAAE6G,kBAAmBC,GAAA,aAA4BrF,EAAYzB,KAAKwC,aAGpF,GAKI,EAAAuE,GAAA,GAAY,MAJdC,EAAsB,EAAtBA,uBACAC,EAAqB,EAArBA,sBACAlJ,EAAyB,EAAzBA,0BACAmJ,EAAiB,EAAjBA,kBAQF,SAASC,EAAgB3E,EAAoB4E,G,OACjB,QAAtB,EAAAA,EAAYZ,kBAAU,eAAEhS,SAC1B,aAAgBsR,EAAhB,CAA0BlL,EAAA,kCAAgD4H,EAAY4E,GAC1F,CAEA,SAAS9D,EAAoB5O,EAAY2S,GACvC,aAAgBvB,EAAhB,CAA0BQ,EAAA,oBAAgC5R,EAAI2S,GAChE,CAEA,SAASjI,IACHxH,EAAUoI,MAGdpF,EAAA,aAA2B,CACzBkL,SAAAA,EACApL,OAAQA,EAAOsF,KACfnF,WAAY5G,EAAM4G,WAClBkL,OAAAA,GAEJ,CAEA,SAASL,EAAgB1F,EAA4BsH,GACnD1M,EAAA,aACEkL,EACApL,EAAOsF,KACP/L,EAAM4G,WACNjD,EAAUoI,KACVA,EACA+F,GACA,kBAAMG,EAAU,OAAO,GACvBoB,EAEJ,CAEA,SAAS9B,IACP5K,EAAA,aACEkL,EACApL,EAAOsF,KACP/L,EAAM4G,WACNjD,EAAUoI,KACV+F,GACA,kBAAMG,EAAU,OAAO,GAE3B,CAEA,SAAShG,EAAasG,EAA8BrN,EAAiB8G,GACnErF,EAAA,4BAA0C,CACxCkL,SAAAA,EACApL,OAAQA,EAAOsF,KACfnF,WAAY5G,EAAM4G,WAClB4G,YAAaA,EAAYzB,KACzBwG,WAAAA,EACArN,QAAAA,EACAoN,gBAAiBA,EAAgBvG,KACjCuH,UAAW,SAAAH,GAAW,OAAID,EAAgB1F,EAAYzB,KAAKwC,WAAY4E,EAAY,EACnFE,QAAS,kBAAMvB,EAAOyB,MAAM,GAAU,mBAAoB,CAAExO,KAAM0B,EAAOsF,KAAKhH,OAAQ,EACtFiH,OAAAA,GAEJ,CAEA,SAASqE,EAAuBmD,EAAqBH,GACnD1M,EAAA,6BACEkL,EACA2B,EACAxT,EAAM4G,WACN0L,EAAgBvG,MAChB,SAAAoH,GAAW,OAAID,EAAgB1F,EAAYzB,KAAKwC,WAAY4E,EAAY,IACxE,WACErB,EAAOyB,MAAM,GAAU,2BACvBF,GAAWA,GACb,GAEJ,CAEA,SAAStJ,EAAmBtB,EAAuBK,GACjC,YAAZL,EAKJ,UACEoJ,EACAQ,EAAA,gBACE1O,EAAUoI,KAAKtL,GACfgI,EACAK,GACA,kBAAMgJ,EAAO2B,QAAQ,GAAU,mBAAoB,CAAE1O,KAAM0B,EAAOsF,KAAKhH,OAAQ,IAC/E,kBAAM+M,EAAOyB,MAAM,GAAU,iBAAkB,CAAExO,KAAM0B,EAAOsF,KAAKhH,OAAQ,KAX7EwM,GAcJ,CAmBA,IAAMmC,KAAelG,EAAYzB,OAC1BhG,EAAOgG,MACPgG,IAA0BK,EAAUrG,OACpCuG,EAAgBqB,eAChBlL,EAAQsD,OACRtF,EAAOsF,MACRkH,IACCtL,EAAWgM,cAElB,OACE,gBAAC,aAAiC,CAACjR,MAAO,IACxC,gBAACkR,GAAA,EAAK,CACJpS,MAAOmQ,GAAS3R,EAAM4G,YACtBkK,WAAY9Q,EAAM8Q,WAClB+C,oBAAqBH,EACrBI,iBAAmBJ,GAAc1B,EAAU,0BAA4B,GACvE+B,cAAc,OAEZ,WACA,IAAKL,EACH,OAAO,iCAET,OAAQ1B,GACN,IAAK,OACH,OACE,gBAACrF,GAAS,CACRhJ,UAAWA,EAAUoI,KACrB0B,mBAAoB9J,EAAUqQ,WAC9BvN,OAAQA,EAAOsF,KACfnF,WAAY5G,EAAM4G,WAClB2G,sBAAuBgF,EAAWxG,MAAQ,GAC1CuB,iBAAkBA,EAAiBvB,MAAQ,GAC3CZ,kBAAmBA,EACnBqF,oBAAqB,kBAAMyB,EAAU,gBAAgB,EACrDhG,aAAcA,EACdoE,uBAAwBA,EACxB9I,oBAAqB,kBAAM0K,EAAU,aAAa,EAClD9K,iBAAkBR,EAAA,sBAAoC3G,EAAM4G,YAC5DkH,cAAe9N,EAAM8N,eAAiB/H,EAAOgG,KAAK+B,cAClDoB,YAAanJ,EAAOgG,KAAKmD,YACzBP,qBAxDToD,EAGE,CACLkC,cAAe,UAAF,OAAY7B,EAAUrG,KAAKrJ,QAHjC,KAwDK8K,YAAaA,EAAYzB,KACzBsD,oBAAqBA,EACrB5G,QAASA,EAAQsD,KACjBhC,mBAAoBA,EACpB0G,eAAgBA,GAAezQ,EAAM4G,YACrCmJ,mBAAoB/P,EAAM+P,mBAC1BC,mBAAoBhQ,EAAMgQ,mBAC1BW,cAvOcuD,EAuOuBnB,EAvOUoB,EAuOcnB,EAtOxDoB,GAAA,uBAAuCF,EAAwBC,GAChE1H,QAAO,SAAA4H,GAAC,OAAIA,EAAEC,OAAO,IAAE1T,KAAI,SAAAyT,GAAC,OAAIA,EAAE5T,EAAE,KAsOxCuQ,0BAA2BhR,EAAMgR,0BACjCC,oBAAqBjR,EAAMiR,oBAC3BH,WAAY9Q,EAAM8Q,WAClBJ,wBAAyB1Q,EAAM0Q,wBAC/BE,SAAUA,GAAS5Q,EAAM4G,YACzBe,WAAYA,EAAWoE,KACvBjC,0BAA2BA,IAGjC,IAAK,gBACH,OACE,uBAAKxJ,UAAU,iCACb,gBAACkR,GAAa,CACZ/K,OAAQA,EAAOsF,KACfnF,WAAY5G,EAAM4G,WAClBb,OAAQA,EAAOgG,KACfpI,UAAWA,EAAUoI,KACrB7E,SAAUlH,EAAMkH,SAChBC,iBAAkBR,EAAA,sBAAoC3G,EAAM4G,YAC5D6K,gBAAiBA,EACjBF,kBAAmBA,EACnBlK,cAAe,kBAAM4K,EAAU,OAAO,EACtCxJ,QAASA,EAAQsD,KACjBnE,cAAeoF,EAAeG,GAAA,qBAC9BrD,0BAA2BA,KAInC,IAAK,aACH,OACE,uBAAKxJ,UAAU,iCACb,gBAAC2G,EAAS,CACRR,OAAQA,EAAOsF,KACfnF,WAAY5G,EAAM4G,WAClBb,OAAQA,EAAOgG,KACfpI,UAAWA,EAAUoI,KACrB7E,SAAUlH,EAAMkH,SAChBC,iBAAkBR,EAAA,sBAAoC3G,EAAM4G,YAC5DS,cAAe,kBAAM4K,EAAU,OAAO,KA9Q1D,IAAgCiC,EAAiCC,CAmRzD,CA1EE,IA8EV,C,ucC5TM,SAAUI,EAAavU,GAC3B,IAAQW,EAAqFX,EAArFW,MAAO6T,EAA8ExU,EAA9EwU,uBAAwBC,EAAsDzU,EAAtDyU,wBAAyBnU,EAA6BN,EAA7BM,UAAcoU,EAAU,EAAK1U,EAAvF,0EAEN,OACE,gBAACiD,EAAA,QAAU,CAAC3C,UAAU,cACpB,uBAAKA,UAAS,qBAAgBA,GAAa,KACzC,gBAACqU,EAAY,eAACrU,UAAU,oBAAuBoU,IAC/C,gBAACzR,EAAA,QAAU,CACT3C,UAAS,0CAAiE,WAA5BmU,EAAuC,YAAc,GAAE,wBACnGD,GACFjT,QAASmT,EAAWjU,IAEnBE,GAEFX,EAAM4U,iBAAmB5U,EAAM6U,qBAC9B,gCACE,iCACA,gBAACC,EAAA,EAAO,CAAC/D,QAAS/Q,EAAM4U,gBAAiBtU,UAAU,aAChDN,EAAM6U,uBAOrB,C,gDC1BM,SAAUE,EAA4C/U,GAC1D,IAEMgV,GAFa,UAAXlT,OAEa9B,EAAMiV,WAE3B,MAAqB,iBAAVD,EACF,iCAGP,uBAAK1U,UAAU,sCACZ0U,EAAMzU,OAAM,IAAGP,EAAMyO,MAAK,cAGjC,CCtBA,SAAgB,eAAiB,QAAQ,cAAgB,QAAQ,kBAAoB,QAAQ,0BAA4B,QAAQ,YAAc,QAAQ,QAAU,S,0bCmB3J3O,EAAY,mBAiCZ,SAAU6U,EACd3U,GAEA,I,IAAQkV,EAAgDlV,EAAhDkV,SAAUrB,EAAsC7T,EAAtC6T,mBAAuBa,EAAU,EAAK1U,EAAlD,mCAE8C,G,EAA1B,WAAeA,EAAM8C,M,EAAK,E,k5BAA5CA,EAAI,KAAEqS,EAAO,KASfC,EAAmBC,EAAA,aAA0BH,GAC/C,SAACI,GAAa,OAAKJ,EAASI,EAAE,EAC9B,iBAAqBJ,GAAYA,EAAW,KAEhD,GAAwB,aAApBR,EAAW5R,KACb,OAAI+Q,EAEA,uBAAKvT,UAAU,qBACb,gBAAC,KAAK,iBAAMoP,EAAA,OAAkBgF,EAAY,CAAC,cACxCU,GAGH,uBAAK9U,UAAW,WACd,gBAAC4Q,EAAA,EAAO,CAACE,UAAU,SAASvQ,KAAK,SAOvC,gBAAC,KAAK,iBAAM6O,EAAA,OAAkBgF,EAAY,CAAC,cACxCU,GAKP,IAAIG,EAAqB,qBAAH,OAAwB,qBAY9C,OAVIb,EAAWpU,YACbiV,GAAsB,IAAJ,OAAQb,EAAWpU,YAEnCoU,EAAWzS,WACbsT,GAAsB,IAAJ,OAAQ,8BAO1B,uBAAKjV,UAAWiV,GACd,gBAAC,KAAK,iBACC7F,EAAA,OAAkBgF,EAAY,CAAE,WAAY,OAAQ,cAAe,CACxE5R,KAAMA,EACNxC,UAAS,UAAK,gBAAoB,gDAEjC8U,GAEkB,aAApBV,EAAW5R,MACV,gBAACK,EAAA,EAAY,CACXC,QAAkB,aAATN,EAAsB,eAAyB,gBACxDxC,UAAS,uCAAkC,kBAC3CW,QA1DR,WAEIkU,EADW,aAATrS,EACM,OAEA,WACZ,IA0DF,CAOM,SAAUyI,EAAqCvL,GACnD,IACEW,EAUEX,EAVFW,MACAL,EASEN,EATFM,UACAkV,EAQExV,EARFwV,qBACAC,EAOEzV,EAPFyV,iBACAC,EAME1V,EANF0V,YACAC,EAKE3V,EALF2V,qBACAC,EAIE5V,EAJF4V,SACAC,EAGE7V,EAHF6V,SACApK,EAEEzL,EAFFyL,kBACGiJ,EAAU,EACX1U,EAXE,gJAaN,GAA4B,UAApBwC,EAAM,EAANA,OAAQsT,EAAO,EAAPA,QAIVC,EAAmB,WAAO,EAEhC,GAAwB,aAApBrB,EAAW5R,KAAqB,CAClC,IAAMkT,EAAStG,EAAA,OAAkB1P,EAAO,CAAE,WAAY,yBAKtD,OAHIA,EAAMiC,WACR+T,EAAO7U,SAAW4U,GAEb,gBAACxB,EAAY,iBAAKyB,GAC1B,CAED,IAAMC,EAAoB,OAAH,wBAClBvB,GAAU,CACbpU,UAAW4V,EAAA,gCACT1T,EACAsT,EACApB,EAAW3P,KACX8Q,EACAvV,EACoB,iBAAbN,EAAMmR,GAAkBnR,EAAMmR,GAAK,QAO9C,OAHInR,EAAMiC,WACRgU,EAAkB9U,SAAW4U,GAG7B,gBAAC9S,EAAA,QAAU,CAAC3C,UAAU,gBACjBK,GACD,gBAACsC,EAAA,QAAU,CAAC1B,QAASmT,EAAWjU,GAAIH,UAAU,6BAC3CK,EACA8U,GAAoB,wBAAMnV,UAAU,eAAa,KACjDoV,GACC,gBAACvS,EAAA,EAAY,CACX7C,UAAS,uCAAkC,eAC3C8C,QAAS,UACT5B,MAAOkU,EACPrS,iBAAkBsS,EAClBQ,iBAAe,IAGlB1K,GAAqB,wBAAMnL,UAAU,kBAAgB,IAAO,gBAACyD,EAAA,EAAI,CAACjE,UAAWA,EAAWU,OAAO,gBAE7FgV,KAA2Bd,EAAiD0B,WAC7E,uBAAK9V,UAAU,WACb,gBAACyU,EAAgB,CACfE,UAAYP,EAAW3P,KACvB0J,MAAQiG,EAAiD0B,cAOnE,gBAACzB,EAAY,iBAAKsB,MAEfL,GACD,gBAAC3S,EAAA,OAAS,CAAC3C,UAAU,kBAClBsV,GAIL,gBAAC,KAAY,CAAC7Q,KAAM2P,EAAW3P,OAC5B,SAACsR,GAAoB,OAAK,gBAACpT,EAAA,mBAAqB,CAACH,KAAK,WAAWuT,EAAqC,IAI/G,CAtKA1B,EAAa2B,aAAe,CAC1BC,aAAc,OA2EhBhL,EAAU+K,aAAe,CACvBC,aAAc,MACdZ,qBAAsB,M,ohBCrElB,SAAUhK,EAId3L,GACA,IAAQ0R,EAAmF1R,EAAnF0R,kBAAmB8E,EAAgExW,EAAhEwW,mBAAoB5K,EAA4C5L,EAA5C4L,cAAeE,EAA6B9L,EAA7B8L,SAAaxK,EAAW,EAAKtB,EAArF,uEAMAyW,EAAqC/E,GAAqB1R,EAAM6L,iBAClE7L,EAAM6L,iBAAiB6K,KA3D7B,SAA4D9K,GAC1D,IAAKA,EACH,MAAO,CAAC,EAEV,IAAM9J,EAAS,cAAuB8J,GAetC,OAbA,SAAS+K,EAAgBC,GACvBC,OAAOC,KAAKhV,GAAQ0N,SAAQ,SAAC1O,GACtBgB,EAAOiV,eAAejW,KAGvB,aAAsB8V,EAAM9V,IAC9B6V,EAAgBC,EAAM9V,IACC,OAAhBgB,EAAOhB,WACPgB,EAAOhB,GAClB,GACF,CAEA6V,CAAgB7U,GACTA,CACT,CAuCkCkV,CAAsBpL,IAClDA,EA4BEqL,EAA+B,CACnC/K,mBAAoBlM,EAAMkM,oBAG5B,OACE,gBAAC,KAAM,eACLgL,oBAAkB,GACb5V,EAA6D,CAClEsK,cAAe6K,EACf3K,SAnCoB,SACtBhK,EAAkB,GAEhB,IADAqV,EAAa,EAAbA,cAAeC,EAAS,EAATA,UAAWC,EAAa,EAAbA,cAOtBC,EAAgBd,GAAsBxW,EAAM6L,iBAC9C7L,EAAM6L,iBAAiB6K,KAAK5U,GAC5BA,EAEJgK,EAASwL,GAAe,WAAoD,I,IAAnDhP,EAAA,uDAA6C,CAAC,EAGrE,GAFAA,EAAQiP,OAASH,IAEb9O,EAAQ9F,OACV,IAAK,IAAL,MAA6BqU,OAAOW,QAAQlP,EAAQ9F,QAAO,eAAE,CAAxD,O,EAAA,K,EAAA,E,k5BAAQ1B,EAAG,KAAE4B,EAAK,KACrB2U,EAAcvW,EAAK4B,EACpB,CAGHyU,GAAc,EAChB,GACF,EAYIF,cAAeA,IAEd,eAA0BjX,EAAMkV,UAC7B,SAACI,GAA0B,OAAMtV,EAAMkV,SAA6DI,EAAE,EACtG,iBAAqBtV,EAAMkV,UAAYlV,EAAMkV,SAAW,KAIlE,CAEM,SAAUuC,IACd,OAAO,SACT,CApEA9L,EAAY2K,aAAe,CACzB5E,mBAAmB,EACnB8E,oBAAoB,E,kDC/BTN,EAAa,CACxBwB,8BAA6B,SAC3BlV,EACAsT,EACA6B,EACA9W,EACA+W,EACA9U,GAEA,IAAIxC,EAAY,GAWhB,OATAA,EA/BJ,SAAqBwC,EAAcjC,GACjC,IAAIP,EAAY,GAgBhB,OAZIA,EADG,WADCwC,EAEQ,cAGA,eAGH,OAATjC,IACFP,GAAa,IAAJ,OAAQA,EAAS,QAEf,OAATO,IACFP,GAAa,IAAJ,OAAQA,EAAS,QAErBA,CACT,CAagBuX,CAAY/U,EAAMjC,IAG1B,QAAMiV,EAAS6B,KAAc,QAAMnV,EAAQmV,KAC7CrX,GAAa,eAEXsX,IACFtX,GAAa,IAAJ,OAAQsX,IAEZtX,CACT,E","sources":["file:///app/packages/libs/shared/src/apps/share/components/embed-size/EmbedSize.tsx","file:///app/packages/libs/shared/src/apps/share/components/link-expiry/LinkExpiry.tsx","file:///app/packages/libs/shared/src/apps/share/components/set-password-input/set-password-input.scss","file:///app/packages/libs/shared/src/apps/share/components/set-password-input/SetPasswordInput.tsx","file:///app/packages/libs/shared/src/apps/share/components/link-password/LinkPassword.tsx","file:///app/packages/libs/shared/src/apps/share/utils/LinkExpiryHelper.ts","file:///app/packages/libs/shared/src/apps/share/validation/ShareLinkSettingsValidationSchema.ts","file:///app/packages/libs/shared/src/apps/share/components/copy-embed-html/copy-embed-html.scss","file:///app/packages/libs/shared/src/apps/share/components/copy-embed-html/CopyEmbedHtml.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/copy-embed/CopyEmbed.tsx","file:///app/packages/libs/shared/src/apps/share/components/get-embed-code/get-embed-code.scss","file:///app/packages/libs/shared/src/apps/share/components/get-embed-code/GetEmbedCode.tsx","file:///app/packages/libs/shared/src/apps/share/components/share-link-info/getRespectRatingText.ts","file:///app/packages/libs/shared/src/apps/share/components/share-link-info/share-link-info.scss","file:///app/packages/libs/shared/src/apps/share/components/share-link-info/ShareLinkInfo.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/avatars/GoogleClassroomAvatar.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/avatars/MicrosoftTeamsAvatar.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrationsStack.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-as-link/ShareAsLink.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-message/ShareMessage.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/main-share/MainShare.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-settings/ShareSettings.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/ShareView.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/utils/FormHelper.ts"],"sourcesContent":["import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nconst namespace = 'share.embedSize';\n\ninterface EmbedSizeProps {\n autoplay: boolean;\n setAutoplay: (autoplay: boolean) => void;\n videoSize: EmbedResolution;\n setVideoSize: (videoSize: EmbedResolution) => void;\n videoSizes: EmbedResolution[];\n}\n\nexport function EmbedSize(props: EmbedSizeProps): React.ReactElement {\n const {\n autoplay,\n setAutoplay,\n videoSize,\n setVideoSize,\n videoSizes\n } = props;\n\n return (\n <div className='d-flex align-items-center'>\n {!!videoSizes.length &&\n <>\n <div className='me-1'>\n <Text namespace={namespace} phrase='videoSize' />\n </div>\n <div className='pe-3'>\n <Dropdown>\n <Dropdown.Toggle id='embed-resolution' variant='outline-dark'>\n {videoSize.label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n {videoSizes.map(size => (\n <Dropdown.Item\n key={`${size.width}x${size.height}`}\n onClick={() => setVideoSize(size)}\n >\n {size.label}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </>\n }\n <div className='me-2'>\n <Text namespace={namespace} phrase='autoplay' />\n </div>\n <Checkbox id='autoplay-checkbox' checked={autoplay} onChange={() => setAutoplay(!autoplay)} />\n </div>\n );\n}","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'shared.linkExpiry';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LinkExpiryProps {\n passwordProtectLink: boolean;\n}\n\nexport function LinkExpiry(props: LinkExpiryProps): React.ReactElement {\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n function setLinkExpireDate(): void {\n if (props.passwordProtectLink)\n return;\n\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!formikProps.values.linkExpireDate));\n }\n\n return (\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='linkExpirationHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='linkExpirationInfo' /></p>\n </div>\n <Tooltip\n title={getPhrase('passwordProtected')}\n disable={!props.passwordProtectLink}\n spanHack\n trigger='hover'\n >\n <ToggleSwitch\n onClick={setLinkExpireDate}\n on={!!formikProps.values.linkExpireDate}\n disabled={props.passwordProtectLink}\n showStateWhenDisabled\n />\n </Tooltip>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"passwordButton\":\"W9Jl8\"};","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './set-password-input.scss';\n\nconst namespace = 'share.setPasswordInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SetPasswordInputProps {\n value: string;\n onChange: (value: string) => void;\n onReset?: () => void;\n /**\n * Allow user to view and edit current value.\n */\n canEdit?: boolean;\n /**\n * Don't allow user to view/edit current value\n * but allow them to clear it and enter a new value.\n */\n canReset?: boolean;\n placeholder?: string;\n}\n\nexport function SetPasswordInput(props: SetPasswordInputProps): JSX.Element {\n const [ revealPassword, setRevealPassword ] = React.useState(false);\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n const errorMsg = formikProps.errors?.password;\n\n return (\n <>\n <input\n className={`form-control ${errorMsg ? 'is-invalid' : ''}`}\n value={props.value}\n onChange={e => {\n !!props.canEdit && props.onChange(e.target.value);\n }}\n type={revealPassword ? 'text' : 'password'}\n placeholder={props.placeholder || getPhrase('passwordPlaceholder')}\n readOnly={!props.canEdit}\n />\n {!!errorMsg && (\n <Form.Control.Feedback type='invalid'>{errorMsg}</Form.Control.Feedback>\n )}\n {!!props.canEdit &&\n <DivButton className={styles.passwordButton} onClick={() => setRevealPassword(!revealPassword)}>\n <SvgContainer\n svgName={revealPassword ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n title={getPhrase(revealPassword ? 'hidePassword' : 'revealPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n {!props.canEdit && !!props.canReset && !!props.onReset &&\n <DivButton className={styles.passwordButton} onClick={props.onReset}>\n <SvgContainer\n svgName={cvSvgLibrary.Close} title={getPhrase('resetPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n </>\n );\n}","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { SetPasswordInput } from 'libs/shared/apps/share/components/set-password-input/SetPasswordInput';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.linkPassword';\n\nconst PASSWORD_PLACEHOLDER = '********';\n\ninterface LinkPasswordProps {\n shareLink: ShareLink;\n passwordProtectLink: boolean;\n setPasswordProtectLink: (protect: boolean) => void;\n}\n\nexport function LinkPassword(props: LinkPasswordProps): React.ReactElement {\n const { passwordProtectLink, setPasswordProtectLink } = props;\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n \n const [ readonlyPassword, setReadonlyPassword ] = React.useState(!!props.shareLink?.isPasswordProtected);\n\n function onTogglePasswordProtect(): void {\n if (props.shareLink?.isPasswordProtected)\n formikProps.setFieldValue('removePassword', passwordProtectLink);\n\n formikProps.setFieldValue('password', '');\n\n setPasswordProtectLink(!passwordProtectLink);\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!passwordProtectLink));\n }\n\n function setPassword(password: string): void {\n formikProps.setFieldValue('password', password);\n }\n\n function resetPassword(): void {\n formikProps.setFieldValue('password', '');\n formikProps.setFieldValue('removePassword', true);\n setReadonlyPassword(false);\n }\n\n return (\n <div className='pb-3'>\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='passwordProtectHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='passwordProtectInfo' /></p>\n </div>\n <ToggleSwitch onClick={onTogglePasswordProtect} on={passwordProtectLink} />\n </div>\n\n {passwordProtectLink &&\n <div className='position-relative mt-2'>\n <SetPasswordInput\n value={readonlyPassword ? PASSWORD_PLACEHOLDER : formikProps.values.password}\n onChange={setPassword}\n onReset={resetPassword}\n canEdit={!readonlyPassword}\n canReset\n />\n </div>\n }\n </div>\n );\n}","const LINK_EXPIRY_TIME = 30; // days\nexport function getLinkExpiryDate(shouldExpire: boolean): string | null {\n if (!shouldExpire)\n return null;\n\n const date = new Date();\n date.setDate(date.getDate() + LINK_EXPIRY_TIME);\n\n return date.toISOString();\n}","import { boolean, object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'share.validation';\n\nexport const ShareLinkSettingsValidationSchema = object().shape({\n removePassword: boolean(),\n resourceId: string(),\n linkExpireDate: string().nullable(),\n password: string()\n .test({\n name: 'password-length',\n exclusive: false,\n params: {},\n message: LanguageService.getPhrase(namespace, 'minPassword'),\n test: val => {\n const removePassword = ((this as any)?.parent as any)?.removePassword;\n\n if (removePassword)\n return true;\n\n if (!val?.length)\n return true;\n\n if (val.length < 3)\n return false;\n\n return true;\n }\n })\n .default('')\n});","// extracted by mini-css-extract-plugin\nexport default {\"embedHtmlInput\":\"mwvd0\",\"copyBtnContainer\":\"myePx\"};","import React from 'react';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmbedSize } from 'libs/shared/apps/share/components/embed-size/EmbedSize';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BaseObject, Config, PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { EmbedHelper, EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nimport styles from './copy-embed-html.scss';\n\nconst namespace = 'share.copyEmbedHtml';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype CopyEmbedHtmlProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n entityId: string;\n shareId: string;\n embedUrl: string;\n}>;\n\nexport function CopyEmbedHtml(props: CopyEmbedHtmlProps): JSX.Element {\n const videoSizes = EmbedHelper.getEmbedResolutions();\n\n const [ copyBtnPhrase, setCopyBtnPhrase ] = React.useState<'copy' | 'copied'>('copy');\n const [ autoplay, setAutoplay ] = React.useState(false);\n const [ videoSize, setVideoSize ] = React.useState<EmbedResolution>(videoSizes.find(s => s.width === '100%'));\n\n const [ logged, setLogged ] = React.useState(false);\n function onCopy(): void {\n setCopyBtnPhrase('copied');\n setTimeout(() => setCopyBtnPhrase('copy'), 2000);\n\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n ...props.entity,\n embedDetails: {\n size: videoSize,\n autoplay\n }\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyEmbedHtml,\n eventVersion: EventVersion.V3\n }));\n }\n\n const url = EmbedHelper.buildEmbedUrl({\n embedUrl: props.embedUrl,\n host: props.config.primaryUrl,\n shareId: props.shareId,\n autoplay\n });\n \n const embedString = EmbedHelper.getEmbedString({\n url,\n size: videoSize\n });\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <label><Text namespace={namespace} phrase='label' /></label>\n <div className='position-relative mb-3'>\n <textarea\n className={`form-control rounded w-100 h-100 ${styles.embedHtmlInput}`}\n spellCheck={false}\n value={embedString}\n rows={7}\n readOnly\n />\n <CopyToClipboard onCopy={onCopy} text={embedString}>\n <button className={`btn btn-outline-dark border border-secondary position-absolute bottom-0 end-0 ${styles.copyBtnContainer}`} type='button'>\n {getPhrase(copyBtnPhrase)}\n </button>\n </CopyToClipboard>\n </div>\n <EmbedSize\n autoplay={autoplay}\n setAutoplay={setAutoplay}\n videoSize={videoSize}\n setVideoSize={setVideoSize}\n videoSizes={videoSizes}\n />\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CopyEmbedHtml } from 'libs/shared/apps/share/components/copy-embed-html/CopyEmbedHtml';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BaseObject, Config, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\n\ninterface CopyEmbedProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n config: Config;\n entityId: string;\n analyticsOptions: AnalyticsOptions;\n onClickCancel: () => void;\n}\n\nexport function CopyEmbed(props: CopyEmbedProps) {\n return (\n <>\n <div className='mb-3'>\n <CopyEmbedHtml\n embedUrl={props.shareLink.embedUrl}\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n entityId={props.entityId}\n shareId={props.shareLink.id}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n\n <PopupButtons>\n <DivButton onClick={props.onClickCancel} className='btn btn-outline-dark'>\n <Text namespace={namespace} phrase='back'/>\n </DivButton>\n </PopupButtons>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"hoverBackground\":\"ICTmv\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './get-embed-code.scss';\n\nconst namespace = 'share.getEmbedCode';\n\ninterface GetEmbedCodeProps {\n onClickGetEmbedCode: () => void\n}\n\nexport function GetEmbedCode(props: GetEmbedCodeProps) {\n return (\n <DivButton\n onClick={props.onClickGetEmbedCode}\n className={`d-inline-block p-1 pe-2 rounded-1 ${styles.hoverBackground}`}\n >\n <div className='d-flex align-items-center'>\n <div className='bg-dark text-white rounded-1 me-2'>\n <SvgContainer svgName={cvSvgLibrary.Code} size={SvgContainerSize.Large} />\n </div>\n <Text namespace={namespace} phrase='getEmbedCode' />\n </div>\n </DivButton>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n\n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n\n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n\n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n\n /**\n * Restrictions without a year group are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n\n const rating = VideoHelper.getRating(video);\n\n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n\n for (const yearGroup of yearGroups) {\n /**\n * If our year group is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n\n /**\n * If the restriction is higher than this year group, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n\n /**\n * If therating is higher than this year group's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n\n /**\n * If our year group is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n\n /**\n * If no year groups are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n\n /**\n * We differentiate the copy if it's the highest year group or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n\n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n}","// extracted by mini-css-extract-plugin\nexport default {\"hoverBackground\":\"R3fNE\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { getRespectRatingText } from 'libs/shared/apps/share/components/share-link-info/getRespectRatingText';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacyResponse } from '../../interfaces/responses/SharePrivacyResponse';\n\nimport styles from './share-link-info.scss';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareLinkInfoProps {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n onClickSavePrivacy?: (privacy: SharePrivacy, onClickSavePrivacy: boolean) => void;\n entity: BaseObject;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\ninterface GetIconAndTextOptions extends ShareLinkInfoProps {}\n\nconst getPrivateIconAndText = (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n\n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n\n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n\n switch (privacy.privacy) {\n case 'public':\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n return { icon: cvSvgLibrary.Lock, text: getRespectRatingText(entity, yearGroups, hasStudentExp) };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return { icon: cvSvgLibrary.Lock, text: getRespectRatingText(entity, yearGroups, hasStudentExp) };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: cvSvgLibrary.Lock, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n};\n\nconst getIconAndText = (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return getPrivateIconAndText(options);\n\n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n\n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n\n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n\n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n\n return { icon: cvSvgLibrary.Timer, text };\n }\n\n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n\n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n\n return { icon: cvSvgLibrary.Lock, text };\n};\n\ninterface ShareLinkItemProps {\n active: boolean;\n title: string;\n description: string;\n onClick: () => void\n}\n\nfunction ShareLinkItem(props: ShareLinkItemProps) {\n const { active, title, description, onClick } = props;\n\n return (\n <li className={`${active ? 'bg-light-blue' : ''} dropdown-item`} onClick={!active ? onClick : null}>\n <p className='fw-semibold mb-1'>{title}</p>\n <p className='font-size-sm mb-0'>{description}</p>\n </li>\n );\n}\n\nexport function ShareLinkInfo(props: ShareLinkInfoProps): JSX.Element {\n const [ canManageAccess, setCanManageAccess ] = React.useState(false);\n const [ privacy, setPrivacy ] = React.useState<SharePrivacy>(null);\n\n const { icon, text } = getIconAndText(props);\n\n React.useEffect(() => {\n setCanManageAccess(props.privacy.canManageAccess);\n setPrivacy(props.privacy.privacy);\n }, [props.privacy]);\n\n const canManageAccessPrivacy = canManageAccess ? 'just_my_customer' : 'protected';\n\n const canUpdatePrivacy = (\n !props.isPasswordProtected &&\n !props.linkExpireDate &&\n (props.shareOverrideRestrictions && !props.hasStudentExp)\n );\n\n return (\n <div className='d-flex align-items-center'>\n {(canUpdatePrivacy)\n ? (\n <div className='btn-group'>\n <button className={`btn border-0 info-link dropdown-toggle p-1 ${styles.hoverBackground}`} data-bs-toggle='dropdown'>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span className='me-1'>{text}</span>\n </button>\n <ul\n className='dropdown-menu cursor-pointer'\n >\n {canManageAccess &&\n <ShareLinkItem\n active={privacy === 'public'}\n title={getPhrase('public')}\n description={getPhrase('publicDescription')}\n onClick={() => props.onClickSavePrivacy('public', false)}\n />\n }\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && props.privacy.overrideRestrictions}\n title={getPhrase('justMySchool')}\n description={canManageAccess ? getPhrase('justMySchoolDescription') : getPhrase('clickViewOnly')}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, true)}\n />\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && !props.privacy.overrideRestrictions}\n title={getPhrase('respectRatings')}\n description={getRespectRatingText(props.entity, props.yearGroups, props.hasStudentExp)}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, false)}\n />\n <ShareLinkItem\n active={privacy === 'private'}\n title={getPhrase('private')}\n description={getPhrase('privateDescription')}\n onClick={() => props.onClickSavePrivacy('private', false)}\n />\n </ul>\n </div>\n )\n : (\n <>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span>{text}</span>\n </>\n )\n }\n </div>\n );\n}","import React from 'react';\n\nexport function GoogleClassroomAvatar(): JSX.Element {\n return (\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n <circle cx='12' cy='12' r='12' fill='url(#pattern0)'/>\n <defs>\n <pattern id='pattern0' patternContentUnits='objectBoundingBox' width='1' height='1'>\n <use xlinkHref='#image0_3558_14996' transform='scale(0.00520833)'/>\n </pattern>\n <image id='image0_3558_14996' width='192' height='192' xlinkHref='data:image/png;base64,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'/>\n </defs>\n </svg>\n );\n}","import React from 'react';\n\nexport function MicrosoftTeamsAvatar(): JSX.Element {\n return (\n <svg viewBox='0 0 40 40' fill='none'>\n <path d='M29.692 15.31c.58 0 1.146-.173 1.628-.5a2.96 2.96 0 001.078-1.331 3.004 3.004 0 00-.634-3.235 2.918 2.918 0 00-1.5-.812 2.894 2.894 0 00-1.693.169 2.938 2.938 0 00-1.314 1.093 2.997 2.997 0 00.364 3.748 2.91 2.91 0 002.071.869zM20.043 26.267V13.849a.9.9 0 00-.259-.633.877.877 0 00-.624-.262H6.883a.877.877 0 00-.624.262.9.9 0 00-.259.633v12.418c0 .24.092.469.257.64.165.172.39.27.626.276H19.16a.899.899 0 00.626-.276.923.923 0 00.257-.64zm-3.51-10.389v1.92h-2.37v6.68H11.88V17.93H9.51v-2.182h7.022v.13z' fill='#fff'/>\n <path d='M21.874 14.132v.917a4.03 4.03 0 002.05-1.47c.512-.699.79-1.545.793-2.415 0-1.1-.431-2.154-1.199-2.932a4.065 4.065 0 00-2.893-1.214 4.065 4.065 0 00-2.894 1.214 4.175 4.175 0 00-1.199 2.932h2.391a2.996 2.996 0 012.061.887c.55.552.868 1.297.89 2.081zM26.332 17.1h-4.458v8.883c0 .8-.309 1.566-.86 2.138-.552.57-1.302.9-2.091.917h-4.588a7.047 7.047 0 003.265 3.317c1.427.7 3.046.887 4.593.532a6.99 6.99 0 003.918-2.486 7.152 7.152 0 001.535-4.418v-7.551a1.348 1.348 0 00-.385-.942 1.313 1.313 0 00-.929-.39zM32.772 17.1h-3.597c.206.414.316.87.323 1.332v7.551a9.1 9.1 0 01-.516 2.859c.236.021.474.021.71 0a4.28 4.28 0 003.046-1.278A4.394 4.394 0 0034 24.477v-6.045c0-.339-.126-.665-.354-.912a1.307 1.307 0 00-.874-.42z' fill='#fff'/>\n </svg>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { GoogleClassroomAvatar } from './avatars/GoogleClassroomAvatar';\nimport { MicrosoftTeamsAvatar } from './avatars/MicrosoftTeamsAvatar';\n\nimport styles from './share-integrations.scss';\n\nconst namespace = 'share.shareIntegrations';\n\nexport function ShareIntegrationsStack(): JSX.Element {\n const className = `${styles.avatar} border border-light rounded-circle overflow-hidden`;\n\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'shareThroughIntegrations')} spanHack>\n <ul className='list-unstyled d-flex mb-0'>\n <li className={className} style={{ zIndex: 1 }}>\n <GoogleClassroomAvatar />\n </li>\n\n <li className={`${className} ${styles.msTeamsContainer}`} style={{ zIndex: 0 }}>\n <MicrosoftTeamsAvatar />\n </li>\n </ul>\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { ShareLinkInfo } from 'libs/shared/apps/share/components/share-link-info/ShareLinkInfo';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, ShareLink, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'share.shareAsLink';\n\ninterface ShareAsLinkProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n onClickShowSettings: () => void;\n onClickCreateLink: () => void;\n shareLinkIsLoading?: boolean;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n entityTypeId: MasterType;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n enableIntegrations: boolean;\n hasStudentExp: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareAsLink(props: ShareAsLinkProps): React.ReactElement {\n const [ logged, setLogged ] = React.useState(false);\n\n function onCopy(): void {\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n ...props.entity\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyLink,\n eventVersion: EventVersion.V3\n }));\n }\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n <div className={`${props.shareLink ? 'w-100' : 'w-75 d-flex align-items-center'}`}>\n {props.shareLink\n ? (\n <>\n <div className='d-flex justify-content-between align-items-center mb-1'>\n <ShareLinkInfo\n linkExpireDate={props.shareLink.linkExpireDate}\n isPasswordProtected={props.shareLink.isPasswordProtected}\n privacy={props.privacy}\n entityTypeId={props.shareLink.objectTypeId}\n status={props.shareLink.status}\n onClickSavePrivacy={props.onClickSavePrivacy}\n hasStudentExp={props.hasStudentExp}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n <CopyInput value={props.shareLink.url} onCopy={onCopy} />\n </>\n ) : (\n <div className='d-flex align-items-center'>\n <div className='me-2'>\n {props.enableIntegrations ? (\n <ShareIntegrationsStack />\n ) : (\n <SvgContainer svgName={cvSvgLibrary.Link} className='svg-container' />\n )}\n </div>\n \n <span className='fw-semibold'><Text namespace={namespace} phrase='createLink' /></span>\n </div>\n )\n }\n </div>\n {!props.shareLink &&\n <DivButton className='info-link' onClick={props.onClickCreateLink}>\n <Text phrase='createLink' />\n </DivButton>\n }\n </div>\n </>\n );\n}","import React from 'react';\nimport { Form as FormikForm } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\n\nconst getPhrase = LanguageService.encloseNamespace('share.shareMessage');\n\nconst MessageValidationSchema = Yup.object().shape({\n message: Yup.string()\n .max(280, () => getPhrase('maxMessageLen'))\n});\n\ninterface ShareMessageRequest {\n message?: string;\n}\n\nfunction ShareMessageForm(): React.ReactElement {\n const formikProps = useFormikContextWrapper<ShareMessageRequest>();\n\n return (\n <FormikForm>\n <FormField\n component='textarea'\n name='message'\n id='message'\n placeholder={getPhrase('placeholder')}\n value={formikProps.values.message}\n label={getPhrase('label')}\n showOptionalLabel\n />\n <PopupButtons>\n <PopupButtons.Submit variant='dark' text={getPhrase('share')} />\n </PopupButtons>\n </FormikForm>\n );\n}\n\ninterface ShareMessageProps {\n onClickShare: (message: string, onDone: () => void) => void\n}\n\nexport function ShareMessage(props: ShareMessageProps): React.ReactElement {\n function onSubmit(data: ShareMessageRequest, onDone: () => void): void {\n let message: string = null;\n\n if (data.message)\n message = data.message;\n\n props.onClickShare(message, onDone);\n }\n\n return (\n <FormWrapper<ShareMessageRequest>\n initialValues={{ message: '' }}\n validationSchema={MessageValidationSchema}\n onSubmit={onSubmit}\n allowInitialSubmit={true}\n >\n <ShareMessageForm />\n </FormWrapper>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { TypeFilter } from 'libs/shared/apps/search/interfaces/TypedFilter';\nimport { GetEmbedCode } from 'libs/shared/apps/share/components/get-embed-code/GetEmbedCode';\nimport { RecipientItem } from 'libs/shared/apps/share/components/recipient-item/RecipientItem';\nimport { TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT, TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareAsLink } from 'libs/shared/apps/share/views/share/components/share-as-link/ShareAsLink';\nimport { ShareIntegrations } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrations';\nimport { ShareMessage } from 'libs/shared/apps/share/views/share/components/share-message/ShareMessage';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { BaseObject, Classroom, ClassroomGroup, CurrentUser, PropsWithAnalyticsOptions, ShareLink, ShareRecipient, ShareSearchResponse, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction filterSearchResults(\n recipientsToFilter: BaseObject[],\n currentSelections: BaseObject[],\n existingShareRecipients: BaseObject[],\n currentUserId: string\n): BaseObject[] {\n if (!recipientsToFilter)\n return [];\n\n const selectedIds = [ ...currentSelections, ...existingShareRecipients ].map(s => s.id);\n\n return recipientsToFilter.filter(s => {\n // Prevent users from sharing to other users who have already been shared this resource\n if (selectedIds.includes(s.id))\n return false;\n\n // Prevent users from sharing to themselves\n if (s.id === currentUserId)\n return false;\n\n return true;\n });\n}\n\ntype MainShareProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType,\n directShareRecipients: BaseObject[];\n recentlySharedTo: BaseObject[];\n onClickCreateLink: () => void;\n onClickShowSettings: () => void;\n onClickShare: (recipients: ShareRecipient[], message: string, onDone?: () => void) => void;\n onClickRemoveRecipient: (recipientId: string, onError?: () => void) => void;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n onClickGetEmbedCode: () => void;\n gatewayApiUrl: string;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n searchRequestHeaders?: HashObject;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n integrations: IntegrationId[];\n shareLink?: ShareLink;\n shareLinkIsLoading?: boolean;\n fetchRecipientUsers?: (id: string, callback: (users: UserCollection) => void) => void;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n integrationSettingAppLink?: Core.AppLink;\n messagePopupAppLink?: Core.AppLink;\n closePopup: () => void;\n enableIntegrationBanner?: boolean;\n canEmbed?: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}>;\n\nexport function MainShare(props: MainShareProps): JSX.Element {\n const [ selections, setSelections ] = React.useState<BaseObject[]>([]);\n const [ showShareLinkSpinner, setShowShareLinkSpinner ] = React.useState(false);\n\n const { hasPermissions } = usePermissions();\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n\n function onClickShare(message: string, onDone: () => void): void {\n props.onClickShare(\n selections.map(s => ({ id: s.id, typeId: s.typeId })),\n message,\n () => {\n setSelections([]);\n onDone();\n }\n );\n }\n\n function fetchSelectionMembers(id: string): void {\n if (!props.fetchRecipientUsers)\n return;\n\n const callback = (users: UserCollection) => {\n const newSelections: BaseObject[] = [];\n\n selections.forEach(selection => {\n if (selection.id !== id)\n return newSelections.push(selection);\n\n const updatedSelection = ObjectHelper.deepClone<Classroom | ClassroomGroup>(selection);\n\n if (!users?.data?.length) {\n updatedSelection.users = { count: 0, data: [], pagination: null };\n } else {\n updatedSelection.users = users;\n }\n\n newSelections.push(updatedSelection);\n });\n\n setSelections(ArrayHelper.uniq(newSelections, 'id'));\n };\n\n props.fetchRecipientUsers(id, callback);\n }\n\n function getRemotePostBody(query: string): HashObject {\n const indices: TypeFilter[] = [];\n\n if (hasPermissions(PermissionName.ShareToUsers)) {\n indices.push({\n index: 'user',\n filters: {\n userProfile: {\n status: [`${ObjectStatus.Active.toLowerCase()}`],\n customerId: props.currentUser.customerId\n }\n }\n });\n }\n\n if (hasPermissions(PermissionName.ShareToClassrooms))\n indices.push({ index: 'classroom' });\n\n if (hasPermissions(PermissionName.ShareToClassroomGroups))\n indices.push({ index: 'classroom_group' });\n\n return {\n query,\n indices,\n searchType: 'user',\n limit: TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT\n };\n }\n\n const canDirectShare = hasPermissions(PermissionName.ShareToUsers) ||\n hasPermissions(PermissionName.ShareToClassrooms) ||\n hasPermissions(PermissionName.ShareToClassroomGroups);\n\n const recentSearches = filterSearchResults(\n props.recentlySharedTo,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n );\n \n function onClickCreateShareLink(): void {\n setShowShareLinkSpinner(true);\n props.onClickCreateLink();\n }\n\n React.useEffect(() => {\n setShowShareLinkSpinner(!!props.shareLinkIsLoading);\n }, [props.shareLinkIsLoading]);\n\n return (\n <>\n {canDirectShare && (\n <div className='bg-white rounded-bottom-3 pt-3 px-3 mb-2'>\n <div className={`d-flex justify-content-between align-items-center pb-3`}>\n <TokenizedTypeahead\n // This key is used to re-initialize TokenizedTypeahead whenever recentSearches changes\n key={recentSearches?.map(s => s.id).join(':') ?? 'share:search'}\n getRemoteUrl={() => UrlHelper.safeUrlConcat(props.gatewayApiUrl, 'v4/search')}\n getRemotePostBody={getRemotePostBody}\n requestHeaders={props.searchRequestHeaders}\n formatRemoteSuggestions={(suggestions: ShareSearchResponse) =>\n filterSearchResults(\n suggestions?.results,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n )\n }\n recentSearches={recentSearches}\n selections={selections}\n onSuggestionSelected={selection => setSelections([ ...selections, selection ])}\n removeSelection={selection => setSelections(selections.filter(s => s.id !== selection.id))}\n placeholder={getPhrase('searchPlaceholder')}\n imageCdnUrl={props.imageCdnUrl}\n activationLength={2}\n fetchSelectionMembers={props.fetchRecipientUsers && fetchSelectionMembers}\n debounceTime={300}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n hasStudentExperience={hasPermissions(PermissionName.StudentExperience)}\n />\n </div>\n \n {(!selections.length && props.directShareRecipients.length)\n ? (\n <div>\n <h3 className='font-size-normal'><Text phrase='sharedTo' /></h3>\n <Scrollbars autoHeight>\n <ul className='list-unstyled'>\n {props.directShareRecipients.map(d => (\n <li key={d.id} className='mb-2 pe-1'>\n <RecipientItem\n entity={d}\n imageCdnUrl={props.imageCdnUrl}\n removeRecipient={props.onClickRemoveRecipient}\n showDisplayName={hasPermissions(PermissionName.StudentExperience)}\n />\n </li>\n ))}\n </ul>\n </Scrollbars>\n </div>\n ) : <></>\n }\n {!!selections.length && (\n // The form submit inside of ShareMessage is used as the Share button\n <div className='pb-3'>\n <ShareMessage\n onClickShare={onClickShare}\n />\n </div>\n )}\n </div>\n )}\n\n {!selections.length && !showShareLinkSpinner && (\n <div className={`bg-white p-3 ${canDirectShare ? 'rounded-3' : 'rounded-bottom-3'}`}>\n <div>\n {props.shareLink && (\n <div className='fw-semibold mb-2'><Text namespace={namespace} phrase='shareLink' /></div>\n )}\n <ShareAsLink\n entity={props.entity}\n entityType={props.entityType}\n shareLink={props.shareLink}\n onClickShowSettings={props.onClickShowSettings}\n onClickCreateLink={onClickCreateShareLink}\n shareLinkIsLoading={props.shareLinkIsLoading}\n canAddPolicies={props.canAddPolicies}\n privacy={props.privacy}\n entityTypeId={props.entity.typeId}\n onClickSavePrivacy={props.onClickSavePrivacy}\n enableIntegrations={props.enableIntegrationBanner}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n {props.shareLink && props.enableIntegrationBanner && (\n <div className={`${props.integrations?.length && props.canEmbed ? 'float-end' : ''} mt-1 pt-1`}>\n <ShareIntegrations\n integrations={props.integrations}\n url={props.shareLink.url}\n closePopup={props.closePopup}\n appLink={hasManageIntegrationsPermission\n ? props.integrationSettingAppLink\n : props.messagePopupAppLink\n }\n />\n </div>\n )}\n {props.shareLink && props.canEmbed && (\n <div className='mt-1'>\n <GetEmbedCode onClickGetEmbedCode={props.onClickGetEmbedCode} />\n </div>\n )}\n {props.shareLink && props.canAddPolicies &&\n <button className='btn btn-link text-info mt-2 p-0' onClick={props.onClickShowSettings}>\n <Text namespace={namespace} phrase='advancedSettings' />\n </button>\n }\n </div>\n </div>\n )}\n \n {showShareLinkSpinner && (\n <div className='bg-white rounded-3 p-3 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LinkExpiry } from 'libs/shared/apps/share/components/link-expiry/LinkExpiry';\nimport { LinkPassword } from 'libs/shared/apps/share/components/link-password/LinkPassword';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkSettingsValidationSchema } from 'libs/shared/apps/share/validation/ShareLinkSettingsValidationSchema';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { BaseObject, Config } from 'libs/shared/interfaces';\nimport { PropsWithAnalyticsOptions, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ShareSettingsFormProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n onClickCancel: () => void;\n onClickDeleteLink: () => void;\n canEmbed?: boolean;\n privacy: SharePrivacyResponse;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}>;\n\nfunction ShareSettingsForm(props: ShareSettingsFormProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const [ passwordProtectLink, setPasswordProtectLink ] = React.useState(!!props.shareLink.isPasswordProtected);\n\n return (\n <Form>\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='mb-0'><Text namespace={namespace} phrase='deleteLinkLabel' /></label>\n <p className='mb-0'><Text namespace={namespace} phrase='deleteLinkDescription' /></p>\n </div>\n <DivButton onClick={props.onClickDeleteLink} className='info-link justify-self-start'>\n <Text phrase='deleteLink' />\n </DivButton>\n </div>\n\n {hasPermissions(PermissionName.ManageShareLinkSettings) && (\n <>\n <LinkExpiry passwordProtectLink={passwordProtectLink} />\n {props.shareOverrideRestrictions &&\n <LinkPassword\n shareLink={props.shareLink}\n passwordProtectLink={passwordProtectLink}\n setPasswordProtectLink={setPasswordProtectLink}\n />\n }\n </>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} text={getPhrase('back')} variant='outline-dark' />\n <PopupButtons.Submit variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n\ninterface ShareSettingsProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n privacy: SharePrivacyResponse;\n onClickSaveLink: (data: EditShareLinkRequest, onError: () => void) => void;\n onClickCancel: () => void;\n onClickDeleteLink: () => void;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareSettings(props: PropsWithAnalyticsOptions<ShareSettingsProps>): JSX.Element {\n const initialValues: EditShareLinkRequest = {\n password: '',\n removePassword: false,\n linkExpireDate: props.shareLink.linkExpireDate,\n overrideRestrictions: props.shareLink.overrideRestrictions\n };\n\n return (\n <>\n <FormWrapper<EditShareLinkRequest>\n initialValues={initialValues}\n onSubmit={props.onClickSaveLink}\n castInitialValues={false}\n validationSchema={ShareLinkSettingsValidationSchema}\n >\n <ShareSettingsForm\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n shareLink={props.shareLink}\n entityId={props.entityId}\n onClickCancel={props.onClickCancel}\n analyticsOptions={props.analyticsOptions}\n privacy={props.privacy}\n onClickDeleteLink={props.onClickDeleteLink}\n hasStudentExp={props.hasStudentExp}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n </>\n );\n}\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { CopyEmbed } from 'libs/shared/apps/share/views/share/components/copy-embed/CopyEmbed';\nimport { MainShare } from 'libs/shared/apps/share/views/share/components/main-share/MainShare';\nimport { ShareSettings } from 'libs/shared/apps/share/views/share/components/share-settings/ShareSettings';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport {\n BaseObject, Config, CurrentUser,\n DirectShare, PopupViewProps, ShareLink, ShareRecipient, UserCollection, YearGroup\n} from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nimport { SharableEntityType, ShareViewHelper } from './ShareViewHelper';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getTitle(type: SharableEntityType): string {\n switch (type) {\n case 'video': return getPhrase('titleVideo');\n case 'clip': return getPhrase('titleClip');\n case 'interactive': return getPhrase('titleInteractive');\n case 'series': return getPhrase('titleSeries');\n case 'playlist': return getPhrase('titlePlaylist');\n case 'subject': return getPhrase('titleTopic');\n }\n}\n\nfunction getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n}\n\n/**\n * I realise these are all the same right now, but they're technically different things - Sha\n */\nconst canEmbed = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\nconst canAddPolicies = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\n\ntype ShareScreen = 'main' | 'link-settings' | 'copy-embed';\n\ninterface ShareViewProps extends PopupViewProps {\n entityId: string;\n entityType: SharableEntityType;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n gatewayApiUrl?: string;\n integrationSettingAppLink?: AppLink;\n messagePopupAppLink?: AppLink;\n enableIntegrationBanner?: boolean\n}\n\nexport function ShareView(props: ShareViewProps): JSX.Element {\n const dispatch = useDispatch();\n\n const alerts = useAlerts();\n\n // If the gateway api url is passed down in props and not pulled from the config, we don't need to fetch the user token\n const shouldFetchUserToken = !props.gatewayApiUrl;\n\n /**\n * Our screen is initially set to null, and it is set to it's initial state\n * by ShareViewHelper.useRestrictionWarning.\n */\n const [ screen, setScreen ] = React.useState<ShareScreen>('main');\n\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(props.entityType)(props.entityId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const userToken = Flight.useBasicFetch<HashObject>(shouldFetchUserToken && UserRequests.token());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.entityId));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(\n ShareRequests.getSentDirectShareByObjectId(props.entityId)\n );\n const recipients = Flight.useBasicFetch<BaseObject[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n\n const recentlySharedToIds = currentUser.data && RecentShareHelper.getRecentlySharedTo(currentUser.data.id);\n\n const hasRecentlySharedRecipients = !!recentlySharedToIds?.length;\n const recentlySharedTo = Flight.useBasicFetch<BaseObject[]>(hasRecentlySharedRecipients &&\n ShareRequests.getRecipientsById(recentlySharedToIds, currentUser.data.customerId));\n\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(props.entityId));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const {\n shareToGoogleClassroom,\n shareToMicrosoftTeams,\n shareOverrideRestrictions,\n isLoadingSettings\n } = useSettings(null);\n\n /**\n * We need to manually re-fetch the recipients they're updated on the directShare object.\n * See ShareRequests.getDirectShareRecipientsById for an explanation\n * of why we are doing this.\n */\n function fetchRecipients(customerId: string, directShare: DirectShare): void {\n if (directShare.recipients?.length)\n Flight.getFetch(dispatch)(ShareViewHelper.getDirectShareRecipientsRequest(customerId, directShare));\n }\n\n function fetchRecipientUsers(id: string, callback: (users: UserCollection) => void): void {\n Flight.getFetch(dispatch)(ShareRequests.getRecipientUsers(id, callback));\n }\n\n function onClickCreateLink(): void {\n if (shareLink.data)\n return;\n\n ShareViewHelper.createLink({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n alerts\n });\n }\n\n function onClickSaveLink(data: EditShareLinkRequest, onError: () => void): void {\n ShareViewHelper.updateLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n data,\n alerts,\n () => setScreen('main'),\n onError\n );\n }\n\n function onClickDeleteLink(): void {\n ShareViewHelper.deleteLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n alerts,\n () => setScreen('main')\n );\n }\n\n function onClickShare(recipients: ShareRecipient[], message: string, onDone?: () => void): void {\n ShareViewHelper.createOrUpdateDirectShare({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n currentUser: currentUser.data,\n recipients,\n message,\n sentDirectShare: sentDirectShare.data,\n onSuccess: directShare => fetchRecipients(currentUser.data.customerId, directShare),\n onError: () => alerts.error(getPhrase('directShareError', { name: entity.data.name })),\n onDone\n });\n }\n\n function onClickRemoveRecipient(recipientId: string, onError?: () => void): void {\n ShareViewHelper.removeDirectShareRecipient(\n dispatch,\n recipientId,\n props.entityType,\n sentDirectShare.data,\n directShare => fetchRecipients(currentUser.data.customerId, directShare),\n () => {\n alerts.error(getPhrase('removeDirectShareError'));\n onError && onError();\n }\n );\n }\n\n function onClickSavePrivacy(privacy: SharePrivacy, overrideRestrictions: boolean): void {\n if (privacy === 'private') {\n onClickDeleteLink();\n return;\n }\n\n Flight.fetch(\n dispatch,\n ShareRequests.updatePrivacy(\n shareLink.data.id,\n privacy,\n overrideRestrictions,\n () => alerts.success(getPhrase('privaciesSuccess', { name: entity.data.name })),\n () => alerts.error(getPhrase('privaciesError', { name: entity.data.name }))\n )\n );\n }\n\n function getSearchRequestHeaders(): HashObject {\n if (!shouldFetchUserToken)\n return null;\n\n return {\n authorization: `Bearer ${userToken.data.value}`\n };\n }\n\n /**\n * We are intentionally not checking to see if recipients.data or recentlySharedTo.data\n * have loaded because:\n * 1. Adding the first recipient will trigger fetching recipients for the first time\n * which would trigger the loading spinner.\n * 2. Adding and recipient will update the list of recently shared to which causes\n * recentlySharedTo to be re-fetched.\n */\n const dataLoaded = !!currentUser.data\n && !!config.data\n && (!shouldFetchUserToken || !!userToken.data)\n && !!sentDirectShare.hasCompleted\n && !!privacy.data\n && !!entity.data\n && !isLoadingSettings\n && !!yearGroups.hasCompleted;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getTitle(props.entityType)}\n closePopup={props.closePopup}\n showLoadingSpinner={!dataLoaded}\n contentClassName={(dataLoaded && screen) ? 'bg-transparent border-0' : ''}\n bodyClassName='p-0'\n >\n {(() => {\n if (!dataLoaded)\n return <></>;\n\n switch (screen) {\n case 'main':\n return (\n <MainShare\n shareLink={shareLink.data}\n shareLinkIsLoading={shareLink.isFetching}\n entity={entity.data}\n entityType={props.entityType}\n directShareRecipients={recipients.data || []}\n recentlySharedTo={recentlySharedTo.data || []}\n onClickCreateLink={onClickCreateLink}\n onClickShowSettings={() => setScreen('link-settings')}\n onClickShare={onClickShare}\n onClickRemoveRecipient={onClickRemoveRecipient}\n onClickGetEmbedCode={() => setScreen('copy-embed')}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n gatewayApiUrl={props.gatewayApiUrl || config.data.gatewayApiUrl}\n imageCdnUrl={config.data.imageCdnUrl}\n searchRequestHeaders={getSearchRequestHeaders()}\n currentUser={currentUser.data}\n fetchRecipientUsers={fetchRecipientUsers}\n privacy={privacy.data}\n onClickSavePrivacy={onClickSavePrivacy}\n canAddPolicies={canAddPolicies(props.entityType)}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n integrations={getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams)}\n integrationSettingAppLink={props.integrationSettingAppLink}\n messagePopupAppLink={props.messagePopupAppLink}\n closePopup={props.closePopup}\n enableIntegrationBanner={props.enableIntegrationBanner}\n canEmbed={canEmbed(props.entityType)}\n yearGroups={yearGroups.data}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n );\n case 'link-settings':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <ShareSettings\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickSaveLink={onClickSaveLink}\n onClickDeleteLink={onClickDeleteLink}\n onClickCancel={() => setScreen('main')}\n privacy={privacy.data}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n </div>\n );\n case 'copy-embed':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <CopyEmbed\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickCancel={() => setScreen('main')}\n />\n </div>\n );\n }\n })()}\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};"],"names":["namespace","EmbedSize","props","autoplay","setAutoplay","videoSize","setVideoSize","videoSizes","className","length","phrase","id","variant","label","map","size","key","width","height","onClick","checked","onChange","getPhrase","LinkExpiry","formikProps","htmlFor","title","disable","passwordProtectLink","spanHack","trigger","setFieldValue","values","linkExpireDate","on","disabled","showStateWhenDisabled","LanguageService","SetPasswordInput","revealPassword","setRevealPassword","errorMsg","errors","password","value","e","canEdit","target","type","placeholder","readOnly","Form","DivButton","SvgContainer","svgName","tooltipPlacement","canReset","onReset","PASSWORD_PLACEHOLDER","LinkPassword","setPasswordProtectLink","shareLink","isPasswordProtected","readonlyPassword","setReadonlyPassword","Text","ToggleSwitch","LINK_EXPIRY_TIME","getLinkExpiryDate","shouldExpire","date","Date","setDate","getDate","toISOString","ShareLinkSettingsValidationSchema","shape","removePassword","resourceId","nullable","test","name","exclusive","params","message","val","CopyEmbedHtml","EmbedHelper","copyBtnPhrase","setCopyBtnPhrase","find","s","logged","setLogged","url","embedUrl","host","config","primaryUrl","shareId","embedString","spellCheck","rows","CopyToClipboard","onCopy","setTimeout","AnalyticsHelper","entity","embedDetails","ShareViewHelper","entityType","actionType","descriptor","eventVersion","text","CopyEmbed","entityId","analyticsOptions","PopupButtons","onClickCancel","GetEmbedCode","onClickGetEmbedCode","S","getRespectRatingText","video","yearGroups","hasStudentExp","VideoHelper","restriction","RestrictionHelper","_restrictions","yearGroup","maxYearGroup","minAllowedYearGroup","rating","getIconAndText","options","status","entityTypeId","privacy","MasterType","icon","Array","isArray","overrideRestrictions","getPrivateIconAndText","isToday","DateHelper","dayDifference","days","ShareLinkStatus","ShareLinkItem","active","description","ShareLinkInfo","canManageAccess","setCanManageAccess","setPrivacy","canManageAccessPrivacy","canUpdatePrivacy","shareOverrideRestrictions","onClickSavePrivacy","GoogleClassroomAvatar","viewBox","fill","cx","cy","r","patternContentUnits","xlinkHref","transform","MicrosoftTeamsAvatar","d","ShareIntegrationsStack","Tooltip","style","zIndex","ShareAsLink","objectTypeId","CopyInput","enableIntegrations","onClickCreateLink","MessageValidationSchema","max","ShareMessageForm","FormField","component","showOptionalLabel","ShareMessage","FormWrapper","initialValues","validationSchema","onSubmit","data","onDone","onClickShare","allowInitialSubmit","filterSearchResults","recipientsToFilter","currentSelections","existingShareRecipients","currentUserId","selectedIds","filter","includes","MainShare","selections","setSelections","showShareLinkSpinner","setShowShareLinkSpinner","hasPermissions","usePermissions","hasManageIntegrationsPermission","PermissionName","canDirectShare","recentSearches","recentlySharedTo","directShareRecipients","currentUser","shareLinkIsLoading","TokenizedTypeahead","join","getRemoteUrl","UrlHelper","gatewayApiUrl","getRemotePostBody","query","indices","push","index","filters","userProfile","ObjectStatus","customerId","searchType","limit","requestHeaders","searchRequestHeaders","formatRemoteSuggestions","suggestions","results","onSuggestionSelected","selection","removeSelection","imageCdnUrl","activationLength","fetchSelectionMembers","fetchRecipientUsers","users","newSelections","forEach","updatedSelection","ObjectHelper","count","pagination","ArrayHelper","debounceTime","emptyStateImageUrl","errorStateImageUrl","hasStudentExperience","autoHeight","RecipientItem","removeRecipient","onClickRemoveRecipient","showDisplayName","typeId","onClickShowSettings","canAddPolicies","enableIntegrationBanner","integrations","canEmbed","ShareIntegrations","closePopup","appLink","integrationSettingAppLink","messagePopupAppLink","Spinner","as","animation","role","ShareSettingsForm","onClickDeleteLink","ShareSettings","onClickSaveLink","castInitialValues","getTitle","ShareView","dispatch","alerts","shouldFetchUserToken","screen","setScreen","UserRequests","ConfigRequests","userToken","ShareRequests","sentDirectShare","recipients","recentlySharedToIds","RecentShareHelper","R","hasRecentlySharedRecipients","isAuthenticated","CustomerRequests","useSettings","shareToGoogleClassroom","shareToMicrosoftTeams","isLoadingSettings","fetchRecipients","directShare","callback","onError","onSuccess","error","recipientId","success","dataLoaded","hasCompleted","Popup","showLoadingSpinner","contentClassName","bodyClassName","isFetching","authorization","googleClassroomSetting","msftTeamsSetting","IntegrationHelper","i","enabled","FormCheckbox","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","FieldWrapper","checkboxAppLink","checkboxAppLinkText","AppLink","CharacterCounter","field","fieldName","children","setType","resolvedChildren","FunctionHelper","f","containerClassName","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","touched","disabledOnChange","_props","fieldWrapperProps","FormHelper","tooltipSpanHack","maxLength","errorMessage","defaultProps","autoComplete","castValuesOnSubmit","formattedInitialValues","cast","omitChildValues","child","Object","keys","hasOwnProperty","omitNullInitialValues","initialStatus","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","reset","entries","useFormikContextWrapper","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/7301-7c9342ef0c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share/components/embed-size/EmbedSize.tsx","file:///app/packages/libs/shared/src/apps/share/components/link-expiry/LinkExpiry.tsx","file:///app/packages/libs/shared/src/apps/share/components/set-password-input/set-password-input.scss","file:///app/packages/libs/shared/src/apps/share/components/set-password-input/SetPasswordInput.tsx","file:///app/packages/libs/shared/src/apps/share/components/link-password/LinkPassword.tsx","file:///app/packages/libs/shared/src/apps/share/utils/LinkExpiryHelper.ts","file:///app/packages/libs/shared/src/apps/share/validation/ShareLinkSettingsValidationSchema.ts","file:///app/packages/libs/shared/src/apps/share/components/copy-embed-html/copy-embed-html.scss","file:///app/packages/libs/shared/src/apps/share/components/copy-embed-html/CopyEmbedHtml.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/copy-embed/CopyEmbed.tsx","file:///app/packages/libs/shared/src/apps/share/components/get-embed-code/get-embed-code.scss","file:///app/packages/libs/shared/src/apps/share/components/get-embed-code/GetEmbedCode.tsx","file:///app/packages/libs/shared/src/apps/share/components/share-link-info/getRespectRatingText.ts","file:///app/packages/libs/shared/src/apps/share/components/share-link-info/share-link-info.scss","file:///app/packages/libs/shared/src/apps/share/components/share-link-info/ShareLinkInfo.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/avatars/GoogleClassroomAvatar.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/avatars/MicrosoftTeamsAvatar.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrationsStack.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-as-link/ShareAsLink.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-message/ShareMessage.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/main-share/MainShare.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/components/share-settings/ShareSettings.tsx","file:///app/packages/libs/shared/src/apps/share/views/share/ShareView.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/utils/FormHelper.ts"],"sourcesContent":["import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nconst namespace = 'share.embedSize';\n\ninterface EmbedSizeProps {\n autoplay: boolean;\n setAutoplay: (autoplay: boolean) => void;\n videoSize: EmbedResolution;\n setVideoSize: (videoSize: EmbedResolution) => void;\n videoSizes: EmbedResolution[];\n}\n\nexport function EmbedSize(props: EmbedSizeProps): React.ReactElement {\n const {\n autoplay,\n setAutoplay,\n videoSize,\n setVideoSize,\n videoSizes\n } = props;\n\n return (\n <div className='d-flex align-items-center'>\n {!!videoSizes.length &&\n <>\n <div className='me-1'>\n <Text namespace={namespace} phrase='videoSize' />\n </div>\n <div className='pe-3'>\n <Dropdown>\n <Dropdown.Toggle id='embed-resolution' variant='outline-dark'>\n {videoSize.label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n {videoSizes.map(size => (\n <Dropdown.Item\n key={`${size.width}x${size.height}`}\n onClick={() => setVideoSize(size)}\n >\n {size.label}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </>\n }\n <div className='me-2'>\n <Text namespace={namespace} phrase='autoplay' />\n </div>\n <Checkbox id='autoplay-checkbox' checked={autoplay} onChange={() => setAutoplay(!autoplay)} />\n </div>\n );\n}","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'shared.linkExpiry';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LinkExpiryProps {\n passwordProtectLink: boolean;\n}\n\nexport function LinkExpiry(props: LinkExpiryProps): React.ReactElement {\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n function setLinkExpireDate(): void {\n if (props.passwordProtectLink)\n return;\n\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!formikProps.values.linkExpireDate));\n }\n\n return (\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='linkExpirationHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='linkExpirationInfo' /></p>\n </div>\n <Tooltip\n title={getPhrase('passwordProtected')}\n disable={!props.passwordProtectLink}\n spanHack\n trigger='hover'\n >\n <ToggleSwitch\n onClick={setLinkExpireDate}\n on={!!formikProps.values.linkExpireDate}\n disabled={props.passwordProtectLink}\n showStateWhenDisabled\n />\n </Tooltip>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"passwordButton\":\"W9Jl8\"};","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './set-password-input.scss';\n\nconst namespace = 'share.setPasswordInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SetPasswordInputProps {\n value: string;\n onChange: (value: string) => void;\n onReset?: () => void;\n /**\n * Allow user to view and edit current value.\n */\n canEdit?: boolean;\n /**\n * Don't allow user to view/edit current value\n * but allow them to clear it and enter a new value.\n */\n canReset?: boolean;\n placeholder?: string;\n}\n\nexport function SetPasswordInput(props: SetPasswordInputProps): JSX.Element {\n const [ revealPassword, setRevealPassword ] = React.useState(false);\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n const errorMsg = formikProps.errors?.password;\n\n return (\n <>\n <input\n className={`form-control ${errorMsg ? 'is-invalid' : ''}`}\n value={props.value}\n onChange={e => {\n !!props.canEdit && props.onChange(e.target.value);\n }}\n type={revealPassword ? 'text' : 'password'}\n placeholder={props.placeholder || getPhrase('passwordPlaceholder')}\n readOnly={!props.canEdit}\n />\n {!!errorMsg && (\n <Form.Control.Feedback type='invalid'>{errorMsg}</Form.Control.Feedback>\n )}\n {!!props.canEdit &&\n <DivButton className={styles.passwordButton} onClick={() => setRevealPassword(!revealPassword)}>\n <SvgContainer\n svgName={revealPassword ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n title={getPhrase(revealPassword ? 'hidePassword' : 'revealPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n {!props.canEdit && !!props.canReset && !!props.onReset &&\n <DivButton className={styles.passwordButton} onClick={props.onReset}>\n <SvgContainer\n svgName={cvSvgLibrary.Close} title={getPhrase('resetPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n </>\n );\n}","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { SetPasswordInput } from 'libs/shared/apps/share/components/set-password-input/SetPasswordInput';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.linkPassword';\n\nconst PASSWORD_PLACEHOLDER = '********';\n\ninterface LinkPasswordProps {\n shareLink: ShareLink;\n passwordProtectLink: boolean;\n setPasswordProtectLink: (protect: boolean) => void;\n}\n\nexport function LinkPassword(props: LinkPasswordProps): React.ReactElement {\n const { passwordProtectLink, setPasswordProtectLink } = props;\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n \n const [ readonlyPassword, setReadonlyPassword ] = React.useState(!!props.shareLink?.isPasswordProtected);\n\n function onTogglePasswordProtect(): void {\n if (props.shareLink?.isPasswordProtected)\n formikProps.setFieldValue('removePassword', passwordProtectLink);\n\n formikProps.setFieldValue('password', '');\n\n setPasswordProtectLink(!passwordProtectLink);\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!passwordProtectLink));\n }\n\n function setPassword(password: string): void {\n formikProps.setFieldValue('password', password);\n }\n\n function resetPassword(): void {\n formikProps.setFieldValue('password', '');\n formikProps.setFieldValue('removePassword', true);\n setReadonlyPassword(false);\n }\n\n return (\n <div className='pb-3'>\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='passwordProtectHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='passwordProtectInfo' /></p>\n </div>\n <ToggleSwitch onClick={onTogglePasswordProtect} on={passwordProtectLink} />\n </div>\n\n {passwordProtectLink &&\n <div className='position-relative mt-2'>\n <SetPasswordInput\n value={readonlyPassword ? PASSWORD_PLACEHOLDER : formikProps.values.password}\n onChange={setPassword}\n onReset={resetPassword}\n canEdit={!readonlyPassword}\n canReset\n />\n </div>\n }\n </div>\n );\n}","const LINK_EXPIRY_TIME = 30; // days\nexport function getLinkExpiryDate(shouldExpire: boolean): string | null {\n if (!shouldExpire)\n return null;\n\n const date = new Date();\n date.setDate(date.getDate() + LINK_EXPIRY_TIME);\n\n return date.toISOString();\n}","import { boolean, object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'share.validation';\n\nexport const ShareLinkSettingsValidationSchema = object().shape({\n removePassword: boolean(),\n resourceId: string(),\n linkExpireDate: string().nullable(),\n password: string()\n .test({\n name: 'password-length',\n exclusive: false,\n params: {},\n message: LanguageService.getPhrase(namespace, 'minPassword'),\n test: val => {\n const removePassword = ((this as any)?.parent as any)?.removePassword;\n\n if (removePassword)\n return true;\n\n if (!val?.length)\n return true;\n\n if (val.length < 3)\n return false;\n\n return true;\n }\n })\n .default('')\n});","// extracted by mini-css-extract-plugin\nexport default {\"embedHtmlInput\":\"mwvd0\",\"copyBtnContainer\":\"myePx\"};","import React from 'react';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmbedSize } from 'libs/shared/apps/share/components/embed-size/EmbedSize';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BaseObject, Config, PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { EmbedHelper, EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nimport styles from './copy-embed-html.scss';\n\nconst namespace = 'share.copyEmbedHtml';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype CopyEmbedHtmlProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n entityId: string;\n shareId: string;\n embedUrl: string;\n}>;\n\nexport function CopyEmbedHtml(props: CopyEmbedHtmlProps): JSX.Element {\n const videoSizes = EmbedHelper.getEmbedResolutions();\n\n const [ copyBtnPhrase, setCopyBtnPhrase ] = React.useState<'copy' | 'copied'>('copy');\n const [ autoplay, setAutoplay ] = React.useState(false);\n const [ videoSize, setVideoSize ] = React.useState<EmbedResolution>(videoSizes.find(s => s.width === '100%'));\n\n const [ logged, setLogged ] = React.useState(false);\n function onCopy(): void {\n setCopyBtnPhrase('copied');\n setTimeout(() => setCopyBtnPhrase('copy'), 2000);\n\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n ...props.entity,\n embedDetails: {\n size: videoSize,\n autoplay\n }\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyEmbedHtml,\n eventVersion: EventVersion.V3\n }));\n }\n\n const url = EmbedHelper.buildEmbedUrl({\n embedUrl: props.embedUrl,\n host: props.config.primaryUrl,\n shareId: props.shareId,\n autoplay\n });\n \n const embedString = EmbedHelper.getEmbedString({\n url,\n size: videoSize\n });\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <label><Text namespace={namespace} phrase='label' /></label>\n <div className='position-relative mb-3'>\n <textarea\n className={`form-control rounded w-100 h-100 ${styles.embedHtmlInput}`}\n spellCheck={false}\n value={embedString}\n rows={7}\n readOnly\n />\n <CopyToClipboard onCopy={onCopy} text={embedString}>\n <button className={`btn btn-outline-dark border border-secondary position-absolute bottom-0 end-0 ${styles.copyBtnContainer}`} type='button'>\n {getPhrase(copyBtnPhrase)}\n </button>\n </CopyToClipboard>\n </div>\n <EmbedSize\n autoplay={autoplay}\n setAutoplay={setAutoplay}\n videoSize={videoSize}\n setVideoSize={setVideoSize}\n videoSizes={videoSizes}\n />\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CopyEmbedHtml } from 'libs/shared/apps/share/components/copy-embed-html/CopyEmbedHtml';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BaseObject, Config, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\n\ninterface CopyEmbedProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n config: Config;\n entityId: string;\n analyticsOptions: AnalyticsOptions;\n onClickCancel: () => void;\n}\n\nexport function CopyEmbed(props: CopyEmbedProps) {\n return (\n <>\n <div className='mb-3'>\n <CopyEmbedHtml\n embedUrl={props.shareLink.embedUrl}\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n entityId={props.entityId}\n shareId={props.shareLink.id}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n\n <PopupButtons>\n <DivButton onClick={props.onClickCancel} className='btn btn-outline-dark'>\n <Text namespace={namespace} phrase='back'/>\n </DivButton>\n </PopupButtons>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"hoverBackground\":\"ICTmv\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './get-embed-code.scss';\n\nconst namespace = 'share.getEmbedCode';\n\ninterface GetEmbedCodeProps {\n onClickGetEmbedCode: () => void\n}\n\nexport function GetEmbedCode(props: GetEmbedCodeProps) {\n return (\n <DivButton\n onClick={props.onClickGetEmbedCode}\n className={`d-inline-block p-1 pe-2 rounded-1 ${styles.hoverBackground}`}\n >\n <div className='d-flex align-items-center'>\n <div className='bg-dark text-white rounded-1 me-2'>\n <SvgContainer svgName={cvSvgLibrary.Code} size={SvgContainerSize.Large} />\n </div>\n <Text namespace={namespace} phrase='getEmbedCode' />\n </div>\n </DivButton>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n\n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n\n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n\n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n\n /**\n * Restrictions without a year group are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n\n const rating = VideoHelper.getRating(video);\n\n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n\n for (const yearGroup of yearGroups) {\n /**\n * If our year group is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n\n /**\n * If the restriction is higher than this year group, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n\n /**\n * If therating is higher than this year group's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n\n /**\n * If our year group is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n\n /**\n * If no year groups are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n\n /**\n * We differentiate the copy if it's the highest year group or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n\n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n}","// extracted by mini-css-extract-plugin\nexport default {\"hoverBackground\":\"R3fNE\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { getRespectRatingText } from 'libs/shared/apps/share/components/share-link-info/getRespectRatingText';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacyResponse } from '../../interfaces/responses/SharePrivacyResponse';\n\nimport styles from './share-link-info.scss';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareLinkInfoProps {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n onClickSavePrivacy?: (privacy: SharePrivacy, onClickSavePrivacy: boolean) => void;\n entity: BaseObject;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\ninterface GetIconAndTextOptions extends ShareLinkInfoProps {}\n\nconst getPrivateIconAndText = (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n\n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n\n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n\n switch (privacy.privacy) {\n case 'public':\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n return { icon: cvSvgLibrary.Lock, text: getRespectRatingText(entity, yearGroups, hasStudentExp) };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return { icon: cvSvgLibrary.Lock, text: getRespectRatingText(entity, yearGroups, hasStudentExp) };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: cvSvgLibrary.Lock, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n};\n\nconst getIconAndText = (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return getPrivateIconAndText(options);\n\n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n\n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n\n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n\n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n\n return { icon: cvSvgLibrary.Timer, text };\n }\n\n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n\n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n\n return { icon: cvSvgLibrary.Lock, text };\n};\n\ninterface ShareLinkItemProps {\n active: boolean;\n title: string;\n description: string;\n onClick: () => void\n}\n\nfunction ShareLinkItem(props: ShareLinkItemProps) {\n const { active, title, description, onClick } = props;\n\n return (\n <li className={`${active ? 'bg-light-blue' : ''} dropdown-item`} onClick={!active ? onClick : null}>\n <p className='fw-semibold mb-1'>{title}</p>\n <p className='font-size-sm mb-0'>{description}</p>\n </li>\n );\n}\n\nexport function ShareLinkInfo(props: ShareLinkInfoProps): JSX.Element {\n const [ canManageAccess, setCanManageAccess ] = React.useState(false);\n const [ privacy, setPrivacy ] = React.useState<SharePrivacy>(null);\n\n const { icon, text } = getIconAndText(props);\n\n React.useEffect(() => {\n setCanManageAccess(props.privacy.canManageAccess);\n setPrivacy(props.privacy.privacy);\n }, [props.privacy]);\n\n const canManageAccessPrivacy = canManageAccess ? 'just_my_customer' : 'protected';\n\n const canUpdatePrivacy = (\n !props.isPasswordProtected &&\n !props.linkExpireDate &&\n (props.shareOverrideRestrictions && !props.hasStudentExp)\n );\n\n return (\n <div className='d-flex align-items-center'>\n {(canUpdatePrivacy)\n ? (\n <div className='btn-group'>\n <button className={`btn border-0 info-link dropdown-toggle p-1 ${styles.hoverBackground}`} data-bs-toggle='dropdown'>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span className='me-1'>{text}</span>\n </button>\n <ul\n className='dropdown-menu cursor-pointer'\n >\n {canManageAccess &&\n <ShareLinkItem\n active={privacy === 'public'}\n title={getPhrase('public')}\n description={getPhrase('publicDescription')}\n onClick={() => props.onClickSavePrivacy('public', false)}\n />\n }\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && props.privacy.overrideRestrictions}\n title={getPhrase('justMySchool')}\n description={canManageAccess ? getPhrase('justMySchoolDescription') : getPhrase('clickViewOnly')}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, true)}\n />\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && !props.privacy.overrideRestrictions}\n title={getPhrase('respectRatings')}\n description={getRespectRatingText(props.entity, props.yearGroups, props.hasStudentExp)}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, false)}\n />\n <ShareLinkItem\n active={privacy === 'private'}\n title={getPhrase('private')}\n description={getPhrase('privateDescription')}\n onClick={() => props.onClickSavePrivacy('private', false)}\n />\n </ul>\n </div>\n )\n : (\n <>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span>{text}</span>\n </>\n )\n }\n </div>\n );\n}","import React from 'react';\n\nexport function GoogleClassroomAvatar(): JSX.Element {\n return (\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n <circle cx='12' cy='12' r='12' fill='url(#pattern0)'/>\n <defs>\n <pattern id='pattern0' patternContentUnits='objectBoundingBox' width='1' height='1'>\n <use xlinkHref='#image0_3558_14996' transform='scale(0.00520833)'/>\n </pattern>\n <image id='image0_3558_14996' width='192' height='192' xlinkHref='data:image/png;base64,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'/>\n </defs>\n </svg>\n );\n}","import React from 'react';\n\nexport function MicrosoftTeamsAvatar(): JSX.Element {\n return (\n <svg viewBox='0 0 40 40' fill='none'>\n <path d='M29.692 15.31c.58 0 1.146-.173 1.628-.5a2.96 2.96 0 001.078-1.331 3.004 3.004 0 00-.634-3.235 2.918 2.918 0 00-1.5-.812 2.894 2.894 0 00-1.693.169 2.938 2.938 0 00-1.314 1.093 2.997 2.997 0 00.364 3.748 2.91 2.91 0 002.071.869zM20.043 26.267V13.849a.9.9 0 00-.259-.633.877.877 0 00-.624-.262H6.883a.877.877 0 00-.624.262.9.9 0 00-.259.633v12.418c0 .24.092.469.257.64.165.172.39.27.626.276H19.16a.899.899 0 00.626-.276.923.923 0 00.257-.64zm-3.51-10.389v1.92h-2.37v6.68H11.88V17.93H9.51v-2.182h7.022v.13z' fill='#fff'/>\n <path d='M21.874 14.132v.917a4.03 4.03 0 002.05-1.47c.512-.699.79-1.545.793-2.415 0-1.1-.431-2.154-1.199-2.932a4.065 4.065 0 00-2.893-1.214 4.065 4.065 0 00-2.894 1.214 4.175 4.175 0 00-1.199 2.932h2.391a2.996 2.996 0 012.061.887c.55.552.868 1.297.89 2.081zM26.332 17.1h-4.458v8.883c0 .8-.309 1.566-.86 2.138-.552.57-1.302.9-2.091.917h-4.588a7.047 7.047 0 003.265 3.317c1.427.7 3.046.887 4.593.532a6.99 6.99 0 003.918-2.486 7.152 7.152 0 001.535-4.418v-7.551a1.348 1.348 0 00-.385-.942 1.313 1.313 0 00-.929-.39zM32.772 17.1h-3.597c.206.414.316.87.323 1.332v7.551a9.1 9.1 0 01-.516 2.859c.236.021.474.021.71 0a4.28 4.28 0 003.046-1.278A4.394 4.394 0 0034 24.477v-6.045c0-.339-.126-.665-.354-.912a1.307 1.307 0 00-.874-.42z' fill='#fff'/>\n </svg>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { GoogleClassroomAvatar } from './avatars/GoogleClassroomAvatar';\nimport { MicrosoftTeamsAvatar } from './avatars/MicrosoftTeamsAvatar';\n\nimport styles from './share-integrations.scss';\n\nconst namespace = 'share.shareIntegrations';\n\nexport function ShareIntegrationsStack(): JSX.Element {\n const className = `${styles.avatar} border border-light rounded-circle overflow-hidden`;\n\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'shareThroughIntegrations')} spanHack>\n <ul className='list-unstyled d-flex mb-0'>\n <li className={className} style={{ zIndex: 1 }}>\n <GoogleClassroomAvatar />\n </li>\n\n <li className={`${className} ${styles.msTeamsContainer}`} style={{ zIndex: 0 }}>\n <MicrosoftTeamsAvatar />\n </li>\n </ul>\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { ShareLinkInfo } from 'libs/shared/apps/share/components/share-link-info/ShareLinkInfo';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, ShareLink, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'share.shareAsLink';\n\ninterface ShareAsLinkProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n onClickShowSettings: () => void;\n onClickCreateLink: () => void;\n shareLinkIsLoading?: boolean;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n entityTypeId: MasterType;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n enableIntegrations: boolean;\n hasStudentExp: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareAsLink(props: ShareAsLinkProps): React.ReactElement {\n const [ logged, setLogged ] = React.useState(false);\n\n function onCopy(): void {\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n ...props.entity\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyLink,\n eventVersion: EventVersion.V3\n }));\n }\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n <div className={`${props.shareLink ? 'w-100' : 'w-75 d-flex align-items-center'}`}>\n {props.shareLink\n ? (\n <>\n <div className='d-flex justify-content-between align-items-center mb-1'>\n <ShareLinkInfo\n linkExpireDate={props.shareLink.linkExpireDate}\n isPasswordProtected={props.shareLink.isPasswordProtected}\n privacy={props.privacy}\n entityTypeId={props.shareLink.objectTypeId}\n status={props.shareLink.status}\n onClickSavePrivacy={props.onClickSavePrivacy}\n hasStudentExp={props.hasStudentExp}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n <CopyInput value={props.shareLink.url} onCopy={onCopy} />\n </>\n ) : (\n <div className='d-flex align-items-center'>\n <div className='me-2'>\n {props.enableIntegrations ? (\n <ShareIntegrationsStack />\n ) : (\n <SvgContainer svgName={cvSvgLibrary.Link} className='svg-container' />\n )}\n </div>\n \n <span className='fw-semibold'><Text namespace={namespace} phrase='createLink' /></span>\n </div>\n )\n }\n </div>\n {!props.shareLink &&\n <DivButton className='info-link' onClick={props.onClickCreateLink}>\n <Text phrase='createLink' />\n </DivButton>\n }\n </div>\n </>\n );\n}","import React from 'react';\nimport { Form as FormikForm } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\n\nconst getPhrase = LanguageService.encloseNamespace('share.shareMessage');\n\nconst MessageValidationSchema = Yup.object().shape({\n message: Yup.string()\n .max(280, () => getPhrase('maxMessageLen'))\n});\n\ninterface ShareMessageRequest {\n message?: string;\n}\n\nfunction ShareMessageForm(): React.ReactElement {\n const formikProps = useFormikContextWrapper<ShareMessageRequest>();\n\n return (\n <FormikForm>\n <FormField\n component='textarea'\n name='message'\n id='message'\n placeholder={getPhrase('placeholder')}\n value={formikProps.values.message}\n label={getPhrase('label')}\n showOptionalLabel\n />\n <PopupButtons>\n <PopupButtons.Submit variant='dark' text={getPhrase('share')} />\n </PopupButtons>\n </FormikForm>\n );\n}\n\ninterface ShareMessageProps {\n onClickShare: (message: string, onDone: () => void) => void\n}\n\nexport function ShareMessage(props: ShareMessageProps): React.ReactElement {\n function onSubmit(data: ShareMessageRequest, onDone: () => void): void {\n let message: string = null;\n\n if (data.message)\n message = data.message;\n\n props.onClickShare(message, onDone);\n }\n\n return (\n <FormWrapper<ShareMessageRequest>\n initialValues={{ message: '' }}\n validationSchema={MessageValidationSchema}\n onSubmit={onSubmit}\n allowInitialSubmit={true}\n >\n <ShareMessageForm />\n </FormWrapper>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { TypeFilter } from 'libs/shared/apps/search/interfaces/TypedFilter';\nimport { GetEmbedCode } from 'libs/shared/apps/share/components/get-embed-code/GetEmbedCode';\nimport { RecipientItem } from 'libs/shared/apps/share/components/recipient-item/RecipientItem';\nimport { TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT, TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareAsLink } from 'libs/shared/apps/share/views/share/components/share-as-link/ShareAsLink';\nimport { ShareIntegrations } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrations';\nimport { ShareMessage } from 'libs/shared/apps/share/views/share/components/share-message/ShareMessage';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { BaseObject, Classroom, ClassroomGroup, CurrentUser, PropsWithAnalyticsOptions, ShareLink, ShareRecipient, ShareSearchResponse, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction filterSearchResults(\n recipientsToFilter: BaseObject[],\n currentSelections: BaseObject[],\n existingShareRecipients: BaseObject[],\n currentUserId: string\n): BaseObject[] {\n if (!recipientsToFilter)\n return [];\n\n const selectedIds = [ ...currentSelections, ...existingShareRecipients ].map(s => s.id);\n\n return recipientsToFilter.filter(s => {\n // Prevent users from sharing to other users who have already been shared this resource\n if (selectedIds.includes(s.id))\n return false;\n\n // Prevent users from sharing to themselves\n if (s.id === currentUserId)\n return false;\n\n return true;\n });\n}\n\ntype MainShareProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType,\n directShareRecipients: BaseObject[];\n recentlySharedTo: BaseObject[];\n onClickCreateLink: () => void;\n onClickShowSettings: () => void;\n onClickShare: (recipients: ShareRecipient[], message: string, onDone?: () => void) => void;\n onClickRemoveRecipient: (recipientId: string, onError?: () => void) => void;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n onClickGetEmbedCode: () => void;\n gatewayApiUrl: string;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n searchRequestHeaders?: HashObject;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n integrations: IntegrationId[];\n shareLink?: ShareLink;\n shareLinkIsLoading?: boolean;\n fetchRecipientUsers?: (id: string, callback: (users: UserCollection) => void) => void;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n integrationSettingAppLink?: Core.AppLink;\n messagePopupAppLink?: Core.AppLink;\n closePopup: () => void;\n enableIntegrationBanner?: boolean;\n canEmbed?: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}>;\n\nexport function MainShare(props: MainShareProps): JSX.Element {\n const [ selections, setSelections ] = React.useState<BaseObject[]>([]);\n const [ showShareLinkSpinner, setShowShareLinkSpinner ] = React.useState(false);\n\n const { hasPermissions } = usePermissions();\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n\n function onClickShare(message: string, onDone: () => void): void {\n props.onClickShare(\n selections.map(s => ({ id: s.id, typeId: s.typeId })),\n message,\n () => {\n setSelections([]);\n onDone();\n }\n );\n }\n\n function fetchSelectionMembers(id: string): void {\n if (!props.fetchRecipientUsers)\n return;\n\n const callback = (users: UserCollection) => {\n const newSelections: BaseObject[] = [];\n\n selections.forEach(selection => {\n if (selection.id !== id)\n return newSelections.push(selection);\n\n const updatedSelection = ObjectHelper.deepClone<Classroom | ClassroomGroup>(selection);\n\n if (!users?.data?.length) {\n updatedSelection.users = { count: 0, data: [], pagination: null };\n } else {\n updatedSelection.users = users;\n }\n\n newSelections.push(updatedSelection);\n });\n\n setSelections(ArrayHelper.uniq(newSelections, 'id'));\n };\n\n props.fetchRecipientUsers(id, callback);\n }\n\n function getRemotePostBody(query: string): HashObject {\n const indices: TypeFilter[] = [];\n\n if (hasPermissions(PermissionName.ShareToUsers)) {\n indices.push({\n index: 'user',\n filters: {\n userProfile: {\n status: [`${ObjectStatus.Active.toLowerCase()}`],\n customerId: props.currentUser.customerId\n }\n }\n });\n }\n\n if (hasPermissions(PermissionName.ShareToClassrooms))\n indices.push({ index: 'classroom' });\n\n if (hasPermissions(PermissionName.ShareToClassroomGroups))\n indices.push({ index: 'classroom_group' });\n\n return {\n query,\n indices,\n searchType: 'user',\n limit: TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT\n };\n }\n\n const canDirectShare = hasPermissions(PermissionName.ShareToUsers) ||\n hasPermissions(PermissionName.ShareToClassrooms) ||\n hasPermissions(PermissionName.ShareToClassroomGroups);\n\n const recentSearches = filterSearchResults(\n props.recentlySharedTo,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n );\n \n function onClickCreateShareLink(): void {\n setShowShareLinkSpinner(true);\n props.onClickCreateLink();\n }\n\n React.useEffect(() => {\n setShowShareLinkSpinner(!!props.shareLinkIsLoading);\n }, [props.shareLinkIsLoading]);\n\n return (\n <>\n {canDirectShare && (\n <div className='bg-white rounded-bottom-3 pt-3 px-3 mb-2'>\n <div className={`d-flex justify-content-between align-items-center pb-3`}>\n <TokenizedTypeahead\n // This key is used to re-initialize TokenizedTypeahead whenever recentSearches changes\n key={recentSearches?.map(s => s.id).join(':') ?? 'share:search'}\n getRemoteUrl={() => UrlHelper.safeUrlConcat(props.gatewayApiUrl, 'v4/search')}\n getRemotePostBody={getRemotePostBody}\n requestHeaders={props.searchRequestHeaders}\n formatRemoteSuggestions={(suggestions: ShareSearchResponse) =>\n filterSearchResults(\n suggestions?.results,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n )\n }\n recentSearches={recentSearches}\n selections={selections}\n onSuggestionSelected={selection => setSelections([ ...selections, selection ])}\n removeSelection={selection => setSelections(selections.filter(s => s.id !== selection.id))}\n placeholder={getPhrase('searchPlaceholder')}\n imageCdnUrl={props.imageCdnUrl}\n activationLength={2}\n fetchSelectionMembers={props.fetchRecipientUsers && fetchSelectionMembers}\n debounceTime={300}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n hasStudentExperience={hasPermissions(PermissionName.StudentExperience)}\n />\n </div>\n \n {(!selections.length && props.directShareRecipients.length)\n ? (\n <div>\n <h3 className='font-size-normal'><Text phrase='sharedTo' /></h3>\n <Scrollbars autoHeight>\n <ul className='list-unstyled'>\n {props.directShareRecipients.map(d => (\n <li key={d.id} className='mb-2 pe-1'>\n <RecipientItem\n entity={d}\n imageCdnUrl={props.imageCdnUrl}\n removeRecipient={props.onClickRemoveRecipient}\n showDisplayName={hasPermissions(PermissionName.StudentExperience)}\n />\n </li>\n ))}\n </ul>\n </Scrollbars>\n </div>\n ) : <></>\n }\n {!!selections.length && (\n // The form submit inside of ShareMessage is used as the Share button\n <div className='pb-3'>\n <ShareMessage\n onClickShare={onClickShare}\n />\n </div>\n )}\n </div>\n )}\n\n {!selections.length && !showShareLinkSpinner && (\n <div className={`bg-white p-3 ${canDirectShare ? 'rounded-3' : 'rounded-bottom-3'}`}>\n <div>\n {props.shareLink && (\n <div className='fw-semibold mb-2'><Text namespace={namespace} phrase='shareLink' /></div>\n )}\n <ShareAsLink\n entity={props.entity}\n entityType={props.entityType}\n shareLink={props.shareLink}\n onClickShowSettings={props.onClickShowSettings}\n onClickCreateLink={onClickCreateShareLink}\n shareLinkIsLoading={props.shareLinkIsLoading}\n canAddPolicies={props.canAddPolicies}\n privacy={props.privacy}\n entityTypeId={props.entity.typeId}\n onClickSavePrivacy={props.onClickSavePrivacy}\n enableIntegrations={props.enableIntegrationBanner}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n {props.shareLink && props.enableIntegrationBanner && (\n <div className={`${props.integrations?.length && props.canEmbed ? 'float-end' : ''} mt-1 pt-1`}>\n <ShareIntegrations\n integrations={props.integrations}\n url={props.shareLink.url}\n closePopup={props.closePopup}\n appLink={hasManageIntegrationsPermission\n ? props.integrationSettingAppLink\n : props.messagePopupAppLink\n }\n />\n </div>\n )}\n {props.shareLink && props.canEmbed && (\n <div className='mt-1'>\n <GetEmbedCode onClickGetEmbedCode={props.onClickGetEmbedCode} />\n </div>\n )}\n {props.shareLink && props.canAddPolicies &&\n <button className='btn btn-link text-info mt-2 p-0' onClick={props.onClickShowSettings}>\n <Text namespace={namespace} phrase='advancedSettings' />\n </button>\n }\n </div>\n </div>\n )}\n \n {showShareLinkSpinner && (\n <div className='bg-white rounded-3 p-3 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LinkExpiry } from 'libs/shared/apps/share/components/link-expiry/LinkExpiry';\nimport { LinkPassword } from 'libs/shared/apps/share/components/link-password/LinkPassword';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkSettingsValidationSchema } from 'libs/shared/apps/share/validation/ShareLinkSettingsValidationSchema';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { BaseObject, Config } from 'libs/shared/interfaces';\nimport { PropsWithAnalyticsOptions, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ShareSettingsFormProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n onClickCancel: () => void;\n onClickDeleteLink: () => void;\n canEmbed?: boolean;\n privacy: SharePrivacyResponse;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}>;\n\nfunction ShareSettingsForm(props: ShareSettingsFormProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const [ passwordProtectLink, setPasswordProtectLink ] = React.useState(!!props.shareLink.isPasswordProtected);\n\n return (\n <Form>\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='mb-0'><Text namespace={namespace} phrase='deleteLinkLabel' /></label>\n <p className='mb-0'><Text namespace={namespace} phrase='deleteLinkDescription' /></p>\n </div>\n <DivButton onClick={props.onClickDeleteLink} className='info-link justify-self-start'>\n <Text phrase='deleteLink' />\n </DivButton>\n </div>\n\n {hasPermissions(PermissionName.ManageShareLinkSettings) && (\n <>\n <LinkExpiry passwordProtectLink={passwordProtectLink} />\n {props.shareOverrideRestrictions &&\n <LinkPassword\n shareLink={props.shareLink}\n passwordProtectLink={passwordProtectLink}\n setPasswordProtectLink={setPasswordProtectLink}\n />\n }\n </>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} text={getPhrase('back')} variant='outline-dark' />\n <PopupButtons.Submit variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n\ninterface ShareSettingsProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n privacy: SharePrivacyResponse;\n onClickSaveLink: (data: EditShareLinkRequest, onError: () => void) => void;\n onClickCancel: () => void;\n onClickDeleteLink: () => void;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareSettings(props: PropsWithAnalyticsOptions<ShareSettingsProps>): JSX.Element {\n const initialValues: EditShareLinkRequest = {\n password: '',\n removePassword: false,\n linkExpireDate: props.shareLink.linkExpireDate,\n overrideRestrictions: props.shareLink.overrideRestrictions\n };\n\n return (\n <>\n <FormWrapper<EditShareLinkRequest>\n initialValues={initialValues}\n onSubmit={props.onClickSaveLink}\n castInitialValues={false}\n validationSchema={ShareLinkSettingsValidationSchema}\n >\n <ShareSettingsForm\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n shareLink={props.shareLink}\n entityId={props.entityId}\n onClickCancel={props.onClickCancel}\n analyticsOptions={props.analyticsOptions}\n privacy={props.privacy}\n onClickDeleteLink={props.onClickDeleteLink}\n hasStudentExp={props.hasStudentExp}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n </>\n );\n}\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { CopyEmbed } from 'libs/shared/apps/share/views/share/components/copy-embed/CopyEmbed';\nimport { MainShare } from 'libs/shared/apps/share/views/share/components/main-share/MainShare';\nimport { ShareSettings } from 'libs/shared/apps/share/views/share/components/share-settings/ShareSettings';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport {\n BaseObject, Config, CurrentUser,\n DirectShare, PopupViewProps, ShareLink, ShareRecipient, UserCollection, YearGroup\n} from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nimport { SharableEntityType, ShareViewHelper } from './ShareViewHelper';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getTitle(type: SharableEntityType): string {\n switch (type) {\n case 'video': return getPhrase('titleVideo');\n case 'clip': return getPhrase('titleClip');\n case 'interactive': return getPhrase('titleInteractive');\n case 'series': return getPhrase('titleSeries');\n case 'playlist': return getPhrase('titlePlaylist');\n case 'subject': return getPhrase('titleTopic');\n }\n}\n\nfunction getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n}\n\n/**\n * I realise these are all the same right now, but they're technically different things - Sha\n */\nconst canEmbed = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\nconst canAddPolicies = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\n\ntype ShareScreen = 'main' | 'link-settings' | 'copy-embed';\n\ninterface ShareViewProps extends PopupViewProps {\n entityId: string;\n entityType: SharableEntityType;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n gatewayApiUrl?: string;\n integrationSettingAppLink?: AppLink;\n messagePopupAppLink?: AppLink;\n enableIntegrationBanner?: boolean\n}\n\nexport function ShareView(props: ShareViewProps): JSX.Element {\n const dispatch = useDispatch();\n\n const alerts = useAlerts();\n\n // If the gateway api url is passed down in props and not pulled from the config, we don't need to fetch the user token\n const shouldFetchUserToken = !props.gatewayApiUrl;\n\n /**\n * Our screen is initially set to null, and it is set to it's initial state\n * by ShareViewHelper.useRestrictionWarning.\n */\n const [ screen, setScreen ] = React.useState<ShareScreen>('main');\n\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(props.entityType)(props.entityId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const userToken = Flight.useBasicFetch<HashObject>(shouldFetchUserToken && UserRequests.token());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.entityId));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(\n ShareRequests.getSentDirectShareByObjectId(props.entityId)\n );\n const recipients = Flight.useBasicFetch<BaseObject[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n\n const recentlySharedToIds = currentUser.data && RecentShareHelper.getRecentlySharedTo(currentUser.data.id);\n\n const hasRecentlySharedRecipients = !!recentlySharedToIds?.length;\n const recentlySharedTo = Flight.useBasicFetch<BaseObject[]>(hasRecentlySharedRecipients &&\n ShareRequests.getRecipientsById(recentlySharedToIds, currentUser.data.customerId));\n\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(props.entityId));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const {\n shareToGoogleClassroom,\n shareToMicrosoftTeams,\n shareOverrideRestrictions,\n isLoadingSettings\n } = useSettings(null);\n\n /**\n * We need to manually re-fetch the recipients they're updated on the directShare object.\n * See ShareRequests.getDirectShareRecipientsById for an explanation\n * of why we are doing this.\n */\n function fetchRecipients(customerId: string, directShare: DirectShare): void {\n if (directShare.recipients?.length)\n Flight.getFetch(dispatch)(ShareViewHelper.getDirectShareRecipientsRequest(customerId, directShare));\n }\n\n function fetchRecipientUsers(id: string, callback: (users: UserCollection) => void): void {\n Flight.getFetch(dispatch)(ShareRequests.getRecipientUsers(id, callback));\n }\n\n function onClickCreateLink(): void {\n if (shareLink.data)\n return;\n\n ShareViewHelper.createLink({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n alerts\n });\n }\n\n function onClickSaveLink(data: EditShareLinkRequest, onError: () => void): void {\n ShareViewHelper.updateLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n data,\n alerts,\n () => setScreen('main'),\n onError\n );\n }\n\n function onClickDeleteLink(): void {\n ShareViewHelper.deleteLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n alerts,\n () => setScreen('main')\n );\n }\n\n function onClickShare(recipients: ShareRecipient[], message: string, onDone?: () => void): void {\n ShareViewHelper.createOrUpdateDirectShare({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n currentUser: currentUser.data,\n recipients,\n message,\n sentDirectShare: sentDirectShare.data,\n onSuccess: directShare => fetchRecipients(currentUser.data.customerId, directShare),\n onError: () => alerts.error(getPhrase('directShareError', { name: entity.data.name })),\n onDone\n });\n }\n\n function onClickRemoveRecipient(recipientId: string, onError?: () => void): void {\n ShareViewHelper.removeDirectShareRecipient(\n dispatch,\n recipientId,\n props.entityType,\n sentDirectShare.data,\n directShare => fetchRecipients(currentUser.data.customerId, directShare),\n () => {\n alerts.error(getPhrase('removeDirectShareError'));\n onError && onError();\n }\n );\n }\n\n function onClickSavePrivacy(privacy: SharePrivacy, overrideRestrictions: boolean): void {\n if (privacy === 'private') {\n onClickDeleteLink();\n return;\n }\n\n Flight.fetch(\n dispatch,\n ShareRequests.updatePrivacy(\n shareLink.data.id,\n privacy,\n overrideRestrictions,\n () => alerts.success(getPhrase('privaciesSuccess', { name: entity.data.name })),\n () => alerts.error(getPhrase('privaciesError', { name: entity.data.name }))\n )\n );\n }\n\n function getSearchRequestHeaders(): HashObject {\n if (!shouldFetchUserToken)\n return null;\n\n return {\n authorization: `Bearer ${userToken.data.value}`\n };\n }\n\n /**\n * We are intentionally not checking to see if recipients.data or recentlySharedTo.data\n * have loaded because:\n * 1. Adding the first recipient will trigger fetching recipients for the first time\n * which would trigger the loading spinner.\n * 2. Adding and recipient will update the list of recently shared to which causes\n * recentlySharedTo to be re-fetched.\n */\n const dataLoaded = !!currentUser.data\n && !!config.data\n && (!shouldFetchUserToken || !!userToken.data)\n && !!sentDirectShare.hasCompleted\n && !!privacy.data\n && !!entity.data\n && !isLoadingSettings\n && !!yearGroups.hasCompleted;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getTitle(props.entityType)}\n closePopup={props.closePopup}\n showLoadingSpinner={!dataLoaded}\n contentClassName={(dataLoaded && screen) ? 'bg-transparent border-0' : ''}\n bodyClassName='p-0'\n >\n {(() => {\n if (!dataLoaded)\n return <></>;\n\n switch (screen) {\n case 'main':\n return (\n <MainShare\n shareLink={shareLink.data}\n shareLinkIsLoading={shareLink.isFetching}\n entity={entity.data}\n entityType={props.entityType}\n directShareRecipients={recipients.data || []}\n recentlySharedTo={recentlySharedTo.data || []}\n onClickCreateLink={onClickCreateLink}\n onClickShowSettings={() => setScreen('link-settings')}\n onClickShare={onClickShare}\n onClickRemoveRecipient={onClickRemoveRecipient}\n onClickGetEmbedCode={() => setScreen('copy-embed')}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n gatewayApiUrl={props.gatewayApiUrl || config.data.gatewayApiUrl}\n imageCdnUrl={config.data.imageCdnUrl}\n searchRequestHeaders={getSearchRequestHeaders()}\n currentUser={currentUser.data}\n fetchRecipientUsers={fetchRecipientUsers}\n privacy={privacy.data}\n onClickSavePrivacy={onClickSavePrivacy}\n canAddPolicies={canAddPolicies(props.entityType)}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n integrations={getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams)}\n integrationSettingAppLink={props.integrationSettingAppLink}\n messagePopupAppLink={props.messagePopupAppLink}\n closePopup={props.closePopup}\n enableIntegrationBanner={props.enableIntegrationBanner}\n canEmbed={canEmbed(props.entityType)}\n yearGroups={yearGroups.data}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n );\n case 'link-settings':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <ShareSettings\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickSaveLink={onClickSaveLink}\n onClickDeleteLink={onClickDeleteLink}\n onClickCancel={() => setScreen('main')}\n privacy={privacy.data}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n </div>\n );\n case 'copy-embed':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <CopyEmbed\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickCancel={() => setScreen('main')}\n />\n </div>\n );\n }\n })()}\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};"],"names":["namespace","EmbedSize","props","autoplay","setAutoplay","videoSize","setVideoSize","videoSizes","className","length","phrase","id","variant","label","map","size","key","width","height","onClick","checked","onChange","getPhrase","LinkExpiry","formikProps","htmlFor","title","disable","passwordProtectLink","spanHack","trigger","setFieldValue","values","linkExpireDate","on","disabled","showStateWhenDisabled","LanguageService","SetPasswordInput","revealPassword","setRevealPassword","errorMsg","errors","password","value","e","canEdit","target","type","placeholder","readOnly","Form","DivButton","SvgContainer","svgName","tooltipPlacement","canReset","onReset","PASSWORD_PLACEHOLDER","LinkPassword","setPasswordProtectLink","shareLink","isPasswordProtected","readonlyPassword","setReadonlyPassword","Text","ToggleSwitch","LINK_EXPIRY_TIME","getLinkExpiryDate","shouldExpire","date","Date","setDate","getDate","toISOString","ShareLinkSettingsValidationSchema","shape","removePassword","resourceId","nullable","test","name","exclusive","params","message","val","CopyEmbedHtml","EmbedHelper","copyBtnPhrase","setCopyBtnPhrase","find","s","logged","setLogged","url","embedUrl","host","config","primaryUrl","shareId","embedString","spellCheck","rows","CopyToClipboard","onCopy","setTimeout","AnalyticsHelper","entity","embedDetails","ShareViewHelper","entityType","actionType","descriptor","eventVersion","text","CopyEmbed","entityId","analyticsOptions","PopupButtons","onClickCancel","GetEmbedCode","onClickGetEmbedCode","S","getRespectRatingText","video","yearGroups","hasStudentExp","VideoHelper","restriction","RestrictionHelper","_restrictions","yearGroup","maxYearGroup","minAllowedYearGroup","rating","getIconAndText","options","status","entityTypeId","privacy","MasterType","icon","Array","isArray","overrideRestrictions","getPrivateIconAndText","isToday","DateHelper","dayDifference","days","ShareLinkStatus","ShareLinkItem","active","description","ShareLinkInfo","canManageAccess","setCanManageAccess","setPrivacy","canManageAccessPrivacy","canUpdatePrivacy","shareOverrideRestrictions","onClickSavePrivacy","GoogleClassroomAvatar","viewBox","fill","cx","cy","r","patternContentUnits","xlinkHref","transform","MicrosoftTeamsAvatar","d","ShareIntegrationsStack","Tooltip","style","zIndex","ShareAsLink","objectTypeId","CopyInput","enableIntegrations","onClickCreateLink","MessageValidationSchema","max","ShareMessageForm","FormField","component","showOptionalLabel","ShareMessage","FormWrapper","initialValues","validationSchema","onSubmit","data","onDone","onClickShare","allowInitialSubmit","filterSearchResults","recipientsToFilter","currentSelections","existingShareRecipients","currentUserId","selectedIds","filter","includes","MainShare","selections","setSelections","showShareLinkSpinner","setShowShareLinkSpinner","hasPermissions","usePermissions","hasManageIntegrationsPermission","PermissionName","canDirectShare","recentSearches","recentlySharedTo","directShareRecipients","currentUser","shareLinkIsLoading","TokenizedTypeahead","join","getRemoteUrl","UrlHelper","gatewayApiUrl","getRemotePostBody","query","indices","push","index","filters","userProfile","ObjectStatus","customerId","searchType","limit","requestHeaders","searchRequestHeaders","formatRemoteSuggestions","suggestions","results","onSuggestionSelected","selection","removeSelection","imageCdnUrl","activationLength","fetchSelectionMembers","fetchRecipientUsers","users","newSelections","forEach","updatedSelection","ObjectHelper","count","pagination","ArrayHelper","debounceTime","emptyStateImageUrl","errorStateImageUrl","hasStudentExperience","autoHeight","RecipientItem","removeRecipient","onClickRemoveRecipient","showDisplayName","typeId","onClickShowSettings","canAddPolicies","enableIntegrationBanner","integrations","canEmbed","ShareIntegrations","closePopup","appLink","integrationSettingAppLink","messagePopupAppLink","Spinner","as","animation","role","ShareSettingsForm","onClickDeleteLink","ShareSettings","onClickSaveLink","castInitialValues","getTitle","ShareView","dispatch","alerts","shouldFetchUserToken","screen","setScreen","UserRequests","ConfigRequests","userToken","ShareRequests","sentDirectShare","recipients","recentlySharedToIds","RecentShareHelper","R","hasRecentlySharedRecipients","isAuthenticated","CustomerRequests","useSettings","shareToGoogleClassroom","shareToMicrosoftTeams","isLoadingSettings","fetchRecipients","directShare","callback","onError","onSuccess","error","recipientId","success","dataLoaded","hasCompleted","Popup","showLoadingSpinner","contentClassName","bodyClassName","isFetching","authorization","googleClassroomSetting","msftTeamsSetting","IntegrationHelper","i","enabled","FormCheckbox","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","FieldWrapper","checkboxAppLink","checkboxAppLinkText","AppLink","CharacterCounter","field","fieldName","children","setType","resolvedChildren","FunctionHelper","f","containerClassName","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","touched","disabledOnChange","_props","fieldWrapperProps","FormHelper","tooltipSpanHack","maxLength","errorMessage","defaultProps","autoComplete","castValuesOnSubmit","formattedInitialValues","cast","omitChildValues","child","Object","keys","hasOwnProperty","omitNullInitialValues","initialStatus","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","reset","entries","useFormikContextWrapper","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize"],"sourceRoot":""}