Geovation/photos

View on GitHub
src/index.js

Summary

Maintainability
A
0 mins
Test Coverage
import React from "react";
import ReactDOM from "react-dom";
import { HashRouter as Router } from "react-router-dom";
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga'
import rootSaga from 'sagas'

import { MuiThemeProvider, createTheme } from "@material-ui/core/styles";

import "./index.scss";
import App from "./App";
import * as serviceWorkerRegistration from './serviceWorkerRegistration';
import config from "custom/config";
import { gtagInit } from "gtag.js";

import { firebaseInit } from "features/firebase/firebaseInit";
import { dbFirebase } from "features/firebase";
import { GeolocationContextProvider } from "store/GeolocationContext";

if (
  process.env.NODE_ENV !== "development" &&
  localStorage.getItem("debug") !== "true"
) {
  console.log = console.info = console.trace = console.warn = console.error = console.debug = () => {};
}
// it must set to fals (not enough to be absent)
const devDissableDebugLog = localStorage.getItem("debug") === "false";
if (devDissableDebugLog) {
  console.debug = () => {};
}

const theme = createTheme(config.THEME);

const initialState = {
  user: null,
  online: false,
  geojson: null,
  featuresDict: {}
};

function reducer(state = initialState, action) {
  switch (action.type) {
    case "SET_USER":
      return {
        ...state,
        user: action.payload.user
      }
    case "SET_ONLINE":
      return {
        ...state,
        online: Boolean(action.payload.online)
      }
    case "SET_GEOJSON":
      return {
        ...state,
        geojson: action.payload.geojson
      }
    case "SET_FEATURES":
      return {
        ...state,
        featuresDict: action.payload.featuresDict
      }
    // TODO: SET_FEATURES
    default:
      return state;
  } 
}
const sagaMiddleware = createSagaMiddleware()
const store = createStore(reducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(rootSaga)

function render({ newVersionAvailable = false } = {}) {
  ReactDOM.render(
    <React.StrictMode>
      <Provider store={store}>
        <Router>
          <MuiThemeProvider theme={theme}>
            <GeolocationContextProvider>
              <App newVersionAvailable={ newVersionAvailable }/>
            </GeolocationContextProvider>
          </MuiThemeProvider>
        </Router>
      </Provider>
    </React.StrictMode>,
    document.getElementById("root")
  );
}

gtagInit();

firebaseInit(() => {
  dbFirebase.updateUserFCMToken();
});

function onSuccess(registration) {
  console.log("App installed");
}
function onUpdate(registration) {
  const waitingServiceWorker = registration.waiting;

  if (waitingServiceWorker) {
    waitingServiceWorker.postMessage({ type: "SKIP_WAITING" });

    // Need to wait until when the new sw is ready
    waitingServiceWorker.addEventListener("statechange", (event) => {
      if (event.target.state === "activated") {
        render({ newVersionAvailable: true});
        // need it ? keep it here in case you may need it.
        // caches.delete("all").then(function(boolean) {
        //   console.log("XXXXX cached deleted: event.target.state: boolean", boolean)
        // });
      }      
    });
  }
}
serviceWorkerRegistration.register({onSuccess, onUpdate});

render();