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 = {}; this.start_time = new Date().valueOf() - 24 * 60 * 60 * 1000; } 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 > ? AND 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), this.start_time, /* ** Don't show messages more than a day into the future to prevent ** messages with far-future timestamps from staying at the top forever. */ new Date().valueOf() + 24 * 60 * 60 * 1000, ]); } } async load_more() { let last_start_time = this.start_time; this.start_time = last_start_time - 24 * 60 * 60 * 1000; let more = await tfrpc.rpc.query( ` WITH news AS (SELECT messages.* FROM messages JOIN json_each(?) AS following ON messages.author = following.value WHERE messages.timestamp > ? AND 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), this.start_time, last_start_time, ]); this.messages = [...more, ...this.messages]; } 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)); }); } let more; if (!this.hash.startsWith('#@') && !this.hash.startsWith('#%')) { more = html` `; } return html` ${more} `; } } customElements.define('tf-tab-news-feed', TfTabNewsFeedElement);