refactor: promisize save
This commit is contained in:
		
							parent
							
								
									b800debd2f
								
							
						
					
					
						commit
						3ffacd309d
					
				
							
								
								
									
										171
									
								
								main.js
								
								
								
								
							
							
						
						
									
										171
									
								
								main.js
								
								
								
								
							| 
						 | 
				
			
			@ -34,7 +34,6 @@ var pending = false;
 | 
			
		|||
var settings = null;
 | 
			
		||||
var tags = null;
 | 
			
		||||
var titlemap = {};
 | 
			
		||||
var clip = "";
 | 
			
		||||
 | 
			
		||||
var stat =
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1199,7 +1198,7 @@ function loadstorage()
 | 
			
		|||
	var title = params.get("n");
 | 
			
		||||
	var line = params.get("l");
 | 
			
		||||
	var tags = params.get("t");
 | 
			
		||||
	clip = params.get("c");
 | 
			
		||||
	var clip = params.get("c");
 | 
			
		||||
 | 
			
		||||
	if (clip)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -1224,9 +1223,8 @@ function loadstorage()
 | 
			
		|||
		notepage.appendChild(msg);
 | 
			
		||||
 | 
			
		||||
		saved = false;
 | 
			
		||||
		save();
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
		return save()
 | 
			
		||||
		.then(window.close);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (currentnote)
 | 
			
		||||
