UNPKG

@polls-platform/react-native

Version:

React Native SDK for Polls Platform

125 lines (118 loc) 3.38 kB
// react import React from 'react'; import { ActivityIndicator, Animated, Image, StyleSheet, Text, View } from 'react-native'; // @polls-platform/core import { ANIMATION_DURATION, getThemeProperties } from '@polls-platform/core/built/internal'; const LoadingView = _ref => { let { isVisible, title, imageUrl, theme } = _ref; // animations const imageOpacity = React.useRef(new Animated.Value(0)).current; // initial const titleOpacity = React.useRef(new Animated.Value(0)).current; // initial const spinnerOpacity = React.useRef(new Animated.Value(0)).current; // initial // show/hide React.useEffect(() => { const initialDelay = isVisible ? 400 : 0; const cascadeDelay = isVisible ? 80 : 0; Animated.timing(imageOpacity, { toValue: isVisible ? 1 : 0, duration: ANIMATION_DURATION, useNativeDriver: true, delay: initialDelay }).start(); Animated.timing(titleOpacity, { toValue: isVisible ? 1 : 0, duration: ANIMATION_DURATION, useNativeDriver: true, delay: initialDelay + 1 * cascadeDelay }).start(); Animated.timing(spinnerOpacity, { toValue: isVisible ? 1 : 0, duration: ANIMATION_DURATION, useNativeDriver: true, delay: initialDelay + 2 * cascadeDelay }).start(); // we do not want to run this if the animation ref changes // eslint-disable-next-line react-hooks/exhaustive-deps }, [isVisible]); const themeProperties = getThemeProperties(theme); const styles = createStyles({ themeProperties }); return /*#__PURE__*/React.createElement(View, { style: styles.container }, /*#__PURE__*/React.createElement(Animated.View, { style: { ...styles.imageContainer, opacity: imageOpacity } }, /*#__PURE__*/React.createElement(Image, { style: styles.image, source: { uri: imageUrl } })), /*#__PURE__*/React.createElement(Animated.View, { style: { ...styles.titleContainer, opacity: titleOpacity } }, /*#__PURE__*/React.createElement(Text, { style: styles.titleText }, title)), /*#__PURE__*/React.createElement(Animated.View, { style: { ...styles.spinner, opacity: spinnerOpacity } }, /*#__PURE__*/React.createElement(ActivityIndicator, { size: "large", color: themeProperties.colors.loadingIndicatorColor }))); }; const createStyles = styleProps => { const { themeProperties } = styleProps; const { colors: themeColors } = themeProperties; const styles = StyleSheet.create({ container: { position: 'absolute', width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'flex-start', backgroundColor: themeColors.backgroundColor }, imageContainer: { marginTop: 100, padding: 20, width: '100%', height: 100 }, image: { width: '100%', height: '100%', resizeMode: 'contain' }, titleContainer: { marginTop: 20 }, titleText: { fontSize: 26, fontWeight: '600', color: themeColors.loadingTitleColor }, spinner: { position: 'absolute', bottom: 100, width: '100%', height: 80, justifyContent: 'center', alignItems: 'center' } }); return styles; }; export { LoadingView }; //# sourceMappingURL=index.js.map