- { index + 1 }. { item.title }
-
);
diff --git a/src/components/ToDoList/ToDoList.js b/src/components/ToDoList/ToDoList.js
index 40fabd7..b813107 100644
--- a/src/components/ToDoList/ToDoList.js
+++ b/src/components/ToDoList/ToDoList.js
@@ -5,16 +5,10 @@ import React, { useMemo } from 'react';
import Draggable from 'react-draggable';
import ToDoItem from './ToDoItem/ToDoItem';
-const ToDoList = ({ todo, setToDo, selectedDay }) => {
+const ToDoList = ({ todo, selectedDay, deleteTask, completedTask, updateTaskPosition, changeTaskTitle }) => {
const selectDayStr = useMemo(() => selectedDay.format('DDMMYYYY'), [selectedDay]);
- function updateTaskPosition(data, index) {
- const todoCopy = JSON.parse(JSON.stringify(todo));
- todoCopy[selectDayStr][index].defaultPos = { x: data.x, y: data.y };
- setToDo(todoCopy);
- }
-
return (
{ todo[selectDayStr]?.length ? (
@@ -25,11 +19,13 @@ const ToDoList = ({ todo, setToDo, selectedDay }) => {
position={ null }
defaultPosition={ item.defaultPos }
onStop={ (e, data) => {
- updateTaskPosition(data, index);
+ updateTaskPosition(data, index, selectDayStr);
} }
>
-
From c0afe6eb66e9d5018fb4b32dd87f66080a28ca42 Mon Sep 17 00:00:00 2001
From: andrsvsrg <62656978+andrsvsrg@users.noreply.github.com>
Date: Fri, 19 Aug 2022 00:26:56 +0300
Subject: [PATCH 05/12] 18.08 with react.memo
---
package-lock.json | 41 ++++
package.json | 1 +
src/App.js | 191 ++++++++++--------
src/components/AddToDo/AddToDo.js | 160 +++++++--------
src/components/AddToDo/addToDo.css | 2 +
src/components/Calendar/Calendar.js | 125 ++++++------
.../CalendarNavigation/CalendarNavigation.js | 88 ++++----
.../Calendar/CalendarTable/CalendarTable.js | 62 +++---
src/components/Header/Header.js | 70 +++++--
src/components/Header/header.css | 9 +-
.../ToDoList/ToDoItem/EditTask/EditTask.js | 10 +-
.../ToDoList/ToDoItem/ShowTask/ShowTask.js | 8 +-
src/components/ToDoList/ToDoItem/ToDoItem.js | 9 +-
src/components/ToDoList/ToDoList.js | 14 +-
src/components/UI/button/MyButton.js | 8 +-
src/components/UI/input/MyInput.js | 8 +-
src/components/UI/select/MySelect.js | 15 +-
src/icon/deleteAllTasks.svg | 1 +
src/icon/deleteDayTasks.svg | 1 +
19 files changed, 473 insertions(+), 350 deletions(-)
create mode 100644 src/icon/deleteAllTasks.svg
create mode 100644 src/icon/deleteDayTasks.svg
diff --git a/package-lock.json b/package-lock.json
index fcfe25e..57e56da 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
"react-dom": "^18.2.0",
"react-draggable": "^4.4.5",
"react-scripts": "5.0.1",
+ "react-tooltip": "^4.2.21",
"uuid": "^8.3.2",
"web-vitals": "^2.1.4"
},
@@ -14051,6 +14052,30 @@
}
}
},
+ "node_modules/react-tooltip": {
+ "version": "4.2.21",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz",
+ "integrity": "sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig==",
+ "dependencies": {
+ "prop-types": "^15.7.2",
+ "uuid": "^7.0.3"
+ },
+ "engines": {
+ "npm": ">=6.13"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
+ }
+ },
+ "node_modules/react-tooltip/node_modules/uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -26630,6 +26655,22 @@
"workbox-webpack-plugin": "^6.4.1"
}
},
+ "react-tooltip": {
+ "version": "4.2.21",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz",
+ "integrity": "sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig==",
+ "requires": {
+ "prop-types": "^15.7.2",
+ "uuid": "^7.0.3"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="
+ }
+ }
+ },
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
diff --git a/package.json b/package.json
index 63bea57..110ee89 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"react-dom": "^18.2.0",
"react-draggable": "^4.4.5",
"react-scripts": "5.0.1",
+ "react-tooltip": "^4.2.21",
"uuid": "^8.3.2",
"web-vitals": "^2.1.4"
},
diff --git a/src/App.js b/src/App.js
index 5542fc7..61d65ea 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,85 +1,106 @@
-import './App.css';
-
-import moment from 'moment';
-import React, { useEffect, useState } from 'react';
-
-import Calendar from './components/Calendar/Calendar';
-import AddToDo from './components/AddToDo/AddToDo';
-import Header from './components/Header/Header';
-import ToDoList from './components/ToDoList/ToDoList';
-
-function App() {
-
- const [todo, setToDo] = useState(() => JSON.parse(localStorage.getItem('items')) || {});
- const [selectedDay, setSelectedDay] = useState(() => moment());
-
- useEffect(() => {
- localStorage.setItem('items', JSON.stringify(todo));
- }, [todo]);
-
- function addSelectedDayTask(newTask, selectedDayTasksId) {
- if (!todo[selectedDayTasksId]) {
- todo[selectedDayTasksId] = [];
- }
- const copySelectDayTasks = [...todo[selectedDayTasksId]];
- copySelectDayTasks.push(newTask);
- setToDo({ ...todo, [selectedDayTasksId]: copySelectDayTasks });
- }
-
- function deleteTaskFromSelectedDay(task, selectedDayTasksId) {
- const copySelectDayToDo = todo[selectedDayTasksId].filter((element) => {
- return element.id !== task.id;
- });
- setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
- }
-
- function completedTask(task, selectedDayTasksId) {
- const copySelectDayToDo = todo[selectedDayTasksId].map((element) => {
- if (element.id === task.id) {
- element.isCompleted = !element.isCompleted;
- return element;
- }
- return element;
- });
- setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
- }
-
- function updateTaskPosition(data, index, selectedDayTasksId) {
- const copySelectDayToDo = todo[selectedDayTasksId].map((element, i) => {
- if (index === i) {
- element.defaultPos = { x: data.x, y: data.y };
- return element;
- }
- return element;
- });
- setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
- }
-
- function changeTaskTitle(task, newTitle, selectedDayTasksId) {
- const copySelectDayToDo = todo[selectedDayTasksId].map((element) => {
- if (element.id === task.id) {
- element.title = newTitle;
- return element;
- }
- return element;
- });
- setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
- }
-
- return (
-
- );
-}
-
-export default App;
+import "./App.css";
+
+import moment from "moment";
+import React, { useEffect, useState, useMemo } from "react";
+
+import Calendar from "./components/Calendar/Calendar";
+import AddToDo from "./components/AddToDo/AddToDo";
+import Header from "./components/Header/Header";
+import ToDoList from "./components/ToDoList/ToDoList";
+
+function App() {
+ const [todo, setToDo] = useState(
+ () => JSON.parse(localStorage.getItem("items")) || {}
+ );
+ const [selectedDay, setSelectedDay] = useState(() => moment());
+ const selectedDayTasksId = useMemo(
+ () => selectedDay.format("DDMMYYYY"),
+ [selectedDay]
+ );
+
+ useEffect(() => {
+ localStorage.setItem("items", JSON.stringify(todo));
+ }, [todo]);
+
+ function addSelectedDayTask(newTask) {
+ if (!todo[selectedDayTasksId]) {
+ todo[selectedDayTasksId] = [];
+ }
+ const copySelectDayTasks = [...todo[selectedDayTasksId]];
+ copySelectDayTasks.push(newTask);
+ setToDo({ ...todo, [selectedDayTasksId]: copySelectDayTasks });
+ }
+
+ function deleteTaskFromSelectedDay(task) {
+ const copySelectDayToDo = todo[selectedDayTasksId].filter((element) => {
+ return element.id !== task.id;
+ });
+ setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
+ }
+
+ function completedTask(task) {
+ const copySelectDayToDo = todo[selectedDayTasksId].map((element) => {
+ if (element.id === task.id) {
+ element.isCompleted = !element.isCompleted;
+ return element;
+ }
+ return element;
+ });
+ setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
+ }
+
+ function updateTaskPosition(data, index) {
+ const copySelectDayToDo = todo[selectedDayTasksId].map((element, i) => {
+ if (index === i) {
+ element.defaultPos = { x: data.x, y: data.y };
+ return element;
+ }
+ return element;
+ });
+ setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
+ }
+
+ function changeTaskTitle(task, newTitle) {
+ const copySelectDayToDo = todo[selectedDayTasksId].map((element) => {
+ if (element.id === task.id) {
+ element.title = newTitle;
+ return element;
+ }
+ return element;
+ });
+ setToDo({ ...todo, [selectedDayTasksId]: copySelectDayToDo });
+ }
+
+ function deleteSelectedDayAllTasks() {
+ setToDo({ ...todo, [selectedDayTasksId]: [] });
+ }
+
+ function deleteAllTasks() {
+ setToDo({});
+ }
+
+ return (
+
+ );
+}
+
+export default App;
diff --git a/src/components/AddToDo/AddToDo.js b/src/components/AddToDo/AddToDo.js
index a9b434c..72d3627 100644
--- a/src/components/AddToDo/AddToDo.js
+++ b/src/components/AddToDo/AddToDo.js
@@ -1,80 +1,80 @@
-import './addToDo.css';
-
-import { randomColor } from 'randomcolor';
-import React, { useMemo, useState } from 'react';
-
-import { v4 as uuid } from 'uuid';
-import MyButton from '../UI/button/MyButton';
-import MyInput from '../UI/input/MyInput';
-
-const AddToDo = ({addTask, selectedDay}) => {
-
- const [inputValue, setInputValue] = useState('');
- const selectedDayTasksId = useMemo(() => selectedDay.format('DDMMYYYY'), [selectedDay]);
- const selectedDayTitle = useMemo(() => selectedDay.format('DD.MM.YYYY'), [selectedDay]);
-
-
- function onKeyPressAddTask(e) {
- const code = e.charCode;
- const ENTER_CODE = 13;
- if (code === ENTER_CODE) {
- addTask(createNewTask(inputValue));
- }
- }
-
- function checkAndAddTask() {
- if (!inputValue.trim()) {
- setInputValue('');
- return;
- }
- const newTask = createNewTask(inputValue)
- addTask(newTask, selectedDayTasksId)
- setInputValue('');
- }
-
- return (
-
-
- setInputValue(e.target.value) }
- placeholder="What to do?"
- type="text"
- onKeyPress={ onKeyPressAddTask }
- />
-
- Add a task
-
-
-
- { selectedDayTitle }
-
-
- );
-};
-
-export default AddToDo;
-
-function getRandomDefaultTaskPosition() {
- const width = document.documentElement.clientWidth;
- const height = document.documentElement.clientHeight;
- const WIDTH_HEADER = 300; // 300px - fix width header
- const WIDTH_CALENDAR = 580; // 580px - fix width footer
- const defaultWidth =
- Math.floor(Math.random() * (width < WIDTH_HEADER ? width : width - WIDTH_HEADER));
- const defaultHeight =
- Math.floor(Math.random() * (height < WIDTH_CALENDAR ? height : height - WIDTH_CALENDAR));
-
- return { x: defaultWidth, y: defaultHeight };
-}
-
-function createNewTask(titleOfNewTask) {
- return {
- id : uuid(),
- title : titleOfNewTask.trim(),
- isCompleted: false,
- defaultPos : getRandomDefaultTaskPosition(),
- color : randomColor({ luminosity: 'light' })
- }
-}
\ No newline at end of file
+import "./addToDo.css";
+
+import { randomColor } from "randomcolor";
+import React, { useMemo, useState } from "react";
+
+import { v4 as uuid } from "uuid";
+import MyButton from "../UI/button/MyButton";
+import MyInput from "../UI/input/MyInput";
+
+const AddToDo = React.memo(function AddToDo({ addTask, selectedDay }) {
+ const [inputValue, setInputValue] = useState("");
+ const selectedDayTitle = useMemo(
+ () => selectedDay.format("DD.MM.YYYY"),
+ [selectedDay]
+ );
+
+ function onKeyPressAddTask(e) {
+ const code = e.charCode;
+ const ENTER_CODE = 13;
+ if (code === ENTER_CODE) {
+ checkAndAddTask();
+ }
+ }
+
+ function checkAndAddTask() {
+ if (!inputValue.trim()) {
+ setInputValue("");
+ return;
+ }
+ const newTask = createNewTask(inputValue);
+ addTask(newTask);
+ setInputValue("");
+ }
+
+ return (
+
+
+ setInputValue(e.target.value)}
+ placeholder="What to do?"
+ type="text"
+ onKeyPress={onKeyPressAddTask}
+ />
+
+ Add a task
+
+
+
{selectedDayTitle}
+
+ );
+});
+
+export default AddToDo;
+
+function getRandomDefaultTaskPosition() {
+ const width = document.documentElement.clientWidth;
+ const height = document.documentElement.clientHeight;
+ const WIDTH_HEADER = 300; // 300px - fix width header
+ const WIDTH_CALENDAR = 580; // 580px - fix width footer
+ const defaultWidth = Math.floor(
+ Math.random() * (width < WIDTH_HEADER ? width : width - WIDTH_HEADER)
+ );
+ const defaultHeight = Math.floor(
+ Math.random() * (height < WIDTH_CALENDAR ? height : height - WIDTH_CALENDAR)
+ );
+
+ return { x: defaultWidth, y: defaultHeight };
+}
+
+function createNewTask(titleOfNewTask) {
+ return {
+ id: uuid(),
+ title: titleOfNewTask.trim(),
+ isCompleted: false,
+ defaultPos: getRandomDefaultTaskPosition(),
+ color: randomColor({ luminosity: "light" }),
+ };
+}
diff --git a/src/components/AddToDo/addToDo.css b/src/components/AddToDo/addToDo.css
index dd0bc05..cda4187 100644
--- a/src/components/AddToDo/addToDo.css
+++ b/src/components/AddToDo/addToDo.css
@@ -23,6 +23,8 @@
}
.add-todo-selected-date {
+ margin-top: 10px;
+ margin-bottom: 10px;
text-align: center;
font-size: 20px;
}
diff --git a/src/components/Calendar/Calendar.js b/src/components/Calendar/Calendar.js
index 6580687..d793d0c 100644
--- a/src/components/Calendar/Calendar.js
+++ b/src/components/Calendar/Calendar.js
@@ -1,61 +1,64 @@
-import './calendar.css';
-
-import moment from 'moment';
-import React, { useState, useEffect } from 'react';
-
-import CalendarNavigation from './CalendarNavigation/CalendarNavigation';
-import CalendarTable from './CalendarTable/CalendarTable';
-
-const Calendar = ({ todo, setSelectedDay, selectedDay }) => {
-
- useEffect(() => {
- moment.updateLocale('en', { week: { dow: 1 } });
- }, []);
-
- const [selectMonthValue, setSelectMonthValue] = useState(moment().month());
- const [selectYearValue, setSelectYearValue] = useState(moment().year());
-
- const [currentWindowCalendar, setCurrentWindowCalendar] = useState(
- () => createValuesCurrWindow(moment().year(), moment().month())
- );
-
- function createValuesCurrWindow(year, month, day = 1) {
- const selectedDay = moment().set({ year: year, month: month, date: day });
- const startDay = selectedDay.clone().startOf('month').startOf('week');
- const currDay = startDay.subtract(1, 'day').clone();
- const resultArrAllDays = [...Array(42)].map(() =>
- currDay.add(1, 'day').clone()
- );
-
- return resultArrAllDays;
- }
-
- useEffect(() => {
- setCurrentWindowCalendar(
- createValuesCurrWindow(selectYearValue, selectMonthValue)
- );
- }, [selectMonthValue, selectYearValue]);
-
- return (
-
-
-
-
- );
-};
-
-export default Calendar;
+import "./calendar.css";
+
+import moment from "moment";
+import React, { useState, useEffect } from "react";
+
+import CalendarNavigation from "./CalendarNavigation/CalendarNavigation";
+import CalendarTable from "./CalendarTable/CalendarTable";
+
+const Calendar = React.memo(function Calendar({
+ todo,
+ setSelectedDay,
+ selectedDay,
+}) {
+ useEffect(() => {
+ moment.updateLocale("en", { week: { dow: 1 } });
+ }, []);
+
+ const [selectMonthValue, setSelectMonthValue] = useState(moment().month());
+ const [selectYearValue, setSelectYearValue] = useState(moment().year());
+
+ const [currentWindowCalendar, setCurrentWindowCalendar] = useState(() =>
+ createValuesCurrWindow(moment().year(), moment().month())
+ );
+
+ function createValuesCurrWindow(year, month, day = 1) {
+ const selectedDay = moment().set({ year: year, month: month, date: day });
+ const startDay = selectedDay.clone().startOf("month").startOf("week");
+ const currDay = startDay.subtract(1, "day").clone();
+ const resultArrAllDays = [...Array(42)].map(() =>
+ currDay.add(1, "day").clone()
+ );
+
+ return resultArrAllDays;
+ }
+
+ useEffect(() => {
+ setCurrentWindowCalendar(
+ createValuesCurrWindow(selectYearValue, selectMonthValue)
+ );
+ }, [selectMonthValue, selectYearValue]);
+
+ return (
+
+
+
+
+ );
+});
+
+export default Calendar;
diff --git a/src/components/Calendar/CalendarNavigation/CalendarNavigation.js b/src/components/Calendar/CalendarNavigation/CalendarNavigation.js
index b21458c..8d4409d 100644
--- a/src/components/Calendar/CalendarNavigation/CalendarNavigation.js
+++ b/src/components/Calendar/CalendarNavigation/CalendarNavigation.js
@@ -1,17 +1,20 @@
-import './calendarNavigation.css';
-
-import React from 'react';
-import moment from 'moment';
-
-import MyButton from '../../UI/button/MyButton';
-import MySelect from '../../UI/select/MySelect';
-
-const CalendarNavigation = ({
- setSelectMonthValue, setSelectYearValue, setSelectedDay,
- setCurrentWindowCalendar, createValuesCurrWindow, selectMonthValue,
- selectYearValue
- }) => {
-
+import "./calendarNavigation.css";
+
+import React from "react";
+import moment from "moment";
+
+import MyButton from "../../UI/button/MyButton";
+import MySelect from "../../UI/select/MySelect";
+
+const CalendarNavigation = React.memo(function CalendarNavigation({
+ setSelectMonthValue,
+ setSelectYearValue,
+ setSelectedDay,
+ setCurrentWindowCalendar,
+ createValuesCurrWindow,
+ selectMonthValue,
+ selectYearValue,
+}) {
function onMonthSelectChange(e) {
setSelectMonthValue(Number(e.target.value));
}
@@ -49,40 +52,39 @@ const CalendarNavigation = ({
return (
-
- { '<' }
+
+ {"<"}
-
+
Today
-
- { '>' }
+
+ {">"}
);
-};
+});
export default CalendarNavigation;
-
const defaultValuesForSelect = {
- years : {
+ years: {
2016: 2016,
2017: 2017,
2018: 2018,
@@ -93,20 +95,20 @@ const defaultValuesForSelect = {
2023: 2023,
2024: 2024,
2025: 2025,
- 2026: 2026
+ 2026: 2026,
},
monthsNames: {
- 0 : 'January',
- 1 : 'February',
- 2 : 'March',
- 3 : 'April',
- 4 : 'May',
- 5 : 'June',
- 6 : 'July',
- 7 : 'August',
- 8 : 'September',
- 9 : 'October',
- 10: 'November',
- 11: 'December'
- }
-};
\ No newline at end of file
+ 0: "January",
+ 1: "February",
+ 2: "March",
+ 3: "April",
+ 4: "May",
+ 5: "June",
+ 6: "July",
+ 7: "August",
+ 8: "September",
+ 9: "October",
+ 10: "November",
+ 11: "December",
+ },
+};
diff --git a/src/components/Calendar/CalendarTable/CalendarTable.js b/src/components/Calendar/CalendarTable/CalendarTable.js
index 25d1974..7857dee 100644
--- a/src/components/Calendar/CalendarTable/CalendarTable.js
+++ b/src/components/Calendar/CalendarTable/CalendarTable.js
@@ -1,73 +1,79 @@
-import './calendarTable.css';
+import "./calendarTable.css";
-import React from 'react';
-import moment from 'moment';
-
-const CalendarTable = ({ currentWindowCalendar, selectedDay, selectMonthValue, setSelectedDay, todo }) => {
+import React from "react";
+import moment from "moment";
+const CalendarTable = React.memo(function CalendarTable({
+ currentWindowCalendar,
+ selectedDay,
+ selectMonthValue,
+ setSelectedDay,
+ todo,
+}) {
function addClassForAllDays(item) {
let classes;
if (item.day() === 6 || item.day() === 0) {
- classes = 'weekend';
+ classes = "weekend";
} else {
- classes = '';
+ classes = "";
}
- if (item.isSame(selectedDay, 'day')) {
- classes = 'selectedDay';
+ if (item.isSame(selectedDay, "day")) {
+ classes = "selectedDay";
}
return classes;
}
function addClassForCurrentMonth(dateItem) {
- let classesDate = dateItem.isSame(moment(), 'day') ? 'today' : '';
+ let classesDate = dateItem.isSame(moment(), "day") ? "today" : "";
if (!(dateItem.month() === selectMonthValue)) {
- classesDate += ' notThisMonthColor';
+ classesDate += " notThisMonthColor";
}
return classesDate;
}
-
return (
<>
- { weekDayNames.map((dayOfWeek, index) => {
+ {weekDayNames.map((dayOfWeek, index) => {
return (
-
- { dayOfWeek }
+
+ {dayOfWeek}
);
- }) }
+ })}
- { currentWindowCalendar.map((dateItem) => {
+ {currentWindowCalendar.map((dateItem) => {
return (
{
+ onClick={() => {
setSelectedDay(dateItem);
- } }
- className={ 'dataItem ' + addClassForAllDays(dateItem) }
- key={ dateItem.format('DDMMYYYY') }
+ }}
+ className={"dataItem " + addClassForAllDays(dateItem)}
+ key={dateItem.format("DDMMYYYY")}
>
-
{ dateItem.format('D') }
+
+ {dateItem.format("D")}
+
);
- }) }
+ })}
>
);
-};
+});
export default CalendarTable;
-
-const weekDayNames = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
-
+const weekDayNames = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js
index 22c3b9a..5467789 100644
--- a/src/components/Header/Header.js
+++ b/src/components/Header/Header.js
@@ -1,15 +1,55 @@
-import './header.css';
-
-import React from 'react';
-
-const Header = () => {
- return (
-
-
- To Do List
-
-
- );
-};
-
-export default Header;
+import "./header.css";
+
+import React from "react";
+import ReactTooltip from "react-tooltip";
+
+import MyButton from "../UI/button/MyButton";
+import deleteDayTasksSVG from "../../icon/deleteDayTasks.svg";
+import deleteAllTasksSVG from "../../icon/deleteAllTasks.svg";
+
+const Header = React.memo(function Header({
+ deleteSelectedDayAllTasks,
+ deleteAllTasks,
+}) {
+ return (
+
+
+
+
+
+
+ Delete tasks from this day
+
+
To Do List
+
+
+
+
+ Delete ALL tasks
+
+
+
+ );
+});
+
+export default Header;
diff --git a/src/components/Header/header.css b/src/components/Header/header.css
index 0c0dda8..f856924 100644
--- a/src/components/Header/header.css
+++ b/src/components/Header/header.css
@@ -1,6 +1,13 @@
+.header-container {
+display: flex;
+}
+.header-buttons {
+ border:none;
+ margin: 5px;
+}
.header-title {
text-align: center;
font-size: 24px;
- margin-top: 0;
padding-top: 20px;
+ margin: 0 auto 10px;
}
\ No newline at end of file
diff --git a/src/components/ToDoList/ToDoItem/EditTask/EditTask.js b/src/components/ToDoList/ToDoItem/EditTask/EditTask.js
index df39f4a..ea24154 100644
--- a/src/components/ToDoList/ToDoItem/EditTask/EditTask.js
+++ b/src/components/ToDoList/ToDoItem/EditTask/EditTask.js
@@ -3,11 +3,11 @@ import MyInput from '../../../UI/input/MyInput';
import MyButton from '../../../UI/button/MyButton';
import save from '../../../../icon/save.svg';
-const EditTask = ({value, item, index, selectDayStr, setEditingId, onInputChange, changeTaskTitle }) => {
+const EditTask = React.memo(function EditTask({value, item, index, setEditingId, onInputChange, changeTaskTitle }) {
- function saveToDo(item, value, selectDayStr) {
- changeTaskTitle(item, value, selectDayStr)
+ function saveToDo(item, value) {
+ changeTaskTitle(item, value)
setEditingId(null);
}
@@ -27,7 +27,7 @@ const EditTask = ({value, item, index, selectDayStr, setEditingId, onInputChange
saveToDo(item, value, selectDayStr) }
+ onClick={ () => saveToDo(item, value) }
>
);
-};
+})
export default EditTask;
\ No newline at end of file
diff --git a/src/components/ToDoList/ToDoItem/ShowTask/ShowTask.js b/src/components/ToDoList/ToDoItem/ShowTask/ShowTask.js
index 82b17e6..fd7f9f5 100644
--- a/src/components/ToDoList/ToDoItem/ShowTask/ShowTask.js
+++ b/src/components/ToDoList/ToDoItem/ShowTask/ShowTask.js
@@ -5,7 +5,7 @@ import iconCross from '../../../../icon/cross.svg';
import iconEdit from '../../../../icon/edit.svg';
import { ReactComponent as Done } from '../../../../icon/done.svg';
-const ShowTask = ({ item, index, selectDayStr, editToDo, deleteTask, completedTask }) => {
+const ShowTask = React.memo(function ShowTask({ item, index, editToDo, deleteTask, completedTask }) {
return (
);
-};
+})
export default ShowTask;
\ No newline at end of file
diff --git a/src/components/ToDoList/ToDoItem/ToDoItem.js b/src/components/ToDoList/ToDoItem/ToDoItem.js
index 9e51b28..082deb5 100644
--- a/src/components/ToDoList/ToDoItem/ToDoItem.js
+++ b/src/components/ToDoList/ToDoItem/ToDoItem.js
@@ -4,7 +4,7 @@ import React, { useState } from 'react';
import EditTask from './EditTask/EditTask';
import ShowTask from './ShowTask/ShowTask';
-const ToDoItem = ({ item, index, selectDayStr, deleteTask, completedTask, changeTaskTitle }) => {
+const ToDoItem = React.memo(function ToDoItem({ item, index, deleteTask, completedTask, changeTaskTitle }) {
const [editingId, setEditingId] = useState(null);
const [titleChangeInput, setTitleChangeInput] = useState('');
@@ -26,17 +26,16 @@ const ToDoItem = ({ item, index, selectDayStr, deleteTask, completedTask, change
onInputChange={ handlerTitleChange }
setEditingId={ setEditingId }
item={ item }
- index={ index } selectDayStr={ selectDayStr } />
+ index={ index } />
) : (