205 lines
5.3 KiB
JavaScript
205 lines
5.3 KiB
JavaScript
import React, { useState, useEffect } from 'react'
|
|
import axios from 'axios'
|
|
import socketIOClient from 'socket.io-client'
|
|
import Modal from 'react-modal'
|
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
|
|
|
import { faCheckCircle } from '@fortawesome/free-solid-svg-icons'
|
|
|
|
Modal.setAppElement('#root')
|
|
|
|
const UploadFile = () => {
|
|
|
|
const [isModalOpen, setIsModalOpen] = useState(false)
|
|
|
|
const [payload, setPayload] = useState('')
|
|
const [message, setMessage] = useState('')
|
|
const [status, setStatus] = useState('')
|
|
const [errorResponse, setErrorResponse] = useState('')
|
|
const [crmPhoneTest, setCrmPhoneTest] = useState('')
|
|
|
|
const [file, setFile] = useState(null)
|
|
const [uploadStatus, setUploadStatus] = useState('')
|
|
|
|
const handleFileChange = (e) => {
|
|
const selectedFile = e.target.files[0]
|
|
setFile(selectedFile)
|
|
}
|
|
|
|
const handleUpload = async () => {
|
|
if (!file) {
|
|
alert('Please select a file.')
|
|
return
|
|
}
|
|
|
|
const formData = new FormData()
|
|
formData.append('crm', file)
|
|
formData.append('companyId', process.env.REACT_APP_COMPANY_ID)
|
|
|
|
try {
|
|
const response = await axios.post(`${process.env.REACT_APP_URL_API}/api/v1/crm/upload`, formData, {
|
|
headers: {
|
|
'Content-Type': 'multipart/form-data',
|
|
'Authorization': 'Bearer 2ivck10D3o9qAZi0pkKudVDl9bdEVXY2s8gdxZ0jYgL1DZWTgDz6wDiIjlWgYmJtVOoqf0b42ZTLBRrfo8WoAaScRsujz3jQUNXdchSg0o43YilZGmVhheGJNAeIQRknHEll4nRJ7avcFgmDGoYbEey7TSC8EHS4Z3gzeufYYSfnKNDBwwzBURIQrTOxYFe3tBHsGOzwnuD2lU5tnEx7tr2XRO4zRNYeNY4lMBOFM0mRuyAe4kuqTrKXmJ8As200'
|
|
},
|
|
})
|
|
|
|
if (response.status === 200) {
|
|
|
|
const { url } = response.data
|
|
|
|
console.log('-----> url: ', url)
|
|
if (url)
|
|
window.location.href = url
|
|
|
|
setUploadStatus('File uploaded successfully!')
|
|
} else {
|
|
setUploadStatus('Failed to upload file.')
|
|
|
|
console.log('error')
|
|
}
|
|
} catch (error) {
|
|
console.error('Error uploading file:', error)
|
|
setUploadStatus('Error uploading file.')
|
|
|
|
setStatus('error')
|
|
setErrorResponse(error.response.data.msg)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
console.log('process.env.REACT_APP_COMPANY_ID: ', process.env.REACT_APP_COMPANY_ID)
|
|
|
|
const socket = socketIOClient(process.env.REACT_APP_URL_API)
|
|
|
|
const currentURL = window.location.href
|
|
const urlObject = new URL(currentURL)
|
|
const clientId = urlObject.searchParams.get('clientId')
|
|
console.log('clientId: ', clientId)
|
|
|
|
if (clientId) {
|
|
|
|
const postData = async () => {
|
|
try {
|
|
await axios.post(`${process.env.REACT_APP_URL_API}/api/v1/crm/test`, {
|
|
clientId,
|
|
companyId: process.env.REACT_APP_COMPANY_ID,
|
|
})
|
|
} catch (error) {
|
|
setStatus('error')
|
|
console.error('-----> Error:', error)
|
|
console.log('TEST: ', error.response.data.msg)
|
|
setErrorResponse(error.response.data.msg)
|
|
}
|
|
}
|
|
|
|
postData()
|
|
|
|
}
|
|
|
|
socket.emit('companySession', process.env.REACT_APP_COMPANY_ID)
|
|
|
|
socket.on('crm_upload', (data) => {
|
|
console.log('Received data from server:', data)
|
|
|
|
setStatus(data?.status)
|
|
|
|
setMessage(data?.data?.msg)
|
|
|
|
if (data?.data?.request) {
|
|
setPayload(data.data.request, null, 2)
|
|
}
|
|
|
|
if (data?.data?.crmPhoneTest) {
|
|
setCrmPhoneTest(data.data.crmPhoneTest)
|
|
}
|
|
setIsModalOpen(true)
|
|
})
|
|
|
|
return () => {
|
|
socket.disconnect()
|
|
}
|
|
}, [])
|
|
|
|
const closeModal = () => {
|
|
setIsModalOpen(false)
|
|
}
|
|
|
|
const handleAfterOpenModal = () => {
|
|
}
|
|
|
|
return (
|
|
<div className="centered">
|
|
<input type="file" onChange={handleFileChange} />
|
|
<button onClick={handleUpload}>Upload</button>
|
|
{uploadStatus && <p>{uploadStatus}</p>}
|
|
|
|
<Modal
|
|
isOpen={isModalOpen}
|
|
onRequestClose={handleAfterOpenModal}
|
|
contentLabel="Example Modal"
|
|
>
|
|
<div className="modal-title">
|
|
|
|
{status === 'finished' && <h2>Template validado com sucesso</h2>}
|
|
{status === 'error' && <h2>Template com erro no processo abaixo</h2>}
|
|
{status === 'processing' && <h2>Testando template. Aguarde...</h2>}
|
|
|
|
</div>
|
|
|
|
<div className="error-message">
|
|
{status === 'error' && (
|
|
<p>
|
|
{errorResponse}
|
|
</p>
|
|
)}
|
|
</div>
|
|
|
|
<div className="success-message">
|
|
{status === 'finished' && (
|
|
<p>
|
|
Verifique no seu CRM os dados inseridos para o contato de teste: {crmPhoneTest}
|
|
</p>
|
|
)}
|
|
</div>
|
|
|
|
|
|
<div className="icon-container">
|
|
{status === 'finished' &&
|
|
<div className="checkmark-container">
|
|
<FontAwesomeIcon icon={faCheckCircle} size="5x" color="green" />
|
|
</div>
|
|
}
|
|
</div>
|
|
|
|
{status === 'finished' ? <></> : <> <MessageComponent title={message} />{payload ? <PayloadComponent formattedJSON={payload} /> : <></>}</>}
|
|
|
|
<button className="close-button" onClick={closeModal}>Close Modal</button>
|
|
</Modal>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const MessageComponent = ({ title }) => {
|
|
return (
|
|
<div>
|
|
<h4>{title}</h4>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const PayloadComponent = ({ formattedJSON }) => {
|
|
return (
|
|
<div>
|
|
<pre>{JSON.stringify(formattedJSON, null, 2)}</pre>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
|
|
export default UploadFile
|