Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 49 | Rev 56 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
import React, { useState } from "react";
2
import { connect } from "react-redux";
3
import { useForm } from "react-hook-form";
4
import FormErrorFeedback from "../../../shared/form-error-feedback/FormErrorFeedback";
5
import FeedCommentTemplate from "./feed-comment/FeedCommentTemplate";
6
import { openShareModal as OpenShareModalAction } from "../../../redux/share-modal/shareModal.actions";
7
import { addNotification } from "../../../redux/notification/notification.actions";
8
import { deleteFeed } from "../../../redux/feed/feed.actions";
9
import { shareModalTypes } from "../../../redux/share-modal/shareModal.types";
10
import parse from "html-react-parser";
11
import {axios} from "../../../utils";
12
import ConfirmModal from "../../../shared/confirm-modal/ConfirmModal";
13
 
14
import styles from "./feedTemplate.module.scss";
15
import { feedTypes } from "../../../redux/feed/feed.types";
16
 
17
const FeedTemplate = (props) => {
18
  // Destructuring feed data
19
  const {
20
    feed_unique,
21
    feed_id_encrypted,
22
    owner_name,
23
    owner_url,
24
    owner_image,
25
    owner_comments,
26
    owner_shared,
27
    owner_time_elapse,
28
    owner_description,
29
    owner_file_image,
30
    owner_file_video,
31
    owner_file_document,
32
    owner_file_image_preview,
33
    shared_name,
34
    shared_image,
35
    shared_time_elapse,
36
    shared_description,
37
    shared_file_video,
38
    shared_file_image_preview,
39
    shared_file_image,
40
    shared_file_document,
41
    feed_like_url,
42
    feed_unlike_url,
43
    feed_is_liked,
44
    feed_share_url,
45
    feed_delete_url,
46
    comments,
47
    comment_add_url,
48
  } = props.feed;
49
 
50
  // Destructuring redux
51
  const { feedType } = props;
52
  const { deleteFeed, addNotification, openShareModal } = props;
53
 
54
  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked);
55
 
56
  // react hook form
57
  const { register, handleSubmit, errors } = useForm();
58
 
59
  const [commentsState, setCommentsState] = useState(comments);
60
 
61
  const [isReadMoreActive, setIsReadMoreActive] = useState(false);
62
  const [showConfirmModal, setShowConfirmModal] = useState(false);
63
 
64
  const deleteFeedHandler = () => {
65
    axios.post(feed_delete_url).then((res) => {
66
      const data = res.data;
67
      if (data.success) {
68
        deleteFeed(feed_unique);
69
        addNotification({
70
          style: "success",
71
          msg: data.data,
72
        });
73
      } else {
74
        addNotification({
75
          style: "danger",
76
          msg: data.data,
77
        });
78
      }
79
    });
80
  };
81
 
82
  const handleShowConfirmModal = () => {
83
    setShowConfirmModal(!showConfirmModal);
84
  };
85
 
86
  const handleModalAccept = () => {
87
    deleteFeedHandler();
88
  };
89
 
90
  const likeHandler = (event, likeUrl) => {
91
    event.preventDefault();
92
    setFeedIsLiked(!feedIsLiked);
93
    axios.post(likeUrl).then((res) => {
94
      const resData = res.data;
95
      const { success, data } = resData;
96
      if (!success) {
97
        setFeedIsLiked((previousState) => !previousState);
98
        addNotification({
99
          style: "danger",
100
          msg: data,
101
        });
102
      }
103
    });
104
  };
105
 
106
  const submitCommentHandler = (data, e) => {
107
    const currentFormData = new FormData();
108
    for (let input in data) {
109
      currentFormData.append(input, data[input]);
110
    }
111
    axios.post(comment_add_url, currentFormData).then((res) => {
112
      const resData = res.data;
113
      const { data, success, total_comments } = resData;
114
      if (success) {
115
        const newComment = data;
116
        setCommentsState([...commentsState, newComment]);
117
        e.target.reset();
118
      } else {
119
        addNotification({
120
          style: "danger",
121
          msg: data,
122
        });
123
      }
124
    });
125
  };
126
 
127
  const deleteCommentHandler = (commentUnique, deleteCommentUrl) => {
128
    axios
129
      .post(deleteCommentUrl)
130
      .then((res) => {
131
        const { success, data } = res.data;
132
        if (success) {
133
          const newCommentsState = commentsState.filter(
134
            (comment) => comment.unique !== commentUnique
135
          );
136
          setCommentsState(newCommentsState);
137
        } else {
138
          addNotification({
139
            style: "danger",
140
            msg: data,
141
          });
142
        }
143
      })
144
      .catch((error) => {
145
        addNotification({
146
          style: "danger",
147
          msg: error.message,
148
        });
149
      });
150
  };
