parse reply events
This commit is contained in:
		
							parent
							
								
									b2691f0c85
								
							
						
					
					
						commit
						5d0e96a675
					
				| @ -1,18 +1,25 @@ | ||||
| <template> | ||||
|     <div :class="type==='send'?'messageSend':'messageReceive'" class="message"> | ||||
|       <div v-html="solveTextLinks(msg.replace(/</g, '<') | ||||
|          .replace(/>/g, '>'))"></div> | ||||
|       <div v-if="replyEvent" class="reply"> | ||||
|         {{replyEvent.sender}}<br> | ||||
|         {{replyEvent.type==='m.room.message'?replyEvent.content.body:'unkown event'}} | ||||
|       </div> | ||||
|       <div v-html="parseMessage(msg)"></div> | ||||
|       <div class="time">{{time}}</div> | ||||
|     </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| import {matrix} from "@/main"; | ||||
| 
 | ||||
| export default { | ||||
|   name: "message", | ||||
|   props: { | ||||
|     msg: String, | ||||
|     time: String, | ||||
|     type: String | ||||
|     type: String, | ||||
|     content: Object, | ||||
|     roomId: String | ||||
|   }, | ||||
|   methods:{ | ||||
|     solveTextLinks(text){ | ||||
| @ -26,7 +33,33 @@ export default { | ||||
|           return `${space}<a href="${hyperlink}" target="_blank">${url}</a>`; | ||||
|         } | ||||
|       ) | ||||
|     }, | ||||
|     async getReplyEvent(content) { | ||||
|       let replyId = this.getReplyId(content); | ||||
|       if (replyId === undefined) return undefined; | ||||
|       await matrix.client.fetchRoomEvent(this.roomId, replyId).then((res) => { | ||||
|         this.replyEvent = res; | ||||
|       }); | ||||
|     }, | ||||
|     getReplyId(content){ | ||||
|       if(!content['m.relates_to']) return undefined; | ||||
|       return content['m.relates_to']['m.in_reply_to'].event_id || undefined; | ||||
|     }, | ||||
|     parseMessage(msg){ | ||||
|       return this.solveTextLinks( | ||||
|         msg.replace(/>.*\n/gm, '').trim() | ||||
|           .replace(/</g, '<') | ||||
|           .replace(/>/g, '>') | ||||
|       ); | ||||
|     } | ||||
|   }, | ||||
|   data(){ | ||||
|     return{ | ||||
|       replyEvent: undefined | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.getReplyEvent(this.content); | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| @ -61,4 +94,9 @@ export default { | ||||
|     font-size: 0.7rem; | ||||
|     text-align: right; | ||||
|   } | ||||
|   .reply{ | ||||
|     border-left:  2px solid #fff; | ||||
|     padding-left: 0.5rem; | ||||
|     margin-bottom: 0.5rem; | ||||
|   } | ||||
| </style> | ||||
| @ -30,9 +30,12 @@ | ||||
|           :key="event.origin_server_ts" | ||||
|           :title="`${group[0].sender} at ${getTime(event.origin_server_ts)}`" | ||||
|         > | ||||
|           <message v-if="event.content.msgtype==='m.text'" | ||||
|           <message | ||||
|             v-if="event.content.msgtype==='m.text'" | ||||
|             :type="event.sender === user?'send':'receive'" | ||||
|             :msg=event.content.body :time=getTime(event.origin_server_ts) | ||||
|             :content="event.content" | ||||
|             :roomId="roomId" | ||||
|           /> | ||||
|           <div v-else-if="event.type==='m.room.member'" class="info"> | ||||
|             {{membershipEvents[event.content.membership]}} | ||||
| @ -52,6 +55,7 @@ import userThumbnail from "@/components/userThumbnail"; | ||||
| import {matrix} from "@/main"; | ||||
| import splitArray from "@/lib/splitArray"; | ||||
| import {getDate, getTime} from "@/lib/getTimeStrings"; | ||||
| import sdk from "matrix-js-sdk" | ||||
| 
 | ||||
| export default { | ||||
|   name: 'eventGroup', | ||||
| @ -62,12 +66,25 @@ export default { | ||||
|   props: { | ||||
|     timeline: Array, | ||||
|     user: String, | ||||
|     groupTimeline: Boolean | ||||
|     groupTimeline: Boolean, | ||||
|     roomId: String | ||||
|   }, | ||||
|   methods: { | ||||
|     getUser(userId) { | ||||
|       return matrix.client.getUser(userId); | ||||
|     }, | ||||
|     getReplyId(event){ | ||||
|       if(!event.content['m.relates_to']) return undefined; | ||||
|       if(!event.content['m.relates_to']['m.in_reply_to']) return undefined; | ||||
|       return event.content['m.relates_to']['m.in_reply_to'].event_id || undefined; | ||||
|     }, | ||||
|     async getReplyEvent(event, callback){ | ||||
|       let replyId = this.getReplyId(event); | ||||
|       if (replyId === undefined) return undefined; | ||||
|       await matrix.client.fetchRoomEvent(this.roomId, replyId).then((res) => { | ||||
|         callback(new sdk.MatrixEvent(res)); | ||||
|       }); | ||||
|     }, | ||||
|     splitArray, | ||||
|     getDate, | ||||
|     getTime | ||||
| @ -126,6 +143,7 @@ export default { | ||||
|       } | ||||
|       .username{ | ||||
|         margin-left: 1rem; | ||||
|         font-weight: bold; | ||||
|       } | ||||
|       .event{ | ||||
|         .info{ | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
|       <div @scroll="scrollHandler()" ref="msgContainer" id="messagesContainer" class="messagesContainer"> | ||||
|         <div v-if="loadingStatus" @click="loadEvents()" class="loadMore">{{loadingStatus}}</div> | ||||
|         <p v-if="room.timeline.length === 0" class="chatInfo">this room is empty</p> | ||||
|         <timeline :timeline="room.timeline" :group-timeline="isGroup()" :user="user"/> | ||||
|         <timeline :timeline="room.timeline" :group-timeline="isGroup()" :user="user" :roomId="room.roomId"/> | ||||
|       </div> | ||||
|       <icon v-if="showScrollBtn" @click.native="scrollToBottom()" id="scrollDown" ic="./sym/expand_more-black-24dp.svg" /> | ||||
|     </div> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user