stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
124 lines • 5.81 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ProgressControl = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _reactNativeGestureHandler = require("react-native-gesture-handler");
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
var _ProgressThumb = require("./ProgressThumb");
var _ThemeContext = require("../../contexts/themeContext/ThemeContext");
var _theme = require("../../theme");
var _jsxRuntime = require("react/jsx-runtime");
var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/ProgressControl/ProgressControl.tsx";
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
var TRACK_HEIGHT = 3;
var EXPANDED_TOUCH_SLOP = 12;
var ProgressControl = props => {
var expandedTouchArea = props.expandedTouchArea,
isPlaying = props.isPlaying,
onEndDrag = props.onEndDrag,
onStartDrag = props.onStartDrag,
progress = props.progress,
testID = props.testID;
var styles = useStyles();
var _useState = (0, _react.useState)(0),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
widthInNumbers = _useState2[0],
setWidthInNumbers = _useState2[1];
var isRTL = _reactNative.I18nManager.isRTL;
var thumbDirectionMultiplier = isRTL ? -1 : 1;
var state = (0, _reactNativeReanimated.useSharedValue)(progress);
var isSeekable = onEndDrag !== undefined;
var _useTheme = (0, _ThemeContext.useTheme)(),
_useTheme$theme$progr = _useTheme.theme.progressControl,
container = _useTheme$theme$progr.container,
filledStyles = _useTheme$theme$progr.filledStyles,
thumb = _useTheme$theme$progr.thumb;
(0, _reactNativeReanimated.useAnimatedReaction)(() => progress, newProgress => {
state.value = newProgress;
}, [progress]);
var pan = (0, _react.useMemo)(() => {
var gesture = _reactNativeGestureHandler.Gesture.Pan().enabled(isSeekable).maxPointers(1).onStart(() => {
if (onStartDrag) {
(0, _reactNativeReanimated.runOnJS)(onStartDrag)(state.value);
}
}).onUpdate(event => {
var nextProgress = isRTL ? 1 - event.x / widthInNumbers : event.x / widthInNumbers;
state.value = Math.max(0, Math.min(nextProgress, 1));
}).onEnd(() => {
if (onEndDrag) {
(0, _reactNativeReanimated.runOnJS)(onEndDrag)(state.value);
}
}).withTestId(testID);
if (expandedTouchArea) {
gesture.hitSlop({
bottom: EXPANDED_TOUCH_SLOP,
top: EXPANDED_TOUCH_SLOP
});
}
return gesture;
}, [expandedTouchArea, isRTL, isSeekable, onEndDrag, onStartDrag, state, testID, widthInNumbers]);
var thumbStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
transform: [{
translateX: (0, _reactNativeReanimated.interpolate)(state.value, [0, 1], [0, (widthInNumbers - _ProgressThumb.PROGRESS_THUMB_WIDTH / 2) * thumbDirectionMultiplier])
}],
position: 'absolute'
}), [thumbDirectionMultiplier, widthInNumbers]);
var animatedFilledStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
width: state.value * widthInNumbers
}), [widthInNumbers]);
var progressPercent = Math.round(progress * 100);
var accessibilityValue = (0, _react.useMemo)(() => ({
max: 100,
min: 0,
now: progressPercent
}), [progressPercent]);
return (0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
gesture: pan,
children: (0, _jsxRuntime.jsxs)(_reactNative.View, {
accessibilityRole: onEndDrag ? 'adjustable' : 'progressbar',
accessibilityValue: accessibilityValue,
onLayout: ({
nativeEvent
}) => {
setWidthInNumbers(nativeEvent.layout.width);
},
style: [styles.container, container],
children: [(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
style: [styles.filledStyle, animatedFilledStyles, filledStyles]
}), (0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
style: [thumbStyles, thumb],
children: onEndDrag ? (0, _jsxRuntime.jsx)(_ProgressThumb.ProgressControlThumb, {
isPlaying: isPlaying
}) : null
})]
})
});
};
exports.ProgressControl = ProgressControl;
var useStyles = () => {
var _useTheme2 = (0, _ThemeContext.useTheme)(),
semantics = _useTheme2.theme.semantics;
return (0, _react.useMemo)(() => {
return _reactNative.StyleSheet.create({
container: {
borderRadius: _theme.primitives.radiusMax,
height: TRACK_HEIGHT,
alignItems: 'center',
flexDirection: 'row',
backgroundColor: semantics.chatWaveformBar
},
filledStyle: {
alignSelf: 'center',
borderRadius: _theme.primitives.radiusMax,
height: TRACK_HEIGHT,
backgroundColor: semantics.chatWaveformBarPlaying
}
});
}, [semantics.chatWaveformBar, semantics.chatWaveformBarPlaying]);
};
ProgressControl.displayName = 'ProgressControl';
//# sourceMappingURL=ProgressControl.js.map