@magmamath/students-features 0.9.107-rc.2 → 0.9.107-rc.21

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 (242) hide show
  1. package/dist/commonjs/features/chatbot/components/Chat/Chat.js +29 -18
  2. package/dist/commonjs/features/chatbot/components/Chat/Chat.js.map +1 -1
  3. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js +7 -2
  4. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  5. package/dist/commonjs/features/chatbot/components/Chatbot.js +14 -3
  6. package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -1
  7. package/dist/commonjs/features/chatbot/model/ChatBotModel.js +11 -2
  8. package/dist/commonjs/features/chatbot/model/ChatBotModel.js.map +1 -1
  9. package/dist/commonjs/features/chatbot/model/ChatsCacheModel.js.map +1 -1
  10. package/dist/commonjs/features/chatbot/types/model.types.js.map +1 -1
  11. package/dist/commonjs/features/voiceRecord/components/VoiceRecord.js +25 -17
  12. package/dist/commonjs/features/voiceRecord/components/VoiceRecord.js.map +1 -1
  13. package/dist/commonjs/features/voiceRecord/components/VoiceRecordButton.js +22 -8
  14. package/dist/commonjs/features/voiceRecord/components/VoiceRecordButton.js.map +1 -1
  15. package/dist/commonjs/features/voiceRecord/components/{VoiceRecordDelete.js → VoiceRecordDeleteButton.js} +9 -6
  16. package/dist/commonjs/features/voiceRecord/components/VoiceRecordDeleteButton.js.map +1 -0
  17. package/dist/commonjs/features/voiceRecord/components/VoiceRecordTimer.js +7 -2
  18. package/dist/commonjs/features/voiceRecord/components/VoiceRecordTimer.js.map +1 -1
  19. package/dist/commonjs/features/voiceRecord/constants.js +8 -1
  20. package/dist/commonjs/features/voiceRecord/constants.js.map +1 -1
  21. package/dist/commonjs/features/voiceRecord/helpers.js +89 -3
  22. package/dist/commonjs/features/voiceRecord/helpers.js.map +1 -1
  23. package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorder.js +45 -33
  24. package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorder.js.map +1 -1
  25. package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorderAnimation.js +3 -3
  26. package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorderAnimation.js.map +1 -1
  27. package/dist/commonjs/features/voiceRecord/index.js +44 -0
  28. package/dist/commonjs/features/voiceRecord/index.js.map +1 -1
  29. package/dist/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.js +93 -0
  30. package/dist/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.js.map +1 -0
  31. package/dist/commonjs/features/voiceRecord/modal/VoiceRecordUndoModal.js +75 -0
  32. package/dist/commonjs/features/voiceRecord/modal/VoiceRecordUndoModal.js.map +1 -0
  33. package/dist/commonjs/features/voiceRecord/model/Recorder.model.js +54 -0
  34. package/dist/commonjs/features/voiceRecord/model/Recorder.model.js.map +1 -0
  35. package/dist/commonjs/features/voiceRecord/model/VoiceRecord.model.js +162 -21
  36. package/dist/commonjs/features/voiceRecord/model/VoiceRecord.model.js.map +1 -1
  37. package/dist/commonjs/features/voiceRecord/model/VoiceRecordApi.js +21 -1
  38. package/dist/commonjs/features/voiceRecord/model/VoiceRecordApi.js.map +1 -1
  39. package/dist/commonjs/features/voiceRecord/model/VoiceRecordCollection.js +30 -0
  40. package/dist/commonjs/features/voiceRecord/model/VoiceRecordCollection.js.map +1 -0
  41. package/dist/commonjs/features/voiceRecord/types.js +6 -0
  42. package/dist/commonjs/features/voiceRecord/types.js.map +1 -0
  43. package/dist/commonjs/lib/components/ConditionalWrapper.js +23 -0
  44. package/dist/commonjs/lib/components/ConditionalWrapper.js.map +1 -0
  45. package/dist/commonjs/shared/translation/localization/ca.json +13 -0
  46. package/dist/commonjs/shared/translation/localization/de.json +13 -0
  47. package/dist/commonjs/shared/translation/localization/en.json +13 -0
  48. package/dist/commonjs/shared/translation/localization/gb.json +13 -0
  49. package/dist/commonjs/shared/translation/localization/sct.json +13 -0
  50. package/dist/commonjs/shared/translation/localization/sw.json +13 -0
  51. package/dist/module/features/chatbot/components/Chat/Chat.js +29 -18
  52. package/dist/module/features/chatbot/components/Chat/Chat.js.map +1 -1
  53. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js +5 -2
  54. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  55. package/dist/module/features/chatbot/components/Chatbot.js +14 -3
  56. package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
  57. package/dist/module/features/chatbot/model/ChatBotModel.js +11 -2
  58. package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
  59. package/dist/module/features/chatbot/model/ChatsCacheModel.js.map +1 -1
  60. package/dist/module/features/chatbot/types/model.types.js.map +1 -1
  61. package/dist/module/features/voiceRecord/components/VoiceRecord.js +24 -16
  62. package/dist/module/features/voiceRecord/components/VoiceRecord.js.map +1 -1
  63. package/dist/module/features/voiceRecord/components/VoiceRecordButton.js +22 -8
  64. package/dist/module/features/voiceRecord/components/VoiceRecordButton.js.map +1 -1
  65. package/dist/module/features/voiceRecord/components/{VoiceRecordDelete.js → VoiceRecordDeleteButton.js} +8 -5
  66. package/dist/module/features/voiceRecord/components/VoiceRecordDeleteButton.js.map +1 -0
  67. package/dist/module/features/voiceRecord/components/VoiceRecordTimer.js +7 -2
  68. package/dist/module/features/voiceRecord/components/VoiceRecordTimer.js.map +1 -1
  69. package/dist/module/features/voiceRecord/constants.js +7 -0
  70. package/dist/module/features/voiceRecord/constants.js.map +1 -1
  71. package/dist/module/features/voiceRecord/helpers.js +84 -2
  72. package/dist/module/features/voiceRecord/helpers.js.map +1 -1
  73. package/dist/module/features/voiceRecord/hooks/useVoiceRecorder.js +47 -35
  74. package/dist/module/features/voiceRecord/hooks/useVoiceRecorder.js.map +1 -1
  75. package/dist/module/features/voiceRecord/hooks/useVoiceRecorderAnimation.js +3 -3
  76. package/dist/module/features/voiceRecord/hooks/useVoiceRecorderAnimation.js.map +1 -1
  77. package/dist/module/features/voiceRecord/index.js +4 -0
  78. package/dist/module/features/voiceRecord/index.js.map +1 -1
  79. package/dist/module/features/voiceRecord/modal/VoiceRecordDeleteModal.js +86 -0
  80. package/dist/module/features/voiceRecord/modal/VoiceRecordDeleteModal.js.map +1 -0
  81. package/dist/module/features/voiceRecord/modal/VoiceRecordUndoModal.js +69 -0
  82. package/dist/module/features/voiceRecord/modal/VoiceRecordUndoModal.js.map +1 -0
  83. package/dist/module/features/voiceRecord/model/Recorder.model.js +49 -0
  84. package/dist/module/features/voiceRecord/model/Recorder.model.js.map +1 -0
  85. package/dist/module/features/voiceRecord/model/VoiceRecord.model.js +163 -22
  86. package/dist/module/features/voiceRecord/model/VoiceRecord.model.js.map +1 -1
  87. package/dist/module/features/voiceRecord/model/VoiceRecordApi.js +21 -1
  88. package/dist/module/features/voiceRecord/model/VoiceRecordApi.js.map +1 -1
  89. package/dist/module/features/voiceRecord/model/VoiceRecordCollection.js +25 -0
  90. package/dist/module/features/voiceRecord/model/VoiceRecordCollection.js.map +1 -0
  91. package/dist/module/features/voiceRecord/types.js +4 -0
  92. package/dist/module/features/voiceRecord/types.js.map +1 -0
  93. package/dist/module/lib/components/ConditionalWrapper.js +17 -0
  94. package/dist/module/lib/components/ConditionalWrapper.js.map +1 -0
  95. package/dist/module/shared/translation/localization/ca.json +13 -0
  96. package/dist/module/shared/translation/localization/de.json +13 -0
  97. package/dist/module/shared/translation/localization/en.json +13 -0
  98. package/dist/module/shared/translation/localization/gb.json +13 -0
  99. package/dist/module/shared/translation/localization/sct.json +13 -0
  100. package/dist/module/shared/translation/localization/sw.json +13 -0
  101. package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts +4 -2
  102. package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
  103. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts +2 -1
  104. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  105. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +2 -1
  106. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -1
  107. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts +1 -0
  108. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  109. package/dist/typescript/commonjs/features/chatbot/model/ChatsCacheModel.d.ts.map +1 -1
  110. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +1 -0
  111. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -1
  112. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts +1 -0
  113. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts.map +1 -1
  114. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecord.d.ts.map +1 -1
  115. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordButton.d.ts +1 -5
  116. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordButton.d.ts.map +1 -1
  117. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordDeleteButton.d.ts +8 -0
  118. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordDeleteButton.d.ts.map +1 -0
  119. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordTimer.d.ts +4 -2
  120. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordTimer.d.ts.map +1 -1
  121. package/dist/typescript/commonjs/features/voiceRecord/constants.d.ts +6 -0
  122. package/dist/typescript/commonjs/features/voiceRecord/constants.d.ts.map +1 -1
  123. package/dist/typescript/commonjs/features/voiceRecord/helpers.d.ts +26 -2
  124. package/dist/typescript/commonjs/features/voiceRecord/helpers.d.ts.map +1 -1
  125. package/dist/typescript/commonjs/features/voiceRecord/hooks/useVoiceRecorder.d.ts +0 -4
  126. package/dist/typescript/commonjs/features/voiceRecord/hooks/useVoiceRecorder.d.ts.map +1 -1
  127. package/dist/typescript/commonjs/features/voiceRecord/hooks/useVoiceRecorderAnimation.d.ts +1 -2
  128. package/dist/typescript/commonjs/features/voiceRecord/hooks/useVoiceRecorderAnimation.d.ts.map +1 -1
  129. package/dist/typescript/commonjs/features/voiceRecord/index.d.ts +4 -0
  130. package/dist/typescript/commonjs/features/voiceRecord/index.d.ts.map +1 -1
  131. package/dist/typescript/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.d.ts +13 -0
  132. package/dist/typescript/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.d.ts.map +1 -0
  133. package/dist/typescript/commonjs/features/voiceRecord/modal/VoiceRecordUndoModal.d.ts +13 -0
  134. package/dist/typescript/commonjs/features/voiceRecord/modal/VoiceRecordUndoModal.d.ts.map +1 -0
  135. package/dist/typescript/commonjs/features/voiceRecord/model/Recorder.model.d.ts +20 -0
  136. package/dist/typescript/commonjs/features/voiceRecord/model/Recorder.model.d.ts.map +1 -0
  137. package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecord.model.d.ts +38 -20
  138. package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecord.model.d.ts.map +1 -1
  139. package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecordApi.d.ts +2 -0
  140. package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecordApi.d.ts.map +1 -1
  141. package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecordCollection.d.ts +10 -0
  142. package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecordCollection.d.ts.map +1 -0
  143. package/dist/typescript/commonjs/features/voiceRecord/types.d.ts +43 -0
  144. package/dist/typescript/commonjs/features/voiceRecord/types.d.ts.map +1 -0
  145. package/dist/typescript/commonjs/lib/components/ConditionalWrapper.d.ts +9 -0
  146. package/dist/typescript/commonjs/lib/components/ConditionalWrapper.d.ts.map +1 -0
  147. package/dist/typescript/commonjs/shared/translation/constants.d.ts +78 -0
  148. package/dist/typescript/commonjs/shared/translation/constants.d.ts.map +1 -1
  149. package/dist/typescript/commonjs/shared/translation/model.d.ts +26 -0
  150. package/dist/typescript/commonjs/shared/translation/model.d.ts.map +1 -1
  151. package/dist/typescript/commonjs/types/common.types.d.ts +3 -0
  152. package/dist/typescript/commonjs/types/common.types.d.ts.map +1 -1
  153. package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts +4 -2
  154. package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
  155. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts +2 -1
  156. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  157. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +2 -1
  158. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -1
  159. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts +1 -0
  160. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  161. package/dist/typescript/module/features/chatbot/model/ChatsCacheModel.d.ts.map +1 -1
  162. package/dist/typescript/module/features/chatbot/types/api.types.d.ts +1 -0
  163. package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -1
  164. package/dist/typescript/module/features/chatbot/types/model.types.d.ts +1 -0
  165. package/dist/typescript/module/features/chatbot/types/model.types.d.ts.map +1 -1
  166. package/dist/typescript/module/features/voiceRecord/components/VoiceRecord.d.ts.map +1 -1
  167. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordButton.d.ts +1 -5
  168. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordButton.d.ts.map +1 -1
  169. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordDeleteButton.d.ts +8 -0
  170. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordDeleteButton.d.ts.map +1 -0
  171. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordTimer.d.ts +4 -2
  172. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordTimer.d.ts.map +1 -1
  173. package/dist/typescript/module/features/voiceRecord/constants.d.ts +6 -0
  174. package/dist/typescript/module/features/voiceRecord/constants.d.ts.map +1 -1
  175. package/dist/typescript/module/features/voiceRecord/helpers.d.ts +26 -2
  176. package/dist/typescript/module/features/voiceRecord/helpers.d.ts.map +1 -1
  177. package/dist/typescript/module/features/voiceRecord/hooks/useVoiceRecorder.d.ts +0 -4
  178. package/dist/typescript/module/features/voiceRecord/hooks/useVoiceRecorder.d.ts.map +1 -1
  179. package/dist/typescript/module/features/voiceRecord/hooks/useVoiceRecorderAnimation.d.ts +1 -2
  180. package/dist/typescript/module/features/voiceRecord/hooks/useVoiceRecorderAnimation.d.ts.map +1 -1
  181. package/dist/typescript/module/features/voiceRecord/index.d.ts +4 -0
  182. package/dist/typescript/module/features/voiceRecord/index.d.ts.map +1 -1
  183. package/dist/typescript/module/features/voiceRecord/modal/VoiceRecordDeleteModal.d.ts +13 -0
  184. package/dist/typescript/module/features/voiceRecord/modal/VoiceRecordDeleteModal.d.ts.map +1 -0
  185. package/dist/typescript/module/features/voiceRecord/modal/VoiceRecordUndoModal.d.ts +13 -0
  186. package/dist/typescript/module/features/voiceRecord/modal/VoiceRecordUndoModal.d.ts.map +1 -0
  187. package/dist/typescript/module/features/voiceRecord/model/Recorder.model.d.ts +20 -0
  188. package/dist/typescript/module/features/voiceRecord/model/Recorder.model.d.ts.map +1 -0
  189. package/dist/typescript/module/features/voiceRecord/model/VoiceRecord.model.d.ts +38 -20
  190. package/dist/typescript/module/features/voiceRecord/model/VoiceRecord.model.d.ts.map +1 -1
  191. package/dist/typescript/module/features/voiceRecord/model/VoiceRecordApi.d.ts +2 -0
  192. package/dist/typescript/module/features/voiceRecord/model/VoiceRecordApi.d.ts.map +1 -1
  193. package/dist/typescript/module/features/voiceRecord/model/VoiceRecordCollection.d.ts +10 -0
  194. package/dist/typescript/module/features/voiceRecord/model/VoiceRecordCollection.d.ts.map +1 -0
  195. package/dist/typescript/module/features/voiceRecord/types.d.ts +43 -0
  196. package/dist/typescript/module/features/voiceRecord/types.d.ts.map +1 -0
  197. package/dist/typescript/module/lib/components/ConditionalWrapper.d.ts +9 -0
  198. package/dist/typescript/module/lib/components/ConditionalWrapper.d.ts.map +1 -0
  199. package/dist/typescript/module/shared/translation/constants.d.ts +78 -0
  200. package/dist/typescript/module/shared/translation/constants.d.ts.map +1 -1
  201. package/dist/typescript/module/shared/translation/model.d.ts +26 -0
  202. package/dist/typescript/module/shared/translation/model.d.ts.map +1 -1
  203. package/dist/typescript/module/types/common.types.d.ts +3 -0
  204. package/dist/typescript/module/types/common.types.d.ts.map +1 -1
  205. package/package.json +3 -1
  206. package/src/features/chatbot/components/Chat/Chat.tsx +30 -19
  207. package/src/features/chatbot/components/ChatControls/ChatControls.tsx +9 -2
  208. package/src/features/chatbot/components/Chatbot.tsx +15 -2
  209. package/src/features/chatbot/model/ChatBotModel.ts +12 -3
  210. package/src/features/chatbot/model/ChatsCacheModel.ts +4 -0
  211. package/src/features/chatbot/types/api.types.ts +1 -0
  212. package/src/features/chatbot/types/model.types.ts +1 -0
  213. package/src/features/voiceRecord/components/VoiceRecord.tsx +29 -18
  214. package/src/features/voiceRecord/components/VoiceRecordButton.tsx +33 -17
  215. package/src/features/voiceRecord/components/{VoiceRecordDelete.tsx → VoiceRecordDeleteButton.tsx} +5 -4
  216. package/src/features/voiceRecord/components/VoiceRecordTimer.tsx +19 -3
  217. package/src/features/voiceRecord/constants.ts +6 -0
  218. package/src/features/voiceRecord/helpers.ts +115 -1
  219. package/src/features/voiceRecord/hooks/useVoiceRecorder.ts +50 -36
  220. package/src/features/voiceRecord/hooks/useVoiceRecorderAnimation.ts +3 -4
  221. package/src/features/voiceRecord/index.ts +4 -0
  222. package/src/features/voiceRecord/modal/VoiceRecordDeleteModal.tsx +105 -0
  223. package/src/features/voiceRecord/modal/VoiceRecordUndoModal.tsx +82 -0
  224. package/src/features/voiceRecord/model/Recorder.model.ts +62 -0
  225. package/src/features/voiceRecord/model/VoiceRecord.model.ts +193 -32
  226. package/src/features/voiceRecord/model/VoiceRecordApi.ts +25 -1
  227. package/src/features/voiceRecord/model/VoiceRecordCollection.ts +26 -0
  228. package/src/features/voiceRecord/types.ts +49 -0
  229. package/src/lib/components/ConditionalWrapper.tsx +15 -0
  230. package/src/shared/translation/localization/ca.json +13 -0
  231. package/src/shared/translation/localization/de.json +13 -0
  232. package/src/shared/translation/localization/en.json +13 -0
  233. package/src/shared/translation/localization/gb.json +13 -0
  234. package/src/shared/translation/localization/sct.json +13 -0
  235. package/src/shared/translation/localization/sw.json +13 -0
  236. package/src/types/common.types.ts +1 -0
  237. package/dist/commonjs/features/voiceRecord/components/VoiceRecordDelete.js.map +0 -1
  238. package/dist/module/features/voiceRecord/components/VoiceRecordDelete.js.map +0 -1
  239. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordDelete.d.ts +0 -7
  240. package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecordDelete.d.ts.map +0 -1
  241. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordDelete.d.ts +0 -7
  242. package/dist/typescript/module/features/voiceRecord/components/VoiceRecordDelete.d.ts.map +0 -1
