Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2247 | Rev 2253 | 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'
2245 stevensc 19
import SharePopup from './mobile-share/MobileSharePopUp'
20
 
2157 stevensc 21
import styled from 'styled-components'
2245 stevensc 22
import useMobile from '@app/hooks/useMobile'
199 stevensc 23
 
641 stevensc 24
const StyledShareContainer = styled.div`
25
  display: flex;
26
  position: absolute;
27
  align-items: center;
28
  padding: 5px 1rem;
29
  bottom: calc(100% + 0.5rem);
30
  gap: 0.5rem;
31
  right: 0;
32
  width: 16.5rem;
33
  border-radius: 10px;
34
  background-color: #fff;
35
  box-shadow: 0px 4px 4px -2px rgb(0 0 0 / 12%),
36
    0px -4px 4px -2px rgb(0 0 0 / 12%);
2157 stevensc 37
`
641 stevensc 38
 
199 stevensc 39
export default function withExternalShare(Component, url) {
2157 stevensc 40
  return function ({ children, setValue, shorterUrl }) {
2244 stevensc 41
    const [showOptions, setShowOptions] = useState(false)
2245 stevensc 42
    const [openPopup, setOpenPopup] = useState(false)
2157 stevensc 43
    const [shareUrl, setShareUrl] = useState('')
2245 stevensc 44
    const isMobile = useMobile()
2157 stevensc 45
    const dispatch = useDispatch()
199 stevensc 46
 
2248 stevensc 47
    const getShareUrl = async () => {
48
      try {
49
        const response = await axios.get(url)
50
        const { data, success } = response.data
51
        if (!success) throw new Error(data)
52
        setShareUrl(data)
53
        return data
54
      } catch (error) {
55
        dispatch(addNotification({ style: 'danger', msg: error.message }))
56
      }
57
    }
58
 
2245 stevensc 59
    const onClick = () => setShowOptions(!showOptions)
199 stevensc 60
 
61
    const incrementCount = async () => {
62
      await axios
2157 stevensc 63
        .post(shorterUrl)
2244 stevensc 64
        .then((response) => {
65
          const { data, success } = response.data
66
          if (!success) throw new Error(data)
67
          setShowOptions(false)
68
          setValue(data)
199 stevensc 69
        })
2244 stevensc 70
        .catch((err) =>
71
          dispatch(addNotification({ style: 'danger', msg: err.message }))
72
        )
2157 stevensc 73
    }
199 stevensc 74
 
2245 stevensc 75
    const mobileOnClick = async () => {
76
      if (navigator?.share) {
77
        try {
2248 stevensc 78
          const shareUrl = await getShareUrl()
2247 stevensc 79
          await navigator.share({
2248 stevensc 80
            url: shareUrl
2247 stevensc 81
          })
2245 stevensc 82
          incrementCount()
83
        } catch (error) {
84
          dispatch(addNotification({ style: 'danger', msg: error.message }))
85
        }
86
      } else if (window?.AndroidShareHandler) {
87
        try {
2248 stevensc 88
          const shareUrl = await getShareUrl()
89
          window.AndroidShareHandler.share(shareUrl)
2245 stevensc 90
        } catch (error) {
91
          dispatch(addNotification({ style: 'danger', msg: error.message }))
92
        }
93
      } else {
94
        setOpenPopup(true)
95
      }
96
    }
97
 
2244 stevensc 98
    useEffect(() => {
2248 stevensc 99
      if (!showOptions || !openPopup || shareUrl) return
2244 stevensc 100
 
101
      getShareUrl()
102
    }, [showOptions, shareUrl])
103
 
199 stevensc 104
    return (
2245 stevensc 105
      <>
106
        <Component onClick={isMobile ? mobileOnClick : onClick}>
107
          {children}
2162 stevensc 108
 
2245 stevensc 109
          {showOptions && (
110
            <StyledShareContainer>
111
              <FacebookShareButton
112
                url={shareUrl}
113
                onShareWindowClose={incrementCount}
114
                disabled={!shareUrl}
115
              >
116
                <FacebookIcon size={32} round />
117
              </FacebookShareButton>
118
              <TwitterShareButton
119
                url={shareUrl}
120
                onShareWindowClose={incrementCount}
121
                disabled={!shareUrl}
122
              >
123
                <TwitterIcon size={32} round />
124
              </TwitterShareButton>
125
              <TelegramShareButton
126
                url={shareUrl}
127
                onShareWindowClose={incrementCount}
128
                disabled={!shareUrl}
129
              >
130
                <TelegramIcon size={32} round />
131
              </TelegramShareButton>
132
              <WhatsappShareButton
133
                url={shareUrl}
134
                onShareWindowClose={incrementCount}
135
                disabled={!shareUrl}
136
              >
137
                <WhatsappIcon size={32} round />
138
              </WhatsappShareButton>
139
              <RedditShareButton
140
                url={shareUrl}
141
                onShareWindowClose={incrementCount}
142
                disabled={!shareUrl}
143
              >
144
                <RedditIcon size={32} round />
145
              </RedditShareButton>
146
              <EmailShareButton
147
                url={shareUrl}
148
                onShareWindowClose={incrementCount}
149
                disabled={!shareUrl}
150
              >
151
                <EmailIcon size={32} round />
152
              </EmailShareButton>
153
            </StyledShareContainer>
154
          )}
155
        </Component>
156
        <SharePopup
157
          show={openPopup}
158
          shareData={{ url: shareUrl }}
159
          onClose={() => setOpenPopup(false)}
160
        />
161
      </>
2157 stevensc 162
    )
163
  }
199 stevensc 164
}