@sendbird/uikit-react-native 3.10.2 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +1 -1
  3. package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -1
  4. package/lib/commonjs/components/ChannelInput/index.js +2 -25
  5. package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
  6. package/lib/commonjs/hooks/useVoiceMessageInput.js +10 -2
  7. package/lib/commonjs/hooks/useVoiceMessageInput.js.map +1 -1
  8. package/lib/commonjs/platform/createFileService.native.js +1 -1
  9. package/lib/commonjs/platform/createFileService.native.js.map +1 -1
  10. package/lib/commonjs/platform/createPlayerService.native.js +191 -114
  11. package/lib/commonjs/platform/createPlayerService.native.js.map +1 -1
  12. package/lib/commonjs/platform/createRecorderService.expo.js +3 -0
  13. package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -1
  14. package/lib/commonjs/platform/createRecorderService.native.js +212 -129
  15. package/lib/commonjs/platform/createRecorderService.native.js.map +1 -1
  16. package/lib/commonjs/platform/types.js.map +1 -1
  17. package/lib/commonjs/version.js +1 -1
  18. package/lib/commonjs/version.js.map +1 -1
  19. package/lib/module/components/ChannelInput/VoiceMessageInput.js +1 -1
  20. package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -1
  21. package/lib/module/components/ChannelInput/index.js +3 -26
  22. package/lib/module/components/ChannelInput/index.js.map +1 -1
  23. package/lib/module/hooks/useVoiceMessageInput.js +10 -2
  24. package/lib/module/hooks/useVoiceMessageInput.js.map +1 -1
  25. package/lib/module/platform/createFileService.native.js +1 -1
  26. package/lib/module/platform/createFileService.native.js.map +1 -1
  27. package/lib/module/platform/createPlayerService.native.js +191 -114
  28. package/lib/module/platform/createPlayerService.native.js.map +1 -1
  29. package/lib/module/platform/createRecorderService.expo.js +3 -0
  30. package/lib/module/platform/createRecorderService.expo.js.map +1 -1
  31. package/lib/module/platform/createRecorderService.native.js +212 -129
  32. package/lib/module/platform/createRecorderService.native.js.map +1 -1
  33. package/lib/module/platform/types.js.map +1 -1
  34. package/lib/module/version.js +1 -1
  35. package/lib/module/version.js.map +1 -1
  36. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  37. package/lib/typescript/src/platform/createPlayerService.native.d.ts +5 -3
  38. package/lib/typescript/src/platform/createRecorderService.native.d.ts +5 -3
  39. package/lib/typescript/src/platform/types.d.ts +4 -0
  40. package/lib/typescript/src/version.d.ts +1 -1
  41. package/package.json +18 -5
  42. package/src/components/ChannelInput/VoiceMessageInput.tsx +1 -1
  43. package/src/components/ChannelInput/index.tsx +6 -36
  44. package/src/hooks/useVoiceMessageInput.ts +7 -2
  45. package/src/platform/createFileService.native.ts +1 -1
  46. package/src/platform/createPlayerService.native.tsx +237 -113
  47. package/src/platform/createRecorderService.expo.tsx +4 -0
  48. package/src/platform/createRecorderService.native.tsx +240 -118
  49. package/src/platform/types.ts +5 -0
  50. package/src/version.ts +1 -1
