From d843e0f13026784c1e3c6964130fe30b42c13f9f Mon Sep 17 00:00:00 2001 From: talksik Date: Sat, 28 May 2022 10:15:53 -0500 Subject: [PATCH] nice flow not buggy with listeners doubling up --- packages/desktop/package.json | 1 + packages/desktop/src/electron/global.d.ts | 8 +- packages/desktop/src/electron/preload.ts | 8 +- packages/desktop/src/electron/store.ts | 5 + packages/desktop/src/index.ts | 11 +++ .../desktop/src/providers/AuthProvider.tsx | 79 ++++++++++----- yarn.lock | 98 ++++++++++++++++++- 7 files changed, 175 insertions(+), 35 deletions(-) create mode 100644 packages/desktop/src/electron/store.ts diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 3252fe7..7ad017b 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -98,6 +98,7 @@ "@mui/icons-material": "^5.8.0", "@mui/material": "^5.8.1", "electron-squirrel-startup": "^1.0.0", + "electron-store": "^8.0.1", "firebase": "^9.8.2", "notistack": "^2.0.5", "react": "^18.1.0", diff --git a/packages/desktop/src/electron/global.d.ts b/packages/desktop/src/electron/global.d.ts index bdd23e5..7335bb0 100644 --- a/packages/desktop/src/electron/global.d.ts +++ b/packages/desktop/src/electron/global.d.ts @@ -1,5 +1,5 @@ -import { Dimensions, DimensionChangeRequest } from "./constants"; -import { electronAPI } from "./preload"; +import { Dimensions, DimensionChangeRequest } from './constants'; +import { electronAPI } from './preload'; export {}; declare global { @@ -15,8 +15,8 @@ declare global { window: { resizeWindow(dimensionChangeRequest: DimensionChangeRequest): void; }; - on(channel: Channels, func: any): void; - once(channel: Channels, func: any): void; + on(channel: Channels, func: any): () => void; + once(channel: Channels, func: any): () => void; }; } } diff --git a/packages/desktop/src/electron/preload.ts b/packages/desktop/src/electron/preload.ts index c4a8cbd..aeb466a 100644 --- a/packages/desktop/src/electron/preload.ts +++ b/packages/desktop/src/electron/preload.ts @@ -24,13 +24,14 @@ const electronAPI = { }, on(channel: Channels, func: any) { - const validChannels = ['ipc-example']; + // 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)); + return () => ipcRenderer.removeAllListeners(channel); }, once(channel: Channels, func: any) { // const validChannels = ["ipc-example"]; @@ -40,6 +41,11 @@ const electronAPI = { // } ipcRenderer.once(channel, (event, ...args) => func(...args)); + + return () => ipcRenderer.removeAllListeners(channel); + }, + removeListener(channel: Channels) { + ipcRenderer.removeAllListeners(channel); }, }; diff --git a/packages/desktop/src/electron/store.ts b/packages/desktop/src/electron/store.ts new file mode 100644 index 0000000..f72a754 --- /dev/null +++ b/packages/desktop/src/electron/store.ts @@ -0,0 +1,5 @@ +import Store from 'electron-store'; + +const store = new Store(); + +export default store; diff --git a/packages/desktop/src/index.ts b/packages/desktop/src/index.ts index 540e84a..a77ef27 100644 --- a/packages/desktop/src/index.ts +++ b/packages/desktop/src/index.ts @@ -2,6 +2,8 @@ import { app, BrowserWindow, ipcMain, Display, screen } from 'electron'; import Channels, { DEFAULT_APP_PRESET, DimensionChangeRequest } from './electron/constants'; import { handleGoogleLogin } from './electron/handleLogin'; +import store from './electron/store'; + // This allows TypeScript to pick up the magic constant that's auto-generated by Forge's Webpack // plugin that tells the Electron app where to look for the Webpack-bundled app code (depending on // whether you're running in development or production). @@ -48,6 +50,15 @@ app .whenReady() .then(createWindow) .then(() => { + // access storage/cookies + 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; + }); + // activate login ipcMain.on(Channels.ACTIVATE_LOG_IN, async (event, arg) => { console.log('initiating log in'); diff --git a/packages/desktop/src/providers/AuthProvider.tsx b/packages/desktop/src/providers/AuthProvider.tsx index 379ce9f..1b96100 100644 --- a/packages/desktop/src/providers/AuthProvider.tsx +++ b/packages/desktop/src/providers/AuthProvider.tsx @@ -6,7 +6,12 @@ import { FcGoogle } from 'react-icons/fc'; import { blueGrey } from '@mui/material/colors'; import Channels from '../electron/constants'; import { firebaseAuth } from '../firebase/connect'; -import { GoogleAuthProvider, signInWithCredential } from 'firebase/auth'; +import { + GoogleAuthProvider, + signInWithCredential, + setPersistence, + browserLocalPersistence, +} from 'firebase/auth'; import { useSnackbar } from 'notistack'; const provider = new GoogleAuthProvider(); @@ -23,37 +28,57 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const { enqueueSnackbar } = useSnackbar(); useEffect(() => { - window.electronAPI.once(Channels.GOOGLE_AUTH_TOKENS, async (tokens: Credentials) => { - console.log('got tokens', tokens); + const tokenListener = window.electronAPI.once( + Channels.GOOGLE_AUTH_TOKENS, + async (tokens: Credentials) => { + console.log('got tokens', tokens); - const credential = GoogleAuthProvider.credential(tokens.id_token); + const credential = GoogleAuthProvider.credential(tokens.id_token); - // Sign in with credential from the Google user. - signInWithCredential(firebaseAuth, credential) - .then((result) => { - // This gives you a Google Access Token. You can use it to access Google APIs. - const credential = GoogleAuthProvider.credentialFromResult(result); - const token = credential.accessToken; + setPersistence(firebaseAuth, browserLocalPersistence) + .then(() => { + // Sign in with credential from the Google user. + return signInWithCredential(firebaseAuth, credential) + .then((result) => { + // This gives you a Google Access Token. You can use it to access Google APIs. + const credential = GoogleAuthProvider.credentialFromResult(result); + const token = credential.accessToken; - // The signed-in user info. - const user = result.user; - console.log(user); + // The signed-in user info. + const user = result.user; + console.log(user); - enqueueSnackbar('Signed in! All set!', { variant: 'success' }); - }) - .catch((error) => { - // Handle Errors here. - const errorCode = error.code; - const errorMessage = error.message; - // The email of the user's account used. - const email = error.email; - // The credential that was used. - const credential = GoogleAuthProvider.credentialFromError(error); - // ... + enqueueSnackbar('Signed in! All set!', { variant: 'success' }); + }) + .catch((error) => { + // Handle Errors here. + const errorCode = error.code; + const errorMessage = error.message; + // The email of the user's account used. + const email = error.email; + // The credential that was used. + const credential = GoogleAuthProvider.credentialFromError(error); + // ... - enqueueSnackbar('Something went wrong', { variant: 'error' }); - }); - }); + enqueueSnackbar('Something went wrong', { variant: 'error' }); + }); + }) + .catch((error: any) => { + // Handle Errors here. + const errorCode = error.code; + const errorMessage = error.message; + // The email of the user's account used. + const email = error.email; + // The credential that was used. + const credential = GoogleAuthProvider.credentialFromError(error); + // ... + + enqueueSnackbar('Something went wrong', { variant: 'error' }); + }); + }, + ); + + return () => tokenListener(); }, []); return ; diff --git a/yarn.lock b/yarn.lock index 682b8a7..6f9cef9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1712,7 +1712,7 @@ ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: +ajv@^8.0.0, ajv@^8.6.3, ajv@^8.8.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -1897,6 +1897,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atomically@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" + integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== + author-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" @@ -2444,6 +2449,22 @@ concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +conf@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/conf/-/conf-10.1.2.tgz#50132158f388756fa9dea3048f6b47935315c14e" + integrity sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg== + dependencies: + ajv "^8.6.3" + ajv-formats "^2.1.1" + atomically "^1.7.0" + debounce-fn "^4.0.0" + dot-prop "^6.0.1" + env-paths "^2.2.1" + json-schema-typed "^7.0.3" + onetime "^5.1.2" + pkg-up "^3.1.0" + semver "^7.3.5" + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -2636,6 +2657,13 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +debounce-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" + integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ== + dependencies: + mimic-fn "^3.0.0" + debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2859,6 +2887,13 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -3000,6 +3035,14 @@ electron-squirrel-startup@^1.0.0: dependencies: debug "^2.2.0" +electron-store@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.1.tgz#9b598c1d2edeffebee9d8c1cd957ad368c528925" + integrity sha512-ZyLvNywiqSpbwC/pp89O/AycVWY/UJIkmtyzF2Bd0Nm/rLmcFc0NTGuLdg6+LE8mS8qsiK5JMoe4PnrecLHH5w== + dependencies: + conf "^10.0.3" + type-fest "^1.0.2" + electron-to-chromium@^1.4.118: version "1.4.141" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz#4dd9119e8a99f1c83c51dfcf1bed79ea541f08d6" @@ -3072,7 +3115,7 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -3627,6 +3670,13 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -4623,6 +4673,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -4798,6 +4853,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema-typed@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" + integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -4975,6 +5035,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -5211,6 +5279,11 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -5733,7 +5806,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -5754,6 +5827,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -5944,6 +6024,13 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + plist@^3.0.0, plist@^3.0.1, plist@^3.0.4: version "3.0.5" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" @@ -7378,6 +7465,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"