1
+ import Button from "@/app/components/Button" ;
2
+ import Select from "@/app/components/inputs/Select" ;
3
+ import Modal from "@/app/components/Modal" ;
4
+ import { FullConversationType , FullMessageType } from "@/app/types" ;
5
+ import { socket } from "@/socket" ;
6
+ import { Conversation } from "@prisma/client" ;
7
+ import axios from "axios" ;
8
+ import { useSession } from "next-auth/react" ;
9
+ import { useEffect , useState } from "react" ;
10
+ import toast from "react-hot-toast" ;
11
+
12
+ interface ForwardModalProps {
13
+ data : FullMessageType ,
14
+ isOpen : boolean ,
15
+ setIsOpen : ( status : boolean ) => void
16
+ } ;
17
+
18
+ const ForwardModal : React . FC < ForwardModalProps > = ( {
19
+ data : { file, fileType, body, id } , isOpen, setIsOpen
20
+ } ) => {
21
+ const { data : session , status } = useSession ( ) ;
22
+ const [ isLoading , setIsLoading ] = useState < boolean > ( false ) ;
23
+ const [ to , setTo ] = useState < string [ ] > ( [ ] ) ;
24
+ const [ conversations , setConversations ] = useState < Conversation [ ] > ( [ ] ) ;
25
+
26
+ const handleForward = async ( ) => {
27
+ if ( to . length === 0 ) {
28
+ toast . error ( "Please select atleast one conversation" ) ;
29
+ return ;
30
+ }
31
+
32
+ setIsLoading ( true ) ;
33
+
34
+ await Promise . all ( to . map ( conversationId => {
35
+ return new Promise ( resolve => {
36
+ axios . post ( "/api/messages" , {
37
+ message : body ,
38
+ conversationId,
39
+ isForwarded : true ,
40
+ file,
41
+ fileType
42
+ } )
43
+ . then ( response => {
44
+ socket . emit ( 'send_message' , response . data ) ;
45
+ socket . emit ( 'update_conversation' , response . data ) ;
46
+ } )
47
+ . catch ( error => {
48
+ console . error ( error ) ;
49
+ toast . error ( "Failed to forward" ) ;
50
+ } )
51
+ . finally ( ( ( ) => resolve ( 1 ) ) ) ;
52
+ } ) ;
53
+ } ) ) ;
54
+
55
+ toast . success ( "Forwarded" ) ;
56
+ setIsLoading ( false ) ;
57
+ setTo ( [ ] ) ;
58
+ setIsOpen ( false ) ;
59
+ } ;
60
+
61
+ useEffect ( ( ) => {
62
+ if ( ! session ?. user ) {
63
+ setConversations ( [ ] ) ;
64
+ return ;
65
+ }
66
+
67
+ axios . get ( "/api/conversations" )
68
+ . then ( res => {
69
+ const conversations = res . data ;
70
+
71
+ const mapped = conversations . map ( ( c : FullConversationType ) => {
72
+ if ( c . isGroup ) {
73
+ return {
74
+ label : c . name ,
75
+ value : c . id
76
+ } ;
77
+ } else {
78
+ const otherUserConversation = c . userConversations . find ( ( uc :any ) => uc . user . email !== session ?. user ?. email ) ;
79
+
80
+ if ( ! otherUserConversation ) return {
81
+ label : c . userConversations [ 0 ] ?. user ?. name || c . id ,
82
+ value : c . id
83
+ } ;
84
+
85
+ return {
86
+ label : otherUserConversation . user . name ,
87
+ value : c . id
88
+ } ;
89
+ }
90
+ } ) ;
91
+
92
+ setConversations ( mapped ) ;
93
+ } )
94
+ . catch ( error => {
95
+ console . error ( error ) ;
96
+ toast . error ( "Something went wrong" ) ;
97
+ } ) ;
98
+ } , [ session ] ) ;
99
+
100
+ return (
101
+ < Modal isOpen = { isOpen } onClose = { ( ) => setIsOpen ( false ) } >
102
+ < p >
103
+ { body ?. slice ( 0 , 50 ) }
104
+ { file ?. split ( "/" ) . pop ( ) }
105
+ </ p >
106
+ < br />
107
+ < Select
108
+ options = { conversations }
109
+ label = "Forward to"
110
+ onChange = { ( records : any ) => setTo ( records . map ( ( r : any ) => r . value ) ) }
111
+ />
112
+ < br />
113
+ < Button onClick = { handleForward } disabled = { ! to . length || isLoading } >
114
+ Forward
115
+ </ Button >
116
+ </ Modal >
117
+ ) ;
118
+ } ;
119
+
120
+ export default ForwardModal ;
0 commit comments