143 lines
4.3 KiB
TypeScript
143 lines
4.3 KiB
TypeScript
import Mastodon from "megalodon";
|
|
import { MultiAccount, Account } from "../types/Account";
|
|
|
|
export function userLoggedIn(): boolean {
|
|
return !!(
|
|
localStorage.getItem("baseurl") && localStorage.getItem("access_token")
|
|
);
|
|
}
|
|
|
|
export function refreshUserAccountData() {
|
|
let host = localStorage.getItem("baseurl") as string;
|
|
let token = localStorage.getItem("access_token") as string;
|
|
|
|
let client = new Mastodon(token, host + "/api/v1");
|
|
|
|
client
|
|
.get("/accounts/verify_credentials")
|
|
.then((resp: any) => {
|
|
let account: Account = resp.data;
|
|
localStorage.setItem("account", JSON.stringify(account));
|
|
sessionStorage.setItem("id", account.id);
|
|
|
|
addAccountToRegistry(host, token, account.acct);
|
|
})
|
|
.catch((err: Error) => {
|
|
console.error(err.message);
|
|
});
|
|
client.get("/instance").then((resp: any) => {
|
|
localStorage.setItem(
|
|
"isPleroma",
|
|
resp.data.version.match(/Pleroma/) ? "true" : "false"
|
|
);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Set the access token and base URL to a given multi-account user.
|
|
* @param account The multi-account from localStorage to use
|
|
*/
|
|
export function loginWithAccount(account: MultiAccount) {
|
|
if (localStorage.getItem("access_token") !== null) {
|
|
console.info(
|
|
"Existing login detected. Removing and using assigned token..."
|
|
);
|
|
}
|
|
localStorage.setItem("access_token", account.access_token);
|
|
localStorage.setItem("baseurl", account.host);
|
|
}
|
|
|
|
/**
|
|
* Gets the account registry.
|
|
* @returns A list of accounts
|
|
*/
|
|
export function getAccountRegistry(): MultiAccount[] {
|
|
let accountRegistry: MultiAccount[] = [];
|
|
|
|
let accountRegistryString = localStorage.getItem("accountRegistry");
|
|
if (accountRegistryString !== null) {
|
|
accountRegistry = JSON.parse(accountRegistryString);
|
|
}
|
|
return accountRegistry;
|
|
}
|
|
|
|
/**
|
|
* Add an account to the multi-account registry if it doesn't exist already.
|
|
* @param base_url The base URL of the user (eg., the instance)
|
|
* @param access_token The access token for the user
|
|
* @param username The username of the user
|
|
*/
|
|
export function addAccountToRegistry(
|
|
base_url: string,
|
|
access_token: string,
|
|
username: string
|
|
) {
|
|
const newAccount: MultiAccount = {
|
|
host: base_url,
|
|
username,
|
|
access_token
|
|
};
|
|
|
|
let accountRegistry = getAccountRegistry();
|
|
const stringifiedRegistry = accountRegistry.map(account =>
|
|
JSON.stringify(account)
|
|
);
|
|
|
|
if (stringifiedRegistry.indexOf(JSON.stringify(newAccount)) === -1) {
|
|
accountRegistry.push(newAccount);
|
|
}
|
|
|
|
localStorage.setItem("accountRegistry", JSON.stringify(accountRegistry));
|
|
}
|
|
|
|
/**
|
|
* Remove an account from the multi-account registry, if possible
|
|
* @param accountIdentifier The index of the account from the registry or the MultiAccount object itself
|
|
*/
|
|
export function removeAccountFromRegistry(
|
|
accountIdentifier: number | MultiAccount
|
|
) {
|
|
let accountRegistry = getAccountRegistry();
|
|
|
|
if (typeof accountIdentifier === "number") {
|
|
if (accountRegistry.length > accountIdentifier) {
|
|
if (
|
|
localStorage.getItem("access_token") ===
|
|
accountRegistry[accountIdentifier].access_token
|
|
) {
|
|
localStorage.removeItem("baseurl");
|
|
localStorage.removeItem("access_token");
|
|
}
|
|
accountRegistry.splice(accountIdentifier);
|
|
} else {
|
|
console.log("Multi account index may be out of range");
|
|
}
|
|
} else {
|
|
const stringifiedRegistry = accountRegistry.map(account =>
|
|
JSON.stringify(account)
|
|
);
|
|
|
|
const stringifiedAccountId = JSON.stringify(accountIdentifier);
|
|
|
|
if (
|
|
stringifiedRegistry.indexOf(
|
|
JSON.stringify(stringifiedAccountId)
|
|
) !== -1
|
|
) {
|
|
if (
|
|
localStorage.getItem("access_token") ===
|
|
accountIdentifier.access_token
|
|
) {
|
|
localStorage.removeItem("baseurl");
|
|
localStorage.removeItem("access_token");
|
|
}
|
|
|
|
accountRegistry.splice(
|
|
stringifiedRegistry.indexOf(stringifiedAccountId)
|
|
);
|
|
}
|
|
}
|
|
|
|
localStorage.setItem("accountRegistry", JSON.stringify(accountRegistry));
|
|
}
|