@magmamath/students-features 1.4.6 → 1.5.0-rc.10

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 (412) hide show
  1. package/dist/commonjs/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.js +1 -6
  2. package/dist/commonjs/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.js.map +1 -1
  3. package/dist/commonjs/features/fluency/components/Fluency.js +6 -12
  4. package/dist/commonjs/features/fluency/components/Fluency.js.map +1 -1
  5. package/dist/commonjs/features/fluency/components/select-math-operator/SelectMathOperator.js +5 -13
  6. package/dist/commonjs/features/fluency/components/select-math-operator/SelectMathOperator.js.map +1 -1
  7. package/dist/commonjs/features/fluency/model/FluencyModel.js +0 -21
  8. package/dist/commonjs/features/fluency/model/FluencyModel.js.map +1 -1
  9. package/dist/commonjs/features/fluency/shared/fluency.constants.js +1 -6
  10. package/dist/commonjs/features/fluency/shared/fluency.constants.js.map +1 -1
  11. package/dist/commonjs/features/fluency/shared/fluency.helpers.js +1 -3
  12. package/dist/commonjs/features/fluency/shared/fluency.helpers.js.map +1 -1
  13. package/dist/commonjs/features/pmProgress/model/PmProgressModel.js +1 -7
  14. package/dist/commonjs/features/pmProgress/model/PmProgressModel.js.map +1 -1
  15. package/dist/commonjs/features/pmProgress/model/PmRecommendationsModel.js +4 -20
  16. package/dist/commonjs/features/pmProgress/model/PmRecommendationsModel.js.map +1 -1
  17. package/dist/commonjs/features/pmProgress/shared/pmProgress.helpers.js +1 -22
  18. package/dist/commonjs/features/pmProgress/shared/pmProgress.helpers.js.map +1 -1
  19. package/dist/commonjs/features/translation/constants.js +11 -0
  20. package/dist/commonjs/features/translation/constants.js.map +1 -0
  21. package/dist/commonjs/features/translation/helpers.js +60 -0
  22. package/dist/commonjs/features/translation/helpers.js.map +1 -0
  23. package/dist/commonjs/features/translation/index.js +105 -0
  24. package/dist/commonjs/features/translation/index.js.map +1 -0
  25. package/dist/commonjs/features/translation/model/TranslationModel.js +122 -0
  26. package/dist/commonjs/features/translation/model/TranslationModel.js.map +1 -0
  27. package/dist/commonjs/features/translation/model/TranslationPreprocessor.js +142 -0
  28. package/dist/commonjs/features/translation/model/TranslationPreprocessor.js.map +1 -0
  29. package/dist/commonjs/features/translation/model/TranslationService.js +112 -0
  30. package/dist/commonjs/features/translation/model/TranslationService.js.map +1 -0
  31. package/dist/commonjs/features/translation/preserve/wordsToPreserve.js +314 -0
  32. package/dist/commonjs/features/translation/preserve/wordsToPreserve.js.map +1 -0
  33. package/dist/commonjs/features/translation/providers/google/GoogleTranslationProvider.js +50 -0
  34. package/dist/commonjs/features/translation/providers/google/GoogleTranslationProvider.js.map +1 -0
  35. package/dist/commonjs/features/translation/providers/google/supportedLanguages.js +230 -0
  36. package/dist/commonjs/features/translation/providers/google/supportedLanguages.js.map +1 -0
  37. package/dist/commonjs/features/translation/providers/google.types.js +2 -0
  38. package/dist/commonjs/features/translation/providers/google.types.js.map +1 -0
  39. package/dist/commonjs/features/translation/providers/translation.interface.js +49 -0
  40. package/dist/commonjs/features/translation/providers/translation.interface.js.map +1 -0
  41. package/dist/commonjs/features/translation/types.js +2 -0
  42. package/dist/commonjs/features/translation/types.js.map +1 -0
  43. package/dist/commonjs/features/voice/index.js +15 -4
  44. package/dist/commonjs/features/voice/index.js.map +1 -1
  45. package/dist/commonjs/features/voice/playing/components/VoiceIcon.js +1 -1
  46. package/dist/commonjs/features/voice/playing/components/VoiceIcon.js.map +1 -1
  47. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptContent.js +44 -0
  48. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptContent.js.map +1 -0
  49. package/dist/commonjs/features/voice/playing/components/VoiceTranscription.js +107 -0
  50. package/dist/commonjs/features/voice/playing/components/VoiceTranscription.js.map +1 -0
  51. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionCollapsible.js +66 -0
  52. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionCollapsible.js.map +1 -0
  53. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionHeaderActions.js +58 -0
  54. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionHeaderActions.js.map +1 -0
  55. package/dist/commonjs/features/voice/playing/hooks/{useVoiceTranscriptionsDropdown.js → useDropdownAnimation.js} +8 -7
  56. package/dist/commonjs/features/voice/playing/hooks/useDropdownAnimation.js.map +1 -0
  57. package/dist/commonjs/features/voice/playing/hooks/useVoicePlayerLifecycle.js +53 -0
  58. package/dist/commonjs/features/voice/playing/hooks/useVoicePlayerLifecycle.js.map +1 -0
  59. package/dist/commonjs/features/voice/playing/hooks/useVoiceTranscriptionController.js +111 -0
  60. package/dist/commonjs/features/voice/playing/hooks/useVoiceTranscriptionController.js.map +1 -0
  61. package/dist/commonjs/features/voice/playing/model/{VoiceTranscriptionsDropdown.model.js → Dropdown.model.js} +4 -4
  62. package/dist/commonjs/features/voice/playing/model/Dropdown.model.js.map +1 -0
  63. package/dist/commonjs/features/voice/playing/model/PlaybackController.js +192 -0
  64. package/dist/commonjs/features/voice/playing/model/PlaybackController.js.map +1 -0
  65. package/dist/commonjs/features/voice/playing/model/Player.model.js +50 -5
  66. package/dist/commonjs/features/voice/playing/model/Player.model.js.map +1 -1
  67. package/dist/commonjs/features/voice/playing/model/{VoiceTranscriptionsCollection.js → TranscriptionsCollection.js} +4 -4
  68. package/dist/commonjs/features/voice/playing/model/TranscriptionsCollection.js.map +1 -0
  69. package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.js +83 -0
  70. package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.js.map +1 -0
  71. package/dist/commonjs/features/voice/playing/model/Translation.model.js +62 -0
  72. package/dist/commonjs/features/voice/playing/model/Translation.model.js.map +1 -0
  73. package/dist/commonjs/features/voice/playing/model/VoiceFileDownloader.model.js +2 -2
  74. package/dist/commonjs/features/voice/playing/model/VoiceFileDownloader.model.js.map +1 -1
  75. package/dist/commonjs/features/voice/playing/model/VoicePlayer.model.js +58 -172
  76. package/dist/commonjs/features/voice/playing/model/VoicePlayer.model.js.map +1 -1
  77. package/dist/commonjs/features/voice/recording/components/VoiceRecordDivider.js +1 -1
  78. package/dist/commonjs/features/voice/recording/components/VoiceRecordDivider.js.map +1 -1
  79. package/dist/commonjs/features/voice/types.js +12 -1
  80. package/dist/commonjs/features/voice/types.js.map +1 -1
  81. package/dist/commonjs/index.js +12 -0
  82. package/dist/commonjs/index.js.map +1 -1
  83. package/dist/module/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.js +2 -7
  84. package/dist/module/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.js.map +1 -1
  85. package/dist/module/features/fluency/components/Fluency.js +8 -14
  86. package/dist/module/features/fluency/components/Fluency.js.map +1 -1
  87. package/dist/module/features/fluency/components/select-math-operator/SelectMathOperator.js +5 -13
  88. package/dist/module/features/fluency/components/select-math-operator/SelectMathOperator.js.map +1 -1
  89. package/dist/module/features/fluency/model/FluencyModel.js +1 -22
  90. package/dist/module/features/fluency/model/FluencyModel.js.map +1 -1
  91. package/dist/module/features/fluency/shared/fluency.constants.js +0 -5
  92. package/dist/module/features/fluency/shared/fluency.constants.js.map +1 -1
  93. package/dist/module/features/fluency/shared/fluency.helpers.js +0 -1
  94. package/dist/module/features/fluency/shared/fluency.helpers.js.map +1 -1
  95. package/dist/module/features/pmProgress/model/PmProgressModel.js +1 -7
  96. package/dist/module/features/pmProgress/model/PmProgressModel.js.map +1 -1
  97. package/dist/module/features/pmProgress/model/PmRecommendationsModel.js +4 -20
  98. package/dist/module/features/pmProgress/model/PmRecommendationsModel.js.map +1 -1
  99. package/dist/module/features/pmProgress/shared/pmProgress.helpers.js +0 -20
  100. package/dist/module/features/pmProgress/shared/pmProgress.helpers.js.map +1 -1
  101. package/dist/module/features/translation/constants.js +7 -0
  102. package/dist/module/features/translation/constants.js.map +1 -0
  103. package/dist/module/features/translation/helpers.js +53 -0
  104. package/dist/module/features/translation/helpers.js.map +1 -0
  105. package/dist/module/features/translation/index.js +12 -0
  106. package/dist/module/features/translation/index.js.map +1 -0
  107. package/dist/module/features/translation/model/TranslationModel.js +117 -0
  108. package/dist/module/features/translation/model/TranslationModel.js.map +1 -0
  109. package/dist/module/features/translation/model/TranslationPreprocessor.js +137 -0
  110. package/dist/module/features/translation/model/TranslationPreprocessor.js.map +1 -0
  111. package/dist/module/features/translation/model/TranslationService.js +107 -0
  112. package/dist/module/features/translation/model/TranslationService.js.map +1 -0
  113. package/dist/module/features/translation/preserve/wordsToPreserve.js +310 -0
  114. package/dist/module/features/translation/preserve/wordsToPreserve.js.map +1 -0
  115. package/dist/module/features/translation/providers/google/GoogleTranslationProvider.js +45 -0
  116. package/dist/module/features/translation/providers/google/GoogleTranslationProvider.js.map +1 -0
  117. package/dist/module/features/translation/providers/google/supportedLanguages.js +225 -0
  118. package/dist/module/features/translation/providers/google/supportedLanguages.js.map +1 -0
  119. package/dist/module/features/translation/providers/google.types.js +2 -0
  120. package/dist/module/features/translation/providers/google.types.js.map +1 -0
  121. package/dist/module/features/translation/providers/translation.interface.js +44 -0
  122. package/dist/module/features/translation/providers/translation.interface.js.map +1 -0
  123. package/dist/module/features/translation/types.js +2 -0
  124. package/dist/module/features/translation/types.js.map +1 -0
  125. package/dist/module/features/voice/index.js +2 -1
  126. package/dist/module/features/voice/index.js.map +1 -1
  127. package/dist/module/features/voice/playing/components/VoiceIcon.js +2 -2
  128. package/dist/module/features/voice/playing/components/VoiceIcon.js.map +1 -1
  129. package/dist/module/features/voice/playing/components/VoiceTranscriptContent.js +38 -0
  130. package/dist/module/features/voice/playing/components/VoiceTranscriptContent.js.map +1 -0
  131. package/dist/module/features/voice/playing/components/VoiceTranscription.js +101 -0
  132. package/dist/module/features/voice/playing/components/VoiceTranscription.js.map +1 -0
  133. package/dist/module/features/voice/playing/components/VoiceTranscriptionCollapsible.js +58 -0
  134. package/dist/module/features/voice/playing/components/VoiceTranscriptionCollapsible.js.map +1 -0
  135. package/dist/module/features/voice/playing/components/VoiceTranscriptionHeaderActions.js +52 -0
  136. package/dist/module/features/voice/playing/components/VoiceTranscriptionHeaderActions.js.map +1 -0
  137. package/dist/module/features/voice/playing/hooks/{useVoiceTranscriptionsDropdown.js → useDropdownAnimation.js} +6 -5
  138. package/dist/module/features/voice/playing/hooks/useDropdownAnimation.js.map +1 -0
  139. package/dist/module/features/voice/playing/hooks/useVoicePlayerLifecycle.js +48 -0
  140. package/dist/module/features/voice/playing/hooks/useVoicePlayerLifecycle.js.map +1 -0
  141. package/dist/module/features/voice/playing/hooks/useVoiceTranscriptionController.js +106 -0
  142. package/dist/module/features/voice/playing/hooks/useVoiceTranscriptionController.js.map +1 -0
  143. package/dist/module/features/voice/playing/model/{VoiceTranscriptionsDropdown.model.js → Dropdown.model.js} +2 -2
  144. package/dist/module/features/voice/playing/model/Dropdown.model.js.map +1 -0
  145. package/dist/module/features/voice/playing/model/PlaybackController.js +187 -0
  146. package/dist/module/features/voice/playing/model/PlaybackController.js.map +1 -0
  147. package/dist/module/features/voice/playing/model/Player.model.js +51 -4
  148. package/dist/module/features/voice/playing/model/Player.model.js.map +1 -1
  149. package/dist/module/features/voice/playing/model/{VoiceTranscriptionsCollection.js → TranscriptionsCollection.js} +2 -2
  150. package/dist/module/features/voice/playing/model/TranscriptionsCollection.js.map +1 -0
  151. package/dist/module/features/voice/playing/model/TranscriptionsDownloader.model.js +78 -0
  152. package/dist/module/features/voice/playing/model/TranscriptionsDownloader.model.js.map +1 -0
  153. package/dist/module/features/voice/playing/model/Translation.model.js +57 -0
  154. package/dist/module/features/voice/playing/model/Translation.model.js.map +1 -0
  155. package/dist/module/features/voice/playing/model/VoiceFileDownloader.model.js +2 -2
  156. package/dist/module/features/voice/playing/model/VoiceFileDownloader.model.js.map +1 -1
  157. package/dist/module/features/voice/playing/model/VoicePlayer.model.js +60 -174
  158. package/dist/module/features/voice/playing/model/VoicePlayer.model.js.map +1 -1
  159. package/dist/module/features/voice/recording/components/VoiceRecordDivider.js +2 -2
  160. package/dist/module/features/voice/recording/components/VoiceRecordDivider.js.map +1 -1
  161. package/dist/module/features/voice/types.js +11 -0
  162. package/dist/module/features/voice/types.js.map +1 -1
  163. package/dist/module/index.js +1 -0
  164. package/dist/module/index.js.map +1 -1
  165. package/dist/typescript/commonjs/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.d.ts.map +1 -1
  166. package/dist/typescript/commonjs/features/fluency/components/Fluency.d.ts.map +1 -1
  167. package/dist/typescript/commonjs/features/fluency/components/select-math-operator/SelectMathOperator.d.ts.map +1 -1
  168. package/dist/typescript/commonjs/features/fluency/model/FluencyModel.d.ts +0 -3
  169. package/dist/typescript/commonjs/features/fluency/model/FluencyModel.d.ts.map +1 -1
  170. package/dist/typescript/commonjs/features/fluency/shared/fluency.constants.d.ts +0 -4
  171. package/dist/typescript/commonjs/features/fluency/shared/fluency.constants.d.ts.map +1 -1
  172. package/dist/typescript/commonjs/features/fluency/shared/fluency.helpers.d.ts +0 -1
  173. package/dist/typescript/commonjs/features/fluency/shared/fluency.helpers.d.ts.map +1 -1
  174. package/dist/typescript/commonjs/features/pmProgress/model/PmProgressModel.d.ts.map +1 -1
  175. package/dist/typescript/commonjs/features/pmProgress/model/PmRecommendationsModel.d.ts +38 -9
  176. package/dist/typescript/commonjs/features/pmProgress/model/PmRecommendationsModel.d.ts.map +1 -1
  177. package/dist/typescript/commonjs/features/pmProgress/shared/pmProgress.helpers.d.ts +0 -1
  178. package/dist/typescript/commonjs/features/pmProgress/shared/pmProgress.helpers.d.ts.map +1 -1
  179. package/dist/typescript/commonjs/features/translation/constants.d.ts +5 -0
  180. package/dist/typescript/commonjs/features/translation/constants.d.ts.map +1 -0
  181. package/dist/typescript/commonjs/features/translation/helpers.d.ts +9 -0
  182. package/dist/typescript/commonjs/features/translation/helpers.d.ts.map +1 -0
  183. package/dist/typescript/commonjs/features/translation/index.d.ts +12 -0
  184. package/dist/typescript/commonjs/features/translation/index.d.ts.map +1 -0
  185. package/dist/typescript/commonjs/features/translation/model/TranslationModel.d.ts +33 -0
  186. package/dist/typescript/commonjs/features/translation/model/TranslationModel.d.ts.map +1 -0
  187. package/dist/typescript/commonjs/features/translation/model/TranslationPreprocessor.d.ts +34 -0
  188. package/dist/typescript/commonjs/features/translation/model/TranslationPreprocessor.d.ts.map +1 -0
  189. package/dist/typescript/commonjs/features/translation/model/TranslationService.d.ts +40 -0
  190. package/dist/typescript/commonjs/features/translation/model/TranslationService.d.ts.map +1 -0
  191. package/dist/typescript/commonjs/features/translation/preserve/wordsToPreserve.d.ts +3 -0
  192. package/dist/typescript/commonjs/features/translation/preserve/wordsToPreserve.d.ts.map +1 -0
  193. package/dist/typescript/commonjs/features/translation/providers/google/GoogleTranslationProvider.d.ts +17 -0
  194. package/dist/typescript/commonjs/features/translation/providers/google/GoogleTranslationProvider.d.ts.map +1 -0
  195. package/dist/typescript/commonjs/features/translation/providers/google/supportedLanguages.d.ts +209 -0
  196. package/dist/typescript/commonjs/features/translation/providers/google/supportedLanguages.d.ts.map +1 -0
  197. package/dist/typescript/commonjs/features/translation/providers/google.types.d.ts +15 -0
  198. package/dist/typescript/commonjs/features/translation/providers/google.types.d.ts.map +1 -0
  199. package/dist/typescript/commonjs/features/translation/providers/translation.interface.d.ts +30 -0
  200. package/dist/typescript/commonjs/features/translation/providers/translation.interface.d.ts.map +1 -0
  201. package/dist/typescript/commonjs/features/translation/types.d.ts +27 -0
  202. package/dist/typescript/commonjs/features/translation/types.d.ts.map +1 -0
  203. package/dist/typescript/commonjs/features/voice/index.d.ts +3 -1
  204. package/dist/typescript/commonjs/features/voice/index.d.ts.map +1 -1
  205. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptContent.d.ts +8 -0
  206. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptContent.d.ts.map +1 -0
  207. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscription.d.ts +16 -0
  208. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscription.d.ts.map +1 -0
  209. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionCollapsible.d.ts +10 -0
  210. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionCollapsible.d.ts.map +1 -0
  211. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionHeaderActions.d.ts +12 -0
  212. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionHeaderActions.d.ts.map +1 -0
  213. package/dist/typescript/commonjs/features/voice/playing/hooks/{useVoiceTranscriptionsDropdown.d.ts → useDropdownAnimation.d.ts} +3 -3
  214. package/dist/typescript/commonjs/features/voice/playing/hooks/useDropdownAnimation.d.ts.map +1 -0
  215. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoicePlayerLifecycle.d.ts +15 -0
  216. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoicePlayerLifecycle.d.ts.map +1 -0
  217. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoiceTranscriptionController.d.ts +30 -0
  218. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoiceTranscriptionController.d.ts.map +1 -0
  219. package/dist/typescript/{module/features/voice/playing/model/VoiceTranscriptionsDropdown.model.d.ts → commonjs/features/voice/playing/model/Dropdown.model.d.ts} +2 -2
  220. package/dist/typescript/commonjs/features/voice/playing/model/Dropdown.model.d.ts.map +1 -0
  221. package/dist/typescript/commonjs/features/voice/playing/model/PlaybackController.d.ts +28 -0
  222. package/dist/typescript/commonjs/features/voice/playing/model/PlaybackController.d.ts.map +1 -0
  223. package/dist/typescript/commonjs/features/voice/playing/model/Player.model.d.ts +4 -0
  224. package/dist/typescript/commonjs/features/voice/playing/model/Player.model.d.ts.map +1 -1
  225. package/dist/typescript/{module/features/voice/playing/model/VoiceTranscriptionsCollection.d.ts → commonjs/features/voice/playing/model/TranscriptionsCollection.d.ts} +2 -2
  226. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsCollection.d.ts.map +1 -0
  227. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.d.ts +19 -0
  228. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.d.ts.map +1 -0
  229. package/dist/typescript/commonjs/features/voice/playing/model/Translation.model.d.ts +25 -0
  230. package/dist/typescript/commonjs/features/voice/playing/model/Translation.model.d.ts.map +1 -0
  231. package/dist/typescript/commonjs/features/voice/playing/model/VoiceFileDownloader.model.d.ts +2 -2
  232. package/dist/typescript/commonjs/features/voice/playing/model/VoiceFileDownloader.model.d.ts.map +1 -1
  233. package/dist/typescript/commonjs/features/voice/playing/model/VoicePlayer.model.d.ts +19 -18
  234. package/dist/typescript/commonjs/features/voice/playing/model/VoicePlayer.model.d.ts.map +1 -1
  235. package/dist/typescript/commonjs/features/voice/types.d.ts +14 -2
  236. package/dist/typescript/commonjs/features/voice/types.d.ts.map +1 -1
  237. package/dist/typescript/commonjs/index.d.ts +1 -0
  238. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  239. package/dist/typescript/module/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.d.ts.map +1 -1
  240. package/dist/typescript/module/features/fluency/components/Fluency.d.ts.map +1 -1
  241. package/dist/typescript/module/features/fluency/components/select-math-operator/SelectMathOperator.d.ts.map +1 -1
  242. package/dist/typescript/module/features/fluency/model/FluencyModel.d.ts +0 -3
  243. package/dist/typescript/module/features/fluency/model/FluencyModel.d.ts.map +1 -1
  244. package/dist/typescript/module/features/fluency/shared/fluency.constants.d.ts +0 -4
  245. package/dist/typescript/module/features/fluency/shared/fluency.constants.d.ts.map +1 -1
  246. package/dist/typescript/module/features/fluency/shared/fluency.helpers.d.ts +0 -1
  247. package/dist/typescript/module/features/fluency/shared/fluency.helpers.d.ts.map +1 -1
  248. package/dist/typescript/module/features/pmProgress/model/PmProgressModel.d.ts.map +1 -1
  249. package/dist/typescript/module/features/pmProgress/model/PmRecommendationsModel.d.ts +38 -9
  250. package/dist/typescript/module/features/pmProgress/model/PmRecommendationsModel.d.ts.map +1 -1
  251. package/dist/typescript/module/features/pmProgress/shared/pmProgress.helpers.d.ts +0 -1
  252. package/dist/typescript/module/features/pmProgress/shared/pmProgress.helpers.d.ts.map +1 -1
  253. package/dist/typescript/module/features/translation/constants.d.ts +5 -0
  254. package/dist/typescript/module/features/translation/constants.d.ts.map +1 -0
  255. package/dist/typescript/module/features/translation/helpers.d.ts +9 -0
  256. package/dist/typescript/module/features/translation/helpers.d.ts.map +1 -0
  257. package/dist/typescript/module/features/translation/index.d.ts +12 -0
  258. package/dist/typescript/module/features/translation/index.d.ts.map +1 -0
  259. package/dist/typescript/module/features/translation/model/TranslationModel.d.ts +33 -0
  260. package/dist/typescript/module/features/translation/model/TranslationModel.d.ts.map +1 -0
  261. package/dist/typescript/module/features/translation/model/TranslationPreprocessor.d.ts +34 -0
  262. package/dist/typescript/module/features/translation/model/TranslationPreprocessor.d.ts.map +1 -0
  263. package/dist/typescript/module/features/translation/model/TranslationService.d.ts +40 -0
  264. package/dist/typescript/module/features/translation/model/TranslationService.d.ts.map +1 -0
  265. package/dist/typescript/module/features/translation/preserve/wordsToPreserve.d.ts +3 -0
  266. package/dist/typescript/module/features/translation/preserve/wordsToPreserve.d.ts.map +1 -0
  267. package/dist/typescript/module/features/translation/providers/google/GoogleTranslationProvider.d.ts +17 -0
  268. package/dist/typescript/module/features/translation/providers/google/GoogleTranslationProvider.d.ts.map +1 -0
  269. package/dist/typescript/module/features/translation/providers/google/supportedLanguages.d.ts +209 -0
  270. package/dist/typescript/module/features/translation/providers/google/supportedLanguages.d.ts.map +1 -0
  271. package/dist/typescript/module/features/translation/providers/google.types.d.ts +15 -0
  272. package/dist/typescript/module/features/translation/providers/google.types.d.ts.map +1 -0
  273. package/dist/typescript/module/features/translation/providers/translation.interface.d.ts +30 -0
  274. package/dist/typescript/module/features/translation/providers/translation.interface.d.ts.map +1 -0
  275. package/dist/typescript/module/features/translation/types.d.ts +27 -0
  276. package/dist/typescript/module/features/translation/types.d.ts.map +1 -0
  277. package/dist/typescript/module/features/voice/index.d.ts +3 -1
  278. package/dist/typescript/module/features/voice/index.d.ts.map +1 -1
  279. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptContent.d.ts +8 -0
  280. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptContent.d.ts.map +1 -0
  281. package/dist/typescript/module/features/voice/playing/components/VoiceTranscription.d.ts +16 -0
  282. package/dist/typescript/module/features/voice/playing/components/VoiceTranscription.d.ts.map +1 -0
  283. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionCollapsible.d.ts +10 -0
  284. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionCollapsible.d.ts.map +1 -0
  285. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionHeaderActions.d.ts +12 -0
  286. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionHeaderActions.d.ts.map +1 -0
  287. package/dist/typescript/module/features/voice/playing/hooks/{useVoiceTranscriptionsDropdown.d.ts → useDropdownAnimation.d.ts} +3 -3
  288. package/dist/typescript/module/features/voice/playing/hooks/useDropdownAnimation.d.ts.map +1 -0
  289. package/dist/typescript/module/features/voice/playing/hooks/useVoicePlayerLifecycle.d.ts +15 -0
  290. package/dist/typescript/module/features/voice/playing/hooks/useVoicePlayerLifecycle.d.ts.map +1 -0
  291. package/dist/typescript/module/features/voice/playing/hooks/useVoiceTranscriptionController.d.ts +30 -0
  292. package/dist/typescript/module/features/voice/playing/hooks/useVoiceTranscriptionController.d.ts.map +1 -0
  293. package/dist/typescript/{commonjs/features/voice/playing/model/VoiceTranscriptionsDropdown.model.d.ts → module/features/voice/playing/model/Dropdown.model.d.ts} +2 -2
  294. package/dist/typescript/module/features/voice/playing/model/Dropdown.model.d.ts.map +1 -0
  295. package/dist/typescript/module/features/voice/playing/model/PlaybackController.d.ts +28 -0
  296. package/dist/typescript/module/features/voice/playing/model/PlaybackController.d.ts.map +1 -0
  297. package/dist/typescript/module/features/voice/playing/model/Player.model.d.ts +4 -0
  298. package/dist/typescript/module/features/voice/playing/model/Player.model.d.ts.map +1 -1
  299. package/dist/typescript/{commonjs/features/voice/playing/model/VoiceTranscriptionsCollection.d.ts → module/features/voice/playing/model/TranscriptionsCollection.d.ts} +2 -2
  300. package/dist/typescript/module/features/voice/playing/model/TranscriptionsCollection.d.ts.map +1 -0
  301. package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloader.model.d.ts +19 -0
  302. package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloader.model.d.ts.map +1 -0
  303. package/dist/typescript/module/features/voice/playing/model/Translation.model.d.ts +25 -0
  304. package/dist/typescript/module/features/voice/playing/model/Translation.model.d.ts.map +1 -0
  305. package/dist/typescript/module/features/voice/playing/model/VoiceFileDownloader.model.d.ts +2 -2
  306. package/dist/typescript/module/features/voice/playing/model/VoiceFileDownloader.model.d.ts.map +1 -1
  307. package/dist/typescript/module/features/voice/playing/model/VoicePlayer.model.d.ts +19 -18
  308. package/dist/typescript/module/features/voice/playing/model/VoicePlayer.model.d.ts.map +1 -1
  309. package/dist/typescript/module/features/voice/types.d.ts +14 -2
  310. package/dist/typescript/module/features/voice/types.d.ts.map +1 -1
  311. package/dist/typescript/module/index.d.ts +1 -0
  312. package/dist/typescript/module/index.d.ts.map +1 -1
  313. package/package.json +37 -10
  314. package/src/features/endOfAssignment/components/CorrectAnswer/CorrectAnswer.tsx +2 -9
  315. package/src/features/fluency/components/Fluency.tsx +9 -17
  316. package/src/features/fluency/components/select-math-operator/SelectMathOperator.tsx +5 -13
  317. package/src/features/fluency/model/FluencyModel.ts +1 -25
  318. package/src/features/fluency/shared/fluency.constants.ts +0 -5
  319. package/src/features/fluency/shared/fluency.helpers.ts +0 -3
  320. package/src/features/pmProgress/model/PmProgressModel.ts +1 -4
  321. package/src/features/pmProgress/model/PmRecommendationsModel.ts +6 -22
  322. package/src/features/pmProgress/shared/pmProgress.helpers.ts +0 -33
  323. package/src/features/translation/constants.ts +4 -0
  324. package/src/features/translation/helpers.ts +63 -0
  325. package/src/features/translation/index.ts +30 -0
  326. package/src/features/translation/model/TranslationModel.ts +174 -0
  327. package/src/features/translation/model/TranslationPreprocessor.ts +171 -0
  328. package/src/features/translation/model/TranslationService.ts +148 -0
  329. package/src/features/translation/preserve/wordsToPreserve.ts +87 -0
  330. package/src/features/translation/providers/google/GoogleTranslationProvider.ts +50 -0
  331. package/src/features/translation/providers/google/supportedLanguages.ts +229 -0
  332. package/src/features/translation/providers/google.types.ts +16 -0
  333. package/src/features/translation/providers/translation.interface.ts +63 -0
  334. package/src/features/translation/types.ts +30 -0
  335. package/src/features/voice/index.ts +3 -1
  336. package/src/features/voice/playing/components/VoiceIcon.tsx +2 -2
  337. package/src/features/voice/playing/components/VoiceTranscriptContent.tsx +44 -0
  338. package/src/features/voice/playing/components/VoiceTranscription.tsx +117 -0
  339. package/src/features/voice/playing/components/VoiceTranscriptionCollapsible.tsx +59 -0
  340. package/src/features/voice/playing/components/VoiceTranscriptionHeaderActions.tsx +61 -0
  341. package/src/features/voice/playing/hooks/{useVoiceTranscriptionsDropdown.ts → useDropdownAnimation.ts} +5 -5
  342. package/src/features/voice/playing/hooks/useVoicePlayerLifecycle.ts +64 -0
  343. package/src/features/voice/playing/hooks/useVoiceTranscriptionController.ts +148 -0
  344. package/src/features/voice/playing/model/{VoiceTranscriptionsDropdown.model.ts → Dropdown.model.ts} +2 -2
  345. package/src/features/voice/playing/model/PlaybackController.ts +221 -0
  346. package/src/features/voice/playing/model/Player.model.ts +52 -4
  347. package/src/features/voice/playing/model/{VoiceTranscriptionsCollection.ts → TranscriptionsCollection.ts} +1 -1
  348. package/src/features/voice/playing/model/TranscriptionsDownloader.model.ts +88 -0
  349. package/src/features/voice/playing/model/Translation.model.ts +75 -0
  350. package/src/features/voice/playing/model/VoiceFileDownloader.model.ts +2 -2
  351. package/src/features/voice/playing/model/VoicePlayer.model.ts +68 -192
  352. package/src/features/voice/recording/components/VoiceRecordDivider.tsx +2 -2
  353. package/src/features/voice/types.ts +21 -1
  354. package/src/i18n/.generated/schema.json +3 -7
  355. package/src/index.ts +1 -0
  356. package/dist/commonjs/features/fluency/components/FluencyStatusOverlay.js +0 -101
  357. package/dist/commonjs/features/fluency/components/FluencyStatusOverlay.js.map +0 -1
  358. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdown.js +0 -245
  359. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdown.js.map +0 -1
  360. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdownItem.js +0 -109
  361. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdownItem.js.map +0 -1
  362. package/dist/commonjs/features/voice/playing/hooks/useVoiceTranscriptionsDropdown.js.map +0 -1
  363. package/dist/commonjs/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.js +0 -34
  364. package/dist/commonjs/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.js.map +0 -1
  365. package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloaderModel.js +0 -66
  366. package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloaderModel.js.map +0 -1
  367. package/dist/commonjs/features/voice/playing/model/VoiceTranscriptionsCollection.js.map +0 -1
  368. package/dist/commonjs/features/voice/playing/model/VoiceTranscriptionsDropdown.model.js.map +0 -1
  369. package/dist/module/features/fluency/components/FluencyStatusOverlay.js +0 -95
  370. package/dist/module/features/fluency/components/FluencyStatusOverlay.js.map +0 -1
  371. package/dist/module/features/voice/playing/components/VoiceTranscriptionsDropdown.js +0 -238
  372. package/dist/module/features/voice/playing/components/VoiceTranscriptionsDropdown.js.map +0 -1
  373. package/dist/module/features/voice/playing/components/VoiceTranscriptionsDropdownItem.js +0 -103
  374. package/dist/module/features/voice/playing/components/VoiceTranscriptionsDropdownItem.js.map +0 -1
  375. package/dist/module/features/voice/playing/hooks/useVoiceTranscriptionsDropdown.js.map +0 -1
  376. package/dist/module/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.js +0 -29
  377. package/dist/module/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.js.map +0 -1
  378. package/dist/module/features/voice/playing/model/TranscriptionsDownloaderModel.js +0 -61
  379. package/dist/module/features/voice/playing/model/TranscriptionsDownloaderModel.js.map +0 -1
  380. package/dist/module/features/voice/playing/model/VoiceTranscriptionsCollection.js.map +0 -1
  381. package/dist/module/features/voice/playing/model/VoiceTranscriptionsDropdown.model.js.map +0 -1
  382. package/dist/typescript/commonjs/features/fluency/components/FluencyStatusOverlay.d.ts +0 -8
  383. package/dist/typescript/commonjs/features/fluency/components/FluencyStatusOverlay.d.ts.map +0 -1
  384. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdown.d.ts +0 -16
  385. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdown.d.ts.map +0 -1
  386. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdownItem.d.ts +0 -12
  387. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptionsDropdownItem.d.ts.map +0 -1
  388. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoiceTranscriptionsDropdown.d.ts.map +0 -1
  389. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.d.ts +0 -11
  390. package/dist/typescript/commonjs/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.d.ts.map +0 -1
  391. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloaderModel.d.ts +0 -15
  392. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloaderModel.d.ts.map +0 -1
  393. package/dist/typescript/commonjs/features/voice/playing/model/VoiceTranscriptionsCollection.d.ts.map +0 -1
  394. package/dist/typescript/commonjs/features/voice/playing/model/VoiceTranscriptionsDropdown.model.d.ts.map +0 -1
  395. package/dist/typescript/module/features/fluency/components/FluencyStatusOverlay.d.ts +0 -8
  396. package/dist/typescript/module/features/fluency/components/FluencyStatusOverlay.d.ts.map +0 -1
  397. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionsDropdown.d.ts +0 -16
  398. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionsDropdown.d.ts.map +0 -1
  399. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionsDropdownItem.d.ts +0 -12
  400. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptionsDropdownItem.d.ts.map +0 -1
  401. package/dist/typescript/module/features/voice/playing/hooks/useVoiceTranscriptionsDropdown.d.ts.map +0 -1
  402. package/dist/typescript/module/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.d.ts +0 -11
  403. package/dist/typescript/module/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.d.ts.map +0 -1
  404. package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloaderModel.d.ts +0 -15
  405. package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloaderModel.d.ts.map +0 -1
  406. package/dist/typescript/module/features/voice/playing/model/VoiceTranscriptionsCollection.d.ts.map +0 -1
  407. package/dist/typescript/module/features/voice/playing/model/VoiceTranscriptionsDropdown.model.d.ts.map +0 -1
  408. package/src/features/fluency/components/FluencyStatusOverlay.tsx +0 -101
  409. package/src/features/voice/playing/components/VoiceTranscriptionsDropdown.tsx +0 -296
  410. package/src/features/voice/playing/components/VoiceTranscriptionsDropdownItem.tsx +0 -128
  411. package/src/features/voice/playing/hooks/useVoiceTranscriptionsDropdownItemAnimation.ts +0 -40
  412. package/src/features/voice/playing/model/TranscriptionsDownloaderModel.ts +0 -80
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { useGate, useUnit } from 'effector-react'
2
+ import { useGate } from 'effector-react'
3
3
  import { View, StyleSheet } from 'react-native'
