Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14577 | Rev 14579 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 14577 Rev 14578
Línea 1... Línea 1...
1
import React from 'react'
1
import React from 'react'
2
import { useState, useRef, useEffect } from 'react'
2
import { useState, useRef, useEffect } from 'react'
3
import styled from 'styled-components'
3
import styled from 'styled-components'
4
import { axios } from '../../../utils'
4
import { axios } from '../../../utils'
-
 
5
import Spinner from '../../../shared/loading-spinner/Spinner'
5
import Emojione from './emojione/Emojione'
6
import Emojione from './emojione/Emojione'
6
import SendFileModal from './send-file-modal/SendFileModal'
7
import SendFileModal from './send-file-modal/SendFileModal'
7
import ConfirmModal from '../../../shared/confirm-modal/ConfirmModal'
8
import ConfirmModal from '../../../shared/confirm-modal/ConfirmModal'
8
import MessageTemplate from './messageTemplate/MessageTemplate'
9
import MessageTemplate from './messageTemplate/MessageTemplate'
Línea 64... Línea 65...
64
      border-bottom: 1px solid #e2e2e2;
65
      border-bottom: 1px solid #e2e2e2;
65
    }
66
    }
66
  }
67
  }
67
`
68
`
Línea -... Línea 69...
-
 
69
 
-
 
70
const PersonalChat = (props) => {
68
 
71
	// props destructuring
69
const PersonalChat = ({ entity, index, onClose, onMinimize, onRead }) => {
-
 
70
 
72
	const { index, onClose, onMinimize, onRead } = props
71
	// entity destructuring
73
	// entity destructuring
72
	const {
74
	const {
73
		id,
75
		id,
74
		image,
76
		image,
75
		name,
77
		name,
76
		online,
78
		online,
77
		type,
79
		type,
-
 
80
		unsee_messages,
78
		unsee_messages,
81
		url_clear,
79
		url_close,
82
		url_close,
80
		url_get_all_messages,
83
		url_get_all_messages,
81
		url_send,
84
		url_send,
82
		url_upload,
85
		url_upload,
Línea 87... Línea 90...
87
		url_leave,
90
		url_leave,
88
		url_delete,
91
		url_delete,
89
		url_add_user_to_group,
92
		url_add_user_to_group,
90
		url_get_contact_group_list,
93
		url_get_contact_group_list,
91
		url_get_contacts_availables_for_group,
94
		url_get_contacts_availables_for_group,
92
	} = entity
95
	} = props.entity
Línea 93... Línea 96...
93
 
96
 
94
	// states
97
	// states
95
	const [messages, setMessages] = useState([])
98
	const [messages, setMessages] = useState([])
96
	const [responseMessage, setResponseMessage] = useState(null)
99
	const [responseMessage, setResponseMessage] = useState(null)
Línea 203... Línea 206...
203
			const formData = new FormData()
206
			const formData = new FormData()
204
			formData.append('message', emojione.toShort(message))
207
			formData.append('message', emojione.toShort(message))
205
			await axios.post(url_send, formData).then((response) => {
208
			await axios.post(url_send, formData).then((response) => {
206
				const resData = response.data
209
				const resData = response.data
207
				if (resData.success) {
210
				if (resData.success) {
208
					let newMessage = resData.data
-
 
209
 
-
 
210
					online
-
 
211
						? newMessage = { ...newMessage, not_received: false }
-
 
212
						: newMessage = { ...newMessage, not_received: true }
-
 
213
 
-
 
214
					setMessages([...messages, newMessage])
-
 
215
				}
211
				}
216
			})
212
			})
217
			e.target.value = ''
213
			e.target.value = ''
218
			/* await handleGetMessages(); */
214
			await handleGetMessages()
219
			setShowEmojiTab(false)
215
			setShowEmojiTab(false)
220
			setResponseMessage(null)
216
			setResponseMessage(null)
221
		}
217
		}
222
	}
218
	}
Línea 239... Línea 235...
239
				loadPersonsAvailable()
235
				loadPersonsAvailable()
240
			}
236
			}
241
		})
237
		})
242
	}
238
	}
