diff --git a/client/src/App.js b/client/src/App.js
index b685936..d0043df 100644
--- a/client/src/App.js
+++ b/client/src/App.js
@@ -19,6 +19,9 @@
 import WelcomeAnimation from './components/welcome'
 import defaultTheme from './themes/default'
 
+// import { useSelector, useDispatch } from 'react-redux'
+// import { useAppSelector, useAppDispatch } from '../redux/hooks'
+
 const Home = (props) => {
   console.log(`home ${props}`)
 
@@ -26,48 +29,65 @@
 }
 
 const App = (props) => {
-    const [state, setState] = useState({
-      loaded: false,
-      auth: authManager.getState()
-    })
-    const [displayWelcome, setDisplayWelcome] = useState(true)
+  // const count = useSelector(state => state.counter.value)
+  // const dispatch = useDispatch();
+  // const count = useAppSelector((state) => state.counter.value);
+  // const dispatch = useAppDispatch();
 
-    useEffect(() => {
-      authManager.init(auth => {
-        setState({ loaded: false, auth })
-      })
-      return () => authManager.deinit()
-    }, []);
+  const [state, setState] = useState({
+    loaded: false,
+    auth: authManager.getState(),
+  });
+  const [displayWelcome, setDisplayWelcome] = useState(true);
 
-    console.log("App render")
-    if (displayWelcome) {
-      return <WelcomeAnimation showSetup={!state.auth.setupComplete} onComplete={() => setDisplayWelcome(false)} />
-    } else if (!state.auth.setupComplete) {
-      return <Routes>
-          <Route path="/setup" element={<ServerSetup />} />
-          <Route path="/" element={<Navigate to="/setup" replace />} />
-          <Route index path="*" element={<Navigate to="/setup" replace />} />
-        </Routes>
-    }
+  useEffect(() => {
+    authManager.init((auth) => {
+      setState({ loaded: false, auth });
+    });
+    return () => authManager.deinit();
+  }, []);
 
-    return <ThemeProvider theme={defaultTheme}>
-    <Routes>
-      <Route path="/account">
-        <Route index element={<AccountSelection />} />
-        <Route path=":accountId">
-          <Route index path="*" element={<JamiMessenger />} />
-          <Route path="settings" element={<AccountSettings />} />
+  console.log("App render");
+
+  if (displayWelcome) {
+    return (
+      <WelcomeAnimation
+        showSetup={!state.auth.setupComplete}
+        onComplete={() => setDisplayWelcome(false)}
+      />
+    );
+  } else if (!state.auth.setupComplete) {
+    return (
+      <Routes>
+        <Route path="/setup" element={<ServerSetup />} />
+        <Route path="/" element={<Navigate to="/setup" replace />} />
+        <Route index path="*" element={<Navigate to="/setup" replace />} />
+      </Routes>
+    );
+  }
+
+  return (
+    <ThemeProvider theme={defaultTheme}>
+      <Routes>
+        <Route path="/account">
+          <Route index element={<AccountSelection />} />
+          <Route path=":accountId">
+            <Route index path="*" element={<JamiMessenger />} />
+            <Route path="settings" element={<AccountSettings />} />
+          </Route>
         </Route>
-      </Route>
-      <Route path="/newAccount" element={<AccountCreationDialog />}>
-        <Route path="jami" element={<JamiAccountDialog />} />
-      </Route>
-      <Route path="/setup" element={<ServerSetup />} />
-      <Route path="/" index element={<Home />} />
-      <Route path="*" element={<NotFoundPage />} />
-    </Routes>
-    {!state.auth.authenticated && <SignInPage key="signin" open={!state.auth.authenticated}/>}
+        <Route path="/newAccount" element={<AccountCreationDialog />}>
+          <Route path="jami" element={<JamiAccountDialog />} />
+        </Route>
+        <Route path="/setup" element={<ServerSetup />} />
+        <Route path="/" index element={<Home />} />
+        <Route path="*" element={<NotFoundPage />} />
+      </Routes>
+      {!state.auth.authenticated && (
+        <SignInPage key="signin" open={!state.auth.authenticated} />
+      )}
     </ThemeProvider>
-}
+  );
+};
 
 export default App
diff --git a/client/src/index.js b/client/src/index.js
index e607b8a..27b5591 100644
--- a/client/src/index.js
+++ b/client/src/index.js
@@ -1,28 +1,37 @@
-'use strict'
-import React from 'react'
-import ReactDOM from 'react-dom'
-import { BrowserRouter as Router } from 'react-router-dom'
-import App from './App.js'
-import './index.scss'
+"use strict";
+import React from "react";
+import ReactDOM from "react-dom";
+import { BrowserRouter as Router } from "react-router-dom";
+import App from "./App.js";
+import "./index.scss";
 
-const rootEl = document.getElementById('root')
+import { store } from "../redux/store";
+import { Provider } from "react-redux";
+//import { CssBaseline } from '@mui/material'
 
-const render = Component =>
-ReactDOM.render(
-  <React.StrictMode>
-    <Router>
-    <Component />
-    </Router>
-  </React.StrictMode>,
-  rootEl
-)
+//import * as serviceWorker from './serviceWorker'
+const rootEl = document.getElementById("root");
+var exports = {};
+
+const render = (Component) =>
+  ReactDOM.render(
+    <Provider store={store}>
+      <React.StrictMode>
+        <Router>
+          <Component />
+        </Router>
+      </React.StrictMode>
+    </Provider>,
+    rootEl
+  );
 
 render(App)
 
-if (import.meta.webpackHot) import.meta.webpackHot.accept('./App', () => {
-  try {
-    render(App)
-  } catch (e) {
-    location.reload()
-  }
-})
\ No newline at end of file
+if (import.meta.webpackHot)
+  import.meta.webpackHot.accept("./App", () => {
+    try {
+      render(App);
+    } catch (e) {
+      location.reload();
+    }
+  });
