[
  {
    "path": "react-rtk-demo/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "react-rtk-demo/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/src/favicon.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.jsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "react-rtk-demo/package.json",
    "content": "{\n  \"name\": \"react-rtk-demo\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@reduxjs/toolkit\": \"^1.7.2\",\n    \"axios\": \"^0.26.0\",\n    \"react\": \"^17.0.2\",\n    \"react-dom\": \"^17.0.2\",\n    \"react-redux\": \"^7.2.6\"\n  },\n  \"devDependencies\": {\n    \"@vitejs/plugin-react\": \"^1.0.7\",\n    \"vite\": \"^2.8.0\"\n  }\n}\n"
  },
  {
    "path": "react-rtk-demo/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\nbutton {\n  font-size: calc(10px + 2vmin);\n}\n"
  },
  {
    "path": "react-rtk-demo/src/App.jsx",
    "content": "import './App.css'\nimport { CakeView } from './features/cake/CakeView'\nimport { IcecreamView } from './features/icecream/IcecreamView'\nimport { UserView } from './features/user/UserView'\n\nfunction App() {\n  return (\n    <div className='App'>\n      <CakeView />\n      <IcecreamView />\n      <UserView />\n    </div>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "react-rtk-demo/src/app/store.js",
    "content": "import { configureStore } from '@reduxjs/toolkit'\nimport cakeReducer from '../features/cake/cakeSlice'\nimport icecreamReducer from '../features/icecream/icecreamSlice'\nimport userReducer from '../features/user/userSlice'\n\nconst store = configureStore({\n  reducer: {\n    cake: cakeReducer,\n    icecream: icecreamReducer,\n    user: userReducer\n  }\n})\n\nexport default store\n"
  },
  {
    "path": "react-rtk-demo/src/features/cake/CakeView.jsx",
    "content": "import React from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { ordered, restocked } from './cakeSlice'\n\nexport const CakeView = () => {\n  const numOfCakes = useSelector(state => state.cake.numOfCakes)\n  const dispatch = useDispatch()\n  return (\n    <div>\n      <h2>Number of cakes - {numOfCakes}</h2>\n      <button onClick={() => dispatch(ordered())}>Order Cake</button>\n      <button onClick={() => dispatch(restocked(5))}>Restock Cakes</button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "react-rtk-demo/src/features/cake/cakeSlice.js",
    "content": "import { createSlice } from '@reduxjs/toolkit'\n\nconst initialState = {\n  numOfCakes: 20\n}\n\nconst cakeSlice = createSlice({\n  name: 'cake',\n  initialState,\n  reducers: {\n    ordered: state => {\n      state.numOfCakes--\n    },\n    restocked: (state, action) => {\n      state.numOfCakes += action.payload\n    }\n  }\n})\n\nexport default cakeSlice.reducer\nexport const { ordered, restocked } = cakeSlice.actions\n"
  },
  {
    "path": "react-rtk-demo/src/features/icecream/IcecreamView.jsx",
    "content": "import React from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { ordered, restocked } from './icecreamSlice'\n\nexport const IcecreamView = () => {\n  const [value, setValue] = React.useState(1)\n  const numOfIcecreams = useSelector(state => state.icecream.numOfIcecreams)\n  const dispatch = useDispatch()\n  return (\n    <div>\n      <h2>Number of ice creams - {numOfIcecreams}</h2>\n      <button onClick={() => dispatch(ordered())}>Order Ice cream</button>\n      <input\n        type='number'\n        value={value}\n        onChange={e => setValue(parseInt(e.target.value))}\n      />\n      <button onClick={() => dispatch(restocked(value))}>\n        Restock Ice creams\n      </button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "react-rtk-demo/src/features/icecream/icecreamSlice.js",
    "content": "import { createSlice } from '@reduxjs/toolkit'\nimport { ordered as cakeOrdered } from '../cake/cakeSlice'\n\nconst initialState = {\n  numOfIcecreams: 10\n}\n\nconst icecreamSlice = createSlice({\n  name: 'icecream',\n  initialState,\n  reducers: {\n    ordered: state => {\n      state.numOfIcecreams--\n    },\n    restocked: (state, action) => {\n      state.numOfIcecreams += action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder.addCase(cakeOrdered, state => {\n      state.numOfIcecreams--\n    })\n  }\n})\n\nexport default icecreamSlice.reducer\nexport const { ordered, restocked } = icecreamSlice.actions\n"
  },
  {
    "path": "react-rtk-demo/src/features/user/UserView.jsx",
    "content": "import React, { useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { fetchUsers } from './userSlice'\n\nexport const UserView = () => {\n  const user = useSelector(state => state.user)\n  const dispatch = useDispatch()\n  useEffect(() => {\n    dispatch(fetchUsers())\n  }, [])\n  return (\n    <div>\n      <h2>List of Users</h2>\n      {user.loading && <div>Loading...</div>}\n      {!user.loading && user.error ? <div>Error: {user.error}</div> : null}\n      {!user.loading && user.users.length ? (\n        <ul>\n          {user.users.map(user => (\n            <li key={user.id}>{user.name}</li>\n          ))}\n        </ul>\n      ) : null}\n    </div>\n  )\n}\n"
  },
  {
    "path": "react-rtk-demo/src/features/user/userSlice.js",
    "content": "import axios from 'axios'\nimport { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\n\nconst initialState = {\n  loading: false,\n  users: [],\n  error: ''\n}\n\n// Generates pending, fulfilled and rejected action types\nexport const fetchUsers = createAsyncThunk('user/fetchUsers', () => {\n  return axios\n    .get('https://jsonplaceholder.typicode.com/users')\n    .then(response => response.data)\n})\n\nconst userSlice = createSlice({\n  name: 'user',\n  initialState,\n  extraReducers: builder => {\n    builder.addCase(fetchUsers.pending, state => {\n      state.loading = true\n    })\n    builder.addCase(fetchUsers.fulfilled, (state, action) => {\n      state.loading = false\n      state.users = action.payload\n      state.error = ''\n    })\n    builder.addCase(fetchUsers.rejected, (state, action) => {\n      state.loading = false\n      state.users = []\n      state.error = action.error.message\n    })\n  }\n})\n\nexport default userSlice.reducer\n"
  },
  {
    "path": "react-rtk-demo/src/index.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n    sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n    monospace;\n}\n"
  },
  {
    "path": "react-rtk-demo/src/main.jsx",
    "content": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Provider } from 'react-redux'\nimport store from './app/store'\nimport './index.css'\nimport App from './App'\n\nReactDOM.render(\n  <React.StrictMode>\n    <Provider store={store}>\n      <App />\n    </Provider>\n  </React.StrictMode>,\n  document.getElementById('root')\n)\n"
  },
  {
    "path": "react-rtk-demo/vite.config.js",
    "content": "import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()]\n})\n"
  },
  {
    "path": "react-rtk-ts-demo/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "react-rtk-ts-demo/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/src/favicon.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "react-rtk-ts-demo/package.json",
    "content": "{\n  \"name\": \"react-rtk-ts-demo\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@reduxjs/toolkit\": \"^1.7.2\",\n    \"axios\": \"^0.26.0\",\n    \"react\": \"^17.0.2\",\n    \"react-dom\": \"^17.0.2\",\n    \"react-redux\": \"^7.2.6\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^17.0.33\",\n    \"@types/react-dom\": \"^17.0.10\",\n    \"@vitejs/plugin-react\": \"^1.0.7\",\n    \"typescript\": \"^4.5.4\",\n    \"vite\": \"^2.8.0\"\n  }\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\nbutton {\n  font-size: calc(10px + 2vmin);\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/src/App.tsx",
    "content": "import './App.css'\nimport { CakeView } from './features/cake/CakeView'\nimport { IcecreamView } from './features/icecream/IcecreamView'\nimport { UserView } from './features/user/UserView'\n\nfunction App() {\n  return (\n    <div className='App'>\n      <CakeView />\n      <IcecreamView />\n      <UserView />\n    </div>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "react-rtk-ts-demo/src/app/hooks.ts",
    "content": "import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'\nimport type { RootState, AppDispatch } from './store'\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useAppDispatch = () => useDispatch<AppDispatch>()\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector\n"
  },
  {
    "path": "react-rtk-ts-demo/src/app/store.ts",
    "content": "import { configureStore } from '@reduxjs/toolkit'\nimport cakeReducer from '../features/cake/cakeSlice'\nimport icecreamReducer from '../features/icecream/icecreamSlice'\nimport userReducer from '../features/user/userSlice'\n\nconst store = configureStore({\n  reducer: {\n    cake: cakeReducer,\n    icecream: icecreamReducer,\n    user: userReducer\n  }\n})\n\nexport default store\n// Infer the `RootState` and `AppDispatch` types from the store itself\nexport type RootState = ReturnType<typeof store.getState>\n// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}\nexport type AppDispatch = typeof store.dispatch\n"
  },
  {
    "path": "react-rtk-ts-demo/src/features/cake/CakeView.tsx",
    "content": "import { useAppSelector, useAppDispatch } from '../../app/hooks'\nimport { ordered, restocked } from './cakeSlice'\n\nexport const CakeView = () => {\n  const numOfCakes = useAppSelector(state => state.cake.numOfCakes)\n  const dispatch = useAppDispatch()\n  return (\n    <div>\n      <h2>Number of cakes - {numOfCakes}</h2>\n      <button onClick={() => dispatch(ordered())}>Order Cake</button>\n      <button onClick={() => dispatch(restocked(5))}>Restock Cakes</button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/src/features/cake/cakeSlice.ts",
    "content": "import { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\ntype InitialState = {\n  numOfCakes: number\n}\nconst initialState: InitialState = {\n  numOfCakes: 20\n}\n\nconst cakeSlice = createSlice({\n  name: 'cake',\n  initialState,\n  reducers: {\n    ordered: state => {\n      state.numOfCakes--\n    },\n    restocked: (state, action: PayloadAction<number>) => {\n      state.numOfCakes += action.payload\n    }\n  }\n})\n\nexport default cakeSlice.reducer\nexport const { ordered, restocked } = cakeSlice.actions\n"
  },
  {
    "path": "react-rtk-ts-demo/src/features/icecream/IcecreamView.tsx",
    "content": "import React from 'react'\nimport { useAppSelector, useAppDispatch } from '../../app/hooks'\nimport { ordered, restocked } from './icecreamSlice'\n\nexport const IcecreamView = () => {\n  const [value, setValue] = React.useState(1)\n  const numOfIcecreams = useAppSelector(state => state.icecream.numOfIcecreams)\n  const dispatch = useAppDispatch()\n  return (\n    <div>\n      <h2>Number of ice creams - {numOfIcecreams}</h2>\n      <button onClick={() => dispatch(ordered())}>Order Ice cream</button>\n      <input\n        type='number'\n        value={value}\n        onChange={e => setValue(parseInt(e.target.value))}\n      />\n      <button onClick={() => dispatch(restocked(value))}>\n        Restock Ice creams\n      </button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/src/features/icecream/icecreamSlice.ts",
    "content": "import { createSlice, PayloadAction } from '@reduxjs/toolkit'\nimport { ordered as cakeOrdered } from '../cake/cakeSlice'\n\ntype InitialState = {\n  numOfIcecreams: number\n}\n\nconst initialState: InitialState = {\n  numOfIcecreams: 10\n}\n\nconst icecreamSlice = createSlice({\n  name: 'icecream',\n  initialState,\n  reducers: {\n    ordered: state => {\n      state.numOfIcecreams--\n    },\n    restocked: (state, action: PayloadAction<number>) => {\n      state.numOfIcecreams += action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder.addCase(cakeOrdered, state => {\n      state.numOfIcecreams--\n    })\n  }\n})\n\nexport default icecreamSlice.reducer\nexport const { ordered, restocked } = icecreamSlice.actions\n"
  },
  {
    "path": "react-rtk-ts-demo/src/features/user/UserView.tsx",
    "content": "import { useEffect } from 'react'\nimport { useAppSelector, useAppDispatch } from '../../app/hooks'\nimport { fetchUsers } from './userSlice'\n\nexport const UserView = () => {\n  const user = useAppSelector(state => state.user)\n  const dispatch = useAppDispatch()\n  useEffect(() => {\n    dispatch(fetchUsers())\n  }, [])\n  return (\n    <div>\n      <h2>List of Users</h2>\n      {user.loading && <div>Loading...</div>}\n      {!user.loading && user.error ? <div>Error: {user.error}</div> : null}\n      {!user.loading && user.users.length ? (\n        <ul>\n          {user.users.map(user => (\n            <li key={user.id}>{user.name}</li>\n          ))}\n        </ul>\n      ) : null}\n    </div>\n  )\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/src/features/user/userSlice.ts",
    "content": "import axios from 'axios'\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\n\ntype User = {\n  id: number\n  name: string\n}\ntype InitialState = {\n  loading: boolean\n  users: User[]\n  error: string\n}\nconst initialState: InitialState = {\n  loading: false,\n  users: [],\n  error: ''\n}\n\n// Generates pending, fulfilled and rejected action types\nexport const fetchUsers = createAsyncThunk('user/fetchUsers', () => {\n  return axios\n    .get('https://jsonplaceholder.typicode.com/users')\n    .then(response => response.data)\n})\n\nconst userSlice = createSlice({\n  name: 'user',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder.addCase(fetchUsers.pending, state => {\n      state.loading = true\n    })\n    builder.addCase(\n      fetchUsers.fulfilled,\n      (state, action: PayloadAction<User[]>) => {\n        state.loading = false\n        state.users = action.payload\n        state.error = ''\n      }\n    )\n    builder.addCase(fetchUsers.rejected, (state, action) => {\n      state.loading = false\n      state.users = []\n      state.error = action.error.message || 'Something went wrong'\n    })\n  }\n})\n\nexport default userSlice.reducer\n"
  },
  {
    "path": "react-rtk-ts-demo/src/index.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n    sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n    monospace;\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/src/main.tsx",
    "content": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Provider } from 'react-redux'\nimport store from './app/store'\nimport './index.css'\nimport App from './App'\n\nReactDOM.render(\n  <React.StrictMode>\n    <Provider store={store}>\n      <App />\n    </Provider>\n  </React.StrictMode>,\n  document.getElementById('root')\n)\n"
  },
  {
    "path": "react-rtk-ts-demo/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "react-rtk-ts-demo/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"allowJs\": false,\n    \"skipLibCheck\": false,\n    \"esModuleInterop\": false,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\"\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\"\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "react-rtk-ts-demo/vite.config.ts",
    "content": "import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()]\n})\n"
  },
  {
    "path": "redux-demo/.gitignore",
    "content": "node_modules"
  },
  {
    "path": "redux-demo/asyncActions.js",
    "content": "const redux = require('redux')\nconst thunkMiddleware = require('redux-thunk').default\nconst axios = require('axios')\nconst createStore = redux.createStore\nconst applyMiddleware = redux.applyMiddleware\n\nconst initialState = {\n  loading: false,\n  users: [],\n  error: ''\n}\n\nconst FETCH_USERS_REQUESTED = 'FETCH_USERS_REQUESTED'\nconst FETCH_USERS_SUCCEEDED = 'FETCH_USERS_SUCCEEDED'\nconst FETCH_USERS_FAILED = 'FETCH_USERS_FAILED'\n\nconst fetchUsersRequest = () => {\n  return {\n    type: FETCH_USERS_REQUESTED\n  }\n}\n\nconst fetchUsersSuccess = users => {\n  return {\n    type: FETCH_USERS_SUCCEEDED,\n    payload: users\n  }\n}\n\nconst fetchUsersFailure = error => {\n  return {\n    type: FETCH_USERS_FAILED,\n    payload: error\n  }\n}\n\nconst fetchUsers = () => {\n  return function (dispatch) {\n    dispatch(fetchUsersRequest())\n    axios\n      .get('https://jsonplaceholder.typicode.com/users')\n      .then(response => {\n        // response.data is the users\n        const users = response.data.map(user => user.id)\n        dispatch(fetchUsersSuccess(users))\n      })\n      .catch(error => {\n        // error.message is the error message\n        dispatch(fetchUsersFailure(error.message))\n      })\n  }\n}\n\nconst reducer = (state = initialState, action) => {\n  console.log(action.type)\n  switch (action.type) {\n    case FETCH_USERS_REQUESTED:\n      return {\n        ...state,\n        loading: true\n      }\n    case FETCH_USERS_SUCCEEDED:\n      return {\n        loading: false,\n        users: action.payload,\n        error: ''\n      }\n    case FETCH_USERS_FAILED:\n      return {\n        loading: false,\n        users: [],\n        error: action.payload\n      }\n  }\n}\n\nconst store = createStore(reducer, applyMiddleware(thunkMiddleware))\nstore.subscribe(() => {\n  console.log(store.getState())\n})\nstore.dispatch(fetchUsers())\n"
  },
  {
    "path": "redux-demo/index.js",
    "content": "const redux = require('redux')\n// const reduxLogger = require('redux-logger')\n\nconst createStore = redux.createStore\nconst bindActionCreators = redux.bindActionCreators\nconst combineReducers = redux.combineReducers\n// const applyMiddleware = redux.applyMiddleware\n// const logger = reduxLogger.createLogger()\n\nconst CAKE_ORDERED = 'CAKE_ORDERED'\nconst CAKE_RESTOCKED = 'CAKE_RESTOCKED'\nconst ICECREAM_ORDERED = 'ICECREAM_ORDERED'\nconst ICECREAM_RESTOCKED = 'ICECREAM_RESTOCKED'\n\nfunction orderCake(qty = 1) {\n  return {\n    type: CAKE_ORDERED,\n    payload: qty\n  }\n}\nfunction restockCake(qty = 1) {\n  return {\n    type: CAKE_RESTOCKED,\n    payload: qty\n  }\n}\nfunction orderIceCream(qty = 1) {\n  return {\n    type: ICECREAM_ORDERED,\n    payload: qty\n  }\n}\nfunction restockIceCream(qty = 1) {\n  return {\n    type: ICECREAM_RESTOCKED,\n    payload: qty\n  }\n}\n\n// const initialState = {\n//   numOfCakes: 10,\n//   numOfIceCreams: 20\n// }\n\nconst initialCakeState = {\n  numOfCakes: 10\n}\n\nconst initialIceCreamState = {\n  numOfIceCreams: 20\n}\n\n// const reducer = (state = initialState, action) => {\n//   switch (action.type) {\n//     case CAKE_ORDERED:\n//       return {\n//         ...state,\n//         numOfCakes: state.numOfCakes - 1\n//       }\n//     case CAKE_RESTOCKED:\n//       return {\n//         ...state,\n//         numOfCakes: state.numOfCakes + action.payload\n//       }\n//     case ICECREAM_ORDERED:\n//       return {\n//         ...state,\n//         numOfIceCreams: state.numOfIceCreams - 1\n//       }\n//     case ICECREAM_RESTOCKED:\n//       return {\n//         ...state,\n//         numOfIceCreams: state.numOfIceCreams + action.payload\n//       }\n//     default:\n//       return state\n//   }\n// }\n\nconst cakeReducer = (state = initialCakeState, action) => {\n  switch (action.type) {\n    case CAKE_ORDERED:\n      return {\n        ...state,\n        numOfCakes: state.numOfCakes - 1\n      }\n    case CAKE_RESTOCKED:\n      return {\n        ...state,\n        numOfCakes: state.numOfCakes + action.payload\n      }\n    default:\n      return state\n  }\n}\n\nconst iceCreamReducer = (state = initialIceCreamState, action) => {\n  switch (action.type) {\n    case ICECREAM_ORDERED:\n      return {\n        ...state,\n        numOfIceCreams: state.numOfIceCreams - 1\n      }\n    case ICECREAM_RESTOCKED:\n      return {\n        ...state,\n        numOfIceCreams: state.numOfIceCreams + action.payload\n      }\n    case CAKE_ORDERED:\n      return {\n        ...state,\n        numOfIceCreams: state.numOfIceCreams - 1\n      }\n    default:\n      return state\n  }\n}\n\nconst rootReducer = combineReducers({\n  cake: cakeReducer,\n  iceCream: iceCreamReducer\n})\n\n// const store = createStore(rootReducer, applyMiddleware(logger))\nconst store = createStore(rootReducer)\n\nconsole.log('Initial State ', store.getState())\nconst unsubscribe = store.subscribe(() => {\n  console.log('Updated State ', store.getState())\n})\n\n// store.dispatch(orderCake())\n// store.dispatch(orderCake())\n// store.dispatch(orderCake())\n\nconst actions = bindActionCreators(\n  { orderCake, restockCake, orderIceCream, restockIceCream },\n  store.dispatch\n)\nactions.orderCake()\nactions.orderCake()\nactions.orderCake()\nactions.restockCake(3)\nactions.orderIceCream()\nactions.orderIceCream()\nactions.restockIceCream(2)\nunsubscribe()\n"
  },
  {
    "path": "redux-demo/nested-state.js",
    "content": "const redux = require('redux')\nconst produce = require('immer').produce\n\nconst initialState = {\n  name: 'Vishwas',\n  address: {\n    street: '123 Main St',\n    city: 'Boston',\n    state: 'MA'\n  }\n}\n\nconst STREET_UPDATED = 'STREET_UPDATED'\nconst updateStreet = street => {\n  return {\n    type: STREET_UPDATED,\n    payload: street\n  }\n}\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case STREET_UPDATED:\n      //   return {\n      //     ...state,\n      //     address: {\n      //       ...state.address,\n      //       street: action.payload\n      //     }\n      //   }\n      return produce(state, draft => {\n        draft.address.street = action.payload\n      })\n    default: {\n      return state\n    }\n  }\n}\n\nconst store = redux.createStore(reducer)\nconsole.log('Initial State ', store.getState())\nconst unsubscribe = store.subscribe(() => {\n  console.log('Updated State ', store.getState())\n})\nstore.dispatch(updateStreet('456 Main St'))\nunsubscribe()\n"
  },
  {
    "path": "redux-demo/package.json",
    "content": "{\n  \"name\": \"redux-demo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"axios\": \"^0.26.0\",\n    \"immer\": \"^9.0.12\",\n    \"redux\": \"^4.1.2\",\n    \"redux-logger\": \"^3.0.6\",\n    \"redux-thunk\": \"^2.4.1\"\n  }\n}\n"
  },
  {
    "path": "rtk-demo/.gitignore",
    "content": "node_modules"
  },
  {
    "path": "rtk-demo/app/store.js",
    "content": "const configureStore = require('@reduxjs/toolkit').configureStore\n// const reduxLogger = require('redux-logger')\nconst cakeReducer = require('../features/cake/cakeSlice')\nconst icecreamReducer = require('../features/icecream/icecreamSlice')\nconst userReducer = require('../features/user/userSlice')\n// const logger = reduxLogger.createLogger()\n\nconst store = configureStore({\n  reducer: {\n    cake: cakeReducer,\n    icecream: icecreamReducer,\n    user: userReducer\n  }\n  // middleware: getDefaultMiddleware => getDefaultMiddleware().concat(logger)\n})\n\nmodule.exports = store\n"
  },
  {
    "path": "rtk-demo/features/cake/cakeSlice.js",
    "content": "const createSlice = require('@reduxjs/toolkit').createSlice\n\nconst initialState = {\n  numOfCakes: 20\n}\n\nconst cakeSlice = createSlice({\n  name: 'cake',\n  initialState,\n  reducers: {\n    ordered: state => {\n      state.numOfCakes--\n    },\n    restocked: (state, action) => {\n      state.numOfCakes += action.payload\n    }\n  }\n})\n\nmodule.exports = cakeSlice.reducer\nmodule.exports.cakeActions = cakeSlice.actions\n"
  },
  {
    "path": "rtk-demo/features/icecream/icecreamSlice.js",
    "content": "const { cakeActions } = require('../cake/cakeSlice')\n\nconst createSlice = require('@reduxjs/toolkit').createSlice\n\nconst initialState = {\n  numOfIcecreams: 10\n}\n\nconst icecreamSlice = createSlice({\n  name: 'icecream',\n  initialState,\n  reducers: {\n    ordered: state => {\n      state.numOfIcecreams--\n    },\n    restocked: (state, action) => {\n      state.numOfIcecreams += action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder.addCase(cakeActions.ordered, state => {\n      state.numOfIcecreams--\n    })\n  }\n  // extraReducers: {\n  //   ['cake/ordered']: state => {\n  //     state.numOfIcecreams--\n  //   }\n  // }\n})\n\nmodule.exports = icecreamSlice.reducer\nmodule.exports.icecreamActions = icecreamSlice.actions\n"
  },
  {
    "path": "rtk-demo/features/user/userSlice.js",
    "content": "const axios = require('axios')\nconst createSlice = require('@reduxjs/toolkit').createSlice\nconst createAsyncThunk = require('@reduxjs/toolkit').createAsyncThunk\n\nconst initialState = {\n  loading: false,\n  users: [],\n  error: ''\n}\n\n// Generates pending, fulfilled and rejected action types\nconst fetchUsers = createAsyncThunk('user/fetchUsers', () => {\n  return axios\n    .get('https://jsonplaceholders.typicode.com/users')\n    .then(response => response.data.map(user => user.id))\n})\n\nconst userSlice = createSlice({\n  name: 'user',\n  initialState,\n  extraReducers: builder => {\n    builder.addCase(fetchUsers.pending, state => {\n      state.loading = true\n    })\n    builder.addCase(fetchUsers.fulfilled, (state, action) => {\n      state.loading = false\n      state.users = action.payload\n      state.error = ''\n    })\n    builder.addCase(fetchUsers.rejected, (state, action) => {\n      state.loading = false\n      state.users = []\n      state.error = action.error.message\n    })\n  }\n})\n\nmodule.exports = userSlice.reducer\nmodule.exports.fetchUsers = fetchUsers\n"
  },
  {
    "path": "rtk-demo/index.js",
    "content": "const store = require('./app/store')\nconst cakeActions = require('./features/cake/cakeSlice').cakeActions\nconst icecreamActions =\n  require('./features/icecream/icecreamSlice').icecreamActions\nconst fetchUsers = require('./features/user/userSlice').fetchUsers\n\nconsole.log('Initial State ', store.getState())\nconst unsubscribe = store.subscribe(() => {\n  console.log('Updated State ', store.getState())\n})\nstore.dispatch(cakeActions.ordered())\nstore.dispatch(cakeActions.ordered())\nstore.dispatch(cakeActions.ordered())\nstore.dispatch(cakeActions.restocked(3))\nstore.dispatch(icecreamActions.ordered())\nstore.dispatch(icecreamActions.ordered())\nstore.dispatch(icecreamActions.ordered())\nstore.dispatch(icecreamActions.restocked(3))\nstore.dispatch(fetchUsers())\n// unsubscribe()\n"
  },
  {
    "path": "rtk-demo/package.json",
    "content": "{\n  \"name\": \"rtk-demo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"@reduxjs/toolkit\": \"^1.7.2\",\n    \"axios\": \"^0.26.0\",\n    \"redux-logger\": \"^3.0.6\"\n  }\n}\n"
  }
]