Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
2157 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { useDispatch } from 'react-redux'
199 stevensc 3
import {
4
  EmailIcon,
5
  EmailShareButton,
6
  FacebookIcon,
7
  FacebookShareButton,
8
  RedditIcon,
9
  RedditShareButton,
10
  TelegramIcon,
11
  TelegramShareButton,
12
  TwitterIcon,
13
  TwitterShareButton,
14
  WhatsappIcon,
2157 stevensc 15
  WhatsappShareButton
16
} from 'react-share'
17
import { addNotification } from 'store/notification/notification.actions'
18
import { axios } from '../../../utils'
19
import styled from 'styled-components'
199 stevensc 20
 
641 stevensc 21
const StyledShareContainer = styled.div`
22
  display: flex;
23
  position: absolute;
24
  align-items: center;
25
  padding: 5px 1rem;
26
  bottom: calc(100% + 0.5rem);
27
  gap: 0.5rem;
28
  right: 0;
29
  width: 16.5rem;
30
  border-radius: 10px;
31
  background-color: #fff;
32
  box-shadow: 0px 4px 4px -2px rgb(0 0 0 / 12%),
33
    0px -4px 4px -2px rgb(0 0 0 / 12%);
2157 stevensc 34
`
641 stevensc 35
 
199 stevensc 36
export default function withExternalShare(Component, url) {
2157 stevensc 37
  return function ({ children, setValue, shorterUrl }) {
38
    const [shareOptions, setShareOptions] = useState(false)
39
    const [shareUrl, setShareUrl] = useState('')
40
    const dispatch = useDispatch()
199 stevensc 41
 
631 stevensc 42
    const toggleShareOptions = () => {
2157 stevensc 43
      setShareOptions(!shareOptions)
44
    }
199 stevensc 45
 
2243 stevensc 46
    const getShorterUrl = () =>
47
      new Promise(() => {
48
        axios
49
          .get(url)
50
          .then(({ data }) => {
51
            if (!data.success) {
52
              setShareOptions(false)
53
              throw new Error(data.data)
54
            }
199 stevensc 55
 
2243 stevensc 56
            setShareUrl(data.data)
57
          })
58
          .catch((err) =>
59
            dispatch(addNotification({ style: 'danger', msg: err.message }))
60
          )
61
      })
199 stevensc 62
 
63
    const incrementCount = async () => {
64
      await axios
2157 stevensc 65
        .post(shorterUrl)
199 stevensc 66
        .then(({ data }) => {
67
          if (!data.success) {
2157 stevensc 68
            dispatch(addNotification({ style: 'danger', msg: data.data }))
69
            return
199 stevensc 70
          }
71
 
2157 stevensc 72
          setShareOptions(false)
73
          setValue(data.data)
199 stevensc 74
        })
2157 stevensc 75
        .catch((err) => console.log(err))
76
    }
199 stevensc 77
 
78
    return (
2157 stevensc 79
      <Component onClick={toggleShareOptions}>
80
        {children}
2162 stevensc 81
 
199 stevensc 82
        {shareOptions && (
641 stevensc 83
          <StyledShareContainer>
199 stevensc 84
            <FacebookShareButton
85
              url={shareUrl}
86
              onShareWindowClose={() => incrementCount()}
2242 stevensc 87
              beforeOnClick={getShorterUrl}
199 stevensc 88
            >
89
              <FacebookIcon size={32} round />
90
            </FacebookShareButton>
91
            <TwitterShareButton
92
              url={shareUrl}
93
              onShareWindowClose={() => incrementCount()}
94
            >
95
              <TwitterIcon size={32} round />
96
            </TwitterShareButton>
97
            <TelegramShareButton
98
              url={shareUrl}
99
              onShareWindowClose={() => incrementCount()}
100
            >
101
              <TelegramIcon size={32} round />
102
            </TelegramShareButton>
103
            <WhatsappShareButton
104
              url={shareUrl}
105
              onShareWindowClose={() => incrementCount()}
106
            >
107
              <WhatsappIcon size={32} round />
108
            </WhatsappShareButton>
109
            <RedditShareButton
110
              url={shareUrl}
111
              onShareWindowClose={() => incrementCount()}
112
            >
113
              <RedditIcon size={32} round />
114
            </RedditShareButton>
115
            <EmailShareButton
116
              url={shareUrl}
117
              onShareWindowClose={() => incrementCount()}
118
            >
119
              <EmailIcon size={32} round />
120
            </EmailShareButton>
641 stevensc 121
          </StyledShareContainer>
199 stevensc 122
        )}
123
      </Component>
2157 stevensc 124
    )
125
  }
199 stevensc 126
}