www.spaceplanner.app

Web client to the spaceplanner API
git clone git://jacobedwards.org/www.spaceplanner.app
Log | Files | Refs

etc.js (3619B)


      1 import * as api from "/lib/api.js"
      2 import * as ui from "/lib/ui.js"
      3 
      4 function link(name, href, icon) {
      5 	let a = document.createElement("a")
      6 	a.href = href
      7 	if (icon) {
      8 		let i = document.createElement("img")
      9 		i.setAttribute("src", "/icons/" + icon + "-outline.svg")
     10 		i.setAttribute("alt", name + " icon")
     11 		i.classList.add("icon")
     12 		a.appendChild(i)
     13 	} else {
     14 		a.appendChild(document.createTextNode(name))
     15 	}
     16 	return a
     17 }
     18 
     19 function additem(list, element) {
     20 	let i = document.createElement("li")
     21 	i.appendChild(element)
     22 	list.append(i)
     23 }
     24 
     25 export function bar(on) {
     26 	if (!on) {
     27 		on = document.body
     28 	}
     29 
     30 	let nav = document.createElement("nav")
     31 	nav.id = "bar"
     32 
     33 	let left = nav.appendChild(document.createElement("ul"))
     34 	left.classList.add("left")
     35 
     36 	let right = nav.appendChild(document.createElement("ul"))
     37 	right.classList.add("right")
     38 
     39 	if (!api.authorized()) {
     40 		let l = link("Spaceplanner", "/")
     41 		additem(left, l)
     42 
     43 		l = link("Login", "/login")
     44 		l.classList.add("button")
     45 		additem(right, l)
     46 		l = link("Signup", "/register")
     47 		l.classList.add("button")
     48 		l.classList.add("pop")
     49 		additem(right, l)
     50 	} else {
     51 		userService()
     52 			.then(function(service) {
     53 				if (service == null) {
     54 					additem(left, link("Subscribe", "/services"))
     55 				} else {
     56 					additem(left, link("Floorplans", "/floorplans"))
     57 				}
     58 			})
     59 			.catch(function() {
     60 				additem(left, link("Floorplans", "/floorplans"))
     61 			})
     62 
     63 		additem(right, link("Settings", "/settings"))
     64 		additem(right, link("Logout", "/logout"))
     65 	}
     66 
     67 	on.prepend(nav)
     68 }
     69 
     70 export function userService() {
     71 	return api.fetch("GET", "users/:user/services/subscribed")
     72 		.then(function(r) {
     73 			if (r.services.length > 1) {
     74 				console.error("Only returning one service when multiple are subscribed to")
     75 			}
     76 			return r.services[0]
     77 		})
     78 }
     79 
     80 export function authorize() {
     81 	if (!api.authorized()) {
     82 		// Maybe add a parameter which has /login redirect
     83 		// back to the page that was trying to be accessed
     84 		window.location.href = "/login"
     85 	}
     86 	keep_authorized()
     87 }
     88 
     89 function keep_authorized() {
     90 	return setInterval(function() {
     91 		let left = Math.floor(api.authorized_duration() / 60)
     92 		if (left < 0) {
     93 			if (!document.getElementById("login")) {
     94 				let params = {
     95 					user: localStorage.getItem("username"),
     96 					forceUser: true
     97 				}
     98 				let login = document.body.appendChild(ui.login(params))
     99 				login.id = "login"
    100 			}
    101 		} else if (left < 30) {
    102 			console.log("keep_authorized", "refreshing", left, "minutes left")
    103 			api.refresh_token()
    104 		}
    105 	}, 1000 * 60)
    106 }
    107 
    108 export function error(message, on) {
    109 	console.error("etc.error", message)
    110 
    111 	if (!on || !on.parentElement) {
    112 		on = document.body
    113 	}
    114 
    115 	let err_elem = on.parentElement.querySelector(".error")
    116 	if (err_elem) {
    117 		err_elem.textContent = message
    118 	} else {
    119 		let err_elem = document.createElement("form")
    120 		err_elem.addEventListener("submit", function(e) { e.preventDefault() })
    121 		err_elem.setAttribute("class", "error")
    122 
    123 		let msg = document.createElement("p")
    124 		msg.appendChild(document.createTextNode(message))
    125 		err_elem.append(msg)
    126 		let b = err_elem.appendChild(ui.button("Dismiss", "Dismiss error", "close"))
    127 		b.addEventListener("click", function(ev) { err_elem.remove(); ev.preventDefault() })
    128 
    129 		on.prepend(err_elem)
    130 	}
    131 }
    132 
    133 export function handle_wrap(func, on) {
    134 	try {
    135 		func()
    136 	}
    137 	catch(err) {
    138 		console.error(err)
    139 		error("There was an issue with the page: " + err, on)
    140 	}
    141 }
    142 
    143 export function url_literal(text) {
    144 	return encodeURIComponent(text)
    145 }
    146 
    147 export function require_id(id) {
    148 	let e = document.getElementById(id)
    149 	if (!e) {
    150 		throw new Error("'#" + id + "' is required to exist, but doesn't")
    151 	}
    152 	return e
    153 }