| 
						 | 
				
			
			@ -1858,97 +1856,102 @@ function setsaved()
 | 
			
		|||
	unsavedmark.hidden = true;
 | 
			
		||||
	saved = true;
 | 
			
		||||
	lastsaved = timestamp();
 | 
			
		||||
	if (clip)
 | 
			
		||||
	{
 | 
			
		||||
		close();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function save()
 | 
			
		||||
{
 | 
			
		||||
	clearTimeout(workerid);
 | 
			
		||||
 | 
			
		||||
	if (currentnote.title == "settings.json")
 | 
			
		||||
	return new Promise(function(resolve, reject)
 | 
			
		||||
	{
 | 
			
		||||
		settings = JSON.parse(md.value);
 | 
			
		||||
		savesettings();
 | 
			
		||||
		loadsettings();
 | 
			
		||||
		setsaved();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	else if (currentnote.title == "pgpkeys")
 | 
			
		||||
	{
 | 
			
		||||
		localStorage.setItem("pgpkeys", md.value);
 | 
			
		||||
		setsaved();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
		clearTimeout(workerid);
 | 
			
		||||
 | 
			
		||||
	if (!localdata)
 | 
			
		||||
	{
 | 
			
		||||
		showtemporaryinfo("cannot push empty data");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (pending)
 | 
			
		||||
	{
 | 
			
		||||
		console.log("pending query: save cancelled");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (saved)
 | 
			
		||||
	{
 | 
			
		||||
		console.log("nothing to save");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var content = md.value;
 | 
			
		||||
	if ((content == "" && backup != "") || content == "null" || content == "undefined")
 | 
			
		||||
	{
 | 
			
		||||
		showtemporaryinfo("Invalid content '" + content + "', file '" + currentnote.title + "' not saved");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	currentnote.pos = md.selectionStart;
 | 
			
		||||
	currentnote.content = content;
 | 
			
		||||
	putontop();
 | 
			
		||||
 | 
			
		||||
	window.localStorage.setItem("data", JSON.stringify(localdata));
 | 
			
		||||
 | 
			
		||||
	if (settings.sync)
 | 
			
		||||
	{
 | 
			
		||||
		var datatosend = JSON.stringify(localdata);
 | 
			
		||||
		encryptstring(datatosend)
 | 
			
		||||
		.then(encrypted =>
 | 
			
		||||
		if (currentnote.title == "settings.json")
 | 
			
		||||
		{
 | 
			
		||||
			console.log("sending data to php server...");
 | 
			
		||||
			pending = true;
 | 
			
		||||
			return queryremote({action: "push", data: encrypted})
 | 
			
		||||
		})
 | 
			
		||||
		.then(() =>
 | 
			
		||||
		{
 | 
			
		||||
			console.log("...data saved on server");
 | 
			
		||||
			settings = JSON.parse(md.value);
 | 
			
		||||
			savesettings();
 | 
			
		||||
			loadsettings();
 | 
			
		||||
			setsaved();
 | 
			
		||||
		})
 | 
			
		||||
		.catch(remotecallfailed)
 | 
			
		||||
		.finally(() =>
 | 
			
		||||
			resolve();
 | 
			
		||||
		}
 | 
			
		||||
		else if (currentnote.title == "pgpkeys")
 | 
			
		||||
		{
 | 
			
		||||
			pending = false;
 | 
			
		||||
			if (content != md.value)
 | 
			
		||||
			localStorage.setItem("pgpkeys", md.value);
 | 
			
		||||
			setsaved();
 | 
			
		||||
			resolve();
 | 
			
		||||
		}
 | 
			
		||||
		else if (!localdata)
 | 
			
		||||
		{
 | 
			
		||||
			showtemporaryinfo("cannot push empty data");
 | 
			
		||||
			reject();
 | 
			
		||||
		}
 | 
			
		||||
		else if (pending)
 | 
			
		||||
		{
 | 
			
		||||
			console.log("pending query: save cancelled");
 | 
			
		||||
			reject();
 | 
			
		||||
		}
 | 
			
		||||
		else if (saved)
 | 
			
		||||
		{
 | 
			
		||||
			console.log("nothing to save");
 | 
			
		||||
			reject();
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			var content = md.value;
 | 
			
		||||
			if ((content == "" && backup != "") || content == "null" || content == "undefined")
 | 
			
		||||
			{
 | 
			
		||||
				console.log("but content changed: will save again");
 | 
			
		||||
				datachanged();
 | 
			
		||||
				showtemporaryinfo("Invalid content '" + content + "', file '" + currentnote.title + "' not saved");
 | 
			
		||||
				reject();
 | 
			
		||||
			}
 | 
			
		||||
			else if (!saved)
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				console.log("save failed. Data unsaved on server. Will retry.");
 | 
			
		||||
				datachanged();
 | 
			
		||||
				currentnote.pos = md.selectionStart;
 | 
			
		||||
				currentnote.content = content;
 | 
			
		||||
				putontop();
 | 
			
		||||
 | 
			
		||||
				window.localStorage.setItem("data", JSON.stringify(localdata));
 | 
			
		||||
 | 
			
		||||
				if (settings.sync)
 | 
			
		||||
				{
 | 
			
		||||
					var datatosend = JSON.stringify(localdata);
 | 
			
		||||
					return encryptstring(datatosend)
 | 
			
		||||
					.then(encrypted =>
 | 
			
		||||
					{
 | 
			
		||||
						console.log("sending data to php server...");
 | 
			
		||||
						pending = true;
 | 
			
		||||
						return queryremote({action: "push", data: encrypted})
 | 
			
		||||
					})
 | 
			
		||||
					.then(() =>
 | 
			
		||||
					{
 | 
			
		||||
						console.log("...data saved on server");
 | 
			
		||||
						setsaved();
 | 
			
		||||
					})
 | 
			
		||||
					.catch(remotecallfailed)
 | 
			
		||||
					.finally(() =>
 | 
			
		||||
					{
 | 
			
		||||
						pending = false;
 | 
			
		||||
						if (content != md.value)
 | 
			
		||||
						{
 | 
			
		||||
							console.log("but content changed: will save again");
 | 
			
		||||
							return datachanged();
 | 
			
		||||
						}
 | 
			
		||||
						else if (!saved)
 | 
			
		||||
						{
 | 
			
		||||
							console.log("save failed. Data unsaved on server. Will retry.");
 | 
			
		||||
							return datachanged();
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							resolve();
 | 
			
		||||
						}
 | 
			
		||||
					});
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					setsaved();
 | 
			
		||||
					resolve();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		setsaved();
 | 
			
		||||
	}
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function escapeHtml(unsafe) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2220,7 +2223,7 @@ function datachanged()
 | 
			
		|||
	saved = false;
 | 
			
		||||
	unsavedmark.hidden = !settings.sync;
 | 
			
		||||
 | 
			
		||||
	postpone()
 | 
			
		||||
	return postpone()
 | 
			
		||||
	.then(save);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue