95 lines
2.6 KiB
JavaScript
95 lines
2.6 KiB
JavaScript
const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
const sessionStr = () => {
|
|
if (!localStorage.getItem('session'))
|
|
localStorage.setItem('session', genRanHex(64));
|
|
return localStorage.getItem('session');
|
|
};
|
|
const sessionState = async () => {
|
|
const response = await fetch(
|
|
`/state/?session=${sessionStr()}`
|
|
);
|
|
return await response.json();
|
|
};
|
|
const sessionStatus = (
|
|
() => {
|
|
let task;
|
|
return (async () => {
|
|
if (task === undefined) {
|
|
task = (async () => {
|
|
const response = await fetch(
|
|
`/status/?session=${sessionStr()}`
|
|
);
|
|
return await response.json();
|
|
})();
|
|
}
|
|
return await task;
|
|
})
|
|
}
|
|
)();
|
|
const root = document.querySelector('#root');
|
|
const logEl = (msg) => {
|
|
const el = document.createElement('pre');
|
|
el.innerText = msg;
|
|
root.append(el);
|
|
};
|
|
const sessionClient = async () => {
|
|
const session = await sessionStatus();
|
|
return session && session['client'];
|
|
};
|
|
const sessionUser = async () => {
|
|
const client = await sessionClient();
|
|
return client && client['user'];
|
|
};
|
|
const userAvatarUrl = async () => {
|
|
const user = await sessionUser();
|
|
return user && user['avatar'];
|
|
};
|
|
const userUsername = async () => {
|
|
const user = await sessionUser();
|
|
return user && user['username'];
|
|
};
|
|
const userAvatarImg = async () => {
|
|
const avatar = await userAvatarUrl();
|
|
if (avatar) {
|
|
const img = document.createElement('img');
|
|
img.src = avatar;
|
|
img.width = 64;
|
|
img.height = 64;
|
|
img.alt = await userUsername();
|
|
return img;
|
|
} else {
|
|
return baseEl('span');
|
|
}
|
|
};
|
|
const userId = async () => {
|
|
const user = await sessionUser();
|
|
return user && user['id'];
|
|
};
|
|
const baseEl = (tag, ...appended) => {
|
|
const element = document.createElement(tag);
|
|
element.append(...appended);
|
|
return element;
|
|
};
|
|
const aLogin = () => {
|
|
const a = document.createElement('a');
|
|
a.href = '/login/';
|
|
a.innerText = 'login';
|
|
return a;
|
|
};
|
|
const pageHome = async () => {
|
|
return baseEl(
|
|
'div',
|
|
baseEl('div', aLogin()),
|
|
baseEl('div', await userAvatarImg()),
|
|
baseEl('div', await userId()),
|
|
baseEl('div', await userUsername()),
|
|
)
|
|
};
|
|
let authbase;
|
|
const aAuth = async () => {
|
|
const a = document.createElement('a');
|
|
a.href = authbase + '&state=' + await sessionState();
|
|
a.innerText = 'auth';
|
|
return a;
|
|
};
|