@@ -6,7 +6,7 @@ import Shared.Im.Types
6
6
7
7
import Client.Common.Dom as CCD
8
8
import Client.Common.File as CCF
9
- import Client.Im.Flame (NextMessage , NoMessages , MoreMessages )
9
+ import Client.Im.Flame (MoreMessages , NextMessage , NoMessages )
10
10
import Client.Im.Record as CIR
11
11
import Client.Im.Scroll as CIS
12
12
import Client.Im.WebSocket as CIW
@@ -48,6 +48,7 @@ import Shared.Markdown as SM
48
48
import Shared.Resource (maxImageSize )
49
49
import Shared.Unsafe ((!@))
50
50
import Shared.Unsafe as SU
51
+ import Test.Client.Model (model )
51
52
import Type.Proxy (Proxy (..))
52
53
import Web.DOM (Element )
53
54
import Web.DOM.Element as WDE
@@ -58,6 +59,7 @@ import Web.HTML.Event.DataTransfer as WHEDT
58
59
import Web.HTML.Event.DragEvent as WHED
59
60
import Web.HTML.HTMLElement as WHHE
60
61
import Web.HTML.HTMLElement as WHHEL
62
+ import Web.HTML.HTMLMetaElement (content )
61
63
import Web.HTML.HTMLTextAreaElement as WHHTA
62
64
import Web.Socket.WebSocket (WebSocket )
63
65
@@ -134,7 +136,7 @@ beforeSendMessage
134
136
sendMessage ∷ WebSocket → MessageContent → DateTimeWrapper → ImModel → NoMessages
135
137
sendMessage
136
138
webSocket
137
- content
139
+ contentMessage
138
140
date
139
141
model@
140
142
{ user
@@ -148,37 +150,63 @@ sendMessage
148
150
WHHEL .focus <<< SU .fromJust $ WHHEL .fromElement input
149
151
CCD .setValue input " "
150
152
resizeTextarea input
151
- CIW .sendPayload webSocket $ OutgoingMessage
152
- { id: newTemporaryId
153
- , userId: recipientId
154
- , content
155
- , turn
156
- }
153
+ CIW .sendPayload webSocket $
154
+ case model.editing of
155
+ Nothing →
156
+ OutgoingMessage
157
+ { id: newTemporaryId
158
+ , userId: recipientId
159
+ , content: contentMessage
160
+ , turn
161
+ }
162
+ Just messageId →
163
+ EditedMessage
164
+ { id: messageId
165
+ , userId: recipientId
166
+ , content: contentMessage
167
+ }
157
168
pure Nothing
158
169
]
159
170
where
160
171
index = SU .fromJust chatting
161
172
recipient@{ user: { id: recipientId }, history } = contacts !@ index
162
173
newTemporaryId = temporaryId + 1
163
174
175
+ content =
176
+ case contentMessage of
177
+ Text message → message
178
+ Image caption base64File → asMarkdownImage caption base64File
179
+ Audio base64 → asAudioMessage base64
180
+
181
+ updateEdited messageId history
182
+ | history.id == messageId =
183
+ history
184
+ { content = content
185
+ , status = Sent
186
+ }
187
+ | otherwise = history
188
+
164
189
updatedContact = recipient
165
190
{ lastMessageDate = date
166
- , history = DA .snoc history $
167
- { id: newTemporaryId
168
- , status: Sent
169
- , sender: user.id
170
- , recipient: recipientId
171
- , date
172
- , content: case content of
173
- Text message → message
174
- Image caption base64File → asMarkdownImage caption base64File
175
- Audio base64 → asAudioMessage base64
176
- }
191
+ , history =
192
+ case model.editing of
193
+ Nothing →
194
+ DA .snoc history $
195
+ { id: newTemporaryId
196
+ , status: Sent
197
+ , sender: user.id
198
+ , edited: false
199
+ , recipient: recipientId
200
+ , date
201
+ , content
202
+ }
203
+ Just messageId → map (updateEdited messageId) history
177
204
}
178
205
updatedModel = model
179
206
{ temporaryId = newTemporaryId
180
207
, imageCaption = Nothing
181
208
, selectedImage = Nothing
209
+ , editing = Nothing
182
210
, contacts = SU .fromJust $ DA .updateAt index updatedContact contacts
183
211
}
184
212
turn = makeTurn user updatedContact
@@ -500,3 +528,14 @@ updateTyping userId status model@{ contacts } = model { contacts = upd <$> conta
500
528
upd contact@{ user: { id } }
501
529
| id == userId = contact { typing = status }
502
530
| otherwise = contact
531
+
532
+ editMessage ∷ String → Int → ImModel → NoMessages
533
+ editMessage message id model =
534
+ model
535
+ { editing = Just id
536
+ , toggleContextMenu = HideContextMenu
537
+ } /\ [ setIt *> pure Nothing ]
538
+ where
539
+ setIt = liftEffect do
540
+ input ← chatInput model.chatting
541
+ CCD .setValue input message
0 commit comments