Proyectos de Subversion LeadersLinked - Backend

Rev

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

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