import React from 'react' import { StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle, } from 'react-native' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import ReactNativeHapticFeedback from 'react-native-haptic-feedback' // DISABLED see #135 // import { // TriggerableAnimated, // TriggerableAnimatedRef, // } from './anim/TriggerableAnimated' 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 {useStores} from 'state/index' interface PostCtrlsOpts { itemUri: string itemCid: string itemHref: string itemTitle: string isAuthor: boolean author: { handle: string displayName: string avatar: string } text: string indexedAt: string big?: boolean style?: StyleProp replyCount?: number repostCount?: number likeCount?: number isReposted: boolean isLiked: boolean onPressReply: () => void onPressToggleRepost: () => Promise onPressToggleLike: () => Promise onCopyPostText: () => void onOpenTranslate: () => void onDeletePost: () => void } const HITSLOP = {top: 5, left: 5, bottom: 5, right: 5} // DISABLED see #135 /* function ctrlAnimStart(interp: Animated.Value) { return Animated.sequence([ Animated.timing(interp, { toValue: 1, duration: 250, useNativeDriver: true, }), Animated.delay(50), Animated.timing(interp, { toValue: 0, duration: 20, useNativeDriver: true, }), ]) } function ctrlAnimStyle(interp: Animated.Value) { return { transform: [ { scale: interp.interpolate({ inputRange: [0, 1.0], outputRange: [1.0, 4.0], }), }, ], opacity: interp.interpolate({ inputRange: [0, 1.0], outputRange: [1.0, 0.0], }), } } */ export function PostCtrls(opts: PostCtrlsOpts) { const store = useStores() const theme = useTheme() const defaultCtrlColor = React.useMemo( () => ({ color: theme.palette.default.postCtrl, }), [theme], ) as StyleProp const [repostMod, setRepostMod] = React.useState(0) const [likeMod, setLikeMod] = React.useState(0) // DISABLED see #135 // const repostRef = React.useRef(null) // const likeRef = React.useRef(null) const onRepost = () => { store.shell.closeModal() if (!opts.isReposted) { ReactNativeHapticFeedback.trigger('impactMedium') setRepostMod(1) opts .onPressToggleRepost() .catch(_e => undefined) .then(() => setRepostMod(0)) // DISABLED see #135 // repostRef.current?.trigger( // {start: ctrlAnimStart, style: ctrlAnimStyle}, // async () => { // await opts.onPressToggleRepost().catch(_e => undefined) // setRepostMod(0) // }, // ) } else { setRepostMod(-1) opts .onPressToggleRepost() .catch(_e => undefined) .then(() => setRepostMod(0)) } } const onQuote = () => { store.shell.closeModal() store.shell.openComposer({ quote: { uri: opts.itemUri, cid: opts.itemCid, text: opts.text, author: opts.author, indexedAt: opts.indexedAt, }, }) ReactNativeHapticFeedback.trigger('impactMedium') } const onPressToggleRepostWrapper = () => { store.shell.openModal({ name: 'repost', onRepost: onRepost, onQuote: onQuote, isReposted: opts.isReposted, }) } const onPressToggleLikeWrapper = () => { if (!opts.isLiked) { ReactNativeHapticFeedback.trigger('impactMedium') setLikeMod(1) opts .onPressToggleLike() .catch(_e => undefined) .then(() => setLikeMod(0)) // DISABLED see #135 // likeRef.current?.trigger( // {start: ctrlAnimStart, style: ctrlAnimStyle}, // async () => { // await opts.onPressToggleLike().catch(_e => undefined) // setLikeMod(0) // }, // ) } else { setLikeMod(-1) opts .onPressToggleLike() .catch(_e => undefined) .then(() => setLikeMod(0)) } } return ( {typeof opts.replyCount !== 'undefined' ? ( {opts.replyCount} ) : undefined} 0 ? (styles.ctrlIconReposted as StyleProp) : defaultCtrlColor } strokeWidth={2.4} size={opts.big ? 24 : 20} /> { undefined /*DISABLED see #135 */ } {typeof opts.repostCount !== 'undefined' ? ( 0 ? [s.bold, s.green3, s.f15, s.ml5] : [defaultCtrlColor, s.f15, s.ml5] }> {opts.repostCount + repostMod} ) : undefined} {opts.isLiked || likeMod > 0 ? ( } size={opts.big ? 22 : 16} /> ) : ( )} { undefined /*DISABLED see #135 {opts.isLiked || likeMod > 0 ? ( ) : ( )} */ } {typeof opts.likeCount !== 'undefined' ? ( 0 ? [s.bold, s.red3, s.f15, s.ml5] : [defaultCtrlColor, s.f15, s.ml5] }> {opts.likeCount + likeMod} ) : undefined} {opts.big ? undefined : ( )} {/* used for adding pad to the right side */} ) } const styles = StyleSheet.create({ ctrls: { flexDirection: 'row', justifyContent: 'space-between', }, ctrl: { flexDirection: 'row', alignItems: 'center', padding: 5, margin: -5, }, ctrlIconReposted: { color: colors.green3, }, ctrlIconLiked: { color: colors.red3, }, mt1: { marginTop: 1, }, })