Помогите доделать task tracker
Помогите с решениес таймера для каждого таска, нужно при добавлении нового таска чтоб начинался таймер, можна его стопить и запускать, и ето все нужно сохранять в localStorage что б таймер при перезагрузке страниц не обнулялся, я уже много методов вставлял, но все не получаеться, помогите пожалуста...
Вот мой код:
const form = document.querySelector('#form');
const input = document.querySelector('#input');
const board = document.querySelector('#board');
// create task list
let taskList = [];
if (!localStorage.taskList) {
taskList = [];
} else {
taskList = JSON.parse(localStorage.getItem('taskList'));
}
// create task
class Task {
constructor(description) {
this.description = description;
this.status = false;
this.date = new Date().toLocaleString();
this.timer = '00:00:00';
}
}
// add task event
form.addEventListener('submit', (e) => {
e.preventDefault();
taskList.push(new Task(input.value));
input.value = '';
addTaskToHtml();
updateLocalStorage();
});
// functions:
// update local stptage
function updateLocalStorage() {
localStorage.setItem('taskList', JSON.stringify(taskList));
}
// create task template
function createTask(item, idx) {
return `
<div class="${item.status === false ? 'task__item paused' : 'task__item'}">
<div class="task__item--name">${
item.description ? item.description : item.date
}</div>
<div class="task__item--tracking">
<span id="timer" class="task__item--tracking--timer">${
item.timer
}</span>
<span id="startStop" class="task__item--tracking--start-stop" onclick="changeStatus(this, ${idx})"></span>
<span id="deleteTask" class="task__item--tracking--delele" onclick="deleteTask(${idx})"><i class="far fa-trash-alt"></i></span>
</div>
</div>
`;
}
// add task to html
function addTaskToHtml() {
board.innerHTML = '';
if (taskList.length > 0) {
taskList.forEach((item, idx) => {
board.innerHTML += createTask(item, idx);
});
}
}
addTaskToHtml();
// delete Task
function deleteTask(idx) {
taskList.splice(idx, 1);
updateLocalStorage();
addTaskToHtml();
}
// complete
function changeStatus(elem, idx) {
taskList[idx].status = !taskList[idx].status;
const element = elem.parentNode.parentNode;
if (taskList[idx].status) {
element.classList.remove('paused');
} else {
element.classList.add('paused');
}
updateLocalStorage();
addTaskToHtml();
// startStop();
}
// VARIABLES
$text: #000;
$bg: #f4f4f6;
$text-light: #b0a3a7;
$red: #be0909;
// MAIN STYLES
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html {
overflow-x: hidden;
}
body {
height: 100vh;
margin: 0;
font-family: 'Roboto', sans-serif;
font-size: 16px;
font-weight: 500;
color: $text;
background-color: $bg;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
a {
text-decoration: none;
font-weight: 500;
}
/* CONTAINER */
.container {
width: 100%;
max-width: 1170px;
margin: 0 auto;
padding: 0 15px;
display: flex;
justify-content: center;
}
// APP
.app {
text-align: center;
width: 560px;
display: flex;
flex-direction: column;
justify-content: center;
margin-top: 150px;
&__title {
color: $text-light;
font-size: 46px;
font-weight: 300;
& span {
color: $text;
font-weight: 700;
}
}
&__add {
margin-top: 50px;
width: 100%;
}
&__tasks {
margin-top: 25px;
text-align: left;
}
}
.form {
display: flex;
flex-direction: column;
align-items: center;
&__input {
width: 100%;
padding: 15px 25px;
outline: none;
border: 0;
border: 1px solid $text-light;
border-radius: 25px;
background-color: $bg;
font-size: 16px;
color: $text;
}
&__btn {
margin-top: 25px;
height: 40px;
width: 40px;
line-height: 40px;
font-size: 30px;
color: lighten($text, 30);
border: 1px solid $text-light;
background-color: $bg;
cursor: pointer;
}
}
.task__item {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 25px;
margin-top: 5px;
background: darken($color: $bg, $amount: 5);
border-radius: 15px;
color: #2e8b57;
&--tracking {
display: flex;
align-items: center;
& span {
margin-left: 20px;
cursor: pointer;
font-size: 20px;
&:nth-child(1) {
margin-left: 0;
font-size: 16px;
cursor: auto;
}
&:nth-child(2) {
border: 0;
background: transparent;
box-sizing: border-box;
width: 0;
height: 20px;
border-color: transparent transparent transparent $text;
transition: 100ms all ease;
cursor: pointer;
// play state
border-style: solid;
border-width: 10px 0 10px 15px;
}
&:nth-child(3) {
color: $red;
font-size: 19px;
}
}
}
}
.task__item.paused {
.task__item--tracking--start-stop {
height: 15px;
border-style: double;
border-width: 0px 0px 0px 15px;
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Task Tracker</title>
<!-- GOOGLE ICONS -->
<link
rel="stylesheet"
href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css"
integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p"
crossorigin="anonymous"
/>
<!-- GOOGLE FONTS -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;500;700&display=swap"
rel="stylesheet"
/>
<!-- CSS -->
<link rel="stylesheet" href="assets/css/style.css" />
</head>
<body>
<div class="container">
<div class="app">
<div class="app__title"><span>Tasks</span> Lists</div>
<div class="app__add">
<form id="form" class="form" action="/">
<input id="input" class="form__input" type="text" />
<button id="addBtn" class="form__btn">+</button>
</form>
</div>
<div id="board" class="app__tasks"></div>
</div>
</div>
<!-- JavaScript -->
<script src="./assets/js/app.js"></script>
</body>
</html>