Línea 243... Línea 239...
243
 
239
 
244
	const handleConfirmModalAction = () => {
240
	const handleConfirmModalAction = async () => {
-
 
241
		await axios.post(modalActionUrl.current).then((response) => {
-
 
242
			const resData = response.data
-
 
243
			if (resData.success) {
-
 
244
			}
245
		axios.post(modalActionUrl.current)
245
		})
246
			.then(({ data }) => (data.success) && onClose(id, url_close))
246
		await onClose(id, url_close)
Línea 247... Línea 247...
247
	}
247
	}
248
 
248
 
-
 
249
	const handleObserver = (entities) => {
249
	const handleObserver = (entities) => {
250
		const target = entities[0]
-
 
251
		if (target.isIntersecting) {
250
		const target = entities[0]
252
			setCurrentPage((prevState) => prevState + 1)
Línea 251... Línea 253...
251
		target.isIntersecting && setCurrentPage((prevState) => prevState + 1)
253
		}
252
	}
254
	}
253
 
255
 
254
	const scrollToBottom = () => {
256
	const scrollToBottom = () => {
255
		if (conversationListEl.current) {
257
		if (conversationListEl.current) {
256
			conversationListEl.current.scrollTop =
258
			conversationListEl.current.scrollTop =
Línea 257... Línea 259...
257
				conversationListEl.current.scrollHeight * 9
259
        conversationListEl.current.scrollHeight * 9
258
		}
260
		}
Línea 288... Línea 290...
288
	//   setMessages([...oldMessages, ...newMessages]);
290
	//   setMessages([...oldMessages, ...newMessages]);
289
	// }, [newMessages, oldMessages]);
291
	// }, [newMessages, oldMessages]);
Línea 290... Línea 292...
290
 
292
 
291
	// getMessageOnMaximize and subscribe to infinite Loader
293
	// getMessageOnMaximize and subscribe to infinite Loader
292
	useEffect(async () => {
-
 
293
		const options = {
-
 
294
			root: null,
-
 
295
			rootMargin: '20px',
-
 
296
			treshold: 1.0,
-
 
297
		}
-
 
298
		const observer = new IntersectionObserver(handleObserver, options)
-
 
299
 
294
	useEffect(async () => {
300
		if (!minimized) {
295
		if (!minimized) {
301
			await handleGetMessages()
-
 
302
 
296
			await handleGetMessages()
-
 
297
			// loader observer
-
 
298
			let options = {
-
 
299
				root: null,
-
 
300
				rootMargin: '20px',
-
 
301
				treshold: 1.0,
-
 
302
			}
303
			// loader observer
303
			const observer = new IntersectionObserver(handleObserver, options)
304
			if (loader.current) {
304
			if (loader.current) {
305
				observer.observe(loader.current)
305
				observer.observe(loader.current)
306
			}
306
			}
307
		}
307
		}
Línea 352... Línea 352...
352
	const handleShareFileModalShow = () => {
352
	const handleShareFileModalShow = () => {
353
		setShareFileModalShow(!shareFileModalShow)
353
		setShareFileModalShow(!shareFileModalShow)
354
	}
354
	}
Línea 355... Línea 355...
355
 
355
 
356
	const handleResponseMessage = (element) => {
-
 
357
		element.mtype === 'text'
356
	const handleResponseMessage = (element) => {
358
			? setResponseMessage(element)
-
 
359
			: setResponseMessage({ ...element, m: 'Archivo adjunto' })
-
 
360
 
-
 
361
		textAreaEl.current && textAreaEl.current.focus()
357
		setResponseMessage(element)
Línea 362... Línea 358...
362
	}
358
	}
363
 
359
 
364
	const messagesRender = () => {
360
	const messagesRender = () => {
365
		return (
361
		return (
366
			<React.Fragment>
362
			<React.Fragment>
367
				{currentPage < pages ? <li ref={loader}>Cargando...</li> : ''}
363
				{currentPage < pages ? <li ref={loader}>Cargando...</li> : ''}
368
				{oldMessages.map((oldMessage) => (
364
				{oldMessages.map((oldMessage, index) => (
369
					<MessageTemplate message={oldMessage} />
365
					<MessageTemplate key={index} message={oldMessage} />
370
				))}
366
				))}
371
				{messages.map((message, i) => {
367
				{messages.map((message, i) => {
372
					let currentTime = message.time
-
 
373
					let prevMessage = messages[i - 1]
368
					let currentTime = message.time
374
 
369
					let prevMessage = messages[i - 1]
Línea 375... Línea 370...
375
					const dailys = ['mes', 'meses', 'semana', 'semanas', 'dia', 'dias', 'año', 'años']
370
					const dailys = ['mess', 'semana', 'dias', 'anio']
376
					//const date = new Date(Date.now()).toLocaleDateString()
371
					const date = new Date(Date.now()).toLocaleDateString()
Línea 377... Línea 372...
377
 
372
 
378
					if (prevMessage !== undefined) {
373
					if (prevMessage !== undefined) {
379
						let prevTime = messages[i - 1].time
374
						let prevTime = messages[i - 1].time
380
 
375
 
381
						if (prevTime !== currentTime && dailys.includes(prevTime.split(' ')[1])) {
376
						if (prevTime !== currentTime && dailys.includes(prevTime.split(' ')[1])) {
382
							return <>
377
							return <>
383
								{/* <h2 className="text-center date-chat">{date}</h2> */}
378
								<h2 className="text-center">{date}</h2>
384
								<MessageTemplate
379
								<MessageTemplate
385
									message={message}
380
									message={message}
386
									setResponseMessage={handleResponseMessage}
381
									setResponseMessage={handleResponseMessage}
387
									responseMessage={responseMessage}
382
									responseMessage={responseMessage}
Línea 388... Línea 383...
388
								/>
383
								/>
-
 
384
							</>
389
							</>
385
						}
390
						}
386
					}
391
					}
387
 
392
 
388
					return <MessageTemplate
393
					return <MessageTemplate
389
						key={i}
Línea 417... Línea 413...
417
		case optionTabs.add_person_to_group:
413
		case optionTabs.add_person_to_group:
418
			loadPersonsAvailable()
414
			loadPersonsAvailable()
419
			break
415
			break
420
		case optionTabs.group_contacts_list:
416
		case optionTabs.group_contacts_list:
421
			loadGroupContacts()
417
			loadGroupContacts()
-
 
418
		default:
422
			break
419
			break
423
		}
420
		}
424
	}, [optionTab])
421
	}, [optionTab])
Línea 425... Línea 422...
425
 
422
 
Línea 467... Línea 464...
467
							onClick={() => handleChangeTab(optionTabs.group_contacts_list)}
464
							onClick={() => handleChangeTab(optionTabs.group_contacts_list)}
468
						>
465
						>
469
							<span className="optionsTab__option__icon">
466
							<span className="optionsTab__option__icon">
470
								<i className="fa fa-group"></i>
467
								<i className="fa fa-group"></i>
471
							</span>
468
							</span>
472
							Integrantes
469
              Integrantes
473
						</li>
470
						</li>
474
					)}
471
					)}
475
					{!!url_add_user_to_group && (
472
					{!!url_add_user_to_group && (
476
						<li
473
						<li
477
							className="optionsTab__option"
474
							className="optionsTab__option"
478
							onClick={() => handleChangeTab(optionTabs.add_person_to_group)}
475
							onClick={() => handleChangeTab(optionTabs.add_person_to_group)}
479
						>
476
						>
480
							<span className="optionsTab__option__icon">
477
							<span className="optionsTab__option__icon">
481
								<i className="fa fa-user-plus"></i>
478
								<i className="fa fa-user-plus"></i>
482
							</span>
479
							</span>
483
							Agregar contactos
480
              Agregar contactos
484
						</li>
481
						</li>
485
					)}
482
					)}
486
					{!!url_delete && (
483
					{!!url_delete && (
487
						<li
484
						<li
488
							className="optionsTab__option"
485
							className="optionsTab__option"
Línea 493... Línea 490...
493
							}}
490
							}}
494
						>
491
						>
495
							<span className="optionsTab__option__icon">
492
							<span className="optionsTab__option__icon">
496
								<i className="fa fa-trash"></i>
493
								<i className="fa fa-trash"></i>
497
							</span>
494
							</span>
498
							Eliminar grupo
495
              Eliminar grupo
499
						</li>
496
						</li>
500
					)}
497
					)}
501
					{!!url_leave && (
498
					{!!url_leave && (
502
						<li
499
						<li
503
							className="optionsTab__option"
500
							className="optionsTab__option"
Línea 508... Línea 505...
508
							}}
505
							}}
509
						>
506
						>
510
							<span className="optionsTab__option__icon">
507
							<span className="optionsTab__option__icon">
511
								<i className="fa fa-user-times"></i>
508
								<i className="fa fa-user-times"></i>
512
							</span>
509
							</span>
513
							Dejar grupo
510
              Dejar grupo
514
						</li>
511
						</li>
515
					)}
