@sendbird/uikit-react-native
Version:
Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.
143 lines • 4.76 kB
JavaScript
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); }
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; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
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); }
import React, { useEffect } from 'react';
import { Logger, getDownscaleSize } from '@sendbird/uikit-utils';
import SBUUtils from '../libs/SBUUtils';
import expoBackwardUtils from '../utils/expoBackwardUtils';
class LegacyExpoAVVideoAdapter {
constructor(avModule) {
_defineProperty(this, "avModule", void 0);
_defineProperty(this, "VideoComponent", ({
source,
resizeMode,
onLoad,
...props
}) => {
// FIXME: type error https://github.com/expo/expo/issues/17101
// @ts-ignore
return /*#__PURE__*/React.createElement(this.avModule.Video, _extends({}, props, {
source: source,
resizeMode: resizeMode,
onLoad: onLoad,
useNativeControls: true
}));
});
this.avModule = avModule;
}
}
class ExpoVideoAdapter {
constructor(_videoModule) {
this._videoModule = _videoModule;
_defineProperty(this, "VideoComponent", ({
source,
resizeMode,
onLoad,
...props
}) => {
const player = this._videoModule.useVideoPlayer(source);
useEffect(() => {
if (onLoad && player) {
let subscription = null;
try {
subscription = player.addListener('statusChange', eventData => {
const {
status,
error
} = eventData;
if (status === 'readyToPlay' && !error) {
onLoad();
}
});
} catch (error) {
const timeout = setTimeout(() => onLoad(), 300);
return () => clearTimeout(timeout);
}
return () => {
if (subscription) {
subscription.remove();
}
};
}
return undefined;
}, [onLoad, player]);
const getContentFit = mode => {
switch (mode) {
case 'cover':
return 'cover';
case 'contain':
return 'contain';
case 'stretch':
return 'fill';
default:
return 'contain';
}
};
return /*#__PURE__*/React.createElement(this._videoModule.VideoView, {
...props,
player,
contentFit: getContentFit(resizeMode)
});
});
}
}
const createExpoMediaService = ({
avModule,
thumbnailModule,
imageManipulator,
fsModule
}) => {
if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {
Logger.warn('[MediaService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-video.');
}
const videoAdapter = expoBackwardUtils.expoAV.isVideoModule(avModule) ? new ExpoVideoAdapter(avModule) : new LegacyExpoAVVideoAdapter(avModule);
return {
VideoComponent: videoAdapter.VideoComponent,
async getVideoThumbnail({
url,
quality,
timeMills
}) {
try {
const {
uri
} = await thumbnailModule.getThumbnailAsync(url, {
quality,
time: timeMills
});
return {
path: uri
};
} catch {
return null;
}
},
async compressImage({
maxWidth,
maxHeight,
compressionRate = 1,
uri
}) {
const originSize = await SBUUtils.getImageSize(uri);
const resizingSize = getDownscaleSize(originSize, {
width: maxWidth,
height: maxHeight
});
const {
uri: compressedURI
} = await imageManipulator.manipulateAsync(uri, [{
resize: resizingSize
}], {
compress: Math.min(Math.max(0, compressionRate), 1)
});
const fileInfo = await expoBackwardUtils.fileSystem.getFileInfo(fsModule, uri);
return {
uri: compressedURI,
size: expoBackwardUtils.toFileSize(fileInfo)
};
}
};
};
export default createExpoMediaService;
//# sourceMappingURL=createMediaService.expo.js.map