@exode-team/react-recorder 1.1.0 → 1.1.2

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 (53) hide show
  1. package/README.md +84 -2
  2. package/dist/components/AudioRecorder.d.ts +1 -24
  3. package/dist/components/AudioRecorder.d.ts.map +1 -1
  4. package/dist/components/AudioRecorder.messages.d.ts +32 -0
  5. package/dist/components/AudioRecorder.messages.d.ts.map +1 -0
  6. package/dist/components/AudioRecorder.styled.d.ts +7 -0
  7. package/dist/components/AudioRecorder.styled.d.ts.map +1 -0
  8. package/dist/components/VoiceMessagePlayer/VoiceMessagePlayer.d.ts +4 -8
  9. package/dist/components/VoiceMessagePlayer/VoiceMessagePlayer.d.ts.map +1 -1
  10. package/dist/components/VoiceRecorderInput/PreviewBars.d.ts +17 -0
  11. package/dist/components/VoiceRecorderInput/PreviewBars.d.ts.map +1 -0
  12. package/dist/components/VoiceRecorderInput/TimelineBars.d.ts +12 -0
  13. package/dist/components/VoiceRecorderInput/TimelineBars.d.ts.map +1 -0
  14. package/dist/components/VoiceRecorderInput/VoiceRecorderInput.d.ts +2 -2
  15. package/dist/components/VoiceRecorderInput/VoiceRecorderInput.d.ts.map +1 -1
  16. package/dist/constants.d.ts +5 -0
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/hooks/index.d.ts +3 -0
  19. package/dist/hooks/index.d.ts.map +1 -1
  20. package/dist/hooks/useAudioBlobLoader.d.ts +23 -0
  21. package/dist/hooks/useAudioBlobLoader.d.ts.map +1 -0
  22. package/dist/hooks/useAudioPlayback.d.ts.map +1 -1
  23. package/dist/hooks/useAudioRecorderHandlers.d.ts +22 -0
  24. package/dist/hooks/useAudioRecorderHandlers.d.ts.map +1 -0
  25. package/dist/hooks/useMediaRecorder.d.ts +1 -10
  26. package/dist/hooks/useMediaRecorder.d.ts.map +1 -1
  27. package/dist/hooks/useRecorderVisualization.d.ts.map +1 -1
  28. package/dist/hooks/useRecordingSender.d.ts +23 -0
  29. package/dist/hooks/useRecordingSender.d.ts.map +1 -0
  30. package/dist/hooks/useVoiceMessagePlayer.d.ts +1 -18
  31. package/dist/hooks/useVoiceMessagePlayer.d.ts.map +1 -1
  32. package/dist/hooks/useVoiceRecorder.d.ts.map +1 -1
  33. package/dist/hooks/useVoiceRecorderInput.d.ts +31 -0
  34. package/dist/hooks/useVoiceRecorderInput.d.ts.map +1 -0
  35. package/dist/index.cjs +1185 -862
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.ts +4 -2
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1086 -764
  40. package/dist/index.js.map +1 -1
  41. package/dist/platform/audio-blob-fetcher.d.ts +7 -0
  42. package/dist/platform/audio-blob-fetcher.d.ts.map +1 -0
  43. package/dist/platform/index.d.ts +1 -0
  44. package/dist/platform/index.d.ts.map +1 -1
  45. package/dist/types/index.d.ts +1 -1
  46. package/dist/types/index.d.ts.map +1 -1
  47. package/dist/types/recorder.d.ts +31 -0
  48. package/dist/types/recorder.d.ts.map +1 -1
  49. package/dist/utils/voice-blob-cache.d.ts +20 -0
  50. package/dist/utils/voice-blob-cache.d.ts.map +1 -0
  51. package/dist/utils/voice-playback-chain.d.ts +20 -0
  52. package/dist/utils/voice-playback-chain.d.ts.map +1 -0
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -10,8 +10,11 @@
10
10
  - встроенная визуализация уровней сигнала и предпросмотр записанного фрагмента;
11
11
  - управление воспроизведением, паузой и повторным набором;
12
12
  - адаптация текстов/aria-лейблов через проп `messages`;
