aboutsummaryrefslogtreecommitdiff
path: root/js/importexport.js
blob: c3e79ddecba6a5aae92c40f09512d21ecd627724 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Shows a message explaining how many redirects were imported.
function showImportedMessage(imported, existing) {
	if (imported == 0 && existing == 0) {
		showMessage('No redirects existed in the file.');
	}
	if (imported > 0 && existing == 0) {
		showMessage('Successfully imported ' + imported + ' redirect' + (imported > 1 ? 's.' : '.'), true);
	}
	if (imported == 0 && existing > 0) {
		showMessage('All redirects in the file already existed and were ignored.');
	}
	if (imported > 0 && existing > 0) {
		var m = 'Successfully imported ' + imported + ' redirect' + (imported > 1 ? 's' : '') + '. ';
		if (existing == 1) {
			m += '1 redirect already existed and was ignored.';
		} else {
			m += existing + ' redirects already existed and were ignored.'; 
		}
		showMessage(m, true);
	}
}

function importRedirects(ev) {
	
	let file = ev.target.files[0];
	if (!file) {
		return;
	}
	var reader = new FileReader();
	
	reader.onload = function(e) {
		var data;
		try {
			data = JSON.parse(reader.result);
		} catch(e) {
			showMessage('Failed to parse JSON data, invalid JSON: ' + (e.message||'').substr(0,100));
			return;
		}

		if (!data.redirects) {
			showMessage('Invalid JSON, missing "redirects" property');
			return;
		}

		var imported = 0, existing = 0;
		for (var i = 0; i < data.redirects.length; i++) {
			var r = new Redirect(data.redirects[i]);
			r.updateExampleResult();
			if (REDIRECTS.some(function(i) { return new Redirect(i).equals(r);})) {
				existing++;
			} else {
				REDIRECTS.push(r.toObject());
				imported++;
			}
		}
		
		showImportedMessage(imported, existing);

		saveChanges();
		renderRedirects();
	};

	try {
		reader.readAsText(file, 'utf-8');
	} catch(e) {
		showMessage('Failed to read import file');
	}
}

function updateExportLink() {
	var redirects = REDIRECTS.map(function(r) {
		return new Redirect(r).toObject();
	});

	let	version = chrome.runtime.getManifest().version;

	var exportObj = { 
		createdBy : 'Redirector v' + version, 
		createdAt : new Date(), 
		redirects : redirects 
	};

	var json = JSON.stringify(exportObj, null, 4);

	//Using encodeURIComponent here instead of base64 because base64 always messed up our encoding for some reason...
	el('#export-link').href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(json); 
}

updateExportLink();

function setupImportExportEventListeners() {
	el("#import-file").addEventListener('change', importRedirects);
	el("#export-link").addEventListener('mousedown', updateExportLink);
}

setupImportExportEventListeners();