Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 641 | Rev 2162 | 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
 
46
    const getShareUrl = async () => {
47
      await axios
48
        .get(url)
49
        .then(({ data }) => {
50
          if (!data.success) {
2157 stevensc 51
            dispatch(addNotification({ style: 'danger', msg: data.data }))
52
            setShareOptions(false)
53
            return
199 stevensc 54
          }
55
 
2157 stevensc 56
          setShareUrl(data.data)
199 stevensc 57
        })
2157 stevensc 58
        .catch((err) => console.log(err))
59
    }
199 stevensc 60
 
61
    const incrementCount = async () => {
62
      await axios
2157 stevensc 63
        .post(shorterUrl)
199 stevensc 64
        .then(({ data }) => {
65
          if (!data.success) {
2157 stevensc 66
            dispatch(addNotification({ style: 'danger', msg: data.data }))
67
            return
199 stevensc 68
          }
69
 
2157 stevensc 70
          setShareOptions(false)
71
          setValue(data.data)
199 stevensc 72
        })
2157 stevensc 73
        .catch((err) => console.log(err))
74
    }
199 stevensc 75
 
76
    useEffect(() => {
2157 stevensc 77
      if (shareOptions && !shareUrl) getShareUrl()
78
    }, [shareOptions])
199 stevensc 79
 
80
    return (
2157 stevensc 81
      <Component onClick={toggleShareOptions}>
82
        {children}
199 stevensc 83
        {shareOptions && (
641 stevensc 84
          <StyledShareContainer>
199 stevensc 85
            <FacebookShareButton
86
              url={shareUrl}
87
              onShareWindowClose={() => incrementCount()}
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
}