@@ -1,50 +1,62 @@
1
1
  "use strict";
2
2
 
3
- import { RecordingPresets, setAudioModeAsync, useAudioPlayer, useAudioRecorder, useAudioRecorderState } from 'expo-audio';
4
- import { addInputsListenerWeb, ensureRecordingPermissions, getAvailableInputs } from "../helpers.js";
3
+ import { RecordingPresets, useAudioPlayer, useAudioRecorder, useAudioRecorderState } from 'expo-audio';
4
+ import { addAudioInputsListenerWeb, getAudioDurationMs, getAvailableInputs } from "../helpers.js";
5
5
  import { useEffect } from 'react';
6
+ import { IS_WEB } from '@magmamath/react-native-ui';
7
+ import { VOICE_RECORDER_MAX_DURATION_MS, VoiceRecorderState } from "../constants.js";
8
+ import { useUnit } from 'effector-react';
6
9
  export const useVoiceRecorder = model => {
7
- const recorder = useAudioRecorder(RecordingPresets.LOW_QUALITY, status => console.log('Recording status:', status));
8
- const recorderState = useAudioRecorderState(recorder);
9
10
  const player = useAudioPlayer();
10
- const startRecording = async () => {
11
- if (!(await ensureRecordingPermissions())) return model.showToast.error('No microphone access');
12
- await recorder.prepareToRecordAsync();
13
- if (await getAvailableInputs(recorder).then(inputs => inputs.length === 0)) {
14
- return model.showToast.error('No microphone found');
11
+ const currentRecord = useUnit(model.$currentRecord);
12
+ const recorder = useAudioRecorder(RecordingPresets.LOW_QUALITY, model.recordingStatusUpdate);
13
+ const recorderState = useAudioRecorderState(recorder);
14
+ useEffect(() => {
15
+ if (recorderState.durationMillis >= VOICE_RECORDER_MAX_DURATION_MS && recorderState.isRecording) {
16
+ model.recorderModel.stop();
17
+ }
18
+ }, [recorderState.durationMillis]);
19
+ useEffect(() => {
20
+ if (!IS_WEB) {
21
+ //only once for iPad and listener for WEB
22
+ getAvailableInputs(recorder).then(inputs => {
23
+ model.recorderModel.setAvailableInputs(inputs);
24
+ });
25
+ return;
15
26
  }
16
- const availabelInputs = await getAvailableInputs(recorder);
17
- console.log('availabelInputs: ', availabelInputs);
18
- await setAudioModeAsync({
19
- playsInSilentMode: true,
20
- allowsRecording: true
27
+ const removeListener = addAudioInputsListenerWeb(devices => {
28
+ model.recorderModel.setAvailableInputs(devices);
21
29
  });
22
- recorder.record();
23
- };
24
- const stopRecording = async () => {
25
- await recorder.stop();
26
- recorder.uri && console.log('Recording stopped and stored at', recorder.uri);
27
- player.replace(recorder.uri);
28
- player.play();
29
- };
30
+ return removeListener;
31
+ }, []);
32
+ useEffect(() => {
33
+ if (currentRecord?.uri) {
34
+ const getDuration = async () => {
35
+ const durationMs = await getAudioDurationMs(currentRecord.uri, player);
36
+ model.recorderModel.setAudioFileDurationMs(durationMs || 0);
37
+ };
38
+ getDuration();
39
+ }
40
+ }, [currentRecord?.uri]);
30
41
  useEffect(() => {
31
- model.setIsRecording(recorderState.isRecording);
42
+ if (recorderState.isRecording) {
43
+ model.recorderModel.setVoiceRecordState(VoiceRecorderState.RECORDING);
44
+ return;
45
+ }
46
+ if (recorderState.durationMillis > 0) {
47
+ model.recorderModel.setVoiceRecordState(VoiceRecorderState.PAUSED);
48
+ return;
49
+ }
50
+ model.recorderModel.setVoiceRecordState(VoiceRecorderState.IDLE);
32
51
  return () => {
33
- model.resetIsRecording();
52
+ model.recorderModel.reset();
34
53
  };
35
- }, [recorderState.isRecording]);
54
+ }, [recorderState]);
36
55
  useEffect(() => {
37
- const removeListener = addInputsListenerWeb(devices => {
38
- model.setAvailableInputs(devices);
39
- });
40
- return removeListener;
41
- }, []);
56
+ model.recorderModel.recorder = recorder;
57
+ }, [recorder]);
42
58
  return {
43
- recorder,
44
- recorderState,
45
- player,
46
- startRecording,
47
- stopRecording
59
+ recorderState
48
60
  };
