@@ -14,7 +14,14 @@ import { StorageContext } from '../../context/StorageContext';
14
14
import { Connection } from '../../interfaces/web3' ;
15
15
import { getHaltDelivery } from '../../utils/common-utils' ;
16
16
import { MessageActionType } from '../../utils/enum-type-utils' ;
17
- import { encryptAsymmetric } from '@dm3-org/dm3-lib-crypto' ;
17
+ import { decryptAsymmetric , encryptAsymmetric } from '@dm3-org/dm3-lib-crypto' ;
18
+ import {
19
+ getDeliveryServiceProfile ,
20
+ normalizeEnsName ,
21
+ } from '@dm3-org/dm3-lib-profile' ;
22
+ import { useMainnetProvider } from '../mainnetprovider/useMainnetProvider' ;
23
+ import axios from 'axios' ;
24
+ import { fetchNewMessages } from '../../adapters/messages' ;
18
25
19
26
type MessageStorage = { [ contact : string ] : StorageEnvelopContainer [ ] } ;
20
27
@@ -27,18 +34,20 @@ export const useMessage = (connection: Connection) => {
27
34
getMessages : getMessagesFromStorage ,
28
35
storeMessage,
29
36
} = useContext ( StorageContext ) ;
37
+
38
+ const mainnetProvider = useMainnetProvider ( ) ;
30
39
const [ messages , setMessages ] = useState < MessageStorage > ( { } ) ;
31
40
32
41
const [ contactsLoading , setContactsLoading ] = useState < string [ ] > ( [ ] ) ;
33
42
34
43
useEffect ( ( ) => {
35
44
//Find new contacts
36
45
const newContacts = contacts . filter (
37
- ( contact ) => ! messages [ contact . name ] ,
46
+ ( contact ) => ! messages [ contact . contactDetails . account . ensName ] ,
38
47
) ;
39
48
40
49
newContacts . forEach ( ( contact ) => {
41
- addNewContact ( contact . name ) ;
50
+ addNewContact ( contact . contactDetails . account . ensName ) ;
42
51
} ) ;
43
52
} , [ contacts ] ) ;
44
53
@@ -47,13 +56,15 @@ export const useMessage = (connection: Connection) => {
47
56
} , [ messages ] ) ;
48
57
49
58
const contactIsLoading = useCallback (
50
- ( contact : string ) => {
59
+ ( _contactName : string ) => {
60
+ const contact = normalizeEnsName ( _contactName ) ;
51
61
return contactsLoading . includes ( contact ) ;
52
62
} ,
53
63
[ contactsLoading ] ,
54
64
) ;
55
65
56
- const addNewContact = ( contact : string ) => {
66
+ const addNewContact = ( _contactName : string ) => {
67
+ const contact = normalizeEnsName ( _contactName ) ;
57
68
//Contact already exists
58
69
if ( messages [ contact ] ) {
59
70
return ;
@@ -67,7 +78,8 @@ export const useMessage = (connection: Connection) => {
67
78
loadInitialMessages ( contact ) ;
68
79
} ;
69
80
70
- const addMessage = async ( contact : string , message : Message ) => {
81
+ const addMessage = async ( _contactName : string , message : Message ) => {
82
+ const contact = normalizeEnsName ( _contactName ) ;
71
83
//Find the recipient of the message in the contact list
72
84
const recipient = contacts . find ( ( c ) => c . name === contact ) ;
73
85
@@ -103,6 +115,7 @@ export const useMessage = (connection: Connection) => {
103
115
] ,
104
116
} ;
105
117
} ) ;
118
+ console . log ( 'storeMessage' , contact , storageEnvelopContainer ) ;
106
119
storeMessage ( contact , storageEnvelopContainer ) ;
107
120
return ;
108
121
}
@@ -148,31 +161,90 @@ export const useMessage = (connection: Connection) => {
148
161
} ;
149
162
150
163
const getMessages = useCallback (
151
- ( contact : string ) => {
152
- return messages [ contact ] ?? [ ] ;
164
+ ( _contactName : string ) => {
165
+ const contactName = normalizeEnsName ( _contactName ) ;
166
+ console . log ( 'get messages for ' , contactName ) ;
167
+ console . log ( 'return messages ' , messages [ contactName ] ?? [ ] ) ;
168
+ return messages [ contactName ] ?? [ ] ;
153
169
} ,
154
170
[ messages ] ,
155
171
) ;
156
172
157
- const loadInitialMessages = async ( contactName : string ) => {
173
+ const fetchMessagesFromStorage = async ( contactName : string ) => {
158
174
setContactsLoading ( ( prev ) => {
159
175
return [ ...prev , contactName ] ;
160
176
} ) ;
161
177
const MAX_MESSAGES_PER_CHUNK = 100 ;
162
178
const numberOfmessages = await getNumberOfMessages ( contactName ) ;
163
- const lastMessages = await getMessagesFromStorage (
179
+ const storedMessages = await getMessagesFromStorage (
164
180
contactName ,
165
181
Math . floor ( numberOfmessages / MAX_MESSAGES_PER_CHUNK ) ,
166
182
) ;
167
183
168
- console . log ( numberOfmessages , lastMessages ) ;
169
- console . log ( contactName , lastMessages ) ;
184
+ console . log (
185
+ `got messages from Storage for ${ contactName } ` ,
186
+ storedMessages ,
187
+ ) ;
170
188
171
- const messages = lastMessages . filter (
172
- ( { envelop } : StorageEnvelopContainer ) => {
173
- return envelop . message . metadata ?. type === MessageActionType . NEW ;
174
- } ,
189
+ return storedMessages ;
190
+ } ;
191
+
192
+ const fetchMessagesFromDeliveryService = async ( contactName : string ) => {
193
+ //Fetch the pending messages from the delivery service
194
+ const encryptedIncommingMessages = await fetchNewMessages (
195
+ mainnetProvider ,
196
+ account ! ,
197
+ deliveryServiceToken ! ,
198
+ contactName ,
199
+ ) ;
200
+
201
+ const incommingMessages : StorageEnvelopContainer [ ] = await Promise . all (
202
+ encryptedIncommingMessages . map ( async ( envelop ) => {
203
+ const decryptedEnvelop : Envelop = {
204
+ message : JSON . parse (
205
+ await decryptAsymmetric (
206
+ profileKeys ?. encryptionKeyPair ! ,
207
+ JSON . parse ( envelop . message ) ,
208
+ ) ,
209
+ ) ,
210
+ postmark : JSON . parse (
211
+ await decryptAsymmetric (
212
+ profileKeys ?. encryptionKeyPair ! ,
213
+ JSON . parse ( envelop . postmark ! ) ,
214
+ ) ,
215
+ ) ,
216
+ metadata : envelop . metadata ,
217
+ } ;
218
+ return {
219
+ envelop : decryptedEnvelop ,
220
+ //Messages from the delivery service are already send by the sender
221
+ messageState : MessageState . Send ,
222
+ } ;
223
+ } ) ,
224
+ ) ;
225
+
226
+ console . log (
227
+ `got messages from DS for ${ contactName } ` ,
228
+ incommingMessages ,
175
229
) ;
230
+
231
+ return incommingMessages ;
232
+ } ;
233
+
234
+ const loadInitialMessages = async ( _contactName : string ) => {
235
+ const contactName = normalizeEnsName ( _contactName ) ;
236
+
237
+ const initialMessages = await Promise . all ( [
238
+ fetchMessagesFromDeliveryService ( contactName ) ,
239
+ fetchMessagesFromStorage ( contactName ) ,
240
+ ] ) ;
241
+
242
+ const messages = initialMessages
243
+ . reduce ( ( acc , val ) => acc . concat ( val ) , [ ] )
244
+ . filter ( ( { envelop } : StorageEnvelopContainer ) => {
245
+ return envelop . message . metadata ?. type === MessageActionType . NEW ;
246
+ } ) ;
247
+
176
248
setMessages ( ( prev ) => {
177
249
return {
178
250
...prev ,
0 commit comments