import React from 'react' import { Animated, StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle, } from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import ReactNativeHapticFeedback from 'react-native-haptic-feedback' import {Text} from './text/Text' import {PostDropdownBtn} from './forms/DropdownButton' import { HeartIcon, HeartIconSolid, RepostIcon, CommentBottomArrow, } from '../../lib/icons' import {s, colors} from '../../lib/styles' import {useTheme} from '../../lib/ThemeContext' import {useAnimatedValue} from '../../lib/hooks/useAnimatedValue' interface PostCtrlsOpts { itemHref: string itemTitle: string isAuthor: boolean big?: boolean style?: StyleProp replyCount?: number repostCount?: number upvoteCount?: number isReposted: boolean isUpvoted: boolean onPressReply: () => void onPressToggleRepost: () => void onPressToggleUpvote: () => void onCopyPostText: () => void onDeletePost: () => void } const HITSLOP = {top: 2, left: 2, bottom: 2, right: 2} export function PostCtrls(opts: PostCtrlsOpts) { const theme = useTheme() const defaultCtrlColor = React.useMemo( () => ({ color: theme.palette.default.postCtrl, }), [theme], ) const interp1 = useAnimatedValue(0) const interp2 = useAnimatedValue(0) const anim1Style = { transform: [ { scale: interp1.interpolate({ inputRange: [0, 1.0], outputRange: [1.0, 4.0], }), }, ], opacity: interp1.interpolate({ inputRange: [0, 1.0], outputRange: [1.0, 0.0], }), } const anim2Style = { transform: [ { scale: interp2.interpolate({ inputRange: [0, 1.0], outputRange: [1.0, 4.0], }), }, ], opacity: interp2.interpolate({ inputRange: [0, 1.0], outputRange: [1.0, 0.0], }), } const onPressToggleRepostWrapper = () => { if (!opts.isReposted) { ReactNativeHapticFeedback.trigger('impactMedium') Animated.sequence([ Animated.timing(interp1, { toValue: 1, duration: 400, useNativeDriver: true, }), Animated.delay(100), Animated.timing(interp1, { toValue: 0, duration: 20, useNativeDriver: true, }), ]).start() } opts.onPressToggleRepost() } const onPressToggleUpvoteWrapper = () => { if (!opts.isUpvoted) { ReactNativeHapticFeedback.trigger('impactMedium') Animated.sequence([ Animated.timing(interp2, { toValue: 1, duration: 400, useNativeDriver: true, }), Animated.delay(100), Animated.timing(interp2, { toValue: 0, duration: 20, useNativeDriver: true, }), ]).start() } opts.onPressToggleUpvote() } return ( {typeof opts.replyCount !== 'undefined' ? ( {opts.replyCount} ) : undefined} {typeof opts.repostCount !== 'undefined' ? ( {opts.repostCount} ) : undefined} {opts.isUpvoted ? ( ) : ( )} {typeof opts.upvoteCount !== 'undefined' ? ( {opts.upvoteCount} ) : undefined} {opts.big ? undefined : ( )} ) } const styles = StyleSheet.create({ ctrls: { flexDirection: 'row', }, ctrl: { flexDirection: 'row', alignItems: 'center', }, ctrlIconReposted: { color: colors.green3, }, ctrlIconUpvoted: { color: colors.red3, }, })