Шаг 1. Добавление констант

В процессе работы над проектом потребуются вспомогательные функции и константы. Для их хранения создайте директорию common в src.

Добавьте файл constants.js в директорию common. Определим в нём следующие константы:

export const STATUSES = [
  {
    label: 'Важно, не срочно',
    value: 'green'
  },
  {
    label: 'Срочно, не важно',
    value: 'orange'
  },
  {
    label: 'Срочно, важно',
    value: 'red'
  },
  {
    label: 'Дедлайн',
    value: 'time'
  },
  {
    label: 'Просрочено',
    value: 'alert'
  }
];

export const SEC = 1000;
export const MINUTE_IN_SEC = 60;
export const HOUR_IN_SEC = MINUTE_IN_SEC * 60;
export const DAY_IN_SEC = HOUR_IN_SEC * 24;
export const MONTH_IN_SEC = DAY_IN_SEC * 30;
export const YEAR_IN_SEC = DAY_IN_SEC * 365;
export const DAY_IN_MILLISEC = DAY_IN_SEC * SEC;

export const TAG_SEPARATOR = '#';

Шаг 2. Добавление перечисляемых типов — enums

В JavaScript нет встроенного типа enum. Тем не менее для повышения читаемости кода мы создадим объекты, преобразующие одни значения в другие.

К примеру, с сервера поступает свойство { status: 1 }. Само по себе число мало о чём говорит. Чтобы упростить понимание, можно определить вспомогательный объект для преобразования таких данных в понятный формат.

const statuses = {
	1: 'Важно'
}

После обработки статуса через этот объект мы получим { status: 'Важно' }.

Создайте директорию enums в src/common и добавьте два файла: taskStatuses.js и timeStatuses.js.

Добавьте следующий код в taskStatuses.js:

export default {
  1: 'green',
  2: 'orange',
  3: 'red'
};

В файл timeStatuses.js добавьте:

export default {
  DEADLINE: 'time',
  EXPIRED: 'alert'
};

Шаг 3. Добавление вспомогательных функций

На этом шаге мы реализуем несколько вспомогательных функций.

Создайте файл helpers.js в директории src/common и добавьте в него импорты:

import {
  DAY_IN_MILLISEC,
  TAG_SEPARATOR
} from './constants';
import timeStatuses from './enums/timeStatuses';
import taskStatuses from './enums/taskStatuses';

Напишем функцию, которая принимает строку с метками и разбивает её на массив по заданному разделителю:

export const getTagsArrayFromString = tags => {
  const array = tags.split(TAG_SEPARATOR);
  return array.slice(1, array.length);
};

Следующая функция принимает срок выполнения задачи (дедлайн), сравнивает его с текущим временем и возвращает временной статус задачи.

export const getTimeStatus = dueDate => {
  if (!dueDate) {
    return '';
  }
  const currentTime = +new Date();
  const taskTime = Date.parse(dueDate);
  const timeDelta = taskTime - currentTime;
  if (timeDelta > DAY_IN_MILLISEC) {
    return '';
  }
  return timeDelta < 0 ? timeStatuses.EXPIRED : timeStatuses.DEADLINE;
};

Также нам понадобится функция нормализации задач, поступающих с сервера. Нормализация — это преобразование структуры данных из одного формата в другой.

Функция нормализации задач:

export const normalizeTask = task => {
  return {
    ...task,
    status: task.statusId ? taskStatuses[task.statusId] : '',
    timeStatus: getTimeStatus(task.dueDate)
  };
};