49
61
  };
50
62
  //# sourceMappingURL=useVoiceRecorder.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["RecordingPresets","setAudioModeAsync","useAudioPlayer","useAudioRecorder","useAudioRecorderState","addInputsListenerWeb","ensureRecordingPermissions","getAvailableInputs","useEffect","useVoiceRecorder","model","recorder","LOW_QUALITY","status","console","log","recorderState","player","startRecording","showToast","error","prepareToRecordAsync","then","inputs","length","availabelInputs","playsInSilentMode","allowsRecording","record","stopRecording","stop","uri","replace","play","setIsRecording","isRecording","resetIsRecording","removeListener","devices","setAvailableInputs"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;AAAA,SACEA,gBAAgB,EAChBC,iBAAiB,EACjBC,cAAc,EACdC,gBAAgB,EAChBC,qBAAqB,QAChB,YAAY;AACnB,SAASC,oBAAoB,EAAEC,0BAA0B,EAAEC,kBAAkB,QAAQ,eAAY;AAEjG,SAASC,SAAS,QAAQ,OAAO;AAEjC,OAAO,MAAMC,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,QAAQ,GAAGR,gBAAgB,CAACH,gBAAgB,CAACY,WAAW,EAAGC,MAAM,IACrEC,OAAO,CAACC,GAAG,CAAC,mBAAmB,EAAEF,MAAM,CACzC,CAAC;EACD,MAAMG,aAAa,GAAGZ,qBAAqB,CAACO,QAAQ,CAAC;EAErD,MAAMM,MAAM,GAAGf,cAAc,CAAC,CAAC;EAE/B,MAAMgB,cAAc,GAAG,MAAAA,CAAA,KAAY;IACjC,IAAI,EAAE,MAAMZ,0BAA0B,CAAC,CAAC,CAAC,EAAE,OAAOI,KAAK,CAACS,SAAS,CAACC,KAAK,CAAC,sBAAsB,CAAC;IAE/F,MAAMT,QAAQ,CAACU,oBAAoB,CAAC,CAAC;IAErC,IAAI,MAAMd,kBAAkB,CAACI,QAAQ,CAAC,CAACW,IAAI,CAAEC,MAAM,IAAKA,MAAM,CAACC,MAAM,KAAK,CAAC,CAAC,EAAE;MAC5E,OAAOd,KAAK,CAACS,SAAS,CAACC,KAAK,CAAC,qBAAqB,CAAC;IACrD;IACA,MAAMK,eAAe,GAAG,MAAMlB,kBAAkB,CAACI,QAAQ,CAAC;IAC1DG,OAAO,CAACC,GAAG,CAAC,mBAAmB,EAAEU,eAAe,CAAC;IACjD,MAAMxB,iBAAiB,CAAC;MACtByB,iBAAiB,EAAE,IAAI;MACvBC,eAAe,EAAE;IACnB,CAAC,CAAC;IAEFhB,QAAQ,CAACiB,MAAM,CAAC,CAAC;EACnB,CAAC;EAED,MAAMC,aAAa,GAAG,MAAAA,CAAA,KAAY;IAChC,MAAMlB,QAAQ,CAACmB,IAAI,CAAC,CAAC;IACrBnB,QAAQ,CAACoB,GAAG,IAAIjB,OAAO,CAACC,GAAG,CAAC,iCAAiC,EAAEJ,QAAQ,CAACoB,GAAG,CAAC;IAE5Ed,MAAM,CAACe,OAAO,CAACrB,QAAQ,CAACoB,GAAG,CAAC;IAC5Bd,MAAM,CAACgB,IAAI,CAAC,CAAC;EACf,CAAC;EAEDzB,SAAS,CAAC,MAAM;IACdE,KAAK,CAACwB,cAAc,CAAClB,aAAa,CAACmB,WAAW,CAAC;IAE/C,OAAO,MAAM;MACXzB,KAAK,CAAC0B,gBAAgB,CAAC,CAAC;IAC1B,CAAC;EACH,CAAC,EAAE,CAACpB,aAAa,CAACmB,WAAW,CAAC,CAAC;EAE/B3B,SAAS,CAAC,MAAM;IACd,MAAM6B,cAAc,GAAGhC,oBAAoB,CAAEiC,OAAO,IAAK;MACvD5B,KAAK,CAAC6B,kBAAkB,CAACD,OAAO,CAAC;IACnC,CAAC,CAAC;IAEF,OAAOD,cAAc;EACvB,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAE1B,QAAQ;IAAEK,aAAa;IAAEC,MAAM;IAAEC,cAAc;IAAEW;EAAc,CAAC;AAC3E,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["RecordingPresets","useAudioPlayer","useAudioRecorder","useAudioRecorderState","addAudioInputsListenerWeb","getAudioDurationMs","getAvailableInputs","useEffect","IS_WEB","VOICE_RECORDER_MAX_DURATION_MS","VoiceRecorderState","useUnit","useVoiceRecorder","model","player","currentRecord","$currentRecord","recorder","LOW_QUALITY","recordingStatusUpdate","recorderState","durationMillis","isRecording","recorderModel","stop","then","inputs","setAvailableInputs","removeListener","devices","uri","getDuration","durationMs","setAudioFileDurationMs","setVoiceRecordState","RECORDING","PAUSED","IDLE","reset"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;AAAA,SACEA,gBAAgB,EAChBC,cAAc,EACdC,gBAAgB,EAChBC,qBAAqB,QAChB,YAAY;AACnB,SAASC,yBAAyB,EAAEC,kBAAkB,EAAEC,kBAAkB,QAAQ,eAAY;AAE9F,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,8BAA8B,EAAEC,kBAAkB,QAAQ,iBAAc;AACjF,SAASC,OAAO,QAAQ,gBAAgB;AAExC,OAAO,MAAMC,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,MAAM,GAAGb,cAAc,CAAC,CAAC;EAC/B,MAAMc,aAAa,GAAGJ,OAAO,CAACE,KAAK,CAACG,cAAc,CAAC;EAEnD,MAAMC,QAAQ,GAAGf,gBAAgB,CAACF,gBAAgB,CAACkB,WAAW,EAAEL,KAAK,CAACM,qBAAqB,CAAC;EAC5F,MAAMC,aAAa,GAAGjB,qBAAqB,CAACc,QAAQ,CAAC;EAErDV,SAAS,CAAC,MAAM;IACd,IACEa,aAAa,CAACC,cAAc,IAAIZ,8BAA8B,IAC9DW,aAAa,CAACE,WAAW,EACzB;MACAT,KAAK,CAACU,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;EACF,CAAC,EAAE,CAACJ,aAAa,CAACC,cAAc,CAAC,CAAC;EAElCd,SAAS,CAAC,MAAM;IACd,IAAI,CAACC,MAAM,EAAE;MACX;MACAF,kBAAkB,CAACW,QAAQ,CAAC,CAACQ,IAAI,CAAEC,MAAM,IAAK;QAC5Cb,KAAK,CAACU,aAAa,CAACI,kBAAkB,CAACD,MAAM,CAAC;MAChD,CAAC,CAAC;MACF;IACF;IAEA,MAAME,cAAc,GAAGxB,yBAAyB,CAAEyB,OAAO,IAAK;MAC5DhB,KAAK,CAACU,aAAa,CAACI,kBAAkB,CAACE,OAAO,CAAC;IACjD,CAAC,CAAC;IAEF,OAAOD,cAAc;EACvB,CAAC,EAAE,EAAE,CAAC;EAENrB,SAAS,CAAC,MAAM;IACd,IAAIQ,aAAa,EAAEe,GAAG,EAAE;MACtB,MAAMC,WAAW,GAAG,MAAAA,CAAA,KAAY;QAC9B,MAAMC,UAAU,GAAG,MAAM3B,kBAAkB,CAACU,aAAa,CAACe,GAAG,EAAGhB,MAAM,CAAC;QACvED,KAAK,CAACU,aAAa,CAACU,sBAAsB,CAACD,UAAU,IAAI,CAAC,CAAC;MAC7D,CAAC;MACDD,WAAW,CAAC,CAAC;IACf;EACF,CAAC,EAAE,CAAChB,aAAa,EAAEe,GAAG,CAAC,CAAC;EAExBvB,SAAS,CAAC,MAAM;IACd,IAAIa,aAAa,CAACE,WAAW,EAAE;MAC7BT,KAAK,CAACU,aAAa,CAACW,mBAAmB,CAACxB,kBAAkB,CAACyB,SAAS,CAAC;MACrE;IACF;IACA,IAAIf,aAAa,CAACC,cAAc,GAAG,CAAC,EAAE;MACpCR,KAAK,CAACU,aAAa,CAACW,mBAAmB,CAACxB,kBAAkB,CAAC0B,MAAM,CAAC;MAClE;IACF;IACAvB,KAAK,CAACU,aAAa,CAACW,mBAAmB,CAACxB,kBAAkB,CAAC2B,IAAI,CAAC;IAEhE,OAAO,MAAM;MACXxB,KAAK,CAACU,aAAa,CAACe,KAAK,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAAClB,aAAa,CAAC,CAAC;EAEnBb,SAAS,CAAC,MAAM;IACdM,KAAK,CAACU,aAAa,CAACN,QAAQ,GAAGA,QAAQ;EACzC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAO;IAAEG;EAAc,CAAC;AAC1B,CAAC","ignoreList":[]}