@@ -9,134 +9,211 @@ var _uikitUtils = require("@sendbird/uikit-utils");
9
9
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
10
10
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
11
11
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
12
- const createNativePlayerService = ({
13
- audioRecorderModule,
14
- permissionModule
15
- }) => {
16
- const module = new audioRecorderModule.default();
17
- class VoicePlayer {
18
- constructor() {
19
- _defineProperty(this, "uri", void 0);
20
- _defineProperty(this, "state", 'idle');
21
- _defineProperty(this, "playbackSubscribers", new Set());
22
- _defineProperty(this, "stateSubscribers", new Set());
23
- _defineProperty(this, "setState", state => {
24
- this.state = state;
25
- this.stateSubscribers.forEach(callback => {
26
- callback(state);
27
- });
12
+ class AudioRecorderPlayerAdapter {
13
+ constructor(audioRecorderModule) {
14
+ _defineProperty(this, "module", void 0);
15
+ this.module = new audioRecorderModule.default();
16
+ }
17
+ async setSubscriptionDuration(duration) {
18
+ await this.module.setSubscriptionDuration(duration);
19
+ }
20
+ addPlayBackListener(callback) {
21
+ this.module.addPlayBackListener(callback);
22
+ }
23
+ removePlayBackListener() {
24
+ this.module.removePlayBackListener();
25
+ }
26
+ async startPlayer(uri) {
27
+ await this.module.startPlayer(uri);
28
+ }
29
+ async pausePlayer() {
30
+ await this.module.pausePlayer();
31
+ }
32
+ async resumePlayer() {
33
+ await this.module.resumePlayer();
34
+ }
35
+ async stopPlayer() {
36
+ await this.module.stopPlayer();
37
+ }
38
+ async seekToPlayer(time) {
39
+ await this.module.seekToPlayer(time);
40
+ }
41
+ }
42
+ class NitroSoundOrLegacyV4Adapter {
43
+ constructor(audioRecorderModule) {
44
+ _defineProperty(this, "module", void 0);
45
+ this.module = audioRecorderModule.default;
46
+ }
47
+ setSubscriptionDuration(duration) {
48
+ try {
49
+ this.module.setSubscriptionDuration(duration);
50
+ } catch (error) {
51
+ _uikitUtils.Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);
52
+ }
53
+ }
54
+ addPlayBackListener(callback) {
55
+ this.module.addPlayBackListener(callback);
56
+ }
57
+ removePlayBackListener() {
58
+ this.module.removePlayBackListener();
59
+ }
60
+ async startPlayer(uri) {
61
+ await this.module.startPlayer(uri);
62
+ }
63
+ async pausePlayer() {
64
+ await this.module.pausePlayer();
65
+ }
66
+ async resumePlayer() {
67
+ await this.module.resumePlayer();
68
+ }
69
+ async stopPlayer() {
70
+ await this.module.stopPlayer();
71
+ }
72
+ async seekToPlayer(time) {
73
+ await this.module.seekToPlayer(time);
74
+ }
75
+ }
76
+ class VoicePlayer {
77
+ constructor(adapter, permissionModule) {
78
+ this.adapter = adapter;
79
+ this.permissionModule = permissionModule;
80
+ _defineProperty(this, "uri", void 0);
81
+ _defineProperty(this, "state", 'idle');
82
+ _defineProperty(this, "playbackSubscribers", new Set());
83
+ _defineProperty(this, "stateSubscribers", new Set());
84
+ _defineProperty(this, "setState", state => {
85
+ this.state = state;
86
+ this.stateSubscribers.forEach(callback => {
87
+ callback(state);
28
88
  });
29
- _defineProperty(this, "setListener", () => {
30
- module.addPlayBackListener(async data => {
31
- const stopped = data.currentPosition >= data.duration;
32
- if (stopped) {
33
- this.stop().catch(error => {
34
- _uikitUtils.Logger.warn('[PlayerService.Native] Failed to stop in PlayBackListener', error);
35
- });
36
- }
37
- if (this.state === 'playing') {
38
- this.playbackSubscribers.forEach(callback => {
39
- callback({
40
- currentTime: data.currentPosition,
41
- duration: data.duration,
42
- stopped
43
- });
89
+ });
90
+ _defineProperty(this, "setListener", () => {
91
+ this.adapter.addPlayBackListener(async data => {
92
+ const stopped = data.currentPosition >= data.duration;
93
+ if (stopped) {
94
+ this.stop().catch(error => {
95
+ _uikitUtils.Logger.warn('[PlayerService.Native] Failed to stop in PlayBackListener', error);
96
+ });
97
+ }
98
+ if (this.state === 'playing') {
99
+ this.playbackSubscribers.forEach(callback => {
100
+ callback({
101
+ currentTime: data.currentPosition,
102
+ duration: data.duration,
103
+ stopped
44
104
  });
45
- }
46
- });
47
- });
48
- _defineProperty(this, "removeListener", () => {
49
- module.removePlayBackListener();
105
+ });
106
+ }
50
107
  });
51
- _defineProperty(this, "requestPermission", async () => {
52
- if (_reactNative.Platform.OS === 'android') {
53
- if (_reactNative.Platform.Version > 32) return true;
54
- const {
55
- READ_EXTERNAL_STORAGE
56
- } = permissionModule.PERMISSIONS.ANDROID;
57
- const status = await permissionModule.check(READ_EXTERNAL_STORAGE);
58
- if (status === 'granted') {
59
- return true;
60
- } else {
61
- const status = await permissionModule.request(READ_EXTERNAL_STORAGE);
62
- return status === 'granted';
63
- }
64
- } else {
108
+ });
109
+ _defineProperty(this, "removeListener", () => {
110
+ this.adapter.removePlayBackListener();
111
+ });
112
+ _defineProperty(this, "requestPermission", async () => {
113
+ if (_reactNative.Platform.OS === 'android') {
114
+ if (_reactNative.Platform.Version > 32) return true;
115
+ const {
116
+ READ_EXTERNAL_STORAGE
117
+ } = this.permissionModule.PERMISSIONS.ANDROID;
118
+ const status = await this.permissionModule.check(READ_EXTERNAL_STORAGE);
119
+ if (status === 'granted') {
65
120
  return true;
121
+ } else {
122
+ const status = await this.permissionModule.request(READ_EXTERNAL_STORAGE);
123
+ return status === 'granted';
66
124
  }
67
- });
68
- _defineProperty(this, "addPlaybackListener", callback => {
69
- this.playbackSubscribers.add(callback);
70
- return () => {
71
- this.playbackSubscribers.delete(callback);
72
- };
73
- });
74
- _defineProperty(this, "addStateListener", callback => {
75
- this.stateSubscribers.add(callback);
76
- return () => {
77
- this.stateSubscribers.delete(callback);
78
- };
79
- });
80
- _defineProperty(this, "play", async uri => {
81
- if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'stopped'])) {
82
- try {
83
- this.setState('preparing');
84
- this.uri = uri;
85
- this.setListener();
125
+ } else {
126
+ return true;
127
+ }
128
+ });
129
+ _defineProperty(this, "addPlaybackListener", callback => {
130
+ this.playbackSubscribers.add(callback);
131
+ return () => {
132
+ this.playbackSubscribers.delete(callback);
133
+ };
134
+ });
135
+ _defineProperty(this, "addStateListener", callback => {
136
+ this.stateSubscribers.add(callback);
137
+ return () => {
138
+ this.stateSubscribers.delete(callback);
139
+ };
140
+ });
141
+ _defineProperty(this, "play", async uri => {
142
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'stopped'])) {
143
+ try {
144
+ this.setState('preparing');
145
+ this.uri = uri;
146
+ this.setListener();
86
147
 
87
- // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.
88
- await (0, _uikitUtils.sleep)(0);
89
- await module.startPlayer(uri);
90
- this.setState('playing');
91
- } catch (e) {
92
- this.setState('idle');
93
- this.uri = undefined;
94
- this.removeListener();
95
- throw e;
96
- }
97
- } else if ((0, _uikitUtils.matchesOneOf)(this.state, ['paused']) && this.uri === uri) {
98
- try {
99
- this.setListener();
100
- await module.resumePlayer();
101
- this.setState('playing');
102
- } catch (e) {
103
- this.removeListener();
104
- throw e;
105
- }
106
- }
107
- });
108
- _defineProperty(this, "pause", async () => {
109
- if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing'])) {
110
- await module.pausePlayer();
148
+ // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.
149
+ await (0, _uikitUtils.sleep)(0);
150
+ await this.adapter.startPlayer(uri);
151
+ this.setState('playing');
152
+ } catch (e) {
153
+ this.setState('idle');
154
+ this.uri = undefined;
111
155
  this.removeListener();
112
- this.setState('paused');
156
+ throw e;
113
157
  }
114
- });
115
- _defineProperty(this, "stop", async () => {
116
- if ((0, _uikitUtils.matchesOneOf)(this.state, ['preparing', 'playing', 'paused'])) {
117
- await module.stopPlayer();
158
+ } else if ((0, _uikitUtils.matchesOneOf)(this.state, ['paused']) && this.uri === uri) {
159
+ try {
160
+ this.setListener();
161
+ await this.adapter.resumePlayer();
162
+ this.setState('playing');
163
+ } catch (e) {
118
164
  this.removeListener();
119
- this.setState('stopped');
165
+ throw e;
120
166
  }
121
- });
122
- _defineProperty(this, "reset", async () => {
123
- await this.stop();
124
- this.setState('idle');
125
- this.uri = undefined;
126
- this.playbackSubscribers.clear();
127
- this.stateSubscribers.clear();
128
- });
129
- _defineProperty(this, "seek", async time => {
130
- if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing', 'paused'])) {
131
- await module.seekToPlayer(time);
132
- }
133
- });
134
- module.setSubscriptionDuration(0.1).catch(error => {
167
+ }
168
+ });
169
+ _defineProperty(this, "pause", async () => {
170
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing'])) {
171
+ await this.adapter.pausePlayer();
172
+ this.removeListener();
173
+ this.setState('paused');
174
+ }
175
+ });
176
+ _defineProperty(this, "stop", async () => {
177
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['preparing', 'playing', 'paused'])) {
178
+ await this.adapter.stopPlayer();
179
+ this.removeListener();
180
+ this.setState('stopped');
181
+ }
182
+ });
183
+ _defineProperty(this, "reset", async () => {
184
+ await this.stop();
185
+ this.setState('idle');
186
+ this.uri = undefined;
187
+ this.playbackSubscribers.clear();
188
+ this.stateSubscribers.clear();
189
+ });
190
+ _defineProperty(this, "seek", async time => {
191
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing', 'paused'])) {
192
+ await this.adapter.seekToPlayer(time);
193
+ }
194
+ });
195
+ this.initialize();
196
+ }
197
+ initialize() {
198
+ const setDurationResult = this.adapter.setSubscriptionDuration(0.1);
199
+ if (setDurationResult instanceof Promise) {
200
+ setDurationResult.catch(error => {
135
201
  _uikitUtils.Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);
136
202
  });
137
203
  }
138
204
  }
139
- return new VoicePlayer();
205
+ }
206
+ const createNativePlayerService = modules => {
207
+ const adapter = isNitroSoundOrLegacyV4Module(modules.audioRecorderModule) ? new NitroSoundOrLegacyV4Adapter(modules.audioRecorderModule) : new AudioRecorderPlayerAdapter(modules.audioRecorderModule);
208
+ return new VoicePlayer(adapter, modules.permissionModule);
140
209
  };
