forked from cory/tildefriends
		
	Update mentions whenever attaching images or updating markdown. Also show them.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4011 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -11,6 +11,7 @@ class TfComposeElement extends LitElement { | ||||
| 			users: {type: Object}, | ||||
| 			root: {type: String}, | ||||
| 			branch: {type: String}, | ||||
| 			mentions: {type: Object}, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -21,12 +22,62 @@ class TfComposeElement extends LitElement { | ||||
| 		this.users = {}; | ||||
| 		this.root = undefined; | ||||
| 		this.branch = undefined; | ||||
| 		this.mentions = {}; | ||||
| 	} | ||||
|  | ||||
| 	changed(event) { | ||||
| 		let edit = this.renderRoot.getElementById('edit'); | ||||
| 		let preview = this.renderRoot.getElementById('preview'); | ||||
| 		preview.innerHTML = tfutils.markdown(edit.value); | ||||
| 		let text = edit.value; | ||||
|  | ||||
| 		/* Update mentions. */ | ||||
| 		for (let match of text.matchAll(/\[([^\[]+)]\(([@&%][^\)]+)/g)) { | ||||
| 			let name = match[1]; | ||||
| 			let link = match[2]; | ||||
| 			let balance = 0; | ||||
| 			let bracket_end = match.index + match[1].length + '[]'.length - 1; | ||||
| 			for (let i = bracket_end; i >= 0; i--) { | ||||
| 				if (text.charAt(i) == ']') { | ||||
| 					balance++; | ||||
| 				} else if (text.charAt(i) == '[') { | ||||
| 					balance--; | ||||
| 				} | ||||
| 				if (balance <= 0) { | ||||
| 					name = text.substring(i + 1, bracket_end); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if (!this.mentions[link]) { | ||||
| 				this.mentions[link] = { | ||||
| 					link: link, | ||||
| 				} | ||||
| 			} | ||||
| 			this.mentions[link].name = name.startsWith('@') ? name.substring(1) : name; | ||||
| 			this.mentions = Object.assign({}, this.mentions); | ||||
| 		} | ||||
|  | ||||
| 		preview.innerHTML = tfutils.markdown(text); | ||||
| 	} | ||||
|  | ||||
| 	add_file(file) { | ||||
| 		let self = this; | ||||
| 		file.arrayBuffer().then(function(buffer) { | ||||
| 			let bin = Array.from(new Uint8Array(buffer)); | ||||
| 			return Promise.all([tfrpc.rpc.store_blob(bin), bin]); | ||||
| 		}).then(function([id, bin]) { | ||||
| 			self.mentions[id] = { | ||||
| 				link: id, | ||||
| 				name: file.name, | ||||
| 				type: file.type, | ||||
| 				size: bin.length, | ||||
| 			}; | ||||
| 			self.mentions = Object.assign({}, self.mentions); | ||||
| 			let edit = self.renderRoot.getElementById('edit'); | ||||
| 			edit.value += `\n`; | ||||
| 			self.changed(); | ||||
| 		}).catch(function(e) { | ||||
| 			alert(e.message); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	paste(event) { | ||||
| @@ -37,16 +88,7 @@ class TfComposeElement extends LitElement { | ||||
| 				if (!file) { | ||||
| 					continue; | ||||
| 				} | ||||
| 				file.arrayBuffer().then(function(buffer) { | ||||
| 					let bin = Array.from(new Uint8Array(buffer)); | ||||
| 					return tfrpc.rpc.store_blob(bin); | ||||
| 				}).then(function(id) { | ||||
| 					let edit = self.renderRoot.getElementById('edit'); | ||||
| 					edit.value += `\n`; | ||||
| 					self.changed(); | ||||
| 				}).catch(function(e) { | ||||
| 					alert(e.message); | ||||
| 				}); | ||||
| 				self.add_file(file); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| @@ -63,28 +105,8 @@ class TfComposeElement extends LitElement { | ||||
| 			message.root = this.root; | ||||
| 			message.branch = this.branch; | ||||
| 		} | ||||
| 		for (let match of message.text.matchAll(/\[([^\[]+)]\((@[^\)]+)/g)) { | ||||
| 			if (!message.mentions) { | ||||
| 				message.mentions = []; | ||||
| 			} | ||||
| 			let name = match[1].length; | ||||
| 			let balance = 0; | ||||
| 			let bracket_end = match.index + match[1].length + '[]'.length - 1; | ||||
| 			for (let i = bracket_end; i >= 0; i--) { | ||||
| 				if (message.text.charAt(i) == ']') { | ||||
| 					balance++; | ||||
| 				} else if (message.text.charAt(i) == '[') { | ||||
| 					balance--; | ||||
| 				} | ||||
| 				if (balance <= 0) { | ||||
| 					name = message.text.substring(i + 1, bracket_end - i); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			message.mentions.push({ | ||||
| 				link: match[2], | ||||
| 				name: name.charAt(0) == '@' ? name.substring(1) : name, | ||||
| 			}); | ||||
| 		if (Object.values(this.mentions).length) { | ||||
| 			message.mentions = Object.values(this.mentions); | ||||
| 		} | ||||
| 		console.log('Would post:', message); | ||||
| 		tfrpc.rpc.appendMessage(this.whoami, message).then(function() { | ||||
| @@ -109,15 +131,7 @@ class TfComposeElement extends LitElement { | ||||
| 		input.type = 'file'; | ||||
| 		input.onchange = function(event) { | ||||
| 			let file = event.target.files[0]; | ||||
| 			file.arrayBuffer().then(function(buffer) { | ||||
| 				let bin = Array.from(new Uint8Array(buffer)); | ||||
| 				return tfrpc.rpc.store_blob(bin); | ||||
| 			}).then(function(id) { | ||||
| 				edit.value += `\n`; | ||||
| 				self.changed(); | ||||
| 			}).catch(function(e) { | ||||
| 				alert(e.message); | ||||
| 			}); | ||||
| 			self.add_file(file); | ||||
| 		}; | ||||
| 		input.click(); | ||||
| 	} | ||||
| @@ -132,12 +146,28 @@ class TfComposeElement extends LitElement { | ||||
| 		tribute.attach(this.renderRoot.getElementById('edit')); | ||||
| 	} | ||||
|  | ||||
| 	remove_mention(id) { | ||||
| 		delete this.mentions[id]; | ||||
| 		this.mentions = Object.assign({}, this.mentions); | ||||
| 	} | ||||
|  | ||||
| 	render_mention(mention) { | ||||
| 		let self = this; | ||||
| 		return html` | ||||
| 			<div> | ||||
| 				<pre style="white-space: pre-wrap">${JSON.stringify(mention, null, 2)}</pre> | ||||
| 				<input type="button" value="x" @click=${() => self.remove_mention(mention.link)}></input> | ||||
| 			</div>`; | ||||
| 	} | ||||
|  | ||||
| 	render() { | ||||
| 		let self = this; | ||||
| 		let result = html` | ||||
| 			<div style="display: flex; flex-direction: row; width: 100%"> | ||||
| 				<textarea id="edit" @input=${this.changed} @paste=${this.paste} style="flex: 1 0 50%"></textarea> | ||||
| 				<div id="preview" style="flex: 1 0 50%"></div> | ||||
| 			</div> | ||||
| 			${Object.values(this.mentions).map(x => self.render_mention(x))} | ||||
| 			<input type="button" value="Submit" @click=${this.submit}></input> | ||||
| 			<input type="button" value="Attach" @click=${this.attach}></input> | ||||
| 			<input type="button" value="Discard" @click=${this.discard}></input> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user