diff --git a/apps/ssb.json b/apps/ssb.json index 2a2cd7ca..d646c48b 100644 --- a/apps/ssb.json +++ b/apps/ssb.json @@ -1,5 +1,5 @@ { "type": "tildefriends-app", "emoji": "🐌", - "previous": "&kHFHpwFhnRVEbFQxuKlOUXPs/eJ2cOvWgS8poXm8WNM=.sha256" + "previous": "&CEeuaRddTxMQkVqXi1GTN9AyqzdyWTAjs3mqSHVTBWY=.sha256" } diff --git a/apps/ssb/app.js b/apps/ssb/app.js index 3316bace..c0f7a8cc 100644 --- a/apps/ssb/app.js +++ b/apps/ssb/app.js @@ -100,6 +100,9 @@ tfrpc.register(async function try_decrypt(id, content) { tfrpc.register(async function encrypt(id, recipients, content) { return await ssb.privateMessageEncrypt(id, recipients, content); }); +tfrpc.register(async function getActiveIdentity() { + return await ssb.getActiveIdentity(); +}); ssb.addEventListener('broadcasts', async function () { await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts()); }); @@ -107,6 +110,9 @@ ssb.addEventListener('broadcasts', async function () { core.register('onConnectionsChanged', async function () { await tfrpc.rpc.set('connections', await ssb.connections()); }); +core.register('setActiveIdentity', async function (id) { + await tfrpc.rpc.set('identity', id); +}); async function main() { if (typeof database !== 'undefined') { diff --git a/apps/ssb/script.js b/apps/ssb/script.js index 03c4858f..71cb39c2 100644 --- a/apps/ssb/script.js +++ b/apps/ssb/script.js @@ -1,7 +1,6 @@ import {LitElement, html} from './lit-all.min.js'; import * as tfrpc from '/static/tfrpc.js'; -import * as tf_id_picker from './tf-id-picker.js'; import * as tf_app from './tf-app.js'; import * as tf_message from './tf-message.js'; import * as tf_user from './tf-user.js'; diff --git a/apps/ssb/tf-app.js b/apps/ssb/tf-app.js index 7064d617..72ef8201 100644 --- a/apps/ssb/tf-app.js +++ b/apps/ssb/tf-app.js @@ -52,13 +52,15 @@ class TfElement extends LitElement { self.broadcasts = value; } else if (name === 'connections') { self.connections = value; + } else if (name === 'identity') { + self.whoami = value; } }); this.initial_load(); } async initial_load() { - let whoami = await tfrpc.rpc.localStorageGet('whoami'); + let whoami = await tfrpc.rpc.getActiveIdentity(); let ids = (await tfrpc.rpc.getIdentities()) || []; this.whoami = whoami ?? (ids.length ? ids[0] : undefined); this.ids = ids; @@ -193,29 +195,6 @@ class TfElement extends LitElement { } } - render_id_picker() { - return html` -
- - -
- `; - } - async load_recent_tags() { let start = new Date(); this.tags = await tfrpc.rpc.query( @@ -380,7 +359,7 @@ class TfElement extends LitElement { class="w3-theme-dark" >
- ${this.render_id_picker()} ${tabs} + ${tabs} ${this.tags.map( (x) => html`` )} diff --git a/apps/ssb/tf-id-picker.js b/apps/ssb/tf-id-picker.js deleted file mode 100644 index b9a8adf9..00000000 --- a/apps/ssb/tf-id-picker.js +++ /dev/null @@ -1,54 +0,0 @@ -import {LitElement, html} from './lit-all.min.js'; -import * as tfrpc from '/static/tfrpc.js'; -import {styles} from './tf-styles.js'; - -/* - ** Provide a list of IDs, and this lets the user pick one. - */ -class TfIdentityPickerElement extends LitElement { - static get properties() { - return { - ids: {type: Array}, - selected: {type: String}, - users: {type: Object}, - }; - } - - static styles = styles; - - constructor() { - super(); - this.ids = []; - this.users = {}; - } - - changed(event) { - this.selected = event.srcElement.value; - this.dispatchEvent( - new Event('change', { - srcElement: this, - }) - ); - } - - render() { - return html` - - `; - } -} - -customElements.define('tf-id-picker', TfIdentityPickerElement); diff --git a/core/core.js b/core/core.js index fe3f6a2c..438ea44d 100644 --- a/core/core.js +++ b/core/core.js @@ -244,6 +244,7 @@ function broadcastEvent(eventName, argv) { } return Promise.all(promises); } + /** * TODOC * @param {*} message @@ -265,6 +266,28 @@ function broadcast(message) { return Promise.all(promises); } +/** + * TODOC + * @param {String} eventName + * @param {*} argv + * @returns + */ +function broadcastAppEventToUser(user, packageOwner, packageName, eventName, argv) { + let promises = []; + for (let process of Object.values(gProcesses)) { + if ( + process.credentials?.session?.name === user && + process.packageOwner == packageOwner && + process.packageName == packageName + ) { + if (process.eventHandlers[eventName]) { + promises.push(invoke(process.eventHandlers[eventName], argv)); + } + } + } + return Promise.all(promises); +} + /** * TODOC * @param {*} caller @@ -360,6 +383,8 @@ async function getProcessBlob(blobId, key, options) { process.key = key; process.credentials = options.credentials || {}; process.task = new Task(); + process.packageOwner = options.packageOwner; + process.packageName = options.packageName; process.eventHandlers = {}; if (!options?.script || options?.script === 'app.js') { process.app = new app.App(); @@ -520,6 +545,7 @@ async function getProcessBlob(blobId, key, options) { await new Database(process?.credentials?.session?.name).set(`id:${options.packageOwner}:${options.packageName}`, identity); } process.sendIdentities(); + broadcastAppEventToUser(process?.credentials?.session?.name, options.packageOwner, options.packageName, 'setActiveIdentity', [identity]); }; process.createIdentity = async function() { if (