210
+ function isNitroSoundOrLegacyV4Module(module) {
211
+ const isNitroSound = 'createSound' in module && typeof module.createSound === 'function';
212
+ const isLegacyV4 = 'default' in module && 'getHybridObject' in module.default && typeof module.default.getHybridObject === 'function';
213
+ if (isLegacyV4) {
214
+ _uikitUtils.Logger.warn('react-native-audio-recorder-player is deprecated. Please use react-native-nitro-sound instead.');
215
+ }
216
+ return isNitroSound || isLegacyV4;
217
+ }
141
218
  var _default = exports.default = createNativePlayerService;
142
219
  //# sourceMappingURL=createPlayerService.native.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_uikitUtils","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","createNativePlayerService","audioRecorderModule","permissionModule","module","default","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","addPlayBackListener","data","stopped","currentPosition","duration","stop","catch","error","Logger","warn","playbackSubscribers","currentTime","removePlayBackListener","Platform","OS","Version","READ_EXTERNAL_STORAGE","PERMISSIONS","ANDROID","status","check","request","add","delete","uri","matchesOneOf","setState","setListener","sleep","startPlayer","undefined","removeListener","resumePlayer","pausePlayer","stopPlayer","clear","time","seekToPlayer","setSubscriptionDuration","_default","exports"],"sources":["createPlayerService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport type * as RNAudioRecorder from 'react-native-audio-recorder-player';\nimport * as Permissions from 'react-native-permissions';\n\nimport { Logger, matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n audioRecorderModule: typeof RNAudioRecorder;\n permissionModule: typeof Permissions;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createNativePlayerService = ({ audioRecorderModule, permissionModule }: Modules): PlayerServiceInterface => {\n const module = new audioRecorderModule.default();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n constructor() {\n module.setSubscriptionDuration(0.1).catch((error) => {\n Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);\n });\n }\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n module.addPlayBackListener(async (data) => {\n const stopped = data.currentPosition >= data.duration;\n\n if (stopped) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Native] Failed to stop in PlayBackListener', error);\n });\n }\n if (this.state === 'playing') {\n this.playbackSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, duration: data.duration, stopped });\n });\n }\n });\n };\n\n private removeListener = () => {\n module.removePlayBackListener();\n };\n\n public requestPermission = async (): Promise<boolean> => {\n if (Platform.OS === 'android') {\n if (Platform.Version > 32) return true;\n\n const { READ_EXTERNAL_STORAGE } = permissionModule.PERMISSIONS.ANDROID;\n\n const status = await permissionModule.check(READ_EXTERNAL_STORAGE);\n if (status === 'granted') {\n return true;\n } else {\n const status = await permissionModule.request(READ_EXTERNAL_STORAGE);\n return status === 'granted';\n }\n } else {\n return true;\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n this.setState('preparing');\n this.uri = uri;\n this.setListener();\n\n // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.\n await sleep(0);\n await module.startPlayer(uri);\n\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await module.resumePlayer();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await module.pausePlayer();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['preparing', 'playing', 'paused'])) {\n await module.stopPlayer();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await module.seekToPlayer(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createNativePlayerService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","AudioRecorderPlayerAdapter","constructor","audioRecorderModule","module","default","setSubscriptionDuration","duration","addPlayBackListener","callback","removePlayBackListener","startPlayer","uri","pausePlayer","resumePlayer","stopPlayer","seekToPlayer","time","NitroSoundOrLegacyV4Adapter","error","Logger","warn","VoicePlayer","adapter","permissionModule","Set","state","stateSubscribers","forEach","data","stopped","currentPosition","stop","catch","playbackSubscribers","currentTime","Platform","OS","Version","READ_EXTERNAL_STORAGE","PERMISSIONS","ANDROID","status","check","request","add","delete","matchesOneOf","setState","setListener","sleep","undefined","removeListener","clear","initialize","setDurationResult","Promise","createNativePlayerService","modules","isNitroSoundOrLegacyV4Module","isNitroSound","createSound","isLegacyV4","getHybridObject","_default","exports"],"sources":["createPlayerService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport type * as LegacyModule from 'react-native-audio-recorder-player';\nimport type * as NitroSoundOrLegacyV4Module from 'react-native-nitro-sound';\nimport * as Permissions from 'react-native-permissions';\n\nimport { Logger, matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport { AudioRecorderModule } from './createRecorderService.native';\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\nexport type AudioPlayerModule = typeof LegacyModule | typeof NitroSoundOrLegacyV4Module;\n\ntype Modules = {\n audioRecorderModule: AudioPlayerModule;\n permissionModule: typeof Permissions;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\n\ninterface PlayBackData {\n currentPosition: number;\n duration: number;\n}\n\ninterface PlayerModuleAdapter {\n setSubscriptionDuration(duration: number): Promise<void> | void;\n addPlayBackListener(callback: (data: PlayBackData) => void): void;\n removePlayBackListener(): void;\n startPlayer(uri: string): Promise<void>;\n pausePlayer(): Promise<void>;\n resumePlayer(): Promise<void>;\n stopPlayer(): Promise<void>;\n seekToPlayer(time: number): Promise<void>;\n}\n\nclass AudioRecorderPlayerAdapter implements PlayerModuleAdapter {\n private module: InstanceType<typeof LegacyModule.default>;\n\n constructor(audioRecorderModule: typeof LegacyModule) {\n this.module = new audioRecorderModule.default();\n }\n\n async setSubscriptionDuration(duration: number): Promise<void> {\n await this.module.setSubscriptionDuration(duration);\n }\n\n addPlayBackListener(callback: (data: PlayBackData) => void): void {\n this.module.addPlayBackListener(callback);\n }\n\n removePlayBackListener(): void {\n this.module.removePlayBackListener();\n }\n\n async startPlayer(uri: string): Promise<void> {\n await this.module.startPlayer(uri);\n }\n\n async pausePlayer(): Promise<void> {\n await this.module.pausePlayer();\n }\n\n async resumePlayer(): Promise<void> {\n await this.module.resumePlayer();\n }\n\n async stopPlayer(): Promise<void> {\n await this.module.stopPlayer();\n }\n\n async seekToPlayer(time: number): Promise<void> {\n await this.module.seekToPlayer(time);\n }\n}\n\nclass NitroSoundOrLegacyV4Adapter implements PlayerModuleAdapter {\n private module;\n\n constructor(audioRecorderModule: typeof NitroSoundOrLegacyV4Module) {\n this.module = audioRecorderModule.default;\n }\n\n setSubscriptionDuration(duration: number): void {\n try {\n this.module.setSubscriptionDuration(duration);\n } catch (error) {\n Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);\n }\n }\n\n addPlayBackListener(callback: (data: PlayBackData) => void): void {\n this.module.addPlayBackListener(callback);\n }\n\n removePlayBackListener(): void {\n this.module.removePlayBackListener();\n }\n\n async startPlayer(uri: string): Promise<void> {\n await this.module.startPlayer(uri);\n }\n\n async pausePlayer(): Promise<void> {\n await this.module.pausePlayer();\n }\n\n async resumePlayer(): Promise<void> {\n await this.module.resumePlayer();\n }\n\n async stopPlayer(): Promise<void> {\n await this.module.stopPlayer();\n }\n\n async seekToPlayer(time: number): Promise<void> {\n await this.module.seekToPlayer(time);\n }\n}\n\nclass VoicePlayer implements PlayerServiceInterface {\n public uri?: string;\n public state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n constructor(private readonly adapter: PlayerModuleAdapter, private readonly permissionModule: typeof Permissions) {\n this.initialize();\n }\n\n private initialize(): void {\n const setDurationResult = this.adapter.setSubscriptionDuration(0.1);\n if (setDurationResult instanceof Promise) {\n setDurationResult.catch((error) => {\n Logger.warn('[PlayerService.Native] Failed to set subscription duration', error);\n });\n }\n }\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n this.adapter.addPlayBackListener(async (data) => {\n const stopped = data.currentPosition >= data.duration;\n\n if (stopped) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Native] Failed to stop in PlayBackListener', error);\n });\n }\n if (this.state === 'playing') {\n this.playbackSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, duration: data.duration, stopped });\n });\n }\n });\n };\n\n private removeListener = () => {\n this.adapter.removePlayBackListener();\n };\n\n public requestPermission = async (): Promise<boolean> => {\n if (Platform.OS === 'android') {\n if (Platform.Version > 32) return true;\n\n const { READ_EXTERNAL_STORAGE } = this.permissionModule.PERMISSIONS.ANDROID;\n\n const status = await this.permissionModule.check(READ_EXTERNAL_STORAGE);\n if (status === 'granted') {\n return true;\n } else {\n const status = await this.permissionModule.request(READ_EXTERNAL_STORAGE);\n return status === 'granted';\n }\n } else {\n return true;\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n this.setState('preparing');\n this.uri = uri;\n this.setListener();\n\n // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.\n await sleep(0);\n await this.adapter.startPlayer(uri);\n\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await this.adapter.resumePlayer();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await this.adapter.pausePlayer();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['preparing', 'playing', 'paused'])) {\n await this.adapter.stopPlayer();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await this.adapter.seekToPlayer(time);\n }\n };\n}\n\nconst createNativePlayerService = (modules: Modules): PlayerServiceInterface => {\n const adapter = isNitroSoundOrLegacyV4Module(modules.audioRecorderModule)\n ? new NitroSoundOrLegacyV4Adapter(modules.audioRecorderModule)\n : new AudioRecorderPlayerAdapter(modules.audioRecorderModule as typeof LegacyModule);\n\n return new VoicePlayer(adapter, modules.permissionModule);\n};\n\nfunction isNitroSoundOrLegacyV4Module(module: AudioRecorderModule): module is typeof NitroSoundOrLegacyV4Module {\n const isNitroSound = 'createSound' in module && typeof module.createSound === 'function';\n const isLegacyV4 =\n 'default' in module && 'getHybridObject' in module.default && typeof module.default.getHybridObject === 'function';\n if (isLegacyV4) {\n Logger.warn('react-native-audio-recorder-player is deprecated. Please use react-native-nitro-sound instead.');\n }\n return isNitroSound || isLegacyV4;\n}\n\nexport default createNativePlayerService;\n"],"mappings":"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","ignoreList":[]}
