xi-conversations

Minimal clone of thunderbird conversations
git clone https://git.ce9e.org/xi-conversations.git

commit
2db414a26285fed761f8353644fb3b672ea9f2f1
parent
4619909cc391c8509f65d40bbc40ffc732a1809e
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2021-08-12 11:45
use Message-ID header instead of URI

pro: not dependent on folder
con: breaks open conversations

Diffstat

M background.js 4 ++--
M experiment-api/api.js 22 ++++++++++------------
M experiment-api/schema.json 4 ++--
M src/js/main.js 6 +++---

4 files changed, 17 insertions, 19 deletions


diff --git a/background.js b/background.js

@@ -1,5 +1,5 @@
    1     1 /* global browser */
    2     2 
    3    -1 browser.xi.onOpenTab.addListener(uris => {
    4    -1 	browser.xi.createTab('/content/main.html?uris=' + encodeURIComponent(uris));
   -1     3 browser.xi.onOpenTab.addListener(ids => {
   -1     4 	browser.xi.createTab('/content/main.html?ids=' + encodeURIComponent(ids));
    5     5 });

diff --git a/experiment-api/api.js b/experiment-api/api.js

@@ -1,18 +1,12 @@
    1     1 /* global Components, ChromeUtils */
    2     2 
    3     3 var aomStartup = Components.classes['@mozilla.org/addons/addon-manager-startup;1'].getService(Components.interfaces.amIAddonManagerStartup);
    4    -1 var Messenger = Components.classes['@mozilla.org/messenger;1'].createInstance(Components.interfaces.nsIMessenger);
    5     4 
    6     5 var {ExtensionCommon} = ChromeUtils.import('resource://gre/modules/ExtensionCommon.jsm');
    7     6 var {Gloda} = ChromeUtils.import('resource:///modules/gloda/GlodaPublic.jsm');
    8     7 var {Services} = ChromeUtils.import('resource://gre/modules/Services.jsm');
    9     8 var {MsgHdrToMimeMessage} = ChromeUtils.import('resource:///modules/gloda/MimeMessage.jsm');
   10     9 
   11    -1 var uri2msg = function(uri) {
   12    -1 	var messageService = Messenger.messageServiceFromURI(uri);
   13    -1 	return messageService.messageURIToMsgHdr(uri);
   14    -1 };
   15    -1 
   16    10 var msg2uri = function(msg) {
   17    11 	return msg.folder.getUriForMsg(msg);
   18    12 };
@@ -37,7 +31,7 @@ var unique = function(l, keyFn) {
   37    31 	});
   38    32 };
   39    33 
   40    -1 var getConversation = function(msgs) {
   -1    34 var getConversation = function(ids) {
   41    35 	return new Promise(resolve => {
   42    36 		var conversationListener = {
   43    37 			onItemsAdded: function() {},
@@ -72,7 +66,9 @@ var getConversation = function(msgs) {
   72    66 			},
   73    67 		};
   74    68 
   75    -1 		Gloda.getMessageCollectionForHeaders(msgs, listener, null);
   -1    69 		var query = Gloda.newQuery(Gloda.NOUN_MESSAGE);
   -1    70 		query.headerMessageID.apply(query, ids);
   -1    71 		query.getCollection(listener, null);
   76    72 	});
   77    73 };
   78    74 
@@ -84,15 +80,17 @@ var xi = class extends ExtensionCommon.ExtensionAPI {
   84    80 				body: glodaMsg._indexedBodyText,
   85    81 				canReplyToList: !!glodaMsg.mailingLists,
   86    82 				attachmentInfos: glodaMsg.attachmentInfos.map(a => ({name: a.name, url: a.url})),
   87    -1 				uri: msg2uri(glodaMsg.folderMessage),
   -1    83 
   -1    84 				// backport from thunderbird 85
   -1    85 				headerMessageId: glodaMsg.headerMessageID,
   88    86 			});
   89    87 		};
   90    88 
   91    89 		return {
   92    90 			xi: {
   93    -1 				getConversation(uris) {
   -1    91 				getConversation(ids) {
   94    92 					// https://bugzilla.mozilla.org/show_bug.cgi?id=1665676
   95    -1 					return getConversation(uris.map(uri2msg)).then(results => results.map(glodaMsg2msg));
   -1    93 					return getConversation(ids).then(results => results.map(glodaMsg2msg));
   96    94 				},
   97    95 				getFull(id) {
   98    96 					// the original getFull() is restricted to these fields:
@@ -141,7 +139,7 @@ var xi = class extends ExtensionCommon.ExtensionAPI {
  141   139 							if (topic === 'domwindowopened' && win.location.href === 'chrome://messenger/content/messenger.xhtml') {
  142   140 								win.MsgOpenSelectedMessages = () => {
  143   141 									var msgs = win.gFolderDisplay.selectedMessages;
  144    -1 									fire.async(msgs.map(msg2uri));
   -1   142 									fire.async(msgs.map(msgHdr => msgHdr.messageId));
  145   143 								};
  146   144 							}
  147   145 							win.addEventListener('load', () => observer(win, topic));

diff --git a/experiment-api/schema.json b/experiment-api/schema.json

@@ -5,7 +5,7 @@
    5     5 		"type": "function",
    6     6 		"async": true,
    7     7 		"parameters": [{
    8    -1 			"name": "uris",
   -1     8 			"name": "ids",
    9     9 			"type": "array",
   10    10 			"items": {
   11    11 				"type": "string"
@@ -61,7 +61,7 @@
   61    61 		"name": "onOpenTab",
   62    62 		"type": "function",
   63    63 		"parameters": [{
   64    -1 			"name": "uris",
   -1    64 			"name": "ids",
   65    65 			"type": "array",
   66    66 			"items": {
   67    67 				"type": "string"

diff --git a/src/js/main.js b/src/js/main.js

@@ -3,12 +3,12 @@
    3     3 var createMessageElement = require('./message');
    4     4 var util = require('./util.js');
    5     5 
    6    -1 var initialUris = (util.getParams().uris || '').split(',');
   -1     6 var initialIDs = (util.getParams().ids || '').split(',');
    7     7 
    8     8 var container = document.querySelector('.conversation__main');
    9     9 var anyExpanded = false;
   10    10 
   11    -1 browser.xi.getConversation(initialUris).then(function(conversation) {
   -1    11 browser.xi.getConversation(initialIDs).then(function(conversation) {
   12    12 	var subject = conversation[0].subject || '(no subject)';
   13    13 	document.querySelector('.conversation__subject').textContent = subject;
   14    14 	document.title = subject;
@@ -18,7 +18,7 @@ browser.xi.getConversation(initialUris).then(function(conversation) {
   18    18 		const expanded = (
   19    19 			conversation.length === 1
   20    20 			|| !msg.read
   21    -1 			|| (initialUris.length === 1 && initialUris.includes(msg.uri))
   -1    21 			|| (initialIDs.length === 1 && initialIDs.includes(msg.headerMessageId))
   22    22 			|| (!anyExpanded && i === conversation.length - 1)
   23    23 		);
   24    24