diff options
author | Paul Frazee <pfrazee@gmail.com> | 2022-11-16 13:05:36 -0600 |
---|---|---|
committer | Paul Frazee <pfrazee@gmail.com> | 2022-11-16 13:05:36 -0600 |
commit | 17825cd611c3bbc47fe55b5e7dfe1a39fdca2274 (patch) | |
tree | d60bfbc55eee788316b991728683557303a9b8f8 /src/view/com/util/LoadingPlaceholder.tsx | |
parent | e003f2e3cbbdfe2f8b709c1a7f1dbbcfb5e7e5f0 (diff) | |
download | voidsky-17825cd611c3bbc47fe55b5e7dfe1a39fdca2274.tar.zst |
Add placeholder loading states
Diffstat (limited to 'src/view/com/util/LoadingPlaceholder.tsx')
-rw-r--r-- | src/view/com/util/LoadingPlaceholder.tsx | 122 |
1 files changed, 119 insertions, 3 deletions
diff --git a/src/view/com/util/LoadingPlaceholder.tsx b/src/view/com/util/LoadingPlaceholder.tsx index 55b6ad1b3..c198407de 100644 --- a/src/view/com/util/LoadingPlaceholder.tsx +++ b/src/view/com/util/LoadingPlaceholder.tsx @@ -1,13 +1,16 @@ import React, {useEffect, useMemo} from 'react' import { Animated, + StyleSheet, StyleProp, useWindowDimensions, View, ViewStyle, } from 'react-native' import LinearGradient from 'react-native-linear-gradient' -import {colors} from '../../lib/styles' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import {UpIcon, DownIcon} from '../../lib/icons' +import {s, colors} from '../../lib/styles' export function LoadingPlaceholder({ width, @@ -49,7 +52,7 @@ export function LoadingPlaceholder({ { width, height, - backgroundColor: colors.gray2, + backgroundColor: '#e7e9ea', borderRadius: 6, overflow: 'hidden', }, @@ -62,7 +65,7 @@ export function LoadingPlaceholder({ transform: [{translateX: offset}], }}> <LinearGradient - colors={[colors.gray2, '#d4d2d2', colors.gray2]} + colors={['#e7e9ea', '#e2e2e2', '#e7e9ea']} start={{x: 0, y: 0}} end={{x: 1, y: 0}} style={{width: '100%', height: '100%'}} @@ -71,3 +74,116 @@ export function LoadingPlaceholder({ </View> ) } + +export function PostLoadingPlaceholder({ + style, +}: { + style?: StyleProp<ViewStyle> +}) { + return ( + <View style={[styles.post, style]}> + <LoadingPlaceholder width={50} height={50} style={styles.avatar} /> + <View style={[s.flex1]}> + <LoadingPlaceholder width={100} height={8} style={[s.mb10]} /> + <LoadingPlaceholder width={200} height={8} style={[s.mb5]} /> + <LoadingPlaceholder width={200} height={8} style={[s.mb5]} /> + <LoadingPlaceholder width={120} height={8} style={[s.mb10]} /> + <View style={s.flexRow}> + <View style={s.flex1}> + <FontAwesomeIcon + style={s.gray3} + icon={['far', 'comment']} + size={14} + /> + </View> + <View style={s.flex1}> + <FontAwesomeIcon style={s.gray3} icon="retweet" size={18} /> + </View> + <View style={s.flex1}> + <UpIcon style={s.gray3} size={18} /> + </View> + <View style={s.flex1}> + <DownIcon style={s.gray3} size={18} /> + </View> + </View> + </View> + </View> + ) +} + +export function PostFeedLoadingPlaceholder() { + return ( + <> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + <PostLoadingPlaceholder /> + </> + ) +} + +export function NotificationLoadingPlaceholder({ + style, +}: { + style?: StyleProp<ViewStyle> +}) { + return ( + <View style={[styles.notification, style]}> + <View style={[s.flexRow, s.mb10]}> + <LoadingPlaceholder width={30} height={30} style={styles.smallAvatar} /> + </View> + <LoadingPlaceholder width={200} height={8} style={[s.mb5]} /> + <LoadingPlaceholder width={120} height={8} style={[s.mb5]} /> + </View> + ) +} + +export function NotificationFeedLoadingPlaceholder() { + return ( + <> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + <NotificationLoadingPlaceholder /> + </> + ) +} + +const styles = StyleSheet.create({ + post: { + flexDirection: 'row', + backgroundColor: colors.white, + borderRadius: 6, + padding: 10, + margin: 1, + }, + avatar: { + borderRadius: 25, + marginRight: 10, + }, + notification: { + backgroundColor: colors.white, + borderRadius: 6, + padding: 10, + paddingLeft: 46, + margin: 1, + }, + smallAvatar: { + borderRadius: 15, + marginRight: 10, + }, +}) |