@@ -148,6 +148,9 @@ const createExpoRecorderService = ({
148
148
  this._recorder = new avModule.Audio.Recording();
149
149
  this.setState('idle');
150
150
  });
151
+ _defineProperty(this, "convertRecordPath", uri => {
152
+ return uri;
153
+ });
151
154
  }
152
155
  }
153
156
  return new VoiceRecorder();
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_expoPermissionGranted","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","createExpoRecorderService","avModule","VoiceRecorder","constructor","undefined","minDuration","VoiceMessageConfig","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","Audio","Recording","Set","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","numberOfChannels","CHANNELS","android","_audioSettings","options","audioEncoder","AndroidAudioEncoder","AAC","outputFormat","AndroidOutputFormat","MPEG_4","ios","IOSOutputFormat","MPEG4AAC","audioQuality","IOSAudioQuality","HIGH","web","setState","Platform","OS","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","stop","isRecording","_recordingSubscribers","forEach","callback","currentTime","prepareToRecordAsync","_audioOptions","state","_stateSubscribers","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","matchesOneOf","prepare","startAsync","uri","getURI","buffer","_getRecorderStopSafeBuffer","sleep","stopAndUnloadAsync","clear","_default","exports"],"sources":["createRecorderService.expo.tsx"],"sourcesContent":["import * as ExpoAV from 'expo-av';\nimport type { RecordingOptions } from 'expo-av/build/Audio/Recording.types';\nimport { Platform } from 'react-native';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n avModule: typeof ExpoAV;\n};\nconst createExpoRecorderService = ({ avModule }: Modules): RecorderServiceInterface => {\n class VoiceRecorder implements RecorderServiceInterface {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n private _recordStartedAt = 0;\n private _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n\n private _recorder = new avModule.Audio.Recording();\n private readonly _recordingSubscribers = new Set<RecordingListener>();\n private readonly _stateSubscribers = new Set<StateListener>();\n private readonly _audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n numberOfChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n private readonly _audioOptions: RecordingOptions = {\n android: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,\n outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4,\n },\n ios: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,\n audioQuality: avModule.Audio.IOSAudioQuality.HIGH,\n },\n web: {},\n };\n\n private prepare = async () => {\n this.setState('preparing');\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true });\n }\n\n if (this._recorder._isDoneRecording) {\n this._recorder = new avModule.Audio.Recording();\n }\n this._recorder.setProgressUpdateInterval(100);\n this._recorder.setOnRecordingStatusUpdate((status) => {\n const completed = status.durationMillis >= this.options.maxDuration;\n if (completed) this.stop();\n if (status.isRecording) {\n this._recordingSubscribers.forEach((callback) => {\n callback({ currentTime: status.durationMillis, completed: completed });\n });\n }\n });\n await this._recorder.prepareToRecordAsync(this._audioOptions);\n };\n\n private setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this._stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this._recordingSubscribers.add(callback);\n return () => {\n this._recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this._stateSubscribers.add(callback);\n return () => {\n this._stateSubscribers.delete(callback);\n };\n };\n\n public record = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n await this.prepare();\n await this._recorder.startAsync();\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n const uri = this._recorder.getURI();\n if (uri) this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await this._recorder.stopAndUnloadAsync();\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: false, playsInSilentModeIOS: false });\n }\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this._recordingSubscribers.clear();\n this._recorder = new avModule.Audio.Recording();\n this.setState('idle');\n };\n }\n\n return new VoiceRecorder();\n};\n\nexport default createExpoRecorderService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_expoPermissionGranted","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","createExpoRecorderService","avModule","VoiceRecorder","constructor","undefined","minDuration","VoiceMessageConfig","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","Audio","Recording","Set","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","numberOfChannels","CHANNELS","android","_audioSettings","options","audioEncoder","AndroidAudioEncoder","AAC","outputFormat","AndroidOutputFormat","MPEG_4","ios","IOSOutputFormat","MPEG4AAC","audioQuality","IOSAudioQuality","HIGH","web","setState","Platform","OS","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","stop","isRecording","_recordingSubscribers","forEach","callback","currentTime","prepareToRecordAsync","_audioOptions","state","_stateSubscribers","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","matchesOneOf","prepare","startAsync","uri","getURI","buffer","_getRecorderStopSafeBuffer","sleep","stopAndUnloadAsync","clear","_default","exports"],"sources":["createRecorderService.expo.tsx"],"sourcesContent":["import * as ExpoAV from 'expo-av';\nimport type { RecordingOptions } from 'expo-av/build/Audio/Recording.types';\nimport { Platform } from 'react-native';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n avModule: typeof ExpoAV;\n};\nconst createExpoRecorderService = ({ avModule }: Modules): RecorderServiceInterface => {\n class VoiceRecorder implements RecorderServiceInterface {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n private _recordStartedAt = 0;\n private _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n\n private _recorder = new avModule.Audio.Recording();\n private readonly _recordingSubscribers = new Set<RecordingListener>();\n private readonly _stateSubscribers = new Set<StateListener>();\n private readonly _audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n numberOfChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n private readonly _audioOptions: RecordingOptions = {\n android: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,\n outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4,\n },\n ios: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,\n audioQuality: avModule.Audio.IOSAudioQuality.HIGH,\n },\n web: {},\n };\n\n private prepare = async () => {\n this.setState('preparing');\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true });\n }\n\n if (this._recorder._isDoneRecording) {\n this._recorder = new avModule.Audio.Recording();\n }\n this._recorder.setProgressUpdateInterval(100);\n this._recorder.setOnRecordingStatusUpdate((status) => {\n const completed = status.durationMillis >= this.options.maxDuration;\n if (completed) this.stop();\n if (status.isRecording) {\n this._recordingSubscribers.forEach((callback) => {\n callback({ currentTime: status.durationMillis, completed: completed });\n });\n }\n });\n await this._recorder.prepareToRecordAsync(this._audioOptions);\n };\n\n private setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this._stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this._recordingSubscribers.add(callback);\n return () => {\n this._recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this._stateSubscribers.add(callback);\n return () => {\n this._stateSubscribers.delete(callback);\n };\n };\n\n public record = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n await this.prepare();\n await this._recorder.startAsync();\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n const uri = this._recorder.getURI();\n if (uri) this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await this._recorder.stopAndUnloadAsync();\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: false, playsInSilentModeIOS: false });\n }\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this._recordingSubscribers.clear();\n this._recorder = new avModule.Audio.Recording();\n this.setState('idle');\n };\n\n public convertRecordPath = (uri: string): string => {\n return uri;\n };\n }\n\n return new VoiceRecorder();\n};\n\nexport default createExpoRecorderService;\n"],"mappings":"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","ignoreList":[]}