151
 
152
  const btnShareHandler = (event) => {
153
    event.preventDefault();
154
    openShareModal(feed_share_url, shareModalTypes.SHARE, feedTypes.DASHBOARD);
155
  };
156
 
157
  let commentsRender = null;
158
  if (commentsState.length) {
159
    commentsRender = (
160
      <div className={styles.commentSection}>
161
        <div className={`comment-sec comment-sec-${feed_unique}`}>
162
          <ul>
163
            {[...commentsState].reverse().map((commentData) => {
164
              const { unique } = commentData;
165
              return (
166
                <FeedCommentTemplate
167
                  commentData={commentData}
168
                  onDeleteHandler={deleteCommentHandler}
169
                  key={unique}
170
                />
171
              );
172
            })}
173
          </ul>
174
        </div>
175
      </div>
176
    );
177
  }
178
 
179
  let likeButton = feedIsLiked ? (
180
    <a
181
      href={feed_unlike_url}
182
      id={`btn-unlike-${feed_unique}`}
183
      data-feed-unique={feed_unique}
184
      className="btn-unlike"
185
      onClick={(event) => {
186
        likeHandler(event, feed_unlike_url);
187
      }}
188
    >
189
      <i className="fas fa-heart"></i>
190
      Ya no me gusta
191
    </a>
192
  ) : (
193
    <a
194
      href={feed_like_url}
195
      id={`btn-like-${feed_unique}`}
196
      data-feed-unique={feed_unique}
197
      className="btn-like"
198
      onClick={(event) => {
199
        likeHandler(event, feed_like_url);
200
      }}
201
    >
202
      <i className="far fa-heart"></i>
203
      Me gusta
204
    </a>
205
  );
206
 
207
  const readMoreHandler = (event) => {
208
    event.preventDefault();
209
    setIsReadMoreActive(!isReadMoreActive);
210
  };
211
 
212
  const htmlParsedText = (fullStringText) => {
213
    const fullText = parse(fullStringText);
214
    if (fullStringText.length > 500) {
215
      const shortenedString = fullStringText.substr(0, 500);
216
      const shortenedText = parse(`${shortenedString}... `);
217
      return (
218
        <React.Fragment>
219
          {isReadMoreActive ? fullText : shortenedText}
220
          <a
221
            href="#"
222
            onClick={(e) => {
223
              readMoreHandler(e);
224
            }}
225
          >
226
            {isReadMoreActive ? " Leer menos" : " Leer más"}
227
          </a>
228
        </React.Fragment>
229
      );
230
    } else {
231
      return fullText;
232
    }
233
  };
234
 
235
  let sharedName = null;
236
  if (shared_name) {
237
    sharedName = (
238
      <div className="shared-post-bar">
239
        <div className="post-bar">
240
          <div className="post_topbar">
241
            <div className="usy-dt">
242
              <img
243
                src={shared_image}
244
                alt=""
245
                style={{
246
                  width: "50px",
247
                  height: "auto",
248
                }}
249
              />
250
              <div className="usy-name">
251
                <h3>{shared_name}</h3>
252
                <span>
253
                  <img
254
                    style={{
255
                      width: "12px",
256
                      height: "auto",
257
                    }}
258
                    src="/images/clock.png"
259
                    alt=""
260
                  />
261
                  {shared_time_elapse}
262
                </span>
263
              </div>
264
            </div>
265
          </div>
266
          <div className="job_descp">
267
            <div className="show-read-more">
268
              {htmlParsedText(shared_description)}
269
            </div>
270
            {shared_file_image ? (
271
              <img src={shared_file_image} className="Entradas" />
272
            ) : null}
273
            {shared_file_video ? (
274
              <video
275
                src={shared_file_video}
276
                controls
277
                poster={shared_file_image_preview}
278
                preload="none"
279
              />
280
            ) : null}
281
            {shared_file_document ? (
282
              <a href={shared_file_document} target="_blank">
283
                Descargar
284
              </a>
285
            ) : null}
286
          </div>
287
        </div>
288
      </div>
289
    );
290
  }
55 steven 291
  const TopBar = () => <div className="post_topbar">
292
    <div className="usy-dt">
293
      <a href={owner_url}>
294
        <img
295
          src={owner_image}
296
          alt=""
297
          style={{
298
            width: "50px",
299
            height: "auto",
300
          }}
