Decouple client from server

Add Vite dependency and remove server side rendering to make it
possible to run the client independently.
Remove webpack config, replace with the `Vite` build tool.

GitLab: #55
Change-Id: I3a05d2e86cf6cb0ab91e77b3696f393132137575
diff --git a/client/src/redux/appSlice.ts b/client/src/redux/appSlice.ts
new file mode 100644
index 0000000..d5c01ee
--- /dev/null
+++ b/client/src/redux/appSlice.ts
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import { createSlice, PayloadAction } from '@reduxjs/toolkit';
+import { Account } from 'jami-web-common';
+
+// Define a type for the slice state
+export interface appState {
+  accountId: string;
+  accountObject: Account | null;
+  refresh: boolean;
+}
+
+// Define the initial state using that type
+const initialState: appState = {
+  accountId: '',
+  accountObject: null,
+  refresh: true,
+};
+
+export const appSlice = createSlice({
+  name: 'app',
+  // `createSlice` will infer the state type from the `initialState` argument
+  initialState,
+  reducers: {
+    setAccountId: (state, action: PayloadAction<string>) => {
+      state.accountId = action.payload;
+    },
+    setAccountObject: (state, action: PayloadAction<Account>) => {
+      state.accountObject = action.payload;
+    },
+    setRefreshFromSlice: (state) => {
+      state.refresh = !state.refresh;
+    },
+  },
+});
+
+export const { setAccountId, setAccountObject, setRefreshFromSlice } = appSlice.actions;
+
+// Other code such as selectors can use the imported `RootState` type
+// export const selectCount = (state: RootState) => state.app.value;
+
+export default appSlice.reducer;
diff --git a/client/src/redux/hooks.ts b/client/src/redux/hooks.ts
new file mode 100644
index 0000000..146b3b1
--- /dev/null
+++ b/client/src/redux/hooks.ts
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';
+
+import type { AppDispatch, RootState } from './store';
+
+// Use throughout your app instead of plain `useDispatch` and `useSelector`
+export const useAppDispatch: () => AppDispatch = useDispatch;
+export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;
diff --git a/client/src/redux/store.ts b/client/src/redux/store.ts
new file mode 100644
index 0000000..be2b4a5
--- /dev/null
+++ b/client/src/redux/store.ts
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import { configureStore } from '@reduxjs/toolkit';
+
+import appReducer from './appSlice';
+
+export const store = configureStore({
+  reducer: {
+    app: appReducer,
+  },
+});
+
+// Infer the `RootState` and `AppDispatch` types from the store itself
+export type RootState = ReturnType<typeof store.getState>;
+// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
+export type AppDispatch = typeof store.dispatch;