kopia lustrzana https://github.com/nextcloud/social
				
				
				
			Merge pull request #731 from StCyr/stcyr-fix157
Prevent posting of direct message with no valid recipientspull/759/head
						commit
						f5c4376485
					
				|  | @ -66,7 +66,7 @@ class StreamRequestBuilder extends CoreRequestBuilder { | |||
| 	 */ | ||||
| 	protected function getStreamInsertSql(): SocialQueryBuilder { | ||||
| 		$qb = $this->getQueryBuilder(); | ||||
| 		$qb->insert(self::TABLE_STREAMS); | ||||
| 		$qb->insert(self::TABLE_STREAM); | ||||
| 
 | ||||
| 		return $qb; | ||||
| 	} | ||||
|  | @ -79,7 +79,7 @@ class StreamRequestBuilder extends CoreRequestBuilder { | |||
| 	 */ | ||||
| 	protected function getStreamUpdateSql(): SocialQueryBuilder { | ||||
| 		$qb = $this->getQueryBuilder(); | ||||
| 		$qb->update(self::TABLE_STREAMS); | ||||
| 		$qb->update(self::TABLE_STREAM); | ||||
| 
 | ||||
| 		return $qb; | ||||
| 	} | ||||
|  | @ -132,7 +132,7 @@ class StreamRequestBuilder extends CoreRequestBuilder { | |||
| 	 */ | ||||
| 	protected function getStreamDeleteSql(): SocialQueryBuilder { | ||||
| 		$qb = $this->getQueryBuilder(); | ||||
| 		$qb->delete(self::TABLE_STREAMS); | ||||
| 		$qb->delete(self::TABLE_STREAM); | ||||
| 
 | ||||
| 		return $qb; | ||||
| 	} | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ | |||
| 			</masonry> | ||||
| 
 | ||||
| 			<div class="options"> | ||||
| 				<input :value="currentVisibilityPostLabel" :disabled="post.length < 1" class="submit primary" | ||||
| 				<input :value="currentVisibilityPostLabel" :disabled="post.length < 1 || post==='br'" class="submit primary" | ||||
| 					type="submit" title="" data-original-title="Post"> | ||||
| 				<div v-click-outside="hidePopoverMenu"> | ||||
| 					<button :class="currentVisibilityIconClass" @click.prevent="togglePopoverMenu" /> | ||||
|  | @ -422,6 +422,7 @@ export default { | |||
| 			search: '', | ||||
| 			replyTo: null, | ||||
| 			tributeOptions: { | ||||
| 				spaceSelectsMatch: true, | ||||
| 				collection: [ | ||||
| 					{ | ||||
| 						trigger: '@', | ||||
|  | @ -743,7 +744,7 @@ export default { | |||
| 			let contentHtml = element.innerHTML | ||||
| 			let to = [] | ||||
| 			let hashtags = [] | ||||
| 			const mentionRegex = /@(([\w-_.]+)(@[\w-.]+)?)/g | ||||
| 			const mentionRegex = /<span class="mention"[^>]+><a[^>]+><img[^>]+>@([\w-_.]+@[\w-.]+)/g | ||||
| 			let match = null | ||||
| 			do { | ||||
| 				match = mentionRegex.exec(contentHtml) | ||||
|  | @ -782,9 +783,34 @@ export default { | |||
| 			// Trick to let vue-contenteditable know that tribute replaced a mention or hashtag | ||||
| 			this.$refs.composerInput.oninput(event) | ||||
| 		}, | ||||
| 		createPost(event) { | ||||
| 		createPost: async function(event) { | ||||
| 
 | ||||
| 			let postData = this.getPostData() | ||||
| 
 | ||||
| 			// Trick to validate last mention when the user directly clicks on the "post" button without validating it. | ||||
| 			let regex = /@([-\w]+)$/ | ||||
| 			let lastMention = postData.content.match(regex) | ||||
| 			if (lastMention) { | ||||
| 
 | ||||
| 				// Ask the server for matching accounts, and wait for the results | ||||
| 				let result = await this.remoteSearchAccounts(lastMention[1]) | ||||
| 
 | ||||
| 				// Validate the last mention only when it matches a single account | ||||
| 				if (result.data.result.accounts.length === 1) { | ||||
| 					postData.content = postData.content.replace(regex, '@' + result.data.result.accounts[0].account) | ||||
| 					postData.to.push(result.data.result.accounts[0].account) | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// Abort if the post is a direct message and no valid mentions were found | ||||
| 			if (this.type === 'direct' && postData.to.length === 0) { | ||||
| 				OC.Notification.showTemporary(t('social', 'Error while trying to post your message: Could not find any valid recipients.'), { type: 'error' }) | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 			// Post message | ||||
| 			this.loading = true | ||||
| 			this.$store.dispatch('post', this.getPostData()).then((response) => { | ||||
| 			this.$store.dispatch('post', postData).then((response) => { | ||||
| 				this.loading = false | ||||
| 				this.replyTo = null | ||||
| 				this.post = '' | ||||
|  | @ -793,6 +819,7 @@ export default { | |||
| 				this.miniatures = [] | ||||
| 				this.$store.dispatch('refreshTimeline') | ||||
| 			}) | ||||
| 
 | ||||
| 		}, | ||||
| 		remoteSearchAccounts(text) { | ||||
| 			return axios.get(OC.generateUrl('apps/social/api/v1/global/accounts/search?search=' + text)) | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Maxence Lange
						Maxence Lange