From e66166af2918bde7817159e22ada3c6c9903d360 Mon Sep 17 00:00:00 2001 From: talksik Date: Fri, 18 Mar 2022 11:40:53 -0400 Subject: [PATCH] organizing things and cracking problem with the polyfills i think? --- .../src/components/ProtectedRoute/index.tsx | 7 --- packages/desktop/src/electron/constants.ts | 7 +++ packages/desktop/src/electron/global.d.ts | 12 +++- packages/desktop/src/electron/handleLogin.ts | 5 +- packages/desktop/src/electron/preload.ts | 26 +++++++-- packages/desktop/src/electron/store.ts | 4 -- packages/desktop/src/index.ts | 8 ++- packages/desktop/src/pages/Login/index.tsx | 55 ++++++++++++++----- 8 files changed, 87 insertions(+), 37 deletions(-) diff --git a/packages/desktop/src/components/ProtectedRoute/index.tsx b/packages/desktop/src/components/ProtectedRoute/index.tsx index 001800e..ed5794d 100644 --- a/packages/desktop/src/components/ProtectedRoute/index.tsx +++ b/packages/desktop/src/components/ProtectedRoute/index.tsx @@ -1,7 +1,5 @@ import Login from "../../pages/Login"; -import { STORE_ITEMS } from "../../electron/store"; import SkeletonLoader from "../loading/skeleton"; -import { nirvanaApi } from "../../controller/nirvanaApi"; import { useEffect } from "react"; import { useGetUserDetails } from "../../controller/index"; @@ -12,11 +10,6 @@ export default function ProtectedRoute({ }) { const { isLoading, isError, refetch } = useGetUserDetails(); - useEffect(() => { - // console.log(window.electronAPI.store.get(STORE_ITEMS.AUTH_TOKENS)); - // nirvanaApi.getUserDetails(); - }, []); - if (isLoading) return (
diff --git a/packages/desktop/src/electron/constants.ts b/packages/desktop/src/electron/constants.ts index ae527f1..d4b30bb 100644 --- a/packages/desktop/src/electron/constants.ts +++ b/packages/desktop/src/electron/constants.ts @@ -1,6 +1,13 @@ +// NOTE: DO NOT ADD ANY ELECTRON RELATED TYPESCRIPT HERE...KEEP IT ONLY TYPESCRIPT OTHERWISE +// THE RENDERED WONT BE ABLE TO ACCESS THIS AS IT WILL THINK ITS PART OF MAIN PROCESS + enum Channels { ACTIVATE_LOG_IN = "ACTIVATE_LOG_IN", AUTH_TOKENS = "AUTH_TOKENS", } +export enum STORE_ITEMS { + AUTH_TOKENS = "AUTH_TOKENS", +} + export default Channels; diff --git a/packages/desktop/src/electron/global.d.ts b/packages/desktop/src/electron/global.d.ts index 3647b2f..7cc3645 100644 --- a/packages/desktop/src/electron/global.d.ts +++ b/packages/desktop/src/electron/global.d.ts @@ -3,6 +3,16 @@ import { electronAPI } from "./preload"; export {}; declare global { interface Window { - electronAPI: typeof electronAPI; + electronAPI: { + auth: { + initiateLogin(): void; + }; + store: { + get(val: STORE_ITEMS): any; + set(property: STORE_ITEMS, val: any): void; + }; + on(channel: Channels, func: any): void; + once(channel: Channels, func: any): void; + }; } } diff --git a/packages/desktop/src/electron/handleLogin.ts b/packages/desktop/src/electron/handleLogin.ts index ce4a72a..be8301c 100644 --- a/packages/desktop/src/electron/handleLogin.ts +++ b/packages/desktop/src/electron/handleLogin.ts @@ -1,9 +1,9 @@ -import store, { STORE_ITEMS } from "./store"; +import Channels, { STORE_ITEMS } from "./constants"; -import Channels from "./constants"; import ElectronGoogleOAuth2 from "@getstation/electron-google-oauth2"; import { browserWindow } from "../index"; import { ipcMain } from "electron"; +import store from "./store"; const myApiOauth = new ElectronGoogleOAuth2( "423533244953-banligobgbof8hg89i6cr1l7u0p7c2pk.apps.googleusercontent.com", @@ -12,6 +12,7 @@ const myApiOauth = new ElectronGoogleOAuth2( { successRedirectURL: "https://usenirvana.com" } ); +// FRESH LOGIN...either tokens of user expired or never had them export async function handleLogin() { // read saved refresh token if any // todo: fix this...should be working diff --git a/packages/desktop/src/electron/preload.ts b/packages/desktop/src/electron/preload.ts index 7025730..9174530 100644 --- a/packages/desktop/src/electron/preload.ts +++ b/packages/desktop/src/electron/preload.ts @@ -1,26 +1,42 @@ import { contextBridge, ipcRenderer } from "electron"; import Channels from "./constants"; -import { STORE_ITEMS } from "./store"; +import { STORE_ITEMS } from "./constants"; const electronAPI = { auth: { initiateLogin() { ipcRenderer.send(Channels.ACTIVATE_LOG_IN); }, - receiveTokens(channel: Channels, func: any) { - ipcRenderer.on(channel, (event, ...args) => func(...args)); - }, }, store: { get(val: STORE_ITEMS) { - return ipcRenderer.sendSync("electron-store-get", val); + return ipcRenderer.invoke("electron-store-get", val); }, set(property: STORE_ITEMS, val: any) { ipcRenderer.send("electron-store-set", property, val); }, // Other method you want to add like has(), reset(), etc. }, + + on(channel: Channels, func: any) { + const validChannels = ["ipc-example"]; + // if (validChannels.includes(channel)) { + // // Deliberately strip event as it includes `sender` + // ipcRenderer.on(channel, (event, ...args) => func(...args)); + // } + + ipcRenderer.on(channel, (event, ...args) => func(...args)); + }, + once(channel: Channels, func: any) { + // const validChannels = ["ipc-example"]; + // if (validChannels.includes(channel)) { + // // Deliberately strip event as it includes `sender` + // ipcRenderer.once(channel, (event, ...args) => func(...args)); + // } + + ipcRenderer.once(channel, (event, ...args) => func(...args)); + }, }; contextBridge.exposeInMainWorld("electronAPI", electronAPI); diff --git a/packages/desktop/src/electron/store.ts b/packages/desktop/src/electron/store.ts index 81cdd7a..72b8190 100644 --- a/packages/desktop/src/electron/store.ts +++ b/packages/desktop/src/electron/store.ts @@ -2,8 +2,4 @@ import Store from "electron-store"; import { ipcMain } from "electron"; const store = new Store(); -export enum STORE_ITEMS { - AUTH_TOKENS = "AUTH_TOKENS", -} - export default store; diff --git a/packages/desktop/src/index.ts b/packages/desktop/src/index.ts index 3074d63..d9efc90 100644 --- a/packages/desktop/src/index.ts +++ b/packages/desktop/src/index.ts @@ -45,18 +45,20 @@ app .whenReady() .then(createWindow) .then(() => { + // activate login ipcMain.on(Channels.ACTIVATE_LOG_IN, async (event, arg) => { console.log("initiating log in"); await handleLogin(); }); // IPC listener - ipcMain.on("electron-store-get", async (event, val) => { - event.returnValue = store.get(val); - }); ipcMain.on("electron-store-set", async (event, key, val) => { store.set(key, val); }); + ipcMain.handle("electron-store-get", async (event, val) => { + const result = await store.get(val); + return result; + }); }); // Quit when all windows are closed, except on macOS. There, it's common diff --git a/packages/desktop/src/pages/Login/index.tsx b/packages/desktop/src/pages/Login/index.tsx index 20b99fa..e1bbf4f 100644 --- a/packages/desktop/src/pages/Login/index.tsx +++ b/packages/desktop/src/pages/Login/index.tsx @@ -5,6 +5,7 @@ import Channels from "../../electron/constants"; import { CircularProgress } from "@mui/material"; import { FcGoogle } from "react-icons/fc"; import Logo from "../../components/Logo"; +// import { STORE_ITEMS } from "../../electron/store"; import { nirvanaApi } from "../../controller/nirvanaApi"; import { useCreateUser } from "../../controller/index"; import { useSetRecoilState } from "recoil"; @@ -19,22 +20,46 @@ export default function Login({ onReady }: { onReady: Function }) { window.electronAPI.auth.initiateLogin(); }; - useEffect(() => { - window.electronAPI.auth.receiveTokens( - Channels.AUTH_TOKENS, - (tokens: any) => { - // todo: implement refresh token procedure in api layer by sending refresh_token and such - const { access_token, id_token, refresh_token } = tokens; - setAuthTokens({ - accessToken: access_token, - idToken: id_token, - refreshToken: refresh_token, - }); + const setAccessTokensAndContinue = (tokens: { + accessToken: string; + idToken: string; + refreshToken: string; + }) => { + setAuthTokens(tokens); - // now can go to home and get authenticated regardless of type of user - onReady(); - } - ); + onReady(); + }; + + useEffect(() => { + // see if we have tokens in localstorage in which case we can continue on + // const tokensFromStore: any = window.electronAPI.store.get( + // STORE_ITEMS.AUTH_TOKENS + // ); + + // if (tokensFromStore) { + // setIsLoading(true); + + // const { access_token, id_token, refresh_token } = tokensFromStore; + + // setAccessTokensAndContinue({ + // accessToken: access_token, + // idToken: id_token, + // refreshToken: refresh_token, + // }); + // } + + window.electronAPI.once(Channels.AUTH_TOKENS, (tokens: any) => { + setIsLoading(true); + + // todo: implement refresh token procedure in api layer by sending refresh_token and such + const { access_token, id_token, refresh_token } = tokens; + + setAccessTokensAndContinue({ + accessToken: access_token, + idToken: id_token, + refreshToken: refresh_token, + }); + }); // todo: figure out how to clean up with the preload api // return () => {