From fb69ccebb05d2ec54d85576d23989e7309349830 Mon Sep 17 00:00:00 2001
From: Ivan Chen <ivan@tagg.id>
Date: Wed, 27 Jan 2021 16:15:00 -0500
Subject: finished delete

---
 src/components/comments/CommentTile.tsx | 115 +++++++++++++++++++++++---------
 1 file changed, 85 insertions(+), 30 deletions(-)

(limited to 'src/components/comments/CommentTile.tsx')

diff --git a/src/components/comments/CommentTile.tsx b/src/components/comments/CommentTile.tsx
index 39605f2c..e12276a9 100644
--- a/src/components/comments/CommentTile.tsx
+++ b/src/components/comments/CommentTile.tsx
@@ -1,14 +1,18 @@
-import React, {useState} from 'react';
+import React, {Fragment, useRef, useState} from 'react';
 import {Text, View} from 'react-native-animatable';
 import {ProfilePreview} from '../profile';
 import {CommentType, ScreenType, TypeOfComment} from '../../types';
-import {StyleSheet} from 'react-native';
+import {Alert, Animated, StyleSheet} from 'react-native';
 import ClockIcon from '../../assets/icons/clock-icon-01.svg';
 import {TAGG_LIGHT_BLUE} from '../../constants';
-import {TouchableOpacity} from 'react-native-gesture-handler';
+import {RectButton, TouchableOpacity} from 'react-native-gesture-handler';
 import {getTimePosted, normalize, SCREEN_WIDTH} from '../../utils';
 import Arrow from '../../assets/icons/back-arrow-colored.svg';
+import Trash from '../../assets/ionicons/trash-outline.svg';
 import CommentsContainer from './CommentsContainer';
+import Swipeable from 'react-native-gesture-handler/Swipeable';
+import {deleteComment} from '../../services';
+import {ERROR_FAILED_TO_DELETE_COMMENT} from '../../constants/strings';
 
 /**
  * Displays users's profile picture, comment posted by them and the time difference between now and when a comment was posted.
@@ -19,6 +23,8 @@ interface CommentTileProps {
   screenType: ScreenType;
   typeOfComment: TypeOfComment;
   setCommentObjectInFocus?: (comment: CommentType | undefined) => void;
+  setNewCommentsAvailable: (available: boolean) => void;
+  canDelete: boolean;
 }
 
 const CommentTile: React.FC<CommentTileProps> = ({
@@ -26,9 +32,13 @@ const CommentTile: React.FC<CommentTileProps> = ({
   screenType,
   typeOfComment,
   setCommentObjectInFocus,
+  setNewCommentsAvailable,
+  canDelete,
 }) => {
   const timePosted = getTimePosted(comment_object.date_created);
   const [showReplies, setShowReplies] = useState<boolean>(false);
+  const swipeRef = useRef<Swipeable>(null);
+  const isThread = typeOfComment === 'Thread';
 
   /**
    * Case : A COMMENT IS IN FOCUS && REPLY SECTION IS HIDDEN
@@ -58,13 +68,46 @@ const CommentTile: React.FC<CommentTileProps> = ({
       ? `Replies (${comment_object.replies_count})`
       : 'Replies';
 
+  const renderRightAction = (text: string, color: string, progress) => {
+    const pressHandler = async () => {
+      swipeRef.current?.close();
+      const success = await deleteComment(comment_object.comment_id, isThread);
+      if (success) {
+        setNewCommentsAvailable(true);
+      } else {
+        Alert.alert(ERROR_FAILED_TO_DELETE_COMMENT);
+      }
+    };
+    return (
+      <Animated.View>
+        <RectButton
+          style={[styles.rightAction, {backgroundColor: color}]}
+          onPress={pressHandler}>
+          <Trash width={normalize(25)} height={normalize(25)} color={'white'} />
+          <Text style={styles.actionText}>{text}</Text>
+        </RectButton>
+      </Animated.View>
+    );
+  };
+
+  const renderRightActions = (progress) =>
+    canDelete ? (
+      <View style={styles.swipeActions}>
+        {renderRightAction('Delete', '#c42634', progress)}
+      </View>
+    ) : (
+      <Fragment />
+    );
+
   return (
-    <>
+    <Swipeable
+      ref={swipeRef}
+      renderRightActions={renderRightActions}
+      rightThreshold={40}
+      friction={2}
+      containerStyle={styles.swipableContainer}>
       <View
-        style={[
-          styles.container,
-          typeOfComment === 'Thread' ? styles.moreMarginWithThread : {},
-        ]}>
+        style={[styles.container, isThread ? styles.moreMarginWithThread : {}]}>
         <ProfilePreview
           profilePreview={{
             id: comment_object.commenter.id,
@@ -104,40 +147,40 @@ const CommentTile: React.FC<CommentTileProps> = ({
 
       {/*** Show replies if toggle state is true */}
       {showReplies && (
-        <View
-          style={{
-            width: SCREEN_WIDTH,
-          }}>
-          <CommentsContainer
-            objectId={comment_object.comment_id}
-            screenType={screenType}
-            setNewCommentsAvailable={() => {}}
-            newCommentsAvailable={true}
-            typeOfComment={'Thread'}
-          />
-        </View>
+        <CommentsContainer
+          objectId={comment_object.comment_id}
+          screenType={screenType}
+          setNewCommentsAvailable={() => {}}
+          newCommentsAvailable={true}
+          typeOfComment={'Thread'}
+        />
       )}
-    </>
+    </Swipeable>
   );
 };
 
 const styles = StyleSheet.create({
   container: {
-    marginHorizontal: '3%',
     borderBottomWidth: 1,
     borderColor: 'lightgray',
-    marginBottom: '3%',
+    backgroundColor: 'white',
+    paddingTop: '3%',
     flexDirection: 'column',
     flex: 1,
+    marginLeft: '7%',
+  },
+  swipeActions: {
+    flexDirection: 'row',
   },
   moreMarginWithThread: {
-    marginHorizontal: '7%',
+    marginLeft: '14%',
   },
   body: {
     marginLeft: 56,
   },
   comment: {
     marginBottom: '2%',
+    marginRight: '2%',
     top: -5,
   },
   date_time: {
@@ -153,35 +196,47 @@ const styles = StyleSheet.create({
     flexDirection: 'row',
     marginBottom: '3%',
   },
-
   flexer: {
     flex: 1,
   },
-
   repliesTextAndIconContainer: {
     flexDirection: 'row',
     alignItems: 'center',
   },
-
   repliesText: {
     color: TAGG_LIGHT_BLUE,
     fontWeight: '500',
     fontSize: normalize(12),
-    marginRight: '3%',
+    marginRight: '5%',
   },
   repliesBody: {
     width: SCREEN_WIDTH,
   },
-
   repliesDownArrow: {
     transform: [{rotate: '270deg'}],
     marginTop: '7%',
   },
-
   repliesUpArrow: {
     transform: [{rotate: '90deg'}],
     marginTop: '7%',
   },
+  actionText: {
+    color: 'white',
+    fontSize: normalize(12),
+    fontWeight: '500',
+    backgroundColor: 'transparent',
+    paddingHorizontal: '5%',
+    marginTop: '5%',
+  },
+  rightAction: {
+    alignItems: 'center',
+    flex: 1,
+    justifyContent: 'center',
+    flexDirection: 'column',
+  },
+  swipableContainer: {
+    backgroundColor: 'white',
+  },
 });
 
 export default CommentTile;
-- 
cgit v1.2.3-70-g09d2

