jank-client-fork/webpage/login.ts
2024-07-11 14:45:29 -05:00

254 lines
7.9 KiB
TypeScript

const mobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
export {mobile, getBulkUsers,getBulkInfo,setTheme,Specialuser}
function setTheme(){
const name=localStorage.getItem("theme");
if(!name){
document.body.className="Dark-theme";
localStorage.setItem("theme","Dark");
}
document.body.className=name+"-theme";
}
setTheme();
function getBulkUsers(){
const json=getBulkInfo()
for(const thing in json.users){
json.users[thing]=new Specialuser(json.users[thing]);
}
return json;
}
function getBulkInfo(){
return JSON.parse(localStorage.getItem("userinfos"));
}
function setDefaults(){
let userinfos=getBulkInfo();
if(!userinfos){
localStorage.setItem("userinfos",JSON.stringify({
currentuser:null,
users:{},
preferences:
{
theme:"Dark",
notifications:false,
notisound:"three",
},
}));
userinfos=getBulkInfo();
}
if(userinfos.users===undefined){
userinfos.users={};
}
if(userinfos.preferences===undefined){
userinfos.preferences={
theme:"Dark",
notifications:false,
notisound:"three",
}
}
if(userinfos.preferences&&(userinfos.preferences.notisound===undefined)){
userinfos.preferences.notisound="three";
}
localStorage.setItem("userinfos",JSON.stringify(userinfos));
}
setDefaults();
class Specialuser{
serverurls;
email:string;
token:string;
loggedin;
json;
constructor(json){
if(json instanceof Specialuser){
console.error("specialuser can't construct from another specialuser");
}
this.serverurls=json.serverurls;
this.serverurls.api=new URL(this.serverurls.api);
this.serverurls.cdn=new URL(this.serverurls.cdn);
this.serverurls.gateway=new URL(this.serverurls.gateway);
this.serverurls.wellknown=new URL(this.serverurls.wellknown);
this.email=json.email;
this.token=json.token;
this.loggedin=json.loggedin;
this.json=json;
if(!this.serverurls||!this.email||!this.token){
console.error("There are fundamentally missing pieces of info missing from this user");
}
}
set pfpsrc(e){
console.log("this ran fr")
this.json.pfpsrc=e;
this.updateLocal();
}
get pfpsrc(){
return this.json.pfpsrc;
}
set username(e){
this.json.username=e;
this.updateLocal();
}
get username(){
return this.json.username;
}
get uid(){
return this.email+this.serverurls.wellknown;
}
toJSON(){
return this.json;
}
updateLocal(){
const info=getBulkInfo();
info.users[this.uid]=this.toJSON();
localStorage.setItem("userinfos",JSON.stringify(info));
}
}
function adduser(user){
user=new Specialuser(user);
const info=getBulkInfo();
info.users[user.uid]=user;
info.currentuser=user.uid;
localStorage.setItem("userinfos",JSON.stringify(info));
}
const instancein=document.getElementById("instancein");
let timeout;
let instanceinfo;
async function checkInstance(e){
const verify=document.getElementById("verify");;
try{
verify.textContent="Checking Instance";
const instanceinfo=await setInstance((instancein as HTMLInputElement).value);
localStorage.setItem("instanceinfo",JSON.stringify(instanceinfo));
verify.textContent="Instance is all good"
if(checkInstance["alt"]){checkInstance["alt"]();}
setTimeout(_=>{
console.log(verify.textContent)
verify.textContent="";
},3000);
}catch(e){
console.log("catch")
verify.textContent="Invalid Instance, try again"
}
}
if(instancein){
console.log(instancein)
instancein.addEventListener("keydown",e=>{
const verify=document.getElementById("verify");
verify.textContent="Waiting to check Instance"
clearTimeout(timeout);
timeout=setTimeout(checkInstance,1000);
});
if(localStorage.getItem("instanceinfo")){
(instancein as HTMLInputElement).value=JSON.parse(localStorage.getItem("instanceinfo")).wellknown
}else{
checkInstance("https://spacebar.chat/");
}
}
async function login(username:string, password:string, captcha:string){
if(captcha===""){
captcha=undefined;
}
const options={
method: "POST",
body:JSON.stringify({
"login": username,
"password": password,
"undelete":false,
"captcha_key":captcha
}),
headers: {
"Content-type": "application/json; charset=UTF-8",
}}
try{
const info=JSON.parse(localStorage.getItem("instanceinfo"));
const url=new URL(info.login);
return await fetch(url.origin+'/api/auth/login',options).then(response=>response.json())
.then((response) => {
console.log(response,response.message)
if("Invalid Form Body"===response.message){
return response.errors.login._errors[0].message;
console.log("test")
}
//this.serverurls||!this.email||!this.token
console.log(response);
if(response.captcha_sitekey){
const capt=document.getElementById("h-captcha");
const capty=document.createElement("div");
capty.classList.add("h-captcha");
capty.setAttribute("data-sitekey", response.captcha_sitekey);
const script=document.createElement("script");
script.src="https://js.hcaptcha.com/1/api.js";
capt.append(script);
capt.append(capty);
}else{
adduser({serverurls:JSON.parse(localStorage.getItem("instanceinfo")),email:username,token:response.token});
window.location.href = '/channels/@me';
return response.token;
}
})
}catch(error){
console.error('Error:', error);
};
}
async function setInstance(url){
url=new URL(url);
async function attempt(aurl){
const info=await fetch(`${aurl.toString()}${aurl.pathname.includes("api") ? "" : "api"}/policies/instance/domains`)
.then((x) => x.json());
return {
api: info.apiEndpoint,
gateway: info.gateway,
cdn: info.cdn,
wellknown: url,
login:aurl.toString()
}
}
try{
return await attempt(url);
}catch(e){
}
const wellKnown = await fetch(`${url.origin}/.well-known/spacebar`)
.then((x) => x.json())
.then((x) => new URL(x.api));
return await attempt(wellKnown);
}
async function check(e){
e.preventDefault();
let h=await login(e.srcElement[1].value,e.srcElement[2].value,e.srcElement[3].value);
document.getElementById("wrong").textContent=h;
console.log(h);
}
if(document.getElementById("form")){
document.getElementById("form").addEventListener("submit", check);
}
//Service workers :3
if ("serviceWorker" in navigator){
navigator.serviceWorker.register("/service.js", {
scope: "/",
}).then((registration) => {
let serviceWorker;
if (registration.installing) {
serviceWorker = registration.installing;
console.log("installing");
} else if (registration.waiting) {
serviceWorker = registration.waiting;
console.log("waiting");
} else if (registration.active) {
serviceWorker = registration.active;
console.log("active");
}
if (serviceWorker) {
console.log(serviceWorker.state);
serviceWorker.addEventListener("statechange", (e) => {
console.log(e.target.state);
});
}
})
}
export {checkInstance};