From 63ba4b34c47be6b43c839f201f8898a971a166ab Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Fri, 18 Mar 2022 02:48:41 +0530 Subject: [PATCH] refactor: redux migration - load collections from idb --- .../components/Sidebar/Collections/index.js | 7 +--- renderer/jsconfig.json | 3 +- renderer/providers/App/useIdb.js | 2 + renderer/providers/ReduxStore/index.js | 4 +- .../ReduxStore/slices/collections.js | 26 ++++++++++++ renderer/utils/idb/index.js | 41 +++++++++++++++++++ 6 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 renderer/providers/ReduxStore/slices/collections.js create mode 100644 renderer/utils/idb/index.js diff --git a/renderer/components/Sidebar/Collections/index.js b/renderer/components/Sidebar/Collections/index.js index 810e6bbca..951a0e809 100644 --- a/renderer/components/Sidebar/Collections/index.js +++ b/renderer/components/Sidebar/Collections/index.js @@ -1,12 +1,9 @@ import React from 'react'; -import { useStore } from 'providers/Store'; +import { useSelector } from 'react-redux'; import Collection from './Collection'; const Collections = () => { - const [store, storeDispatch] = useStore(); - const { - collections - } = store; + const collections = useSelector((state) => state.collections.collections); return (
diff --git a/renderer/jsconfig.json b/renderer/jsconfig.json index 320b6ad6f..6dfec6062 100644 --- a/renderer/jsconfig.json +++ b/renderer/jsconfig.json @@ -7,7 +7,8 @@ "components/*": ["src/components/*"], "api/*": ["src/api/*"], "pageComponents/*": ["src/pageComponents/*"], - "providers/*": ["src/providers/*"] + "providers/*": ["src/providers/*"], + "utils/*": ["src/utils/*"] } }, "exclude": ["node_modules", "dist"] diff --git a/renderer/providers/App/useIdb.js b/renderer/providers/App/useIdb.js index 9a1cc81e7..3166614dc 100644 --- a/renderer/providers/App/useIdb.js +++ b/renderer/providers/App/useIdb.js @@ -1,6 +1,7 @@ import { useEffect } from 'react'; import { openDB } from 'idb'; import { idbConnectionReady } from 'providers/ReduxStore/slices/app' +import { loadCollectionsFromIdb } from 'providers/ReduxStore/slices/collections' import { useDispatch } from 'react-redux'; const useIdb = () => { @@ -22,6 +23,7 @@ const useIdb = () => { .then(() => { window.__idb = connection; dispatch(idbConnectionReady()); + dispatch(loadCollectionsFromIdb()); }) .catch((err) => console.log(err)); }, []); diff --git a/renderer/providers/ReduxStore/index.js b/renderer/providers/ReduxStore/index.js index ef6ad5372..4c4ffe90f 100644 --- a/renderer/providers/ReduxStore/index.js +++ b/renderer/providers/ReduxStore/index.js @@ -1,9 +1,11 @@ import { configureStore } from '@reduxjs/toolkit'; import appReducer from './slices/app'; +import collectionsReducer from './slices/collections'; export const store = configureStore({ reducer: { - app:appReducer + app: appReducer, + collections: collectionsReducer } }); diff --git a/renderer/providers/ReduxStore/slices/collections.js b/renderer/providers/ReduxStore/slices/collections.js new file mode 100644 index 000000000..fddba7ed7 --- /dev/null +++ b/renderer/providers/ReduxStore/slices/collections.js @@ -0,0 +1,26 @@ +import { createSlice } from '@reduxjs/toolkit' +import { getCollectionsFromIdb } from 'utils/idb'; + +const initialState = { + collections: [] +}; + +export const collectionsSlice = createSlice({ + name: 'app', + initialState, + reducers: { + loadCollections: (state, action) => { + state.collections = action.payload; + } + } +}); + +export const { loadCollections } = collectionsSlice.actions; + +export const loadCollectionsFromIdb = () => (dispatch) => { + getCollectionsFromIdb(window.__idb) + .then((collections) => dispatch(loadCollections(collections))) + .catch((err) => console.log(err)); +}; + +export default collectionsSlice.reducer; diff --git a/renderer/utils/idb/index.js b/renderer/utils/idb/index.js new file mode 100644 index 000000000..be0766aeb --- /dev/null +++ b/renderer/utils/idb/index.js @@ -0,0 +1,41 @@ +import isArray from 'lodash/isArray'; + +export const saveCollectionToIdb = (connection, collection) => { + return new Promise((resolve, reject) => { + connection + .then((db) => { + let tx = db.transaction(`collection`, 'readwrite'); + let collectionStore = tx.objectStore('collection'); + + if(isArray(collection)) { + for(let c of collection) { + collectionStore.put(c); + } + } else { + collectionStore.put(collection); + } + + resolve(); + }) + .catch((err) => reject(err)); + }); +}; + +export const getCollectionsFromIdb = (connection) => { + return new Promise((resolve, reject) => { + connection + .then((db) => { + let tx = db.transaction('collection'); + let collectionStore = tx.objectStore('collection'); + return collectionStore.getAll(); + }) + .then((collections) => { + if(!Array.isArray(collections)) { + return new Error('IDB Corrupted'); + } + + return resolve(collections); + }) + .catch((err) => reject(err)); + }); +}; \ No newline at end of file