4
4
  import { Typography, HeadingVariants, SPACING, COLORS } from '@magmamath/react-native-ui'
5
5
  import { useText } from '../../../i18n/i18n'
@@ -8,7 +8,6 @@ import { DayStreakCounter } from './day-streak-counter/DayStreakCounter'
8
8
  import { SelectMathOperator } from './select-math-operator/SelectMathOperator'
9
9
  import { FluencyMatrix } from './matrix/FluencyMatrix'
10
10
  import { MobileMenu } from './mobile-menu/MobileMenu'
11
- import { FluencyStatusOverlay } from './FluencyStatusOverlay'
12
11
  import { FluencyProvider } from '../context/FluencyContext'
13
12
  import type { FluencyModel } from '../model/FluencyModel'
14
13
  import type { FluencyMode } from '../shared/fluency.constants'
@@ -33,7 +32,6 @@ export const Fluency = ({
33
32
  }: FluencyProps) => {
34
33
  useGate(model.gate, { config })
35
34
  const t = useText()
36
- const status = useUnit(model.$status)
37
35
 
38
36
  return (
39
37
  <FluencyProvider value={{ model, onStartPress, onPracticePress, onModeSelectPress }}>
@@ -45,21 +43,15 @@ export const Fluency = ({
45
43
  </Typography>
46
44
  </View>
47
45
 
48
- {status ? (
49
- <FluencyStatusOverlay status={status} />
50
- ) : (
51
- <>
52
- <View style={styles.header}>
53
- <StartBanner />
54
- <DayStreakCounter />
55
- </View>
46
+ <View style={styles.header}>
47
+ <StartBanner />
48
+ <DayStreakCounter />
49
+ </View>
56
50
 
57
- <View style={styles.matrix}>
58
- <SelectMathOperator />
59
- <FluencyMatrix />
60
- </View>
61
- </>
62
- )}
51
+ <View style={styles.matrix}>
52
+ <SelectMathOperator />
53
+ <FluencyMatrix />
54
+ </View>
63
55
  </View>
64
56
  </FluencyProvider>
65
57
  )
@@ -17,22 +17,14 @@ import { useText } from '../../../../i18n/i18n'
17
17
  export const SelectMathOperator = () => {
18
18
  const t = useText()
19
19
  const { model, onModeSelectPress } = useFluency()
20
- const { fluencyMode, matrix } = useUnit({
21
- fluencyMode: model.matrix.$mode,
22
- matrix: model.matrix.$data,
23
- })
24
-
25
- const visibleModes = matrix
26
- ? FLUENCY_MODES.filter(
27
- ({ mode }) => Object.keys(matrix.operations?.[mode]?.facts ?? {}).length > 0,
28
- )
29
- : FLUENCY_MODES
20
+ const fluencyMode = useUnit(model.matrix.$mode)
21
+ const matrix = useUnit(model.matrix.$data)
30
22
 
31
23
  return (
32
24
  <View style={styles.container}>
33
- {visibleModes.map(({ mode, label, symbol, select }, index) => {
25
+ {FLUENCY_MODES.map(({ mode, label, symbol, select }, index) => {
34
26
  const isSelectedMode = mode === fluencyMode
35
- const progress = (matrix?.operations?.[mode]?.completionRate ?? 0) * 100
27
+ const progress = (matrix?.operations[mode].completionRate ?? 0) * 100
36
28
 
37
29
  return (
38
30
  <MathOperatorRow
@@ -53,7 +45,7 @@ export const SelectMathOperator = () => {
53
45
  model.matrix.setMode(mode)
54
46
  onModeSelectPress?.(mode)
55
47
  }}
56
- showDivider={index < visibleModes.length - 1}
48
+ showDivider={index < FLUENCY_MODES.length - 1}
57
49
  />
58
50
  )
59
51
  })}
@@ -5,8 +5,7 @@ import { FluencyDaysStreakModel } from './FluencyDaysStreakModel'
5
5
  import { FluencyMatrixModel } from './FluencyMatrixModel'
6
6
  import { FluencyApiModel } from './FluencyApiModel'
7
7
  import { FluencySolvingModel } from './FluencySolvingModel'
8
- import { FluencyStatus, MatrixConfig } from '../shared/fluency.constants'
9
- import { allFactsEmpty } from '../shared/fluency.helpers'
8
+ import { MatrixConfig } from '../shared/fluency.constants'
10
9
  import type {
11
10
  FluencyAttemptPayload,
12
11
  FluencyConfig,
@@ -17,7 +16,6 @@ import type {
17
16
  export class FluencyModel {
18
17
  public readonly gate = createGate<FluencyModelGateProps>()
19
18
  public readonly $config = createStore<FluencyConfig | null>(null)
20
- public readonly $status = createStore<FluencyStatus | null>(null)
21
19
 
22
20
  public readonly api: FluencyApiModel
23
21
  public readonly streak: FluencyDaysStreakModel
@@ -31,7 +29,6 @@ export class FluencyModel {
31
29
  this.solving = new FluencySolvingModel(this.matrix, this.$config)
32
30
 
33
31
  this.init()
34
- this.setupStatusTracking()
35
32
  }
36
33
 
37
34
  private init() {
@@ -66,25 +63,4 @@ export class FluencyModel {
66
63
  target: this.api.postAttemptFx,
67
64
  })
68
65
  }
69
-
70
- private setupStatusTracking() {
71
- sample({
72
- clock: this.gate.open,
73
- fn: () => null as FluencyStatus | null,
74
- target: this.$status,
75
- })
76
-
77
- sample({
78
- clock: [this.api.getMatrixFx.fail, this.api.getWeeklyStatsFx.fail],
79
- fn: () => FluencyStatus.ERROR,
80
- target: this.$status,
81
- })
82
-
83
- sample({
84
- clock: this.api.getMatrixFx.doneData,
85
- filter: allFactsEmpty,
86
- fn: () => FluencyStatus.EMPTY,
87
- target: this.$status,
88
- })
89
- }
90
66
  }
@@ -106,8 +106,3 @@ export const FLUENCY_MODE_PRESETS: Record<FluencyMode, FluencyModePreset> = Obje
106
106
  ) as Record<FluencyMode, FluencyModePreset>
107
107
 
108
108
  export const ONE_DAY_MS = 86_400_000
109
-
110
- export enum FluencyStatus {
111
- ERROR = 'ERROR',
112
- EMPTY = 'EMPTY',
113
- }
@@ -117,9 +117,6 @@ export const buildMatrixGrid = (data: GetMatrixResponse, mode: FluencyMode): Mat
117
117
  return [headerRow, ...dataRows]
118
118
  }
119
119
 
120
- export const allFactsEmpty = (response: GetMatrixResponse): boolean =>
121
- Object.values(response.operations).every((op) => Object.keys(op.facts).length === 0)
122
-
123
120
  export const generateStreakDates = (stats: GetWeeklyStatsResponse) => {
124
121
  const todayMs = new Date().setHours(0, 0, 0, 0)
125
122
  const startMs = new Date(stats.weekStart).setHours(0, 0, 0, 0)
@@ -43,10 +43,7 @@ export class PmProgressModel {
43
43
 
44
44
  sample({
45
45
  clock: this.tree.initTreeFx.done,
46
- fn: ({ params: { user }, result: [tree] }) => ({
47
- tree,
48
- lockedGrades: user.setting.practiceModeLockedGrades,
49
- }),
46
+ fn: ({ result: [tree] }) => tree,
50
47
  target: this.recommendations.initRecommendationsFx,
51
48
  })
52
49
  }
@@ -2,12 +2,6 @@ import { PmProgressApi } from './PmProgressApi'
2
2
  import { createEffect, createEvent, createStore, sample } from 'effector'
3
3
  import { Recommendations, RecsResponse, TreeMappingResponse } from '../shared/pmProgress.types'
4
4
  import { RECOMMENDATIONS_LIMIT_PARAM, SolvingFlow } from '../shared/pmProgress.constants'
5
- import { filterLockedGradeRecs } from '../shared/pmProgress.helpers'
6
-
7
- type FetchMagmaRecsParams = {
8
- tree: TreeMappingResponse
9
- lockedGrades: number[]
10
- }
11
5
 
12
6
  const EMPTY_RECS: Recommendations = { items: [], offset: 0, limit: 0, total: 0 }
13
7
 
@@ -28,24 +22,14 @@ export class PmRecommendationsModel {
28
22
  ),
29
23
  )
30
24
 
31
- public readonly fetchMagmaRecsFx = createEffect(
32
- async ({ tree, lockedGrades }: FetchMagmaRecsParams) => {
33
- const recs = await this.fetchRecs(tree, SolvingFlow.MAGMA, () =>
34
- this.api.getMagmaRecsFx({ limit: RECOMMENDATIONS_LIMIT_PARAM }),
35
- )
36
- return {
37
- ...recs,
38
- items: filterLockedGradeRecs(recs.items, tree.treeMapping, lockedGrades),
39
- }
40
- },
25
+ public readonly fetchMagmaRecsFx = createEffect((tree: TreeMappingResponse) =>
26
+ this.fetchRecs(tree, SolvingFlow.MAGMA, () =>
27
+ this.api.getMagmaRecsFx({ limit: RECOMMENDATIONS_LIMIT_PARAM }),
28
+ ),
41
29
  )
42
30
 
43
- public readonly initRecommendationsFx = createEffect(
44
- ({ tree, lockedGrades }: FetchMagmaRecsParams) =>
45
- Promise.all([
46
- this.fetchTeacherRecsFx(tree),
47
- this.fetchMagmaRecsFx({ tree, lockedGrades }),
48
- ]),
31
+ public readonly initRecommendationsFx = createEffect((tree: TreeMappingResponse) =>
32
+ Promise.all([this.fetchTeacherRecsFx(tree), this.fetchMagmaRecsFx(tree)]),
49
33
  )
50
34
 
51
35
  private fetchRecs = async (
@@ -298,39 +298,6 @@ export const formatGradeLabel = (grade: number, customLabelsMap?: GradeLabelsMap
298
298
  return `${getText('pmProgress.grade')} ${label.name}`
299
299
  }
300
300
 
301
- const buildSkillGradeMap = (
302
- treeMapping: TreeMappingResponse['treeMapping'],
303
- ): Map<string, number> => {
304
- const map = new Map<string, number>()
305
-
306
- const collectSkills = (nodeId: string, gradeValue: number) => {
307
- const node = treeMapping[nodeId]
308
- if (!node) return
309
- node.skills.forEach((skillId) => map.set(skillId, gradeValue))
310
- node.children.forEach((childId) => collectSkills(childId, gradeValue))
311
- }
312
-
313
- Object.values(treeMapping)
314
- .filter((node) => node.type === 'grade')
315
- .forEach((gradeNode) => collectSkills(gradeNode._id, gradeNode.attributes.grade))
316
-
317
- return map
318
- }
319
-
320
- export const filterLockedGradeRecs = (
321
- skills: Skill[],
322
- treeMapping: TreeMappingResponse['treeMapping'],
323
- lockedGrades: number[],
324
- ): Skill[] => {
325
- if (lockedGrades.length === 0) return skills
326
- const locked = new Set(lockedGrades)
327
- const skillGradeMap = buildSkillGradeMap(treeMapping)
328
- return skills.filter((skill) => {
329
- const grade = skillGradeMap.get(skill._id)
330
- return grade === undefined || !locked.has(grade)
331
- })
332
- }
333
-
334
301
  export const getTreeGrades = (tree: TreeMappingResponse, user: User): Grade[] => {
335
302
  const lockedGrades = new Set(user.setting.practiceModeLockedGrades)
336
303
 
@@ -0,0 +1,4 @@
1
+ export const GBD_TEXT_CACHE_SUFFIX = '::gbd'
2
+ export const DESCRIPTION_CACHE_KEY_SUFFIX = '::description'
3
+ export const CHOICES_CACHE_KEY_SUFFIX = '::choices'
4
+ export const PRACTICE_THEORY_CACHE_KEY_SUFFIX = '::practice-theory'
@@ -0,0 +1,63 @@
1
+ import { MaskSegmentParams } from './types'
2
+
3
+ export function replaceMappedTokens(input: string, map: Record<string, string>): string {
4
+ let result = input
5
+
6
+ for (const [original, override] of Object.entries(map)) {
7
+ const escaped = original.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
8
+ const regex = new RegExp(`\\b${escaped}\\b`, 'gi')
9
+
10
+ result = result.replace(regex, override)
11
+ }
12
+
13
+ return result
14
+ }
15
+
16
+ /**
17
+ * Masks text segments matched by `regex` with a placeholder,
18
+ * while preserving spaces around the original match.
19
+ */
20
+ export const maskSegment = ({
21
+ text,
22
+ regex,
23
+ placeholder,
24
+ replacements,
25
+ shouldSkip,
26
+ }: MaskSegmentParams): string => {
27
+ return text.replace(regex, (match, ...args) => {
28
+ if (shouldSkip?.(match)) return match
29
+
30
+ const offset = args[args.length - 2] as number
31
+ const input = args[args.length - 1] as string
32
+
33
+ const before = offset > 0 ? input[offset - 1] : ''
34
+ const afterIdx = offset + match.length
35
+ const after = afterIdx < input.length ? input[afterIdx] : ''
36
+
37
+ const leftPad = /\s/.test(before)
38
+ const rightPad = /\s/.test(after)
39
+
40
+ replacements.push({ placeholder, original: match, leftPad, rightPad })
41
+
42
+ return placeholder
43
+ })
44
+ }
45
+
46
+ const HTML_NAMED_ENTITIES: Record<string, string> = {
47
+ '&amp;': '&',
48
+ '&lt;': '<',
49
+ '&gt;': '>',
50
+ '&quot;': '"',
51
+ '&apos;': "'",
52
+ '&nbsp;': ' ',
53
+ }
54
+
55
+ export const decodeHtmlEntities = (text: string): string => {
56
+ return text
57
+ .replace(/&#(\d+);/g, (_, code: string) => String.fromCharCode(parseInt(code, 10)))
58
+ .replace(/&#x([0-9a-f]+);/gi, (_, code: string) => String.fromCharCode(parseInt(code, 16)))
59
+ .replace(
60
+ /&(amp|lt|gt|quot|apos|nbsp);/g,
61
+ (match) => HTML_NAMED_ENTITIES[match] ?? match,
62
+ )
63
+ }
@@ -0,0 +1,30 @@
1
+ export { TranslationModel } from './model/TranslationModel'
2
+ export { TranslationService, type TranslateConfigProps } from './model/TranslationService'
3
+ export { TranslationKatexPreprocessor } from './model/TranslationPreprocessor'
4
+ export { TranslationProvider, type LanguageGlossary } from './providers/translation.interface'
5
+ export { GoogleTranslationProvider } from './providers/google/GoogleTranslationProvider'
6
+ export { GoogleTranslateLanguage } from './providers/google/supportedLanguages'
7
+ export type {
8
+ GoogleTranslateProps,
9
+ GoogleTranslateResponse,
10
+ GoogleTranslation,
11
+ } from './providers/google.types'
12
+ export { wordsToPreserve, preservedWordsReplacers } from './preserve/wordsToPreserve'
13
+ export {
14
+ GBD_TEXT_CACHE_SUFFIX,
15
+ DESCRIPTION_CACHE_KEY_SUFFIX,
16
+ CHOICES_CACHE_KEY_SUFFIX,
17
+ PRACTICE_THEORY_CACHE_KEY_SUFFIX,
18
+ } from './constants'
19
+ export {
20
+ replaceMappedTokens,
21
+ maskSegment,
22
+ decodeHtmlEntities,
23
+ } from './helpers'
24
+ export type {
25
+ TranslatableProblem,
26
+ TranslateAllFxParams,
27
+ TranslateFxParams,
28
+ Replacement,
29
+ MaskSegmentParams,
30
+ } from './types'
@@ -0,0 +1,174 @@
1
+ import {
2
+ attach,
3
+ combine,
4
+ createEffect,
5
+ createEvent,
6
+ restore,
7
+ sample,
8
+ split,
9
+ Store,
10
+ Unit,
11
+ } from 'effector'
12
+ import { GoogleTranslationProvider } from '../providers/google/GoogleTranslationProvider'
13
+ import {
14
+ GoogleTranslateProps,
15
+ GoogleTranslateResponse,
16
+ } from '../providers/google.types'
17
+ import { TranslationService } from './TranslationService'
18
+ import {
19
+ preservedWordsReplacers,
20
+ wordsToPreserve,
21
+ } from '../preserve/wordsToPreserve'
22
+ import {
23
+ CHOICES_CACHE_KEY_SUFFIX,
24
+ DESCRIPTION_CACHE_KEY_SUFFIX,
25
+ GBD_TEXT_CACHE_SUFFIX,
26
+ } from '../constants'
27
+ import {
28
+ TranslatableProblem,
29
+ TranslateAllFxParams,
30
+ TranslateFxParams,
31
+ } from '../types'
32
+
33
+ type TranslationModelProps<TProblem extends TranslatableProblem> = {
34
+ $problem: Store<TProblem | null>
35
+ $problemId: Store<string>
36
+ $assignmentId: Store<string>
37
+ $currentProblemIndex: Store<number>
38
+ $translationLanguageCode: Store<string>
39
+ $contentLanguageCode?: Store<string>
40
+ $isTranslationLocked: Store<boolean>
41
+ languageChanged: Unit<unknown>
42
+ api: {
43
+ translateRequest: (payload: GoogleTranslateProps) => Promise<GoogleTranslateResponse>
44
+ }
45
+ getGreatWorkFeedbackText?: () => string
46
+ }
47
+
48
+ export class TranslationModel<TProblem extends TranslatableProblem = TranslatableProblem> {
49
+ private readonly service: TranslationService
50
+
51
+ public readonly toggle = createEvent()
52
+ public readonly setTranslated = createEvent<boolean>()
53
+ public readonly reset = createEvent()
54
+
55
+ public readonly $isTranslationActive = restore(this.setTranslated, false).reset(this.reset)
56
+ public readonly $isTranslated = this.$isTranslationActive
57
+ public readonly $isTranslationPending
58
+
59
+ public readonly translateFx
60
+ public readonly translateAllFx
61
+
62
+ constructor({
63
+ $problem,
64
+ $problemId,
65
+ $assignmentId,
66
+ $currentProblemIndex,
67
+ $translationLanguageCode,
68
+ $contentLanguageCode,
69
+ $isTranslationLocked,
70
+ languageChanged,
71
+ api,
72
+ getGreatWorkFeedbackText,
73
+ }: TranslationModelProps<TProblem>) {
74
+ this.service = new TranslationService({
75
+ preserve: {
76
+ map: wordsToPreserve,
77
+ replacers: preservedWordsReplacers,
78
+ },
79
+ providers: [new GoogleTranslationProvider({ api })],
80
+ onError: () => this.reset(),
81
+ })
82
+
83
+ this.service.bindCustomCacheKey(
84
+ $problemId,
85
+ (problemId, { target }) => `${problemId}::${target}`,
86
+ )
87
+ this.service.bindTargetLanguage($translationLanguageCode)
88
+ if ($contentLanguageCode) {
89
+ this.service.bindSourceLanguage($contentLanguageCode)
90
+ }
91
+
92
+ this.translateAllFx = attach({
93
+ source: {
94
+ problem: $problem,
95
+ translationLanguageCode: $translationLanguageCode,
96
+ },
97
+ mapParams: (_: void, source) => source,
98
+ effect: createEffect(({ problem, translationLanguageCode }: TranslateAllFxParams<TProblem>) => {
99
+ if (!problem) return
100
+
101
+ const promises: Promise<unknown>[] = [
102
+ this.service.translate(problem.richDescription || problem.description, {
103
+ cacheKeySuffix: DESCRIPTION_CACHE_KEY_SUFFIX,
104
+ }),
105
+ this.service.translate(problem.answerVariants, {
106
+ cacheKeySuffix: CHOICES_CACHE_KEY_SUFFIX,
107
+ }),
108
+ ]
109
+
110
+ if (getGreatWorkFeedbackText) {
111
+ promises.push(
112
+ this.service.translate(getGreatWorkFeedbackText(), {
113
+ cacheKey: `${translationLanguageCode}${GBD_TEXT_CACHE_SUFFIX}`,
114
+ }),
115
+ )
116
+ }
117
+
118
+ return Promise.all(promises)
119
+ }),
120
+ })
121
+
122
+ this.translateFx = createEffect(({ cacheKey, text }: TranslateFxParams) => {
123
+ return this.service.translate(text, { cacheKey })
124
+ })
125
+
126
+ this.$isTranslationActive.on(this.translateAllFx.doneData, () => true)
127
+ this.$isTranslationActive.on(this.translateAllFx.fail, () => false)
128
+
129
+ split({
130
+ source: sample({
131
+ clock: this.toggle,
132
+ source: this.$isTranslationActive,
133
+ }),
134
+ match: {
135
+ on: (isTranslated) => !isTranslated,
136
+ off: (isTranslated) => isTranslated,
137
+ },
138
+ cases: {
139
+ on: this.translateAllFx,
140
+ off: this.reset,
141
+ },
142
+ })
143
+
144
+ sample({
145
+ clock: languageChanged,
146
+ fn: () => false,
147
+ target: this.setTranslated,
148
+ })
149
+
150
+ sample({
151
+ clock: [$currentProblemIndex, $assignmentId, this.$isTranslationActive],
152
+ source: {
153
+ isTranslated: this.$isTranslationActive,
154
+ isLocked: $isTranslationLocked,
155
+ },
156
+ filter: ({ isTranslated, isLocked }) => isLocked || isTranslated,
157
+ target: this.translateAllFx,
158
+ })
159
+
160
+ this.$isTranslationPending = combine(
161
+ this.translateAllFx.pending,
162
+ this.translateFx.pending,
163
+ (isAllPending, isOnePending) => isAllPending || isOnePending,
164
+ )
165
+ }
166
+
167
+ public getTranslated<T extends string | string[]>(key: string): T | undefined {
168
+ return this.service.getCached<T>(key)
169
+ }
170
+
171
+ public clearCache() {
172
+ this.service.reset()
173
+ }
174
+ }