aboutsummaryrefslogblamecommitdiff
path: root/src/gapi.ts
blob: d601e64fac399aff630f6570486614428cea54c9 (plain) (tree)
1
2
3
4
5
6




                                                          
                             







                                          
                                 





                                                                

                                                                      
                                     



                                                                    






                                                                            
                                                       

                          





                                       
     
                    

 



                                                       

 






                                              

 
                                               

                                     

                                                                             





                                        









                              
                                                                 
                               

                                                                               


                                         
                                                              
                               

                                                                


                           
                                                                                      
                               
                                                                                              








                                                 
                                                                        


                                                                     
                                                                                      



























                                                           
                                




                           
              




                


































                                                                                       


















































































































                                                                                       


                                                                 
                       

                                              













                                                   




                                                 




























                                                                                                      
                                                                        

























                                                                                






                                                                              




























                                                                                  
/* 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,