'use strict'; import { h, html, render, useEffect, useState } from './preact.min.js'; const Nav = props => html`
Your Product
Logged in as: ${props.user} logout
`; const Main = props => html`

${props.data.text}

`; const Login = function (props) { const [user, setUser] = useState(''); const [pass, setPass] = useState(''); const login = () => fetch( '/api/login', { headers: { Authorization: 'Basic ' + btoa(user + ':' + pass) } }) .then(r => r.json()) .then(r => r && props.login(r)) .catch(err => err); return html`

Your Product Login

setUser(ev.target.value)} value=${user} />
setPass(ev.target.value)} value=${pass} onchange=${login} />
Valid logins: admin:pass0, user1:pass1, user2:pass2
`; }; const App = function () { const [user, setUser] = useState(''); const [data, setData] = useState({}); const getin = () => fetch('/api/data', { headers: { Authorization: '' } }) .then(r => r.json()) .then(r => setData(r)) .catch(err => console.log(err)); const login = function (u) { document.cookie = `access_token=${u.token}; Secure, HttpOnly; SameSite=Lax; path=/; max-age=3600`; setUser(u.user); return getin(); }; const logout = () => { document.cookie = `access_token=; Secure, HttpOnly; SameSite=Lax; path=/; max-age=0`; setUser(''); }; useEffect(() => { // Called once at init time fetch('/api/login', { headers: { Authorization: '' } }) .then(r => r.json()) .then(r => login(r)) .catch(() => setUser('')); }, []); if (!user) return html`<${Login} login=${login} />`; return html` <${Nav} user=${user} logout=${logout} /> <${Main} data=${data} /> `; }; window.onload = () => render(h(App), document.body);