xi-conversations

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

commit
29613db30294494e44d30d9158482dab0c4b2455
parent
e66fa0f216944054559eb73271b815cfdfbf4cf8
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-09-04 18:04
convert to js modules

Diffstat

M .gitignore 2 +-
M Makefile 10 ++++------
R src/js/actions.js -> content/js/actions.js 42 +++++++++++++++++++++---------------------
R src/js/body.js -> content/js/body.js 4 ++--
R src/js/main.js -> content/js/main.js 4 ++--
R src/js/message.js -> content/js/message.js 10 +++++-----
R src/js/util.js -> content/js/util.js 27 ++++++++-------------------
M content/main.html 2 +-

8 files changed, 44 insertions, 57 deletions


diff --git a/.gitignore b/.gitignore

@@ -1,3 +1,3 @@
    1     1 /_*
    2     2 node_modules
    3    -1 content/main.js
   -1     3 content/js/mustache.mjs

diff --git a/Makefile b/Makefile

@@ -1,10 +1,8 @@
    1    -1 all: content/main.js content/material-icons.svg
   -1     1 all: content/js/mustache.mjs content/material-icons.svg
    2     2 
    3    -1 content/main.js: src/js/main.js src/js/*.js node_modules
    4    -1 	npx browserify $< -o $@
   -1     3 content/js/mustache.mjs:
   -1     4 	npm install mustache
   -1     5 	cp node_modules/mustache/mustache.mjs $@
    5     6 
    6     7 content/material-icons.svg: scripts/get-material-icons.sh
    7     8 	$< > $@
    8    -1 
    9    -1 node_modules:
   10    -1 	npm install mustache

diff --git a/src/js/actions.js b/content/js/actions.js

@@ -1,14 +1,14 @@
    1     1 /* global browser */
    2     2 
    3    -1 var viewSource = function(msg) {
   -1     3 export var viewSource = function(msg) {
    4     4 	browser.xi.viewSource(msg.id);
    5     5 };
    6     6 
    7    -1 var markAsRead = function(msg, read) {
   -1     7 export var markAsRead = function(msg, read) {
    8     8 	browser.messages.update(msg.id, {read: read});
    9     9 };
   10    10 
   11    -1 var toggleFlagged = function(msg, star) {
   -1    11 export var toggleFlagged = function(msg, star) {
   12    12 	msg.flagged = !msg.flagged;
   13    13 	browser.messages.update(msg.id, {flagged: msg.flagged}).then(() => {
   14    14 		star.classList.toggle('is-active', msg.flagged);
@@ -26,22 +26,22 @@ var reply = function(msg, replyType) {
   26    26 	});
   27    27 };
   28    28 
   29    -1 module.exports = {
   30    -1 	replyToSender: msg => reply(msg, 'replyToSender'),
   31    -1 	replyAll: msg => reply(msg, 'replyToAll'),
   32    -1 	replyToList: msg => reply(msg, 'replyToList'),
   33    -1 	editAsNew: msg => {
   34    -1 		getIdentity(msg).then(identity => {
   35    -1 			browser.compose.beginNew(msg.id, {'identityId': identity.id});
   36    -1 		});
   37    -1 	},
   38    -1 	forward: msg => {
   39    -1 		getIdentity(msg).then(identity => {
   40    -1 			browser.compose.beginForward(msg.id, null, {'identityId': identity.id});
   41    -1 		});
   42    -1 	},
   43    -1 	viewClassic: msg => browser.messageDisplay.open({messageId: msg.id}),
   44    -1 	viewSource: viewSource,
   45    -1 	markAsRead: markAsRead,
   46    -1 	toggleFlagged: toggleFlagged,
   -1    29 export var replyToSender = msg => reply(msg, 'replyToSender');
   -1    30 export var replyAll = msg => reply(msg, 'replyToAll');
   -1    31 export var replyToList = msg => reply(msg, 'replyToList');
   -1    32 
   -1    33 export var editAsNew = function(msg) {
   -1    34 	getIdentity(msg).then(identity => {
   -1    35 		browser.compose.beginNew(msg.id, {'identityId': identity.id});
   -1    36 	});
   -1    37 };
   -1    38 
   -1    39 export var forward = function(msg) {
   -1    40 	getIdentity(msg).then(identity => {
   -1    41 		browser.compose.beginForward(msg.id, null, {'identityId': identity.id});
   -1    42 	});
   -1    43 };
   -1    44 
   -1    45 export var viewClassic = function(msg) {
   -1    46 	return browser.messageDisplay.open({messageId: msg.id});
   47    47 };

diff --git a/src/js/body.js b/content/js/body.js

@@ -1,6 +1,6 @@
    1     1 /* global browser */
    2     2 
    3    -1 var util = require('./util.js');
   -1     3 import * as util from './util.js';
    4     4 
    5     5 var RE_LINK = /(https?:\/\/[^\s<>]*[^\s\])}<>.,:;?!"'])/g;
    6     6 
@@ -74,7 +74,7 @@ var renderBody = function(parent, text) {
   74    74 	}
   75    75 };
   76    76 
   77    -1 module.exports = function(msg) {
   -1    77 export default function(msg) {
   78    78 	var wrapper = document.createElement('div');
   79    79 	var pre = document.createElement('pre');
   80    80 	pre.className = 'message__body';

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

@@ -1,7 +1,7 @@
    1     1 /* global browser */
    2     2 
    3    -1 var createMessageElement = require('./message');
    4    -1 var util = require('./util.js');
   -1     3 import createMessageElement from './message.js';
   -1     4 import * as util from './util.js';
    5     5 
    6     6 var initialIDs = (util.getParams().ids || '').split(',');
    7     7 

diff --git a/src/js/message.js b/content/js/message.js

@@ -1,8 +1,8 @@
    1    -1 var Mustache = require('mustache');
   -1     1 import Mustache from './mustache.mjs';
    2     2 
    3    -1 var actions = require('./actions.js');
    4    -1 var createBody = require('./body.js');
    5    -1 var util = require('./util.js');
   -1     3 import createBody from './body.js';
   -1     4 import * as actions from './actions.js';
   -1     5 import * as util from './util.js';
    6     6 
    7     7 var autoMarkAsRead = function(e, msg) {
    8     8 	var topWasInView = false;
@@ -67,7 +67,7 @@ var stringFilter = function() {
   67    67 	};
   68    68 };
   69    69 
   70    -1 module.exports = function(msg, expanded) {
   -1    70 export default function(msg, expanded) {
   71    71 	var tpl = document.getElementById('message-template').innerHTML;
   72    72 	var html = Mustache.render(tpl, {
   73    73 		icon: iconFilter,

diff --git a/src/js/util.js b/content/js/util.js

@@ -7,7 +7,7 @@ var normalizeName = function(s) {
    7     7 	return s.split(', ').reverse().join(' ');
    8     8 }
    9     9 
   10    -1 var getParams = function() {
   -1    10 export var getParams = function() {
   11    11 	const params = {};
   12    12 	for (let part of location.search.substr(1).split('&')) {
   13    13 		let [key, raw] = part.split('=');
@@ -16,7 +16,7 @@ var getParams = function() {
   16    16 	return params;
   17    17 };
   18    18 
   19    -1 var getBody = function(msgPart) {
   -1    19 export var getBody = function(msgPart) {
   20    20 	if (msgPart.body && msgPart.contentType.startsWith('text/plain')) {
   21    21 		return [msgPart.body, msgPart.isEncrypted];
   22    22 	} else if (msgPart.parts) {
@@ -38,7 +38,7 @@ var getBody = function(msgPart) {
   38    38 	}
   39    39 };
   40    40 
   41    -1 var html2element = function(html) {
   -1    41 export var html2element = function(html) {
   42    42 	// thunderbird 60 will remove some elements when directly assigning to
   43    43 	// innerHTML
   44    44 	var parser = new DOMParser();
@@ -46,7 +46,7 @@ var html2element = function(html) {
   46    46 	return doc.body.children[0];
   47    47 };
   48    48 
   49    -1 var createIcon = function(key) {
   -1    49 export var createIcon = function(key) {
   50    50 	var html;
   51    51 	if (key.substring(0, 2) === 'x-') {
   52    52 		html = '<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><use xlink:href="/content/material-icons.svg#' + key.substring(2) + '"></use></svg>';
@@ -57,7 +57,7 @@ var createIcon = function(key) {
   57    57 	return html2element(html);
   58    58 };
   59    59 
   60    -1 var createDate = function(date) {
   -1    60 export var createDate = function(date) {
   61    61 	var now = new Date();
   62    62 	var e = document.createElement('time');
   63    63 	e.className = 'date';
@@ -70,7 +70,7 @@ var createDate = function(date) {
   70    70 	return e;
   71    71 };
   72    72 
   73    -1 var createAlert = function(text, icon, level) {
   -1    73 export var createAlert = function(text, icon, level) {
   74    74 	var e = document.createElement('div');
   75    75 	e.className = 'alert alert--' + level;
   76    76 	e.textContent = text;
@@ -78,7 +78,7 @@ var createAlert = function(text, icon, level) {
   78    78 	return e;
   79    79 };
   80    80 
   81    -1 var pseudoRandomColor = function(s) {
   -1    81 export var pseudoRandomColor = function(s) {
   82    82 	let hash = 0;
   83    83 	for (let i = 0; i < s.length; i++) {
   84    84 		const chr = s.charCodeAt(i);
@@ -97,7 +97,7 @@ var pseudoRandomColor = function(s) {
   97    97 	return 'hsl(' + hue + ', 70%, ' + Math.floor(lightness) + '%)';
   98    98 };
   99    99 
  100    -1 var parseContacts = function(raw) {
   -1   100 export var parseContacts = function(raw) {
  101   101 	var contacts = [];
  102   102 	for (var r of raw) {
  103   103 		var match = /(.*) <(.*)>/.exec(r);
@@ -115,14 +115,3 @@ var parseContacts = function(raw) {
  115   115 	}
  116   116 	return contacts;
  117   117 };
  118    -1 
  119    -1 module.exports = {
  120    -1 	getParams: getParams,
  121    -1 	getBody: getBody,
  122    -1 	html2element: html2element,
  123    -1 	createIcon: createIcon,
  124    -1 	createDate: createDate,
  125    -1 	createAlert: createAlert,
  126    -1 	pseudoRandomColor: pseudoRandomColor,
  127    -1 	parseContacts: parseContacts,
  128    -1 };

diff --git a/content/main.html b/content/main.html

@@ -75,6 +75,6 @@
   75    75 			<h1 class="conversation__subject">Loading…</h1>
   76    76 		</header>
   77    77 		<main class="conversation__main"></main>
   78    -1 		<script src="main.js"></script>
   -1    78 		<script src="js/main.js" type="module"></script>
   79    79 	</body>
   80    80 </html>