Skip to content

Commit

Permalink
Merge pull request #21 from jfhdgkjfh/module8-task3
Browse files Browse the repository at this point in the history
  • Loading branch information
keksobot authored Jun 10, 2024
2 parents 680c461 + 3d57dd1 commit 214efbd
Show file tree
Hide file tree
Showing 46 changed files with 1,566 additions and 1,183 deletions.
23 changes: 0 additions & 23 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
"dayjs": "1.11.7",
"flatpickr": "^4.6.13",
"he": "^1.2.0",
"nanoid": "^5.0.7",
"style-loader": "^3.3.4"
}
}
124 changes: 110 additions & 14 deletions src/const.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,125 @@
const COLORS = ['black', 'yellow', 'blue', 'green', 'pink'];
import dayjs from 'dayjs';
import { futurePoint, presentPoint, pastPoint, sortByDay, sortByPrice, sortByTime } from './utils/point-utils';

const DEFAULT_TYPE = 'taxi';
const CITIES_LENGTH_BORDER = 3;
const AUTHORIZATION = 'Basic hS2sfS44wcl321211';
const END_POINT = 'https://21.objects.htmlacademy.pro/big-trip';

const DISABLED_SORTS = [
'event',
'offers'
];

const EMPTY_POINT = {
type: DEFAULT_TYPE,
basePrice: 0,
dateFrom: dayjs().toDate(),
dateTo: dayjs().toDate(),
destination: null,
isFavorite: false,
offers: []
};

const EVENTS = [
'Bus',
'Drive',
'Flight',
'Ship',
'Taxi',
'Train',
'Check-in',
'Restaurant',
'Sightseeing'
];

const FilterType = {
ALL: 'all',
OVERDUE: 'overdue',
TODAY: 'today',
FAVORITES: 'favorites',
REPEATING: 'repeating',
ARCHIVE: 'archive',
EVERYTHING: 'everything',
FUTURE: 'future',
PRESENT: 'present',
PAST: 'past',
};

const filters = {
[FilterType.EVERYTHING]: (points) => points,
[FilterType.FUTURE]: (points) => points.filter((point) => futurePoint(point)),
[FilterType.PRESENT]: (points) => points.filter((point) => presentPoint(point)),
[FilterType.PAST]: (points) => points.filter((point) => pastPoint(point)),
};

const Mode = {
DEFAULT: 'DEFAULT',
EDITING: 'EDITING',
};

const SortType = {
DEFAULT: 'default',
DATE_DOWN: 'date-down',
DATE_UP: 'date-up',
DAY: 'day',
EVENT: 'event',
TIME: 'time',
PRICE: 'price',
OFFERS: 'offers'
};

const UserAction = {
UPDATE_TASK: 'UPDATE_TASK',
ADD_TASK: 'ADD_TASK',
DELETE_TASK: 'DELETE_TASK',
UPDATE_POINT: 'UPDATE_POINT',
ADD_POINT: 'ADD_POINT',
DELETE_POINT: 'DELETE_POINT',
};

const UpdateType = {
PATCH: 'PATCH',
MINOR: 'MINOR',
MAJOR: 'MAJOR',
INIT: 'INIT'
};

const ButtonText = {
CANCEL: 'Cancel',
DELETE: 'Delete',
DELETING: 'Deleting',
SAVE: 'Save',
SAVING: 'Saving',
};

const Method = {
GET: 'GET',
PUT: 'PUT',
DELETE: 'DELETE',
POST: 'POST',
};

const NoPointsTextType = {
NOPOINTS: 'Click New Event to create your first point',
LOADING: 'Loading...',
};

const TimeLimit = {
LOWER_LIMIT: 350,
UPPER_LIMIT: 1000
};

const Sort = {
[SortType.DAY]: (points) => [...points].sort(sortByDay),
[SortType.TIME]: (points) => [...points].sort(sortByTime),
[SortType.PRICE]: (points) => [...points].sort(sortByPrice),
};

export {
EVENTS,
TimeLimit,
FilterType,
filters,
Mode,
SortType,
Sort,
EMPTY_POINT,
UserAction,
NoPointsTextType,
UpdateType,
ButtonText,
DISABLED_SORTS,
Method,
CITIES_LENGTH_BORDER,
AUTHORIZATION,
END_POINT
};
export {COLORS, FilterType, SortType, UserAction, UpdateType};
31 changes: 2 additions & 29 deletions src/framework/api-service.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,11 @@
/**
* Класс для отправки запросов к серверу
*/

