/* global chrome */
import LRU from "lru-cache";
const gapiBase = 'https://www.googleapis.com/calendar/v3';
let loggedIn: boolean = null;
enum GApiError {
invalidSyncToken = "invalidSyncToken",
notLoggedIn = "notLoggedIn",
notLoggedOut = "notLoggedOut",
otherError = "otherError",
}
function toParams(dict: Object) {
return Object.entries(dict).filter(([k, v] : string[]) => v)
.map(([k, v]: string[]) => (
`${encodeURIComponent(k)}=${encodeURIComponent(v)}`
)).join('&');
}
async function _getAuthToken(interactive = false): Promise<string> {
let [token, ok]: [string, boolean] = await new Promise(resolver =>
chrome.identity.getAuthToken(
{ interactive },
token => resolver([token, !chrome.runtime.lastError])));
if (ok) return token;
else throw GApiError.notLoggedIn;
}
function _removeCachedAuthToken(token: string) {
return new Promise(resolver =>
chrome.identity.removeCachedAuthToken({ token }, () => resolver()));
}
export async function getLoggedIn(): Promise<boolean> {
if (loggedIn === null)
{
try {
await _getAuthToken(false);
loggedIn = true;
} catch(_) {
loggedIn = false;
}
}
return loggedIn;
}
export async function getAuthToken(): Promise<string> {
let b = await getLoggedIn();
if (b) return _getAuthToken(false);
else throw GApiError.notLoggedIn;
}
export async function login(): Promise<void> {
let b = await getLoggedIn();
if (!b) {
await _getAuthToken(true);
loggedIn = true;
}
else throw GApiError.notLoggedOut;
}
export async function logout(): Promise<void> {
let token = await getAuthToken();
let response = await fetch(
`https://accounts.google.com/o/oauth2/revoke?${toParams({ token })}`,
{ method: 'GET' });
//if (response.status === 200)
await _removeCachedAuthToken(token);
//else throw GApiError.otherError;
loggedIn = false;
}
export type GCalendarColor = {
background: string
};
export type GCalendarMeta = {
name: string,
color: GCalendarColor,
enabled: boolean
};
export async function getCalendars(token: string): Promise<any> {
let response = await fetch(
`${gapiBase}/users/me/calendarList?${toParams({access_token: token})}`,
{ method: 'GET' });
return (await response.json()).items;
}
export async function getColors(token: string): Promise<any> {
let response = await fetch(
`${gapiBase}/colors?${toParams({access_token: token})}`,
{ method: 'GET' });
return response.json();
}
async function getEvent(calId: string, eventId: string,