forked from cory/tildefriends
		
	ssb: Move mentions into the channels sidebar.
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
	"type": "tildefriends-app",
 | 
			
		||||
	"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_profile from './tf-profile.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_feed from './tf-tab-news-feed.js';
 | 
			
		||||
import * as tf_tab_search from './tf-tab-search.js';
 | 
			
		||||
 
 | 
			
		||||
@@ -100,8 +100,6 @@ class TfElement extends LitElement {
 | 
			
		||||
			this.tab = 'search';
 | 
			
		||||
		} else if (this.hash === '#connections') {
 | 
			
		||||
			this.tab = 'connections';
 | 
			
		||||
		} else if (this.hash === '#mentions') {
 | 
			
		||||
			this.tab = 'mentions';
 | 
			
		||||
		} else if (this.hash.startsWith('#sql=')) {
 | 
			
		||||
			this.tab = 'query';
 | 
			
		||||
		} else {
 | 
			
		||||
@@ -255,7 +253,15 @@ class TfElement extends LitElement {
 | 
			
		||||
			SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages
 | 
			
		||||
			JOIN json_each(?2) AS following ON messages.author = following.value
 | 
			
		||||
			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')) ?? '{}');
 | 
			
		||||
		let start_time = new Date();
 | 
			
		||||
		users = await this.fetch_about(Object.keys(following).sort(), users);
 | 
			
		||||
@@ -311,14 +317,6 @@ class TfElement extends LitElement {
 | 
			
		||||
					.broadcasts=${this.broadcasts}
 | 
			
		||||
				></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') {
 | 
			
		||||
			return html`
 | 
			
		||||
				<tf-tab-search
 | 
			
		||||
@@ -350,8 +348,6 @@ class TfElement extends LitElement {
 | 
			
		||||
			await tfrpc.rpc.setHash('#');
 | 
			
		||||
		} else if (tab === 'connections') {
 | 
			
		||||
			await tfrpc.rpc.setHash('#connections');
 | 
			
		||||
		} else if (tab === 'mentions') {
 | 
			
		||||
			await tfrpc.rpc.setHash('#mentions');
 | 
			
		||||
		} else if (tab === 'query') {
 | 
			
		||||
			await tfrpc.rpc.setHash('#sql=');
 | 
			
		||||
		}
 | 
			
		||||
@@ -374,7 +370,6 @@ class TfElement extends LitElement {
 | 
			
		||||
		const k_tabs = {
 | 
			
		||||
			'📰': 'news',
 | 
			
		||||
			'📡': 'connections',
 | 
			
		||||
			'@': 'mentions',
 | 
			
		||||
			'🔍': 'search',
 | 
			
		||||
			'👩💻': '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() {
 | 
			
		||||
		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) {
 | 
			
		||||
		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(
 | 
			
		||||
				`
 | 
			
		||||
					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) {
 | 
			
		||||
		console.log('decrypt');
 | 
			
		||||
		let result = [];
 | 
			
		||||
		for (let message of messages) {
 | 
			
		||||
			let content;
 | 
			
		||||
 
 | 
			
		||||
@@ -149,7 +149,7 @@ class TfTabNewsElement extends LitElement {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	render() {
 | 
			
		||||
		let profile = this.hash.startsWith('#@')
 | 
			
		||||
		let profile = this.hash.startsWith('#@') && this.hash != '#@'
 | 
			
		||||
			? html`<tf-profile
 | 
			
		||||
					class="tf-profile"
 | 
			
		||||
					id=${this.hash.substring(1)}
 | 
			
		||||
@@ -181,6 +181,7 @@ class TfTabNewsElement extends LitElement {
 | 
			
		||||
					undefined}
 | 
			
		||||
				<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}>@mentions ${this.unread_status('@')}</a>
 | 
			
		||||
				${this.channels.map(x => html`
 | 
			
		||||
					<a
 | 
			
		||||
						href=${'#' + encodeURIComponent('#' + x)}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user