export default class ApiService {
/**
* @param {string} endPoint Адрес сервера
* @param {string} authorization Авторизационный токен
*/

constructor(endPoint, authorization) {
this._endPoint = endPoint;
this._authorization = authorization;
}

/**
* Метод для отправки запроса к серверу
* @param {Object} config Объект с настройками
* @param {string} config.url Адрес относительно сервера
* @param {string} [config.method] Метод запроса
* @param {string} [config.body] Тело запроса
* @param {Headers} [config.headers] Заголовки запроса
* @returns {Promise<Response>}
*/
async _load({
url,
method = 'GET',
Expand All @@ -41,29 +27,16 @@ export default class ApiService {
}
}

/**
* Метод для обработки ответа
* @param {Response} response Объект ответа
* @returns {Promise<JSON>}
*/
static parseResponse(response) {
return response.json();
}

/**
* Метод для проверки ответа
* @param {Response} response Объект ответа
*/
static checkStatus(response) {
if (!response.ok) {
throw new Error(`${response.status}: ${response.statusText}`);
}
}

/**
* Метод для обработки ошибок
* @param {Error} err Объект ошибки
*/
static catchError(err) {
throw err;
}
Expand Down
27 changes: 3 additions & 24 deletions src/framework/observable.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,18 @@
/**
* Класс, реализующий паттерн Наблюдатель.
*/

export default class Observable {
/** @type {Set<observerCallback>} Множество функций типа observerCallback */

#observers = new Set();

/**
* Метод, позволяющий подписаться на событие
* @param {observerCallback} observer Функция, которая будет вызвана при наступлении события
*/
addObserver(observer) {
this.#observers.add(observer);
}

/**
* Метод, позволяющий отписаться от события
* @param {observerCallback} observer Функция, которую больше не нужно вызывать при наступлении события
*/

removeObserver(observer) {
this.#observers.delete(observer);
}

/**
* Метод для оповещения подписчиков о наступлении события
* @param {*} event Тип события
* @param {*} payload Дополнительная информация
*/
_notify(event, payload) {
this.#observers.forEach((observer) => observer(event, payload));
}
}

/**
* Функция, которая будет вызвана при наступлении события
* @callback observerCallback
* @param {*} event Тип события
* @param {*} [payload] Дополнительная информация
*/
22 changes: 1 addition & 21 deletions src/framework/render.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,19 @@
import AbstractView from './view/abstract-view.js';

/** @enum {string} Перечисление возможных позиций для отрисовки */
const RenderPosition = {
BEFOREBEGIN: 'beforebegin',
AFTERBEGIN: 'afterbegin',
BEFOREEND: 'beforeend',
AFTEREND: 'afterend',
};

/**
* Функция для создания элемента на основе разметки
* @param {string} template Разметка в виде строки
* @returns {HTMLElement} Созданный элемент
*/
function createElement(template) {
const newElement = document.createElement('div');
newElement.innerHTML = template;

return newElement.firstElementChild;
}

/**
* Функция для отрисовки элемента
* @param {AbstractView} component Компонент, который должен был отрисован
* @param {HTMLElement} container Элемент в котором будет отрисован компонент
* @param {string} place Позиция компонента относительно контейнера. По умолчанию - `beforeend`
*/
function render(component, container, place = RenderPosition.BEFOREEND) {
if (!(component instanceof AbstractView)) {
throw new Error('Can render only components');
Expand All @@ -38,11 +26,7 @@ function render(component, container, place = RenderPosition.BEFOREEND) {
container.insertAdjacentElement(place, component.element);
}

/**
* Функция для замены одного компонента на другой
* @param {AbstractView} newComponent Компонент, который нужно показать
* @param {AbstractView} oldComponent Компонент, который нужно скрыть
*/

function replace(newComponent, oldComponent) {
if (!(newComponent instanceof AbstractView && oldComponent instanceof AbstractView)) {
throw new Error('Can replace only components');
Expand All @@ -60,10 +44,6 @@ function replace(newComponent, oldComponent) {
parent.replaceChild(newElement, oldElement);
}

/**
* Функция для удаления компонента
* @param {AbstractView} component Компонент, который нужно удалить
*/
function remove(component) {
if (component === null) {
return;
Expand Down
Loading

0 comments on commit 214efbd

Please sign in to comment.