512
					)}
516
				</ul>
513
				</ul>
517
			</div>
514
			</div>
518
		</React.Fragment>
515
		</React.Fragment>
Línea 528... Línea 525...
528
			</span>
525
			</span>
529
			<div className="addPersonToGroupTab">
526
			<div className="addPersonToGroupTab">
530
				{availableContactsToAdd.length ? (
527
				{availableContactsToAdd.length ? (
531
					availableContactsToAdd.map(({ image, name, id }) => (
528
					availableContactsToAdd.map(({ image, name, id }) => (
532
						<div className="addPersonToGroupTab__person" key={id}>
529
						<div className="addPersonToGroupTab__person" key={id}>
533
							<div className="d-inline-flex" style={{ gap: '5px' }}>
-
 
534
								<img
530
							<img
535
									className="chat-image img-circle pull-left"
531
								className="chat-image img-circle pull-left"
536
									height="36"
532
								height="36"
537
									width="36"
533
								width="36"
538
									src={image}
534
								src={image}
539
									alt="image-image"
535
								alt="image-image"
540
								/>
536
							/>
541
								<div className="name">{name}</div>
537
							<div className="name">{name}</div>
542
							</div>
-
 
543
							<span
538
							<span
544
								style={{
539
								style={{
545
									cursor: 'pointer',
540
									cursor: 'pointer',
546
								}}
541
								}}
547
								onClick={() => {
542
								onClick={() => {
Línea 614... Línea 609...
614
		/>
609
		/>
615
	)
610
	)
Línea 616... Línea 611...
616
 
611
 
617
	const userChat = (
612
	const userChat = (
618
		<React.Fragment>
-
 
619
			<div
613
		<React.Fragment>
620
				className="chatbox active-chat"
-
 
621
				style={{
-
 
622
					bottom: '0px',
-
 
623
					right: `${(index + 1) * 295}px`,
-
 
624
					zIndex: '1',
-
 
625
					display: 'block',
-
 
626
				}}
-
 
627
			>
614
			<div className="chatbox active-chat">
628
				<div className="chatbox-icon">
615
				<div className="chatbox-icon">
629
					<div className="contact-floating red">
616
					<div className="contact-floating red">
630
						<img className="chat-image img-circle pull-left" src={image} />
617
						<img className="chat-image img-circle pull-left" src={image} />
631
						<small className="unread-msg">2</small>
618
						<small className="unread-msg">2</small>
Línea 664... Línea 651...
664
                      <i className="fa fa-trash"></i>
651
                      <i className="fa fa-trash"></i>
665
                    </span> */}
652
                    </span> */}
666
										</div>
653
										</div>
667
										<div
654
										<div
668
											className="btn-group"
655
											className="btn-group"
669
										// onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
656
											// onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
670
										// href="javascript:void(0)"
657
											// href="javascript:void(0)"
671
										>
658
										>
672
											{/* <span>
659
											{/* <span>
673
                      <i className="fa fa-trash"></i>
660
                      <i className="fa fa-trash"></i>
674
                    </span> */}
661
                    </span> */}
675
										</div>
662
										</div>
676
										<div
663
										<div
677
											className="btn-group"
664
											className="btn-group"
678
										// onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
665
											// onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
679
										// href="javascript:void(0)"
666
											// href="javascript:void(0)"
680
										>
667
										>
681
											<span>
668
											<span>
682
												<i
669
												<i
683
													className={'fa fa-minus-circle'}
670
													className={'fa fa-minus-circle'}
684
													onClick={handleActive}
671
													onClick={handleActive}
685
												></i>
672
												></i>
686
											</span>
673
											</span>
687
										</div>
674
										</div>
688
										<div
675
										<div
689
											className="btn-group"
676
											className="btn-group"
690
										// onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
677
											// onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
691
										// href="javascript:void(0)"
678
											// href="javascript:void(0)"
692
										>
679
										>
693
											<span>
680
											<span>
694
												<i
681
												<i
695
													className="fa fa-times-circle"
682
													className="fa fa-times-circle"
696
													onClick={handleCloseChat}
683
													onClick={handleCloseChat}
Línea 709... Línea 696...
709
						<div
696
						<div
710
							id="uploader_'+chatboxtitle+'"
697
							id="uploader_'+chatboxtitle+'"
711
							style={{ display: 'none', height: '342px' }}
698
							style={{ display: 'none', height: '342px' }}
712
						>
699
						>
713
							<p>
700
							<p>
714
								Your browser does not have Flash, Silverlight or HTML5 support.
701
                Your browser does not have Flash, Silverlight or HTML5 support.
715
							</p>
702
							</p>
716
						</div>
703
						</div>
717
						<div className="chat-conversation" style={{ position: 'relative' }}>
704
						<div className="chat-conversation" style={{ position: 'relative' }}>
718
							<div className="reverseChatBox" ref={conversationListEl}>
705
							<div className="reverseChatBox" ref={conversationListEl}>
719
								<ul
706
								<ul
Línea 723... Línea 710...
723
									{messagesRender()}
710
									{messagesRender()}
724
								</ul>
711
								</ul>
725
							</div>
712
							</div>
726
							<div className="wchat-footer wchat-chat-footer chatboxinput">
713
							<div className="wchat-footer wchat-chat-footer chatboxinput">
727
								<div id="chatFrom" className="chatFrom">
714
								<div id="chatFrom" className="chatFrom">
-
 
715
									<div className={responseMessage ? 'resp_messages-container active' : 'resp_messages-container'}>
728
									{
716
										{
729
										responseMessage
717
											responseMessage
730
										&&
718
                      &&
731
										<div className={responseMessage ? 'resp_messages-container active' : 'resp_messages-container'}>
719
                      <>
732
											<span>{`Respondiendo a ${responseMessage.user_name}`}</span>
720
                      	<span>{`Respondiendo a ${responseMessage.user_name}`}</span>
733
											<p>{responseMessage.m}</p>
721
                      	<p>{responseMessage.m}</p>
-
 
722
                      </>
734
										</div>
723
										}
735
									}
724
									</div>
736
									<div className="block-wchat">
725
									<div className="block-wchat">
737
										<button
726
										<button
738
											className="icon ti-clip attachment font-24 btn-attach btn-attach uploadFile"
727
											className="icon ti-clip attachment font-24 btn-attach btn-attach uploadFile"
739
											id="uploadFile"
728
											id="uploadFile"
740
											onClick={handleShareFileModalShow}
729
											onClick={handleShareFileModalShow}
Línea 748... Línea 737...
748
											<div className="input-emoji">
737
											<div className="input-emoji">
749
												<div
738
												<div
750
													className="input-placeholder"
739
													className="input-placeholder"
751
													style={{ visibility: 'hidden', display: 'none' }}
740
													style={{ visibility: 'hidden', display: 'none' }}
752
												>
741
												>
753
													Escribe un mensaje
742
                          Escribe un mensaje
754
												</div>
743
												</div>
755
												<textarea
744
												<textarea
756
													className="input chatboxtextarea"
745
													className="input chatboxtextarea"
757
													id="chatboxtextarea"
746
													id="chatboxtextarea"
758
													name="chattxt"
747
													name="chattxt"
759
													style={{ resize: 'none', height: '20px' }}
748
													style={{ resize: 'none', height: '20px' }}
760
													placeholder="Escribe un mensaje"
749
													placeholder="Escribe un mensaje"
761
													onKeyDown={handleChatBoxKeyDown}
750
													onKeyDown={handleChatBoxKeyDown}
762
													ref={textAreaEl}
751
													ref={textAreaEl}
763
													onBlur={() => responseMessage && setResponseMessage(null)}
-
 
764
													onFocus={() => onRead(index)}
752
													onFocus={() => onRead(index)}
765
												></textarea>
753
												></textarea>
766
												<input
754
												<input
767
													id="to_uname"
755
													id="to_uname"
768
													name="to_uname"
756
													name="to_uname"
Línea 849... Línea 837...
849
                      <i className="fa fa-trash"></i>
837
                      <i className="fa fa-trash"></i>
850
                    </span> */}
838
                    </span> */}
851
										</div>
839
										</div>
852
										<div
840
										<div
853
											className="btn-group"
841
											className="btn-group"
854
										// onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
842
											// onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
855
										// href="javascript:void(0)"
843
											// href="javascript:void(0)"
856
										>
844
										>
857
											{/* <span>
845
											{/* <span>
858
                      <i className="fa fa-trash"></i>
846
                      <i className="fa fa-trash"></i>
859
                    </span> */}
847
                    </span> */}
860
										</div>
848
										</div>
Línea 871... Línea 859...
871
												></i>
859
												></i>
872
											</span>
860
											</span>
873
										</div>
861
										</div>
874
										<div
862
										<div
875
											className="btn-group"
863
											className="btn-group"
876
										// onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
864
											// onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
877
										// href="javascript:void(0)"
865
											// href="javascript:void(0)"
878
										>
866
										>
879
											<span>
867
											<span>
880
												<i
868
												<i
881
													className={'fa fa-minus-circle'}
869
													className={'fa fa-minus-circle'}
882
													onClick={handleActive}
870
													onClick={handleActive}
883
												></i>
871
												></i>
884
											</span>
872
											</span>
885
										</div>
873
										</div>
886
										<div
874
										<div
887
											className="btn-group"
875
											className="btn-group"
888
										// onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
876
											// onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
889
										// href="javascript:void(0)"
877
											// href="javascript:void(0)"
890
										>
878
										>
891
											<span>
879
											<span>
892
												<i
880
												<i
893
													className="fa fa-times-circle"
881
													className="fa fa-times-circle"
894
													onClick={handleCloseChat}
882
													onClick={handleCloseChat}
Línea 940... Línea 928...
940
											<div className="input-emoji">
928
											<div className="input-emoji">
941
												<div
929
												<div
942
													className="input-placeholder"
930
													className="input-placeholder"
943
													style={{ visibility: 'hidden', display: 'none' }}
931
													style={{ visibility: 'hidden', display: 'none' }}
944
												>
932
												>
945
													Escribe un mensaje
933
                          Escribe un mensaje
946
												</div>
934
												</div>
947
												<textarea
935
												<textarea
948
													className="input chatboxtextarea"
936
													className="input chatboxtextarea"
949
													id="chatboxtextarea"
937
													id="chatboxtextarea"
950
													name="chattxt"
938
													name="chattxt"
951
													style={{ resize: 'none', height: '20px' }}
939
													style={{ resize: 'none', height: '20px' }}
952
													placeholder="Escribe un mensaje"
940
													placeholder="Escribe un mensaje"
953
													onKeyDown={handleChatBoxKeyDown}
941
													onKeyDown={handleChatBoxKeyDown}
954
													ref={textAreaEl}
942
													ref={textAreaEl}
955
													onFocus={() => onRead(index)}
943
													onFocus={() => onRead(index)}
956
													onBlur={() => responseMessage && setResponseMessage(null)}
-
 
957
												></textarea>
944
												></textarea>
958
												<input
945
												<input
959
													id="to_uname"
946
													id="to_uname"
960
													name="to_uname"
947
													name="to_uname"
961
													value="'+chatboxtitle+'"
948
													value="'+chatboxtitle+'"