13
- - строгая типизация и SDK-подобный API (`uploader`, callbacks жизненного цикла).
14
- - **[NEW]** Хук `useVoiceRecorder` для создания кастомного UI.
13
+ - строгая типизация и SDK-подобный API (`uploader`, callbacks жизненного цикла);
14
+ - хук `useVoiceRecorder` для создания кастомного UI;
15
+ - компонент `VoiceMessagePlayer` с waveform-визуализацией и поддержкой последовательного воспроизведения;
16
+ - `VoiceBlobCache` для мгновенного воспроизведения только что отправленных сообщений;
17
+ - `VoicePlaybackChain` — автоматическое воспроизведение следующего голосового (как в Telegram).
15
18
 
16
19
  ### Установка
17
20
 
@@ -113,6 +116,85 @@ const MyCustomRecorder = () => {
113
116
  `togglePlayback`, `stopPlayback`, `sendRecording`
114
117
  - Утилиты: `formatTime`
115
118
 
119
+ #### `<VoiceMessagePlayer />`
120
+
121
+ Компонент воспроизведения голосовых сообщений с визуализацией waveform, поддержкой программного запуска через `ref`
122
+ и последовательного воспроизведения (chained playback).
123
+
124
+ ```tsx
125
+ import { useRef } from 'react';
126
+ import { VoiceMessagePlayer, VoiceMessagePlayerRef } from '@exode-team/react-recorder';
127
+
128
+
129
+ const Messages = () => {
130
+ const ref = useRef<VoiceMessagePlayerRef>(null);
131
+
132
+ return (
133
+ <VoiceMessagePlayer ref={ref}
134
+ src="/audio/message.webm"
135
+ chainId={42}
136
+ duration={12.5}
137
+ onEnded={() => console.log('Playback ended')}/>
138
+ );
139
+ };
140
+ ```
141
+
142
+ | Проп | Тип | Обязателен | По умолчанию | Описание |
143
+ |-----------------|--------------------------------|------------|--------------|---------------------------------------------------------------------------------------------|
144
+ | `src` | `string` | ✅ | — | URL аудиофайла. |
145
+ | `chainId` | `number` | — | — | ID для последовательного воспроизведения. При окончании автоматически запускает следующий. |
146
+ | `duration` | `number` | — | — | Длительность в секундах (отображается до загрузки аудио). |
147
+ | `autoPreload` | `boolean` | — | `true` | Автозагрузка аудио при попадании в viewport (IntersectionObserver). |
148
+ | `waveformData` | `number[]` | — | — | Предварительно вычисленные уровни waveform. |
149
+ | `preloadedBlob` | `Blob \| null` | — | — | Blob для мгновенного воспроизведения без сетевого запроса. |
150
+ | `onEnded` | `() => void` | — | — | Колбэк окончания воспроизведения. |
151
+ | `className` | `string` | — | — | CSS-класс контейнера. |
152
+ | `onClick` | `(e: React.MouseEvent) => void`| — | — | Обработчик клика по контейнеру. |
153
+
154
+ **Ref API (`VoiceMessagePlayerRef`):**
155
+
156
+ - `play()` — программный запуск воспроизведения.
157
+ - `prefetch()` — загрузка аудио без воспроизведения (fetch + decode waveform).
158
+
159
+ #### `VoicePlaybackChain`
160
+
161
+ Singleton-реестр для последовательного воспроизведения голосовых сообщений (как в Telegram).
162
+ Автоматически используется внутри `VoiceMessagePlayer` при передаче `chainId`, но доступен и напрямую.
163
+
164
+ ```ts
165
+ import { VoicePlaybackChain } from '@exode-team/react-recorder';
166
+
167
+ // Регистрация плеера (возвращает cleanup для useEffect)
168
+ const cleanup = VoicePlaybackChain.register(42, () => play());
169
+
170
+ // Запуск следующего после текущего
171
+ VoicePlaybackChain.playNext(42);
172
+
173
+ // Удаление из цепочки
174
+ VoicePlaybackChain.unregister(42);
175
+ ```
176
+
177
+ #### `VoiceBlobCache`
178
+
179
+ Кеш Blob-объектов голосовых сообщений для мгновенного воспроизведения только что отправленных записей
180
+ (до получения URL с сервера).
181
+
182
+ ```ts
183
+ import { VoiceBlobCache } from '@exode-team/react-recorder';
184
+
185
+ // Сохранить blob при отправке
186
+ VoiceBlobCache.set(messageId, blob);
187
+
188
+ // Получить для воспроизведения
189
+ const blob = VoiceBlobCache.get(messageId);
190
+
191
+ // Перенести при получении серверного ID
192
+ VoiceBlobCache.transfer(optimisticId, serverId);
193
+
194
+ // Удалить при ошибке
195
+ VoiceBlobCache.delete(messageId);
196
+ ```
197
+
116
198
  ### Типы
117
199
 
118
200
  #### `StorageSpaceEnum`
@@ -3,32 +3,9 @@
3
3
  *
4
4
  * @author: exode <hello@exode.ru>
5
5
  */
6
+ import { type RecorderMessagesInput } from './AudioRecorder.messages';
6
7
  import { type StorageFileEntity, type StorageSpace, type UploadStrategy, type UseVoiceRecorderOptions } from '../types';
7
8
  type RecorderOptionOverrides = Omit<UseVoiceRecorderOptions<Partial<StorageFileEntity>>, 'space' | 'uploadId' | 'onUploaded' | 'uploader'>;
8
- interface RecorderMessages {
9
- buttons: {
10
- send: string;
11
- cancel: string;
12
- };
13
- instruction: string;
14
- aria: {
15
- startRecording: string;
16
- stopRecording: string;
17
- pauseRecording: string;
18
- resumeRecording: string;
19
- playRecording: string;
20
- pausePlayback: string;
21
- };
22
- errors: {
23
- loadFileFailed: string;
24
- };
25
- }
26
- type RecorderMessagesInput = Partial<{
27
- buttons: Partial<RecorderMessages['buttons']>;
28
- instruction: RecorderMessages['instruction'];
29
- aria: Partial<RecorderMessages['aria']>;
30
- errors: Partial<RecorderMessages['errors']>;
31
- }>;
32
9
  interface Props extends Partial<RecorderOptionOverrides> {
33
10
  uploader: UploadStrategy<Partial<StorageFileEntity>>;
34
11
  messages?: RecorderMessagesInput;
@@ -1 +1 @@
1
- {"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../src/components/AudioRecorder.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC/B,MAAM,UAAU,CAAC;AAGlB,KAAK,uBAAuB,GAAG,IAAI,CAC/B,uBAAuB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EACnD,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CACnD,CAAC;AAEF,UAAU,gBAAgB;IACtB,OAAO,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QACF,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,MAAM,EAAE;QACJ,cAAc,EAAE,MAAM,CAAC;KAC1B,CAAC;CACL;AAED,KAAK,qBAAqB,GAAG,OAAO,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC/C,CAAC,CAAC;AAEH,UAAU,KAAM,SAAQ,OAAO,CAAC,uBAAuB,CAAC;IACpD,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAoDD,QAAA,MAAM,aAAa,GAAI,OAAO,KAAK,QA8NlC,CAAC;AAGF,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../src/components/AudioRecorder.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAErF,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC/B,MAAM,UAAU,CAAC;AAGlB,KAAK,uBAAuB,GAAG,IAAI,CAC/B,uBAAuB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EACnD,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CACnD,CAAC;AAEF,UAAU,KAAM,SAAQ,OAAO,CAAC,uBAAuB,CAAC;IACpD,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAGD,QAAA,MAAM,aAAa,GAAI,OAAO,KAAK,QAyHlC,CAAC;AAGF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * AudioRecorder messages — i18n-ready message definitions and merge utility
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ export interface RecorderMessages {
7
+ buttons: {
8
+ send: string;
9
+ cancel: string;
10
+ };
11
+ instruction: string;
12
+ aria: {
13
+ startRecording: string;
14
+ stopRecording: string;
15
+ pauseRecording: string;
16
+ resumeRecording: string;
17
+ playRecording: string;
18
+ pausePlayback: string;
19
+ };
20
+ errors: {
21
+ loadFileFailed: string;
22
+ };
23
+ }
24
+ export type RecorderMessagesInput = Partial<{
25
+ buttons: Partial<RecorderMessages['buttons']>;
26
+ instruction: RecorderMessages['instruction'];
27
+ aria: Partial<RecorderMessages['aria']>;
28
+ errors: Partial<RecorderMessages['errors']>;
29
+ }>;
30
+ export declare const DEFAULT_MESSAGES: RecorderMessages;
31
+ export declare const mergeMessages: (custom?: RecorderMessagesInput) => RecorderMessages;
32
+ //# sourceMappingURL=AudioRecorder.messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioRecorder.messages.d.ts","sourceRoot":"","sources":["../../src/components/AudioRecorder.messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QACF,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,MAAM,EAAE;QACJ,cAAc,EAAE,MAAM,CAAC;KAC1B,CAAC;CACL;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC/C,CAAC,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,gBAiB9B,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,SAAS,qBAAqB,KAAG,gBAoB9D,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * AudioRecorder styled components
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ export declare const Container: any;
7
+ //# sourceMappingURL=AudioRecorder.styled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioRecorder.styled.d.ts","sourceRoot":"","sources":["../../src/components/AudioRecorder.styled.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,SAAS,KAMrB,CAAC"}
@@ -3,14 +3,10 @@
3
3
  *
4
4
  * @author: exode <hello@exode.ru>
5
5
  */
6
- import React from 'react';
7
- interface Props {
8
- src: string;
9
- duration?: number;
10
- waveformData?: number[];
11
- className?: string;
12
- onClick?: (e: React.MouseEvent) => void;
6
+ export interface VoiceMessagePlayerRef {
7
+ play: () => void;
8
+ prefetch: () => void;
13
9
  }
14
- declare const VoiceMessagePlayer: (props: Props) => any;
10
+ declare const VoiceMessagePlayer: any;
15
11
  export { VoiceMessagePlayer };
16
12
  //# sourceMappingURL=VoiceMessagePlayer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceMessagePlayer.d.ts","sourceRoot":"","sources":["../../../src/components/VoiceMessagePlayer/VoiceMessagePlayer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAkE,MAAM,OAAO,CAAC;AAsBvF,UAAU,KAAK;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC3C;AAGD,QAAA,MAAM,kBAAkB,GAAI,OAAO,KAAK,QA2HvC,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"VoiceMessagePlayer.d.ts","sourceRoot":"","sources":["../../../src/components/VoiceMessagePlayer/VoiceMessagePlayer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAeD,QAAA,MAAM,kBAAkB,KAsLtB,CAAC;AAGH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * PreviewBars — renders waveform bars in preview mode (paused/stopped)
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ interface PreviewBarsProps {
7
+ isPlaying: boolean;
8
+ playbackTime: number;
9
+ lastDuration: number;
10
+ recordingTime: number;
11
+ previewLevels: number[];
12
+ timelineLevels: number[];
13
+ getVisibleBarsCount: () => number;
14
+ }
15
+ declare const PreviewBars: (props: PreviewBarsProps) => any;
16
+ export { PreviewBars };
17
+ //# sourceMappingURL=PreviewBars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewBars.d.ts","sourceRoot":"","sources":["../../../src/components/VoiceRecorderInput/PreviewBars.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,gBAAgB;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,MAAM,CAAC;CACrC;AAGD,QAAA,MAAM,WAAW,GAAI,OAAO,gBAAgB,QA0E3C,CAAC;AAGF,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * TimelineBars — renders waveform bars during active recording
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ interface TimelineBarsProps {
7
+ timelineLevels: number[];
8
+ getVisibleBarsCount: () => number;
9
+ }
10
+ declare const TimelineBars: (props: TimelineBarsProps) => any;
11
+ export { TimelineBars };
12
+ //# sourceMappingURL=TimelineBars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineBars.d.ts","sourceRoot":"","sources":["../../../src/components/VoiceRecorderInput/TimelineBars.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,iBAAiB;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,MAAM,CAAC;CACrC;AAGD,QAAA,MAAM,YAAY,GAAI,OAAO,iBAAiB,QAkC7C,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -5,8 +5,8 @@
5
5
  */
6
6
  import { type StorageSpace, type UploadStrategy } from '../../types';
7
7
  interface Props {
8
- uploader?: UploadStrategy<any>;
9
- onUploaded?: (file: any) => void | Promise<void>;
8
+ uploader?: UploadStrategy<unknown>;
9
+ onUploaded?: (file: unknown) => void | Promise<void>;
10
10
  onCancel?: () => void;
11
11
  onSend?: (file: File, duration: number) => void | Promise<void>;
12
12
  onError?: (error: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceRecorderInput.d.ts","sourceRoot":"","sources":["../../../src/components/VoiceRecorderInput/VoiceRecorderInput.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EAAE,KAAK,YAAY,EAAoB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBvF,UAAU,KAAK;IACX,QAAQ,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,QAAA,MAAM,kBAAkB,GAAI,OAAO,KAAK,QAgWvC,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"VoiceRecorderInput.d.ts","sourceRoot":"","sources":["../../../src/components/VoiceRecorderInput/VoiceRecorderInput.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBrE,UAAU,KAAK;IACX,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,QAAA,MAAM,kBAAkB,GAAI,OAAO,KAAK,QAsGvC,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -5,4 +5,9 @@
5
5
  */
6
6
  export declare const AUDIO_LEVEL_BARS = 40;
7
7
  export declare const createInitialLevels: () => number[];
8
+ export declare const TIMELINE_SAMPLE_INTERVAL = 150;
9
+ export declare const TIMELINE_BAR_WIDTH = 3;
10
+ export declare const TIMELINE_BAR_GAP = 2;
11
+ export declare const TIMELINE_BAR_MIN_HEIGHT = 3;
12
+ export declare const TIMELINE_BAR_MAX_HEIGHT = 24;
8
13
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,eAAO,MAAM,mBAAmB,QAAO,MAAM,EAAuD,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,eAAO,MAAM,mBAAmB,QAAO,MAAM,EAAuD,CAAC;AAErG,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,uBAAuB,KAAK,CAAC"}
@@ -6,4 +6,7 @@
6
6
  export { useVoiceRecorder } from './useVoiceRecorder';
7
7
  export { useRecorderVisualization } from './useRecorderVisualization';
8
8
  export { useRecordingTiming } from './useRecordingTiming';
9
+ export { useAudioBlobLoader } from './useAudioBlobLoader';
10
+ export { useRecordingSender } from './useRecordingSender';
11
+ export { useVoiceMessagePlayer } from './useVoiceMessagePlayer';
9
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * useAudioBlobLoader — loads audio blob from URL or preloaded data,
3
+ * creates object URL and decodes waveform levels.
4
+ *
5
+ * @author: exode <hello@exode.ru>
6
+ */
7
+ import type { PlaybackCallbacks } from '../platform';
8
+ interface UseAudioBlobLoaderOptions {
9
+ src: string;
10
+ waveformData?: number[];
11
+ preloadedBlob?: Blob | null;
12
+ playbackCallbacks: PlaybackCallbacks;
13
+ }
14
+ interface UseAudioBlobLoaderResult {
15
+ audioRef: React.MutableRefObject<HTMLAudioElement | null>;
16
+ isLoading: boolean;
17
+ isLoaded: boolean;
18
+ waveformLevels: number[];
19
+ ensureAudioLoaded: () => Promise<void>;
20
+ }
21
+ declare const useAudioBlobLoader: (options: UseAudioBlobLoaderOptions) => UseAudioBlobLoaderResult;
22
+ export { useAudioBlobLoader };
23
+ //# sourceMappingURL=useAudioBlobLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAudioBlobLoader.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioBlobLoader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAYrD,UAAU,yBAAyB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,iBAAiB,CAAC;CACxC;AAED,UAAU,wBAAwB;IAC9B,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,QAAA,MAAM,kBAAkB,GAAI,SAAS,yBAAyB,KAAG,wBAgIhE,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAudioPlayback.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioPlayback.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,UAAU,sBAAsB;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IAClC,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IAC7D,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,QAAA,MAAM,gBAAgB,QAAO,sBA2H5B,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"useAudioPlayback.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioPlayback.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,sBAAsB;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IAClC,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IAC7D,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,QAAA,MAAM,gBAAgB,QAAO,sBA2H5B,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * useAudioRecorderHandlers — recording/send/cancel handlers for AudioRecorder
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ import type { UseVoiceRecorderResult } from '../types';
7
+ import type { RecorderMessages } from '../components/AudioRecorder.messages';
8
+ interface UseAudioRecorderHandlersOptions {
9
+ vibrate: (pattern: number | number[]) => void;
10
+ messages: RecorderMessages;
11
+ recorder: UseVoiceRecorderResult;
12
+ onUploadError?: (error: unknown) => void;
13
+ }
14
+ declare const useAudioRecorderHandlers: (options: UseAudioRecorderHandlersOptions) => {
15
+ isSending: any;
16
+ handleCancel: any;
17
+ handleSendRequest: any;
18
+ handleRecordToggle: any;
19
+ handlePlaybackToggle: any;
20
+ };
21
+ export { useAudioRecorderHandlers };
22
+ //# sourceMappingURL=useAudioRecorderHandlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAudioRecorderHandlers.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioRecorderHandlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAG7E,UAAU,+BAA+B;IACrC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,sBAAsB,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAGD,QAAA,MAAM,wBAAwB,GAAI,SAAS,+BAA+B;;;;;;CA2KzE,CAAC;AAGF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -3,16 +3,7 @@
3
3
  *
4
4
  * @author: exode <hello@exode.ru>
5
5
  */
6
- interface MediaRecorderCallbacks {
7
- onDataChunk: (chunk: Blob) => void;
8
- onNeedsPreview: (chunks: Blob[]) => void;
9
- onStopped: (chunks: Blob[], discarded: boolean) => void;
10
- onPaused: () => void;
11
- onResumed: () => void;
12
- onStreamAcquired: (stream: MediaStream) => void;
13
- onPermissionDenied: (error: unknown) => void;
14
- onError: (error: unknown) => void;
15
- }
6
+ import type { MediaRecorderCallbacks } from '../types';
16
7
  interface UseMediaRecorderResult {
17
8
  isRecording: boolean;
18
9
  isPaused: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaRecorder.d.ts","sourceRoot":"","sources":["../../src/hooks/useMediaRecorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,UAAU,sBAAsB;IAC5B,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACzC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED,UAAU,sBAAsB;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,QAAA,MAAM,gBAAgB,GAAI,WAAW,sBAAsB,KAAG,sBAkI7D,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"useMediaRecorder.d.ts","sourceRoot":"","sources":["../../src/hooks/useMediaRecorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,UAAU,sBAAsB;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,QAAA,MAAM,gBAAgB,GAAI,WAAW,sBAAsB,KAAG,sBAkI7D,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useRecorderVisualization.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecorderVisualization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,UAAU,8BAA8B;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,uBAAuB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACvD,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5F;AAGD,QAAA,MAAM,wBAAwB,QAAO,8BAyGpC,CAAC;AAGF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
1
+ {"version":3,"file":"useRecorderVisualization.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecorderVisualization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,UAAU,8BAA8B;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,uBAAuB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACvD,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5F;AAGD,QAAA,MAAM,wBAAwB,QAAO,8BAyGpC,CAAC;AAGF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * useRecordingSender — handles sending a recorded voice message via an upload strategy.
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ import type { StorageSpace, UploadStrategy } from '../types';
7
+ interface UseRecordingSenderOptions<TFile> {
8
+ fileName: string;
9
+ mimeType: string;
10
+ audioBlob: Blob | null;
11
+ space: StorageSpace;
12
+ uploadId: string;
13
+ uploader?: UploadStrategy<TFile>;
14
+ onUploaded: (file: TFile) => void | Promise<void>;
15
+ deleteRecording: () => void;
16
+ autoResetAfterUpload: boolean;
17
+ onRecordingError?: (error: unknown) => void;
18
+ }
19
+ declare const useRecordingSender: <TFile = unknown>(options: UseRecordingSenderOptions<TFile>) => {
20
+ sendRecording: any;
21
+ };
22
+ export { useRecordingSender };
23
+ //# sourceMappingURL=useRecordingSender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecordingSender.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecordingSender.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG7D,UAAU,yBAAyB,CAAC,KAAK;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAGD,QAAA,MAAM,kBAAkB,GAAI,KAAK,GAAG,OAAO,EAAE,SAAS,yBAAyB,CAAC,KAAK,CAAC;;CA4DrF,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -3,24 +3,7 @@
3
3
  *
4
4
  * @author: exode <hello@exode.ru>
5
5
  */
6
- interface UseVoiceMessagePlayerOptions {
7
- src: string;
8
- duration?: number;
9
- waveformData?: number[];
10
- }
11
- interface UseVoiceMessagePlayerResult {
12
- isPlaying: boolean;
13
- isLoading: boolean;
14
- isLoaded: boolean;
15
- currentTime: number;
16
- duration: number;
17
- progress: number;
18
- waveformLevels: number[];
19
- preload: () => void;
20
- togglePlayback: () => void;
21
- seekTo: (progress: number) => void;
22
- formatTime: (seconds: number) => string;
23
- }
6
+ import type { UseVoiceMessagePlayerOptions, UseVoiceMessagePlayerResult } from '../types';
24
7
  declare const useVoiceMessagePlayer: (options: UseVoiceMessagePlayerOptions) => UseVoiceMessagePlayerResult;
25
8
  export { useVoiceMessagePlayer };
26
9
  //# sourceMappingURL=useVoiceMessagePlayer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVoiceMessagePlayer.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceMessagePlayer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,UAAU,4BAA4B;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,UAAU,2BAA2B;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAGD,QAAA,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,KAAG,2BA0MtE,CAAC;AAGF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"useVoiceMessagePlayer.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceMessagePlayer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAG1F,QAAA,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,KAAG,2BA6JtE,CAAC;AAGF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGhF,iBAAS,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,GAAG,sBAAsB,CAwOxG;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGhF,iBAAS,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,GAAG,sBAAsB,CAyMxG;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * useVoiceRecorderInput — orchestrates recording, sending and timeline for VoiceRecorderInput
3
+ *
4
+ * @author: exode <hello@exode.ru>
5
+ */
6
+ import { type StorageSpace, type UploadStrategy } from '../types';
7
+ interface UseVoiceRecorderInputOptions {
8
+ uploader?: UploadStrategy<unknown>;
9
+ onUploaded?: (file: unknown) => void | Promise<void>;
10
+ onSend?: (file: File, duration: number) => void | Promise<void>;
11
+ onError?: (error: unknown) => void;
12
+ onCancel?: () => void;
13
+ onPermissionDenied?: (error: unknown) => void;
14
+ autoStart?: boolean;
15
+ mimeType?: string;
16
+ fileName?: string;
17
+ space?: StorageSpace;
18
+ }
19
+ declare const useVoiceRecorderInput: (options: UseVoiceRecorderInputOptions) => {
20
+ recorder: import("../types").UseVoiceRecorderResult;
21
+ isSending: any;
22
+ isPreview: boolean;
23
+ timelineLevels: any;
24
+ lastDurationRef: any;
25
+ handleResume: any;
26
+ handlePause: () => void;
27
+ handleCancel: any;
28
+ handleSendRequest: any;
29
+ };
30
+ export { useVoiceRecorderInput };
31
+ //# sourceMappingURL=useVoiceRecorderInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVoiceRecorderInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceRecorderInput.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,YAAY,EAAoB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAGpF,UAAU,4BAA4B;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;CACxB;AAGD,QAAA,MAAM,qBAAqB,GAAI,SAAS,4BAA4B;;;;;;;;;;CA+MnE,CAAC;AAGF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}