301
        />
302
      </a>
303
      <div className="usy-name">
304
        <a href={owner_url}>
305
          <h3>{owner_name}</h3>
306
        </a>
307
        <span>
308
          <img src="/images/clock.png" alt="" />
309
          {owner_time_elapse}
310
          {feed_delete_url ? (
311
            <a
312
              href="#"
313
              className="btn-feed-trash"
314
              data-link={feed_delete_url}
315
              data-feed-unique={feed_unique}
316
              onClick={(e) => {
317
                e.preventDefault();
318
                handleShowConfirmModal();
319
              }}
320
            >
321
              <i className="fa fa-trash"></i>
322
            </a>
323
          ) : null}
324
        </span>
325
      </div>
326
    </div>
327
  </div>
1 www 328
 
55 steven 329
  const Content = () => <div className="job_descp">
330
      <div className="show-read-more">
331
        {htmlParsedText(owner_description)}
332
      </div>
333
      {owner_file_image ? (
334
        <img src={owner_file_image} className="Entradas" />
335
      ) : null}
336
      {owner_file_video ? (
337
        <video
338
          src={owner_file_video}
339
          controls
340
          poster={owner_file_image_preview}
341
          preload="none"
342
        />
343
      ) : null}
344
      {owner_file_document ? (
345
        <a href={owner_file_document} target="_blank">
346
          Descargar
347
        </a>
348
      ) : null}
349
      {sharedName}
350
  </div>
1 www 351
  return (
352
    <React.Fragment>
49 steven 353
      <div className={styles.postContainer} onClick={props.showFullScreen || ''} >
55 steven 354
        <TopBar />
355
        <Content />
1 www 356
        <div className="job-status-bar">
357
          <ul className="like-com">
358
            <li>{likeButton}</li>
359
            <li>
360
              <a
361
                href="#"
362
                id={`btn-comments-${feed_unique}`}
363
                className="btn-indicator"
364
              >
365
                <i className="fas fa-comments"></i> {owner_comments}
366
              </a>
367
            </li>
368
            <li>
369
              <a
370
                href="#"
371
                id={`btn-share-${feed_unique}`}
372
                className="btn-indicator"
373
              >
374
                <i className="fas fa-share"></i> {owner_shared}
375
              </a>
376
            </li>
377
          </ul>
378
          <a
379
            href={feed_share_url}
380
            data-feed-unique={feed_unique}
381
            className="btn-feed-share"
382
            onClick={(e) => {
383
              btnShareHandler(e);
384
            }}
385
          >
386
            <i className="fas fa-share"></i>Compartir
387
          </a>
388
        </div>
389
        {commentsRender}
390
        <div>
391
          <form
392
            className={`form-comment-feed-${feed_unique}`}
393
            data-feed-unique={feed_unique}
394
            onSubmit={handleSubmit(submitCommentHandler)}
395
          >
396
            <div className={styles.feedCommentContainer}>
397
              <input
398
                className={styles.commentInput}
399
                type="text"
400
                name="comment"
401
                id={`comment-${feed_unique}`}
402
                maxLength="256"
403
                placeholder="Escribe un comentario"
404
                ref={register({
405
                  required: {
406
                    value: "true",
407
                    message: "El campo es requerido",
408
                  },
409
                })}
410
              />
411
              <button type="submit" className={styles.submitButton}>
412
                Enviar
413
              </button>{" "}
414
              {/* Falta multilenguaje */}
415
            </div>
416
          </form>
417
          {errors.comment && (
418
            <FormErrorFeedback>{errors.comment.message}</FormErrorFeedback>
419
          )}
420
        </div>
421
      </div>
422
      <ConfirmModal
423
        show={showConfirmModal}
424
        onClose={() => {
425
          setShowConfirmModal(false);
426
        }}
427
        onAccept={handleModalAccept}
428
        acceptLabel="Aceptar"
429
      />
430
    </React.Fragment>
431
  );
432
};
433
 
434
const mapStateToProps = (state) => ({
435
  currentFeed: state.feed.currentFeed,
436
  isShareModalOpen: state.feed.isShareModalOpen,
437
  feedType: state.shareModal.feedType,
438
});
439
 
440
const mapDispatchToProps = {
441
  deleteFeed: (feedId) => deleteFeed(feedId),
442
  openShareModal: (postUrl, modalType, feedType) => OpenShareModalAction(postUrl, modalType, feedType),
443
  addNotification: (notification) => addNotification(notification),
444
};
445
 
446
export default connect(mapStateToProps, mapDispatchToProps)(FeedTemplate);