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 () => {