made tasks persistent in localstorage
This commit is contained in:
parent
0616cde993
commit
48589d80f9
37
src/App.tsx
37
src/App.tsx
@ -1,25 +1,32 @@
|
|||||||
import React from "react";
|
import React, { useEffect } from "react";
|
||||||
import { Provider } from "react-redux";
|
|
||||||
|
|
||||||
import { Layout } from "./components/Layout";
|
import { Layout } from "./components/Layout";
|
||||||
import { TodoList } from "./components/TodoList";
|
import { TodoList } from "./components/TodoList";
|
||||||
import { AppBar } from "./components/AppBar";
|
import { AppBar } from "./components/AppBar";
|
||||||
import { AddTask } from "./components/AddTask";
|
import { AddTask } from "./components/AddTask";
|
||||||
import store from "./store";
|
|
||||||
|
import { loadStorage } from "./localStorage";
|
||||||
|
import { useAppDispatch } from "./hooks";
|
||||||
|
import { hydrate } from "./store/slices/todo";
|
||||||
|
|
||||||
export const App = () => {
|
export const App = () => {
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const initialStorage = loadStorage();
|
||||||
|
if (initialStorage) dispatch(hydrate(initialStorage));
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Provider store={store}>
|
<Layout
|
||||||
<Layout
|
appBar={<AppBar />}
|
||||||
appBar={<AppBar />}
|
title="My tasks"
|
||||||
title="My tasks"
|
content={
|
||||||
content={
|
<>
|
||||||
<>
|
<TodoList />
|
||||||
<TodoList />
|
<AddTask />
|
||||||
<AddTask />
|
</>
|
||||||
</>
|
}
|
||||||
}
|
/>
|
||||||
/>
|
|
||||||
</Provider>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { ChangeEventHandler, useState } from "react";
|
import { useState } from "react";
|
||||||
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
|
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
|
||||||
|
|
||||||
import { AppDispatch, RootState } from "./store";
|
import { AppDispatch, RootState } from "./store";
|
||||||
|
@ -1,11 +1,18 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import ReactDOM from "react-dom";
|
import ReactDOM from "react-dom";
|
||||||
|
import { Provider } from "react-redux";
|
||||||
|
|
||||||
import { App } from "./App";
|
import { App } from "./App";
|
||||||
|
import { saveStorage } from "./localStorage";
|
||||||
|
import store from "./store";
|
||||||
|
|
||||||
|
store.subscribe(() => saveStorage(store.getState().todo.tasks));
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<App />
|
<Provider store={store}>
|
||||||
|
<App />
|
||||||
|
</Provider>
|
||||||
</React.StrictMode>,
|
</React.StrictMode>,
|
||||||
document.getElementById("root")
|
document.getElementById("root")
|
||||||
);
|
);
|
||||||
|
15
src/localStorage.ts
Normal file
15
src/localStorage.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { TaskItemT } from "./types";
|
||||||
|
|
||||||
|
const LOCAL_STORAGE_KEY = "reduxStorage";
|
||||||
|
|
||||||
|
export const loadStorage = (): TaskItemT[] | undefined => {
|
||||||
|
try {
|
||||||
|
const persistedState = localStorage.getItem(LOCAL_STORAGE_KEY);
|
||||||
|
if (persistedState) return JSON.parse(persistedState);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const saveStorage = (storage: TaskItemT[]) =>
|
||||||
|
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(storage));
|
@ -3,18 +3,18 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
|
|||||||
import { TaskItemT } from "../../types";
|
import { TaskItemT } from "../../types";
|
||||||
|
|
||||||
const initialState: { tasks: TaskItemT[] } = {
|
const initialState: { tasks: TaskItemT[] } = {
|
||||||
tasks: [
|
tasks: [],
|
||||||
{ done: true, id: 1, text: "hello" },
|
|
||||||
{ done: false, id: 2, text: "goodbye" },
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const todoSlice = createSlice({
|
export const todoSlice = createSlice({
|
||||||
name: "todo",
|
name: "todo",
|
||||||
initialState: initialState,
|
initialState: initialState,
|
||||||
reducers: {
|
reducers: {
|
||||||
|
hydrate: (state, { payload }) => {
|
||||||
|
state.tasks = payload;
|
||||||
|
},
|
||||||
add: (state, { payload }: PayloadAction<string>) => {
|
add: (state, { payload }: PayloadAction<string>) => {
|
||||||
const newId = state.tasks[state.tasks.length - 1]?.id ?? 0;
|
const newId = (state.tasks[state.tasks.length - 1]?.id ?? -1) + 1;
|
||||||
|
|
||||||
state.tasks.push({
|
state.tasks.push({
|
||||||
done: false,
|
done: false,
|
||||||
@ -40,6 +40,6 @@ export const todoSlice = createSlice({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export const { add, updateText, markDone, remove } = todoSlice.actions;
|
export const { hydrate, add, updateText, markDone, remove } = todoSlice.actions;
|
||||||
|
|
||||||
export default todoSlice.reducer;
|
export default todoSlice.reducer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user