bruno/renderer/providers/Store/index.js

204 lines
5.6 KiB
JavaScript
Raw Normal View History

import React, { useState, useEffect, useContext, useReducer, createContext } from 'react';
import map from 'lodash/map';
import filter from 'lodash/filter';
2021-12-03 20:37:38 +01:00
import reducer from './reducer';
2022-02-03 18:55:38 +01:00
import useIdb from './useIdb';
import { sendRequest } from '../../network';
2021-12-03 20:37:38 +01:00
import { nanoid } from 'nanoid';
2022-03-13 13:13:21 +01:00
import actions from './actions';
import {getCollectionsFromIdb, saveCollectionToIdb} from './idb';
2021-12-03 20:37:38 +01:00
export const StoreContext = createContext();
const collection = {
"id": nanoid(),
"name": "spacex",
2021-12-03 20:37:38 +01:00
"items": [
{
"id": nanoid(),
"name": "Launches",
"depth": 1,
"items": [
{
"id": nanoid(),
"depth": 2,
"name": "Capsules",
"request": {
2022-01-21 08:55:39 +01:00
"type": "graphql",
2021-12-03 20:37:38 +01:00
"url": "https://api.spacex.land/graphql/",
"method": "POST",
"headers": [],
"body": {
"mimeType": "application/graphql",
"graphql": {
"query": "{\n launchesPast(limit: 10) {\n mission_name\n launch_date_local\n launch_site {\n site_name_long\n }\n links {\n article_link\n video_link\n }\n rocket {\n rocket_name\n first_stage {\n cores {\n flight\n core {\n reuse_count\n status\n }\n }\n }\n second_stage {\n payloads {\n payload_type\n payload_mass_kg\n payload_mass_lbs\n }\n }\n }\n ships {\n name\n home_port\n image\n }\n }\n}",
"variables": ""
}
}
},
"response": null
2021-12-03 20:37:38 +01:00
},
{
"id": nanoid(),
"depth": 2,
"name": "Missions",
"request": {
2022-01-21 08:55:39 +01:00
"type": "graphql",
2021-12-03 20:37:38 +01:00
"url": "https://api.spacex.land/graphql/",
"method": "POST",
"headers": [],
"body": {
"mimeType": "application/graphql",
"graphql": {
"query": "{\n launches {\n launch_site {\n site_id\n site_name\n }\n launch_success\n }\n}",
2021-12-03 20:37:38 +01:00
"variables": ""
}
}
},
"response": null
2021-12-03 20:37:38 +01:00
}
]
}
]
};
const collection2 = {
"id": nanoid(),
"name": "notebase",
"items": [
{
"id": nanoid(),
"name": "Notes",
"depth": 1,
"items": [
{
"id": nanoid(),
"depth": 2,
"name": "Create",
"request": {
2022-01-21 08:55:39 +01:00
"type": "graphql",
"url": "https://api.spacex.land/graphql/",
"method": "POST",
"headers": [],
"body": {
"mimeType": "application/graphql",
"graphql": {
"query": "{\n launchesPast(limit: 10) {\n mission_name\n launch_date_local\n launch_site {\n site_name_long\n }\n links {\n article_link\n video_link\n }\n rocket {\n rocket_name\n first_stage {\n cores {\n flight\n core {\n reuse_count\n status\n }\n }\n }\n second_stage {\n payloads {\n payload_type\n payload_mass_kg\n payload_mass_lbs\n }\n }\n }\n ships {\n name\n home_port\n image\n }\n }\n}",
"variables": ""
}
}
},
"response": null
},
{
"id": nanoid(),
"depth": 2,
"name": "Update",
"request": {
2022-01-21 08:55:39 +01:00
"type": "graphql",
"url": "https://api.spacex.land/graphql/",
"method": "POST",
"headers": [],
"body": {
"mimeType": "application/graphql",
"graphql": {
"query": "{\n launches {\n launch_site {\n site_id\n site_name\n }\n launch_success\n }\n}",
"variables": ""
}
}
},
"response": null
}
]
}
]
};
2021-12-03 20:37:38 +01:00
const initialState = {
2022-02-03 18:55:38 +01:00
idbConnection: null,
2022-03-13 13:13:21 +01:00
collections: [],
activeRequestTabId: null,
requestQueuedToSend: null,
requestTabs: [],
collectionsToSyncToIdb: []
2021-12-03 20:37:38 +01:00
};
export const StoreProvider = props => {
const [state, dispatch] = useReducer(reducer, initialState);
const [collectionsSyncingToIdb, setCollectionsSyncingToIdb] = useState(false);
2022-03-13 13:13:21 +01:00
const {
collections,
idbConnection,
collectionsToSyncToIdb
2022-03-13 13:13:21 +01:00
} = state;
useEffect(() => {
if(state.requestQueuedToSend) {
const {
request,
collectionId
} = state.requestQueuedToSend;
sendRequest(request, collectionId, dispatch)
}
}, [state.requestQueuedToSend]);
2021-12-03 20:37:38 +01:00
2022-03-13 13:13:21 +01:00
useEffect(() => {
if(idbConnection) {
getCollectionsFromIdb(idbConnection)
.then((collections) => {
dispatch({
type: actions.LOAD_COLLECTIONS_FROM_IDB,
collections: collections
});
})
.catch((err) => console.log(err));
}
}, [idbConnection]);
useEffect(() => {
if(collectionsSyncingToIdb) {
return;
}
if(collectionsToSyncToIdb && collectionsToSyncToIdb.length) {
setCollectionsSyncingToIdb(true);
const _collections = filter(collections, (c) => {
return collectionsToSyncToIdb.indexOf(c.uid) > -1;
});
dispatch({
type: actions.IDB_COLLECTIONS_SYNC_STARTED
});
saveCollectionToIdb(idbConnection, _collections)
.then(() => {
setCollectionsSyncingToIdb(false);
})
.catch((err) => {
setCollectionsSyncingToIdb(false);
dispatch({
type: actions.IDB_COLLECTIONS_SYNC_ERROR,
collectionUids: map(collections, (c) => c.uid)
});
console.log(err);
});
}
}, [collectionsToSyncToIdb]);
2022-02-03 18:55:38 +01:00
useIdb(dispatch);
2021-12-03 20:37:38 +01:00
return <StoreContext.Provider value={[state, dispatch]} {...props} />;
};
export const useStore = () => {
const context = useContext(StoreContext);
if (context === undefined) {
throw new Error(`useStore must be used within a StoreProvider`);
}
return context;
};
export default StoreProvider;