forked from cory/tildefriends
		
	
		
			
	
	
		
			113 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import {LitElement, html, unsafeHTML, until} from './lit-all.min.js'; | ||
|  | import * as tfrpc from '/static/tfrpc.js'; | ||
|  | import {styles} from './tf-styles.js'; | ||
|  | 
 | ||
|  | class TfTabNewsFeedElement extends LitElement { | ||
|  | 	static get properties() { | ||
|  | 		return { | ||
|  | 			whoami: {type: String}, | ||
|  | 			users: {type: Object}, | ||
|  | 			hash: {type: String}, | ||
|  | 			following: {type: Array}, | ||
|  | 			messages: {type: Array}, | ||
|  | 			drafts: {type: Object}, | ||
|  | 			expanded: {type: Object}, | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static styles = styles; | ||
|  | 
 | ||
|  | 	constructor() { | ||
|  | 		super(); | ||
|  | 		let self = this; | ||
|  | 		this.whoami = null; | ||
|  | 		this.users = {}; | ||
|  | 		this.hash = '#'; | ||
|  | 		this.following = []; | ||
|  | 		this.drafts = {}; | ||
|  | 		this.expanded = {}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	async fetch_messages() { | ||
|  | 		if (this.hash.startsWith('#@')) { | ||
|  | 			let r = await tfrpc.rpc.query( | ||
|  | 				`
 | ||
|  | 					WITH mine AS (SELECT messages.* | ||
|  | 						FROM messages | ||
|  | 						WHERE messages.author = ? | ||
|  | 						ORDER BY sequence DESC | ||
|  | 						LIMIT 20) | ||
|  | 					SELECT messages.* | ||
|  | 						FROM mine | ||
|  | 						JOIN messages_refs ON mine.id = messages_refs.ref | ||
|  | 						JOIN messages ON messages_refs.message = messages.id | ||
|  | 					UNION | ||
|  | 					SELECT * FROM mine | ||
|  | 				`,
 | ||
|  | 				[ | ||
|  | 					this.hash.substring(1), | ||
|  | 				]); | ||
|  | 			return r; | ||
|  | 		} else if (this.hash.startsWith('#%')) { | ||
|  | 			return await tfrpc.rpc.query( | ||
|  | 				`
 | ||
|  | 					SELECT messages.* | ||
|  | 					FROM messages | ||
|  | 					WHERE id = ?1 | ||
|  | 					UNION | ||
|  | 					SELECT messages.* | ||
|  | 					FROM messages JOIN messages_refs | ||
|  | 					ON messages.id = messages_refs.message | ||
|  | 					WHERE messages_refs.ref = ?1 | ||
|  | 				`,
 | ||
|  | 				[ | ||
|  | 					this.hash.substring(1), | ||
|  | 				]); | ||
|  | 		} else { | ||
|  | 			return await tfrpc.rpc.query( | ||
|  | 				`
 | ||
|  | 					WITH news AS (SELECT messages.* | ||
|  | 					FROM messages | ||
|  | 					JOIN json_each(?) AS following ON messages.author = following.value | ||
|  | 					WHERE messages.timestamp > ? | ||
|  | 					ORDER BY messages.timestamp DESC) | ||
|  | 					SELECT messages.* | ||
|  | 						FROM news | ||
|  | 						JOIN messages_refs ON news.id = messages_refs.ref | ||
|  | 						JOIN messages ON messages_refs.message = messages.id | ||
|  | 					UNION | ||
|  | 					SELECT messages.* | ||
|  | 						FROM news | ||
|  | 						JOIN messages_refs ON news.id = messages_refs.message | ||
|  | 						JOIN messages ON messages_refs.ref = messages.id | ||
|  | 					UNION | ||
|  | 					SELECT news.* FROM news | ||
|  | 				`,
 | ||
|  | 				[ | ||
|  | 					JSON.stringify(this.following), | ||
|  | 					new Date().valueOf() - 24 * 60 * 60 * 1000, | ||
|  | 				]); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	render() { | ||
|  | 		if (!this.messages || | ||
|  | 			this._messages_hash !== this.hash || | ||
|  | 			this._messages_following !== this.following) { | ||
|  | 			console.log(`loading messages for ${this.whoami}`); | ||
|  | 			let self = this; | ||
|  | 			this.messages = []; | ||
|  | 			this._messages_hash = this.hash; | ||
|  | 			this._messages_following = this.following; | ||
|  | 			this.fetch_messages().then(function(messages) { | ||
|  | 				self.messages = messages; | ||
|  | 				console.log(`loading mesages done for ${self.whoami}`); | ||
|  | 			}).catch(function(error) { | ||
|  | 				alert(JSON.stringify(error, null, 2)); | ||
|  | 			}); | ||
|  | 		} | ||
|  | 		return html`<tf-news id="news" whoami=${this.whoami} .users=${this.users} .messages=${this.messages} .following=${this.following} .drafts=${this.drafts} .expanded=${this.expanded}></tf-news>`; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | customElements.define('tf-tab-news-feed', TfTabNewsFeedElement); |