Updates to 'apps' from Tasia.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4846 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										154
									
								
								apps/apps/app.js
									
									
									
									
									
								
							
							
						
						
									
										154
									
								
								apps/apps/app.js
									
									
									
									
									
								
							@@ -1,15 +1,31 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Fetches information about the applications
 | 
			
		||||
 * @param apps Record<appName, blobId>
 | 
			
		||||
 * @returns an object including the apps' name, emoji, and blobs ids
 | 
			
		||||
 */
 | 
			
		||||
async function fetch_info(apps) {
 | 
			
		||||
	let result = {};
 | 
			
		||||
 | 
			
		||||
	// For each app
 | 
			
		||||
	for (let [key, value] of Object.entries(apps)) {
 | 
			
		||||
		// Get it's blob and parse it
 | 
			
		||||
		let blob = await ssb.blobGet(value);
 | 
			
		||||
		blob = blob ? utf8Decode(blob) : '{}';
 | 
			
		||||
 | 
			
		||||
		// Add it to the result object
 | 
			
		||||
		result[key] = JSON.parse(blob);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
async function fetch_shared_apps() {
 | 
			
		||||
	let messages = {};
 | 
			
		||||
 | 
			
		||||
	await ssb.sqlAsync(`
 | 
			
		||||
				SELECT messages.*
 | 
			
		||||
				FROM messages_fts('"application/tildefriends"')
 | 
			
		||||
@@ -29,6 +45,7 @@ async function fetch_shared_apps() {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
	let result = {};
 | 
			
		||||
	for (let app of Object.values(messages).sort((x, y) => y.message.timestamp - x.message.timestamp)) {
 | 
			
		||||
		let app_object = JSON.parse(utf8Decode(await ssb.blobGet(app.blob)));
 | 
			
		||||
@@ -41,18 +58,26 @@ async function fetch_shared_apps() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function main() {
 | 
			
		||||
	var apps = await fetch_info(await core.apps());
 | 
			
		||||
	var core_apps = await fetch_info(await core.apps('core'));
 | 
			
		||||
	let shared_apps = await fetch_shared_apps();
 | 
			
		||||
	var doc = `<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
	<style>
 | 
			
		||||
	const apps = await fetch_info(await core.apps());
 | 
			
		||||
	const core_apps = await fetch_info(await core.apps('core'));
 | 
			
		||||
	const shared_apps = await fetch_shared_apps();
 | 
			
		||||
 | 
			
		||||
	const stylesheet = `
 | 
			
		||||
		body {
 | 
			
		||||
			color: whitesmoke;
 | 
			
		||||
			font-family: sans-serif;
 | 
			
		||||
			margin: 16px;
 | 
			
		||||
		}
 | 
			
		||||
		.container {
 | 
			
		||||
			display: grid;
 | 
			
		||||
			grid-template-columns: repeat(auto-fill, 64px);
 | 
			
		||||
			gap: 1em;
 | 
			
		||||
			justify-content: space-around;
 | 
			
		||||
			background-color: #ffffff10;
 | 
			
		||||
			border: 2px solid #073642;
 | 
			
		||||
			border-radius: 8px;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		.app {
 | 
			
		||||
			height: 96px;
 | 
			
		||||
			width: 64px;
 | 
			
		||||
@@ -67,48 +92,87 @@ async function main() {
 | 
			
		||||
			max-width: 64px;
 | 
			
		||||
			text-overflow: ellipsis ellipsis;
 | 
			
		||||
			overflow: hidden;
 | 
			
		||||
			color: whitesmoke;
 | 
			
		||||
		}
 | 
			
		||||
	</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body style="background: #888">
 | 
			
		||||
<h1 id="apps_title">Apps</h1>
 | 
			
		||||
<div id="apps" class="container"></div>
 | 
			
		||||
<h1>Shared Apps</h1>
 | 
			
		||||
<div id="shared_apps" class="container"></div>
 | 
			
		||||
<h1>Core Apps</h1>
 | 
			
		||||
<div id="core_apps" class="container"></div>
 | 
			
		||||
</body>
 | 
			
		||||
<script>
 | 
			
		||||
	function populate_apps(id, name, apps) {
 | 
			
		||||
		var list = document.getElementById(id);
 | 
			
		||||
		for (let app of Object.keys(apps).sort()) {
 | 
			
		||||
			let div = list.appendChild(document.createElement('div'));
 | 
			
		||||
			div.classList.add('app');
 | 
			
		||||
	`;
 | 
			
		||||
 | 
			
		||||
			let href = name ? '/~' + name + '/' + app + '/' : ('/' + apps[app].blob_id + '/');
 | 
			
		||||
			let icon_a = document.createElement('a');
 | 
			
		||||
			let icon = document.createElement('div');
 | 
			
		||||
			icon.appendChild(document.createTextNode(apps[app].emoji || '📦'));
 | 
			
		||||
			icon.style.fontSize = 'xxx-large';
 | 
			
		||||
			icon_a.appendChild(icon);
 | 
			
		||||
			icon_a.href = href;
 | 
			
		||||
			icon_a.target = '_top';
 | 
			
		||||
			div.appendChild(icon_a);
 | 
			
		||||
	const body = `
 | 
			
		||||
		<h1 style="text-shadow: #808080 0 0 10px;">Welcome to Tilde Friends.</h1>
 | 
			
		||||
 | 
			
		||||
			let a = document.createElement('a');
 | 
			
		||||
			a.appendChild(document.createTextNode(app));
 | 
			
		||||
			a.href = href;
 | 
			
		||||
			a.target = '_top';
 | 
			
		||||
			div.appendChild(a);
 | 
			
		||||
		<h2>your apps</h2>
 | 
			
		||||
		<div id="apps" class="container"></div>
 | 
			
		||||
 | 
			
		||||
		<h2>shared apps</h2>
 | 
			
		||||
		<div id="shared_apps" class="container"></div>
 | 
			
		||||
 | 
			
		||||
		<h2>core apps</h2>
 | 
			
		||||
		<div id="core_apps" class="container"></div>
 | 
			
		||||
	`;
 | 
			
		||||
 | 
			
		||||
	const script = `
 | 
			
		||||
		/*
 | 
			
		||||
		 * Creates a list of apps
 | 
			
		||||
		 * @param id the id of the element to populate
 | 
			
		||||
		 * @param name (a username, 'core' or undefined)
 | 
			
		||||
		 * @param apps Object, a list of apps
 | 
			
		||||
		 */
 | 
			
		||||
		function populate_apps(id, name, apps) {
 | 
			
		||||
			// Our target
 | 
			
		||||
			var list = document.getElementById(id);
 | 
			
		||||
 | 
			
		||||
			// For each app in the provided list
 | 
			
		||||
			for (let app of Object.keys(apps).sort()) {
 | 
			
		||||
 | 
			
		||||
				// Create the item
 | 
			
		||||
				let div = list.appendChild(document.createElement('div'));
 | 
			
		||||
				div.classList.add('app');
 | 
			
		||||
 | 
			
		||||
				// The app's icon
 | 
			
		||||
				let href = name ? '/~' + name + '/' + app + '/' : ('/' + apps[app].blob_id + '/');
 | 
			
		||||
				let icon_a = document.createElement('a');
 | 
			
		||||
				let icon = document.createElement('div');
 | 
			
		||||
				icon.appendChild(document.createTextNode(apps[app].emoji || '📦'));
 | 
			
		||||
				icon.style.fontSize = 'xxx-large';
 | 
			
		||||
				icon_a.appendChild(icon);
 | 
			
		||||
				icon_a.href = href;
 | 
			
		||||
				icon_a.target = '_top';
 | 
			
		||||
				div.appendChild(icon_a);
 | 
			
		||||
 | 
			
		||||
				// The app's name
 | 
			
		||||
				let a = document.createElement('a');
 | 
			
		||||
				a.appendChild(document.createTextNode(app));
 | 
			
		||||
				a.href = href;
 | 
			
		||||
				a.target = '_top';
 | 
			
		||||
				div.appendChild(a);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	document.getElementById('apps_title').innerText = "~${escape(core.user.credentials?.session?.name || 'guest')}'s Apps";
 | 
			
		||||
	populate_apps('apps', '${core.user.credentials?.session?.name}', ${JSON.stringify(apps)});
 | 
			
		||||
	populate_apps('core_apps', 'core', ${JSON.stringify(core_apps)});
 | 
			
		||||
	populate_apps('shared_apps', undefined, ${JSON.stringify(shared_apps)});
 | 
			
		||||
</script>
 | 
			
		||||
</html>`;
 | 
			
		||||
	app.setDocument(doc);
 | 
			
		||||
 | 
			
		||||
		populate_apps('apps', '${core.user.credentials?.session?.name}', ${JSON.stringify(apps)});
 | 
			
		||||
		populate_apps('core_apps', 'core', ${JSON.stringify(core_apps)});
 | 
			
		||||
		populate_apps('shared_apps', undefined, ${JSON.stringify(shared_apps)});
 | 
			
		||||
	`;
 | 
			
		||||
 | 
			
		||||
	// Build the document
 | 
			
		||||
	const document = `
 | 
			
		||||
	<!DOCTYPE html>
 | 
			
		||||
	<html>
 | 
			
		||||
		<head>
 | 
			
		||||
			<style>
 | 
			
		||||
				${stylesheet}
 | 
			
		||||
			</style>
 | 
			
		||||
		</head>
 | 
			
		||||
 | 
			
		||||
		<body>
 | 
			
		||||
			${body}
 | 
			
		||||
		</body>
 | 
			
		||||
 | 
			
		||||
		<script>
 | 
			
		||||
			${script}
 | 
			
		||||
		</script>
 | 
			
		||||
	</html>`;
 | 
			
		||||
 | 
			
		||||
	// Send it to the browser
 | 
			
		||||
	app.setDocument(document);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
main();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user