diff --git a/src/locutus.ts b/src/locutus.ts
index 6634ee9..3294080 100644
--- a/src/locutus.ts
+++ b/src/locutus.ts
@@ -26,15 +26,37 @@ export class App {
this.handleUrl(event.newURL);
});
- this.handleUrl(document.URL);
+ const domainName = window.localStorage['domainName'];
+ const sessionToken = window.localStorage['sessionToken'];
+ if (domainName && sessionToken) {
+ USIMP.Domain.fromName(domainName).then((domain) => {
+ const session = new USIMP.Session(domain);
+ session.chooseDomainServer().then(() => {
+ session.token = sessionToken;
+ session.ping().then(() => {
+ this.session = session;
+ this.defaultLocation = '/';
+ this.handleUrl(document.URL);
+ })
+ });
+ }, (error) => {
+ if (error instanceof DOMException) {
+ throw new Error("Connection timed out");
+ } else {
+ throw new Error("Invalid USIMP domain");
+ }
+ });
+ } else {
+ this.handleUrl(document.URL);
+ }
}
- close() {
- if (this.session) this.session.close();
+ quit() {
+ if (this.session) this.session.close().then();
}
sleep() {
- if (this.session) this.session.sleep();
+ if (this.session) this.session.sleep().then();
}
async wakeup() {
@@ -52,7 +74,7 @@ export class App {
}
handleHash(hash: string) {
- if (hash[0] === '#') hash = hash.substr(1);
+ if (hash[0] === '#') hash = hash.substring(1);
const defaultCase = () => {
history.replaceState(null, document.title, `#${this.defaultLocation}`);
@@ -110,7 +132,7 @@ export class App {
if (response.status === "success") {
this.session = session;
this.defaultLocation = "/";
- this.setHash("/");
+ return true;
} else {
console.error(response.error);
throw new Error(response.error.message || response.error.code);
@@ -188,6 +210,8 @@ export class App {
+
+
`;
@@ -204,8 +228,21 @@ export class App {
}
try {
+ const accountName: string = form['account'].value;
+ const domainName: string = form['domain'].value;
+ const keepSession: boolean = form['keepSession'].checked;
+ const saveAccountName: boolean = form['saveAccountName'].checked;
try {
- await this.login(form['account'].value, form['domain'].value, form['password'].value);
+ if (await this.login(accountName, domainName, form['password'].value)) {
+ window.localStorage.clear();
+ if (keepSession || saveAccountName)
+ window.localStorage['domainName'] = domainName;
+ if (keepSession)
+ window.localStorage['sessionToken'] = this.session?.token;
+ if (saveAccountName)
+ window.localStorage['accountName'] = accountName;
+ this.setHash("/");
+ }
} finally {
for (const d of form.getElementsByTagName("div")) form.removeChild(d);
for (const e of form.getElementsByTagName("input")) e.disabled = false;
@@ -231,19 +268,29 @@ export class App {
const domain = document.getElementsByName("domain")[0];
if (!domain) throw new Error("Element name=domain not found");
-
- domain.addEventListener("input", (event) => {
+ domain.addEventListener("input", () => {
domain.removeAttribute("invalid");
});
const account = document.getElementsByName("account")[0];
if (!account) throw new Error("Element name=account not found");
-
- account.addEventListener("input", (event) => {
+ account.addEventListener("input", () => {
account.removeAttribute("invalid");
});
- account.focus();
+ const password = document.getElementsByName("password")[0];
+ if (!password) throw new Error("Element name=password not found");
+
+ const accountName = window.localStorage['accountName'];
+ const domainName = window.localStorage['domainName'];
+ if (accountName && domainName) {
+ form['account'].value = accountName;
+ form['domain'].value = domainName;
+ form['saveAccountName'].checked = true;
+ password.focus();
+ } else {
+ account.focus();
+ }
}
setupMain() {
diff --git a/src/main.ts b/src/main.ts
index 9b1cf48..dc80d2d 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -28,7 +28,7 @@ window.addEventListener("DOMContentLoaded", () => {
}
window.addEventListener("beforeunload", () => {
- locutus.close();
+ locutus.quit();
});
});
diff --git a/tsconfig.json b/tsconfig.json
index d44da8e..803b1b1 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,10 +1,10 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
- "target": "ES2020",
- "module": "ES2020",
+ "target": "ESNext",
+ "module": "ESNext",
"outDir": "dest/www/res/scripts",
- "rootDir": "src",
+ "rootDir": "src/",
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,