Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2157 | Rev 2242 | 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}
2162 stevensc 83
 
199 stevensc 84
        {shareOptions && (
641 stevensc 85
          <StyledShareContainer>
199 stevensc 86
            <FacebookShareButton
87
              url={shareUrl}
88
              onShareWindowClose={() => incrementCount()}
89
            >
90
              <FacebookIcon size={32} round />
91
            </FacebookShareButton>
92
            <TwitterShareButton
93
              url={shareUrl}
94
              onShareWindowClose={() => incrementCount()}
95
            >
96
              <TwitterIcon size={32} round />
97
            </TwitterShareButton>
98
            <TelegramShareButton
99
              url={shareUrl}
100
              onShareWindowClose={() => incrementCount()}
101
            >
102
              <TelegramIcon size={32} round />
103
            </TelegramShareButton>
104
            <WhatsappShareButton
105
              url={shareUrl}
106
              onShareWindowClose={() => incrementCount()}
107
            >
108
              <WhatsappIcon size={32} round />
109
            </WhatsappShareButton>
110
            <RedditShareButton
111
              url={shareUrl}
112
              onShareWindowClose={() => incrementCount()}
113
            >
114
              <RedditIcon size={32} round />
115
            </RedditShareButton>
116
            <EmailShareButton
117
              url={shareUrl}
118
              onShareWindowClose={() => incrementCount()}
119
            >
120
              <EmailIcon size={32} round />
121
            </EmailShareButton>
641 stevensc 122
          </StyledShareContainer>
199 stevensc 123
        )}
124
      </Component>
2157 stevensc 125
    )
126
  }
199 stevensc 127
}