@sendbird/uikit-react-native 3.11.0 → 3.11.1

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 (37) hide show
  1. package/README.md +7 -5
  2. package/lib/commonjs/platform/createMediaService.expo.js +83 -12
  3. package/lib/commonjs/platform/createMediaService.expo.js.map +1 -1
  4. package/lib/commonjs/platform/createPlayerService.expo.js +214 -113
  5. package/lib/commonjs/platform/createPlayerService.expo.js.map +1 -1
  6. package/lib/commonjs/platform/createRecorderService.expo.js +248 -130
  7. package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -1
  8. package/lib/commonjs/utils/expoBackwardUtils.js +23 -0
  9. package/lib/commonjs/utils/expoBackwardUtils.js.map +1 -1
  10. package/lib/commonjs/utils/expoPermissionGranted.js.map +1 -1
  11. package/lib/commonjs/version.js +1 -1
  12. package/lib/commonjs/version.js.map +1 -1
  13. package/lib/module/platform/createMediaService.expo.js +82 -13
  14. package/lib/module/platform/createMediaService.expo.js.map +1 -1
  15. package/lib/module/platform/createPlayerService.expo.js +214 -113
  16. package/lib/module/platform/createPlayerService.expo.js.map +1 -1
  17. package/lib/module/platform/createRecorderService.expo.js +249 -131
  18. package/lib/module/platform/createRecorderService.expo.js.map +1 -1
  19. package/lib/module/utils/expoBackwardUtils.js +23 -0
  20. package/lib/module/utils/expoBackwardUtils.js.map +1 -1
  21. package/lib/module/utils/expoPermissionGranted.js.map +1 -1
  22. package/lib/module/version.js +1 -1
  23. package/lib/module/version.js.map +1 -1
  24. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  25. package/lib/typescript/src/platform/createMediaService.expo.d.ts +2 -2
  26. package/lib/typescript/src/platform/createPlayerService.expo.d.ts +2 -2
  27. package/lib/typescript/src/platform/createRecorderService.expo.d.ts +2 -2
  28. package/lib/typescript/src/utils/expoBackwardUtils.d.ts +10 -0
  29. package/lib/typescript/src/utils/expoPermissionGranted.d.ts +1 -1
  30. package/lib/typescript/src/version.d.ts +1 -1
  31. package/package.json +16 -5
  32. package/src/platform/createMediaService.expo.tsx +87 -9
  33. package/src/platform/createPlayerService.expo.tsx +242 -109
  34. package/src/platform/createRecorderService.expo.tsx +267 -110
  35. package/src/utils/expoBackwardUtils.ts +29 -0
  36. package/src/utils/expoPermissionGranted.ts +3 -1
  37. package/src/version.ts +1 -1
@@ -1,30 +1,99 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
- import React from 'react';
3
- import { getDownscaleSize } from '@sendbird/uikit-utils';
2
+ 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; }
3
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
4
+ 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); }
5
+ import React, { useEffect } from 'react';
6
+ import { Logger, getDownscaleSize } from '@sendbird/uikit-utils';
4
7
  import SBUUtils from '../libs/SBUUtils';
5
8
  import expoBackwardUtils from '../utils/expoBackwardUtils';
