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 }