@@ -2,14 +2,14 @@
2
2
 
3
3
  import { useAnimatedStyle, withTiming } from 'react-native-reanimated';
4
4
  import { VOICE_RECORDER_CONTAINER_SIZES } from "../constants.js";
5
- export const useVoiceRecorderAnimation = recorderState => {
5
+ export const useVoiceRecorderAnimation = isExpanded => {
6
6
  const containerAnimatedStyle = useAnimatedStyle(() => {
7
7
  return {
8
- height: withTiming(recorderState.isRecording ? VOICE_RECORDER_CONTAINER_SIZES.EXPANDED : VOICE_RECORDER_CONTAINER_SIZES.COLLAPSED, {
8
+ height: withTiming(isExpanded ? VOICE_RECORDER_CONTAINER_SIZES.EXPANDED : VOICE_RECORDER_CONTAINER_SIZES.COLLAPSED, {
9
9
  duration: 280
10
10
  })
11
11
  };
12
- }, [recorderState]);
12
+ }, [isExpanded]);
13
13
  return {
14
14
  containerAnimatedStyle
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"names":["useAnimatedStyle","withTiming","VOICE_RECORDER_CONTAINER_SIZES","useVoiceRecorderAnimation","recorderState","containerAnimatedStyle","height","isRecording","EXPANDED","COLLAPSED","duration"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorderAnimation.ts"],"mappings":";;AAAA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,yBAAyB;AACtE,SAASC,8BAA8B,QAAQ,iBAAc;AAG7D,OAAO,MAAMC,yBAAyB,GAAIC,aAA4B,IAAK;EACzE,MAAMC,sBAAsB,GAAGL,gBAAgB,CAAC,MAAM;IACpD,OAAO;MACLM,MAAM,EAAEL,UAAU,CAChBG,aAAa,CAACG,WAAW,GACrBL,8BAA8B,CAACM,QAAQ,GACvCN,8BAA8B,CAACO,SAAS,EAC5C;QACEC,QAAQ,EAAE;MACZ,CACF;IACF,CAAC;EACH,CAAC,EAAE,CAACN,aAAa,CAAC,CAAC;EAEnB,OAAO;IAAEC;EAAuB,CAAC;AACnC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useAnimatedStyle","withTiming","VOICE_RECORDER_CONTAINER_SIZES","useVoiceRecorderAnimation","isExpanded","containerAnimatedStyle","height","EXPANDED","COLLAPSED","duration"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorderAnimation.ts"],"mappings":";;AAAA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,yBAAyB;AACtE,SAASC,8BAA8B,QAAQ,iBAAc;AAE7D,OAAO,MAAMC,yBAAyB,GAAIC,UAAmB,IAAK;EAChE,MAAMC,sBAAsB,GAAGL,gBAAgB,CAAC,MAAM;IACpD,OAAO;MACLM,MAAM,EAAEL,UAAU,CAChBG,UAAU,GACNF,8BAA8B,CAACK,QAAQ,GACvCL,8BAA8B,CAACM,SAAS,EAC5C;QACEC,QAAQ,EAAE;MACZ,CACF;IACF,CAAC;EACH,CAAC,EAAE,CAACL,UAAU,CAAC,CAAC;EAEhB,OAAO;IAAEC;EAAuB,CAAC;AACnC,CAAC","ignoreList":[]}
@@ -2,4 +2,8 @@
2
2
 
3
3
  export * from "./components/VoiceRecord.js";
4
4
  export * from "./model/VoiceRecord.model.js";
5
+ export * from "./modal/VoiceRecordDeleteModal.js";
6
+ export * from "./modal/VoiceRecordUndoModal.js";
7
+ export * from "./constants.js";
8
+ export * from "./types.js";
5
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["features/voiceRecord/index.ts"],"mappings":";;AAAA,cAAc,6BAA0B;AACxC,cAAc,8BAA2B","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["features/voiceRecord/index.ts"],"mappings":";;AAAA,cAAc,6BAA0B;AACxC,cAAc,8BAA2B;AACzC,cAAc,mCAAgC;AAC9C,cAAc,iCAA8B;AAC5C,cAAc,gBAAa;AAC3B,cAAc,YAAS","ignoreList":[]}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ import React, { useEffect } from 'react';
4
+ import { BaseModal, Button, ButtonColor, ButtonSize, ButtonVariant, SPACING } from '@magmamath/react-native-ui';
5
+ import { View, StyleSheet } from 'react-native';
6
+ import { useUnit } from 'effector-react';
7
+ import { VoiceRecorderState } from "../constants.js";
8
+ import { useText } from "../../../shared/translation/index.js";
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ const FooterButtons = ({
11
+ onClose,
12
+ onDelete
13
+ }) => {
14
+ const t = useText();
15
+ return /*#__PURE__*/_jsxs(View, {
16
+ style: styles.footerContainer,
17
+ children: [/*#__PURE__*/_jsx(Button, {
18
+ variant: ButtonVariant.TERTIARY,
19
+ size: ButtonSize.LARGE,
20
+ onPress: onClose,
21
+ children: t('voiceRecorder.cancel')
22
+ }), /*#__PURE__*/_jsx(Button, {
23
+ colorScheme: ButtonColor.RED,
24
+ variant: ButtonVariant.PRIMARY,
25
+ size: ButtonSize.LARGE,
26
+ onPress: onDelete,
27
+ children: t('voiceRecorder.delete')
28
+ })]
29
+ });
30
+ };
31
+ export const VoiceRecordDeleteModal = ({
32
+ modal: {
33
+ closeModal,
34
+ params
35
+ }
36
+ }) => {
37
+ const t = useText();
38
+ const {
39
+ model
40
+ } = params;
41
+ const recorderState = useUnit(model.recorderModel.$voiceRecordState);
42
+ const handleDelete = async () => {
43
+ if (recorderState === VoiceRecorderState.RECORDING) {
44
+ await model.stopAndDiscard();
45
+ }
46
+ await model.deleteCurrentRecording();
47
+ closeModal();
48
+ };
49
+ useEffect(() => {
50
+ if (recorderState === VoiceRecorderState.RECORDING) {
51
+ model.recorderModel.recorder.pause();
52
+ }
53
+ return () => {
54
+ if (model.recorderModel.$voiceRecordState.getState() === VoiceRecorderState.PAUSED) {
55
+ try {
56
+ model.recorderModel.recorder.record();
57
+ } catch (error) {
58
+ console.error(`Failed to resume recording: ${error}`);
59
+ }
60
+ }
61
+ };
62
+ }, []);
63
+ return /*#__PURE__*/_jsx(BaseModal, {
64
+ style: {
65
+ container: styles.modalContainer
66
+ },
67
+ header: t('voiceRecorder.deleteRecording'),
68
+ content: t('voiceRecorder.youWontBeAbleToRecover'),
69
+ footer: /*#__PURE__*/_jsx(FooterButtons, {
70
+ onClose: closeModal,
71
+ onDelete: handleDelete
72
+ })
73
+ });
74
+ };
75
+ const styles = StyleSheet.create({
76
+ modalContainer: {
77
+ width: 600,
78
+ height: 268
79
+ },
80
+ footerContainer: {
81
+ flexDirection: 'row',
82
+ alignItems: 'center',
83
+ gap: SPACING[200]
84
+ }
85
+ });
86
+ //# sourceMappingURL=VoiceRecordDeleteModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useEffect","BaseModal","Button","ButtonColor","ButtonSize","ButtonVariant","SPACING","View","StyleSheet","useUnit","VoiceRecorderState","useText","jsx","_jsx","jsxs","_jsxs","FooterButtons","onClose","onDelete","t","style","styles","footerContainer","children","variant","TERTIARY","size","LARGE","onPress","colorScheme","RED","PRIMARY","VoiceRecordDeleteModal","modal","closeModal","params","model","recorderState","recorderModel","$voiceRecordState","handleDelete","RECORDING","stopAndDiscard","deleteCurrentRecording","recorder","pause","getState","PAUSED","record","error","console","container","modalContainer","header","content","footer","create","width","height","flexDirection","alignItems","gap"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ import React from 'react';
4
+ import { BaseModal, Button, ButtonColor, ButtonSize, ButtonVariant, SPACING } from '@magmamath/react-native-ui';
5
+ import { StyleSheet, View } from 'react-native';
6
+ import { useText } from "../../../shared/translation/index.js";
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ const FooterButtons = ({
9
+ onClose,
10
+ onRedo
11
+ }) => {
12
+ const t = useText();
13
+ return /*#__PURE__*/_jsxs(View, {
14
+ style: styles.footerContainer,
15
+ children: [/*#__PURE__*/_jsx(Button, {
16
+ variant: ButtonVariant.TERTIARY,
17
+ size: ButtonSize.LARGE,
18
+ onPress: onClose,
19
+ children: t('voiceRecorder.cancel')
20
+ }), /*#__PURE__*/_jsx(Button, {
21
+ colorScheme: ButtonColor.BLUE,
22
+ variant: ButtonVariant.PRIMARY,
23
+ size: ButtonSize.LARGE,
24
+ onPress: onRedo,
25
+ children: t('voiceRecorder.redo')
26
+ })]
27
+ });
28
+ };
29
+ export const VoiceRecordUndoModal = ({
30
+ modal: {
31
+ closeModal,
32
+ params
33
+ }
34
+ }) => {
35
+ const t = useText();
36
+ const {
37
+ model
38
+ } = params;
39
+ const handleRedo = () => {
40
+ model.deleteCurrentRecording({
41
+ notification: false
42
+ });
43
+ closeModal();
44
+ model.initializeRecording();
45
+ };
46
+ return /*#__PURE__*/_jsx(BaseModal, {
47
+ style: {
48
+ container: styles.modalStyle
49
+ },
50
+ header: t('voiceRecorder.redoRecording'),
51
+ content: t('voiceRecorder.thisWillRemoveRecording'),
52
+ footer: /*#__PURE__*/_jsx(FooterButtons, {
53
+ onClose: closeModal,
54
+ onRedo: handleRedo
55
+ })
56
+ });
57
+ };
58
+ const styles = StyleSheet.create({
59
+ modalStyle: {
60
+ width: 600,
61
+ height: 268
62
+ },
63
+ footerContainer: {
64
+ flexDirection: 'row',
65
+ alignItems: 'center',
66
+ gap: SPACING[200]
67
+ }
68
+ });
69
+ //# sourceMappingURL=VoiceRecordUndoModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","BaseModal","Button","ButtonColor","ButtonSize","ButtonVariant","SPACING","StyleSheet","View","useText","jsx","_jsx","jsxs","_jsxs","FooterButtons","onClose","onRedo","t","style","styles","footerContainer","children","variant","TERTIARY","size","LARGE","onPress","colorScheme","BLUE","PRIMARY","VoiceRecordUndoModal","modal","closeModal","params","model","handleRedo","deleteCurrentRecording","notification","initializeRecording","container","modalStyle","header","content","footer","create","width","height","flexDirection","alignItems","gap"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/modal/VoiceRecordUndoModal.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,SAAS,EACTC,MAAM,EACNC,WAAW,EACXC,UAAU,EACVC,aAAa,EACbC,OAAO,QACF,4BAA4B;AACnC,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,SAASC,OAAO,QAAQ,sCAA6B;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAiBrD,MAAMC,aAAa,GAAGA,CAAC;EAAEC,OAAO;EAAEC;AAA2B,CAAC,KAAK;EACjE,MAAMC,CAAC,GAAGR,OAAO,CAAC,CAAC;EAEnB,oBACEI,KAAA,CAACL,IAAI;IAACU,KAAK,EAAEC,MAAM,CAACC,eAAgB;IAAAC,QAAA,gBAClCV,IAAA,CAACT,MAAM;MAACoB,OAAO,EAAEjB,aAAa,CAACkB,QAAS;MAACC,IAAI,EAAEpB,UAAU,CAACqB,KAAM;MAACC,OAAO,EAAEX,OAAQ;MAAAM,QAAA,EAC/EJ,CAAC,CAAC,sBAAsB;IAAC,CACpB,CAAC,eACTN,IAAA,CAACT,MAAM;MACLyB,WAAW,EAAExB,WAAW,CAACyB,IAAK;MAC9BN,OAAO,EAAEjB,aAAa,CAACwB,OAAQ;MAC/BL,IAAI,EAAEpB,UAAU,CAACqB,KAAM;MACvBC,OAAO,EAAEV,MAAO;MAAAK,QAAA,EAEfJ,CAAC,CAAC,oBAAoB;IAAC,CAClB,CAAC;EAAA,CACL,CAAC;AAEX,CAAC;AAED,OAAO,MAAMa,oBAAoB,GAAGA,CAAC;EACnCC,KAAK,EAAE;IAAEC,UAAU;IAAEC;EAAO;AACH,CAAC,KAAK;EAC/B,MAAMhB,CAAC,GAAGR,OAAO,CAAC,CAAC;EACnB,MAAM;IAAEyB;EAAM,CAAC,GAAGD,MAAM;EAExB,MAAME,UAAU,GAAGA,CAAA,KAAM;IACvBD,KAAK,CAACE,sBAAsB,CAAC;MAAEC,YAAY,EAAE;IAAM,CAAC,CAAC;IACrDL,UAAU,CAAC,CAAC;IACZE,KAAK,CAACI,mBAAmB,CAAC,CAAC;EAC7B,CAAC;EAED,oBACE3B,IAAA,CAACV,SAAS;IACRiB,KAAK,EAAE;MACLqB,SAAS,EAAEpB,MAAM,CAACqB;IACpB,CAAE;IACFC,MAAM,EAAExB,CAAC,CAAC,6BAA6B,CAAE;IACzCyB,OAAO,EAAEzB,CAAC,CAAC,uCAAuC,CAAE;IACpD0B,MAAM,eAAEhC,IAAA,CAACG,aAAa;MAACC,OAAO,EAAEiB,UAAW;MAAChB,MAAM,EAAEmB;IAAW,CAAE;EAAE,CACpE,CAAC;AAEN,CAAC;AAED,MAAMhB,MAAM,GAAGZ,UAAU,CAACqC,MAAM,CAAC;EAC/BJ,UAAU,EAAE;IACVK,KAAK,EAAE,GAAG;IACVC,MAAM,EAAE;EACV,CAAC;EACD1B,eAAe,EAAE;IACf2B,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,GAAG,EAAE3C,OAAO,CAAC,GAAG;EAClB;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ import { createEffect, createEvent, restore } from 'effector';
4
+ import { setAudioModeAsync } from 'expo-audio';
5
+ import { VoiceRecorderState } from "../constants.js";
6
+ const AUDIO_MODE_CONFIG = {
7
+ playsInSilentMode: true,
8
+ allowsRecording: true
9
+ };
10
+ export class RecorderModel {
11
+ stopResolver = null;
12
+ reset = createEvent();
13
+ setAudioFileDurationMs = createEvent();
14
+ setVoiceRecordState = createEvent();
15
+ setAvailableInputs = createEvent();
16
+ $audioFileDurationMs = restore(this.setAudioFileDurationMs, 0).reset(this.reset);
17
+ $voiceRecordState = restore(this.setVoiceRecordState, VoiceRecorderState.IDLE).reset(this.reset);
18
+ $availableInputs = restore(this.setAvailableInputs, []);
19
+ start = createEffect(async () => {
20
+ try {
21
+ await setAudioModeAsync(AUDIO_MODE_CONFIG);
22
+ await this.recorder.prepareToRecordAsync();
23
+ this.recorder.record();
24
+ } catch (error) {
25
+ console.error('Error starting recording:', error);
26
+ throw error;
27
+ }
28
+ });
29
+ stop = createEffect(() => {
30
+ if (!this.recorder.isRecording) return Promise.resolve();
31
+ return this.recorder.stop();
32
+ });
33
+ stopAndGetCollectionItem() {
34
+ return new Promise(resolve => {
35
+ this.stopResolver = resolve;
36
+ this.recorder.isRecording && this.recorder.stop();
37
+ });
38
+ }
39
+ resolveStopWithCollectionItem(item) {
40
+ if (this.stopResolver) {
41
+ this.stopResolver(item);
42
+ this.stopResolver = null;
43
+ }
44
+ }
45
+ clearStopResolver() {
46
+ this.stopResolver = null;
47
+ }
48
+ }
49
+ //# sourceMappingURL=Recorder.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createEffect","createEvent","restore","setAudioModeAsync","VoiceRecorderState","AUDIO_MODE_CONFIG","playsInSilentMode","allowsRecording","RecorderModel","stopResolver","reset","setAudioFileDurationMs","setVoiceRecordState","setAvailableInputs","$audioFileDurationMs","$voiceRecordState","IDLE","$availableInputs","start","recorder","prepareToRecordAsync","record","error","console","stop","isRecording","Promise","resolve","stopAndGetCollectionItem","resolveStopWithCollectionItem","item","clearStopResolver"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/Recorder.model.ts"],"mappings":";;AAAA,SAASA,YAAY,EAAEC,WAAW,EAAEC,OAAO,QAAQ,UAAU;AAC7D,SAAwBC,iBAAiB,QAAQ,YAAY;AAC7D,SAASC,kBAAkB,QAAQ,iBAAc;AAGjD,MAAMC,iBAAiB,GAAG;EACxBC,iBAAiB,EAAE,IAAI;EACvBC,eAAe,EAAE;AACnB,CAAU;AAIV,OAAO,MAAMC,aAAa,CAAC;EAEjBC,YAAY,GAAwB,IAAI;EAEhCC,KAAK,GAAGT,WAAW,CAAC,CAAC;EACrBU,sBAAsB,GAAGV,WAAW,CAAS,CAAC;EAC9CW,mBAAmB,GAAGX,WAAW,CAAqB,CAAC;EACvDY,kBAAkB,GAAGZ,WAAW,CAAuB,CAAC;EAExDa,oBAAoB,GAAGZ,OAAO,CAAC,IAAI,CAACS,sBAAsB,EAAE,CAAC,CAAC,CAACD,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EAChFK,iBAAiB,GAAGb,OAAO,CACzC,IAAI,CAACU,mBAAmB,EACxBR,kBAAkB,CAACY,IACrB,CAAC,CAACN,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EACHO,gBAAgB,GAAGf,OAAO,CAAC,IAAI,CAACW,kBAAkB,EAAE,EAAE,CAAC;EAEvDK,KAAK,GAAGlB,YAAY,CAAC,YAAY;IAC/C,IAAI;MACF,MAAMG,iBAAiB,CAACE,iBAAiB,CAAC;MAC1C,MAAM,IAAI,CAACc,QAAQ,CAACC,oBAAoB,CAAC,CAAC;MAC1C,IAAI,CAACD,QAAQ,CAACE,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;MACjD,MAAMA,KAAK;IACb;EACF,CAAC,CAAC;EAEcE,IAAI,GAAGxB,YAAY,CAAC,MAAM;IACxC,IAAI,CAAC,IAAI,CAACmB,QAAQ,CAACM,WAAW,EAAE,OAAOC,OAAO,CAACC,OAAO,CAAC,CAAC;IACxD,OAAO,IAAI,CAACR,QAAQ,CAACK,IAAI,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEKI,wBAAwBA,CAAA,EAAuC;IACpE,OAAO,IAAIF,OAAO,CAAEC,OAAO,IAAK;MAC9B,IAAI,CAAClB,YAAY,GAAGkB,OAAO;MAC3B,IAAI,CAACR,QAAQ,CAACM,WAAW,IAAI,IAAI,CAACN,QAAQ,CAACK,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC;EACJ;EAEOK,6BAA6BA,CAACC,IAA+B,EAAQ;IAC1E,IAAI,IAAI,CAACrB,YAAY,EAAE;MACrB,IAAI,CAACA,YAAY,CAACqB,IAAI,CAAC;MACvB,IAAI,CAACrB,YAAY,GAAG,IAAI;IAC1B;EACF;EAEOsB,iBAAiBA,CAAA,EAAS;IAC/B,IAAI,CAACtB,YAAY,GAAG,IAAI;EAC1B;AACF","ignoreList":[]}
@@ -1,33 +1,174 @@
1
1
  "use strict";
2
2
 
3
- import { createEffect, createEvent, restore, sample } from 'effector';
3
+ import { attach, createEffect, createEvent, createStore, restore, sample } from 'effector';
4
+ import { ensureRecordingPermissions, generateAudioFormData, getAudioDurationMs, getAvailableInputs, uploadAudioFileRequestGenerator } from "../helpers.js";
5
+ import { t } from "../../../shared/translation/index.js";
6
+ import { RecorderModel } from "./Recorder.model.js";
7
+ import { VoiceRecordsCollection } from "./VoiceRecordCollection.js";
4
8
  export class VoiceRecordModel {
5
- startRecord = createEvent();
6
- stop = createEvent();
7
- deleteFile = createEvent();
8
- setAudioFilePath = createEvent();
9
- clearAudioFilePath = createEvent();
10
- $audioFilePath = restore(this.setAudioFilePath, '').reset(this.clearAudioFilePath);
11
- resetIsRecording = createEvent();
12
- setIsRecording = createEvent();
13
- $isRecording = restore(this.setIsRecording, false).reset(this.resetIsRecording);
14
- setAvailableInputs = createEvent();
15
- $availableInputs = restore(this.setAvailableInputs, []);
9
+ shouldDiscardRecording = false;
10
+ setCurrentKey = createEvent();
11
+ setCurrentRecord = createEvent();
12
+ reset = createEvent();
13
+ setIsDisabled = createEvent();
14
+ startAudioUpload = createEvent();
15
+ $currentKey = restore(this.setCurrentKey, '');
16
+ $currentRecord = restore(this.setCurrentRecord, null).reset(this.reset);
17
+ $isDisabled = restore(this.setIsDisabled, false);
18
+ deleteCurrentRecording = attach({
19
+ source: this.$currentKey,
20
+ mapParams: (props, currentKey) => ({
21
+ notification: true,
22
+ ...props,
23
+ currentKey
24
+ }),
25
+ effect: createEffect(({
26
+ currentKey,
27
+ notification
28
+ }) => {
29
+ const recordingItem = this.collection.get(currentKey);
30
+ this.abortUploadIfInProgress(recordingItem);
31
+ this.resetRecordingState(currentKey);
32
+ if (notification) {
33
+ this.notification.info(t('voiceRecorder.recordingDeleted'));
34
+ }
35
+ })
36
+ });
37
+ initializeRecording = createEffect(async () => {
38
+ this.deleteCurrentRecording({
39
+ notification: false
40
+ });
41
+ const hasPermissions = await ensureRecordingPermissions();
42
+ if (!hasPermissions) {
43
+ this.notification.error(t('voiceRecorder.noMicrophoneAccess'));
44
+ return;
45
+ }
46
+ const inputs = await getAvailableInputs(this.recorderModel.recorder);
47
+ this.recorderModel.setAvailableInputs(inputs);
48
+ if (inputs.length === 0) {
49
+ this.notification.error(t('voiceRecorder.noMicrophoneFound'));
50
+ return;
51
+ }
52
+ return this.recorderModel.start();
53
+ });
54
+ stopAndDiscard = createEffect(async () => {
55
+ this.shouldDiscardRecording = true;
56
+ await this.recorderModel.stop();
57
+ this.recorderModel.clearStopResolver();
58
+ this.recorderModel.reset();
59
+ });
60
+ recordingStatusUpdate = status => {
61
+ if (status.error) {
62
+ this.notification.error(`Recorder error: ${status.error}`);
63
+ this.recorderModel.clearStopResolver();
64
+ this.shouldDiscardRecording = false;
65
+ return;
66
+ }
67
+ if (status.isFinished && status.url) {
68
+ if (!this.shouldDiscardRecording) {
69
+ this.startAudioUpload(status.url);
70
+ }
71
+ this.shouldDiscardRecording = false;
72
+ }
73
+ };
16
74
  constructor({
17
- showToast
75
+ api,
76
+ notification,
77
+ events
18
78
  }) {
19
- this.showToast = showToast;
79
+ this.api = api;
80
+ this.notification = notification;
81
+ this.events = events;
82
+ this.recorderModel = new RecorderModel();
83
+ this.collection = new VoiceRecordsCollection();
84
+ this.setupUploadHandler();
85
+ this.setupCurrentRecordSync();
86
+ this.setupUriSync();
87
+ }
88
+ abortUploadIfInProgress(recordingItem) {
89
+ if (!recordingItem?.id && recordingItem?.controller) {
90
+ recordingItem.controller.abort();
91
+ }
92
+ }
93
+ resetRecordingState(currentKey) {
94
+ this.recorderModel.reset();
95
+ this.reset();
96
+ this.collection.delete(currentKey);
97
+ }
98
+ async handleAudioUpload({
99
+ uri,
100
+ currentKey
101
+ }) {
102
+ const durationMs = await getAudioDurationMs(uri);
103
+ const formData = await generateAudioFormData({
104
+ audioFileUri: uri,
105
+ durationMs
106
+ });
107
+ const {
108
+ uploadAudio,
109
+ controller
110
+ } = uploadAudioFileRequestGenerator(formData, this.api);
111
+ const audioUploadPromise = uploadAudio().then(data => {
112
+ // Check if the item still exists (wasn't deleted during upload)
113
+ if (this.collection.get(currentKey)) {
114
+ this.collection.update(currentKey, {
115
+ id: data.id
116
+ });
117
+ }
118
+ return data;
119
+ }).catch(error => {
120
+ if (error.name === 'CanceledError') return;
121
+ this.notification.error(t('voiceRecorder.uploadFailed'));
122
+ });
123
+ const collectionItem = {
124
+ durationMs,
125
+ audioUploadPromise,
126
+ controller,
127
+ uri
128
+ };
129
+ this.collection.add(currentKey, collectionItem);
130
+ this.setCurrentRecord(collectionItem);
131
+ this.recorderModel.resolveStopWithCollectionItem(collectionItem);
132
+ return audioUploadPromise;
133
+ }
134
+ setupUploadHandler() {
20
135
  sample({
21
- clock: this.deleteFile,
22
- target: createEffect(() => {
23
- this.clearAudioFilePath();
24
- showToast.info('Recording deleted');
25
- })
136
+ clock: this.startAudioUpload,
137
+ source: this.$currentKey,
138
+ filter: (currentKey, uri) => !!uri && !!currentKey,
139
+ fn: (currentKey, uri) => ({
140
+ currentKey,
141
+ uri
142
+ }),
143
+ target: createEffect(({
144
+ uri,
145
+ currentKey
146
+ }) => this.handleAudioUpload({
147
+ uri,
148
+ currentKey
149
+ }))
150
+ });
151
+ }
152
+ setupUriSync() {
153
+ sample({
154
+ source: this.$currentRecord,
155
+ fn: record => record?.uri || '',
156
+ target: createStore('').reset(this.reset)
26
157
  });
158
+ }
159
+ setupCurrentRecordSync() {
27
160
  sample({
28
- clock: this.startRecord,
29
- target: createEffect(async () => {
30
- showToast.info('Recording started');
161
+ source: this.$currentKey,
162
+ fn: currentKey => this.collection.get(currentKey),
163
+ target: createEffect(recordingItem => {
164
+ if (!recordingItem) {
165
+ this.reset();
166
+ return;
167
+ }
168
+ this.setCurrentRecord(recordingItem);
169
+ if (recordingItem.durationMs) {
170
+ this.recorderModel.setAudioFileDurationMs(recordingItem.durationMs);
171
+ }
31
172
  })
32
173
  });
33
174
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","createEvent","restore","sample","VoiceRecordModel","startRecord","stop","deleteFile","setAudioFilePath","clearAudioFilePath","$audioFilePath","reset","resetIsRecording","setIsRecording","$isRecording","setAvailableInputs","$availableInputs","constructor","showToast","clock","target","info"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecord.model.ts"],"mappings":";;AAAA,SAASA,YAAY,EAAEC,WAAW,EAAeC,OAAO,EAAEC,MAAM,QAAQ,UAAU;AAclF,OAAO,MAAMC,gBAAgB,CAAC;EACZC,WAAW,GAAGJ,WAAW,CAAC,CAAC;EAC3BK,IAAI,GAAGL,WAAW,CAAC,CAAC;EAEpBM,UAAU,GAAGN,WAAW,CAAC,CAAC;EAE1BO,gBAAgB,GAAGP,WAAW,CAAS,CAAC;EACxCQ,kBAAkB,GAAGR,WAAW,CAAC,CAAC;EAClCS,cAAc,GAAGR,OAAO,CAAC,IAAI,CAACM,gBAAgB,EAAE,EAAE,CAAC,CAACG,KAAK,CAAC,IAAI,CAACF,kBAAkB,CAAC;EAIlFG,gBAAgB,GAAGX,WAAW,CAAC,CAAC;EAChCY,cAAc,GAAGZ,WAAW,CAAU,CAAC;EACvCa,YAAY,GAAGZ,OAAO,CAAC,IAAI,CAACW,cAAc,EAAE,KAAK,CAAC,CAACF,KAAK,CAAC,IAAI,CAACC,gBAAgB,CAAC;EAE/EG,kBAAkB,GAAGd,WAAW,CAAiD,CAAC;EAClFe,gBAAgB,GAAGd,OAAO,CAAC,IAAI,CAACa,kBAAkB,EAAE,EAAE,CAAC;EAEvEE,WAAWA,CAAC;IAAEC;EAAkC,CAAC,EAAE;IACjD,IAAI,CAACA,SAAS,GAAGA,SAAS;IAE1Bf,MAAM,CAAC;MACLgB,KAAK,EAAE,IAAI,CAACZ,UAAU;MACtBa,MAAM,EAAEpB,YAAY,CAAC,MAAM;QACzB,IAAI,CAACS,kBAAkB,CAAC,CAAC;QACzBS,SAAS,CAACG,IAAI,CAAC,mBAAmB,CAAC;MACrC,CAAC;IACH,CAAC,CAAC;IAEFlB,MAAM,CAAC;MACLgB,KAAK,EAAE,IAAI,CAACd,WAAW;MACvBe,MAAM,EAAEpB,YAAY,CAAC,YAAY;QAC/BkB,SAAS,CAACG,IAAI,CAAC,mBAAmB,CAAC;MACrC,CAAC;IACH,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
1
+ {"version":3,"names":["attach","createEffect","createEvent","createStore","restore","sample","ensureRecordingPermissions","generateAudioFormData","getAudioDurationMs","getAvailableInputs","uploadAudioFileRequestGenerator","t","RecorderModel","VoiceRecordsCollection","VoiceRecordModel","shouldDiscardRecording","setCurrentKey","setCurrentRecord","reset","setIsDisabled","startAudioUpload","$currentKey","$currentRecord","$isDisabled","deleteCurrentRecording","source","mapParams","props","currentKey","notification","effect","recordingItem","collection","get","abortUploadIfInProgress","resetRecordingState","info","initializeRecording","hasPermissions","error","inputs","recorderModel","recorder","setAvailableInputs","length","start","stopAndDiscard","stop","clearStopResolver","recordingStatusUpdate","status","isFinished","url","constructor","api","events","setupUploadHandler","setupCurrentRecordSync","setupUriSync","id","controller","abort","delete","handleAudioUpload","uri","durationMs","formData","audioFileUri","uploadAudio","audioUploadPromise","then","data","update","catch","name","collectionItem","add","resolveStopWithCollectionItem","clock","filter","fn","target","record","setAudioFileDurationMs"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecord.model.ts"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,24 @@
1
1
  "use strict";
2
2
 
3
- export class VoiceRecordApi {}
3
+ export class VoiceRecordApi {
4
+ // public readonly uploadAudioFileFx
5
+
6
+ // public readonly abortUpload = createEffect(() => {
7
+ // if (this.uploadAudioFileFx.pending.getState()) {
8
+ // this.uploadAudioFileFx.controller.abort()
9
+ // }
10
+ // })
11
+
12
+ constructor(api) {
13
+ // this.uploadAudioFileFx = createControllerEffect((audioFileFormData: FormData, config) =>
14
+ // api.uploadAudioFile(
15
+ // { audioFileFormData },
16
+ // //@ts-ignore
17
+ // {
18
+ // signal: config?.signal,
19
+ // },
20
+ // ),
21
+ // )
22
+ }
23
+ }
4
24
  //# sourceMappingURL=VoiceRecordApi.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VoiceRecordApi"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecordApi.ts"],"mappings":";;AAAA,OAAO,MAAMA,cAAc,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["VoiceRecordApi","constructor","api"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecordApi.ts"],"mappings":";;AAIA,OAAO,MAAMA,cAAc,CAAC;EAC1B;;EAEA;EACA;EACA;EACA;EACA;;EAEAC,WAAWA,CAACC,GAAa,EAAE;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EAAA;AAEJ","ignoreList":[]}