6
- const createExpoMediaService = ({
7
- avModule,
8
- thumbnailModule,
9
- imageManipulator,
10
- fsModule
11
- }) => {
12
- return {
13
- VideoComponent({
9
+ class LegacyExpoAVVideoAdapter {
10
+ constructor(avModule) {
11
+ _defineProperty(this, "avModule", void 0);
12
+ _defineProperty(this, "VideoComponent", ({
14
13
  source,
15
14
  resizeMode,
16
15
  onLoad,
17
16
  ...props
18
- }) {
17
+ }) => {
19
18
  // FIXME: type error https://github.com/expo/expo/issues/17101
20
19
  // @ts-ignore
21
- return /*#__PURE__*/React.createElement(avModule.Video, _extends({}, props, {
20
+ return /*#__PURE__*/React.createElement(this.avModule.Video, _extends({}, props, {
22
21
  source: source,
23
22
  resizeMode: resizeMode,
24
23
  onLoad: onLoad,
25
24
  useNativeControls: true
26
25
  }));
27
- },
26
+ });
27
+ this.avModule = avModule;
28
+ }
29
+ }
30
+ class ExpoVideoAdapter {
31
+ constructor(_videoModule) {
32
+ this._videoModule = _videoModule;
33
+ _defineProperty(this, "VideoComponent", ({
34
+ source,
35
+ resizeMode,
36
+ onLoad,
37
+ ...props
38
+ }) => {
39
+ const player = this._videoModule.useVideoPlayer(source);
40
+ useEffect(() => {
41
+ if (onLoad && player) {
42
+ let subscription = null;
43
+ try {
44
+ subscription = player.addListener('statusChange', eventData => {
45
+ const {
46
+ status,
47
+ error
48
+ } = eventData;
49
+ if (status === 'readyToPlay' && !error) {
50
+ onLoad();
51
+ }
52
+ });
53
+ } catch (error) {
54
+ const timeout = setTimeout(() => onLoad(), 300);
55
+ return () => clearTimeout(timeout);
56
+ }
57
+ return () => {
58
+ if (subscription) {
59
+ subscription.remove();
60
+ }
61
+ };
62
+ }
63
+ return undefined;
64
+ }, [onLoad, player]);
65
+ const getContentFit = mode => {
66
+ switch (mode) {
67
+ case 'cover':
68
+ return 'cover';
69
+ case 'contain':
70
+ return 'contain';
71
+ case 'stretch':
72
+ return 'fill';
73
+ default:
74
+ return 'contain';
75
+ }
76
+ };
77
+ return /*#__PURE__*/React.createElement(this._videoModule.VideoView, {
78
+ ...props,
79
+ player,
80
+ contentFit: getContentFit(resizeMode)
81
+ });
82
+ });
83
+ }
84
+ }
85
+ const createExpoMediaService = ({
86
+ avModule,
87
+ thumbnailModule,
88
+ imageManipulator,
89
+ fsModule
90
+ }) => {
91
+ if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {
92
+ Logger.warn('[MediaService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-video.');
93
+ }
94
+ const videoAdapter = expoBackwardUtils.expoAV.isVideoModule(avModule) ? new ExpoVideoAdapter(avModule) : new LegacyExpoAVVideoAdapter(avModule);
95
+ return {
96
+ VideoComponent: videoAdapter.VideoComponent,
28
97
  async getVideoThumbnail({
29
98
  url,
30
99
  quality,
@@ -1 +1 @@
1
- {"version":3,"names":["React","getDownscaleSize","SBUUtils","expoBackwardUtils","createExpoMediaService","avModule","thumbnailModule","imageManipulator","fsModule","VideoComponent","source","resizeMode","onLoad","props","createElement","Video","_extends","useNativeControls","getVideoThumbnail","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","maxWidth","maxHeight","compressionRate","originSize","getImageSize","resizingSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","fileInfo","getInfoAsync","size","toFileSize"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoFS from 'expo-file-system';\nimport type * as ExpoImageManipulator from 'expo-image-manipulator';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React from 'react';\n\nimport { getDownscaleSize } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { MediaServiceInterface } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n thumbnailModule: typeof ExpoVideoThumbnail;\n imageManipulator: typeof ExpoImageManipulator;\n fsModule: typeof ExpoFS;\n};\n\nconst createExpoMediaService = ({\n avModule,\n thumbnailModule,\n imageManipulator,\n fsModule,\n}: Modules): MediaServiceInterface => {\n return {\n VideoComponent({ source, resizeMode, onLoad, ...props }) {\n // FIXME: type error https://github.com/expo/expo/issues/17101\n // @ts-ignore\n return <avModule.Video {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} useNativeControls />;\n },\n async getVideoThumbnail({ url, quality, timeMills }) {\n try {\n const { uri } = await thumbnailModule.getThumbnailAsync(url, { quality, time: timeMills });\n return { path: uri };\n } catch {\n return null;\n }\n },\n async compressImage({ maxWidth, maxHeight, compressionRate = 1, uri }) {\n const originSize = await SBUUtils.getImageSize(uri);\n const resizingSize = getDownscaleSize(originSize, { width: maxWidth, height: maxHeight });\n\n const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {\n compress: Math.min(Math.max(0, compressionRate), 1),\n });\n const fileInfo = await fsModule.getInfoAsync(uri);\n\n return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };\n },\n };\n};\n\nexport default createExpoMediaService;\n"],"mappings":";AAIA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAOC,QAAQ,MAAM,kBAAkB;AACvC,OAAOC,iBAAiB,MAAM,4BAA4B;AAU1D,MAAMC,sBAAsB,GAAGA,CAAC;EAC9BC,QAAQ;EACRC,eAAe;EACfC,gBAAgB;EAChBC;AACO,CAAC,KAA4B;EACpC,OAAO;IACLC,cAAcA,CAAC;MAAEC,MAAM;MAAEC,UAAU;MAAEC,MAAM;MAAE,GAAGC;IAAM,CAAC,EAAE;MACvD;MACA;MACA,oBAAOb,KAAA,CAAAc,aAAA,CAACT,QAAQ,CAACU,KAAK,EAAAC,QAAA,KAAKH,KAAK;QAAEH,MAAM,EAAEA,MAAO;QAACC,UAAU,EAAEA,UAAW;QAACC,MAAM,EAAEA,MAAO;QAACK,iBAAiB;MAAA,EAAE,CAAC;IAChH,CAAC;IACD,MAAMC,iBAAiBA,CAAC;MAAEC,GAAG;MAAEC,OAAO;MAAEC;IAAU,CAAC,EAAE;MACnD,IAAI;QACF,MAAM;UAAEC;QAAI,CAAC,GAAG,MAAMhB,eAAe,CAACiB,iBAAiB,CAACJ,GAAG,EAAE;UAAEC,OAAO;UAAEI,IAAI,EAAEH;QAAU,CAAC,CAAC;QAC1F,OAAO;UAAEI,IAAI,EAAEH;QAAI,CAAC;MACtB,CAAC,CAAC,MAAM;QACN,OAAO,IAAI;MACb;IACF,CAAC;IACD,MAAMI,aAAaA,CAAC;MAAEC,QAAQ;MAAEC,SAAS;MAAEC,eAAe,GAAG,CAAC;MAAEP;IAAI,CAAC,EAAE;MACrE,MAAMQ,UAAU,GAAG,MAAM5B,QAAQ,CAAC6B,YAAY,CAACT,GAAG,CAAC;MACnD,MAAMU,YAAY,GAAG/B,gBAAgB,CAAC6B,UAAU,EAAE;QAAEG,KAAK,EAAEN,QAAQ;QAAEO,MAAM,EAAEN;MAAU,CAAC,CAAC;MAEzF,MAAM;QAAEN,GAAG,EAAEa;MAAc,CAAC,GAAG,MAAM5B,gBAAgB,CAAC6B,eAAe,CAACd,GAAG,EAAE,CAAC;QAAEe,MAAM,EAAEL;MAAa,CAAC,CAAC,EAAE;QACrGM,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEZ,eAAe,CAAC,EAAE,CAAC;MACpD,CAAC,CAAC;MACF,MAAMa,QAAQ,GAAG,MAAMlC,QAAQ,CAACmC,YAAY,CAACrB,GAAG,CAAC;MAEjD,OAAO;QAAEA,GAAG,EAAEa,aAAa;QAAES,IAAI,EAAEzC,iBAAiB,CAAC0C,UAAU,CAACH,QAAQ;MAAE,CAAC;IAC7E;EACF,CAAC;AACH,CAAC;AAED,eAAetC,sBAAsB","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","Logger","getDownscaleSize","SBUUtils","expoBackwardUtils","LegacyExpoAVVideoAdapter","constructor","avModule","_defineProperty","source","resizeMode","onLoad","props","createElement","Video","_extends","useNativeControls","ExpoVideoAdapter","_videoModule","player","useVideoPlayer","subscription","addListener","eventData","status","error","timeout","setTimeout","clearTimeout","remove","undefined","getContentFit","mode","VideoView","contentFit","createExpoMediaService","thumbnailModule","imageManipulator","fsModule","expoAV","isLegacyAVModule","warn","videoAdapter","isVideoModule","VideoComponent","getVideoThumbnail","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","maxWidth","maxHeight","compressionRate","originSize","getImageSize","resizingSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","fileInfo","getInfoAsync","size","toFileSize"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoFS from 'expo-file-system';\nimport type * as ExpoImageManipulator from 'expo-image-manipulator';\nimport type { EventSubscription } from 'expo-modules-core';\nimport type * as ExpoVideo from 'expo-video';\nimport type { StatusChangeEventPayload } from 'expo-video';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React, { useEffect } from 'react';\n\nimport { Logger, getDownscaleSize } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoVideoModule } from '../utils/expoBackwardUtils';\nimport type { MediaServiceInterface, VideoProps } from './types';\n\ntype Modules = {\n avModule: ExpoVideoModule;\n thumbnailModule: typeof ExpoVideoThumbnail;\n imageManipulator: typeof ExpoImageManipulator;\n fsModule: typeof ExpoFS;\n};\n\ninterface VideoModuleAdapter {\n VideoComponent: React.ComponentType<VideoProps>;\n}\n\nclass LegacyExpoAVVideoAdapter implements VideoModuleAdapter {\n private readonly avModule: typeof ExpoAV;\n constructor(avModule: typeof ExpoAV) {\n this.avModule = avModule;\n }\n\n VideoComponent = ({ source, resizeMode, onLoad, ...props }: VideoProps) => {\n // FIXME: type error https://github.com/expo/expo/issues/17101\n // @ts-ignore\n return <this.avModule.Video {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} useNativeControls />;\n };\n}\n\nclass ExpoVideoAdapter implements VideoModuleAdapter {\n constructor(private readonly _videoModule: typeof ExpoVideo) {}\n\n VideoComponent = ({ source, resizeMode, onLoad, ...props }: VideoProps) => {\n const player = this._videoModule.useVideoPlayer(source);\n\n useEffect(() => {\n if (onLoad && player) {\n let subscription: EventSubscription | null = null;\n try {\n subscription = player.addListener('statusChange', (eventData: StatusChangeEventPayload) => {\n const { status, error } = eventData;\n if (status === 'readyToPlay' && !error) {\n onLoad();\n }\n });\n } catch (error) {\n const timeout = setTimeout(() => onLoad(), 300);\n return () => clearTimeout(timeout);\n }\n\n return () => {\n if (subscription) {\n subscription.remove();\n }\n };\n }\n return undefined;\n }, [onLoad, player]);\n\n const getContentFit = (mode: typeof resizeMode): 'cover' | 'contain' | 'fill' => {\n switch (mode) {\n case 'cover':\n return 'cover';\n case 'contain':\n return 'contain';\n case 'stretch':\n return 'fill';\n default:\n return 'contain';\n }\n };\n\n return React.createElement(this._videoModule.VideoView, {\n ...props,\n player,\n contentFit: getContentFit(resizeMode),\n });\n };\n}\n\nconst createExpoMediaService = ({\n avModule,\n thumbnailModule,\n imageManipulator,\n fsModule,\n}: Modules): MediaServiceInterface => {\n if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {\n Logger.warn(\n '[MediaService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-video.',\n );\n }\n\n const videoAdapter = expoBackwardUtils.expoAV.isVideoModule(avModule)\n ? new ExpoVideoAdapter(avModule)\n : new LegacyExpoAVVideoAdapter(avModule);\n\n return {\n VideoComponent: videoAdapter.VideoComponent,\n async getVideoThumbnail({ url, quality, timeMills }) {\n try {\n const { uri } = await thumbnailModule.getThumbnailAsync(url, { quality, time: timeMills });\n return { path: uri };\n } catch {\n return null;\n }\n },\n async compressImage({ maxWidth, maxHeight, compressionRate = 1, uri }) {\n const originSize = await SBUUtils.getImageSize(uri);\n const resizingSize = getDownscaleSize(originSize, { width: maxWidth, height: maxHeight });\n\n const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {\n compress: Math.min(Math.max(0, compressionRate), 1),\n });\n const fileInfo = await fsModule.getInfoAsync(uri);\n\n return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };\n },\n };\n};\n\nexport default createExpoMediaService;\n"],"mappings":"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","ignoreList":[]}
@@ -2,133 +2,234 @@ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object
2
2
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
3
  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); }
4
4
  import { Logger, matchesOneOf } from '@sendbird/uikit-utils';
5
- import expoPermissionGranted from '../utils/expoPermissionGranted';
6
- const createExpoPlayerService = ({
7
- avModule
8
- }) => {
9
- const sound = new avModule.Audio.Sound();
10
- class VoicePlayer {
11
- constructor() {
12
- _defineProperty(this, "uri", void 0);
13
- _defineProperty(this, "state", 'idle');
14
- _defineProperty(this, "playbackSubscribers", new Set());
15
- _defineProperty(this, "stateSubscribers", new Set());
16
- _defineProperty(this, "setState", state => {
17
- this.state = state;
18
- this.stateSubscribers.forEach(callback => {
19
- callback(state);
20
- });
21
- });
22
- _defineProperty(this, "setListener", () => {
23
- sound.setProgressUpdateIntervalAsync(100).catch(error => {
24
- Logger.warn('[PlayerService.Expo] Failed to set progress update interval', error);
25
- });
26
- sound.setOnPlaybackStatusUpdate(status => {
27
- if (status.isLoaded) {
28
- if (status.didJustFinish) {
29
- this.stop().catch(error => {
30
- Logger.warn('[PlayerService.Expo] Failed to stop in OnPlaybackStatusUpdate', error);
31
- });
32
- }
33
- if (status.isPlaying) {
34
- this.playbackSubscribers.forEach(callback => {
35
- callback({
36
- currentTime: status.positionMillis,
37
- duration: status.durationMillis ?? 0,
38
- stopped: status.didJustFinish
39
- });
40
- });
41
- }
42
- }
43
- });
5
+ import expoBackwardUtils from '../utils/expoBackwardUtils';
6
+ class BaseAudioPlayerAdapter {
7
+ constructor() {
8
+ _defineProperty(this, "uri", void 0);
9
+ _defineProperty(this, "state", 'idle');
10
+ _defineProperty(this, "playbackSubscribers", new Set());
11
+ _defineProperty(this, "stateSubscribers", new Set());
12
+ _defineProperty(this, "setState", state => {
13
+ this.state = state;
14
+ this.stateSubscribers.forEach(callback => {
15
+ callback(state);
44
16
  });
45
- _defineProperty(this, "removeListener", () => {
46
- sound.setOnPlaybackStatusUpdate(null);
47
- });
48
- _defineProperty(this, "requestPermission", async () => {
49
- const status = await avModule.Audio.getPermissionsAsync();
50
- if (expoPermissionGranted([status])) {
51
- return true;
52
- } else {
53
- const status = await avModule.Audio.requestPermissionsAsync();
54
- return expoPermissionGranted([status]);
55
- }
56
- });
57
- _defineProperty(this, "addPlaybackListener", callback => {
58
- this.playbackSubscribers.add(callback);
59
- return () => {
60
- this.playbackSubscribers.delete(callback);
61
- };
62
- });
63
- _defineProperty(this, "addStateListener", callback => {
64
- this.stateSubscribers.add(callback);
65
- return () => {
66
- this.stateSubscribers.delete(callback);
67
- };
68
- });
69
- _defineProperty(this, "prepare", async uri => {
70
- this.setState('preparing');
71
- await sound.loadAsync({
72
- uri
73
- }, {
74
- shouldPlay: false
75
- }, true);
76
- this.uri = uri;
17
+ });
18
+ _defineProperty(this, "requestPermission", async () => {
19
+ return true;
20
+ });
21
+ _defineProperty(this, "addPlaybackListener", callback => {
22
+ this.playbackSubscribers.add(callback);
23
+ return () => {
24
+ this.playbackSubscribers.delete(callback);
25
+ };
26
+ });
27
+ _defineProperty(this, "addStateListener", callback => {
28
+ this.stateSubscribers.add(callback);
29
+ return () => {
30
+ this.stateSubscribers.delete(callback);
31
+ };
32
+ });
33
+ }
34
+ }
35
+ class LegacyExpoAVPlayerAdapter extends BaseAudioPlayerAdapter {
36
+ constructor(avModule) {
37
+ super();
38
+ _defineProperty(this, "sound", void 0);
39
+ _defineProperty(this, "setListener", () => {
40
+ this.sound.setProgressUpdateIntervalAsync(100).catch(error => {
41
+ Logger.warn('[PlayerService.Expo] Failed to set progress update interval', error);
77
42
  });
78
- _defineProperty(this, "play", async uri => {
79
- if (matchesOneOf(this.state, ['idle', 'stopped'])) {
80
- try {
81
- await this.prepare(uri);
82
- this.setListener();
83
- await sound.playAsync();
84
- this.setState('playing');
85
- } catch (e) {
86
- this.setState('idle');
87
- this.uri = undefined;
88
- this.removeListener();
89
- throw e;
43
+ this.sound.setOnPlaybackStatusUpdate(status => {
44
+ if (status.isLoaded) {
45
+ if (status.didJustFinish) {
46
+ this.stop().catch(error => {
47
+ Logger.warn('[PlayerService.Expo] Failed to stop in OnPlaybackStatusUpdate', error);
48
+ });
90
49
  }
91
- } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {
92
- try {
93
- this.setListener();
94
- await sound.playAsync();
95
- this.setState('playing');
96
- } catch (e) {
97
- this.removeListener();
98
- throw e;
50
+ if (status.isPlaying) {
51
+ this.playbackSubscribers.forEach(callback => {
52
+ callback({
53
+ currentTime: status.positionMillis,
54
+ duration: status.durationMillis ?? 0,
55
+ stopped: status.didJustFinish
56
+ });
57
+ });
99
58
  }
100
59
  }
101
60
  });
102
- _defineProperty(this, "pause", async () => {
103
- if (matchesOneOf(this.state, ['playing'])) {
104
- await sound.pauseAsync();
61
+ });
62
+ _defineProperty(this, "removeListener", () => {
63
+ this.sound.setOnPlaybackStatusUpdate(null);
64
+ });
65
+ _defineProperty(this, "prepare", async uri => {
66
+ this.setState('preparing');
67
+ await this.sound.loadAsync({
68
+ uri
69
+ }, {
70
+ shouldPlay: false
71
+ }, true);
72
+ this.uri = uri;
73
+ });
74
+ _defineProperty(this, "play", async uri => {
75
+ if (matchesOneOf(this.state, ['idle', 'stopped'])) {
76
+ try {
77
+ await this.prepare(uri);
78
+ this.setListener();
79
+ await this.sound.playAsync();
80
+ this.setState('playing');
81
+ } catch (e) {
82
+ this.setState('idle');
83
+ this.uri = undefined;
105
84
  this.removeListener();
106
- this.setState('paused');
85
+ throw e;
107
86
  }
108
- });
109
- _defineProperty(this, "stop", async () => {
110
- if (matchesOneOf(this.state, ['playing', 'paused'])) {
111
- await sound.stopAsync();
112
- await sound.unloadAsync();
87
+ } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {
88
+ try {
89
+ this.setListener();
90
+ await this.sound.playAsync();
91
+ this.setState('playing');
92
+ } catch (e) {
113
93
  this.removeListener();
114
- this.setState('stopped');
94
+ throw e;
95
+ }
96
+ }
97
+ });
98
+ _defineProperty(this, "pause", async () => {
99
+ if (matchesOneOf(this.state, ['playing'])) {
100
+ await this.sound.pauseAsync();
101
+ this.removeListener();
102
+ this.setState('paused');
103
+ }
104
+ });
105
+ _defineProperty(this, "stop", async () => {
106
+ if (matchesOneOf(this.state, ['playing', 'paused'])) {
107
+ await this.sound.stopAsync();
108
+ await this.sound.unloadAsync();
109
+ this.removeListener();
110
+ this.setState('stopped');
111
+ }
112
+ });
113
+ _defineProperty(this, "reset", async () => {
114
+ await this.stop();
115
+ this.setState('idle');
116
+ this.uri = undefined;
117
+ this.playbackSubscribers.clear();
118
+ this.stateSubscribers.clear();
119
+ });
120
+ _defineProperty(this, "seek", async time => {
121
+ if (matchesOneOf(this.state, ['playing', 'paused'])) {
122
+ await this.sound.playFromPositionAsync(time);
123
+ }
124
+ });
125
+ this.sound = new avModule.Audio.Sound();
126
+ }
127
+ }
128
+ class ExpoAudioPlayerAdapter extends BaseAudioPlayerAdapter {
129
+ constructor(audioModule) {
130
+ super();
131
+ _defineProperty(this, "audioModule", void 0);
132
+ _defineProperty(this, "player", null);
133
+ _defineProperty(this, "setListener", () => {
134
+ if (!this.player) return;
135
+ this.player.addListener('playbackStatusUpdate', status => {
136
+ if (status.isLoaded) {
137
+ if (status.didJustFinish) {
138
+ this.stop().catch(error => {
139
+ Logger.warn('[PlayerService.Expo] Failed to stop in playbackStatusUpdate', error);
140
+ });
141
+ }
142
+ if (status.playing) {
143
+ this.playbackSubscribers.forEach(callback => {
144
+ callback({
145
+ currentTime: status.currentTime,
146
+ duration: status.duration ?? 0,
147
+ stopped: status.didJustFinish
148
+ });
149
+ });
150
+ }
115
151
  }
116
152
  });
117
- _defineProperty(this, "reset", async () => {
118
- await this.stop();
119
- this.setState('idle');
120
- this.uri = undefined;
121
- this.playbackSubscribers.clear();
122
- this.stateSubscribers.clear();
153
+ });
154
+ _defineProperty(this, "removeListener", () => {
155
+ if (this.player) {
156
+ this.player.remove();
157
+ }
158
+ });
159
+ _defineProperty(this, "prepare", async uri => {
160
+ this.setState('preparing');
161
+ this.player = this.audioModule.createAudioPlayer(uri, {
162
+ updateInterval: 100
123
163
  });
124
- _defineProperty(this, "seek", async time => {
125
- if (matchesOneOf(this.state, ['playing', 'paused'])) {
126
- await sound.playFromPositionAsync(time);
164
+ this.uri = uri;
165
+ });
166
+ _defineProperty(this, "play", async uri => {
167
+ if (matchesOneOf(this.state, ['idle', 'stopped'])) {
168
+ try {
169
+ var _this$player;
170
+ await this.prepare(uri);
171
+ this.setListener();
172
+ (_this$player = this.player) === null || _this$player === void 0 || _this$player.play();
173
+ this.setState('playing');
174
+ } catch (e) {
175
+ this.setState('idle');
176
+ this.uri = undefined;
177
+ this.removeListener();
178
+ throw e;
127
179
  }
128
- });
129
- }
180
+ } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {
181
+ try {
182
+ var _this$player2;
183
+ this.setListener();
184
+ (_this$player2 = this.player) === null || _this$player2 === void 0 || _this$player2.play();
185
+ this.setState('playing');
186
+ } catch (e) {
187
+ this.removeListener();
188
+ throw e;
189
+ }
190
+ }
191
+ });
192
+ _defineProperty(this, "pause", async () => {
193
+ if (matchesOneOf(this.state, ['playing'])) {
194
+ var _this$player3;
195
+ (_this$player3 = this.player) === null || _this$player3 === void 0 || _this$player3.pause();
196
+ this.removeListener();
197
+ this.setState('paused');
198
+ }
199
+ });
200
+ _defineProperty(this, "stop", async () => {
201
+ if (matchesOneOf(this.state, ['playing', 'paused'])) {
202
+ var _this$player4;
203
+ (_this$player4 = this.player) === null || _this$player4 === void 0 || _this$player4.pause();
204
+ this.removeListener();
205
+ this.setState('stopped');
206
+ }
207
+ });
208
+ _defineProperty(this, "reset", async () => {
209
+ var _this$player5;
210
+ await this.stop();
211
+ (_this$player5 = this.player) === null || _this$player5 === void 0 || _this$player5.remove();
212
+ this.player = null;
213
+ this.setState('idle');
214
+ this.uri = undefined;
215
+ this.playbackSubscribers.clear();
216
+ this.stateSubscribers.clear();
217
+ });
218
+ _defineProperty(this, "seek", async time => {
219
+ if (matchesOneOf(this.state, ['playing', 'paused']) && this.player) {
220
+ this.player.currentTime = time;
221
+ }
222
+ });
223
+ this.audioModule = audioModule;
224
+ }
225
+ }
226
+ const createExpoPlayerService = ({
227
+ avModule
228
+ }) => {
229
+ if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {
230
+ Logger.warn('[PlayerService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-audio.');
130
231
  }
131
- return new VoicePlayer();
232
+ return expoBackwardUtils.expoAV.isAudioModule(avModule) ? new ExpoAudioPlayerAdapter(avModule) : new LegacyExpoAVPlayerAdapter(avModule);
132
233
  };
133
234
  export default createExpoPlayerService;
134
235
  //# sourceMappingURL=createPlayerService.expo.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","matchesOneOf","expoPermissionGranted","createExpoPlayerService","avModule","sound","Audio","Sound","VoicePlayer","constructor","_defineProperty","Set","state","stateSubscribers","forEach","callback","setProgressUpdateIntervalAsync","catch","error","warn","setOnPlaybackStatusUpdate","status","isLoaded","didJustFinish","stop","isPlaying","playbackSubscribers","currentTime","positionMillis","duration","durationMillis","stopped","getPermissionsAsync","requestPermissionsAsync","add","delete","uri","setState","loadAsync","shouldPlay","prepare","setListener","playAsync","e","undefined","removeListener","pauseAsync","stopAsync","unloadAsync","clear","time","playFromPositionAsync"],"sources":["createPlayerService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\n\nimport { Logger, matchesOneOf } from '@sendbird/uikit-utils';\n\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createExpoPlayerService = ({ avModule }: Modules): PlayerServiceInterface => {\n const sound = new avModule.Audio.Sound();\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 private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n sound.setProgressUpdateIntervalAsync(100).catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to set progress update interval', error);\n });\n sound.setOnPlaybackStatusUpdate((status) => {\n if (status.isLoaded) {\n if (status.didJustFinish) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to stop in OnPlaybackStatusUpdate', error);\n });\n }\n if (status.isPlaying) {\n this.playbackSubscribers.forEach((callback) => {\n callback({\n currentTime: status.positionMillis,\n duration: status.durationMillis ?? 0,\n stopped: status.didJustFinish,\n });\n });\n }\n }\n });\n };\n\n private removeListener = () => {\n sound.setOnPlaybackStatusUpdate(null);\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 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 private prepare = async (uri: string) => {\n this.setState('preparing');\n await sound.loadAsync({ uri }, { shouldPlay: false }, true);\n this.uri = uri;\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n await this.prepare(uri);\n this.setListener();\n await sound.playAsync();\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 sound.playAsync();\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 sound.pauseAsync();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.stopAsync();\n await sound.unloadAsync();\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 sound.playFromPositionAsync(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createExpoPlayerService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Logger","matchesOneOf","expoBackwardUtils","BaseAudioPlayerAdapter","constructor","_defineProperty","Set","state","stateSubscribers","forEach","callback","playbackSubscribers","add","delete","LegacyExpoAVPlayerAdapter","avModule","sound","setProgressUpdateIntervalAsync","catch","error","warn","setOnPlaybackStatusUpdate","status","isLoaded","didJustFinish","stop","isPlaying","currentTime","positionMillis","duration","durationMillis","stopped","uri","setState","loadAsync","shouldPlay","prepare","setListener","playAsync","e","undefined","removeListener","pauseAsync","stopAsync","unloadAsync","clear","time","playFromPositionAsync","Audio","Sound","ExpoAudioPlayerAdapter","audioModule","player","addListener","playing","remove","createAudioPlayer","updateInterval","_this$player","play","_this$player2","_this$player3","pause","_this$player4","_this$player5","createExpoPlayerService","expoAV","isLegacyAVModule","isAudioModule"],"sources":["createPlayerService.expo.tsx"],"sourcesContent":["import type * as ExpoAudio from 'expo-audio';\nimport type * as ExpoAV from 'expo-av';\n\nimport { Logger, matchesOneOf } from '@sendbird/uikit-utils';\n\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoAudioModule } from '../utils/expoBackwardUtils';\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n avModule: ExpoAudioModule;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\n\ninterface AudioPlayerAdapter {\n requestPermission(): Promise<boolean>;\n play(uri: string): Promise<void>;\n pause(): Promise<void>;\n stop(): Promise<void>;\n reset(): Promise<void>;\n seek(time: number): Promise<void>;\n addPlaybackListener(callback: PlaybackListener): Unsubscribe;\n addStateListener(callback: StateListener): Unsubscribe;\n readonly state: PlayerServiceInterface['state'];\n uri?: string;\n}\n\nabstract class BaseAudioPlayerAdapter implements AudioPlayerAdapter {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n protected readonly playbackSubscribers = new Set<PlaybackListener>();\n protected readonly stateSubscribers = new Set<StateListener>();\n\n protected setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n return true;\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: StateListener): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n abstract play(uri: string): Promise<void>;\n abstract pause(): Promise<void>;\n abstract stop(): Promise<void>;\n abstract reset(): Promise<void>;\n abstract seek(time: number): Promise<void>;\n}\n\nclass LegacyExpoAVPlayerAdapter extends BaseAudioPlayerAdapter {\n private readonly sound: ExpoAV.Audio.Sound;\n\n constructor(avModule: typeof ExpoAV) {\n super();\n this.sound = new avModule.Audio.Sound();\n }\n\n private setListener = () => {\n this.sound.setProgressUpdateIntervalAsync(100).catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to set progress update interval', error);\n });\n this.sound.setOnPlaybackStatusUpdate((status) => {\n if (status.isLoaded) {\n if (status.didJustFinish) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to stop in OnPlaybackStatusUpdate', error);\n });\n }\n if (status.isPlaying) {\n this.playbackSubscribers.forEach((callback) => {\n callback({\n currentTime: status.positionMillis,\n duration: status.durationMillis ?? 0,\n stopped: status.didJustFinish,\n });\n });\n }\n }\n });\n };\n\n private removeListener = () => {\n this.sound.setOnPlaybackStatusUpdate(null);\n };\n\n private prepare = async (uri: string) => {\n this.setState('preparing');\n await this.sound.loadAsync({ uri }, { shouldPlay: false }, true);\n this.uri = uri;\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n await this.prepare(uri);\n this.setListener();\n await this.sound.playAsync();\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.sound.playAsync();\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.sound.pauseAsync();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await this.sound.stopAsync();\n await this.sound.unloadAsync();\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.sound.playFromPositionAsync(time);\n }\n };\n}\n\nclass ExpoAudioPlayerAdapter extends BaseAudioPlayerAdapter {\n private readonly audioModule: typeof ExpoAudio;\n private player: ExpoAudio.AudioPlayer | null = null;\n\n constructor(audioModule: typeof ExpoAudio) {\n super();\n this.audioModule = audioModule;\n }\n\n private setListener = () => {\n if (!this.player) return;\n\n this.player.addListener('playbackStatusUpdate', (status) => {\n if (status.isLoaded) {\n if (status.didJustFinish) {\n this.stop().catch((error) => {\n Logger.warn('[PlayerService.Expo] Failed to stop in playbackStatusUpdate', error);\n });\n }\n if (status.playing) {\n this.playbackSubscribers.forEach((callback) => {\n callback({\n currentTime: status.currentTime,\n duration: status.duration ?? 0,\n stopped: status.didJustFinish,\n });\n });\n }\n }\n });\n };\n\n private removeListener = () => {\n if (this.player) {\n this.player.remove();\n }\n };\n\n private prepare = async (uri: string) => {\n this.setState('preparing');\n this.player = this.audioModule.createAudioPlayer(uri, { updateInterval: 100 });\n this.uri = uri;\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n await this.prepare(uri);\n this.setListener();\n this.player?.play();\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 this.player?.play();\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 this.player?.pause();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n this.player?.pause();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.player?.remove();\n this.player = null;\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']) && this.player) {\n this.player.currentTime = time;\n }\n };\n}\n\nconst createExpoPlayerService = ({ avModule }: Modules): PlayerServiceInterface => {\n if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {\n Logger.warn(\n '[PlayerService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-audio.',\n );\n }\n\n return expoBackwardUtils.expoAV.isAudioModule(avModule)\n ? new ExpoAudioPlayerAdapter(avModule)\n : new LegacyExpoAVPlayerAdapter(avModule);\n};\n\nexport default createExpoPlayerService;\n"],"mappings":"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","ignoreList":[]}