ssb: Move mentions into the channels sidebar.
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Build Tilde Friends / Build-All (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Build Tilde Friends / Build-All (push) Has been cancelled
				
			This commit is contained in:
		| @@ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
| 	"type": "tildefriends-app", | 	"type": "tildefriends-app", | ||||||
| 	"emoji": "🐌", | 	"emoji": "🐌", | ||||||
| 	"previous": "&eqdlS92vzTkZUzuGNj+PjgiLQC+X6o61Xh4RTb8r1KM=.sha256" | 	"previous": "&onuy7/nH00Er+ujPI0ghlCOpRdDkuwL9nY2/WocLxTg=.sha256" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,7 +8,6 @@ import * as tf_compose from './tf-compose.js'; | |||||||
| import * as tf_news from './tf-news.js'; | import * as tf_news from './tf-news.js'; | ||||||
| import * as tf_profile from './tf-profile.js'; | import * as tf_profile from './tf-profile.js'; | ||||||
| import * as tf_reactions_modal from './tf-reactions-modal.js'; | import * as tf_reactions_modal from './tf-reactions-modal.js'; | ||||||
| import * as tf_tab_mentions from './tf-tab-mentions.js'; |  | ||||||
| import * as tf_tab_news from './tf-tab-news.js'; | import * as tf_tab_news from './tf-tab-news.js'; | ||||||
| import * as tf_tab_news_feed from './tf-tab-news-feed.js'; | import * as tf_tab_news_feed from './tf-tab-news-feed.js'; | ||||||
| import * as tf_tab_search from './tf-tab-search.js'; | import * as tf_tab_search from './tf-tab-search.js'; | ||||||
|   | |||||||
| @@ -100,8 +100,6 @@ class TfElement extends LitElement { | |||||||
| 			this.tab = 'search'; | 			this.tab = 'search'; | ||||||
| 		} else if (this.hash === '#connections') { | 		} else if (this.hash === '#connections') { | ||||||
| 			this.tab = 'connections'; | 			this.tab = 'connections'; | ||||||
| 		} else if (this.hash === '#mentions') { |  | ||||||
| 			this.tab = 'mentions'; |  | ||||||
| 		} else if (this.hash.startsWith('#sql=')) { | 		} else if (this.hash.startsWith('#sql=')) { | ||||||
| 			this.tab = 'query'; | 			this.tab = 'query'; | ||||||
| 		} else { | 		} else { | ||||||
| @@ -255,7 +253,15 @@ class TfElement extends LitElement { | |||||||
| 			SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages | 			SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages | ||||||
| 			JOIN json_each(?2) AS following ON messages.author = following.value | 			JOIN json_each(?2) AS following ON messages.author = following.value | ||||||
| 			WHERE messages.content ->> 'type' = 'post' | 			WHERE messages.content ->> 'type' = 'post' | ||||||
| 		`, [JSON.stringify(this.channels), JSON.stringify(Object.keys(following))]); | 			UNION | ||||||
|  | 			SELECT '@' AS channel, MAX(messages.rowid) AS rowid FROM messages_fts(?3) | ||||||
|  | 			JOIN messages ON messages.rowid = messages_fts.rowid | ||||||
|  | 			JOIN json_each(?2) AS following ON messages.author = following.value | ||||||
|  | 		`, [ | ||||||
|  | 			JSON.stringify(this.channels), | ||||||
|  | 			JSON.stringify(Object.keys(following)), | ||||||
|  | 			'"' + this.whoami.replace('"', '""') + '"', | ||||||
|  | 		]); | ||||||
| 		this.channels_unread = JSON.parse((await tfrpc.rpc.databaseGet('unread')) ?? '{}'); | 		this.channels_unread = JSON.parse((await tfrpc.rpc.databaseGet('unread')) ?? '{}'); | ||||||
| 		let start_time = new Date(); | 		let start_time = new Date(); | ||||||
| 		users = await this.fetch_about(Object.keys(following).sort(), users); | 		users = await this.fetch_about(Object.keys(following).sort(), users); | ||||||
| @@ -311,14 +317,6 @@ class TfElement extends LitElement { | |||||||
| 					.broadcasts=${this.broadcasts} | 					.broadcasts=${this.broadcasts} | ||||||
| 				></tf-tab-connections> | 				></tf-tab-connections> | ||||||
| 			`; | 			`; | ||||||
| 		} else if (this.tab === 'mentions') { |  | ||||||
| 			return html` |  | ||||||
| 				<tf-tab-mentions |  | ||||||
| 					.following=${this.following} |  | ||||||
| 					whoami=${this.whoami} |  | ||||||
| 					.users="${this.users}}" |  | ||||||
| 				></tf-tab-mentions> |  | ||||||
| 			`; |  | ||||||
| 		} else if (this.tab === 'search') { | 		} else if (this.tab === 'search') { | ||||||
| 			return html` | 			return html` | ||||||
| 				<tf-tab-search | 				<tf-tab-search | ||||||
| @@ -350,8 +348,6 @@ class TfElement extends LitElement { | |||||||
| 			await tfrpc.rpc.setHash('#'); | 			await tfrpc.rpc.setHash('#'); | ||||||
| 		} else if (tab === 'connections') { | 		} else if (tab === 'connections') { | ||||||
| 			await tfrpc.rpc.setHash('#connections'); | 			await tfrpc.rpc.setHash('#connections'); | ||||||
| 		} else if (tab === 'mentions') { |  | ||||||
| 			await tfrpc.rpc.setHash('#mentions'); |  | ||||||
| 		} else if (tab === 'query') { | 		} else if (tab === 'query') { | ||||||
| 			await tfrpc.rpc.setHash('#sql='); | 			await tfrpc.rpc.setHash('#sql='); | ||||||
| 		} | 		} | ||||||
| @@ -374,7 +370,6 @@ class TfElement extends LitElement { | |||||||
| 		const k_tabs = { | 		const k_tabs = { | ||||||
| 			'📰': 'news', | 			'📰': 'news', | ||||||
| 			'📡': 'connections', | 			'📡': 'connections', | ||||||
| 			'@': 'mentions', |  | ||||||
| 			'🔍': 'search', | 			'🔍': 'search', | ||||||
| 			'👩💻': 'query', | 			'👩💻': 'query', | ||||||
| 		}; | 		}; | ||||||
|   | |||||||
| @@ -1,78 +0,0 @@ | |||||||
| import {LitElement, html, unsafeHTML} from './lit-all.min.js'; |  | ||||||
| import * as tfrpc from '/static/tfrpc.js'; |  | ||||||
| import {styles} from './tf-styles.js'; |  | ||||||
|  |  | ||||||
| class TfTabMentionsElement extends LitElement { |  | ||||||
| 	static get properties() { |  | ||||||
| 		return { |  | ||||||
| 			whoami: {type: String}, |  | ||||||
| 			users: {type: Object}, |  | ||||||
| 			following: {type: Array}, |  | ||||||
| 			expanded: {type: Object}, |  | ||||||
| 			messages: {type: Array}, |  | ||||||
| 		}; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	static styles = styles; |  | ||||||
|  |  | ||||||
| 	constructor() { |  | ||||||
| 		super(); |  | ||||||
| 		let self = this; |  | ||||||
| 		this.whoami = null; |  | ||||||
| 		this.users = {}; |  | ||||||
| 		this.following = []; |  | ||||||
| 		this.expanded = {}; |  | ||||||
| 		this.messages = []; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	async load() { |  | ||||||
| 		console.log('Loading...', this.whoami); |  | ||||||
| 		let results = await tfrpc.rpc.query( |  | ||||||
| 			` |  | ||||||
| 				SELECT messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature |  | ||||||
| 				FROM messages_fts(?) |  | ||||||
| 				JOIN messages ON messages.rowid = messages_fts.rowid |  | ||||||
| 				JOIN json_each(?) AS following ON messages.author = following.value |  | ||||||
| 				WHERE messages.author != ? |  | ||||||
| 				ORDER BY timestamp DESC limit 20 |  | ||||||
| 			`, |  | ||||||
| 			[ |  | ||||||
| 				'"' + this.whoami.replace('"', '""') + '"', |  | ||||||
| 				JSON.stringify(this.following), |  | ||||||
| 				this.whoami, |  | ||||||
| 			] |  | ||||||
| 		); |  | ||||||
| 		console.log('Done.'); |  | ||||||
| 		this.messages = results; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	on_expand(event) { |  | ||||||
| 		if (event.detail.expanded) { |  | ||||||
| 			let expand = {}; |  | ||||||
| 			expand[event.detail.id] = true; |  | ||||||
| 			this.expanded = Object.assign({}, this.expanded, expand); |  | ||||||
| 		} else { |  | ||||||
| 			delete this.expanded[event.detail.id]; |  | ||||||
| 			this.expanded = Object.assign({}, this.expanded); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	render() { |  | ||||||
| 		let self = this; |  | ||||||
| 		if (!this.loading) { |  | ||||||
| 			this.loading = true; |  | ||||||
| 			this.load(); |  | ||||||
| 		} |  | ||||||
| 		return html` |  | ||||||
| 			<tf-news |  | ||||||
| 				id="news" |  | ||||||
| 				whoami=${this.whoami} |  | ||||||
| 				.messages=${this.messages} |  | ||||||
| 				.users=${this.users} |  | ||||||
| 				.expanded=${this.expanded} |  | ||||||
| 				@tf-expand=${this.on_expand} |  | ||||||
| 			></tf-news> |  | ||||||
| 		`; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| customElements.define('tf-tab-mentions', TfTabMentionsElement); |  | ||||||
| @@ -36,11 +36,30 @@ class TfTabNewsFeedElement extends LitElement { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	channel() { | 	channel() { | ||||||
| 		return this.hash.startsWith('##') ? this.hash.substring(2) : ''; | 		return this.hash.startsWith('##') ? this.hash.substring(2) : this.hash.substring(1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	async fetch_messages(start_time, end_time) { | 	async fetch_messages(start_time, end_time) { | ||||||
| 		if (this.hash.startsWith('#@')) { | 		if (this.hash == '#@') { | ||||||
|  | 			let r = await tfrpc.rpc.query( | ||||||
|  | 				` | ||||||
|  | 					SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature | ||||||
|  | 					FROM messages_fts(?1) | ||||||
|  | 					JOIN messages ON messages.rowid = messages_fts.rowid | ||||||
|  | 					JOIN json_each(?2) AS following ON messages.author = following.value | ||||||
|  | 					WHERE | ||||||
|  | 						messages.author != ?1 AND | ||||||
|  | 						messages.timestamp > ?3 AND | ||||||
|  | 						messages.timestamp < ?4 | ||||||
|  | 					ORDER BY timestamp DESC limit 20 | ||||||
|  | 				`, [ | ||||||
|  | 					'"' + this.whoami.replace('"', '""') + '"', | ||||||
|  | 					JSON.stringify(this.following), | ||||||
|  | 					start_time, | ||||||
|  | 					end_time, | ||||||
|  | 				]); | ||||||
|  | 			return r; | ||||||
|  | 		} else if (this.hash.startsWith('#@')) { | ||||||
| 			let r = await tfrpc.rpc.query( | 			let r = await tfrpc.rpc.query( | ||||||
| 				` | 				` | ||||||
| 					WITH mine AS (SELECT rowid, id, previous, author, sequence, timestamp, hash, json(content) AS content, signature | 					WITH mine AS (SELECT rowid, id, previous, author, sequence, timestamp, hash, json(content) AS content, signature | ||||||
| @@ -177,7 +196,6 @@ class TfTabNewsFeedElement extends LitElement { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	async decrypt(messages) { | 	async decrypt(messages) { | ||||||
| 		console.log('decrypt'); |  | ||||||
| 		let result = []; | 		let result = []; | ||||||
| 		for (let message of messages) { | 		for (let message of messages) { | ||||||
| 			let content; | 			let content; | ||||||
|   | |||||||
| @@ -149,7 +149,7 @@ class TfTabNewsElement extends LitElement { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	render() { | 	render() { | ||||||
| 		let profile = this.hash.startsWith('#@') | 		let profile = this.hash.startsWith('#@') && this.hash != '#@' | ||||||
| 			? html`<tf-profile | 			? html`<tf-profile | ||||||
| 					class="tf-profile" | 					class="tf-profile" | ||||||
| 					id=${this.hash.substring(1)} | 					id=${this.hash.substring(1)} | ||||||
| @@ -181,6 +181,7 @@ class TfTabNewsElement extends LitElement { | |||||||
| 					undefined} | 					undefined} | ||||||
| 				<div class="w3-bar-item w3-theme-d2">Channels</div> | 				<div class="w3-bar-item w3-theme-d2">Channels</div> | ||||||
| 				<a href="#" class="w3-bar-item w3-button" style=${this.hash == '#' ? 'font-weight: bold' : undefined}>general ${this.unread_status('')}</a> | 				<a href="#" class="w3-bar-item w3-button" style=${this.hash == '#' ? 'font-weight: bold' : undefined}>general ${this.unread_status('')}</a> | ||||||
|  | 				<a href="#@" class="w3-bar-item w3-button" style=${this.hash == '#@' ? 'font-weight: bold' : undefined}>@mentions ${this.unread_status('@')}</a> | ||||||
| 				${this.channels.map(x => html` | 				${this.channels.map(x => html` | ||||||
| 					<a | 					<a | ||||||
| 						href=${'#' + encodeURIComponent('#' + x)} | 						href=${'#' + encodeURIComponent('#' + x)} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user